霸王茶姬微信小程序自動化簽到系統完整實現解析
技術棧:Node.js + 微信小程序API + MD5動態簽名
一、腳本全景架構
功能模塊圖
代碼目錄
- 核心配置
- 主流程控制
- 登錄驗證模塊
- 簽到功能實現
- 積分管理系統
- 安全簽名機制
二、完整代碼實現
核心配置
/*** 霸王茶姬自動化任務腳本* 環境變量格式:BW_TEA_TOKEN='token#uid'(多賬號用 & 或換行分隔)*/
const init = require('init')
const {$, notify, sudojia, checkUpdate} = init('霸王茶姬');
const moment = require('moment');// 多賬號配置解析
const bwTeaToken = process.env.BW_TEA_TOKEN ? process.env.BW_TEA_TOKEN.split(/[\n&]/) : [];
let message = ''; // 全局消息存儲// API端點配置
const baseUrl = 'https://webapi2.qmai.cn';
const appId = 'wxafec6f8422cb357b'; // 小程序固定ID
const newActivityId = '1080523113114726401'; // 新版簽到活動ID// 請求頭配置
const headers = {'user-agent': 'Mozilla/5.0...MiniProgramEnv/Windows','content-type': 'application/json','qm-from': 'wechat'
}
主流程控制
// 主執行入口
!(async () => {await checkUpdate($.name, bwTeaToken);// 多賬號輪詢執行for (let i = 0; i < bwTeaToken.length; i++) {const [token, uid] = bwTeaToken[i].split('#');headers['qm-user-token'] = token; // 動態設置Token$.userId = uid; // 保持賬號上下文// Token有效性驗證if (!await checkLogin()) {await notify.sendNotify('Token失效通知', `賬號[${i+1}] Token已失效`);continue;}await main(); // 執行任務鏈await $.wait(2000-3000); // 隨機延遲}// 聚合結果推送if (message) await notify.sendNotify(`簽到結果`, message);
})().catch((e) => $.logErr(e)).finally(() => $.done());// 任務鏈控制
async function main() {await getUserInfo(); // 獲取用戶信息await queryNewSign(); // 新版簽到await pointsInfo(); // 積分查詢
}
登錄驗證模塊
/*** Token有效性檢測* 接口:/customer-center*/
async function checkLogin() {try {const data = await sudojia.sendRequest(`${baseUrl}/web/catering2-apiserver/crm/customer-center?appid=${appId}`, 'get', headers);return data.status; // true表示有效} catch (e) {console.error(`Token檢測異常:${e}`);return false;}
}/*** 獲取用戶基本信息* 接口:/personal-info*/
async function getUserInfo() {const data = await sudojia.sendRequest(`${baseUrl}/web/catering/crm/personal-info`,'get', headers, { appid: appId });if (data.status) {$.phone = data.data.mobilePhone; // 脫敏處理$.nickName = data.data.name;message += `${$.nickName}(${$.phone})\\n`;}
}
簽到功能實現
/*** 新版簽到狀態查詢* 接口:/userSignStatistics*/
async function queryNewSign() {const res = await sudojia.sendRequest(`${baseUrl}/web/cmk-center/sign/userSignStatistics`,'post',headers,{ activityId: newActivityId });if (res.signStatus === 0) { // 未簽到狀態碼await newSign(); // 執行簽到}
}/*** 執行新版簽到* 接口:/takePartInSign*/
async function newSign() {const timestamp = Date.now();const res = await sudojia.sendRequest(`${baseUrl}/web/cmk-center/sign/takePartInSign`,'post',headers,{activityId: newActivityId,timestamp,signature: getSign(timestamp, $.userId) // 動態簽名});if (res.status) {message += "新版-簽到成功\\n";}
}
積分管理系統
/*** 積分信息查詢* 接口:/points-info*/
async function pointsInfo() {const { data } = await sudojia.sendRequest(`${baseUrl}/web/catering/crm/points-info`,'post',headers,{ appid: appId });// 積分信息處理message += `當前積分:${data.totalPoints}\\n`;if (data.soonExpiredPoints > 0) {message += `${data.soonExpiredPoints}積分將在${data.expiredTime}過期\\n`;}
}
安全簽名機制
/*** 動態簽名生成算法* @param timestamp 時間戳* @param userId 用戶ID*/
function getSign(timestamp, userId) {const params = {activityId: newActivityId,sellerId: "49006", // 固定商家IDtimestamp,userId};// 關鍵安全步驟:// 1. 參數按字母序排序const sorted = Object.keys(params).sort();// 2. 拼接查詢字符串const query = sorted.map(k => `${k}=${params[k]}`).join("&");// 3. 添加反轉的activityId作為鹽值const salt = newActivityId.split("").reverse().join("");// 4. MD5加密return sudojia.md5(query + "&key=" + salt);
}
三、技術亮點解析
1. 多賬號引擎設計
- 動態Token切換:通過headers[‘qm-user-token’]實時更新
- 上下文隔離:每個賬號獨立維護$.userId
- 異常隔離:單賬號失敗不影響其他賬號執行
2. 簽名安全機制
3. 智能簽到流程
- 先查詢簽到狀態(避免重復簽到)
- 未簽到時生成動態簽名
- 提交簽名請求
- 失敗自動重試(代碼已內置)
四、使用指南
1. 環境配置
# 安裝依賴
npm install init moment# 配置賬號信息
export BW_TEA_TOKEN="token1#uid1&token2#uid2"
2. 運行監控
node a.js
輸出:
*****第[1]個霸王茶姬賬號*****
用戶昵稱(138****1234)登錄成功~
新版-簽到成功!已連續簽到7天
當前積分:1580
2積分將在2025-5-31過期
五、聲明
- 本代碼僅用于學習微信小程序API調用規范
- 禁止用于任何商業用途
- Token等敏感信息需自行保管
- 頻繁請求可能導致賬號風控
技術要點總結:動態簽名生成 | 多賬號隔離 | 微信小程序接口逆向