1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/Bg6shY若失效,可用地址
阿里云:
服务器购买地址
https://t.aliyun.com/U/Bg6shY若失效,可用地址
https://www.aliyun.com/daily-act/ecs/activity_selection?source=5176.29345612&userCode=49hts92d腾讯云:
https://curl.qcloud.com/wJpWmSfU若失效,可用地址
https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=ad201ee2ef3b771157f72ee5464b1fea&from=console华为云
https://activity.huaweicloud.com/cps.html?fromacct=64b5cf7cc11b4840bb4ed2ea0b2f4468&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=2019052.部署教程
3.代码如下
# cron: 20 8 * * *import requestsimport re,timeimport os,sys,jsonfrom notify import senddef pr(message):msg.append(message + "\n" )print(message)msg = []def get_headers(uid,skey):return {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c33)XWEB/13839",'Content-Type': "application/json",'content-longude': "121.5440902709961",'content-latitude': "31.221139907836914",'tenant': "MINISO",'content-uid': uid,'content-skey': skey,'Referer': "https://servicewechat.com/wx2a212470bade49bf/982/page-frame.html",'Accept-Language': "zh-CN,zh;q=0.9"}def index(uid,skey):url = "https://api-saas.miniso.com/task-manage-platform/api/activity/signInTask/award/receive"header = get_headers(uid, skey)data = {"activityId":"18","taskId":79}response = requests.post(url=url,headers=header,data=json.dumps(data))response.encoding = "utf-8"info = json.loads(response.text)if 200 == info['code']:pr("初始化签到")time.sleep(3)index(uid,skey)elif 500 == info['code']:pattern = re.compile(r'当前手机号(.*?)今日')matches = pattern.findall(info['message'])pr(f"用户名:{matches[0]}")pr("签到成功")time.sleep(3)task_liulan(uid,skey)time.sleep(3)wx_info(uid,skey)else:pr(info['message'])def sicxs_id(): #任务远程接口url = "https://api.xxx.cn/i/mcyp.php"response = requests.get(url=url)response.encoding = "utf-8"info = json.loads(response.text)return info['msg']def task_liulan(uid,skey):#浏览任务pr("正在开始浏览任务")url = "https://api-saas.miniso.com/task-manage-platform/api/activity/task/uvClick"header = get_headers(uid, skey)taskId = sicxs_id()for i in taskId:data = {"activityId":"18","taskId":i,"taskType":5}response = requests.post(url=url,headers=header,data=json.dumps(data))time.sleep(10)response.encoding = "utf-8"info = json.loads(response.text)if 200 == info['code']:task_wc(uid,skey,i)task_lq(uid,skey,i)else:pr(info['message'])def task_wc(uid,skey,id):#完成浏览任务url = "https://api.multibrands.miniso.com/multi-configure-platform/api/activity/task/browse/finish"header = get_headers(uid, skey)data = {"activityId":"18","taskId":id}response = requests.post(url=url,headers=header,data=json.dumps(data))time.sleep(30)response.encoding = "utf-8"info = json.loads(response.text)if 200 == info['code']:pr("浏览任务成功")else:pr("浏览任务失败")def task_lq(uid,skey,id):#领取奖励url = "https://api-saas.miniso.com/task-manage-platform/api/activity/periodTask/award/receive"header = get_headers(uid, skey)data = {"activityId":"18","taskId":id,"taskType":5}response = requests.post(url=url,headers=header,data=json.dumps(data))time.sleep(30)response.encoding = "utf-8"info = json.loads(response.text)if 200 == info['code']:pr("领取任务奖励成功")else:pr(info['message'])def wx_info(uid,skey):url = "https://api-saas.miniso.com/task-manage-platform/api/virtualCoin/member"header = {"authority": "api-saas.miniso.com","method": "GET","content-latitude": "31.221139907836914","content-longude": "121.49022668457031","tenant-code": "MINISO","x-client-source": "MINISO_WX_MINI","user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) XWEB/8555","tenant": "MINISO","content-uid": uid,"content-type": "application/json","content-skey": skey,"referer": "https://servicewechat.com/wx2a212470bade49bf/924/page-frame.html",}response = requests.get(url=url,headers=header)response.encoding = "utf-8"info = json.loads(response.text)pr(f"当前mini币:{info['data']['quantity']}")def sicxs():config_path = 'config.py'if os.path.exists(config_path):import configelse:with open(config_path, 'w') as f:pr("首次运行,已创建配置文件 config.py,请按照说明填写相关变量后再次运行脚本。")f.write('#可以在此文件中添加配置变量,例如:\nsfsy = ""\n')try:env_cookie = os.environ.get("wx_mcyp")si_cookie = getattr(config, 'wx_mcyp', '')if env_cookie and si_cookie:cookies = env_cookie + "\n" + si_cookieelif env_cookie:cookies = env_cookieelif si_cookie:cookies = si_cookieelse:pr("请设置变量 export wx_mcyp='' 或在 config.py 中设置 wx_mcyp =")sys.exit()except Exception as e:pr("请设置变量 export wx_mcyp='' 或在 config.py 中设置 wx_mcyp =")sys.exit()list_cookie = [c for c in re.split(r'\n|&', cookies) if c.strip()]total_cookies = len(list_cookie)for i, list_cookie_i in enumerate(list_cookie):try:print(f'\n----------- 账号【{i + 1}/{total_cookies}】执行 -----------')pr(f"账号【{i + 1}】开始执行:")list = list_cookie_i.split("#")index(list[0], list[1])except Exception as e:pr(f"账号【{i + 1}/{total_cookies}】执行出错")finally:send("名创优品小程序", ''.join(msg))msg.clear()print(f'\n----------- 执 行 结 束 -----------')if __name__ == '__main__':sicxs()
该脚本为名创优品自动签到脚本。
主要作用
名创优品小程序自动化:完成每日签到,串行执行浏览任务 → 任务完成上报 → 领取奖励,最后查询并回显mini币余额,并通过
notify.send("名创优品小程序", …)推送结果。多账号支持:从环境变量或
config.py读取wx_mcyp,多账号用换行或&分隔,每个账号是uid#skey。逐个账号执行并分别通知。定时运行:示例 cron
20 8 * * *(每日 08:20)。脚本内已包含必要的等待(10s/30s)以配合任务时长判定。
主要方法
pr(message):统一日志累积到全局msg,单账号执行完再一次性推送,随后清空,便于多账号循环复用。get_headers(uid, skey):构造公共请求头(UA、经纬度、tenant、content-uid/skey等),供任务接口复用,确保鉴权字段一致。index(uid, skey):入口。请求signInTask/award/receive触发签到:code == 200:视为初始化(服务端预热),打印"初始化签到",随后再次调用index执行真正签到流程(注意:这是递归式二次触发)。code == 500:解析返回文案中的手机号(正则),视为已成功签到;之后依次调用task_liulan → wx_info。其他:直接打印
message作为错误提示。sicxs_id():从远端https://api.xxx.cn/i/mcyp.php拉取浏览任务 taskId 列表(返回msg字段)。用于避免把 taskId 写死在仓库。task_liulan(uid, skey):逐个任务POST /task/uvClick触发UV 点击,等待约 10s,再进入:task_wc(uid, skey, id):/task/browse/finish上报浏览完成(等待约 30s 确保达标);成功打印"浏览任务成功"。task_lq(uid, skey, id):/periodTask/award/receive领取奖励(再等 30s);成功打印"领取任务奖励成功"。wx_info(uid, skey):查询virtualCoin/member,输出当前 mini 币余额(注意脚本注释:mini 币90 天有效)。sicxs():配置读取 + 多账号调度。合并环境变量与config.py,切分账号后循环:index→ 通知 → 清空日志;最后打印"执行结束"。
递归风控(重要)
index中code == 200会再次调用index。建议加最多 1 次的初始化重试标记(如参数init=False/True或全局标记),避免异常情况下无限递归/循环。超时与重试
给所有
requests补timeout=10;对初始化签到与领取奖励接口做最多 2–3 次指数退避(2s→4s→8s)重试。远端
sicxs_id失败时,打印"任务清单获取失败"并跳过浏览流程但仍执行wx_info,不让整次任务中断。健壮解析
index里500分支解析手机号使用正则,建议判空后再pr,否则解析失败会抛异常。所有
json.loads前先判断response.headers.get('Content-Type')是否含json;否则打印响应摘要(截断)并跳过。接口一致性
task_wc使用的域名是api.multibrands.miniso.com,其余多为api-saas.miniso.com。这是常见的多域网关设计,但若出现 403/跨域限流,建议在日志中明确打印具体域名与status_code,以便复盘。等待时长与并发
你已设置
10s/30s等待,基本满足"浏览计时"与"奖励结算"。如 IDs 较多可增加随机抖动(±2–5s)以降低同 IP 同步触发的风控概率。保持串行(当前做法正确),不要对任务做并发。
鉴权与位置
头里有固定经纬度(上海系示例)。若官方对地理位置敏感,建议改为可配置(环境变量),避免长期同坐标被判为异常。
过期提示
mini 币 90 天有效,可在
wx_info输出余额时同时提示"有效期 90 天",或在余额>0 时追加"请在有效期内使用"。错误分级日志
对
code≠ 200 的场景,建议按模块打印:[签到失败] message=...、[浏览失败] taskId=... code=...,便于快速定位是哪一步失败。
常见异常与定位
code == 403/401:常为uid/skey失效或请求头不全,核对content-uid/skey/tenant是否随账号变化正确填充。领取奖励失败:多为浏览完成未达条件或等待不足,延长task_wc前后的等待(如 30→40s)。sicxs_id无返回:远端接口临时不可用,建议脚本打印"使用空任务清单,跳过浏览流程"。
运行与多账号格式
cron:
20 8 * * *(系统时区为准)。通知:每个账号结束单独推送一次,便于分账号查看成功/失败。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论