From 04d73a927e724293ae831cf940602f4c39270e50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Tue, 18 Aug 2026 10:54:40 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E5=BF=83=E5=96=9C=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daily/xinxi.js | 209 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 176 insertions(+), 33 deletions(-) diff --git a/daily/xinxi.js b/daily/xinxi.js index cfbccd79..ce68e6a8 100644 --- a/daily/xinxi.js +++ b/daily/xinxi.js @@ -34,12 +34,23 @@ class Task { this.user = env.split(strSplitor); this.token = this.user[0]; this.posts = [] + this.goods = [] + this.pageNum = 1 } async run() { await this.userInfo() + await this.signStatus(); await this.tasklist() + + if (this.goods) { + $.log(`===========积分物品统计===========`) + for (let item of this.goods) { + $.log(`积分物品【${item.name}】,库存:${item.stock}`) + } + $.log(`===========积分物品统计===========`) + } } generateMd5Signature = function (e) { @@ -82,6 +93,36 @@ class Task { } } + + async signStatus() { + try { + let options = { + method: 'GET', + url: `https://api.xinc818.com/mini/sign/status`, + headers: { + "Content-Type": "application/json", + } + + }; + let { data: result } = await this.request(options); + if (result.code == 0) { + if (result.data) { + $.log(`✅账号[${this.index}] 签到状态【${result.data}】已签到🎉`) + } else { + $.log(`✅账号[${this.index}] 签到状态【${result.data}】未签到🎉`) + await $.wait(2000) + await this.signIn() + } + await $.wait(1000) + await this.signContinuous() + } else { + $.log(`❌账号[${this.index}] 签到状态查询失败`); + } + } catch (error) { + $.log(`❌账号[${this.index}] 签到状态查询异常:${error}`); + } + } + async signIn() { let options = { method: 'GET', @@ -100,6 +141,28 @@ class Task { } } + + async signContinuous() { + + try { + let options = { + method: 'GET', + url: `https://api.xinc818.com/mini/sign/continuous`, + headers: { + "Content-Type": "application/json", + } + + + }; + let { data: result } = await this.request(options); + if (result.code == 0) { + $.log(`✅账号[${this.index}] 连续签到【${result.data}】天🎉`) + } + } catch (e) { + $.log(`❌账号[${this.index}] 查询连续签到天数异常:${e}`); + } + } + async share() { let options = { method: 'GET', @@ -126,11 +189,13 @@ class Task { }; let { data: result } = await this.request(options); if (result.code == 0) { + await this.getPosts() + await this.getGoods() for (let task of result.data) { - await this.getPosts() + if (task.status == false) { - // console.log(`${task.taskName}[${task.code}]--${task.annotation} -- ${task.finishNum}`) - if (task.code == 'BROWSE_PRODUC1TS') { + console.log(`${task.taskName}[${task.code}]--${task.annotation} -- ${task.finishNum}`) + if (task.code == 'BROWSE_PRODUCTS') { await this.browseGoods() } if (task.code == 'COMMENT_POSTS') { @@ -140,10 +205,29 @@ class Task { await this.likePosts(this.posts[0].id) } if (task.code == 'FOCUS_USER') { - await this.followUser(this.posts[0].publisherId) + let _posts = ""; + while (true) { + _posts = this.posts.filter(item => item.concernSign == 1) + if (_posts) { + break + } + await $.wait(2000) + this.pageNum++; + if (this.pageNum > 100) { + + } + await this.getPosts() + } + if (_posts) { + await this.followUser(_posts[0].publisherId) + } else { + + } } if (task.code == 'WANT_GOODS') { - await this.likeGoods() + var good_id = this.goods[1].id; + await this.getGoodDetail(good_id) + await this.likeGoods(this.goodDetail.outerId) } if (task.code == 'SHARE') { await this.share() @@ -195,55 +279,103 @@ class Task { async getPosts() { let options = { method: 'GET', - url: `https://api.xinc818.com/mini/community/home/posts?pageNum=1&pageSize=10&queryType=3&position=2`, + url: `https://api.xinc818.com/mini/community/home/posts?pageNum=${this.pageNum}&pageSize=100&queryType=3&position=2`, headers: {} }; let { data: result } = await this.request(options); if (result.code == 0) { this.posts = result.data.list + // console.log(this.posts) } } - async likePosts() { - //找到posts里面liked为false的 - let posts = this.posts.filter(item => item.liked == false) + + async getGoods() { let options = { - method: 'PUT', - url: `https://api.xinc818.com/mini/posts/like`, - headers: { - "Content-Type": "application/json", - }, - data: { "postsId": posts[0].id, "decision": true } + method: 'GET', + url: `https://cdn-api.xinc818.com/mini/integralGoods?miniIs=1&orderField=sort&orderScheme=DESC&pageSize=50&pageNum=1`, + headers: {} }; - let { data: result } = await this.request(options); if (result.code == 0) { - // console.log(result); - $.log(`✅账号[${this.index}] 【点赞帖子】成功 获得积分【${result.data.singleReward}】🎉`) - }else{ - $.log(`❎账号[${this.index}] 【点赞帖子】失败,原因【${result.msg}】🎉`) + this.goods = result.data.list } } - async followUser(publisherId) { + async getGoodDetail(id) { let options = { - method: 'PUT', - url: `https://api.xinc818.com/mini/user/follow`, - headers: { - "Content-Type": "application/json", - }, - data: { "followUserId": publisherId, "decision": true } + method: 'GET', + url: `https://api.xinc818.com/mini/integralGoods/${id}`, + headers: {} }; let { data: result } = await this.request(options); if (result.code == 0) { - $.log(`✅账号[${this.index}] 【关注用户】成功 获得积分【${result.data.singleReward}】🎉`) - }else{ - $.log(`❎账号[${this.index}] 【关注用户】失败,原因【${result.msg}】🎉`) + //用户商品详情的outerId点赞商品 + this.goodDetail = result.data + } + } + + async likePosts() { + //找到posts里面liked为false的 + try { + let posts = this.posts.filter(item => item.liked == false) + let options = { + method: 'PUT', + url: `https://api.xinc818.com/mini/posts/like`, + headers: { + "Content-Type": "application/json", + }, + data: { "postsId": posts[0].id, "decision": true } + + }; + + let { data: result } = await this.request(options); + if (result.code == 0) { + // console.log(result); + $.log(`✅账号[${this.index}] 【点赞帖子】成功 获得积分【${result.data.singleReward}】🎉`) + } else { + $.log(`❎账号[${this.index}] 【点赞帖子】失败,原因【${result.msg}】🎉`) + } + } catch (err) { + $.log(`❎账号[${this.index}] 【点赞帖子】失败:${err}`) + } + } + + async followUser(publisherId, decision = true) { + try { + let options = { + method: 'PUT', + url: `https://api.xinc818.com/mini/user/follow`, + headers: { + "Content-Type": "application/json", + }, + data: { "followUserId": publisherId, "decision": decision } + + }; + let { data: result } = await this.request(options); + // console.log(result) + if (result.code == 0) { + if (decision) { + $.log(`✅账号[${this.index}] 【关注用户】成功 获得积分【${result.data.singleReward}】🎉`) + //await $.wait(3000) + //await this.followUser(publisherId, false) + } else { + $.log(`✅账号[${this.index}] 【取消关注用户】成功 `) + } + } else { + $.log(`❎账号[${this.index}] 【关注用户】失败,原因【${result.msg}】🎉`) + if (result.msg.match("重复")) { + + //await this.followUser(publisherId, false) + } + } + } catch (err) { + $.log(`❎账号[${this.index}] 【关注用户】失败:${err}`) } } - async likeGoods(goodsId = "210000904376") { + async likeGoods(goodsId = "210000904376", isLike = true) { try { let options = { method: 'POST', @@ -251,12 +383,23 @@ class Task { headers: { "Content-Type": "application/json", }, - data: { "isLike": true, "dailyTaskId": 20, "productId": goodsId } + data: { "isLike": isLike, "dailyTaskId": 20, "productId": goodsId } }; + // console.log(options) let { data: result } = await this.request(options); + // console.log(result) if (result.code == 0) { - $.log(`✅账号[${this.index}] 【点赞商品】成功 获得积分【${result.data.singleReward}】🎉`) + if (isLike) { + $.log(`✅账号[${this.index}] 【点赞商品】成功 获得积分【${result.data.singleReward}】🎉`) + await $.wait(3000) + await this.likeGoods(goodsId, false) + } else { + $.log(`✅账号[${this.index}] 【点赞商品】取消成功🎉`) + } + + } else { + $.log(`❎账号[${this.index}] 【点赞商品】失败,原因【${result.msg}】🎉`) } } catch (err) { $.log(`❎账号[${this.index}] 【点赞商品】失败:${err}`) From 911480853bed4742dd657d8a227efc7b7746af56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Fri, 28 Aug 2026 11:57:46 +0800 Subject: [PATCH 02/19] =?UTF-8?q?1.=E6=99=AE=E9=80=9A=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E6=8B=86=E5=88=86=202.=E5=B9=BF=E5=91=8A=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E6=9B=B4=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/jyk.js | 54 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/wxapp/jyk.js b/wxapp/jyk.js index 577ab39a..f9168ad9 100644 --- a/wxapp/jyk.js +++ b/wxapp/jyk.js @@ -16,8 +16,9 @@ wx_auth 必填,wx_server 鉴权值 登录 POST /api/index/get_openid {code, pid:"", device_info:"android_MEIZU_22_370"} -> errno==0,data.access_token;头 Authorization: Bearer + X-Payconfig-Id:2 状态 GET /api/checkin/home -> data.{enabled, today_signed, can_sign} -签到 ① POST /api/checkin/prepare -> data.ad_token - ② POST /api/checkin/sign {ad_token} -> errno==0 成功 +普通签到 ① POST /api/checkin/sign {} -> errno==0 成功 +广告签到 ① POST /api/checkin/ad/prepare -> data.ad_token + ② POST /api/checkin/ad/sign {ad_token} -> errno==0 成功 响应壳:{errno:0, data};errno!=0 视为失败/未开启。只做普通签到,不做广告签到。 ------------------------------------------ */ @@ -43,8 +44,9 @@ const USER_AGENT = const EP_LOGIN = "/api/index/get_openid"; const EP_HOME = "/api/checkin/home"; -const EP_PREPARE = "/api/checkin/prepare"; +const EP_PREPARE = "/api/checkin/ad/prepare"; const EP_SIGN = "/api/checkin/sign"; +const EP_AD_SIGN = "/api/checkin/ad/sign"; const wechat = new WeChatServer({ url: process.env.wx_server_url || "http://192.168.31.196:8787", @@ -134,20 +136,33 @@ class Task { if (Number(res?.errno) !== 0) throw new Error(`home失败: ${res?.errmsg || short(res)}`); return res.data || {}; } + async sign() { + const signed = await this.request("POST", EP_SIGN, {}); + if (Number(signed?.errno) === 0) { + const d = signed.data || {}; + return this.log(`✅ 签到成功${d.score !== undefined ? `,获得 ${d.score} 积分` : ""}${d.integral !== undefined ? `,积分 ${d.integral}` : ""}`); + } + if (/已签|签到过|重复|已完成/.test(String(signed?.errmsg || signed?.msg || ""))) return this.log(`✅ 今日已签到(${signed.errmsg || signed.msg})`); + this.log(`❌ 签到失败: ${signed?.errmsg || signed?.msg || short(signed)}`); + } async prepareAndSign() { const prepared = await this.request("POST", EP_PREPARE); if (Number(prepared?.errno) !== 0) return this.log(`❌ 普通签到 prepare 失败: ${short(prepared)}`); const adToken = String((prepared.data || {}).ad_token || ""); if (!adToken) return this.log("❌ 普通签到 prepare 未返回 ad_token"); - const signed = await this.request("POST", EP_SIGN, { ad_token: adToken }); + await $.wait(10 * 1000) + const signed = await this.request("POST", EP_AD_SIGN, { ad_token: adToken }); if (Number(signed?.errno) === 0) { const d = signed.data || {}; - return this.log(`✅ 签到成功${d.score !== undefined ? `,获得 ${d.score} 积分` : ""}${d.integral !== undefined ? `,积分 ${d.integral}` : ""}`); + this.log(`✅ 广告签到成功${d.score !== undefined ? `,获得 ${d.score} 积分` : ""}${d.integral !== undefined ? `,积分 ${d.integral}` : ""}`); + await $.wait(30 * 1000) + await checkin_sign('ad'); + return } if (/已签|签到过|重复|已完成/.test(String(signed?.errmsg || signed?.msg || ""))) return this.log(`✅ 今日已签到(${signed.errmsg || signed.msg})`); - this.log(`❌ 签到失败: ${signed?.errmsg || signed?.msg || short(signed)}`); + this.log(`❌ 广告签到失败: ${signed?.errmsg || signed?.msg || short(signed)}`); } - async sign() { + async checkin_sign(type) { let home; try { home = await this.home(); @@ -158,9 +173,26 @@ class Task { home = await this.home(); } else throw e; } - if (!home.enabled) return this.log("普通签到未开启"); - if (home.today_signed || !home.can_sign) return this.log("✅ 今日已签到或不可签"); - await this.prepareAndSign(); + if (type == 'ad') { + if (home.ad && home.ad.today_count < home.ad.daily_limit) { + await this.prepareAndSign(); + } else { + this.log("✅ 今日广告签到已完成签到或不可签") + } + + } else { + if (!home.enabled) return this.log("普通签到未开启"); + if (home.today_signed || !home.can_sign) { + this.log("✅ 今日普通签到已签到或不可签") + } else { + await this.sign(); + } + if (home.ad && home.ad.today_count < home.ad.daily_limit) { + await this.prepareAndSign(); + } else { + this.log("✅ 今日广告签到已完成签到或不可签") + } + } } async ensureLogin() { const cached = readCache()[this.account.openid] || {}; @@ -171,7 +203,7 @@ class Task { if (!this.account.openid) { this.log("跳过:变量值里没有 openid"); return; } try { await this.ensureLogin(); - await this.sign(); + await this.checkin_sign(); } catch (e) { this.log(`执行失败: ${e.message || e}`); } From d2ac30ed186d21825d7b742fa645a9ff92f5009f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Fri, 28 Aug 2026 12:28:51 +0800 Subject: [PATCH 03/19] =?UTF-8?q?=E6=97=A7=E8=A1=A3=E5=AE=A2=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/jyk.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/wxapp/jyk.js b/wxapp/jyk.js index f9168ad9..64435b1c 100644 --- a/wxapp/jyk.js +++ b/wxapp/jyk.js @@ -16,9 +16,8 @@ wx_auth 必填,wx_server 鉴权值 登录 POST /api/index/get_openid {code, pid:"", device_info:"android_MEIZU_22_370"} -> errno==0,data.access_token;头 Authorization: Bearer + X-Payconfig-Id:2 状态 GET /api/checkin/home -> data.{enabled, today_signed, can_sign} -普通签到 ① POST /api/checkin/sign {} -> errno==0 成功 -广告签到 ① POST /api/checkin/ad/prepare -> data.ad_token - ② POST /api/checkin/ad/sign {ad_token} -> errno==0 成功 +签到 ① POST /api/checkin/prepare -> data.ad_token + ② POST /api/checkin/sign {ad_token} -> errno==0 成功 响应壳:{errno:0, data};errno!=0 视为失败/未开启。只做普通签到,不做广告签到。 ------------------------------------------ */ @@ -147,16 +146,16 @@ class Task { } async prepareAndSign() { const prepared = await this.request("POST", EP_PREPARE); - if (Number(prepared?.errno) !== 0) return this.log(`❌ 普通签到 prepare 失败: ${short(prepared)}`); + if (Number(prepared?.errno) !== 0) return this.log(`❌ 广告签到 prepare 失败: ${short(prepared)}`); const adToken = String((prepared.data || {}).ad_token || ""); - if (!adToken) return this.log("❌ 普通签到 prepare 未返回 ad_token"); + if (!adToken) return this.log("❌ 广告签到 prepare 未返回 ad_token"); await $.wait(10 * 1000) const signed = await this.request("POST", EP_AD_SIGN, { ad_token: adToken }); if (Number(signed?.errno) === 0) { const d = signed.data || {}; this.log(`✅ 广告签到成功${d.score !== undefined ? `,获得 ${d.score} 积分` : ""}${d.integral !== undefined ? `,积分 ${d.integral}` : ""}`); await $.wait(30 * 1000) - await checkin_sign('ad'); + await this.checkin_sign('ad'); return } if (/已签|签到过|重复|已完成/.test(String(signed?.errmsg || signed?.msg || ""))) return this.log(`✅ 今日已签到(${signed.errmsg || signed.msg})`); From 8af2884107e5f9bc31080139d7cb6550e7e3c26d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 28 Aug 2026 06:03:53 +0000 Subject: [PATCH 04/19] =?UTF-8?q?docs:=20=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20daily=20=E5=92=8C=20wxapp=20=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E7=8A=B6=E6=80=81=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6e1a9258..bc07248b 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ https://rewards.bing.com/welcome?rh=g7a-IyWIfh0&ref=rafsrchae | colorful七彩虹 | 2026-04-08 20:04:58 | ✅ | | 得物0元抽 | 2026-04-08 20:04:58 | ✅ | | iqoo社区 | 2026-04-08 20:04:58 | ✅ | -| 心喜小程序 | 2026-08-13 20:55:54 | ✅ | +| 心喜小程序 | 2026-08-28 14:03:53 | ✅ | | BREO | 2026-04-07 19:05:34 | ✅ | | stokkes小程序签到 | 2026-04-07 19:05:34 | ✅ | | 浓五的酒馆 | 2026-04-07 19:05:34 | ✅ | @@ -234,7 +234,7 @@ https://rewards.bing.com/welcome?rh=g7a-IyWIfh0&ref=rafsrchae | 杰士邦会员中心 | 2026-08-20 10:19:33 | ✅ | | 捷停车签到 | 2026-08-20 10:19:33 | ✅ | | 酒仙签到 | 2026-08-20 10:19:33 | ✅ | -| 旧衣客签到 | 2026-08-20 10:19:33 | ✅ | +| 旧衣客签到 | 2026-08-28 14:03:53 | ✅ | | 旧衣小二 | 2026-08-20 10:19:33 | ✅ | | 绿动新球签到 | 2026-08-20 10:19:33 | ✅ | | 绿蜜蜂签到 | 2026-08-20 10:19:33 | ✅ | From 26d50db3d7c4ffa86ab08ab3416b3686bc4db322 Mon Sep 17 00:00:00 2001 From: smallfawn <101914820+smallfawn@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:07:42 +0800 Subject: [PATCH 05/19] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index bc07248b..3db0203b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ ## 免费AI中转站 +https://kktoken.cc/sign-up?aff=lMQ6 + + https://free.supxh.xin/register?code=BVDU5Y From 272626d689d505683f8dfbd88271c8e3eb66ea72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Tue, 1 Sep 2026 11:09:00 +0800 Subject: [PATCH 06/19] =?UTF-8?q?=E5=A4=9A=E5=A4=9A=E6=9E=9C=E5=9B=AD-?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E7=99=BB=E5=BD=95=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\344\274\227\345\217\267\347\211\210.js" | 311 ++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100644 "wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" diff --git "a/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" "b/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" new file mode 100644 index 00000000..b9bd2b31 --- /dev/null +++ "b/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" @@ -0,0 +1,311 @@ +/* +------------------------------------------ +@Description: 拼多多果园公众号版(多多果园) - 微信小程序 code 静默登录 + 每日签到(+浇水) +cron: 28 9,13 * * * +------------------------------------------ +变量名:pddgy +变量值:wx_server 里的 openid/账号标识,多账号用 & 或换行分隔(可加 #备注) + +依赖变量: +wx_server_url 默认 http://192.168.31.196:8787 +wx_auth 必填,wx_server 鉴权值 +------------------------------------------ +契约(appid wx839691cce7c102bb,重风控站点): + + +登录 GET https://mobile.yangkeduo.com/garden_index_lz_0.html?_pdd_fs=1&_pdd_tc=676666&_pdd_sbs=1&fun_id=wechat_app_home&__wls_rt=1&__wls_lt=1&__wls_fm=b&code=${code}&state=BASE + Cookie = PDDAccessToken=; pdd_user_id=; pdd_user_uin=; + 鉴权=纯 Cookie(业务请求无 HMAC/签名),业务 URL 追加 ?pdduid= + 风控:暂无 +首页 POST /proxy/api/api/manor-query/proxy/home/page {..., tubetoken} + -> tubetoken(签到/浇水必需) / water_amount;error_code 40001 = Cookie 失效 +签到 POST /proxy/api/api/manor/common/apply/activity?pdduid= + body = {type:201811, params:{ui_id:3,type:2}, fun_id:"wechat_app_home", tubetoken, fun_pl:2} + -> error_code==0 / success==true 成功;已签常见 error_msg 含「已签/重复/已领取」 +浇水 POST /proxy/api/api/manor/water/cost {..., cost_water_amount:10, tubetoken}(附带,非核心,失败不影响签到判定) +app_id=33 / xcx_version / activity type 201811 均为该小程序固定应用常量(原脚本硬编码,非个人凭证)。 +业务基址 https://mobile.yangkeduo.com/proxy/api/api ,登录基址 https://api.pinduoduo.com 。 +------------------------------------------ +*/ + +const { Env } = require("../tools/env.js"); +const $ = new Env("拼多多果园签到"); +const axios = require("axios"); +const fs = require("fs"); +const path = require("path"); +const WeChatServer = require("./wcs.js"); + +const ckName = "pddgy"; +const MINI_APP_ID = "wx839691cce7c102bb"; +const XCX_VERSION = "v8.6.21"; +const PDD_APP_ID = 33; +const API_BASE = "https://api.pinduoduo.com"; +const ORCHARD_BASE = "https://mobile.yangkeduo.com"; +const MANOR_BASE = ORCHARD_BASE + "/proxy/api/api"; +const CHECKIN_TYPE = 201811; +const MAX_WATER_TIMES = 20; // 附带浇水上限(非核心) +const TOKEN_CACHE_FILE = path.join(__dirname, "pddgy_token_cache.json"); +const UA = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 " + + "MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/19895 miniProgram/wx32540bd863b27570"; + +const wechat = new WeChatServer({ + url: process.env.wx_server_url || "http://192.168.31.196:8787", + appid: MINI_APP_ID, + auth: process.env.wx_auth || "", +}); + +function readCache() { + try { if (!fs.existsSync(TOKEN_CACHE_FILE)) return {}; return JSON.parse(fs.readFileSync(TOKEN_CACHE_FILE, "utf8")) || {}; } catch (e) { return {}; } +} +function writeCache(c) { + try { fs.writeFileSync(TOKEN_CACHE_FILE, JSON.stringify(c, null, 2), "utf8"); } catch (e) { $.log(`写入缓存失败: ${e.message || e}`); } +} +function parseAccount(raw = "") { + const [id, remark] = String(raw).split("#").map((s) => (s || "").trim()); + return { openid: id, remark: remark || "" }; +} +function short(v, n = 240) { + const t = typeof v === "string" ? v : JSON.stringify(v); + return !t ? "" : t.length > n ? `${t.slice(0, n)}...` : t; +} +function asObj(d) { + if (d && typeof d === "object") return d; + if (typeof d === "string") { try { return JSON.parse(d); } catch { return {}; } } + return {}; +} +function extractUid(cookieStr) { + const m = /pdd_user_id=(\d+)/.exec(cookieStr || ""); + return m ? m[1] : ""; +} + +function okCode(res) { + if (!res) return false; + if (res.success === true) return true; + if (Number(res.error_code) === 0 && (res.error_code === 0 || res.error_code === "0")) return true; + if (res.code === 0) return true; + return false; +} +function respMsg(res) { + if (!res) return ""; + return res.error_msg || res.msg || res.message || res.errorMsg || ""; +} + +function get_accessToken(cookieStr) { + const m = /PDDAccessToken=(\d+)/.exec(cookieStr || ""); + return m ? m[1] : ""; +} +function get_pdd_user_id(cookieStr) { + const m = /pdd_user_id=(\d+)/.exec(cookieStr || ""); + return m ? m[1] : ""; +} +function get_pdd_user_uin(cookieStr) { + const m = /pdd_user_uin=(\d+)/.exec(cookieStr || ""); + return m ? m[1] : ""; +} + +class Task { + constructor(raw) { + this.index = $.userIdx++; + this.account = parseAccount(raw); + this.cookieStr = ""; + this.pdduid = ""; + this.tubetoken = ""; + this.water = 0; + } + log(text) { + $.log(`账号[${this.index}]${this.account.remark ? `[${this.account.remark}]` : ""} ${text}`); + } + async getCode() { + const { data } = await wechat.getCode(this.account.openid); + if (data && data.status === false) throw new Error(`wx_server 取code失败: ${data.message || short(data)}`); + const code = data?.data?.code || data?.code; + if (!code || typeof code !== "string") throw new Error(`wx_server 未返回 code: ${short(data)}`); + return code; + } + async login() { + const code = await this.getCode(); + this.log(`获取code: ${short(code, 12)}...`); + const loginBody = { + code, + has_auth: false, + app_id: PDD_APP_ID, + support_enhance_type: 3, + xcx_version: XCX_VERSION, + }; + const res = await axios.request({ + method: "GET", + url: `https://mobile.yangkeduo.com/garden_index_lz_0.html?_pdd_fs=1&_pdd_tc=676666&_pdd_sbs=1&fun_id=wechat_app_home&__wls_rt=1&__wls_lt=1&__wls_fm=b&code=${code}&state=BASE`, + //data: JSON.stringify(loginBody), + headers: { + "Content-Type": "application/json;charset=UTF-8", + "User-Agent": UA, + Accept: "*/*", + Referer: `https://servicewechat.com/${MINI_APP_ID}/1840/page-frame.html`, + "x-xcx-queries": `mini_program_name=pdd;mp_theme_version=${XCX_VERSION}`, + xweb_xhr: "1", + }, + timeout: 20000, + validateStatus: () => true, + }); + + let setCookieStr = ""; + const sc = res.headers && res.headers["set-cookie"]; + if (sc) { + const arr = Array.isArray(sc) ? sc : [sc]; + setCookieStr = arr.map((c) => String(c).split(";")[0]).join("; "); + } + console.log(setCookieStr) + // 使用示例 + const accessToken = get_accessToken(setCookieStr); + const uid = get_pdd_user_id(setCookieStr); + const uin = get_pdd_user_uin(setCookieStr); + const acid = ""; + + const parts = [`PDDAccessToken=${accessToken}`, `pdd_user_id=${uid}`]; + if (uin) parts.push(`pdd_user_uin=${uin}`); + if (acid) parts.push(`acid=${acid}`); + if (setCookieStr) parts.push(setCookieStr); + + this.cookieStr = parts.join("; "); + this.pdduid = uid; + const cache = readCache(); + cache[this.account.openid] = { cookieStr: this.cookieStr, uid, updatedAt: new Date().toISOString() }; + writeCache(cache); + this.log(`登录成功 uid=${uid}`); + } + async manorPost(apiPath, body) { + const url = `${MANOR_BASE}${apiPath}${apiPath.includes("?") ? "&" : "?"}pdduid=${this.pdduid}`; + const res = await axios.request({ + method: "POST", + url, + data: JSON.stringify(body || {}), + headers: { + "User-Agent": UA, + Accept: "application/json, text/plain, */*", + "Content-Type": "application/json;charset=UTF-8", + Origin: ORCHARD_BASE, + Referer: `${ORCHARD_BASE}/garden_index_lz_0.html`, + Cookie: this.cookieStr, + }, + timeout: 20000, + validateStatus: () => true, + }); + return asObj(res.data); + } + // 首页:刷新 tubetoken + 水滴,同时用作 Cookie 有效性探测 + async getHomePage() { + const body = { + mission_type: 0, fun_id: "wechat_app_home", message_source: null, + page_type: "HOME_PAGE", push_source_mission_type: 0, fruit_config_version: "", + unlock_scene_version: "", app_home_click_icon_type: null, tubetoken: this.tubetoken, + push_act_source: null, need_show_home_popup: true, fun_pl: 2, + }; + const result = await this.manorPost("/manor-query/proxy/home/page", body); + if (!result || !result.user_manor_info) { this.log(` 首页校验失败(40001),Cookie 可能已过期`); return false; } + if (result.user_manor_info.tubetoken) this.tubetoken = result.user_manor_info.tubetoken; + if (result.user_manor_info.water_amount != null) this.water = result.user_manor_info.water_amount; + return !!this.tubetoken; + } + async getWater() { + const result = await this.manorPost("/manor-gateway/manor/query/user/water?is_back=1", {}); + return (result && result.water_amount) || 0; + } + async checkin() { + const body = { + type: CHECKIN_TYPE, + params: { ui_id: 3, type: 2 }, + fun_id: "wechat_app_home", + tubetoken: this.tubetoken, + fun_pl: 2, + }; + const res = await this.manorPost("/manor/common/apply/activity", body); + if (okCode(res)) { + const reward = res.water || res.reward_amount || (res.data && (res.data.water || res.data.reward_amount)) || ""; + this.log(`✅ 签到成功${reward ? `,+${reward}水滴` : ""}`); + return { ok: true }; + } + const msg = respMsg(res) || short(res); + if (/已签|签到过|重复|已领取|已完成|already|repeat/i.test(String(msg))) { + this.log(`✅ 今日已签到(${msg})`); + return { ok: true, already: true }; + } + // 风控类反馈 + if (/验证|风控|拦截|滑块|verify|forbidden/i.test(String(msg)) || Number(res.error_code) === 54002) { + this.blocked = true; + this.log(`⛔ 签到被风控拦截: ${msg}`); + return { ok: false, blocked: true, msg }; + } + this.log(`❌ 签到失败: ${msg}`); + return { ok: false, msg }; + } + // 附带浇水(非核心:失败/风控都不影响签到判定) + async waterTree() { + try { + let water = await this.getWater(); + if (water < 10) { this.log(` [浇水] 水滴 ${water} 不足10,跳过`); return; } + const count = Math.min(MAX_WATER_TIMES, Math.floor(water / 10)); + let watered = 0; + let curr = water; + for (let i = 0; i < count; i++) { + const body = { + atw: true, location_auth: false, last_stay_time: Math.floor(Math.random() * 40) + 10, + can_trigger_random_mission: false, product_scene: 0, minor: false, + ext_params: { can_trigger201824: true }, mission_type: 0, cost_water_amount: 10, + merge_cost: false, fun_id: "wechat_app_home", lower_end_device: false, + cost_water_competition_in_scene_icon: false, is_small_screen: true, + tubetoken: this.tubetoken, fun_pl: 2, + }; + const r = await this.manorPost("/manor/water/cost", body); + const left = r && r.now_water_amount; + if (left != null && left < curr) { curr = left; watered++; if (left < 10) break; await $.wait(200, 400); } + else break; + } + this.log(` [浇水] 完成 ${watered} 次,剩余水滴 ${curr}`); + } catch (e) { + this.log(` [浇水] 跳过: ${e.message || e}`); + } + } + async ensureSession() { + const cached = readCache()[this.account.openid] || {}; + if (!this.cookieStr && cached.cookieStr) { + this.cookieStr = cached.cookieStr; + this.pdduid = cached.uid || extractUid(this.cookieStr); + this.log("使用缓存Cookie"); + if (await this.getHomePage()) { this.log(`缓存有效,水滴=${this.water}`); return; } + this.log("缓存失效,重新登录"); + this.cookieStr = ""; this.pdduid = ""; this.tubetoken = ""; + } + if (!this.cookieStr) { + await this.login(); + if (!this.pdduid) this.pdduid = extractUid(this.cookieStr); + if (!(await this.getHomePage())) throw new Error("登录后首页加载失败(可能风控/Cookie无效)"); + this.log(`当前水滴=${this.water}`); + } + } + async run() { + if (!this.account.openid) { this.log("跳过:变量值里没有 openid"); return; } + try { + await this.ensureSession(); + const r = await this.checkin(); + await $.wait(500, 1000); + if (!r.blocked) await this.waterTree(); + } catch (e) { + const em = String(e.message || e); + if (em.startsWith("BLOCKED")) { + this.log(`⛔ ${em.replace(/^BLOCKED:/, "")}(拼多多重风控,需在小程序内手动过验证,脚本无法绕过)`); + return; + } + this.log(`执行失败: ${em}`); + } + } +} + +!(async () => { + $.checkEnv(ckName); + if (!$.userCount) { $.log(`未找到变量 ${ckName}`); return; } + for (let i = 0; i < $.userList.length; i++) { + await new Task($.userList[i]).run(); + if (i < $.userList.length - 1) await $.wait(1500, 3000); + } +})().catch((e) => $.log(e.message || e)).finally(() => $.done()); From 10bbc11c1e85cf30ca85c1000e1ad37bcfa0f2a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Wed, 2 Sep 2026 15:36:10 +0800 Subject: [PATCH 07/19] =?UTF-8?q?=E6=9C=89=E8=B5=9E=E8=84=9A=E6=9C=ACheade?= =?UTF-8?q?r=E6=97=A0Extra-Data=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/youzan.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/wxapp/youzan.js b/wxapp/youzan.js index c3bd6d90..f741d7c1 100644 --- a/wxapp/youzan.js +++ b/wxapp/youzan.js @@ -106,6 +106,7 @@ class Task { Accept: "application/json, text/plain, */*", "User-Agent": USER_AGENT, Referer: `https://servicewechat.com/${this.account.appid}/0/page-frame.html`, + 'Extra-Data': this.cred ? JSON.stringify(this.cred.extraData) : '', }; } @@ -162,6 +163,15 @@ class Task { accessToken: d.accessToken, sid: d.sessionId, kdtId: String(d.kdtId || kdt), + "extraData": { + "is_weapp": 1, + "sid": d.sessionId, + "version": "2.216.4.101", + "client": "weapp", + "bizEnv": "wsc", + "uuid": d.unionId, + "ftime": Date.now() + } }; const cache = readCache(); cache[`${this.account.openid}#${this.account.appid}`] = { ...this.cred, updatedAt: new Date().toISOString() }; @@ -195,7 +205,7 @@ class Task { const key = `${this.account.openid}#${this.account.appid}`; const cached = readCache()[key]; if (!this.cred && cached && cached.accessToken) { - this.cred = { accessToken: cached.accessToken, sid: cached.sid, kdtId: cached.kdtId }; + this.cred = { accessToken: cached.accessToken, sid: cached.sid, kdtId: cached.kdtId, extraData: cached.extraData }; if (await this.checkSession()) { this.log("使用缓存ck"); return; From 9c9e42cfbd791a0654c29c84730cd17db452ee2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Wed, 2 Sep 2026 15:38:49 +0800 Subject: [PATCH 08/19] =?UTF-8?q?=E5=A4=9A=E5=A4=9A=E6=9E=9C=E5=9B=AD?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E7=89=88=E5=8F=82=E6=95=B0=E5=8C=BA?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" "b/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" index b9bd2b31..b93134e3 100644 --- "a/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" +++ "b/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" @@ -29,13 +29,13 @@ app_id=33 / xcx_version / activity type 201811 均为该小程序固定应用常 */ const { Env } = require("../tools/env.js"); -const $ = new Env("拼多多果园签到"); +const $ = new Env("拼多多果园公众号版"); const axios = require("axios"); const fs = require("fs"); const path = require("path"); const WeChatServer = require("./wcs.js"); -const ckName = "pddgy"; +const ckName = "pddgy-gzh"; const MINI_APP_ID = "wx839691cce7c102bb"; const XCX_VERSION = "v8.6.21"; const PDD_APP_ID = 33; From 36500bea242f021da0bb7600112ac46479817889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Wed, 2 Sep 2026 15:40:59 +0800 Subject: [PATCH 09/19] =?UTF-8?q?=E5=8F=82=E6=95=B0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" "b/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" index b93134e3..ecc8589c 100644 --- "a/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" +++ "b/wxapp/pddgy-\345\205\254\344\274\227\345\217\267\347\211\210.js" @@ -35,7 +35,7 @@ const fs = require("fs"); const path = require("path"); const WeChatServer = require("./wcs.js"); -const ckName = "pddgy-gzh"; +const ckName = "pddgy_gzh"; const MINI_APP_ID = "wx839691cce7c102bb"; const XCX_VERSION = "v8.6.21"; const PDD_APP_ID = 33; From 0807011e69179a0b9bc527c46cb7495fe9e179c5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 2 Sep 2026 11:39:03 +0000 Subject: [PATCH 10/19] =?UTF-8?q?docs:=20=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20daily=20=E5=92=8C=20wxapp=20=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E7=8A=B6=E6=80=81=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3db0203b..9f66dd04 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ https://rewards.bing.com/welcome?rh=g7a-IyWIfh0&ref=rafsrchae | 每天有乐 | 2026-08-18 21:53:17 | ✅ | | 快集合 | 2026-08-18 17:47:16 | ✅ | | 华润壹票达 | 2026-08-18 17:47:16 | ✅ | -| 有赞通用签到 | 2026-08-18 18:04:46 | ✅ | +| 有赞通用签到 | 2026-09-02 19:39:02 | ✅ | | Babycare官方旗舰店 | 2026-08-18 21:53:17 | ✅ | | 汤星球 | 2026-08-18 20:16:12 | ✅ | | iyouke平台签到 | 2026-08-18 20:57:50 | ✅ | @@ -271,6 +271,7 @@ https://rewards.bing.com/welcome?rh=g7a-IyWIfh0&ref=rafsrchae | 小米社区签到 | 2026-08-20 10:19:33 | ✅ | | 小紫有约签到 | 2026-08-20 10:19:33 | ✅ | | 微盟会员签到 | 2026-08-20 10:19:33 | ✅ | +| 拼多多果园公众号版 | 2026-09-02 19:39:02 | ✅ | # 青龙面板拉库命令 From da2e8c52239d757e2b55b250a4e289045646b61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Fri, 4 Sep 2026 16:38:51 +0800 Subject: [PATCH 11/19] =?UTF-8?q?=E7=88=B1=E7=8E=9B=E4=BC=9A=E5=91=98?= =?UTF-8?q?=E4=BF=B1=E4=B9=90=E9=83=A8=E7=AD=BE=E5=88=B0ACTIVITY=5FID?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/aima.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wxapp/aima.js b/wxapp/aima.js index eb0bc0a8..0984db96 100644 --- a/wxapp/aima.js +++ b/wxapp/aima.js @@ -12,7 +12,7 @@ const fs = require("fs"); const path = require("path"); // ================== 配置区 ================== -const ACTIVITY_ID = "100001192"; +const ACTIVITY_ID = "100001275"; const BASE_URL = "https://scrm.aimatech.com"; const WXCLIENT_URL = `${BASE_URL}/aima/wxclient`; const MINI_APPID = "wx2dcfb409fd5ddfb4"; From 5fe6ae569b5f6c090c19770bb7c1ed3a4421e9cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Sat, 5 Sep 2026 10:26:46 +0800 Subject: [PATCH 12/19] =?UTF-8?q?=E7=94=9C=E6=B6=A6=E4=B8=96=E7=95=8C=201.?= =?UTF-8?q?=E4=BF=AE=E5=A4=8Dck=E5=A4=B1=E6=95=88=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=90=8E=E6=8F=90=E7=A4=BA=E2=80=9C=E6=9C=AA?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E2=80=9D=202.=E7=9F=B3=E6=96=9B=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=98=85=E8=AF=BB=E4=BB=BB=E5=8A=A1=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E9=98=85=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/trsj.js | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/wxapp/trsj.js b/wxapp/trsj.js index 4b20e224..00c27982 100644 --- a/wxapp/trsj.js +++ b/wxapp/trsj.js @@ -24,6 +24,9 @@ wx_auth 必填,wx_server 鉴权值 播种 GET /applet/game/dendrobium/sowing (原脚本带作者个人 inviteUserId 邀请码,已剔除) 查询 GET /applet/game/dendrobium/signIn/getUserSignInLog -> data.todaySignInStatus 签到 GET /applet/game/dendrobium/signIn -> code==200 成功 + 任务列表 GET /applet/game/dendrobium/task/list -> code==200 成功 + 文章列表 GET /applet/game/dendrobium/article/list + 浏览 GET /applet/game/dendrobium/article/completeRead -> code==200成功 原脚本的推文浏览/买肥料/自动施肥属养成任务,非签到,已略去。 ------------------------------------------ */ @@ -54,6 +57,9 @@ const EP_DEN_GET = "/applet/game/dendrobium/get"; const EP_DEN_SOW = "/applet/game/dendrobium/sowing"; const EP_DEN_SIGN_LOG = "/applet/game/dendrobium/signIn/getUserSignInLog"; const EP_DEN_SIGN = "/applet/game/dendrobium/signIn"; +const EP_DEN_TASK_LIST = "/applet/game/dendrobium/task/list"; +const EP_DEN_ARTICLE_LIST = "/applet/game/dendrobium/article/list"; +const EP_DEN_COMPLETEREAD = "/applet/game/dendrobium/article/completeRead"; const wechat = new WeChatServer({ url: process.env.wx_server_url || "http://192.168.31.196:8787", @@ -153,6 +159,7 @@ class Task { const res = await this.request("GET", EP_USERINFO); if (res && res.code === 200 && res.data) { this.log(`ck 有效:${(res.data.userName || res.data.nickName || "用户")}`); + this.unregistered = false; return true; } const msg = res?.msg || res?.message || short(res); @@ -221,6 +228,67 @@ class Task { this.log(`⚠️ 石斛签到跳过:${e.message || e}`); } } + + async getTaskList() { + try { + const res = await this.request("GET", EP_DEN_TASK_LIST); + if (res && res.code === 200 && Array.isArray(res.data)) { + const tasks = res.data; + // this.log(`✅ 石斛任务列表获取成功,共 ${tasks.length} 个任务`); + return tasks; + } else { + const msg = res?.msg || res?.message || short(res); + this.log(`⚠️ 石斛任务列表获取失败:${msg}`); + return []; + } + } catch (e) { + this.log(`⚠️ 石斛任务列表获取异常:${e.message || e}`); + return []; + } + } + + async articleList() { + try { + const res = await this.request("GET", EP_DEN_ARTICLE_LIST); + + if (res && res.code === 200 && Array.isArray(res.data.records)) { + const articles = res.data.records; + this.log(`✅ 石斛文章列表获取成功,共 ${articles.length} 篇文章`); + return articles; + } else { + const msg = res?.msg || res?.message || short(res); + this.log(`⚠️ 石斛文章列表获取失败:${msg}`); + return []; + } + } catch (e) { + this.log(`⚠️ 石斛文章列表获取异常:${e.message || e}`); + return []; + } + } + + async dendrobiumRead(url) { + try { + // 模拟浏览文章 + await axios.request({ + method: "GET", + url: url, + headers: { + Connection: "keep-alive", + } + }); + await $.wait(3000, 10000); // 模拟阅读时间 + const info = await this.request("GET", EP_DEN_COMPLETEREAD); + if (info.code === 200 && info.msg) { + this.log(`✅ 石斛阅读,${info.msg}`); + } else { + this.log(`✅ 石斛阅读已完成`); + } + + } catch (e) { + this.log(`⚠️ 石斛阅读跳过:${e.message || e}`); + } + } + async ensureLogin() { const cached = readCache()[this.account.openid] || {}; if (!this.token && cached.token) { @@ -243,6 +311,34 @@ class Task { } await this.signAward(); await this.dendrobiumSign(); + // 获取石斛任务列表并处理 + const taskList = await this.getTaskList(); + if (taskList.length > 0) { + for (const task of taskList) { + if (task.taskName.match(/浏览/)) { + if (task.status == 0) { + this.log(`ℹ️ 石斛任务:${task.taskName},未完成,开始阅读文章`); + var articleList = await this.articleList(); + if (articleList.length > 0) { + this.log(`ℹ️ 开始石斛文章阅读,共 ${articleList.length} 篇文章, 计划阅读前 ${task.times} 篇`); + for (var i = 0; i < task.times; i++) { + var article = articleList[i]; + if (!article) break; + this.log(`ℹ️ 阅读文章 ${i + 1}/3:${article.articleTitle || "未知标题"}`); + await this.dendrobiumRead(article.articleUrl); + await $.wait(1000, 3000); + } + } else { + this.log("ℹ️ 没有可阅读的石斛文章"); + } + } else { + this.log(`ℹ️ 石斛任务:${task.taskName},已完成`); + } + } + } + } + + } catch (e) { if (String(e.message).startsWith("NO_ACCOUNT")) { this.log("⚠️ 该微信号还没在甜润世界注册/激活会员,先在小程序里登录一次再跑"); From cf206f0177ad85934770096c8f3d970e9da03631 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 5 Sep 2026 13:12:06 +0000 Subject: [PATCH 13/19] =?UTF-8?q?docs:=20=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20daily=20=E5=92=8C=20wxapp=20=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E7=8A=B6=E6=80=81=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9f66dd04..e61b7dc8 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ https://rewards.bing.com/welcome?rh=g7a-IyWIfh0&ref=rafsrchae | 风云再起北京 | 2026-07-14 09:32:52 | ✅ | | 腾讯电脑管家登录 | 2026-07-14 09:32:52 | ✅ | | 大参林小程序签到 | 2026-07-14 09:32:52 | ✅ | -| 爱玛会员俱乐部 | 2026-07-14 09:32:52 | ✅ | +| 爱玛会员俱乐部 | 2026-09-05 21:12:06 | ✅ | | 天牛旧衣服回收签到 | 2026-07-14 09:32:52 | ✅ | | 创维会员中心 | 2026-07-14 09:32:52 | ✅ | | 飞鹤微信小程序签到 | 2026-07-14 09:32:52 | ✅ | @@ -262,7 +262,7 @@ https://rewards.bing.com/welcome?rh=g7a-IyWIfh0&ref=rafsrchae | 深圳春茧未来荟签到 | 2026-08-20 10:19:33 | ✅ | | 途虎养车签到 | 2026-08-20 10:19:33 | ✅ | | 天机观签到 | 2026-08-20 10:19:33 | ✅ | -| 甜润世界签到 | 2026-08-20 10:19:33 | ✅ | +| 甜润世界签到 | 2026-09-05 21:12:06 | ✅ | | 唯品会签到 | 2026-08-20 10:19:33 | ✅ | | 薇诺娜签到 | 2026-08-20 10:19:33 | ✅ | | 提现笔笔省领券 | 2026-08-20 10:19:33 | ✅ | From d3f1cf48ecb28ab4cdeb00f21926dc8729953b4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Sat, 5 Sep 2026 23:34:16 +0800 Subject: [PATCH 14/19] =?UTF-8?q?=E6=B4=BD=E6=B4=BD=E4=BC=9A=E5=91=98?= =?UTF-8?q?=E4=BF=B1=E4=B9=90=E9=83=A8=201.=E4=BF=AE=E6=94=B9=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91=202.=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=AD=BE=E5=88=B0=203.=E4=BF=AE=E6=94=B9=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=BC=93=E5=AD=98=E6=98=AF=E5=90=A6=E6=9C=89=E6=95=88?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/qqhyjlb.js | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/wxapp/qqhyjlb.js b/wxapp/qqhyjlb.js index e30a9fb9..ed4c0050 100644 --- a/wxapp/qqhyjlb.js +++ b/wxapp/qqhyjlb.js @@ -120,13 +120,14 @@ class Task { if (res.status !== 200 || String(d.status) !== "0") throw new Error(`upms登录失败: ${d.msg || `HTTP ${res.status}`}`); const payload = (d.data && d.data.data) || d.data || {}; this.session.token = payload.token || this.session.token || ""; - this.session.userId = String(payload.loginId || (payload.account || {}).loginId || ""); - if (!this.session.userId) throw new Error(`upms未返回 loginId: ${short(d)}`); + this.session.loginId = String(payload.loginId || (payload.account || {}).loginId || ""); + this.session.userId = String(payload.userId || (payload.account || {}).userId || "c10cff02123a9e2697d875262612399d"); + if (!this.session.loginId) throw new Error(`upms未返回 loginId: ${short(d)}`); } async loginMobile() { const code = await this.getCode(); const res = await axios.post(`${MOBILE_BASE}/wechat/login`, - formBody({ code, userId: this.session.userId }), + formBody({ code, userId: "c10cff02123a9e2697d875262612399d" }), { headers: this.commonHeaders({ from_env: "app" }), timeout: 20000, validateStatus: () => true }); const d = res.data || {}; if (String(d.status) !== "0") { @@ -138,32 +139,36 @@ class Task { if (sid) this.session.sessionId = sid; const cust = (d.data || {}).customer || {}; if (!this.session.sessionId) throw new Error(`mobile登录未拿到 SESSION: ${short(d)}`); + this.log(`登录成功${cust.nickName ? `(${cust.nickName})` : ""}`); } async login() { - await this.loginUpms(); await this.loginMobile(); + await this.loginUpms(); + const cache = readCache(); cache[this.account.openid] = { ...this.session, updatedAt: new Date().toISOString() }; writeCache(cache); } async mobilePost(apiPath, data = {}) { if (!this.session.sessionId) throw new Error("缺少SESSION"); - const res = await axios.post(`${MOBILE_BASE}${apiPath}`, - formBody({ ...(data || {}), userId: this.session.userId }), + const res = await axios.post(`${VIP_BASE}${apiPath}`, + formBody({ ...(data || {}), uid: this.session.userId }), { headers: this.commonHeaders({ Cookie: `SESSION=${this.session.sessionId}`, Authorization: this.session.token || "", from_env: "app" }), timeout: 20000, validateStatus: () => true }); const sid = getSessionId(res.headers); if (sid) this.session.sessionId = sid; return res.data; } async sign() { - const list = (await this.mobilePost("/promotion/sign/list"))?.data || []; - const signedToday = Array.isArray(list) && list.some((it) => String(it?.signTime || "").slice(0, 10) === today()); + var yearMonth = $.time("yyyy-MM") + var dayMonth = $.time("d"); + const list = (await this.mobilePost("/vip/member/listUserSignLog", { "yearMonth": yearMonth, "tenantId": "1" }))?.data || []; + const signedToday = Array.isArray(list) && list.some((it) => it.dayMonth === dayMonth); if (signedToday) { const last = list[list.length - 1] || {}; - return this.log(`✅ 今日已签到,连续 ${last.signContinuousDay || 0} 天`); + return this.log(`✅ 今日已签到,连续 ${last.continueDays || 0} 天`); } - const res = await this.mobilePost("/promotion/sign/sign"); + const res = await this.mobilePost("/vip/member/sign", { "channel": "", "tenantId": "1" }); if (String(res?.status) === "0") { const point = (res.data || {}).point; return this.log(`✅ 签到成功${point ? `,积分+${point}` : ""}`); @@ -174,7 +179,7 @@ class Task { } async checkSession() { try { - const r = await this.mobilePost("/promotion/sign/list"); + const r = await this.mobilePost("/vip/member/getVipExtInfo", { "tenantId": "1" }); return String(r?.status) === "0" || Array.isArray(r?.data); } catch (e) { return false; From 350baeb3910878f32a7b34f639af9288f1455b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Fri, 18 Sep 2026 09:32:25 +0800 Subject: [PATCH 15/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9ck=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E6=9C=89=E6=95=88=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/youzan.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wxapp/youzan.js b/wxapp/youzan.js index f741d7c1..2223a97c 100644 --- a/wxapp/youzan.js +++ b/wxapp/youzan.js @@ -198,7 +198,7 @@ class Task { async checkSession() { const res = await this.h5Get("/wscaccount/api/authorize/data.json"); - return isOk(res); + return res && res.data && res.data.userInfo && res.data.hasLogin; } async ensureLogin() { From 51a175f609523fb3d32046d81833314e3f285b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Fri, 18 Sep 2026 09:56:45 +0800 Subject: [PATCH 16/19] =?UTF-8?q?=E6=9C=89=E8=B5=9E=E4=BF=AE=E5=A4=8DCK?= =?UTF-8?q?=E6=9C=89=E6=95=88=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/youzan.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wxapp/youzan.js b/wxapp/youzan.js index 2223a97c..96456c45 100644 --- a/wxapp/youzan.js +++ b/wxapp/youzan.js @@ -198,7 +198,7 @@ class Task { async checkSession() { const res = await this.h5Get("/wscaccount/api/authorize/data.json"); - return res && res.data && res.data.userInfo && res.data.hasLogin; + return res && res.data && res.data.userInfo && res.data.userInfo.hasLogin; } async ensureLogin() { From 2e4615fac5c4e3ed5f4e0491a27bdf43b21ca6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9=E8=8E=AB=E7=88=B1=E5=B0=8F=E9=B8=9F?= <960365956@qq.com> Date: Mon, 21 Sep 2026 22:27:51 +0800 Subject: [PATCH 17/19] =?UTF-8?q?=E8=B0=B7=E9=9B=A8=EF=BC=9A=201.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=BC=93=E5=AD=98=E6=9C=BA=E5=88=B6=202.=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=AD=BE=E5=88=B0=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wxapp/guyu.js | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/wxapp/guyu.js b/wxapp/guyu.js index 2167e677..b5f0343f 100644 --- a/wxapp/guyu.js +++ b/wxapp/guyu.js @@ -6,6 +6,14 @@ @Date: 2024.06.07 19:15 @Description: cron: 30 9 * * 1 +------------------------------------------ +[更新日志] + +2026.09.21 +1.增加缓存机制 +2.修复签到报错问题 + + ------------------------------------------ #Notice: 谷雨 微信小程序 签到得积分 @@ -25,12 +33,15 @@ WeChatCodeServer 填写wx_server_url wx_auth 用于获取code const { Env } = require("../tools/env") -const $ = new Env("谷雨小程序"); +const $ = new Env("谷雨小程序", { + bucket: "guyu_token_cache.json" +}); const WeChatServer = require("./wcs.js"); let ckName = `guyu`; const strSplitor = "#"; const axios = require("axios"); const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram" + let wechat = new WeChatServer({ url: process.env.wx_server_url || 'https://xxx', appid: 'wxda948f3be0afc375', @@ -43,7 +54,6 @@ class Task { constructor(env) { this.index = $.userIdx++ this.user = env.split(strSplitor); - this.token = null this.wcsid = this.user[0] this.isSign = false this.shopId = '100186753' @@ -53,11 +63,24 @@ class Task { async run() { //随机延迟5-30s 模拟人工操作 - await $.wait(Math.floor(Math.random() * 20 + 5) * 1000); - let { data: codeRes } = await wechat.getCode(this.wcsid) - if (codeRes.status) { - await this.getUserToken(codeRes.data.code) + // await $.wait(Math.floor(Math.random() * 20 + 5) * 1000); + + const userData = await $.get(this.wcsid) + if (userData) { + $.log('使用缓存') + this.token = userData.mobileToken } + + if (this.token && await this.getUserPoints()) { + + } else { + $.log('缓存已失效,重新登录') + let { data: codeRes } = await wechat.getCode(this.wcsid) + if (codeRes.status) { + await this.getUserToken(codeRes.data.code) + } + } + if (!this.token) { $.log(`账号[${this.index}] 获取用户Token失败❌`) return @@ -94,6 +117,8 @@ class Task { let info = result.result || {} this.token = info.mobileToken if (info.shopId) this.shopId = "" + info.shopId + + $.set(this.wcsid, info) $.log(`🌸账号[${this.index}] 获取用户Token成功 门店:${info.shopName || this.shopId}`) } else { $.log(`🌸账号[${this.index}] 获取用户Token-失败:${result?.msg || result?.message}❌`) @@ -157,7 +182,7 @@ class Task { // 这里用两个只读查询接口动态拿当前可参与的签到活动(activityType=3) async findSignActivity() { try { - let { data: sys } = await this.request({ + let { data: sys } = await this.request({ method: 'GET', url: `https://mall-mobile-v6.vecrp.com/mobile/activity/common/queryIntegralSystemList`, params: { shopId: this.shopId, earnSpendType: 1 }, @@ -260,9 +285,11 @@ class Task { } = await this.request(options); if (result?.success) { $.log(`账号[${this.index}]` + `积分:${result.result[0].score}`); + return Promise.resolve(true) } else { $.log(`账号[${this.index}] 获取积分-失败:${result.msg}❌`) } + return Promise.resolve(false) } From 4ffbe4257719cad2b4d722f47c8f2487d11a9236 Mon Sep 17 00:00:00 2001 From: smallfawn <101914820+smallfawn@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:56:02 +0800 Subject: [PATCH 18/19] Update README.md --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index e61b7dc8..3864e068 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ ## 免费AI中转站 -https://kktoken.cc/sign-up?aff=lMQ6 https://free.supxh.xin/register?code=BVDU5Y @@ -24,12 +23,6 @@ https://api2.gemai.cc/sign-up?aff=Fjsj https://api456.me/register?aff=yBOp -https://api.hcnsec.cn/sign-up?aff=tEPD - - -https://freemodel.dev/invite/FRE-cd7d1d77 - - https://api.justwoker.icu/sign-up?aff=nUng From c29a9486b530ac132f6c81eaf4f86967e7eab589 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 24 Sep 2026 09:50:36 +0000 Subject: [PATCH 19/19] =?UTF-8?q?docs:=20=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20daily=20=E5=92=8C=20wxapp=20=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E7=8A=B6=E6=80=81=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3864e068..a7acea5b 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ https://rewards.bing.com/welcome?rh=g7a-IyWIfh0&ref=rafsrchae | 每天有乐 | 2026-08-18 21:53:17 | ✅ | | 快集合 | 2026-08-18 17:47:16 | ✅ | | 华润壹票达 | 2026-08-18 17:47:16 | ✅ | -| 有赞通用签到 | 2026-09-02 19:39:02 | ✅ | +| 有赞通用签到 | 2026-09-24 17:50:36 | ✅ | | Babycare官方旗舰店 | 2026-08-18 21:53:17 | ✅ | | 汤星球 | 2026-08-18 20:16:12 | ✅ | | iyouke平台签到 | 2026-08-18 20:57:50 | ✅ | @@ -245,7 +245,7 @@ https://rewards.bing.com/welcome?rh=g7a-IyWIfh0&ref=rafsrchae | Ole超市签到 | 2026-08-20 10:19:33 | ✅ | | OPPO商城签到 | 2026-08-20 10:19:33 | ✅ | | 拼多多果园签到 | 2026-08-20 10:19:33 | ✅ | -| 洽洽会员俱乐部 | 2026-08-20 10:19:33 | ✅ | +| 洽洽会员俱乐部 | 2026-09-24 17:50:36 | ✅ | | RIO微醺俱乐部 | 2026-08-20 10:19:33 | ✅ | | 红人库签到 | 2026-08-20 10:19:33 | ✅ | | 认养一头牛签到 | 2026-08-20 10:19:33 | ✅ |