- 破解了上万个小程序,并上架的服务商-笨淘淘。以及背后的公司武汉X源举报侵权居然没有用?
武汉X源科技有限公司破解了上万个小程序,利用之前服务商的漏洞,批量注册小程序,并在昆明官渡区,沈阳,武汉,山西晋城市等地方批量注册数千家公司和个体户。破解其他开发者的心血,批量上架并霸榜。快去搜搜你的小程序有没有被破解并重新上架。关键是由于被破解的大部分是小开发者,没有申请软著,投诉并没有用。 如果你搜索下面的小程序,显示已经暂停服务,因为开发者的愤怒让他们害怕,暂停了一部分小程序,并且取消了小程序和服务商的关联,但是这远远不够,我们希望官方能惩罚他们。--10月17号晚上22:35分更新 文章分成三部分:1、破解证据;2、上架了多少产品;3、注册了多少公司。 1、部分破解证据 下面以吉祥日历和文学典读,还发现有今日菜价等等。持续更新中。 以破解小程序吉祥日历为例: [图片] [图片] 笨淘淘的套路就是批量破解,首页名字都没有改,加上视频广告和各种插屏广告,还接入第三方的谷歌广告。批量上线。 由于他们盗版的都是小开发者,并没有软著,举报代码侵权,并没有用。 更让人感觉讽刺的是这种满眼广告的小程序用户比正版小程序用户多的多! 看到有人说这个。不算,但是各位如果你们搜索过就会发现, 左上角的logo是一样, 顶部的名字是一样,UI一摸一样,甚至bug也一样,唯一的差别就是对方在顶部注入了视频广告,导致视觉上看起来有点不像! 下面这个文学典读: 对方破解后就是在顶部加视频广告,连搜索结果都一摸一样。 底部的文章顺序也一摸一样。 详情页就是添加了视频广告。 从内容到UI都是一样。 原版:干净整洁 [图片] 盗版:批量插入广告,定时弹出插屏广告,动不动就有激励视频。 而且文章和诗词的顺序一摸一样,甚至连搜索的内容都是一致的。 更恐怖的是当搜索相关关键词时候,大部分都是盗版小程序。 [图片] 对方上线了多少个类似古诗词的应用。 以下的小程序仅仅为古诗必备的前30搜出来的应用。如果考虑到长尾词。只会更多。 [图片] [图片][图片][图片][图片][图片][图片] 2、上架了多少产品; 以上仅仅是其中两个例子。还有各类群工具,转盘,扫描,记账、表情包,日历,五行穿衣,变声器,压缩,拼图,各类小游戏,游戏助手等工具。 可以看到有的小程序上甚至不加掩饰,连名字都没有改。更讽刺的是盗版的用户比正版用户多的多。 盗版小程序破千的应用比比皆是。 通过关键词霸榜,蹭名字,蹭图标混淆小程序,快速提量,并且通过官方广告+第三方广告快速变现,完全不管用户体验。点击一个按钮就要激励视频。 极大的破坏了生态。 下面以扫描王关键词,统计前70有多少个笨淘淘服务商相关的小程序。 每个小程序都是一样,并没有差异化体验,而且小程序体验非常糟糕,广告满天飞。动不动强制用户看激励视频。以下截屏,是按照顺序截图,统计了前70个小程序,其中29个是笨淘淘相关小程序,占比41%。 每个都一摸一样。 到处是广告,动不动就弹广告。 [图片] [图片] [图片] 如果搜索更加一些细分类型的关键词,结果也很多。 比如变声器,转盘。 如下图的变声器,占比达到40%。 [图片][图片] 社区有人统计出一部分,比如官渡区,然而这仅仅是一部分,还有沈阳市苏家屯区和海口部分地区。 根据他们的小程序序号,可能有40万个。 他们的小程序一开始名字都叫 “数字+试用小程序”, 下面这个小程序,是427970。如果排序正确,就是说下面这个小程序是第427970个小程序。 [图片] 如何识别这些小程序,打开小程序,更多资料,查看授权第三方服务, 只要是笨淘淘的就是他们的小程序。 2023年10月17号发现,对方已经在取消授权第三方服务。 如果要确实是否是笨淘淘的小程序,需要看到具体公司,然后到爱企查,天眼查,查看法人,如果是赵婷婷或者是陈池,八九不离十。 3、注册了多少公司 这些公司大多以武汉X源科技有限公司的老板陈池和赵婷婷为主。 要注意很多新公司没法被关联的。所以这里现实330仅仅是其中一部分。 [图片] [图片] [图片] [图片] [图片] [图片] 要注意,这里都仅仅是一部分。 很多公司并没有相互关联,如下的这一家。 [图片] 这个公司的小程序是这个画风,清一色破解批量上架小程序。 [图片] 看到社区有人反馈,但这仅仅是一部分。下面是链接。 https://developers.weixin.qq.com/community/develop/doc/00002c8efd0b70d3f6306550761800?highLine=%25E5%25AE%2598%25E6%25B8%25A1%25E5%258C%25BA 一个武汉X源科技的陈年往事。 这张图是2023年7月6号截图。 当时发现自己有打牌记分的需求。看到分数异常截图下来。没想到还有用。 当时是武汉X源做了个打牌记账工具和排名第一个的“打牌记账”UI一摸一样,“打牌记账|计分器”短时间内就排名靠前,并且评分 5.0分, 而打牌记账 分数3.6分。今天,已经完全找不到武汉X源的“打牌记账”小程序了,不知道当时收到官方什么惩罚。 但是,笨淘淘系上线了一系列新的“打牌记账”类应用, UI已经和当初抄袭的完全不同。如果被逃过,估计他们就会给破解的小程序套上新的UI。摇身一变。 再次希望对方能得到应有的惩罚。 [图片] 如果批量破解上架举报没有用,那大家开发什么,批量上架就行了。请官方严肃处理这个服务商。严惩相关人员。
2023-10-30 - 云函数测试成功,前端调用成功却返回空,数据库也有数据,求解
- 当前 Bug 的表现(可附上截图) [图片][图片] [图片] - 预期表现[图片] - 复现路径 。 - 提供一个最简复现 Demo [代码]var[代码] [代码]app = getApp()[代码][代码]Page({[代码] [代码] [代码][代码]/**[代码][代码] [代码][代码]* 页面的初始数据[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]movieDetail: {[代码][代码] [代码][代码]mid: 1,[代码][代码] [代码][代码]title: [代码][代码]"绿皮书"[代码][代码],[代码][代码] [代码][代码]movieClass: [代码][代码]"剧情/喜剧/传记"[代码][代码],[代码][代码] [代码][代码]actor: [代码][代码]"维果·莫里森,马赫莎拉·阿里"[代码][代码],[代码][代码] [代码][代码]score: [代码][代码]"9.6分"[代码][代码],[代码][代码] [代码][代码]onShowTime: [代码][代码]"2019-2-26"[代码][代码],[代码][代码] [代码][代码]country: [代码][代码]"美国"[代码][代码],[代码][代码] [代码][代码]introduce: [代码][代码]" 一名黑人钢琴家,为前往种族歧视严重的南方巡演,找了一个粗暴的白人混混做司机。在一路开车南下的过程中,截然不同的两人矛盾不断,引发了不少争吵和笑料。但又在彼此最需要的时候,一起共渡难关。行程临近结束,两人也慢慢放下了偏见......绿皮书,是一本专为黑人而设的旅行指南, 标注了各城市中允许黑人进入的旅店、 餐馆。 电影由真实故事改编。 "[代码][代码],[代码][代码] [代码][代码]willingToWatch: [代码][代码]true[代码][代码],[代码][代码] [代码][代码]scored: [代码][代码]false[代码][代码],[代码][代码] [代码][代码]},[代码][代码] [代码][代码]willingToWatch: [代码][代码]false[代码][代码],[代码][代码] [代码][代码]scored: [代码][代码]false[代码][代码],[代码][代码] [代码][代码]isFold: [代码][代码]true[代码][代码],[代码][代码] [代码][代码]starPath: [代码][代码]'../../images/score.png'[代码][代码],[代码][代码] [代码][代码]staredPath: [代码][代码]'../../images/scored.png'[代码][代码],[代码] [代码] [代码][代码]actor: [{[代码][代码] [代码][代码]profile: [代码][代码]"../../images/actor1.webp"[代码][代码],[代码][代码] [代码][代码]name: [代码][代码]"彼得·法雷里"[代码][代码],[代码][代码] [代码][代码]role: [代码][代码]"导演"[代码][代码] [代码][代码]},[代码][代码] [代码][代码]{[代码][代码] [代码][代码]profile: [代码][代码]"../../images/actor2.webp"[代码][代码],[代码][代码] [代码][代码]name: [代码][代码]"维果·莫腾森"[代码][代码],[代码][代码] [代码][代码]role: [代码][代码]"托尼·利普"[代码][代码] [代码][代码]},[代码][代码] [代码][代码]{[代码][代码] [代码][代码]profile: [代码][代码]"../../images/actor3.webp"[代码][代码],[代码][代码] [代码][代码]name: [代码][代码]"马赫沙拉·阿里"[代码][代码],[代码][代码] [代码][代码]role: [代码][代码]"唐·雪利"[代码][代码] [代码][代码]},[代码][代码] [代码][代码]{[代码][代码] [代码][代码]profile: [代码][代码]"../../images/actor4.webp"[代码][代码],[代码][代码] [代码][代码]name: [代码][代码]"琳达·卡德里尼"[代码][代码],[代码][代码] [代码][代码]role: [代码][代码]"德洛瑞丝"[代码][代码] [代码][代码]}[代码][代码] [代码][代码]],[代码][代码] [代码][代码]comments: [{[代码][代码] [代码][代码]uid: [代码][代码]'123512313'[代码][代码],[代码][代码] [代码][代码]userName: [代码][代码]'LWRNL'[代码][代码],[代码][代码] [代码][代码]userProfile: [代码][代码]"../../images/user.png"[代码][代码],[代码][代码] [代码][代码]userComment: [代码][代码]"真·青春成长题材,教师视觉展现上世纪80年代拘谨的校园教育氛围,幽默不俗、叛逆放纵,残酷真实,笑中伤感,唯有以梦落幕。每个人都想做最完美的自己,可惜追求完美需要承受巨大压力,当醒悟后才懂得只需找准自己的。"[代码][代码],[代码][代码] [代码][代码]commentDate: [代码][代码]"4天前"[代码][代码],[代码][代码] [代码][代码]score: 5[代码] [代码] [代码][代码]},[代码][代码] [代码][代码]{[代码][代码] [代码][代码]uid: [代码][代码]'123512313'[代码][代码],[代码][代码] [代码][代码]userName: [代码][代码]'LWRNL'[代码][代码],[代码][代码] [代码][代码]userProfile: [代码][代码]"../../images/user.png"[代码][代码],[代码][代码] [代码][代码]userComment: [代码][代码]"真·青春成长题材,教师视觉展现上世纪80年代拘谨的校园教育氛围,幽默不俗、叛逆放纵,残酷真实,笑中伤感,唯有以梦落幕。每个人都想做最完美的自己,可惜追求完美需要承受巨大压力,当醒悟后才懂得只需找准自己的。"[代码][代码],[代码][代码] [代码][代码]commentDate: [代码][代码]"4天前"[代码][代码],[代码][代码] [代码][代码]score: 4[代码] [代码] [代码][代码]},[代码][代码] [代码][代码]{[代码][代码] [代码][代码]uid: [代码][代码]'123512313'[代码][代码],[代码][代码] [代码][代码]userName: [代码][代码]'LWRNL'[代码][代码],[代码][代码] [代码][代码]userProfile: [代码][代码]"../../images/user.png"[代码][代码],[代码][代码] [代码][代码]userComment: [代码][代码]"真·青春成长题材,教师视觉展现上世纪80年代拘谨的校园教育氛围,幽默不俗、叛逆放纵,残酷真实,笑中伤感,唯有以梦落幕。每个人都想做最完美的自己,可惜追求完美需要承受巨大压力,当醒悟后才懂得只需找准自己的。"[代码][代码],[代码][代码] [代码][代码]commentDate: [代码][代码]"4天前"[代码][代码],[代码][代码] [代码][代码]score: 2[代码] [代码] [代码][代码]},[代码][代码] [代码][代码]{[代码][代码] [代码][代码]uid: [代码][代码]'123512313'[代码][代码],[代码][代码] [代码][代码]userName: [代码][代码]'LWRNL'[代码][代码],[代码][代码] [代码][代码]userProfile: [代码][代码]"../../images/user.png"[代码][代码],[代码][代码] [代码][代码]userComment: [代码][代码]"真·青春成长题材,教师视觉展现上世纪80年代拘谨的校园教育氛围,幽默不俗、叛逆放纵,残酷真实,笑中伤感,唯有以梦落幕。每个人都想做最完美的自己,可惜追求完美需要承受巨大压力,当醒悟后才懂得只需找准自己的。"[代码][代码],[代码][代码] [代码][代码]commentDate: [代码][代码]"4天前"[代码][代码],[代码][代码] [代码][代码]score: 5[代码][代码] [代码][代码]},[代码] [代码] [代码][代码]][代码] [代码] [代码][代码]},[代码][代码] [代码][代码]showAll: [代码][代码]function[代码][代码](e) {[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]isFold: ![代码][代码]this[代码][代码].data.isFold,[代码][代码] [代码][代码]})[代码][代码] [代码][代码]},[代码] [代码] [代码][代码]willToWatch: [代码][代码]function[代码][代码]() {[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]willingToWatch: [代码][代码]true[代码][代码] [代码][代码]})[代码][代码] [代码][代码]},[代码][代码] [代码][代码]scored: [代码][代码]function[代码][代码]() {[代码][代码] [代码][代码]wx.navigateTo({[代码][代码] [代码][代码]url: [代码][代码]"../evaluate/evaluate?mid="[代码] [代码]+ [代码][代码]this[代码][代码].data.mid[代码][代码] [代码][代码]})[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]scored: [代码][代码]true[代码][代码] [代码][代码]})[代码][代码] [代码][代码]},[代码] [代码] [代码][代码]shortcomment: [代码][代码]function[代码][代码]() {[代码][代码] [代码][代码]wx.navigateTo({[代码][代码] [代码][代码]url: [代码][代码]"../evaluate/evaluate?mid="[代码] [代码]+ [代码][代码]this[代码][代码].data.mid[代码][代码] [代码][代码]})[代码][代码] [代码][代码]},[代码][代码] [代码][代码]/**[代码][代码] [代码][代码]* 生命周期函数--监听页面加载[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]onLoad: [代码][代码]function[代码][代码](options) {[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]mid: options.mid,[代码][代码] [代码][代码]uid: app.globalData.openid,[代码][代码] [代码][代码]})[代码][代码] [代码][代码]console.log([代码][代码]this[代码][代码].data.mid + [代码][代码]'..'[代码] [代码]+ [代码][代码]this[代码][代码].data.uid)[代码][代码] [代码][代码]},[代码] [代码] [代码][代码]/**[代码][代码] [代码][代码]* 生命周期函数--监听页面初次渲染完成[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]onReady: [代码][代码]function[代码][代码](e) {[代码] [代码] [代码][代码]},[代码] [代码] [代码][代码]/**[代码][代码] [代码][代码]* 生命周期函数--监听页面显示[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]onShow: [代码][代码]function[代码][代码]() {[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]scored: [代码][代码]this[代码][代码].data.movieDetail.scored,[代码][代码] [代码][代码]willingToWatch: [代码][代码]this[代码][代码].data.movieDetail.willingToWatch,[代码][代码] [代码][代码]})[代码] [代码] [代码][代码]wx.cloud.callFunction({[代码][代码] [代码][代码]name: [代码][代码]'getMovieDetails'[代码][代码],[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]uid: [代码][代码]this[代码][代码].data.uid,[代码][代码] [代码][代码]mid: [代码][代码]this[代码][代码].data.mid[代码][代码] [代码][代码]},[代码][代码] [代码][代码]success: res => {[代码][代码] [代码][代码]console.log([代码][代码]'收到结果: '[代码][代码], res.result.movieDetails)[代码] [代码] [代码][代码]this[代码][代码].setData({[代码] [代码] [代码][代码]})[代码] [代码] [代码][代码]},[代码][代码] [代码][代码]fail: err => {[代码][代码] [代码][代码]console.error([代码][代码]'[云函数] [getMyOrder] 调用失败'[代码][代码], err)[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码] [代码] [代码][代码]},[代码] [代码] [代码][代码]/**[代码][代码] [代码][代码]* 生命周期函数--监听页面隐藏[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]onHide: [代码][代码]function[代码][代码]() {[代码] [代码] [代码][代码]},[代码] [代码] [代码][代码]/**[代码][代码] [代码][代码]* 生命周期函数--监听页面卸载[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]onUnload: [代码][代码]function[代码][代码]() {[代码] [代码] [代码][代码]},[代码] [代码] [代码][代码]/**[代码][代码] [代码][代码]* 页面相关事件处理函数--监听用户下拉动作[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]onPullDownRefresh: [代码][代码]function[代码][代码]() {[代码] [代码] [代码][代码]},[代码] [代码] [代码][代码]/**[代码][代码] [代码][代码]* 页面上拉触底事件的处理函数[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]onReachBottom: [代码][代码]function[代码][代码]() {[代码] [代码] [代码][代码]},[代码] [代码] [代码][代码]/**[代码][代码] [代码][代码]* 用户点击右上角分享[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]onShareAppMessage: [代码][代码]function[代码][代码]() {[代码] [代码] [代码][代码]}[代码][代码]})[代码][代码][代码]云函数: [代码]const cloud = require([代码][代码]'wx-server-sdk'[代码][代码])[代码][代码]cloud.init()[代码][代码]const db = cloud.database()[代码][代码]const movieDetail = db.collection([代码][代码]'movieDetails'[代码][代码])[代码][代码]const willing = db.collection([代码][代码]'willings'[代码][代码])[代码][代码]const score = db.collection([代码][代码]'movieEvaluate'[代码][代码])[代码][代码]exports.main = async (event, context) =>{[代码][代码] [代码][代码]try[代码][代码]{[代码][代码] [代码][代码]//查询willing表中是否有对应数据,有则willingToWatch改为true,反之,willingToWatch改为false[代码][代码] [代码][代码]const exist1 = await willing.where({[代码][代码] [代码][代码]mid: event.mid,[代码][代码] [代码][代码]open_id: event.uid[代码][代码] [代码][代码]}).count()[代码][代码] [代码][代码]const total1 = exist1.total[代码][代码] [代码][代码]if[代码] [代码](total1 === 0) {[代码][代码] [代码][代码]await movieDetail.where({[代码][代码] [代码][代码]mid: event.mid[代码][代码] [代码][代码]}).limit(1)[代码][代码] [代码][代码].update({[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]willingToWatch: [代码][代码]false[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码] [代码][代码]else[代码] [代码]{[代码][代码] [代码][代码]await movieDetail.where({[代码][代码] [代码][代码]mid: event.mid[代码][代码] [代码][代码]}).limit(1)[代码][代码] [代码][代码].update({[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]willingToWatch: [代码][代码]true[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码] [代码][代码]////查询movieEvaluate表中是否有对应数据,有则scored改为true,反之,scored改为false[代码][代码] [代码][代码]const exist2 = await score.where({[代码][代码] [代码][代码]mid: event.mid,[代码][代码] [代码][代码]open_id: event.uid[代码][代码] [代码][代码]}).count()[代码][代码] [代码][代码]const total2 = exist2.total[代码][代码] [代码][代码]if[代码] [代码](total2 === 0) {[代码][代码] [代码][代码]await movieDetail.where({[代码][代码] [代码][代码]mid: event.mid[代码][代码] [代码][代码]}).limit(1)[代码][代码] [代码][代码].update({[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]scored: [代码][代码]false[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码] [代码][代码]else[代码] [代码]{[代码][代码] [代码][代码]await movieDetail.where({[代码][代码] [代码][代码]mid: event.mid[代码][代码] [代码][代码]}).limit(1)[代码][代码] [代码][代码].update({[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]scored: [代码][代码]true[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码]catch[代码][代码](e){[代码][代码] [代码][代码]console.error(e)[代码][代码] [代码][代码]}[代码][代码] [代码][代码]//返回查询数据[代码][代码] [代码][代码]return[代码] [代码]{[代码][代码] [代码][代码]movieDetails: await movieDetail.where({[代码][代码] [代码][代码]mid: event.mid[代码][代码] [代码][代码]}).limit(1).get()[代码][代码] [代码][代码]}[代码][代码]}[代码]
2019-04-28