Collect seeded Qinglong script repositories

This commit is contained in:
Hermes Agent
2026-05-24 04:36:41 +00:00
parent 28d62fef03
commit ca1a4275e4
282 changed files with 143071 additions and 5 deletions

View File

@@ -0,0 +1,822 @@
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/UPDATE.js
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/UPDATE.js
// # Repo: imoki/sign_script
// # Path: polymerization/UPDATE.js
// # UploadedAt: 2025-08-25T21:29:14+08:00
// # SHA256: 891e820ae0a3f9c63d3f0a87b92ed14ec831b0088c9e63b2a4eb16e40d12d287
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
脚本名称UPDATE.js
脚本兼容: airsript 1.0、airscript 2.0
更新时间20250504
备注:更新脚本。用于自动生成表格,以及追加表格数据
适配airsript 1.0版本及airscript 2.0版本
其他:若想添加新内容,请搜索(修改这里),按照格式修改
*/
var confiWorkbook = 'CONFIG' // 主配置表名称
var pushWorkbook = 'PUSH' // 推送表的名称
var emailWorkbook = 'EMAIL' // 邮箱表的名称
var version = 1 // 版本类型自动识别并适配。默认为airscript 1.0否则为2.0Beta
var separator = "##########MOKU##########" // 分割符分割消息。可用于PUSH.js灵活推送
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
var messageDistance = 100; // 消息距离用于匹配100字符内最近的行
// 表中激活的区域的行数和列数
var workbook = [] // 存储已存在表数组
var row = 0;
var col = 0;
var maxRow = 100; // 规定最大行
var maxCol = 22; // 规定最大列
var colNum = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V']
// CONFIG表内容
// 推送昵称(推送位置标识)选项若“是”则推送“账户名称”若账户名称为空则推送“单元格Ax”这两种统称为位置标识。若“否”则不推送位置标识
// 存放CONFIG表内容标题+标题下内容
var configContent = [];
// 实际写入CONFIG表的值
// CONFIG表标题
configTitle = ['工作表的名称', '备注', '只推送失败消息(是/否)', '推送昵称(是/否)', '是否存活', '程序结束时间', '消息', '推送时间', '推送方式', '是否通知', '加入消息池', '推送优先级', '当日可推送次数', '当日剩余推送次数']
// 定义CONFIG表标题下内容的默认值
var configBodyDefault = ['xxx', '', '否', '是', '是', '', '', '', '@all', '是', '否', '0', '1', ''];
// CONFIG表标题下内容
var configBody = [
{ name: 'remind', note: '日期提醒工具',},
{ name: 'qrcode', note: '二维码生成工具',},
{ name: 'jitang', note: '鸡汤',},
{ name: 'imgcover', note: '随机封面',},
{ name: 'weekplan', note: '周安排工具',},
{ name: 'todayhistory', note: '历史上的今天',},
{ name: 'oilprice', note: '今日油价',},
{ name: 'airabsorbed', note: '全国空气吸收剂量率',},
{ name: 'smzdm', note: '什么值得买抽奖',},
{ name: 'toollu', note: '在线工具',},
{ name: 'zaoan', note: '早安问候语',},
{ name: 'wanan', note: '晚安问候语',},
{ name: 'bilihot', note: '哔哩哔哩热搜榜',},
{ name: 'dyhot', note: '抖音热搜榜',},
{ name: 'ddmc_ddyt', note: '叮咚鱼塘',},
{ name: 'wbhot', note: '微博热搜榜',},
{ name: 'zhhot', note: '知乎热搜榜',},
{ name: 'bdhot', note: '百度热搜榜',},
{ name: 'xmly', note: '喜马拉雅',},
{ name: 'ssphot', note: '少数派热榜',},
{ name: 'en', note: '希沃白板',},
{ name: 'bdsl', note: '百度收录',},
{ name: 'quark', note: '夸克网盘',},
{ name: 'huluxia', note: '葫芦侠3楼',},
{ name: 'steamrank', note: 'steam游戏在线人数'},
{ name: 'oneyan', note: '随机一句一言',},
{ name: 'ztebbs', note: '中兴社区',},
{ name: 'mi', note: '小米商城',},
{ name: 'kanxue', note: '看雪论坛',},
{ name: 'day60s', note: '每天60秒读懂世界'},
{ name: 'vivo', note: 'vivo社区',},
{ name: 'chouq', note: '随机抽签',},
{ name: 'kfc', note: 'KFC疯狂星期四搞笑语录',},
{ name: 'golo', note: 'golo汽修大师',},
{ name: 'xingzuo', note: '星座运势',},
{ name: 'tzgsc', note: '挑战古诗词',},
{ name: 'chinadsl', note: '宽带技术网',},
{ name: 'imgecy', note: '随机二次元图片',},
{ name: 'imgbing', note: 'Bing每日图片',},
{ name: 'ztemall', note: '中兴商城',},
{ name: 'wnflb', note: '万能福利吧',},
{ name: 'wangzhe', note: '王者荣耀英雄介绍',},
{ name: 'rsdjs', note: '人生倒计时',},
{ name: 'fwxs', note: '废文小说',},
{ name: 'imgavatar', note: '随机头像',},
{ name: 'shenhuifu', note: '神回复',},
{ name: 'imglandscape', note: '随机风景图片',},
{ name: 'miyu', note: '谜语', },
{ name: 'telsaorao', note: '骚扰电话查询',},
{ name: 'favicon', note: '网站图标获取',},
{ name: 'imgphone', note: '随机手机壁纸',},
{ name: 'kyt', note: '科研通',},
{ name: 'parsdata', note: '伊朗域名注册优惠码',},
{ name: 'quarksave', note: '夸克订阅更新自动转存',},
{ name: 'dailynewscn', note: '中国日报',},
{ name: 'telgsd', note: '手机号归属地',},
{ name: 'dwz', note: '短网址生成',},
{ name: 'fjzh', note: '简繁体转换',},
{ name: 'xpnc', note: '兴攀农场',},
{ name: 'qwxh', note: '趣味笑话',},
{ name: 'rshy', note: '人生话语',},
{ name: 'qcs', note: '屈臣氏',},
{ name: 'meiju', note: '随机美句摘抄文案',},
{ name: 'hzh', note: '华住会',},
{ name: 'eswxlt', note: '恩山无线论坛',},
{ name: 'weimei', note: '随机唯美文案',},
{ name: 'xmdl', note: '熊猫网络',},
{ name: 'lnglat', note: '经纬度解析',},
{ name: 'hfweather', note: '和风天气', pushPriority: '1',},
{ name: 'piaofang', note: '电影票房排行',},
{ name: 'ciba', note: '词霸每日一句',},
{ name: 'deepseek', note: 'deepseek分析工具',},
// { name: '(修改这里)', note: '(修改这里)',}, // 添加新增内容
];
// 定义字段映射关系,标题和键的对应关系,用于动态个性化处理
var configTitleMapping = {
'工作表的名称': 'name',
'备注': 'note',
'只推送失败消息(是/否)': 'pushFailureOnly',
'推送昵称(是/否)': 'pushNickname',
'是否存活': 'isAlive',
'更新时间': 'updateTime',
'消息': 'message',
'推送时间': 'pushTime',
'推送方式': 'pushMethod',
'是否通知': 'notify',
'加入消息池': 'addToMessagePool',
'推送优先级': 'pushPriority',
'当日可推送次数': 'dailyPushLimit',
'当日剩余推送次数': 'remainingDailyPushes',
};
// PUSH表内容
var pushContent = [
['推送类型', '推送识别号(如token、key)', '是否推送(是/否)'],
['bark', 'xxxxxxxx', '否'],
['pushplus', 'xxxxxxxx', '否'],
['ServerChan', 'xxxxxxxx', '否'],
['email', '若要邮箱发送请配置EMAIL表', '否'],
['dingtalk', 'xxxxxxxx', '否'],
['discord', '请填入镜像webhook链接,自行处理Query参数', '否'],
['qywx', 'xxxxxxxx', '否'],
['xizhi', 'xxxxxxxx', '否'],
['jishida', 'xxxxxxxx', '否'],
['wxpusher', 'appToken|uid', '否'],
]
// email表内容
var emailContent = [
['SMTP服务器域名', '端口', '发送邮箱', '授权码'],
['smtp.qq.com', '465', 'xxxxxxxx@qq.com', 'xxxxxxxx']
]
// 分配置表内容
var subConfigContent = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)'],
['xxxxxxxx1', '是', '昵称1'],
['xxxxxxxx2', '否', '昵称2']
]
// 定制化分配置表内容,叮咚买菜
var subConfigDdmc = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'seedId_ddgy', 'propsId_ddgy', 'seedId_ddyt', 'propsId_ddty'],
['xxxxxxxx1', '是', '昵称1', '填果园seedId', '填果园propsId', '填鱼塘seedId', '填鱼塘propsId'],
['xxxxxxxx2', '否', '昵称2', '填果园seedId', '填果园propsId', '填鱼塘seedId', '填鱼塘propsId']
]
// 定制化分配置表内容WPS
var subConfigWps = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '转存PPT(是/否)', '是否渠道1打卡(是/否)', '是否渠道2打卡(是/否)', 'Signature(渠道2)'],
['xxxxxxxx1', '是', '昵称1', '否', '是', '否' , 'xxxxxxxx' ,],
['xxxxxxxx2', '否', '昵称2', '否', '是', '否' , 'xxxxxxxx' ,]
]
// 定制化分配置表内容,小米商城
var subConfigMi = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'mishop-client-id'],
['xxxxxxxx1', '是', '昵称1', '100'],
['xxxxxxxx2', '否', '昵称2', '100']
]
// 定制化分配置表内容golo汽修大师
var subConfigGolo = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'username', 'password'],
['xxxxxxxx1', '是', '昵称1', '此格填用户名', '此格填密码'],
['xxxxxxxx2', '否', '昵称2', '此格填用户名', '此格填密码']
]
// 定制化分配置表内容parsdata
var subConfigParsdata = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '优惠码'],
['xxxxxxxx1', '是', '昵称1', ''],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容qcs
var subConfigQcs = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'openId', 'unionId'],
['xxxxxxxx1', '是', '昵称1', '', ''],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容,恩山无线论坛
var subConfigEswxlt = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'openId', 'unionId'],
['xxxxxxxx1', '是', '昵称1', '', ''],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容xmdl
var subConfigXmdl = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'username', 'password'],
['xxxxxxxx1', '是', '昵称1', '此格填用户名', '此格填密码'],
['xxxxxxxx2', '否', '昵称2', '此格填用户名', '此格填密码']
]
// 定制化分配置表内容hfweather和风天气
var subConfigHfweather = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '省份/城市/区/经纬度/ID手动输入', '今日天气预报', '实时天气预报', '当天生活指数', '天气灾害预警', '逐小时天气预报', '分钟级降水','其他模式(可选)','消息过滤器(可选)','高级配置(可选)','实际定位(自动生成)','地区ID自动生成','经纬度(自动生成)','一致性校验(自动生成)','冗余观测站(自动生成)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '朝阳区', '是', '否', '否', '否', '否', '否', '', '', '', '', '', '', '', '', ''],
// ['xxxxxxxx2', '否', '昵称2', '是', '否', '否', '否', '否', '否', '', '', '', '', '', '', '', '', '']
]
// 定制化分配置表内容ciba词霸每日一句
var subConfigCiba = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '中文每日一句', '英文每日一句'],
['xxxxxxxx1', '是', '昵称1', '是', '是'],
['xxxxxxxx2', '否', '昵称2', '是', '是']
]
// 定制化分配置表内容deepseek
var subConfigDeepseek = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '模型', '提示词'],
['xxxxxxxx1', '是', '昵称1', 'deepseek-r1-distill-qwen-32b', '请用中文说明哪些运行失败了带上有趣的emoji限制在100字以内。'],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容remind
var subConfigRemind = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '提醒日期(自动生成)', '标题', '提醒单位', '月', '日'],
['xxxxxxxx1', '是', '昵称1', '', '🎂生日到啦!', '农历', '1', '1'],
['xxxxxxxx2', '否', '昵称2', '', '🥳提醒到啦!', '阳历', '11', '22']
]
// 定制化分配置表内容qrcode
var subConfigQrcode = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '二维码内容', '二维码(自动生成)'],
['xxxxxxxx1', '是', '昵称1', 'github.com/imoki', ''],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容weekplan
var subConfigWeekplan = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'],
['xxxxxxxx1', '是', '昵称1', '', '', '', '', '', '', '', '', '',],
['xxxxxxxx2', '否', '昵称2', '', '', '', '', '', '', '', '', '',]
]
// 定制化分配置表内容oilprice
var subConfigOilprice = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '地区', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '北京', '否'],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容bdsl
var subConfigBdsl = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '域名'],
['xxxxxxxx1', '是', '昵称1', 'github.com'],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容steamrank
var subConfigSteamrank = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', 'appid'],
['xxxxxxxx1', '是', '昵称1', '578080'],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容xingzuo
var subConfigXingzuo = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '星座', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '白羊座', '是'],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容wangzhe
var subConfigWangzhe = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '英雄名'],
['xxxxxxxx1', '是', '昵称1', '李白'],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容imgecy
var subConfigImgecy = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '图片(自动生成)'],
['xxxxxxxx1', '是', '昵称1', ''],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容imgbing
var subConfigImgbing = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '图片(自动生成)'],
['xxxxxxxx1', '是', '昵称1', ''],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容imgavatar
var subConfigImgavatar = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '图片(自动生成)'],
['xxxxxxxx1', '是', '昵称1', ''],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容imglandscape
var subConfigImglandscape = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '图片(自动生成)'],
['xxxxxxxx1', '是', '昵称1', ''],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容imgphone
var subConfigImgphone = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '图片(自动生成)'],
['xxxxxxxx1', '是', '昵称1', ''],
['xxxxxxxx2', '否', '昵称2', '']
]
// 定制化分配置表内容telsaorao
var subConfigTelsaorao = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '手机号','检测报告(自动生成)'],
['xxxxxxxx1', '是', '昵称1', '', ''],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容favicon
var subConfigFavicon = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '域名','网站图标(自动生成)'],
['xxxxxxxx1', '是', '昵称1', 'github.com', ''],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容telgsd
var subConfigTelgsd = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '手机号','归属地(自动生成)'],
['xxxxxxxx1', '是', '昵称1', '', ''],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容dwz
var subConfigDwz = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '域名','短网址(自动生成)'],
['xxxxxxxx1', '是', '昵称1', 'github.com', ''],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容fjzh
var subConfigFjzh = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '简体','繁体(自动生成)'],
['xxxxxxxx1', '是', '昵称1', '龙', ''],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容lnglat
var subConfigLnglat = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '经度', '纬度','结果(自动生成)'],
['xxxxxxxx1', '是', '昵称1', '', '', ''],
['xxxxxxxx2', '否', '昵称2', '', '', '']
]
// 直接推送类
// 定制化分配置表内容dailynewscn
var subConfigdailynewscn = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)', '新闻条数'],
['xxxxxxxx1', '是', '昵称1', '是', '全部'],
['xxxxxxxx2', '否', '昵称2', '', '10']
]
// 定制化分配置表内容airabsorbed
var subConfigairabsorbed = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)', '省份'],
['xxxxxxxx1', '是', '昵称1', '是', '北京'],
['xxxxxxxx2', '否', '昵称2', '', '']
]
// 定制化分配置表内容wbhot
var subConfigwbhot = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容zhhot
var subConfigzhhot = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容bdhot
var subConfigbdhot = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容ssphot
var subConfigssphot = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容kfc
var subConfigkfc = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容miyu
var subConfigmiyu = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容todayhistory
var subConfigtodayhistory = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容zaoan
var subConfigzaoan = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容wanan
var subConfigwanan = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容oneyan
var subConfigoneyan = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容chouq
var subConfigchouq = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容tzgsc
var subConfigtzgsc = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化分配置表内容shenhuifu
var subConfigshenhuifu = [
['cookie(默认20个)', '是否执行(是/否)', '账号名称(可不填写)', '直推(是/否)'],
['xxxxxxxx1', '是', '昵称1', '是',],
['xxxxxxxx2', '否', '昵称2', '',]
]
// 定制化表
var subConfig = {
"ddmc" : subConfigDdmc,
"wps" : subConfigWps,
"golo" : subConfigGolo,
"parsdata":subConfigParsdata,
"qcs":subConfigQcs,
"eswxlt":subConfigEswxlt,
"xmdl":subConfigXmdl,
"hfweather":subConfigHfweather,
"ciba":subConfigCiba,
"deepseek" : subConfigDeepseek,
"remind" : subConfigRemind,
"qrcode" : subConfigQrcode,
"weekplan" : subConfigWeekplan,
"oilprice" : subConfigOilprice,
"bdsl" : subConfigBdsl,
"steamrank" : subConfigSteamrank,
"xingzuo" : subConfigXingzuo,
"wangzhe" : subConfigWangzhe,
"imgecy" : subConfigImgecy,
"imgbing" : subConfigImgbing,
"imgavatar" : subConfigImgavatar,
"imglandscape" : subConfigImglandscape,
"imgphone" : subConfigImgphone,
"telsaorao" : subConfigTelsaorao,
"favicon" : subConfigFavicon,
"telgsd" : subConfigTelgsd,
"dwz" : subConfigDwz,
"fjzh" : subConfigFjzh,
"lnglat" : subConfigLnglat,
// 直推
"dailynewscn" : subConfigdailynewscn,
"airabsorbed" : subConfigairabsorbed,
"wbhot" : subConfigwbhot,
"zhhot" : subConfigzhhot,
"bdhot" : subConfigbdhot,
"ssphot" : subConfigssphot,
"kfc" : subConfigkfc,
"miyu" : subConfigmiyu,
"todayhistory" : subConfigtodayhistory,
"zaoan" : subConfigzaoan,
"wanan" : subConfigwanan,
"oneyan" : subConfigoneyan,
"chouq" : subConfigchouq,
"tzgsc" : subConfigtzgsc,
"shenhuifu" : subConfigshenhuifu,
}
// var mosaic = "xxxxxxxx" // 马赛克
// var strFail = "否"
// var strTrue = "是"
main() // 入口
// CONFIG表添加超链接
function hypeLink(){
// console.log("添加超链接")
let workSheet= Application.Sheets(confiWorkbook) //配置表
// let workUsedRowEnd = workSheet.UsedRange.RowEnd //用户使用表格的最后一行
let rowcol = getRowCol()
let workUsedRowEnd = rowcol[0] // 行
// console.log(workUsedRowEnd)
for(let row = 2; row <= workUsedRowEnd; row++){
link_name=workSheet.Range("A" + row).Text
if (link_name == "") {
break; // 如果为空行,则提前结束读取
}
link_name ='=HYPERLINK("#'+link_name+'!$A$1","'+link_name+'")' //设置超链接
// console.log(link_name) // HYPERLINK("#PUSH!$A$1","PUSH")
if(version == 1){
// airscipt 1.0
workSheet.Range("A" + row).Value =link_name
}else{
// airscipt 2.0
workSheet.Range("A" + row).Value2 =link_name
}
}
}
// 判断表格行列数,并记录目前已写入的表格行列数。目的是为了不覆盖原有数据,便于更新
function determineRowCol() {
for (let i = 1; i < maxRow; i++) {
let content = Application.Range("A" + i).Text
if (content == "") // 如果为空行,则提前结束读取
{
row = i - 1; // 记录的是存在数据所在的行
break;
}
}
// 超过最大行了认为row为0从头开始
let length = colNum.length
for (let i = 1; i <= length; i++) {
content = Application.Range(colNum[i - 1] + "1").Text
if (content == "") // 如果为空行,则提前结束读取
{
col = i - 1; // 记录的是存在数据所在的行
break;
}
}
// 超过最大行了认为col为0从头开始
// console.log("✨ 当前激活表已存在:" + row + "行," + col + "列")
}
// 获取当前激活表的表的行列
function getRowCol() {
let row = 0
let col = 0
for (let i = 1; i < maxRow; i++) {
let content = Application.Range("A" + i).Text
if (content == "") // 如果为空行,则提前结束读取
{
row = i - 1; // 记录的是存在数据所在的行
break;
}
}
// 超过最大行了认为row为0从头开始
let length = colNum.length
for (let i = 1; i <= length; i++) {
content = Application.Range(colNum[i - 1] + "1").Text
if (content == "") // 如果为空行,则提前结束读取
{
col = i - 1; // 记录的是存在数据所在的行
break;
}
}
// 超过最大行了认为col为0从头开始
// console.log("✨ 当前激活表已存在:" + row + "行," + col + "列")
return [row, col]
}
// 激活工作表函数
function ActivateSheet(sheetName) {
let flag = 0;
try {
let sheet = Application.Sheets.Item(sheetName)
sheet.Activate()
// console.log("🍾 激活工作表:" + sheet.Name)
flag = 1;
} catch {
flag = 0;
// console.log("📢 无法激活工作表,工作表可能不存在")
// console.log("🪄 创建工作表:" + sheetName)
createSheet(sheetName)
}
return flag;
}
// 统一编辑表函数
function editConfigSheet(content) {
determineRowCol();
let lengthRow = content.length
let lengthCol = content[0].length
if (row == 0) { // 如果行数为0认为是空表,开始写表头
for (let i = 0; i < lengthCol; i++) {
if(version == 1){
// airscipt 1.0
Application.Range(colNum[i] + 1).Value = content[0][i]
}else{
// airscript 2.0(Beta)
Application.Range(colNum[i] + 1).Value2 = content[0][i]
}
}
row += 1; // 让行数加1代表写入了表头。
}
// 从已写入的行的后一行开始逐行写入数据
// 先写行
for (let i = 1 + row; i <= lengthRow; i++) { // 从未写入区域开始写
for (let j = 0; j < lengthCol; j++) {
if(version == 1){
// airscipt 1.0
Application.Range(colNum[j] + i).Value = content[i - 1][j]
}else{
// airscript 2.0(Beta)
Application.Range(colNum[j] + i).Value2 = content[i - 1][j]
}
}
}
// 再写列
for (let j = col; j < lengthCol; j++) {
for (let i = 1; i <= lengthRow; i++) { // 从未写入区域开始写
if(version == 1){
// airscipt 1.0
Application.Range(colNum[j] + i).Value = content[i - 1][j]
}else{
// airscript 2.0(Beta)
Application.Range(colNum[j] + i).Value2 = content[i - 1][j]
}
}
}
}
// 存储已存在的表
function storeWorkbook() {
// 工作簿Workbook中所有工作表Sheet的集合,下面两种写法是一样的
let sheets = Application.ActiveWorkbook.Sheets
sheets = Application.Sheets
// 打印所有工作表的名称
for (let i = 1; i <= sheets.Count; i++) {
workbook[i - 1] = (sheets.Item(i).Name)
// console.log(workbook[i-1])
}
}
// 判断表是否已存在
function workbookComp(name) {
let flag = 0;
let length = workbook.length
for (let i = 0; i < length; i++) {
if (workbook[i] == name) {
flag = 1;
console.log("✨ " + name + "表已存在")
break
}
}
return flag
}
// 创建表,若表已存在则不创建,直接写入数据
function createSheet(sheetname) {
// const defaultName = Application.Sheets.DefaultNewSheetName
// 工作表对象
if (!workbookComp(sheetname)) {
console.log("🪄 创建工作表:" + sheetname)
try{
Application.Sheets.Add(
null,
Application.ActiveSheet.Name,
1,
Application.Enum.XlSheetType.xlWorksheet,
sheetname
)
}catch{
// console.log("😶‍🌫️ 适配airscript 2.0版本")
version = 2 // 设置版本为2.0
let newSheet = Application.Sheets.Add(undefined, undefined, undefined, xlWorksheet)
// let newSheet = Application.Worksheets.Add()
newSheet.Name = sheetname
}
}
}
// airscript检测版本
function checkVesion(){
try{
let temp = Application.Range("A1").Text;
Application.Range("A1").Value = temp
console.log("😶‍🌫️ 检测到当前airscript版本为1.0进行1.0适配")
}catch{
console.log("😶‍🌫️ 检测到当前airscript版本为2.0进行2.0适配")
version = 2
}
}
// 主函数执行流程
function main(){
checkVesion() // 版本检测,以进行不同版本的适配
// 动态写入CONFIG表数组数据操作
// 加入标题
configContent[0] = configTitle
// 写入标题下内容
for (let i = 0; i < configBody.length; i++) {
let row = [];
for (let j = 0; j < configContent[0].length; j++) {
let fieldName = configContent[0][j];
let fieldValue = configBody[i][configTitleMapping[fieldName]];
if (fieldValue === undefined) {
fieldValue = configBodyDefault[j]; // 如果字段不存在,使用默认值
}
row.push(fieldValue);
}
configContent.push(row);
}
storeWorkbook()
// console.log("🪄 创建主分配表")
// const sheet = Application.ActiveSheet // 激活当前表
// sheet.Name = confiWorkbook // 将当前工作表的名称改为 CONFIG
createSheet(confiWorkbook)
ActivateSheet(confiWorkbook)
editConfigSheet(configContent) // editConfig()
// 加入跳转超链接
hypeLink()
// console.log("🪄 创建推送表")
createSheet(pushWorkbook)
ActivateSheet(pushWorkbook)
editConfigSheet(pushContent) // editPush()
// console.log("🪄 创建邮箱表")
createSheet(emailWorkbook)
ActivateSheet(emailWorkbook)
editConfigSheet(emailContent)
let length = configContent.length - 1
// console.log(length)
console.log("🍳 正在检索分配置表进行创建")
for (let i = 0; i < length; i++) {
let workbook = ""
let subworkbook = ""
// console.log(configContent[i+1][4])
if(configContent[i+1][4] == "是"){ // 存活的才生成表
// 部分表合并如ddmc_ddgy则以_为分割生成ddmc表
workbook = configContent[i+1][0].split("_")[0] // 使用下划线作为分隔符,取第一个部分)
ActivateSheet(workbook) // 根据CONFIG表来生成
editConfigSheet(subConfigContent)
// 检查是否有定制化内容,有则生成
try{
subworkbook = subConfig[workbook]
// console.log(subworkbook)
if(subworkbook != undefined){
ActivateSheet(workbook) // 激活分配置表
editConfigSheet(subworkbook)
// console.log("存在定制化内容")
}
}catch{
// 无定制化内容
// console.log("无定制化内容")
}
}
}
console.log("🎉 更新完成")
}

View File

@@ -0,0 +1,136 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/Babycare.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/Babycare.py
# Repo: jdqlscript/toulu
# Path: Babycare.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 4a2e1c449fcddaa87cd53358847de65c3839d1ffb325484844f5db88e04e1971
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
#by:哆啦A梦
#TL库
#入口:小程序-Babycare官方旗舰店
#抓包api.bckid.com.cn域名下的authorization多账号换行分割
import os
import requests
import json
# 从环境变量中获取 token支持多账号换行分割
tokens = os.environ.get('Babycare', '').split('\n')
# 定义 URL
url = "https://api.bckid.com.cn/operation/front/bonus/userSign/v3/sign"
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
backup_url = "https://tfapi.cn/TL/tl.json"
# 定义请求头
headers = {
"Host": "api.bckid.com.cn",
"content-length": "2",
"content-type": "application/json",
"charset": "utf-8",
"referer": "https://servicewechat.com/wxab5642d7bced2dcc/447/page-frame.html",
"accept-encoding": "gzip, deflate, br"
}
def print_divider():
print("\n" + "=" * 35)
def print_account_info(account_num, token):
print_divider()
print(f"🤖 正在为账号 {account_num} 签到...")
print_divider()
def print_sign_success(account_num, result):
print_divider()
print(f"🎉 账号 {account_num} 签到成功!")
print(f"💪 最大连续签到天数: {result.get('maxSignDay', '信息获取失败')}")
print(f"📅 当前连续签到天数: {result.get('signDaysCount', '信息获取失败')}")
print(f"🎁 抽奖机会: {result.get('lotteryCount', '信息获取失败')}")
print_divider()
def print_already_signed(account_num):
print(f"👻 账号 {account_num} 今天已经签到过了,请明天再来!")
print_divider()
def print_sign_failed(account_num, message):
print(f"❌ 账号 {account_num} 签到失败!错误信息: {message}")
print_divider()
def print_empty_token(account_num):
print(f"⚠️ 账号 {account_num} 的 token 为空,跳过")
print_divider()
def print_request_error(account_num, error):
print(f"⚠️ 账号 {account_num} 请求异常: {error}")
print_divider()
def get_proclamation():
try:
print("\n" + "=" * 35)
print("📢 公告信息")
response = requests.get(primary_url, timeout=10)
if response.status_code == 200:
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
return
else:
print(f"尝试获取公告,状态码: {response.status_code}, 尝试备用链接...")
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}, 尝试备用链接...")
try:
response = requests.get(backup_url, timeout=10)
if response.status_code == 200:
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
else:
print(f"⚠️ 获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")
print_divider()
print("🚀 开始执行签到任务")
get_proclamation()
# 添加账号编号提示
for idx, token in enumerate(tokens, start=1):
if not token.strip():
print_empty_token(idx)
continue
print_account_info(idx, token)
headers["authorization"] = token.strip()
try:
response = requests.post(url, headers=headers, data=json.dumps({}))
if response.status_code == 200:
json_response = response.json()
if json_response.get("code") == "200":
print_sign_success(idx, json_response.get('body', {}))
elif json_response.get("code") == "400":
print_already_signed(idx)
else:
print_sign_failed(idx, json_response.get("message", "未知错误"))
else:
print_sign_failed(idx, f"HTTP状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print_request_error(idx, e)
except json.JSONDecodeError:
print_sign_failed(idx, "响应内容不是有效的 JSON 格式")
print("🏆 所有账号签到任务完成!")
print_divider()

View File

@@ -0,0 +1,536 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/CHERWIN_TOOLS.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/CHERWIN_TOOLS.py
# Repo: jdqlscript/toulu
# Path: CHERWIN_TOOLS.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 9a1e14399666b2b55948eb1b7bcdd1a38f233c87b61f7e7d0c592bb67b0d42e3
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
import hashlib
import json
import os
import importlib.util
import random
import string
import subprocess
import sys
import time
import requests
from http import HTTPStatus
from datetime import datetime
NOW_TOOLS_VERSION = '2024.05.27'
if os.path.isfile('DEV_ENV.py'):
import DEV_ENV
IS_DEV = True
else:
IS_DEV = False
# 尝试导入包
def import_or_install(package_name, import_name=None):
# 如果传入了 import_name则使用它来检查模块否则默认与包名相同
import_name = import_name or package_name
try:
# 检查模块是否已安装
package_spec = importlib.util.find_spec(import_name)
if package_spec is None:
print(f"{package_name} 模块未安装. 开始安装...")
subprocess.check_call([sys.executable, '-m', 'pip', 'install', package_name])
print(f"{package_name} 模块安装完成。")
else:
print(f"{package_name} 模块已安装。")
# 尝试导入模块检查是否安装成功
__import__(import_name)
module = importlib.import_module(import_name)
print(f"{import_name} 模块导入成功.")
return module
except ImportError as e:
print(f"无法导入 {import_name} 模块. 错误信息: {e}")
except subprocess.CalledProcessError as e:
print(f"安装 {package_name} 模块时出错. 错误信息: {e}")
except Exception as e:
print(f"处理 {package_name} 模块时发生错误. 错误信息: {e}")
def SAVE_INVITE_CODE(file_name, new_data):
# 读取现有JSON文件如果存在
try:
with open(file_name, 'r', encoding='utf-8') as file:
data = json.load(file)
except FileNotFoundError:
# 如果文件不存在创建所需目录并一个新的空JSON文件
directory = os.path.dirname(file_name)
if not os.path.exists(directory):
os.makedirs(directory)
data = {}
# 检查是否已存在相同的键,如果存在,合并数据
for key, value in new_data.items():
if key in data:
# 如果键已存在,将新数据合并到现有数据中
data[key].update(value)
else:
# 如果键不存在,直接插入新数据
data[key] = value
# 将更新后的数据写入JSON文件
with open(file_name, 'w', encoding='utf-8') as file:
json.dump(data, file, indent=4)
# 将参数转换为字典
def create_dict_from_string(self, data_string):
params = {}
key_value_pairs = data_string.split(',')
for pair in key_value_pairs:
key, value = pair.split('=')
params[key] = value
return params
def compare_versions(local_version, server_version):
local_parts = local_version.split('.') # 将本地版本号拆分成数字部分
server_parts = server_version.split('.') # 将服务器版本号拆分成数字部分
for l, s in zip(local_parts, server_parts):
if int(l) < int(s):
return True
# 当前版本低于服务器版本
elif int(l) > int(s):
return False
# 当前版本高于服务器版本
# 如果上述循环没有返回结果,则表示当前版本与服务器版本的数字部分完全相同
if len(local_parts) < len(server_parts):
return True # 当前版本位数较短,即版本号形如 x.y 比 x.y.z 低
else:
return False # 当前版本与服务器版本相同或更高
def CHECK_UPDATE_NEW(local_version, server_version, server_script_url, script_filename, server_version_url=None,
APP_NAME=None):
"""
检查版本并更新
Args:
local_version (str): 本地版本号
server_version_url (str): 服务器版本文件地址
server_script_url (str): 服务器脚本地址
script_filename (str): 要保存的脚本文件名
Returns:
bool: 是否进行了更新操作
"""
print(f'当前检测:【{script_filename}')
try:
if server_version_url:
# 获取服务器版本号
response = requests.get(server_version_url, verify=False)
response.raise_for_status() # Raises an HTTPError for bad responses
# print(response.text)
server_version = response.text.strip() # 去除首尾空格
if "code" in server_version:
print('【获取远程版本号失败,设为本地同版本】')
server_version = local_version
if not server_version: server_version = NOW_TOOLS_VERSION
print(f'本地版本:【{local_version}')
print(f'服务器版本:【{server_version}')
if compare_versions(local_version, server_version):
# 需要更新,下载服务器脚本
AUTO_UPDATE = os.getenv("SCRIPT_UPDATE", "True").lower() != "false"
# print(AUTO_UPDATE)
if AUTO_UPDATE:
print(">>>>>>>发现新版本的脚本,默认自动更新,准备更新...")
print(">>>>>>>禁用更新请定义变量export SCRIPT_UPDATE = 'False'")
if down_file(script_filename, server_script_url):
print(f'请重新运行新脚本\n')
return True
else:
print(">>>>>>>发现新版本的脚本您禁用了自动更新如需启用请删除变量SCRIPT_UPDATE\n")
else:
print(f'无需更新\n')
return False
except requests.exceptions.RequestException as e:
print(f'发生网络错误:{e}')
server_base_url = f"https://py.cherwin.cn/{APP_NAME}/"
server_script_url = f"{server_base_url}{script_filename}"
CHECK_UPDATE_NEW(local_version, server_version, server_script_url, script_filename, APP_NAME=APP_NAME)
except Exception as e:
print(f'发生未知错误:{e}')
return False # 返回 False 表示没有进行更新操作
def down_file(filename, file_url):
print(f'开始下载:{filename},下载地址:{file_url}')
try:
response = requests.get(file_url, verify=False, timeout=10)
response.raise_for_status()
with open(filename + '.tmp', 'wb') as f:
f.write(response.content)
print(f'{filename}】下载完成!')
# 检查临时文件是否存在
temp_filename = filename + '.tmp'
if os.path.exists(temp_filename):
# 删除原有文件
if os.path.exists(filename):
os.remove(filename)
# 重命名临时文件
os.rename(temp_filename, filename)
print(f'{filename}】重命名成功!')
return True
else:
print(f'{filename}】临时文件不存在!')
return False
except Exception as e:
print(f'{filename}】下载失败:{str(e)}')
return False
def get_AuthorInviteCode(url):
global AuthorCode
try:
response = requests.get(url, verify=False, timeout=10)
if response.status_code == 200:
content = json.loads(response.text)
AuthorCode = list(content.values())
# print(f'获取到作者邀请码:{AuthorCode}')
return AuthorCode
else:
# print("无法获取文件。状态代码:", response.status_code)
return {}
except Exception as e:
print(f"An error occurred: {e}")
return {}
def CHECK_PARAMENTERS(index, input_string, required_parameters):
# required_parameters = ['deviceid', 'jysessionid', 'shopid', 'memberid', 'access_token', 'sign']
# 记录缺少的参数
missing_parameters = []
# 将输入字符串和参数列表中的所有字符都转换为小写
input_string_lower = input_string.lower()
required_parameters_lower = [param.lower() for param in required_parameters]
# 判断字符串中是否包含所有必需的参数
for param in required_parameters_lower:
if param not in input_string_lower:
missing_parameters.append(param)
if missing_parameters:
print(f"\n第【{index + 1}】个账号,缺少以下参数:【{missing_parameters}")
return False
else:
print(f"\n第【{index + 1}】个账号URL包含所有必需的参数开始执行脚本")
return True
def QIANWEN(tongyiSysPromt, content, api_key):
print('开始调用通义千问')
# 检查dashscope库是否已安装
dashscope = import_or_install('dashscope')
if dashscope:
dashscope.api_key = api_key
response = dashscope.Generation.call(
model='qwen-max',
messages=[
{"role": "system",
"content": tongyiSysPromt},
{"role": "user", "content": content}],
seed=1234,
top_p=0.8,
result_format='message',
enable_search=False,
max_tokens=1500,
temperature=1.0,
repetition_penalty=1.0,
)
if response.status_code == HTTPStatus.OK:
# print(response)
video_info = response.output['choices'][0]['message']['content']
print('通义生成【成功】!')
return video_info
else:
print(f"无法解析通义返回的信息:{response}")
return None
else:
print('dashscope 模块无法导入,函数无法执行。')
# 取环境变量,并分割
def ENV_SPLIT(input_str):
parts = []
if '&' in input_str:
amp_parts = input_str.split('&')
for part in amp_parts:
if '#' in part:
hash_parts = part.split('#')
for hash_part in hash_parts:
parts.append(hash_part)
else:
parts.append(part)
# print(parts)
return (parts)
elif '#' in input_str:
hash_parts = input_str.split('#')
# print(hash_parts)
return (hash_parts)
else:
out_str = str(input_str)
# print([out_str])
return ([out_str])
# 使用导入的模块进行验证码识别
def CAPCODE(captcha_slider, captcha_bg):
ddddocr = import_or_install('ddddocr')
if ddddocr:
slide = ddddocr.DdddOcr(det=False, ocr=False)
with open(captcha_slider, 'rb') as f:
target_bytes = f.read()
with open(captcha_bg, 'rb') as f:
background_bytes = f.read()
res = slide.slide_match(target_bytes, background_bytes, simple_target=True)
# print(res['target'][0])
# print(type(res['target'][0]))
return res['target'][0]
else:
print('ddddocr 模块无法导入,函数无法执行。')
return False
def send_wxpusher(UID, one_msg, APP_NAME, help=False):
WXPUSHER = os.environ.get('WXPUSHER', False)
if WXPUSHER:
if help:
push_res = wxpusher(WXPUSHER, APP_NAME + '互助', one_msg, UID, TIPS_HTML)
else:
push_res = wxpusher(WXPUSHER, APP_NAME, one_msg, UID, TIPS_HTML)
print(push_res)
def wxpusher(UID, msg, title, help=False):
"""利用 wxpusher 的 web api 发送 json 数据包,实现微信信息的发送"""
WXPUSHER = os.environ.get('WXPUSHER', False)
if WXPUSHER:
if help: title = title + '互助'
print('\n------开始wxpusher推送------')
print(f'标题:【{title}\n内容:{msg}')
webapi = 'http://wxpusher.zjiecode.com/api/send/message'
msg = msg.replace("\n", "<br>")
# tips = TIPS_HTML.replace("\n", "<br>")
data = {
"appToken": WXPUSHER,
"content": f'{title}<br>{msg}<br>{TIPS_HTML}',
# "summary": msg[:99], # 该参数可选,默认为 msg 的前10个字符
"summary": title,
"contentType": 2,
"uids": [UID],
"url": "https://gj.cherwin.cn"
}
try:
result = requests.post(url=webapi, json=data)
result.raise_for_status() # 对于非2xx状态码抛出异常
response_json = result.json()
if response_json["success"]:
return "------消息发送成功------\n"
else:
return f"消息发送失败。错误信息:{response_json['msg']}"
except requests.exceptions.RequestException as e:
return f"发送消息时发生错误:{str(e)}"
except Exception as e:
return f"发生意外错误:{str(e)}"
def RESTART_SCRIPT(RESTART_SCRIPT_NAME):
python = sys.executable
os.execl(python, RESTART_SCRIPT_NAME, *sys.argv[1:])
def CHECK():
global CHERWIN_SCRIPT_CONFIG
print('>>>>>>>开始获取版本信息...')
baseurl = 'https://py.cherwin.cn/'
TOOLS_NAME = 'CHERWIN_TOOLS.py'
server_script_url = f'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/{TOOLS_NAME}'
try:
response = requests.get(f'{baseurl}CHERWIN_SCRIPT_CONFIG.json', verify=False)
response.encoding = 'utf-8'
# 读取内容
CHERWIN_SCRIPT_CONFIG = response.json()
if 'code' in CHERWIN_SCRIPT_CONFIG:
CHERWIN_SCRIPT_CONFIG = None
TOOLS_VERSION = CHERWIN_SCRIPT_CONFIG.get('TOOLS_VERSION', NOW_TOOLS_VERSION)
if CHECK_UPDATE_NEW(NOW_TOOLS_VERSION, TOOLS_VERSION, server_script_url, TOOLS_NAME):
print('更新脚本完成')
# print(f'重新检测[{TOOLS_NAME}]版本')
return False
else:
return True
except:
print('获取CHERWIN_SCRIPT_CONFIG.json失败')
return False
def GJJJ_SIGN():
app_id = "667516"
app_crypto = "FH3yRrHG2RfexND8"
timestamp = int(time.time() * 1000)
# timestamp = 1715180892075
text = f"{app_id}{app_crypto}{timestamp}"
sign = hashlib.md5(text.encode()).hexdigest()
new_data = {
'timestamp': str(timestamp),
"sign": sign
}
return new_data
def KWW_SIGN(memberId):
timestamp = int(time.time() * 1000)
random_num = random.randint(0, 31)
u = [
"A", "Z", "B", "Y", "C", "X", "D", "T", "E", "S", "F", "R", "G", "Q", "H", "P", "I", "O", "J", "N", "k",
"M", "L", "a", "c", "d", "f", "h", "k", "p", "y", "n"]
r = f"{timestamp}{memberId}{u[random_num]}"
sign = hashlib.md5(r.encode()).hexdigest()
update_headers = {
"user-sign": sign,
"user-paramname": "memberId",
"user-timestamp": str(timestamp),
"user-random": str(random_num)
}
return update_headers
def TYQH_SIGN(parameters={}, body=None):
sorted_keys = sorted(parameters.keys())
parameter_strings = []
for key in sorted_keys:
if isinstance(parameters[key], dict):
parameter_strings.append(f"{key}={json.dumps(parameters[key])}")
else:
parameter_strings.append(f"{key}={parameters[key]}")
current_time = int(datetime.now().timestamp() * 1000)
secret_chars = list('BxzTx45uIGT25TTHIIBU2')
last_three_digits = str(current_time)[-3:]
for digit in last_three_digits:
secret_chars.insert(int(digit), digit)
secret = hashlib.md5(''.join(secret_chars).encode()).hexdigest()
nonce_str = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
sign_data = {
'client_id': 'game',
'nonstr': nonce_str,
'timestamp': current_time,
'body': json.dumps(body) if body else '',
'query': '&'.join(parameter_strings) if parameter_strings else '',
'secret': secret
}
sign_string = '|'.join([str(v) for v in sign_data.values()])
sign = hashlib.md5(sign_string.encode()).hexdigest().upper()
sign_header = {
'client_id': 'game',
'timestamp': str(current_time),
'nonstr': sign_data['nonstr'],
'sign': sign
}
return sign_header
def YDXQ_SIGN():
sign_nonce = "tnFWIEFpVPJkOuNX4zdsKeBEMIakLS1RsnS7cH0Id6MjEEBGO"
n = str(int(time.time()))
# 拼接字符串并使用md5哈希。注意在Python中需要对字符串编码才能生成哈希。
sign_string = f"sign_{n}_sign{sign_nonce}"
sign_hash = hashlib.md5(sign_string.encode()).hexdigest()
return sign_hash, n
def HXEK_SIGN(memberId, appid):
# appid = "wxa1f1fa3785a47c7d"
secret = 'damogic8888'
# 获取GMT+8的当前时间戳
timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# timestamp = '2024-05-22 16:07:54'
# 生成随机数
random_int = random.randint(1000000, 9999999)
# random_int = 4270745
# 构建待加密字符串
raw_string = f"timestamp={timestamp}transId={appid}{timestamp}secret={secret}random={random_int}memberId={memberId}"
# 使用MD5进行加密
md5_hash = hashlib.md5(raw_string.encode())
sign = md5_hash.hexdigest()
return sign, random_int, timestamp
def KPL_SIGN(url, params):
secret_key = "d19b9f22f5aac41ac0b56a1947f82bce"
# 提取URL路径去掉域名部分
url_path = url.replace("https://app.tv.kohesport.qq.com", "")
# 如果params是对象转换为JSON字符串
if isinstance(params, dict):
params_str = json.dumps(params, separators=(',', ':'))
else:
params_str = params
# 拼接路径、参数和密钥
string_to_hash = f"{url_path}{params_str}{secret_key}"
# 计算SHA256哈希值
signature = hashlib.sha256(string_to_hash.encode('utf-8')).hexdigest()
sign_header = {
"X-TGATV-SignatureMethod": "sha256",
"X-TGATV-SignatureVersion": "3",
"X-TGATV-Signature": signature
}
return sign_header
def get_ip():
response = requests.get('https://cdn.jsdelivr.net/gh/parserpp/ip_ports/proxyinfo.json',verify=False)
# 使用正则表达式提取 IP 地址和端口号
data = response.text
lines = data.strip().split('\n')
# json_objects = [json.loads(line) for line in lines]
json_objects = [json.loads(line) for line in lines if json.loads(line)["country"] == "CN"]
# json_array = json.dumps(json_objects, indent=4)
if json_objects:
selected = random.choice(json_objects)
result = f"{selected['type']}://{selected['host']}:{selected['port']}"
proxies = {
selected['type']: result,
}
print(f"当前代理:{result}")
return proxies
else:
print("没匹配到CN的ip")
return None
def main(APP_NAME, local_script_name, ENV_NAME, local_version, need_invite=False):
global APP_INFO, TIPS, TIPS_HTML
git_url = f'https://github.com/CHERWING/CHERWIN_SCRIPTS/raw/main/{local_script_name}'
if CHECK():
APP_INFO = CHERWIN_SCRIPT_CONFIG.get("APP_CONFIG", {}).get(ENV_NAME, {})
# print(APP_INFO)
server_version = APP_INFO.get('NEW_VERSION', '')
if CHECK_UPDATE_NEW(local_version, server_version, git_url, local_script_name, APP_NAME=APP_NAME):
print('更新成功,请重新运行脚本!')
if not APP_INFO.get('ENABLE', False) and not IS_DEV:
print('当前脚本未开放')
exit()
TIPS = APP_INFO.get('NTC', '') if APP_INFO.get('NTC', '') else CHERWIN_SCRIPT_CONFIG.get('GLOBAL_NTC', '')
TIPS_HTML = APP_INFO.get('NTC', '') if APP_INFO.get('NTC', '') else CHERWIN_SCRIPT_CONFIG.get('GLOBAL_NTC_HTML','')
ENV = os.environ.get(ENV_NAME)
if need_invite:
AuthorCode = get_AuthorInviteCode(f'https://yhsh.ziyuand.cn/{ENV_NAME}_INVITE_CODE.json')
else:
AuthorCode = ''
return ENV, APP_INFO, TIPS, TIPS_HTML, AuthorCode
else:
exit()
if __name__ == '__main__':
print(NOW_TOOLS_VERSION)

View File

@@ -0,0 +1,63 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/DQ%E7%82%B9%E5%8D%95.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/DQ%E7%82%B9%E5%8D%95.js
// # Repo: jdqlscript/toulu
// # Path: DQ点单.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 5316110176df2c840df02f273bac74a7a52b8016fad19a4ec41d6a654fe2ec99
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
微信小程序DQ点单安卓版
抓包wechat.dairyqueen.com.cn域名下的cookie
变量名=dqdd
多账号用&分开或者添加多个变量名
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
长期套餐大额流量电话卡办理地址https://hk.yunhaoka.cn/#/pages/micro_store/index?agent_id=669709
*/
const axios = require('axios');
const dqdd = process.env.dqdd.split('&');
const url = 'https://wechat.dairyqueen.com.cn/memSignIn/signIn';
async function fetchSignInfo(cookie, accountIndex) {
const headers = {
'Host': 'wechat.dairyqueen.com.cn',
'Connection': 'keep-alive',
'Content-Length': '0',
'charset': 'utf-8',
'cookie': dqdd,
'channel': '202',
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.122 Mobile Safari/537.36 XWEB/1260059 MMWEBSDK/20240501 MMWEBID/3628 MicroMessenger/8.0.50.2701(0x28003252) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'content-type': 'application/json',
'Accept-Encoding': 'gzip,compress,br,deflate',
'tenant': '1',
'Referer': 'https://servicewechat.com/wx22e5ce7c766b4b78/149/page-frame.html'
};
try {
const response = await axios.post(url, {}, { headers: headers });
if (response.data.code === 200 && response.data.message === 'success') {
console.log(`账号${accountIndex}签到成功`);
return { success: true, message: `账号${accountIndex}签到成功` };
} else {
console.log(`账号${accountIndex}签到失败`);
return { success: false, message: `账号${accountIndex}签到失败` };
}
} catch (error) {
console.error(error);
return { success: false, message: error.message };
}
}
dqdd.forEach((dqdd, index) => {
fetchSignInfo(dqdd, index + 1).then(result => {
console.log(result);
});
});

View File

@@ -0,0 +1,190 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/KSOEUR.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/KSOEUR.py
# Repo: jdqlscript/toulu
# Path: KSOEUR.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: dff489d354c1462787fdedee1bd44f007984f36251621852b94afdd500410ad0
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
#入口:小程序KSOEUR女装
#抓包域名smp-api.iyouke.com下Authorization值多账号换行分割
#by:哆啦A梦
import os
import requests
from datetime import datetime
# 获取公告信息
def get_proclamation():
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
backup_url = "https://tfapi.cn/TL/tl.json"
try:
response = requests.get(primary_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 45)
print("📢 公告信息")
print("=" * 45)
print(response.text)
print("=" * 45 + "\n")
print("公告获取成功,开始执行任务...\n")
return
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}, 尝试备用链接...")
try:
response = requests.get(backup_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 45)
print("📢 公告信息")
print("=" * 45)
print(response.text)
print("=" * 45 + "\n")
print("公告获取成功,开始执行任务...\n")
else:
print(f"⚠️ 获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")
# 查询账号信息和积分,并处理返回值
def get_account_info_and_points(authorization):
# 查询账号信息
user_info_url = "https://smp-api.iyouke.com/dtapi/p/user/userInfo"
user_info_headers = {
"Host": "smp-api.iyouke.com",
"Authorization": authorization,
"Appid": "wx00796053aa93af0c",
"Version": "2.9.40",
"EnvVersion": "release",
"Xy-Extra-Data": "appid=wx00796053aa93af0c;version=2.9.40;envVersion=release;senceId=1007",
"Content-Type": "application/json; charset=utf-8",
"Accept-Encoding": "gzip, deflate, br"
}
try:
user_info_response = requests.get(user_info_url, headers=user_info_headers)
if user_info_response.status_code == 200:
user_info = user_info_response.json()
else:
print(f"查询账号信息失败,状态码:{user_info_response.status_code}")
print(f"返回内容:{user_info_response.text}")
return None
except Exception as e:
print(f"查询账号信息时发生错误:{e}")
print(f"返回内容:{user_info_response.text}") if 'user_info_response' in locals() else print("无法获取返回内容")
return None
# 查询积分
points_url = "https://smp-api.iyouke.com/dtapi/points/user/centerInfo"
points_headers = {
"Host": "smp-api.iyouke.com",
"Authorization": authorization,
"Appid": "wx00796053aa93af0c",
"Version": "2.9.40",
"EnvVersion": "release",
"Xy-Extra-Data": "appid=wx00796053aa93af0c;version=2.9.40;envVersion=release;senceId=1007",
"Content-Type": "application/json; charset=utf-8",
"Accept-Encoding": "gzip, deflate, br"
}
try:
points_response = requests.get(points_url, headers=points_headers)
if points_response.status_code == 200:
points_info = points_response.json()
else:
print(f"查询积分失败,状态码:{points_response.status_code}")
print(f"返回内容:{points_response.text}")
points_info = None
except Exception as e:
print(f"查询积分时发生错误:{e}")
print(f"返回内容:{points_response.text}") if 'points_response' in locals() else print("无法获取返回内容")
points_info = None
# 处理并打印账号和积分信息
mobile = user_info.get("userMobile", "")
nick_name = user_info.get("nickName", "")
print(f"账号:{mobile}(昵称:{nick_name}")
if points_info and points_info.get("success"):
points_balance = points_info.get("data", {}).get("pointsBalance", 0)
print(f"当前积分:{points_balance}")
else:
print("无法获取积分信息")
return {
"mobile": mobile,
"nick_name": nick_name,
"points_balance": points_info.get("data", {}).get("pointsBalance", "查询失败") if points_info else "查询失败"
}
# 签到功能
def check_in(authorization):
current_date = datetime.now().strftime("%Y-%m-%d")
formatted_date = current_date.replace('-', '%2F')
url = f"https://smp-api.iyouke.com/dtapi/pointsSign/user/sign?date={formatted_date}"
headers = {
"Host": "smp-api.iyouke.com",
"Authorization": authorization,
"Appid": "wx00796053aa93af0c",
"Version": "2.9.40",
"EnvVersion": "release",
"Xy-Extra-Data": "appid=wx00796053aa93af0c;version=2.9.40;envVersion=release;senceId=1007",
"Content-Type": "application/json; charset=utf-8",
"Referer": "https://servicewechat.com/wx00796053aa93af0c/52/page-frame.html",
"Accept-Encoding": "gzip, deflate, br"
}
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
else:
print(f"签到失败,状态码:{response.status_code}")
print(f"返回内容:{response.text}")
return None
except Exception as e:
print(f"签到时发生错误:{e}")
print(f"返回内容:{response.text}") if 'response' in locals() else print("无法获取返回内容")
return None
# 主程序
if __name__ == "__main__":
# 获取公告
get_proclamation()
# 从环境变量获取 authorization 值,支持多账号(换行分割)
tokens = os.getenv("KSOEUR", "").split("\n")
if not tokens or all(not token.strip() for token in tokens):
print("❌ 未找到环境变量 KSOEUR 或其值为空,任务终止。")
exit(1)
# 遍历每个账号执行任务
for token in tokens:
token = token.strip()
if not token:
continue
print(f"\n{'=' * 45}")
print(f"正在执行任务中")
print(f"{'=' * 45}\n")
account_data = get_account_info_and_points(token)
if account_data:
# 签到
check_in_result = check_in(token)
if check_in_result and check_in_result.get("success"):
print(f"签到成功,获得奖励:{check_in_result.get('data', {}).get('signReward', 0)}")
else:
if check_in_result and check_in_result.get("errorMsg"):
print(f"签到失败,原因:{check_in_result.get('errorMsg')}")
else:
print("签到失败")
else:
print("跳过该账号。")
print(f"\n{'-' * 45}\n")
print("所有任务执行完成!")

View File

@@ -0,0 +1,134 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/babycare.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/babycare.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/babycare.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 46258113afa13a0aa29d97ac2d6ba2b28ef58e8ff67ab1d7580a670ef603d5ba
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: babycare
cron: 30 8 * * *
------------------------------------------
#Notice:
微信小程序抓包的https://api.bckid.com.cn请求头authorization
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("babycare");
let ckName = `babycare`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
}
async run() {
await this.info()
await this.signIn()
}
async signIn() {
let options = {
method: 'POST',
url: `https://api.bckid.com.cn/operation/front/bonus/userSign/v3/sign`,
headers: {
'Host': 'api.bckid.com.cn',
'authorization': this.token,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b11) XWEB/9129',
},
data: {
}
};
let { data: result } = await axios.request(options);
if (result?.code == '200') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `🕊当前已签到${result.body.signDaysCountMod}天🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.message}`)
}
}
async info() {
let options = {
url: 'https://api.bckid.com.cn/operation/front/bonus/userBonus/getUserBonus',
headers: {
'Host': 'api.bckid.com.cn',
'authorization': this.token,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b11) XWEB/9129',
},
method: 'POST',
data: {}
}
let { data: result } = await axios.request(options);
if (result?.code == '200') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `🕊账户当前积分[${result.body.userBonus}],历史积分[${result.body.sumBonus}]💰`);
} else {
$.log(`🌸账号[${this.index}]积分查询失败:${result.message}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,231 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/colorful.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/colorful.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/colorful.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: cf4ee821d1cebbbb8468b4a7c252b98a5e1b39d9a10f6089bdd659994878055c
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 七彩虹微信小程序 签到&点赞
cron: 30 10 * * *
------------------------------------------
#Notice:
变量名colorful
抓取
https://interface.skycolorful.com/api 请求头的authorization去掉Bearer # x-authorization去掉Bearer
多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("colorful七彩虹");
let ckName = `colorful`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
this.token2 = this.user[1];
this.signStatus = false;
this.expireFlag = false;
}
async run() {
await this.getTokenExpireTime()
await this.getUserInfo()
await this.getSignInfo()
if (this.signStatus) {
$.log(`账号[${this.index}]已签到`)
return
}
await this.signInV2()
}
async getTokenExpireTime() {
let options = {
method: 'POST',
url: `https://interface.skycolorful.com/api/User/RefreshLoginTime`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"sec-fetch-dest": "empty",
},
data: { "phone": "" }
}
let { data: result } = await this.request(options);
if (result.Code != 0) {
this.expireFlag = true
}
}
async refreshToken(DATA) {
let options = {
method: 'POST',
url: `https://interface.skycolorful.com/api/User/DecryptPhoneNumber`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"sec-fetch-dest": "empty",
},
data: DATA
}
let { data: result } = await this.request(options);
if (result.Code != 0) {
this.expireFlag = true
} else {
this.token = result.Data.Token
}
}
MD5(str) {
const crypto = require('crypto');
return crypto.createHash('md5').update(str).digest('hex');
}
request(options) {
let appid = "815d8026-9a52-4445-a42c-a5443134232e"
let uuid = $.uuid()
let timestamp = Date.now()
let sign = this.MD5(appid + timestamp + uuid + '2b5c01fb-7640-401a-8188-43a13190a626')
let baseHeaders = {
"User-Agent": defaultUserAgent,
"requestid": uuid,
"appid": appid,
"ticks": "" + timestamp,
"sign": sign,
"authorization": "Bearer " + this.token,
"x-authorization": "Bearer " + this.token2,
"source": "Wx",
"ucsource": "30",
"user-from": "xcx",
}
options.headers = Object.assign(baseHeaders, options.headers)
return axios.request(options)
}
async signInV2() {
let options = {
method: 'POST',
url: `https://interface.skycolorful.com/api/User/SignV2`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"xweb_xhr": "1"
},
data: {
}
};
let { data: result } = await this.request(options);
if (result?.Code == '0') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `🕊签到${result.Message}🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.Message}`)
}
}
async getSignInfo() {
let options = {
method: 'GET',
url: `https://interface.skycolorful.com/api/User/IsSignV2`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
}
}
let { data: result } = await this.request(options);
if (result?.Code == '0') {
//打印签到结果
this.signStatus = result.Data.IsSign
} else {
}
}
async getUserInfo() {
let options = {
method: 'GET',
url: `https://interface.skycolorful.com/api/User/GetUserInfo`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"sec-fetch-dest": "empty",
}
}
let { data: result } = await this.request(options);
if (result?.Code == '0') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `昵称:${result.Data.NickName}` + `积分:${result.Data.Point}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,708 @@
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/golo.js
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/golo.js
// # Repo: imoki/sign_script
// # Path: polymerization/golo.js
// # UploadedAt: 2025-08-25T21:29:14+08:00
// # SHA256: 6d8c719f794ba28ac9f4e910cbcb6a4ad51d2898b88417781747992f35518128
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
name: "golo汽修大师"
cron: 45 0 9 * * *
脚本兼容: 金山文档1.0金山文档2.0
更新时间20241226
环境变量名:无
环境变量值:无
备注:需要用户名和密码。
golo汽修大师app或网页的密码。
使用此脚本时app会自动退出登录网站和app的积分是互通的。
golo汽修大师网址:https://cicp.cnlaunch.com
*/
var sheetNameSubConfig = "golo"; // 分配置表名称
var pushHeader = "【golo汽修大师】";
var sheetNameConfig = "CONFIG"; // 总配置表
var sheetNamePush = "PUSH"; // 推送表名称
var sheetNameEmail = "EMAIL"; // 邮箱表
var flagSubConfig = 0; // 激活分配置工作表标志
var flagConfig = 0; // 激活主配置工作表标志
var flagPush = 0; // 激活推送工作表标志
var line = 21; // 指定读取从第2行到第line行的内容
var message = ""; // 待发送的消息
var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置
var messageOnlyError = 0; // 0为只推送失败消息1则为推送成功消息。
var messageNickname = 0; // 1为推送位置标识昵称/单元格Ax昵称为空时0为不推送位置标识
var messageHeader = []; // 存放每个消息的头部单元格A3。目的是分离附加消息和执行结果消息
var messagePushHeader = pushHeader; // 存放在总消息的头部默认是pushHeader,如【xxxx】
var version = 1 // 版本类型自动识别并适配。默认为airscript 1.0否则为2.0Beta
var separator = "##########MOKU##########" // 分割符分割消息。可用于PUSH.js灵活推送
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
var messageDistance = 100; // 消息距离用于匹配100字符内最近的行
var jsonPush = [
{ name: "bark", key: "xxxxxx", flag: "0" },
{ name: "pushplus", key: "xxxxxx", flag: "0" },
{ name: "ServerChan", key: "xxxxxx", flag: "0" },
{ name: "email", key: "xxxxxx", flag: "0" },
{ name: "dingtalk", key: "xxxxxx", flag: "0" },
{ name: "discord", key: "xxxxxx", flag: "0" },
]; // 推送数据flag=1则推送
var jsonEmail = {
server: "",
port: "",
sender: "",
authorizationCode: "",
}; // 有效邮箱配置
// =================青龙适配开始===================
qlSwitch = 0
// =================青龙适配结束===================
// =================金山适配开始===================
// airscript检测版本
function checkVesion(){
try{
let temp = Application.Range("A1").Text;
Application.Range("A1").Value = temp
console.log("😶‍🌫️ 检测到当前airscript版本为1.0进行1.0适配")
}catch{
console.log("😶‍🌫️ 检测到当前airscript版本为2.0进行2.0适配")
version = 2
}
}
// 推送相关
// 获取时间
function getDate(){
let currentDate = new Date();
currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString();
return currentDate
}
// 将消息写入CONFIG表中作为消息队列之后统一发送
function writeMessageQueue(message){
// 当天时间
let todayDate = getDate()
flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表
// 主配置工作表存在
if (flagConfig == 1) {
console.log("✨ 开始将结果写入主配置表");
for (let i = 2; i <= 100; i++) {
if(version == 1){
// 找到指定的表行
if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){
// 写入更新的时间
Application.Range("F" + (i + 2)).Value = todayDate
// 写入消息
Application.Range("G" + (i + 2)).Value = message
console.log("✨ 写入结果完成");
break;
}
}else{
// 找到指定的表行
if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){
// 写入更新的时间
Application.Range("F" + (i + 2)).Value2 = todayDate
// 写入消息
Application.Range("G" + (i + 2)).Value2 = message
console.log("✨ 写入结果完成");
break;
}
}
}
}
}
// 总推送
function push(message) {
writeMessageQueue(message) // 将消息写入CONFIG表中
// if (message != "") {
// // message = messagePushHeader + message // 消息头最前方默认存放【xxxx】
// let length = jsonPush.length;
// let name;
// let key;
// for (let i = 0; i < length; i++) {
// if (jsonPush[i].flag == 1) {
// name = jsonPush[i].name;
// key = jsonPush[i].key;
// if (name == "bark") {
// bark(message, key);
// } else if (name == "pushplus") {
// pushplus(message, key);
// } else if (name == "ServerChan") {
// serverchan(message, key);
// } else if (name == "email") {
// email(message);
// } else if (name == "dingtalk") {
// dingtalk(message, key);
// } else if (name == "discord") {
// discord(message, key);
// }
// }
// }
// } else {
// console.log("🍳 消息为空不推送");
// }
}
// 推送bark消息
function bark(message, key) {
if (key != "") {
message = messagePushHeader + message // 消息头最前方默认存放【xxxx】
message = encodeURIComponent(message)
BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png"
let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON;
// 若需要修改推送的分组,则将上面一行改为如下的形式
// let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名";
let resp = HTTP.get(url, {
headers: { "Content-Type": "application/x-www-form-urlencoded" },
});
sleep(5000);
}
}
// 推送pushplus消息
function pushplus(message, key) {
if (key != "") {
message = encodeURIComponent(message)
// url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message;
url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题
let resp = HTTP.fetch(url, {
method: "get",
});
sleep(5000);
}
}
// 推送serverchan消息
function serverchan(message, key) {
if (key != "") {
url =
"https://sctapi.ftqq.com/" +
key +
".send" +
"?title=" + messagePushHeader +
"&desp=" +
message;
let resp = HTTP.fetch(url, {
method: "get",
});
sleep(5000);
}
}
// email邮箱推送
function email(message) {
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
let server = jsonEmail.server;
let port = parseInt(jsonEmail.port); // 转成整形
let sender = jsonEmail.sender;
let authorizationCode = jsonEmail.authorizationCode;
let mailer;
mailer = SMTP.login({
host: server,
port: port,
username: sender,
password: authorizationCode,
secure: true,
});
mailer.send({
from: pushHeader + "<" + sender + ">",
to: sender,
subject: pushHeader + " - " + data_time,
text: message,
});
// console.log("🍳 已发送邮件至:" + sender);
console.log("🍳 已发送邮件");
sleep(5000);
}
// 邮箱配置
function emailConfig() {
console.log("🍳 开始读取邮箱配置");
let length = jsonPush.length; // 因为此json数据可无序因此需要遍历
let name;
for (let i = 0; i < length; i++) {
name = jsonPush[i].name;
if (name == "email") {
if (jsonPush[i].flag == 1) {
let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表
// 邮箱表存在
// var email = {
// 'email':'', 'port':'', 'sender':'', 'authorizationCode':''
// } // 有效配置
if (flag == 1) {
console.log("🍳 开始读取邮箱表");
for (let i = 2; i <= 2; i++) {
// 从工作表中读取推送数据
jsonEmail.server = Application.Range("A" + i).Text;
jsonEmail.port = Application.Range("B" + i).Text;
jsonEmail.sender = Application.Range("C" + i).Text;
jsonEmail.authorizationCode = Application.Range("D" + i).Text;
if (Application.Range("A" + i).Text == "") {
// 如果为空行,则提前结束读取
break;
}
}
// console.log(jsonEmail)
}
break;
}
}
}
}
// 推送钉钉机器人
function dingtalk(message, key) {
message = messagePushHeader + message // 消息头最前方默认存放【xxxx】
let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key;
let resp = HTTP.post(url, { msgtype: "text", text: { content: message } });
// console.log(resp.text())
sleep(5000);
}
// 推送Discord机器人
function discord(message, key) {
message = messagePushHeader + message // 消息头最前方默认存放【xxxx】
let url = key;
let resp = HTTP.post(url, { content: message });
//console.log(resp.text())
sleep(5000);
}
// =================金山适配结束===================
// =================共用开始===================
// main() // 入口
// function main(){
checkVesion() // 版本检测,以进行不同版本的适配
flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表
// 主配置工作表存在
if (flagConfig == 1) {
console.log("🍳 开始读取主配置表");
let name; // 名称
let onlyError;
let nickname;
for (let i = 2; i <= 100; i++) {
// 从工作表中读取推送数据
name = Application.Range("A" + i).Text;
onlyError = Application.Range("C" + i).Text;
nickname = Application.Range("D" + i).Text;
if (name == "") {
// 如果为空行,则提前结束读取
break; // 提前退出,提高效率
}
if (name == sheetNameSubConfig) {
if (onlyError == "是") {
messageOnlyError = 1;
console.log("🍳 只推送错误消息");
}
if (nickname == "是") {
messageNickname = 1;
console.log("🍳 单元格用昵称替代");
}
break; // 提前退出,提高效率
}
}
}
flagPush = ActivateSheet(sheetNamePush); // 激活推送表
// 推送工作表存在
if (flagPush == 1) {
console.log("🍳 开始读取推送工作表");
let pushName; // 推送类型
let pushKey;
let pushFlag; // 是否推送标志
for (let i = 2; i <= line; i++) {
// 从工作表中读取推送数据
pushName = Application.Range("A" + i).Text;
pushKey = Application.Range("B" + i).Text;
pushFlag = Application.Range("C" + i).Text;
if (pushName == "") {
// 如果为空行,则提前结束读取
break;
}
jsonPushHandle(pushName, pushFlag, pushKey);
}
// console.log(jsonPush)
}
// 邮箱配置函数
emailConfig();
flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表
if (flagSubConfig == 1) {
console.log("🍳 开始读取分配置表");
if(qlSwitch != 1){ // 金山文档
for (let i = 2; i <= line; i++) {
var cookie = Application.Range("A" + i).Text;
var exec = Application.Range("B" + i).Text;
if (cookie == "") {
// 如果为空行,则提前结束读取
break;
}
if (exec == "是") {
execHandle(cookie, i);
}
}
message = messageMerge()// 将消息数组融合为一条总消息
push(message); // 推送消息
}else{
for (let i = 2; i <= line; i++) {
var cookie = Application.Range("A" + i).Text;
var exec = Application.Range("B" + i).Text;
if (cookie == "") {
// 如果为空行,则提前结束读取
break;
}
if (exec == "是") {
console.log("🧑 开始执行用户:" + "1" )
execHandle(cookie, i);
break; // 只取一个
}
}
}
}
// }
// 激活工作表函数
function ActivateSheet(sheetName) {
let flag = 0;
try {
// 激活工作表
let sheet = Application.Sheets.Item(sheetName);
sheet.Activate();
console.log("🥚 激活工作表:" + sheet.Name);
flag = 1;
} catch {
flag = 0;
console.log("🍳 无法激活工作表,工作表可能不存在");
}
return flag;
}
// 对推送数据进行处理
function jsonPushHandle(pushName, pushFlag, pushKey) {
let length = jsonPush.length;
for (let i = 0; i < length; i++) {
if (jsonPush[i].name == pushName) {
if (pushFlag == "是") {
jsonPush[i].flag = 1;
jsonPush[i].key = pushKey;
}
}
}
}
// 将消息数组融合为一条总消息
function messageMerge(){
// console.log(messageArray)
let message = ""
for(i=0; i<messageArray.length; i++){
if(messageArray[i] != "" && messageArray[i] != null)
{
message += "\n" + messageHeader[i] + messageArray[i] + ""; // 加上推送头
}
}
if(message != "")
{
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
console.log(message + "\n") // 打印总消息
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
}
return message
}
function sleep(d) {
for (var t = Date.now(); Date.now() - t <= d; );
}
// 获取sign返回小写
function getsign(data) {
var sign = Crypto.createHash("md5")
.update(data, "utf8")
.digest("hex")
// .toUpperCase() // 大写
.toString();
return sign;
}
// =================共用结束===================
// cookie字符串转json格式
function cookie_to_json(cookies) {
var cookie_text = cookies;
var arr = [];
var text_to_split = cookie_text.split(";");
for (var i in text_to_split) {
var tmp = text_to_split[i].split("=");
arr.push('"' + tmp.shift().trim() + '":"' + tmp.join(":").trim() + '"');
}
var res = "{\n" + arr.join(",\n") + "\n}";
return JSON.parse(res);
}
// 获取10 位时间戳
function getts10() {
var ts = Math.round(new Date().getTime() / 1000).toString();
return ts;
}
// 获取13位时间戳
function getts13(){
// var ts = Math.round(new Date().getTime()/1000).toString() // 获取10 位时间戳
let ts = new Date().getTime()
return ts
}
// 符合UUID v4规范的随机字符串 b9ab98bb-b8a9-4a8a-a88a-9aab899a88b9
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0,
v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
function getUUIDDigits(length) {
var uuid = generateUUID();
return uuid.replace(/-/g, '').substr(16, length);
}
// 登录获取token
function login(url, headers, data){
messageSuccess = ""
messageFail = ""
token = ""
resp = HTTP.post(
url,
// JSON.stringify(data),
data,
{ headers: headers }
);
// {"code":1,"msg":"登录成功","time":"","data":{"userinfo":{"id":,"username":"","nickname":"","intelligence":1,"mobile":"","avatar":"","score":0,"status":"normal","time_zone":{"key":"Asia\/Shanghai","show_name":"上海、北京"},"lang":"zh-cn","cicp_type":0,"is_yz":0,"token":"","user_id":,"createtime":,"expiretime":1717736728,"expires_in":,"is_store":0,"is_sub_store":0,"store":null,"is_operate":0,"money":{"balance":"0.00","task_reward":"0.00","credit":"0.00"},"golo_user_id":"","roles":{"store_role_name":"","other_role_names":[],"role_ids":[1005]},"is_lead_ranking":0,"need_bind":0,"xmpp":{"user_id":,"token":"","xmpp":{"ip":"","port":10105,"domain":"192.168.30.60:10205"}}}}}
// {"code":0,"msg":"账户不正确","time":"","data":{}}
if (resp.status == 200) {
resp = resp.json();
console.log(resp)
code = resp["code"]
if(code == 1)
{
// nickname = resp["data"]["userinfo"]["nickname"]
token = resp["data"]["userinfo"]["token"]
console.log(token)
respmsg = resp["msg"]
content = "📢 " + respmsg + "\n"
messageSuccess += content;
console.log(content)
}else
{
respmsg = resp["msg"]
content = "📢 " + respmsg + "\n"
messageFail += content;
console.log(content);
}
} else {
content = "❌ " + "登录失败\n"
messageFail += content;
console.log(content);
}
msg = [messageSuccess, messageFail, token]
return msg
}
// 签到
function sign(url, headers, data){
messageSuccess = ""
messageFail = ""
flagstatus = 0 // 记录成功状态。0代表失败1代表成功
// {"code":1,"msg":"签到成功","time":"","data":{"score":1}}
// {"code":0,"msg":"参数不正确","time":"","data":{}}
// {"code":0,"msg":"今天已签到,明天再来吧","time":"","data":{}}
resp = HTTP.post(
url,
// JSON.stringify(data),
data,
{ headers: headers }
);
if (resp.status == 200) {
resp = resp.json();
console.log(resp)
code = resp["code"]
if(code == 1)
{
respmsg = resp["msg"]
score = resp["data"]["score"]
content = "🎉 " + respmsg + "获得" + score + "积分\n"
messageSuccess += content;
console.log(content)
flagstatus = 1 // 签到成功
}else
{
respmsg = resp["msg"]
if(respmsg == "今天已签到,明天再来吧")
{
content = "📢 " + respmsg + "\n"
messageSuccess += content;
console.log(content)
flagstatus = 1 // 签到成功,已签到
}else
{
content = "📢 " + respmsg + "\n"
messageFail += content;
console.log(content);
}
}
} else {
content = "❌ " + "签到失败\n"
messageFail += content;
console.log(content);
}
// console.log(messageSuccess)
msg = [messageSuccess, messageFail,flagstatus]
return msg
}
// 具体的执行函数
function execHandle(cookie, pos) {
let messageSuccess = "";
let messageFail = "";
let messageName = "";
// 推送昵称或单元格,还是不推送位置标识
if (messageNickname == 1) {
// 推送昵称或单元格
messageName = Application.Range("C" + pos).Text;
if(messageName == "")
{
messageName = "单元格A" + pos + "";
}
}
posLabel = pos-2 ; // 存放下标从0开始
messageHeader[posLabel] = "👨‍🚀 " + messageName
// try {
var url1 = "https://cicp.cnlaunch.com/api/user/login"; // 账户密码登录得token
var url2 = "https://cicp.cnlaunch.com/api/user/sign" // 签到根据token签到
// token = "75b67774-36ae-420b-8d21-cdcbb5def713"
token = cookie
username = Application.Range("D" + pos).Text;
password = Application.Range("E" + pos).Text;
headers= {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586",
// 'Cookie': cookie,
"Content-Type":"application/x-www-form-urlencoded",
}
// 如果有token先用token进行签到
// 如果签到失败则用账密登录获取新token然后签到
flagstatus = 0 // 记录签到成功状态。0代表签到失败1代表签到成功
if(token != "" )
{
data = {
"token":token
}
msg = sign(url2, headers, data) // 签到
if(msg[2] == 1){ // 第三个元素存放签到状态1为签到成功
// 签到成功了不用重新获取新token了
flagstatus = 1 // 签到成功
content = msg[0]
messageSuccess += content;
console.log(content)
}else
{
console.log("🍳 此token签到失败尝试登录获取新token")
}
}else
{
console.log("🍳 token为空开始进行登录获取token")
}
// 未签到时得执行流程
if(flagstatus != 1)
{
// 登录获取token
// openid=&parent_id=&username=&password=&token=
data = {
"openid":"",
"parent_id":"",
"username":username,
"password":password,
"token":"",
}
msg = login(url1, headers, data)
if(msg[2] != ""){ // 第三个元素存放token
// 签到成功了已获取新token了
token = msg[2]
console.log("🍳 登录成功已获得最新token:" + token)
Application.Range("A" + pos).Value = token // 将token写入单元格内可下次使用
data = {
"token":token
}
msg = sign(url2, headers, data) // 签到
if(msg[2] == 1){ // 第三个元素存放签到状态1为签到成功
// 签到成功
content = msg[0]
messageSuccess += content;
console.log(content)
}else{
// 签到失败
content = msg[1]
messageFail += content;
console.log(content)
}
}else
{
console.log("❌ 获取最新token为空")
// 未获取到token登录失败
content = msg[1]
messageFail += content;
console.log(content)
}
}
// } catch {
// messageFail += messageName + "失败";
// }
sleep(2000);
if (messageOnlyError == 1) {
messageArray[posLabel] = messageFail;
} else {
if(messageFail != ""){
messageArray[posLabel] = messageFail + " " + messageSuccess;
}else{
messageArray[posLabel] = messageSuccess;
}
}
if(messageArray[posLabel] != "")
{
console.log(messageArray[posLabel]);
}
}

View File

@@ -0,0 +1,326 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/iqoo.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/iqoo.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/iqoo.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 43b07ea6d2f3f5b0a428cb2e5a0fce75e64589151300405fe4d9e6627a107548
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: IQOO社区小程序 积分脚本
cron: 30 8 * * *
------------------------------------------
#Notice:
变量名iqoo
抓取方法https://bbs-api.iqoo.com请求头authorization 去掉Bearer
多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("iqoo社区");
let ckName = `iqoo`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
this.postId = ''
this.threadId = ''
}
request(options) {
let baseHeaders = {
sign: this.getSign(options.method, options.url.split('https://bbs-api.iqoo.com')[1].split("?")[0], options.data ? options.data : ''),
'authorization': 'Bearer ' + this.token,
"user-agent": "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 WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027",
"x-platform": "mini",
"x-visitor": "b89d8b0ffa920e96f3cb4c1f69ec2c66"
}
options.headers = Object.assign(baseHeaders, options.headers)
return axios.request(options)
}
async userInfo() {
let options = {
method: 'GET',
url: `https://bbs-api.iqoo.com/api/v3/v3/user?userId=${this.id}`,
headers: {
},
data: {
userId: this.id
}
};
let { data: result } = await this.request(options);
if (result?.Code == '0') {
$.log(`${this.index}账号[${this.index}] 获取用户信息成功`)
}
}
async run() {
await this.getTreadList()
if (this.threadId && this.postId) {
await this.likePost(this.threadId, this.postId)
await $.wait(5000)
await this.sharePost(this.threadId)
await $.wait(5000)
await this.viewPost(this.threadId)
await $.wait(5000)
await this.commonPost(this.threadId)
}
await this.getDrawNum()
await this.signIn()
}
async getDrawNum() {
let options = {
method: 'GET',
url: `https://bbs-api.iqoo.com/api/v3/today.draw.count`,
headers: {
},
data: {}
};
let { data: result } = await this.request(options);
if (result?.Code == '0' && result.Data.count == 0) {
//可以免费抽一次
await this.draw()
} else {
//已签到
$.log(`${this.index}账号[${this.index}] 抽奖过`)
}
}
async draw() {
let options = {
method: 'POST',
url: `https://bbs-api.iqoo.com/api/v3/luck.draw`,
headers: {
},
data: {}
};
let { data: result } = await this.request(options);
if (result?.Code == '0') {
$.log(`${this.index}账号[${this.index}] 抽奖成功 获得${result.Data.prize_name}`)
}
}
async signIn() {
let options = {
method: 'POST',
url: `https://bbs-api.iqoo.com/api/v3/sign`,
headers: {
},
data: { "from": "group" }
};
let { data: result } = await this.request(options);
if (result?.Code == '0') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `🕊当前已签到${result.Data.serialDays}天🎉 获得积分${result.Data.score} 当前积分${result.Data.scoreCount}`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.Message}`)
}
}
async likePost(threadId, postId) {
let { data: likeResult } = await this.request({
method: 'POST',
url: `https://bbs-api.iqoo.com/api/v3/posts.update`,
headers: {
},
data: { "id": threadId, "postId": postId, "data": { "attributes": { "isLiked": true } } }
});
if (likeResult?.Code == '0') {
$.log(`${this.index}账号[${this.index}] 帖子点赞成功`)
} else {
$.log(`${this.index}账号[${this.index}] 帖子点赞失败:${likeResult.Message}`)
}
let { data: unlikeResult } = await this.request({
method: 'POST',
url: `https://bbs-api.iqoo.com/api/v3/posts.update`,
headers: {
},
data: { "id": threadId, "postId": postId, "data": { "attributes": { "isLiked": false } } }
});
if (unlikeResult?.Code == '0') {
$.log(`${this.index}账号[${this.index}] 帖子取消点赞成功`)
} else {
$.log(`${this.index}账号[${this.index}] 帖子取消点赞失败:${unlikeResult.Message}`)
}
}
async sharePost(threadId) {
let options = {
method: 'POST',
url: `https://bbs-api.iqoo.com/api/v3/thread.share`,
headers: {
},
data: { "threadId": threadId }
};
let { data: result } = await this.request(options);
if (result?.Code == '0') {
$.log(`${this.index}账号[${this.index}] 帖子分享成功`)
} else {
$.log(`${this.index}账号[${this.index}] 帖子分享失败:${result.Message}`)
}
}
async viewPost(threadId) {
let options = {
method: 'GET',
url: `https://bbs-api.iqoo.com/api/v3/view.count?threadId=` + threadId + `&type=0`,
headers: {
},
data: { "threadId": threadId, "type": 0 }
};
let { data: result } = await this.request(options);
if (result?.Code == '0') {
$.log(`${this.index}账号[${this.index}] 帖子浏览成功`)
} else {
$.log(`${this.index}账号[${this.index}] 帖子浏览失败:${result.Message}`)
}
}
async commonPost(threadId) {
let options = {
method: 'POST',
url: `https://bbs-api.iqoo.com/api/v3/posts.create`,
headers: {
},
data: { "id": threadId, "type": 0, "content": "666", "source": "", "attachments": [] }
};
let { data: result } = await this.request(options);
if (result?.Code == '0') {
$.log(`${this.index}账号[${this.index}] 帖子评论成功`)
} else {
$.log(`${this.index}账号[${this.index}] 帖子评论失败:${result.Message}`)
}
}
async getTreadList() {
let options = {
method: 'GET',
url: `https://bbs-api.iqoo.com/api/v3/thread.list?scope=5&page=1&perPage=10&filter[sort]=4&filter[essence]=1&sequence=0`,
headers: {
},
data: { "filter[essence]": 1, "filter[sort]": 4, "page": 1, "perPage": 10, "scope": 5, "sequence": 0 }
};
let { data: result } = await this.request(options);
this.threadId = result.Data.pageData[0].threadId
this.postId = result.Data.pageData[0].postId
return
}
/**
*
* @param {*} e method
* @param {*} t path
* @param {*} n data
* @returns
*/
getSign(e, t, n) {
const time = Math.floor(Date.now() / 1e3);
const crypto = require("crypto-js");
var o, s, r, a = `${time}`,
c = "GET" == e ? function (e) {
var t, o = "", r;
if (typeof e === 'object' && e !== null) {
if (Array.isArray(e)) {
r = e.entries();
} else {
r = Object.entries(e);
}
try {
for (var entry of r) {
var a = encodeURIComponent(entry[0]), c = encodeURIComponent(entry[1]);
o += "".concat(a, "=").concat(c, "&");
}
} catch (e) {
console.error(e);
}
return o.slice(0, -1);
} else {
return '';
}
}(n) : "";
let l = "GET" == e ? "" : JSON.stringify(n);
o = "2618194b0ebb620055e19cf9811d3c13"
s = e + "&" + t + "&" + c + "&" + l + "&appid=1002&timestamp=" + a
r = crypto.HmacSHA256(s, o)
let sign = crypto.enc.Base64.stringify(r)
return `IQOO-HMAC-SHA256 appid=1002,timestamp=${time},signature=${sign}`
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,847 @@
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/quanmianshidai.py
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/quanmianshidai.py
# Repo: smallfawn/QLScriptPublic
# Path: wxapp/quanmianshidai.py
# UploadedAt: 2026-05-14T17:47:57+08:00
# SHA256: 56f3c63c9d017a36fce2f78f3b461dcf8fb453537a300b8da039ff71d568c9a1
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
"""
项目 全棉时代种棉花
入口 #小程序://全棉时代
变量 code #token#备注 多账号换行
变量名 qmzmh
"""
import os
import requests
from datetime import datetime, timezone, timedelta
import json
import time
import random
# 配置参数
base_url = "https://hxxxy.gov.cn"
user_agent = "Mozilla/5.0 (Linux; Android 11; ONEPLUS A6000 Build/RKQ1.201217.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160065 MMWEBSDK/20231201 MMWEBID/2930 MicroMessenger/8.0.45.2521(0x28002D3D) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 miniProgram/wxdfcaa44b1aa891a7"
def get_beijing_date():
beijing_time = datetime.now(timezone(timedelta(hours=8)))
return beijing_time.date()
def dq_time():
dqsj = int(time.time())
dysj = datetime.fromtimestamp(dqsj).strftime('%Y-%m-%d %H:%M:%S')
print("当前时间戳:", dqsj)
print("转换后的时间:", dysj)
return dqsj, dysj
def get_env_variable(var_name):
value = os.getenv(var_name)
if value is None:
print(f'环境变量{var_name}未设置,请检查。')
return None
accounts = value.strip().split('\n')
print(f'-----------本次账号运行数量:{len(accounts)}-----------')
print(f'------全棉时代种棉花-----1.2------')
return accounts
def create_headers(code, token):
headers = {
'host': 'sg01.purcotton.com',
'accept': 'application/json, text/plain, */*',
'app-id': 'wxdfcaa44b1aa891a7',
'user-agent': user_agent,
'content-type': 'application/json;charset=UTF-8',
'origin': 'https://sg01.purcotton.com',
'x-requested-with': 'com.tencent.mm',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'accept-encoding': 'gzip, deflate',
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'cookie': 'sajssdk_2015_cross_new_user=1',
'code': code,
'token': token,
}
return headers
def jscz(code, token): # 浇水
# 调用hqid函数并获取树木ID及其他信息
tree_id, sunshine, total_sunshine = hqid(code, token)
if tree_id is not None:
#print(f"获得的树木ID: {tree_id}")
# 可以在这里打印阳光信息,如果需要
#print(f"当前阳光: {sunshine}, 总阳光: {total_sunshine}")
while True: # 开始一个无限循环
url = "https://sg01.purcotton.com/api/watering"
data = {"tree_user_id": tree_id, "water_cnt": 1} # 使用动态获取的树木ID
headers = create_headers(code, token)
#print(data)
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
response_data = response.json()
if response_data.get("code") == 200:
# 提取剩余水滴数
remaining_water = response_data["data"]["info"]["sy_water"]
print(f"剩余水滴数: {remaining_water}")
# 根据剩余水滴数决定是否继续
if remaining_water < 30: # 如果剩余水滴数小于30则停止
print("水滴不足,停止浇水。")
break
print("执行浇水操作...")
# 暂停1到3秒
time.sleep(random.randint(1, 3))
elif response_data.get("code") == 400:
print(response_data.get("msg", "未知错误"))
break # 遇到错误时停止循环
else:
print("未知的响应code:", response_data.get("code"))
print("完整响应:", response_data)
break # 如果响应码不是200或400停止循环
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
break # 请求异常时停止循环
else:
print("未能获取树木ID无法执行浇水操作。")
def llhmp(code, token, action, tid): # 添加了tid参数
phone, _ = login(code, token) # 调用login函数获取电话号码忽略user_id
url = "https://nmp.pureh2b.com/api/purcotton/completetask"
headers = {
'Host': 'nmp.pureh2b.com',
'XWeb-Xhr': '1',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'code': code,
'token': token,
}
data = {
'action': action,
'phone': phone,
'from': 'guoyuan'
}
#print(data)
try:
response = requests.post(url, headers=headers, data=data)
response.raise_for_status()
response_data = response.json() # 解析响应数据为JSON
action_descriptions = {
'browse_venue': '逛甄选好棉品',
'browse_new_user_zone': '浏览新用户专区',
'browse_community': '社区送福利',
'subscibe': '订阅奖励提醒'
}
action_description = action_descriptions.get(action, '执行任务')
#print(f"执行任务 '{action_description}' 响应内容:", response.text) # 打印响应内容
if response_data.get("code") == 200:
print(f"{action_description} 任务成功,暂停一段时间再继续...")
time.sleep(random.randint(15, 20))
tjlq_mpjl(code, token, tid) # 在任务成功后调用领取奖励的函数
elif response_data.get("code") == 400:
#print() # 打印响应内容
print(f"{action_description} {response_data.get('msg')}")
#tjlq_mpjl(code, token, tid) # 在任务成功后调用领取奖励的函数
else:
print("{action_description} 收到未预期的响应,响应内容如下:")
print(response_data)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def tjlq_mpjl(code, token, tid): # 添加了tid参数来指定任务ID 提交 任务 领取奖励
url = "https://sg01.purcotton.com/api/task/receive-task-water"
headers = create_headers(code, token)
data = {"tid": tid} # 使用传入的任务ID
#print(data)
try:
response = requests.post(url, headers=headers, json=data) # 发送POST请求
response.raise_for_status() # 检查响应状态码
# 解析响应数据
response_data = response.json()
if response_data.get("code") == 200:
print("奖励领取成功。")
# 打印sy_water和get_water
data = response_data.get("data", {})
sy_water = data.get("sy_water", "未知") #
get_water = data.get("get_water", "未知") # 同上
print(f"剩余水量:{sy_water}, 获取水量:{get_water}")
else:
print(f"奖励领取失败,错误信息:{response_data.get('msg')}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def task_list(code, token): # 任务列表
url = "https://sg01.purcotton.com/api/task/list"
headers = create_headers(code, token)
today_date = datetime.now().strftime("%Y-%m-%d") # 获取今天的日期格式为YYYY-MM-DD
# 任务ID到任务名称的映射
task_names = {
1: "签到, 1",
2: "不知道1, 0",
4: "三餐福袋, 3",
6: "逛甄选好棉品, 4",
10: "订阅奖励提醒, 1",
13: "浏览新用户, 2",
14: "庄园小课堂, 3",
15: "棉花工厂, 1",
16: "社区送福利, 1"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response_data = response.json()
today_tasks = [] # 用于存储今天的任务信息
if response_data.get("code") == 200:
task_user_info = response_data.get("data", {}).get("task_user_info", [])
print("------任务进度条-----------")
for task in task_user_info:
task_id = task.get('task_id')
complete_num = task.get('complete_num')
complete_date = task.get('complete_date')
# 比较任务完成日期是否为今天
#print("------任务进度条-----------")
if complete_date == today_date:
task_name = task_names.get(task_id, f"未知任务 {task_id}") # 获取任务名称如果未知则显示未知任务和ID
print(f"任务ID: {task_id} {task_name}/{complete_num}, 任务时间: {complete_date}")
#print(f"{task_name}/{complete_num} 时间: {complete_date}")
today_tasks.append(task)
print("-----------------")
print()
return today_tasks
else:
print(f"获取任务列表失败,错误信息:{response_data.get('msg')}")
return []
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return []
def pdrw(code, token): # 判断任务
"""根据任务完成情况执行任务"""
try:
task_user_info = task_list(code, token)
task_completion_limits = {
6: 4,# 任务ID为6的任务只能完成4次 逛甄选好棉品
13: 2, # 任务ID为13的任务只能完成2次 浏览新用户专区
15: 1, # 假设任务ID为15的任务只能完成1次 棉花工厂
4: 3, # 4 3次三餐福袋 7-12 14-17 18-22
16: 1, # ID 16 社区送福利
10: 1, # ID 10 订阅奖励提醒
14: 1, #ID14 #庄园小课堂
1: 1, #ID #签到
}
# 先检查所有指定的任务是否已经存在于任务列表中
existing_task_ids = [task['task_id'] for task in task_user_info]
#print(existing_task_ids)
# 遍历每个任务ID检查是否需要执行任务
for task_id, max_completes in task_completion_limits.items():
task_info = next((task for task in task_user_info if task['task_id'] == task_id), None)
if task_info:
complete_num = task_info['complete_num']
if complete_num < max_completes:
#print(f"任务ID: {task_id}, 当前完成次数: {complete_num}, 将执行任务并尝试领取奖励。")
print()
if task_id == 6:
llhmp(code, token, 'browse_venue', '6')
#today_water(code, token)
elif task_id == 13:
llhmp(code, token, 'browse_new_user_zone', '13')
today_water(code, token)
sj_yg(code, token)#收集阳光
syyg(code, token)#使用阳光
# 这里可以添加其他任务ID的逻辑
elif task_id == 15:
# 对于任务ID 15的特定处理
complete_task(code, token, '15')
elif task_id == 16:
llhmp(code, token, 'browse_community', '16')
elif task_id == 10:
llhmp(code, token, 'subscibe', '10')
elif task_id == 14:
hdwt_box(code, token, '14')
elif task_id == 4:
# 对于任务ID 15的特定处理
lq_fd(code, token, '4')
elif task_id == 1:
lq_fd(code, token, '1')
time.sleep(random.randint(1, 5))
elif task_id not in existing_task_ids:
#print(f"任务ID: {task_id}, 未在列表中,将尝试执行并领取奖励。")
print()
if task_id == 6:
llhmp(code, token, 'browse_venue', '6')
today_water(code, token)
elif task_id == 13:
llhmp(code, token, 'browse_new_user_zone', '13')
sj_yg(code, token)#收集阳光
syyg(code, token)#使用阳光
elif task_id == 15:
complete_task(code, token, '15')
elif task_id == 16:
llhmp(code, token, 'browse_community', '16')
elif task_id == 10:
llhmp(code, token, 'subscibe', '10')
elif task_id == 14:
hdwt_box(code, token, '14')
elif task_id == 1:
lq_fd(code, token, '1')
elif task_id == 4:
lq_fd(code, token, '4')
time.sleep(random.randint(1, 5))
# 添加其他任务ID和类型的逻辑
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 任务 数据
def complete_task(code, token, tid): # 棉花工厂
url = "https://sg01.purcotton.com/api/task/complete-manual-task"
headers = create_headers(code, token)
payload = {
"tid": tid,
"relate_id": 0,
}
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status() # 检查HTTP响应状态码如果不是200系列则抛出异常
# 解析响应数据
response_data = response.json()
if response_data.get("code") == 200:
print("奖励领取成功。")
tjlq_mpjl(code, token, tid)
else:
# 如果响应中的code不是200打印错误信息
print(f"任务失败:{response_data.get('msg')}")
except requests.exceptions.RequestException as e:
# 如果请求过程中发生异常,打印异常信息
print(f"请求失败: {e}")
def lq_fd(code, token, tid): # 三餐福袋和签到
# 确保tid为整数类型
tid = int(tid) # 将tid转换为整型以确保与整数进行比较
task_name = "未知任务"
if tid == 4:
task_name = "三餐福袋" #7-12 14-17 18-22
elif tid == 1:
task_name = "签到"
url = "https://sg01.purcotton.com/api/task/complete-task"
headers = create_headers(code, token)
data = {"tid": tid} # 使用传入的任务ID
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status() # 检查响应状态码
# 解析响应数据
response_data = response.json()
if response_data.get("code") == 200:
print(f"{task_name} 奖励领取成功。")
# 打印sy_water和get_water
data = response_data.get("data", {})
sy_water = data.get("sy_water", "未知")
get_water = data.get("get_water", "未知")
print(f"{task_name} 剩余水量:{sy_water}, 获取水量:{get_water}")
else:
print(f"{task_name}{response_data.get('msg')}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 任务 完
# 提取数据 开始
def hqid(code, token): # 获取树木ID和阳光信息
url = "https://sg01.purcotton.com/api/index"
headers = create_headers(code, token)
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response_data = response.json()
# print("Response JSON:", response_data) # 用于调试
if response_data.get("code") == 200:
tree_data = response_data['data']['tree']
user_data = response_data['data']['user'] # 获取用户相关数据
# 获取树木ID
tree_id = tree_data.get('id')
# 获取阳光相关数据
sunshine = user_data.get('sunshine', 0) # 如果不存在则默认为0
total_sunshine = user_data.get('total_sunshine', 0) # 如果不存在则默认为0
# 可以选择打印这些信息
#print(f"树木ID: {tree_id} 当前阳光: {sunshine} 总阳光: {total_sunshine} ")
# 根据需要返回所需的数据,这里返回一个包含所有信息的元组
return tree_id, sunshine, total_sunshine
else:
print(f"请求失败,错误代码: {response_data.get('code')}, 错误信息: {response_data.get('msg')}")
return None, None, None # 如果请求失败返回包含None的元组
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None, None, None # 如果发生异常返回包含None的元组
def login(code, token): # 提取的号码
url = "https://sg01.purcotton.com/api/login"
headers = create_headers(code, token)
data = {
"invite_source": "task",
"channel": "" # "channel": "zmh_assist"
}
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status() # 检查HTTP响应状态
response_data = response.json()
if response_data.get("code") == 200:
phone = response_data["data"]["phone"]
user_id = response_data["data"]["id"] # 提取id
#print("提取的电话号码:", phone)
#print("提取的用户ID:", user_id) # 打印id
return phone, user_id # 返回电话号码和用户ID
else:
print("请求失败,错误代码:", response_data.get("code"), "错误信息:", response_data.get("msg"))
return None, None
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None, None
# 提取数据 完
# 回答问题
def hdwt_box(code, token, tid): #庄园小课堂
url = "https://sg01.purcotton.com/api/answer"
headers = create_headers(code, token)
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response_data = response.json()
exams = response_data.get("data", {}).get("exams", [])
#print(response.json())
for exam in exams:
exam_id = exam.get('id')
print(f"正在处理问题ID: {exam_id}")
# 这里是你提交答案的代码逻辑
url_submit_answer = "https://sg01.purcotton.com/api/answer/complete"
payload = {
"tid": tid, # 假设任务ID为14
"exam_id": exam_id,
"win": 1 # 假设标记为正确
}
submit_response = requests.post(url_submit_answer, headers=headers, json=payload)
submit_response.raise_for_status()
if submit_response.status_code == 200:
submit_response_data = submit_response.json()
#print(submit_response_data) # 打印完整的响应体
# 提取并打印get_water, complete_num, 和 box_id
get_water = submit_response_data.get("data", {}).get("get_water", 0)
complete_num = submit_response_data.get("data", {}).get("complete_num", 0)
box_id = submit_response_data.get("data", {}).get("box_id", 0)
print(f"获取水量:{get_water}, 完成数量:{complete_num}, 宝箱ID{box_id}")
# 如果box_id大于0则打开宝箱
if box_id > 0:
print(f"检测到宝箱ID: {box_id},尝试打开宝箱...")
url_open_box = "https://sg01.purcotton.com/api/answer/open-box"
box_payload = {"box_id": box_id}
box_response = requests.post(url_open_box, headers=headers, json=box_payload)
box_response.raise_for_status()
if box_response.status_code == 200:
box_response_data = box_response.json()
# print(f"宝箱 {box_id} 打开成功,响应内容:", box_response_data)
# 提取sy_water和get_water
sy_water = box_response_data.get("data", {}).get("sy_water", 0)
get_water = box_response_data.get("data", {}).get("get_water", 0)
print(f"宝箱 剩余水量:{sy_water}, 宝箱水量:{get_water}")
# 随机停止3-5秒
time.sleep(random.randint(3, 5))
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def today_water(code, token):#
url = "https://sg01.purcotton.com/api/get-today-water"
headers = create_headers(code, token) # 确保 create_headers 函数正确定义并返回所需的头部信息
try:
response = requests.post(url, headers=headers)
response.raise_for_status() # 确保响应状态为200
# 解析响应体为JSON
response_data = response.json()
# 检查响应中的code字段
if response_data.get("code") == 200:
#print("完整响应体:", response_data) # 打印完整的响应体
# 提取所需数据
sy_water = response_data.get("data", {}).get("sy_water", "未知")
get_water = response_data.get("data", {}).get("get_water", "未知")
tomorrow_get_water_num = response_data.get("data", {}).get("tomorrow_get_water_num", "未知")
#print(f"剩余水量sy_water: {sy_water}")
print(f"今日获取水量: {get_water}")
print(f"明日可获取水量: {tomorrow_get_water_num}")
print(f"今日获取水量: {get_water} 明日可获取水量: {tomorrow_get_water_num}")
else:
# 打印错误消息
print(f"水瓶 {response_data.get('msg', '未知错误')}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def cscscs(code, token):
url = "https://sg01.purcotton.com/api/statistics/store"
headers = create_headers(code, token)
_, user_id = login(code, token) # 调用login函数忽略电话号码只获取user_id
data = {
"uid": user_id,
"type": 301 # 确保这里的值符合API的要求
}
#print(data) # 打印整个响应数据
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status() # 检查HTTP响应状态
response_data = response.json()
#print(response_data) # 打印整个响应数据
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 阳光
def sj_yg(code, token):
success = False
while not success:
url = "https://sg01.purcotton.com/api/get-sunshine"
headers = create_headers(code, token)
# 使用当前时间戳
payload = {"time": int(time.time() * 1000)}
#print(f"请求负载: {payload}")
try:
response = requests.post(url, headers=headers, json=payload)
response_data = response.json()
if response.status_code == 200:
if response_data["code"] == 200:
sy_sunshine = response_data['data'].get('sy_sunshine')
get_sunshine = response_data['data'].get('get_sunshine')
print(f"成功领取阳光: 剩余阳光: {sy_sunshine}, 获得阳光: {get_sunshine}")
success = True # 标记成功领取,退出循环
elif response_data["code"] == 400:
print("没有可领取的阳光")
break # 如果没有可领取的阳光,跳出循环
else:
print(f"阳光操作响应: {response_data}")
else:
print(f"请求失败HTTP状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
if success:
# 如果成功领取阳光则暂停1到3秒后继续
sleep_time = random.randint(1, 3)
print(f"暂停{sleep_time}秒后重新领取...")
time.sleep(sleep_time)
success = False # 重置成功标志,继续领取
def syyg(code, token):
"""当阳光值大于100时完成阳光任务"""
# 假设hqid返回树木IDsunshine和其他信息
_, sunshine, _ = hqid(code, token)
if sunshine > 99:
url = "https://sg01.purcotton.com/api/sunshine-task/complete-task"
headers = create_headers(code, token) # 使用create_headers函数创建请求头
payload = {"tid": 1} # 固定payload可能需要根据API文档调整
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status() # 检查响应是否成功
response_data = response.json()
if response_data.get("code") == 200:
print("成功完成阳光任务。")
# 这里可以根据响应体进一步处理,如打印信息或记录日志
else:
print(f"完成阳光任务失败,错误代码: {response_data.get('code')}, 错误信息: {response_data.get('msg')}")
except requests.exceptions.RequestException as e:
print(f"请求完成阳光任务时出错: {e}")
else:
print(f"阳光值未达到{sunshine}/100不执行任务。")
# 好友?
def hyid(code, token):
url = "https://sg01.purcotton.com/api/friend/list?page=1&page_size=50"
headers = create_headers(code, token)
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 确保响应状态为200
# 解析响应体为JSON
response_data = response.json()
friend_user_ids = [] # 用于存储符合条件的朋友的用户ID
if response_data.get("code") == 200:
friends_list = response_data.get("data", {}).get("list", [])
for friend in friends_list:
friend_user_id = friend.get("friend_user_id")
help_water_cnt = friend.get("help_water_cnt")
be_help_water_cnt = friend.get("friend_user_info", {}).get("be_help_water_cnt")
#print(f"朋友用户ID: {friend_user_id}, 帮忙浇水次数: {help_water_cnt}, 被帮忙浇水次数: {be_help_water_cnt}")
# 只有当帮忙浇水次数小于1时才收集该朋友的用户ID
if help_water_cnt < 1:
friend_user_ids.append(friend_user_id)
return friend_user_ids # 返回所有符合条件收集到的用户ID
else:
print("请求失败,错误代码:", response_data.get("code"), "错误信息:", response_data.get("msg"))
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def access_friend_detail(code, token, friend_user_id):
"""访问朋友的详细信息,并尝试对其树进行浇水操作"""
url = "https://sg01.purcotton.com/api/friend/index"
headers = create_headers(code, token)
headers['friend-id'] = str(friend_user_id)
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response_data = response.json()
if response_data.get("code") == 200:
tree_info = response_data.get('data', {}).get('tree', {})
if isinstance(tree_info, list) and tree_info:
tree_info = tree_info[0]
tree_id = tree_info.get('id') if isinstance(tree_info, dict) else None
help_water_info = response_data.get('data', {}).get('help_water', {})
help_water_code = help_water_info.get('code')
help_water_msg = help_water_info.get('msg')
#print(f"{friend_user_id}朋友树ID: {tree_id}, 帮忙浇水代码: {help_water_code}, 信息: '{help_water_msg}'")
if tree_id is not None:
success = water_friend_tree(code, token, tree_id, friend_user_id)
if not success:
print(f"由于操作失败,停止处理朋友{friend_user_id}的后续操作。")
return False
else:
print(f"获取朋友{friend_user_id}的详细信息失败,错误代码: {response_data.get('code')}, 错误信息: {response_data.get('msg')}")
return False
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return False
return True
def water_friend_tree(code, token, tree_id, friend_user_id):
"""执行给定朋友的树浇水操作"""
url = "https://sg01.purcotton.com/api/friend/water"
headers = create_headers(code, token)
payload = {"tree_user_id": tree_id}
headers['friend-id'] = str(friend_user_id)
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
response_data = response.json()
#print(response_data) # 打印整个响应体,用于调试
if response_data["code"] == 200:
# 检查response_data['data']是否为字典,以此判断是否可以安全访问'info'
if isinstance(response_data['data'], dict):
use_water = response_data['data']['info'].get('use_water', '未知')
reward_water = response_data['data']['info'].get('reward_water', '未知')
print(f"对树ID {tree_id} 的浇水操作成功: 使用水量: {use_water}, 奖励水量: {reward_water}")
else:
# 如果data不是字典直接打印data字段这里可能是错误消息或其他说明
print(f"操作结果: {response_data['data']}")
return False
elif response_data["code"] == 400:
#print(f"{response_data.get('msg', '未知错误')}. 完整响应体: {response_data}")
print(f"{response_data.get('msg', '未知错误')}. ")
return False
else:
print(f"对树ID {tree_id} 的浇水操作响应: {response_data}")
return False
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return False
return True
def process_all_friends(friends_user_ids, code, token):
"""遍历朋友列表,尝试对每个朋友的树进行浇水操作,并在首次失败时停止"""
for friend_user_id in friends_user_ids:
if not access_friend_detail(code, token, friend_user_id):
#print(f"由于操作失败,停止对所有后续朋友的处理。")
break # 遇到第一个失败,立即跳出循环
def main():
var_name = 'qmzmh'
tokens = get_env_variable(var_name)
if not tokens:
return
total_tokens = len(tokens)
if total_tokens > 20:
print("账号数量超过20个不执行操作。")
return
for index, token_info in enumerate(tokens, start=1):
parts = token_info.split('#')
if len(parts) < 2:
print("令牌格式不正确。跳过处理。")
continue
code = parts[0]
token = parts[1]
remark = parts[2] if len(parts) > 2 else ""
print()
print(f"------账号{index}/{total_tokens},备注: {remark}-------")
phone, user_id = login(code, token)
if phone and user_id: # 检查是否成功获取电话号码和用户ID
# 进行后续任务
cscscs(code, token)
#sj_yg(code, token)#收集阳光
#syyg(code, token)#使用阳光
jscz(code, token) #浇水
pdrw(code, token) #任务判断
friend_user_ids = hyid(code, token)
if friend_user_ids:
process_all_friends(friend_user_ids, code, token) # 正确传入朋友ID列表
else:
print("登录失败或获取用户信息失败,跳过当前账号的后续操作。")
if __name__ == "__main__":
main()
'''
def main():
var_name = 'qmzmh'
tokens = get_env_variable(var_name)
if not tokens:
return
total_tokens = len(tokens)
if total_tokens > 20:
print("账号数量超过20个不执行操作。")
return
for index, token_info in enumerate(tokens, start=1):
parts = token_info.split('#')
if len(parts) < 2:
print("令牌格式不正确。跳过处理。")
continue
code = parts[0]
token = parts[1]
remark = parts[2] if len(parts) > 2 else ""
print(f"------账号{index}/{total_tokens},备注: {remark}-------")
login(code, token)#判断要手机号码/提取的电话号码: 才运行下面的任务
cscscs(code, token)#更新
#sj_yg(code, token)#收集阳光
#syyg(code, token)#使用阳光
jscz(code, token) #浇水
pdrw(code, token) #任务判断
friend_user_ids = hyid(code, token)
if friend_user_ids:
process_all_friends(friend_user_ids, code, token) # 正确传入朋友ID列表
if __name__ == "__main__":
main()
'''

View File

@@ -0,0 +1,387 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%88%B1%E5%A5%87%E8%89%BA.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%88%B1%E5%A5%87%E8%89%BA.py
# Repo: jdqlscript/toulu
# Path: 爱奇艺.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 857e96745c59151247fd475ff5a59f974c26d8d4fdac7db5e0938d1241378509
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
# @env : iqyck
# 功能:爱奇艺签到 刷观影时长 做任务领取奖励
# -------------------------------
"""
cookie为爱奇艺整个cookie
export iqyck = "cookie"
"""
from datetime import datetime
from hashlib import md5 as md5Encode
from json import dumps
from time import sleep, time
from os import environ, system, path
from random import randint, choice
from re import findall
from string import digits, ascii_lowercase, ascii_uppercase
from sys import exit, stdout
from uuid import uuid4
import requests
response = requests.get("https://raw.githubusercontent.com/3288588344/toulu/main/tl.txt")
response.encoding = 'utf-8'
txt = response.text
print(txt)
def load_send():
cur_path = path.abspath(path.dirname(__file__))
if path.exists(cur_path + "/notify.py"):
try:
from notify import send
return send
except ImportError:
return False
else:
return False
try:
from requests import Session, get, post
from fake_useragent import UserAgent
except:
print(
"你还没有安装requests库和TL库_useragent库 正在尝试自动安装 请在安装结束后重新执行此脚本\n若还是提示本条消息 请自行运行pip3 install requests和pip3 install fake-useragent或者在青龙的依赖管理里安装python的requests和fake-useragent")
system("pip3 install fake-useragent")
system("pip3 install requests")
print("安装完成 脚本退出 请重新执行")
exit(0)
iqyck = environ.get("iqyck") if environ.get("iqyck") else ""
P00001 = P00003 = dfp = qyid = ""
if iqyck == "":
print("未找到iqy_ck请填写iqy_ck变量")
exit(0)
check_items = ["P00001", "P00003", "QC005", "__dfp"]
for item in check_items:
try:
found = findall(rf"{item}=(.*?)(;|$)", iqyck)
if found:
value = found[0][0]
if item == "P00001":
P00001 = value
elif item == "P00003":
P00003 = value
elif item == "QC005":
qyid = value
elif item == "__dfp":
dfp = value
dfp = dfp.split("@")[0]
else:
print(f"{item}未在iqyck中找到")
except IndexError:
print(f"{item}存在但无法被正确解析")
class IQiYi:
name = "爱奇艺"
def __init__(self):
self.P00001 = P00001
self.userId = P00003
self.dfp = dfp
self.qyid = qyid
self.platform = str(uuid4())[:16],
self.session = Session()
self.user_agent = UserAgent().chrome
self.headers = {
"User-Agent": self.user_agent,
"Cookie": f"P00001={self.P00001}",
'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
'sec-fetch-site': "none",
'sec-fetch-dest': "document",
'accept-language': "zh-CN,zh-Hans;q=0.9",
'sec-fetch-mode': "navigate"
}
self.msg = ""
self.user_info = ""
self.task_info = ""
self.msg = ""
self.taskList = []
self.lotteryList = []
self.shakeLotteryList = []
self.gift_list = []
self.sleep_await = environ.get("sleep_await") if environ.get("sleep_await") else 1
"""工具"""
def req(self, url, req_method="GET", body=None):
data = {}
method = req_method.upper()
if method not in ["GET", "POST", "OTHER"]:
self.print_now(f"错误:不支持的请求方法:{method}")
return
try:
if method == "GET":
response = self.session.get(url, headers=self.headers, params=body)
elif method == "POST":
response = self.session.post(url, headers=self.headers, data=dumps(body))
elif method == "OTHER":
response = self.session.get(url, headers=self.headers, params=dumps(body))
if method in ["GET", "POST"]:
data = response.json()
except requests.exceptions.RequestException as e:
self.print_now(f"请求发送失败,可能为网络异常,异常详细信息:{str(e)}")
return data
def timestamp(self, short=False):
if (short):
return int(time())
return int(time() * 1000)
def md5(self, str):
m = md5Encode(str.encode(encoding='utf-8'))
return m.hexdigest()
def uuid(self, num, upper=False):
str = ''
if upper:
for i in range(num):
str += choice(digits + ascii_lowercase + ascii_uppercase)
else:
for i in range(num):
str += choice(digits + ascii_lowercase)
return str
def print_now(self, content):
print(content)
stdout.flush()
def sign(self):
# lequ-qfe.iqiyi.com
time_stamp = self.timestamp()
data = f'agenttype=20|agentversion=15.5.5|appKey=lequ_rn|appver=15.5.5|authCookie={self.P00001}|qyid={self.qyid}|srcplatform=20|task_code=natural_month_sign|timestamp={time_stamp}|userId={self.userId}|cRcFakm9KSPSjFEufg3W'
url = f'https://community.iqiyi.com/openApi/task/execute?task_code=natural_month_sign&timestamp={time_stamp}&appKey=lequ_rn&userId={self.userId}&authCookie={self.P00001}&agenttype=20&agentversion=15.5.5&srcplatform=20&appver=15.5.5&qyid={self.qyid}&sign={self.md5(data)}'
headers = {
'Content-Type': 'application/json'
}
body = {
"natural_month_sign": {
"verticalCode": "iQIYI",
"agentVersion": "15.4.6",
"authCookie": self.P00001,
"taskCode": "iQIYI_mofhr",
"dfp": self.dfp,
"qyid": self.qyid,
"agentType": 20,
"signFrom": 1
}
}
data = post(url, headers=headers, data=dumps(body)).json()
signDays = None
if 'code' in data and data['code'] == 'A0003':
self.print_now("iqyck已失效请重新获取")
exit(0)
elif 'code' in data and data['code'] == 'A00000':
data_data = data.get('data', {})
msg = data_data.get('msg')
if data_data.get('data'):
signDays = data_data.get('data', {}).get('signDays')
if msg and '已经到达上限' in msg:
self.print_now(f"签到失败,今天已签到")
self.task_info += f"签到失败,今天已签到\n"
elif signDays is not None:
self.print_now(f"签到成功, 本月累计签到{signDays}")
self.task_info += f"签到成功, 本月累计签到{signDays}\n"
if data_data['code'] != 'A0000' and data_data['code'] != 'A0014' and not (data_data.get('success')):
self.print_now(f"签到失败:{msg}")
self.task_info += f"签到失败:{msg}\n"
else:
self.print_now(f"签到失败:{data}")
self.task_info += f"签到失败:{data}\n"
def get_watch_time(self):
url = "https://tc.vip.iqiyi.com/growthAgency/watch-film-duration"
data = self.req(url)
watch_time = data['data']['viewtime']['time']
return watch_time
def watchVideo(self):
totalTime = self.get_watch_time()
if totalTime >= 7200:
self.print_now(f"您的账号今日观影时长大于2小时不执行刷观影时长")
self.task_info += f"今日观影任务已完成\n"
return
self.print_now("正在刷观影时长为减少风控本过程运行大概1个小时")
for i in range(1, 121):
Time = randint(70, 90)
url = f"https://msg.qy.net/b?u=f600a23f03c26507f5482e6828cfc6c5&pu={self.userId}&p1=1_10_101&v=5.2.66&ce={self.uuid(32)}&de=1616773143.1639632721.1639653680.29&c1=2&ve={self.uuid(32)}&ht=0&pt={randint(1000000000, 9999999999) / 1000000}&isdm=0&duby=0&ra=5&clt=&ps2=DIRECT&ps3=&ps4=&br=mozilla%2F5.0%20(windows%20nt%2010.0%3B%20win64%3B%20x64)%20applewebkit%2F537.36%20(khtml%2C%20like%20gecko)%20chrome%2F96.0.4664.110%20safari%2F537.36&mod=cn_s&purl=https%3A%2F%2Fwww.iqiyi.com%2Fv_1eldg8u3r08.html%3Fvfrm%3Dpcw_home%26vfrmblk%3D712211_cainizaizhui%26vfrmrst%3D712211_cainizaizhui_image1%26r_area%3Drec_you_like%26r_source%3D62%2540128%26bkt%3DMBA_PW_T3_53%26e%3Db3ec4e6c74812510c7719f7ecc8fbb0f%26stype%3D2&tmplt=2&ptid=01010031010000000000&os=window&nu=0&vfm=&coop=&ispre=0&videotp=0&drm=&plyrv=&rfr=https%3A%2F%2Fwww.iqiyi.com%2F&fatherid={randint(1000000000000000, 9999999999999999)}&stauto=1&algot=abr_v12-rl&vvfrom=&vfrmtp=1&pagev=playpage_adv_xb&engt=2&ldt=1&krv=1.1.85&wtmk=0&duration={randint(1000000, 9999999)}&bkt=&e=&stype=&r_area=&r_source=&s4={randint(100000, 999999)}_dianshiju_tbrb_image2&abtest=1707_B%2C1550_B&s3={randint(100000, 999999)}_dianshiju_tbrb&vbr={randint(100000, 999999)}&mft=0&ra1=2&wint=3&s2=pcw_home&bw=10&ntwk=18&dl={randint(10, 999)}.27999999999997&rn=0.{randint(1000000000000000, 9999999999999999)}&dfp={dfp}&stime={self.timestamp()}&r={randint(1000000000000000, 9999999999999999)}&hu=1&t=2&tm={Time}&_={self.timestamp()}"
self.req(url, 'other')
totalTime += Time
sleep(randint(30, 50))
if i % 30 == 0:
self.print_now(f"现在已经刷到了{totalTime}秒, 数据同步有延迟, 仅供参考")
if totalTime >= 7200:
sleep(60)
self.print_now(f"今日观影任务已完成")
self.task_info += f"今日观影任务已完成\n"
break
def dailyTask(self):
# 查询任务
"""
status: 0 已完成,未领奖 1 已完成,已领奖 2 未完成
"""
url = f'https://tc.vip.iqiyi.com/taskCenter/task/queryUserTask?P00001={self.P00001}'
data = self.req(url)
if data['code'] == 'A00000':
for item in data["data"].get("tasks", {}).get("daily", []):
if item["taskCode"] != "WatchVideo60mins" and item["status"] != 1:
self.taskList.append(
{
"taskTitle": item["taskTitle"],
"taskCode": item["taskCode"],
"status": item["status"]
}
)
if self.taskList:
for item in self.taskList:
if item["status"] == 2:
# 领任务
url = f'https://tc.vip.iqiyi.com/taskCenter/task/joinTask?P00001={self.P00001}&taskCode={item["taskCode"]}&platform={self.platform}&lang=zh_CN&app_lm=cn'
if self.req(url)['code'] == 'A00000':
sleep(10)
# 完成任务
url = f'https://tc.vip.iqiyi.com/taskCenter/task/notify?taskCode={item["taskCode"]}&P00001={self.P00001}&platform={self.platform}&lang=cn&bizSource=component_browse_timing_tasks&_={self.timestamp()}'
if self.req(url)['code'] == 'A00000':
sleep(2)
if item["status"] == 2 or item["status"] == 0:
# 领取奖励
url = f"https://tc.vip.iqiyi.com/taskCenter/task/getTaskRewards?P00001={self.P00001}&taskCode={item['taskCode']}&lang=zh_CN&platform={self.platform}"
data = self.req(url)
if data['code'] == 'A00000':
price = data['dataNew'][0]["value"]
self.print_now(f"{item['taskTitle']}任务已完成, 获得{int(price[1:])}点成长值")
self.task_info += f"{item['taskTitle']}任务已完成, 获得{int(price[1:])}点成长值\n"
sleep(5)
else:
self.print_now("今日日常浏览任务已全部完成")
self.task_info += "今日日常浏览任务已全部完成\n"
def lottery(self):
url = "https://iface2.iqiyi.com/aggregate/3.0/lottery_activity"
lottery_params = {
"app_k": 0,
"app_v": 0,
"platform_id": 10,
"dev_os": 0,
"dev_ua": 0,
"net_sts": 0,
"qyid": self.qyid,
"psp_uid": self.userId,
"psp_cki": self.P00001,
"psp_status": 3,
"secure_v": 1,
"secure_p": 0,
"req_sn": self.timestamp()
}
params = lottery_params
data = self.req(url, "get", params)
if data.get("code") == 0:
daysurpluschance = int(data.get("daysurpluschance"))
if daysurpluschance == 0:
if self.lotteryList:
self.print_now(f"抽奖奖品:{''.join(self.lotteryList)}")
self.task_info += f"抽奖奖品:{''.join(self.lotteryList)}\n"
else:
self.print_now(f"抽奖次数已用完, 明日再来吧")
self.task_info += f"抽奖次数已用完, 明日再来吧\n"
else:
award_info = data.get("awardName")
self.lotteryList.append(award_info)
sleep(2)
self.lottery()
else:
self.print_now(f"抽奖接口请求失败:{data}\n")
def shake_lottery(self):
url = f'https://act.vip.iqiyi.com/shake-api/lottery?P00001={self.P00001}&dfp={self.dfp}&qyid={self.qyid}&deviceID={self.qyid}&version=15.4.6&agentType=12&platform=bb35a104d95490f6&ptid=02030031010000000000&fv=afc0b50ed49e732d&source=afc0b50ed49e732d&_={self.timestamp()}&vipType=1&lotteryType=0&actCode=0k9GkUcjqqj4tne8&freeLotteryNum=3&extendParams={{"appIds":"iqiyi_pt_vip_iphone_video_autorenew_12m_348yuan_v2","supportSk2Identity":true,"testMode":"0","iosSystemVersion":"17.4.1","bundleId":"com.qiyi.iphone"}}'
data = self.req(url)
if data.get("code") == 'A00000':
award_info = data.get("data", {}).get("title")
self.shakeLotteryList.append(award_info)
sleep(2)
self.shake_lottery()
elif data.get("msg") == "抽奖次数用完":
if self.shakeLotteryList:
self.print_now(f"每天摇一摇奖品:{''.join(self.shakeLotteryList)}")
self.task_info += f"每天摇一摇奖品:{''.join(self.shakeLotteryList)}\n"
else:
self.print_now(f"每天摇一摇次数已用完, 明日再来吧")
self.task_info += f"每天摇一摇次数已用完, 明日再来吧\n"
else:
self.print_now(f'每天摇一摇:{data.get("msg")}\n')
def giveTimes(self):
times_code_list = ["browseWeb", "browseWeb", "bookingMovie"]
for times_code in times_code_list:
url = f"https://pcell.iqiyi.com/lotto/giveTimes?dfp&qyid={self.qyid}&version&deviceId={self.qyid}&_cctimer={self.timestamp()}&actCode=bcf9d354bc9f677c&timesCode={times_code}&P00001={self.P00001}"
data = self.req(url)
def queryTimes(self):
url = f"https://pcell.iqiyi.com/lotto/queryTimes?dfp&qyid={self.qyid}&version&deviceId={self.qyid}&_cctimer={self.timestamp()}&actCode=bcf9d354bc9f677c&P00001={self.P00001}"
data = self.req(url)
if data.get("code") == 'A00000':
times = data["data"]["times"]
return times
def lotto_lottery(self):
self.giveTimes()
times = self.queryTimes()
if times == 0:
self.print_now(f"白金抽奖次数已用完, 明日再来吧")
self.task_info += f"白金抽奖次数已用完, 明日再来吧"
for _ in range(times):
url = f"https://pcell.iqiyi.com/lotto/lottery?dfp&qyid={self.qyid}&version&deviceId={self.qyid}&_cctimer={self.timestamp()}&actCode=bcf9d354bc9f677c&P00001={self.P00001}"
data = self.req(url)
gift_name = data["data"]["giftName"]
if gift_name and "未中奖" not in gift_name:
self.gift_list.append(gift_name)
if self.gift_list:
self.print_now(f"白金抽奖奖品:{''.join(self.gift_list)}")
self.task_info += f"白金抽奖奖品:{''.join(self.gift_list)}"
elif times != 0:
self.print_now(f"很遗憾,白金抽奖未中奖")
self.task_info += f"很遗憾,白金抽奖未中奖"
def get_userinfo(self):
url = f"https://tc.vip.iqiyi.com/growthAgency/v2/growth-aggregation?messageId=b7d48dbba64c4fd0f9f257dc89de8e25&platform=97ae2982356f69d8&P00001={self.P00001}&responseNodes=duration,growth,upgrade,viewTime,growthAnnualCard&_={self.timestamp()}"
data = self.req(url)
growth_info = data['data']['growth']
if data.get("code") == 'A00000':
self.user_info += f"用户昵称:{ data['data']['user']['nickname']}\nVIP等级{growth_info['level']}\nVIP到期时间{growth_info['deadline']}\n今日成长:{growth_info['todayGrowthValue']}\n当前成长:{growth_info['growthvalue']}\n升级还需:{growth_info['distance']}\n"
else:
self.user_info = f"查询失败,未获取到用户信息\n"
def main(self):
self.sign()
self.watchVideo()
self.dailyTask()
self.lottery()
self.shake_lottery()
self.lotto_lottery()
self.print_now(f"任务已经执行完成因爱奇艺观影时间同步较慢这里等待1分钟再查询今日成长值信息\n若不需要等待直接查询,请设置环境变量名 sleep_await = 0")
if int(self.sleep_await) == 1:
sleep(60)
self.get_userinfo()
self.msg = self.user_info + self.task_info
send = load_send()
if callable(send):
send("爱奇艺", self.msg)
else:
print('\n加载通知服务失败')
if __name__ == '__main__':
iqiyi = IQiYi()
iqiyi.main()

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,216 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/stokke.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/stokke.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/stokke.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 1e4d7ea79b5853ad7ec5db7de29a5a427f36451ddc33e75cb713e2cefda272ad
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
cron: 30 9 * * 1
------------------------------------------
#Notice:
stokke 微信小程序 每周签到得积分
WeChatCodeServer 填写wx_server_url wx_auth 用于获取code
变量名称stokke
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("stokke小程序");
const WeChatServer = require("./wcs.js");
let ckName = `stokke`;
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 || 'http://192.168.31.196:12081',
appid: 'wxe232c36aaca3dc1a',
auth: process.env.wx_auth || "your-api-key",
}
);
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = null
this.wcsid = this.user[0]
this.isSign = false
}
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)
}
if (!this.token) {
$.log(`账号[${this.index}] 获取用户Token失败❌`)
return
}
await this.getUserInfo()
await this.doSign()
}
async getUserToken(code) {
let data = ({
"code": code,
"spread_spid": 0,
"type": "routine",
"inviteCode": "",
"inviteTime": ""
});
let options = {
method: 'POST',
url: 'https://www.stokkeshop.cn/api/front/wechat/authorize/program/login?code=' + code,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Content-Type': 'application/json',
'xweb_xhr': '1',
'Authori-zation': '',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wxe232c36aaca3dc1a/54/page-frame.html',
'Accept-Language': 'zh-CN,zh;q=0.9'
},
data: data
};
let {
data: result
} = await axios.request(options);
if (result?.code == '200') {
this.token = result.data.token
$.log(`🌸账号[${this.index}] 获取用户Token成功:${this.token}`)
} else {
$.log(`🌸账号[${this.index}] 获取用户Token-失败:${result.message}`)
}
}
async getUserInfo() {
let options = {
method: 'GET',
url: `https://www.stokkeshop.cn/api/front/user`,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Content-Type': 'application/json',
'xweb_xhr': '1',
'Authori-zation': '' + this.token + '',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wxe232c36aaca3dc1a/54/page-frame.html',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
}
let {
data: result
} = await axios.request(options);
if (result?.code == '200') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `[${result.data.nickname}] 积分[${result.data.integral}]🎉`);
} else {
$.log(`🌸账号[${this.index}] 获取用户信息-失败:${result.message}`)
}
}
async doSign() {
let options = {
method: 'POST',
url: `https://www.stokkeshop.cn/api/front/integral-task/finishWeekSign`,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Content-Type': 'application/json',
'xweb_xhr': '1',
'Authori-zation': '' + this.token + '',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wxe232c36aaca3dc1a/54/page-frame.html',
'Accept-Language': 'zh-CN,zh;q=0.9'
},
data: {}
};
let {
data: result
} = await axios.request(options);
if (result?.code == '200') {
//打印签到结果
$.log(`签到成功 🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.message}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
if (process.env['wx_server_url'] && process.env['wx_auth']) {
for (let user of $.userList) {
await new Task(user).run();
}
} else {
$.log(`${ckName}未配置微信SERVER配置 搭建可看仓库目录下的readme.md❌`)
return
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,973 @@
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/tianyi.py
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/tianyi.py
# Repo: smallfawn/QLScriptPublic
# Path: tianyi.py
# UploadedAt: 2026-04-01T11:27:33Z
# SHA256: b953df84d60d64163160620c6cddf66ccca375f3794ca42dff66c46d48401660
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
"""
中国电信首页 → 天翼智铃
"""
import os
import re
import ssl
import json
import time
import random
import string
import base64
import hashlib
import datetime
import requests
from hashlib import md5
from http import cookiejar
from Crypto.Cipher import AES, DES3
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Util.Padding import pad, unpad
ACTIVITY_MODE = os.environ.get("ACTIVITY_MODE", "new_year")
CHANNEL_ID = "156000007489"
INVITATION_CODE = ""
ACTIVITY_ID = "ai089"
VIDEO_ID = ""
# 账号配置:格式 "手机号#密码" 或 "手机号@密码"
ACCOUNTS_STR = os.environ.get("chinaTelecomAccount", "")
MAKE_COUNT = 3
MIN_SCORE_TO_LOTTERY = 0
context = ssl.create_default_context()
context.set_ciphers('DEFAULT@SECLEVEL=1')
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
class DESAdapter(requests.adapters.HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
kwargs['ssl_context'] = context
return super().init_poolmanager(*args, **kwargs)
class BlockAll(cookiejar.CookiePolicy):
return_ok = set_ok = domain_return_ok = path_return_ok = lambda self, *args, **kwargs: False
netscape = True
rfc2965 = hide_cookie2 = False
key = b'1234567`90koiuyhgtfrdews'
iv = 8 * b'\0'
public_key_b64 = '''-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBkLT15ThVgz6/NOl6s8GNPofdWzWbCkWnkaAm7O2LjkM1H7dMvzkiqdxU02jamGRHLX/ZNMCXHnPcW/sDhiFCBN18qFvy8g6VYb9QtroI09e176s+ZCtiv7hbin2cCTj99iUpnEloZm19lwHyo69u5UMiPMpq0/XKBO8lYhN/gwIDAQAB
-----END PUBLIC KEY-----'''
requests.packages.urllib3.disable_warnings()
ss = requests.session()
ss.headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 13; 22081212C) AppleWebKit/537.36"}
ss.mount('https://', DESAdapter())
ss.cookies.set_policy(BlockAll())
def encrypt_3des(text):
cipher = DES3.new(key, DES3.MODE_CBC, iv)
ciphertext = cipher.encrypt(pad(text.encode(), DES3.block_size))
return ciphertext.hex()
def decrypt_3des(text):
ciphertext = bytes.fromhex(text)
cipher = DES3.new(key, DES3.MODE_CBC, iv)
plaintext = unpad(cipher.decrypt(ciphertext), DES3.block_size)
return plaintext.decode()
def b64_rsa(plaintext):
public_key = RSA.import_key(public_key_b64)
cipher = PKCS1_v1_5.new(public_key)
ciphertext = cipher.encrypt(plaintext.encode())
return base64.b64encode(ciphertext).decode()
def encode_phone(text):
return ''.join(chr(ord(char) + 2) for char in text)
def generate_random_string(length=16):
return ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(length))
def md5_hash(data):
return hashlib.md5(data.encode('utf-8')).hexdigest()
def encryptmd5(timestamp, randomnum):
md5_e = md5_hash(str(timestamp))
base64_encoded = base64.b64encode((md5_e + randomnum).encode()).decode()
return md5_hash(base64_encoded + randomnum)
def encrypt_request(data, t, e, i):
n = json.dumps({k: v for k, v in data.items() if v is not None}, separators=(',', ':'))
encoded_t = base64.b64encode(t.encode()).decode()
encoded_e = base64.b64encode(e.encode()).decode()
s = md5((encoded_t + md5(e.encode()).hexdigest() + i).encode()).hexdigest()[:16]
o = md5((encoded_e + md5(t.encode()).hexdigest() + i).encode()).hexdigest()[:16]
cipher = AES.new(s.encode(), AES.MODE_CBC, iv=o.encode())
padded_data = pad(n.encode(), AES.block_size)
encrypted_data = cipher.encrypt(padded_data)
return base64.b64encode(encrypted_data).decode()
def decrypt_response(encrypted_base64, t, e, i):
encoded_t = base64.b64encode(t.encode()).decode()
encoded_e = base64.b64encode(e.encode()).decode()
n = md5((encoded_e + i + md5(t.encode()).hexdigest()).encode()).hexdigest()[:16]
s = md5((encoded_t + i + md5(e.encode()).hexdigest()).encode()).hexdigest()[:16]
cipher = AES.new(n.encode(), AES.MODE_CBC, iv=s.encode())
encrypted_data = base64.b64decode(encrypted_base64)
decrypted_data = cipher.decrypt(encrypted_data)
unpadded_data = unpad(decrypted_data, AES.block_size)
return json.loads(unpadded_data.decode())
def parse_accounts(accounts_str: str) -> list:
accounts = []
for part in accounts_str.replace("\n", "&").replace("\r", "").split("&"):
part = part.strip()
if "#" in part:
phone, pwd = part.split("#", 1)
elif "@" in part:
phone, pwd = part.split("@", 1)
else:
continue
phone, pwd = phone.strip(), pwd.strip()
if phone and pwd:
accounts.append((phone, pwd))
return accounts
def userLoginNormal(phone, password):
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
rdmstr = ''.join(random.choices('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', k=16))
login_cipher = f'iPhone 14 15.4.{rdmstr[:12]}{phone}{timestamp}{password}0$$$0.'
payload = {
"headerInfos": {
"code": "userLoginNormal", "timestamp": timestamp, "broadAccount": "", "broadToken": "",
"clientType": "#11.3.0#channel50#iPhone 14 Pro Max#", "shopId": "20002",
"source": "110003", "sourcePassword": "Sid98s", "token": "", "userLoginName": encode_phone(phone)
},
"content": {
"attach": "test",
"fieldData": {
"loginType": "4", "accountType": "", "loginAuthCipherAsymmertric": b64_rsa(login_cipher),
"deviceUid": rdmstr, "phoneNum": encode_phone(phone), "isChinatelecom": "0",
"systemVersion": "15.4.0", "authentication": encode_phone(password)
}
}
}
r = ss.post('https://appgologin.189.cn:9031/login/client/userLoginNormal', json=payload)
data = r.json()
response_data = data.get('responseData')
if response_data:
data_inner = response_data.get('data')
if data_inner:
login_result = data_inner.get('loginSuccessResult')
if login_result:
return login_result
print(f"登录响应: {data}")
return None
def get_ticket(phone, userId, token):
import re
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
xml_data = f'<Request><HeaderInfos><Code>getSingle</Code><Timestamp>{timestamp}</Timestamp>' \
f'<BroadAccount></BroadAccount><BroadToken></BroadToken>' \
f'<ClientType>#9.6.1#channel50#iPhone 14 Pro Max#</ClientType><ShopId>20002</ShopId>' \
f'<Source>110003</Source><SourcePassword>Sid98s</SourcePassword><Token>{token}</Token>' \
f'<UserLoginName>{phone}</UserLoginName></HeaderInfos><Content><Attach>test</Attach>' \
f'<FieldData><TargetId>{encrypt_3des(userId)}</TargetId>' \
f'<Url>4a6862274835b451</Url></FieldData></Content></Request>'
r = ss.post('https://appgologin.189.cn:9031/map/clientXML', data=xml_data,
headers={'user-agent': 'CtClient;10.4.1;Android;13;22081212C;NTQzNzgx!#!MTgwNTg1'})
tk = re.findall('<Ticket>(.*?)</Ticket>', r.text)
if tk:
return decrypt_3des(tk[0])
return None
def sso_login_v2(ticket):
payload = {"portal": "45", "channelId": CHANNEL_ID, "ticket": ticket}
headers = {
'User-Agent': "CtClient;11.3.0;Android;12;Redmi K30 Pro;MDAyNDUy!#!MTgwMjQ",
'Content-Type': "application/json"
}
r = requests.post("https://ai.imusic.cn/vapi/vue_login/sso_login_v2",
data=json.dumps(payload), headers=headers)
if r.status_code == 200:
data = r.json()
if data.get("token"):
return data.get("token"), r.cookies.get_dict()
return None, None
class InviteAPI:
BASE_URL = "https://ai.imusic.cn"
def __init__(self, token: str, cookies: dict = None):
self.token = token
self.session = requests.Session()
self.session.mount('https://', DESAdapter())
if cookies:
self.session.cookies.update(cookies)
self.session.headers.update({
"User-Agent": "CtClient;11.3.0;Android;12;Redmi K30 Pro;ODAwODUw!#!MTg2MDg",
"Accept": "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Origin": self.BASE_URL,
"Authorization": f"Bearer {token}",
"Referer": f"{self.BASE_URL}/h5v/fusion/ai-luck-flow?ca=AP3V&cc={CHANNEL_ID}&utm_scha=utm_ch-010001002009.utm_sch-hg_xx_qlxx-1-104705800001-105782800001.utm_af-1000000037.utm_as-158492900001.utm_sd1-default",
"X-Requested-With": "com.ct.client",
"sec-ch-ua": '"Chromium";v="140", "Not=A?Brand";v="24", "Android WebView";v="140"',
"sec-ch-ua-mobile": "?1",
"sec-ch-ua-platform": '"Android"',
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Dest": "empty",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
})
def request_plain(self, endpoint: str, params: dict = None) -> dict:
url = f"{self.BASE_URL}{endpoint}"
response = self.session.post(url, params=params, timeout=30)
return response.json()
def request_encrypted(self, endpoint: str, params: dict) -> dict:
self.session.headers["imencrypt"] = "1"
imrandomnum = generate_random_string(16)
imtimestamp = str(int(time.time() * 1000))
imencryptkey = encryptmd5(imtimestamp, imrandomnum)
form_data = {"channelId": CHANNEL_ID, "portal": "45"}
form_data.update(params)
encrypted_form = encrypt_request(form_data, imrandomnum, imtimestamp, imencryptkey)
headers = {
"imencryptkey": imencryptkey,
"imrandomnum": imrandomnum,
"imtimestamp": imtimestamp,
}
url = f"{self.BASE_URL}{endpoint}"
response = self.session.post(url, params={"formData": encrypted_form}, headers=headers, timeout=30)
new_auth = response.headers.get("Authorization")
if new_auth:
self.token = new_auth
self.session.headers["Authorization"] = f"Bearer {new_auth}"
try:
return decrypt_response(response.text, imrandomnum, imtimestamp, imencryptkey)
except:
return {"raw": response.text}
def get_user_info(self, mobile: str) -> dict:
params = {"channelId": CHANNEL_ID, "portal": "45", "mobile": mobile}
return self.request_plain("/vapi/new_member/get_user_info", params)
def check_user_state(self, mobile: str) -> dict:
params = {"mobile": mobile, "is4G": "1", "is5G": "1", "isDX": "1", "channelId": CHANNEL_ID, "portal": "45"}
return self.request_plain("/vapi/vrbt/check_user_state", params)
def query_template_list(self, page_no: int = 1, page_size: int = 10) -> dict:
params = {
"pageNo": page_no, "pageSize": page_size, "activityId": ACTIVITY_ID,
"apiName": "diy/DiyVideoApi/queryActRecommendTemplateList",
"channelId": CHANNEL_ID, "portal": "45"
}
return self.request_plain("/hapi/de/api", params)
def send_stat_message(self, mobile: str, actname: str, actparam: str) -> dict:
params = {
"mobile": mobile,
"actname": actname,
"actparam": actparam
}
return self.request_encrypted("/vapi/vue_stat/sendMessage", params)
def template_make(self, mobile: str, template_id: str, template_conf_id: str,
template_name: str, user_words: str = "", arrange_id: str = "", **kwargs) -> dict:
params = {
"channelId": CHANNEL_ID,
"portal": "45",
"mobile": mobile,
"openId": "",
"makeId": "",
"background": "",
"userPhotos": "",
"userWords": user_words,
"templateName": template_name,
"videoName": template_name,
"templateId": template_id,
"templateConfId": template_conf_id,
"aid": ACTIVITY_ID,
"aiPack": 0,
"arrangeId": arrange_id,
"autoOrderUgc": 0,
"aiGatewayImagMakeId": "",
"fromType": "",
"sessionId": ""
}
params.update(kwargs)
return self.request_encrypted("/hapi/diy_video/au/template_make_add_v2", params)
def get_score(self, mobile: str, score_type: int = 1) -> dict:
params = {
"activityId": ACTIVITY_ID,
"mobile": mobile,
"type": score_type,
"apiName": "act/ActApi/getDoubleTotalScoreOrRemainingScore"
}
return self.request_encrypted("/hapi/en/api", params)
def do_lottery(self, mobile: str) -> dict:
params = {
"activityId": ACTIVITY_ID,
"mobile": mobile,
"apiName": "act/ActApi/doubleFestivalLottery"
}
return self.request_encrypted("/hapi/en/api", params)
def do_egg_lottery(self, mobile: str, activity_id: str = "1611") -> dict:
params = {
"activityId": activity_id,
"mobile": mobile,
"apiName": "act/ActApi/doubleEggLottery"
}
return self.request_encrypted("/hapi/en/api", params)
def get_lottery_times(self, mobile: str, activity_id: str = "1611") -> dict:
params = {
"mobile": mobile,
"activityId": activity_id
}
return self.request_encrypted("/hapi/activity/au/get_act_lottery_times", params)
def query_new_year_templates(self, page_no: int = 1, page_size: int = 500) -> dict:
params = {
"pageNo": page_no,
"pageSize": page_size,
"activityId": "0090_2",
"apiName": "diy/DiyVideoApi/queryActRecommendTemplateList",
"channelId": CHANNEL_ID,
"portal": "45"
}
return self.request_plain("/hapi/de/api", params)
def make_new_year_video(self, mobile: str, template_data: dict) -> dict:
template_id = template_data.get("templateId", "")
template_conf_id = template_data.get("templateConfId", "")
video_name = template_data.get("videoName", "")
user_words = template_data.get("userWords", "")
random_suffix = random.randint(100000, 999999)
video_name_with_suffix = f"{video_name}{random_suffix}"
params = {
"mobile": mobile,
"openId": "",
"background": template_id,
"userPhotos": "",
"userWords": user_words,
"templateName": "",
"videoName": video_name_with_suffix,
"templateId": template_id,
"templateConfId": template_conf_id,
"aid": "ai090",
"inviterMobile": "",
"arrangeId": "",
"autoOrderUgc": 0,
"aiGatewayImagMakeId": "",
"fromType": "",
"sessionId": ""
}
return self.request_encrypted("/hapi/diy_video/au/template_make_add_v2", params)
def ai_agent_chat(self, mobile: str, content: str, agent_id: str = "", from_act: str = "cny", session_id: str = "") -> dict:
params = {
"apiName": "diy/AiAgentChatApi/aiAgentChat",
"content": content,
"mobile": mobile,
"agentId": agent_id,
"fromAct": from_act,
"sessionId": session_id
}
return self.request_encrypted("/hapi/en/api", params)
def control_confirm_submit(self, mobile: str, session_id: str, confirm_id: int, text_list: list,
agent_id: str = "text_to_image", from_act: str = "cny") -> dict:
params = {
"apiName": "diy/AiAgentChatApi/controlConfirmSubmit",
"content": "",
"mobile": mobile,
"sessionId": session_id,
"confirmId": confirm_id,
"channelId": "",
"portal": "45",
"agentId": agent_id,
"triggerSource": "card_submit",
"textList": text_list,
"fromAct": from_act
}
return self.request_encrypted("/hapi/en/api", params)
def check_ai_agent_result(self, mobile: str, task_id: str) -> dict:
params = {
"apiName": "diy/AiAgentChatApi/checkAiAgentResult",
"mobile": mobile,
"taskId": task_id
}
return self.request_encrypted("/hapi/en/api", params)
def query_person_tasks(self, mobile: str, activity_id: str = "ai090") -> dict:
params = {
"apiName": "act/ActApi/queryPersonTasks",
"mobile": mobile,
"activityId": activity_id
}
return self.request_encrypted("/hapi/en/api", params)
def query_red_packet_balance(self, mobile: str, activity_id: str = "1611") -> dict:
params = {
"apiName": "act/ActApi/doubleEggCostRedeemInfo",
"mobile": mobile,
"activityId": activity_id
}
return self.request_encrypted("/hapi/en/api", params)
def redeem_red_packet(self, mobile: str, cost_value: float, activity_id: str = "1611") -> dict:
params = {
"apiName": "act/ActApi/doubleEggCostRedeem",
"mobile": mobile,
"activityId": activity_id,
"costValue": cost_value
}
return self.request_encrypted("/hapi/en/api", params)
def process_new_year_lottery(phone: str, password: str, account_idx: int = 0, total_accounts: int = 0):
print(f"\n{'='*50}")
print(f"处理账号: {phone} ({account_idx}/{total_accounts})")
print(f"活动: 2026新年星辰")
print(f"{'='*50}")
print("\n[1] 账密登录...")
login_result = userLoginNormal(phone, password)
if not login_result:
print("❌ 登录失败")
return False
print("✓ 登录成功")
print("\n[2] 获取ticket...")
ticket = get_ticket(phone, login_result['userId'], login_result['token'])
if not ticket:
print("❌ 获取ticket失败")
return False
print("✓ 获取ticket成功")
print("\n[3] SSO登录...")
token, cookies = sso_login_v2(ticket)
if not token:
print("❌ SSO登录失败")
return False
print(f"✓ SSO登录成功")
api = InviteAPI(token, cookies)
print("\n[4] 查询任务状态...")
tasks_result = api.query_person_tasks(phone)
task1_completed = False
task2_completed = False
if tasks_result.get("code") == "0000":
tasks = tasks_result.get("data", {}).get("tasks", [])
print(f"✓ 获取到 {len(tasks)} 个任务\n")
for task in tasks:
task_name = task.get("taskName", "")
task_type = task.get("taskType", "")
task_state = task.get("taskState", 0) # 0=未完成, 1=已完成
current_progress = task.get("currentProgress", 0)
target_progress = task.get("targetProgress", 0)
lottery_count = task.get("lotteryCount", 0)
state_text = "✓ 已完成" if task_state == 1 else "○ 未完成"
print(f" {state_text} {task_name} ({current_progress}/{target_progress}) - 奖励: +{lottery_count}")
if task_type == "video_make":
task1_completed = (task_state == 1)
elif task_type == "ai_agent_chat":
task2_completed = (task_state == 1)
print()
else:
print(f"⚠ 查询失败,继续执行任务\n")
print("[5] 查询初始抽奖次数...")
lottery_times_result = api.get_lottery_times(phone)
if lottery_times_result.get("code") == "0000":
initial_times = lottery_times_result.get("data", 0)
print(f"✓ 当前抽奖次数: {initial_times}")
else:
print(f"⚠ 查询失败")
initial_times = 0
print("\n" + "="*50)
print("【任务1】制作同款视频获得抽奖次数")
print("="*50)
if task1_completed:
print("\n✓ 任务1已完成跳过")
task1_success = True
else:
print("\n[6] 查询新年模板列表...")
templates_result = api.query_new_year_templates()
if templates_result.get("code") != "0000":
print(f"❌ 获取模板列表失败: {templates_result}")
task1_success = False
else:
template_list = templates_result.get("data", {}).get("list", [])
if not template_list:
print("❌ 模板列表为空")
task1_success = False
else:
print(f"✓ 获取到 {len(template_list)} 个模板")
print(f"\n[7] 开始制作视频 (共3次)...")
task1_success_count = 0
available_templates = template_list.copy()
success_count = 0
attempt_count = 0
max_attempts = min(len(available_templates), 10) # 最多尝试10次
while success_count < 3 and attempt_count < max_attempts and available_templates:
attempt_count += 1
template = random.choice(available_templates)
video_name = template.get("videoName", "")
template_id = template.get("templateId", "")
user_words = template.get("userWords", "")
print(f"\n 制作第 {success_count + 1}/3 次 (尝试 {attempt_count})...")
print(f" 模板: {video_name} (ID: {template_id})")
if not template_id or not user_words:
print(f" ⚠ 模板缺少必要字段,跳过此模板")
available_templates.remove(template)
continue
result = api.make_new_year_video(phone, template)
code = result.get("code", "")
msg = result.get("message", result.get("desc", str(result)))
available_templates.remove(template)
if code == "0000":
data = result.get("data", {})
add_lottery_times = data.get("addLotteryTimes", 0)
add_huango_times = data.get("addHuanGoLotteryTimes", "0")
print(f" ✓ 制作成功! 获得抽奖次数: {add_lottery_times}, 换购次数: {add_huango_times}")
success_count += 1
task1_success_count += 1
else:
print(f" ✗ 制作失败: {msg},尝试下一个模板")
if success_count < 3 and available_templates:
time.sleep(1)
print(f"\n任务1完成: {success_count}/3 成功 (共尝试 {attempt_count} 次)")
task1_success = success_count > 0
lottery_times_result = api.get_lottery_times(phone)
if lottery_times_result.get("code") == "0000":
after_task1_times = lottery_times_result.get("data", 0)
print(f"✓ 当前抽奖次数: {after_task1_times}")
else:
print(f"⚠ 查询失败")
after_task1_times = initial_times
print("\n" + "="*50)
print("【任务2】去智能体创作获得抽奖次数")
print("="*50)
if task2_completed:
print("\n✓ 任务2已完成跳过")
task2_success_count = 3
else:
ai_prompts = [
"生成一张马年春节窗花剪纸的图片",
"生成一张新年祝福的中国风图片",
"生成一张春节喜庆氛围的图片"
]
print(f"\n[9] 开始AI对话生成图片 (共3次)...")
task2_success_count = 0
session_id = ""
for chat_idx in range(3):
prompt = ai_prompts[chat_idx % len(ai_prompts)]
print(f"\n === 第 {chat_idx + 1}/3 次生成 ===")
print(f" 提示词: {prompt}")
print(f" [1/3] 发起AI对话...")
result1 = api.ai_agent_chat(phone, prompt, session_id=session_id)
code1 = result1.get("code", "")
if code1 != "0000":
msg = result1.get("desc", result1.get("message", "未知错误"))
print(f" ✗ 对话失败: {msg}")
continue
data1 = result1.get("data", {})
session_id = data1.get("sessionId", "")
confirm_id = data1.get("id", 0)
card_params = data1.get("cardParameterList", {})
text_list = card_params.get("textList", [])
print(f" ✓ 对话成功confirmId: {confirm_id}")
if not text_list:
print(f" ⚠ textList为空跳过此次生成")
continue
print(f" [2/3] 确认提交生成...")
result2 = api.control_confirm_submit(phone, session_id, confirm_id, text_list)
code2 = result2.get("code", "")
if code2 != "0000":
msg = result2.get("desc", result2.get("message", "未知错误"))
print(f" ✗ 提交失败: {msg}")
continue
data2 = result2.get("data", {})
task_id = data2.get("taskId", "")
content = data2.get("content", "")
print(f" ✓ 提交成功taskId: {task_id}")
print(f" 响应: {content[:80]}..." if len(content) > 80 else f" 响应: {content}")
print(f" [3/3] 等待生成完成...这步冗余,保留了")
max_check_times = 15
check_interval = 2
for check_idx in range(max_check_times):
time.sleep(check_interval)
result3 = api.check_ai_agent_result(phone, task_id)
code3 = result3.get("code", "")
desc3 = result3.get("desc", "")
if code3 == "0000":
print(f" ✓ 生成完成! ({check_idx + 1}次检查)")
task2_success_count += 1
break
elif code3 == "10008":
print(f" ⏳ 制作中... ({check_idx + 1}/{max_check_times})")
continue
else:
print(f" ✗ 生成失败: {desc3}")
break
else:
print(f" ⚠ 等待超时,跳过")
if chat_idx < 2:
print(f" 等待2秒后进行下一次生成...")
time.sleep(2)
print(f"\n任务2完成: {task2_success_count}/3 成功")
print("\n" + "="*50)
print("【抽奖环节】")
print("="*50)
print("\n[9] 查询最终抽奖次数...")
lottery_times_result = api.get_lottery_times(phone)
if lottery_times_result.get("code") == "0000":
final_times = lottery_times_result.get("data", 0)
print(f"✓ 最终抽奖次数: {final_times}")
else:
print(f"⚠ 查询失败,跳过抽奖")
final_times = 0
total_red_packet = 0.0 # 累计红包金额
if final_times > 0:
print(f"\n开始抽奖 (共{final_times}次)...")
lottery_success = 0
awards = []
for lottery_idx in range(final_times):
print(f"\n{lottery_idx + 1}/{final_times} 次抽奖...")
lottery_result = api.do_egg_lottery(phone)
if lottery_result.get("code") == "0000":
data = lottery_result.get("data", {})
award_name = data.get("awardName", "未知奖品")
awards.append(award_name)
print(f"{award_name}")
lottery_success += 1
money_match = re.search(r'(\d+\.?\d*)元', award_name)
if money_match:
money = float(money_match.group(1))
total_red_packet += money
else:
msg = lottery_result.get("desc", lottery_result.get("message", "未知错误"))
print(f" ✗ 抽奖失败: {msg}")
if lottery_idx < final_times - 1:
time.sleep(0.5) # 抽奖间隔
print(f"\n抽奖完成: {lottery_success}/{final_times} 成功")
if awards:
print(f"获得奖品: {', '.join(awards)}")
if total_red_packet > 0:
print(f"累计红包: {total_red_packet:.2f}")
else:
print(f"\n跳过抽奖 (抽奖次数为0)")
print(f"\n查询红包余额...")
balance_result = api.query_red_packet_balance(phone)
if balance_result.get("code") == "0000":
data = balance_result.get("data", {})
already_redeem = data.get("alreadyRedeemValue", "0")
balance_cost = data.get("balanceCostValue", "0")
already_redeem_costs = data.get("alreadyRedeemCosts", [])
print(f" ✓ 查询成功!")
print(f" 累计已兑换: {already_redeem}")
print(f" 剩余可兑换: {balance_cost}")
if already_redeem_costs:
print(f" 已兑换记录:")
for record in already_redeem_costs:
award_name = record.get("awardName", "")
update_date = record.get("updateDate", "")
print(f" - {award_name} ({update_date})")
try:
balance_float = float(balance_cost)
if balance_float >= 2.0:
print(f"\n 💰 可兑换金额已满2元开始兑换...")
redeem_result = api.redeem_red_packet(phone, balance_float)
if redeem_result.get("code") == "0000":
redeem_data = redeem_result.get("data", {})
extract_value = redeem_data.get("extractValue", "0")
new_already_redeem = redeem_data.get("alreadyRedeemValue", "0")
new_balance = redeem_data.get("balanceCostValue", "0")
print(f" ✓ 兑换成功!")
print(f" 本次提取: {extract_value}")
print(f" 累计已兑换: {new_already_redeem}")
print(f" 剩余可兑换: {new_balance}")
else:
msg = redeem_result.get("desc", redeem_result.get("message", "未知错误"))
print(f" ✗ 兑换失败: {msg}")
else:
print(f" 需满2元才能兑换还差{2.0 - balance_float:.2f}元)")
except Exception as e:
print(f" ⚠ 处理失败: {e}")
else:
msg = balance_result.get("desc", balance_result.get("message", "未知错误"))
print(f" ✗ 查询失败: {msg}")
stat_result = api.send_stat_message(
phone,
"activity_2512new-year-2026_30.1",
"activityID_ai090_ca_dljA"
)
if stat_result.get("code") == "0000":
pass
else:
print(f"发送失败: {stat_result.get('desc', '')}")
print(f"\n{'='*50}")
print(f"账号 {phone} 处理完成")
print(f"{'='*50}")
return task1_success or task2_success_count > 0
def process_account(phone: str, password: str, account_idx: int = 0, total_accounts: int = 0):
print(f"\n{'='*50}")
print(f"处理账号: {phone} ({account_idx}/{total_accounts})")
print(f": {INVITATION_CODE[:20]}...")
print(f"{'='*50}")
print("\n[1] 账密登录...")
login_result = userLoginNormal(phone, password)
if not login_result:
print("❌ 登录失败")
return False
print("✓ 登录成功")
print("\n[2] 获取ticket...")
ticket = get_ticket(phone, login_result['userId'], login_result['token'])
if not ticket:
print("❌ 获取ticket失败")
return False
print("✓ 获取ticket成功")
print("\n[3] SSO登录...")
token, cookies = sso_login_v2(ticket)
if not token:
print("❌ SSO登录失败")
return False
print(f"✓ SSO登录成功token: {token[:50]}...")
api = InviteAPI(token, cookies)
print("\n获取用户信息...")
user_info = api.get_user_info(phone)
if user_info.get("code") == "0000":
print(f"✓ 用户信息获取成功")
else:
print(f"用户信息: {user_info}")
# Step 7: 检查用户状态
print("\n[6] 检查用户状态...")
user_state = api.check_user_state(phone)
print(f"用户状态: {user_state}")
# Step 8: 查询推荐模板列表
print("\n[8] 查询推荐模板列表...")
templates = api.query_template_list()
template_list = templates.get("data", {}).get("list", [])
if not template_list:
print("❌ 未获取到模板列表")
return False
print(f"✓ 获取到 {len(template_list)} 个模板")
# Step 9: 选择第一个模板进行制作
tpl = template_list[0]
template_id = tpl.get("templateId", "")
template_conf_id = tpl.get("templateConfId", "")
video_name = tpl.get("videoName", "")
user_words = tpl.get("userWords1", "1234")
arrange_id = str(tpl.get("arrangeId", ""))
# 如果有输入限制,生成符合要求的内容
word_min = tpl.get("wordMinCount", 0)
limit_regular = tpl.get("limitRegular", "")
if limit_regular == "/^\\d+$/" and word_min > 0:
# 数字输入(如手机尾号)
user_words = phone[-word_min:] if len(phone) >= word_min else phone
elif word_min > 0 and not user_words:
user_words = "接福" # 默认文字
print(f"\n[9] 开始制作模板 (共{MAKE_COUNT}次)...")
print(f" 模板: {video_name}")
print(f" 模板ID: {template_id}")
print(f" 配置ID: {template_conf_id}")
print(f" 用户输入: {user_words}")
print(f" : {INVITATION_CODE[:20]}...")
# Step 10: 循环制作
success_count = 0
for make_idx in range(MAKE_COUNT):
print(f"\n 制作第 {make_idx + 1}/{MAKE_COUNT} 次...")
result = api.template_make(
mobile=phone,
template_id=template_id,
template_conf_id=template_conf_id,
template_name=video_name,
user_words=user_words,
arrange_id=arrange_id
)
msg = result.get("message", result.get("desc", str(result)))
code = result.get("code", "")
print(f" 结果: {msg}")
if code == "0000":
success_count += 1
if make_idx < MAKE_COUNT - 1:
time.sleep(0.5)
print(f"\n制作完成: {success_count}/{MAKE_COUNT} 成功")
if success_count > 0:
actparam_base = f"activityID_{ACTIVITY_ID}_templateID_{template_id}_entrance_{CHANNEL_ID}_templateConfID_{template_conf_id}_ca_AP3V"
stat_events = [
("activity_vring_make_20250616", actparam_base),
("activity_2511AI-makeonekey_9.2", actparam_base),
("activity_vring_make_1.9", f"_activityID_{ACTIVITY_ID}_templateID_{template_id}_entrance_{CHANNEL_ID}_templateconfID_{template_conf_id}_ca_AP3V"),
("activity_2511AI-makeonekey_1.6", f"activityID_{ACTIVITY_ID}_templateID_{template_id}_entrance_{CHANNEL_ID}_templateconfID_{template_conf_id}_ca_AP3V"),
("page_2511AI-makeonekey_9", actparam_base),
("page_2511AI-makeonekey_3", actparam_base),
("with_vring_display_20250616", actparam_base),
("with_vring_slide_display_20250829", actparam_base),
("with_vring_stay_duration", f"activityID_{ACTIVITY_ID}_entrance_{CHANNEL_ID}_duration_15_ca_AP3V"),
]
for actname, actparam in stat_events:
try:
stat_result = api.send_stat_message(phone, actname, actparam)
if stat_result.get("code") == "0000":
print(f"{actname}")
else:
print(f"{actname}: {stat_result.get('desc', '')}")
except Exception as e:
print(f"{actname}: {str(e)}")
time.sleep(0.1)
print("\n查看积分...")
score_result = api.get_score(phone)
current_score = 0
if score_result.get("code") == "0000":
current_score = int(score_result.get("data", "0"))
print(f"✓ 当前积分: {current_score}")
else:
print(f"积分查询: {score_result}")
if MIN_SCORE_TO_LOTTERY > 0 and current_score >= MIN_SCORE_TO_LOTTERY:
print(f"\n[13] 抽奖 (积分{current_score} >= 阈值{MIN_SCORE_TO_LOTTERY})...")
lottery_result = api.do_lottery(phone)
if lottery_result.get("code") == "0000":
award_data = lottery_result.get("data", {})
award_name = award_data.get("awardName", "未知")
print(f"✓ 抽奖结果: {award_name}")
else:
print(f"抽奖失败: {lottery_result}")
elif MIN_SCORE_TO_LOTTERY == 0:
print(f"\n[13] 跳过抽奖 (阈值设为0不抽奖)")
else:
print(f"\n[13] 跳过抽奖 (积分{current_score} < 阈值{MIN_SCORE_TO_LOTTERY})")
if success_count > 0:
print("✓ 兑换成功!")
return True
else:
print("❌ 兑换失败")
return False
def main():
accounts = parse_accounts(ACCOUNTS_STR)
if not accounts:
print("错误: 未配置账号")
return
print("=" * 50)
print("电信彩玲AI脚本 - 2026新年星辰活动")
print(f"渠道ID: {CHANNEL_ID}")
print(f"{len(accounts)} 个账号")
print("=" * 50)
print("\n活动说明:")
print(" 任务1: 制作新年视频 (3次) → 获得抽奖次数")
print(" 任务2: AI对话生成图片 (3次) → 获得抽奖次数")
print(" 最后: 使用获得的次数进行抽奖")
print("=" * 50)
total = len(accounts)
success_count = 0
for idx, (phone, password) in enumerate(accounts):
if process_new_year_lottery(phone, password, idx + 1, total):
success_count += 1
if idx < len(accounts) - 1:
print(f"\n等待3秒后处理下一个账号...")
time.sleep(3)
print(f"\n{'='*50}")
print(f"全部处理完成: {success_count}/{total} 成功")
print(f"{'='*50}")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,159 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/this%E5%AE%98%E6%96%B9%E5%95%86%E5%9F%8E.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/this%E5%AE%98%E6%96%B9%E5%95%86%E5%9F%8E.js
// # Repo: jdqlscript/toulu
// # Path: this官方商城.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 7916a72936d4a9aacda86d9ab03280f95d2d9d04e8e84383fb0829be122e04cd
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn 860562056
@Date: 2024.06.09 13.27
@Description: this官方商城小程序 签到
------------------------------------------
变量名this
变量值https://xcx.this.cn/api/ 域名下请求头Headers中authori-zation的值 去掉Bearer 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("this官方商城");
let ckName = `this`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user
$.ckStatus = true;
await info()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function info() {
let data = JSON.stringify({
"sign": 1
});
let config = {
method: 'POST',
url: 'https://xcx.this.cn/api/sign/user',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'Content-Type': 'application/json',
'charset': 'utf-8',
'form-type': 'routine',
'authori-zation': 'Bearer ' + $.token,
'Referer': 'https://servicewechat.com/wx1c228827dfa0de9e/13/page-frame.html'
},
data: data
};
let { data: result } = await Request(config)
if (result?.status == 200) {
$.log(`${result.data.nickname} 累计签到[${result.data.sign_num}]天 当前积分[${result.data.integral}]分`)
if (result.data.is_day_sgin !== true) {
$.log(`未签到 ===> 签到ing`)
await signIn()
} else {
$.log(`已签到 ===> 跳过签到`)
}
} else {
$.log(result.msg)
}
}
async function signIn() {
let data = JSON.stringify({});
let config = {
method: 'POST',
url: 'https://xcx.this.cn/api/sign/integral',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'Content-Type': 'application/json',
'charset': 'utf-8',
'form-type': 'routine',
'authori-zation': 'Bearer ' + $.token,
'Referer': 'https://servicewechat.com/wx1c228827dfa0de9e/13/page-frame.html'
},
data: data
};
let { data: result } = await Request(config)
if (result?.status == 200) {
$.log(`签到成功:[${result.msg}]`)
} else {
$.log(result.msg)
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,121 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/topspace%E5%B0%8F%E7%A8%8B%E5%BA%8F.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/topspace%E5%B0%8F%E7%A8%8B%E5%BA%8F.py
# Repo: jdqlscript/toulu
# Path: topspace小程序.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 0c2cf24eeedde16a73bd6ff8f3dd0b86507004dcbd7def57502e5f3d8b644612
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
'''
topspace微信小程序
topspace小程序每天定时两次就可以
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
new Env('topspace');
抓x-vcs-user-token和app-id用&分割并且多号@
'''
import requests
import os
class AC:
def __init__(self, cookie):
self.headers = {
'User-Agent': "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220133 MMWEBSDK/20240404 MMWEBID/2307 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
'app-id': cookie.split('&')[1],
'x-vcs-user-token': cookie.split('&')[0]
}
def info(self):
url = "https://m.sda.changan.com.cn/app-apigw/user-info-api/api/v1/sda-app/personal-info/basic-information"
response = requests.get(url, headers=self.headers)
data = response.json()
if data['code'] == 0:
userNickname = data["data"]["userNickname"]
totalPoints = data["data"]["pointInfo"]["totalPoints"]
print(f"用户:{userNickname}当前共有{totalPoints}")
return userNickname
else:
msg = data["msg"]
print(f"登录失败: {msg}")
return None
def check(self, userNickname):
url = "https://m.sda.changan.com.cn/app-apigw/user-info-api/api/v2/point/check-in"
response = requests.post(url, headers=self.headers)
data = response.json()
if data['code'] == 0:
description = data["data"]["description"]
total = data["data"]["total"]
print(f"用户:{userNickname}{description}获得{total}TOP币")
else:
msg = data["msg"]
print(f"签到失败: {msg}")
def list_articles(self, userNickname):
url = "https://m.sda.changan.com.cn/app-apigw/sda-zone-api/api/v1/post/list"
data = {
"section_id": "1002",
"page": {
"current_page": 1,
"page_size": 20
},
"sort_type": "RECOMMEND_FIRST"
}
response = requests.post(url, headers=self.headers, json=data)
data = response.json()
if data['code'] == 0:
article_id = data["data"]["list"][0]["id"]
print(f"用户:{userNickname}获取文章{article_id}")
return article_id
else:
msg = data["msg"]
print(f"获取文章失败: {msg}")
def publish_comment(self, userNickname, article_id):
url = "https://m.sda.changan.com.cn/app-apigw/sda-zone-api/api/v1/comment/publish"
data = {
"content": "很酷",
"post_id": article_id
}
response = requests.post(url, headers=self.headers, json=data)
data = response.json()
if data['code'] == 0:
print("发布成功")
else:
print(f"发布失败: {data['msg']}")
def share_article(self, userNickname, article_id):
url = "https://m.sda.changan.com.cn/app-apigw/sda-zone-api/api/v1/action/share"
data = {
"post_id": article_id
}
response = requests.post(url, headers=self.headers, json=data)
data = response.json()
if data['code'] == 0:
print("转发成功")
else:
print(f"转发失败: {data['msg']}")
if __name__ == "__main__":
topspace = os.environ.get('topspace')
if not topspace:
print("请设置环境变量 'topspace' 后再运行")
else:
topspace_list = topspace.split('@')
for num, topspace_item in enumerate(topspace_list, start=1):
x_vcs_user_token, app_id = topspace_item.split('&')
cookie = f"{x_vcs_user_token}&{app_id}"
ac = AC(cookie)
print(f"=====开始执行第{num}个账号任务=====")
user_nickname = ac.info()
if user_nickname:
ac.check(user_nickname)
article_id = ac.list_articles(user_nickname)
if article_id:
ac.publish_comment(user_nickname, article_id)
ac.share_article(user_nickname, article_id)
print("---------账号任务执行完毕---------")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,68 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/wcs.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/wcs.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/wcs.js
// # UploadedAt: 2026-05-14T07:10:35Z
// # SHA256: d9b348cac05cc8da8c9155c9b46a421f1ba392f2982930f6f89d7636709ee6d5
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
const axios = require("axios");
class WeChatCodeServer {
constructor(options) {
this.serverUrl = options.url;
this.appid = options.appid;
this.auth = options.auth;
}
getCode(openid) {
console.log('等待获取code:');
return new Promise((resolve, reject) => {
axios.post(this.serverUrl + '/wx/code', { appid: this.appid, openid }, {
headers: {
'auth': this.auth
},
timeout: 30 * 1000
}).then(res => {
console.log('获取code成功:');
resolve(res);
}).catch(err => {
reject(err);
});
});
}
cloudInit(openid) {
console.log('等待云函数初始化:');
return new Promise((resolve, reject) => {
axios.post(this.serverUrl + '/wx/call/init', { appid: this.appid, openid }, {
headers: {
'auth': this.auth
},
timeout: 30 * 1000
}).then(res => {
console.log('云函数初始化成功:');
resolve(res);
}).catch(err => {
reject(err);
});
});
}
cloudCall(openid) {
console.log('等待云函数调用:');
return new Promise((resolve, reject) => {
axios.post(this.serverUrl + '/wx/cloud/call', { appid: this.appid, openid }, {
headers: {
'auth': this.auth
},
timeout: 30 * 1000
}).then(res => {
console.log('云函数调用成功:');
resolve(res);
}).catch(err => {
reject(err);
});
});
}
}
module.exports = WeChatCodeServer;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,129 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E4%B8%83%E7%82%B9%E4%BA%94%E9%A5%AE%E7%94%A8%E5%A4%A9%E7%84%B6%E7%9F%BF%E6%B3%89%E6%B0%B4.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E4%B8%83%E7%82%B9%E4%BA%94%E9%A5%AE%E7%94%A8%E5%A4%A9%E7%84%B6%E7%9F%BF%E6%B3%89%E6%B0%B4.py
# Repo: jdqlscript/toulu
# Path: 七点五饮用天然矿泉水.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: d6fe496720c54bd714a265dd36c0db3b70649d76a897a147a438523118d014fc
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
#微信小程序:七点五饮用天然矿泉水
#签到10天送100积分连续20天送20元券连续30天送25元券连续45天送七点五饮用天然泉水高端弱碱饮用天然泉水 表白礼物 整箱520ml*15
#抓取任意链接请求头中的extra-data中的sid参数填入青龙变量qdwxcxcookie
#不确定参数有效期
#青龙变量qdwxcxcookie格式为备注#sid
#多账号换行
#小库脚本!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#频道【tl库】https://pd.qq.com/s/btv4bw7av
import requests
from os import path
import json
import time
import os
def load_send():
cur_path = path.abspath(path.dirname(__file__))
notify_file = cur_path + "/notify.py"
if path.exists(notify_file):
try:
from notify import send # 导入模块的send为notify_send
print("加载通知服务成功!")
return send # 返回导入的函数
except ImportError:
print("加载通知服务失败~")
else:
print("加载通知服务失败~")
return False # 返回False表示未成功加载通知服务
def sign():
url = "https://h5.youzan.com/wscump/checkin/checkinV2.json?checkinId=3997371"
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b11) XWEB/9129",
'xweb_xhr': "1",
'extra-data': sid,
'sec-fetch-site': "cross-site",
'sec-fetch-mode': "cors",
'sec-fetch-dest': "empty",
'referer': "https://servicewechat.com/wx5508c9ab0d2118ff/63/page-frame.html",
'accept-language': "zh-CN,zh;q=0.9",
'Cookie': "KDTWEAPPSESSIONID="+sid
}
response = requests.get(url, headers=headers)
time.sleep(2)
print(response.text)
time.sleep(2)
return response.text
def jifen():
url = "https://h5.youzan.com/wscump/pointstore/getCustomerPoints.json"
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b11) XWEB/9129",
'Cookie': "KDTWEAPPSESSIONID="+sid
}
response = requests.get(url, headers=headers)
time.sleep(2)
# print(response.text)
try:
xiaoku=json.loads(response.text)
jifen1=str(xiaoku["data"]["currentAmount"])
print('目前积分为'+jifen1)
time.sleep(2)
url = "https://h5.youzan.com/wscump/checkin/get_activity_by_yzuid_v2.json?checkinId=3997371"
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b11) XWEB/9129",
'extra-data': "sid="+sid,
'Cookie': "KDTWEAPPSESSIONID="+sid
}
response = requests.get(url, headers=headers)
xiaoku=json.loads(response.text)
print('目前签到天数为'+str(xiaoku["data"]["continuesDay"]))
# print(response.text)
tongzhi='\n目前积分为'+jifen1+'\n签到天数为'+str(xiaoku["data"]["continuesDay"])
return tongzhi
except:
print('积分查询失败,检查变量是否正确')
if __name__ == "__main__":
var_name='qdwxcxcookie'
values = os.getenv(var_name)
values=values.split('\n')
content=''
for value in values:
beizhu=value.split('#')[0];
sid=value.split('#')[1];
print('-------开始' + str(beizhu) + '签到------')
content=content+'\n===='+str(beizhu)+'账号签到情况====\n'
content=content+str(sign())
print('-------开始' + str(beizhu) + '查询积分------')
content=content+str(jifen())
content=content+'\n----------------------\n'
# 在load_send中获取导入的send函数
send = load_send()
print()
print('------运行结束-------')
content=content+'\n签到10天送100积分连续20天送20元券连续30天送25元券连续45天送七点五饮用天然泉水高端弱碱饮用天然泉水 表白礼物 整箱520ml*15\n'
content=content+'\n所有账号运行完毕\n'
print('签到10天送100积分连续20天送20元券连续30天送25元券连续45天送七点五饮用天然泉水高端弱碱饮用天然泉水 表白礼物 整箱520ml*15')
# 判断send是否可用再进行调用
print()
if send:
send('七点五饮用天然矿泉水签到推送', content)
else:
print('通知服务不可用')

View File

@@ -0,0 +1,90 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E4%BA%A7%E5%9C%B0%E4%B8%A5%E9%80%89%E5%B0%8F%E7%A8%8B%E5%BA%8F.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E4%BA%A7%E5%9C%B0%E4%B8%A5%E9%80%89%E5%B0%8F%E7%A8%8B%E5%BA%8F.py
# Repo: jdqlscript/toulu
# Path: 产地严选小程序.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: f81d5d959073dedc5f43a7d1259f4c5da22afbe0d6295f367a72e41c779a59b6
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
'''
产地严选小程序
可以在浏览器打开https://c.hanhoukeji.com/h5/#/网页获取Access-Token
也可以在微信小程序获取Access-Token
变量名cdyxck多号&分割
TL库
每天一次
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
长期套餐大额流量电话卡办理地址https://hk.yunhaoka.cn/#/pages/micro_store/index?agent_id=669709
'''
import requests
import json
import os
import time
import random
def main(token):
url = "https://c.hanhoukeji.com/index.php?s=/api/points/taskComplete"
list=[10,20,30,40,50,70,80]
for i in list:
payload = json.dumps({
"source": i
})
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13) XWEB/9129",
'Content-Type': "application/json",
'access-token': token
}
response = requests.post(url, data=payload, headers=headers)
data = json.loads(response.text)
status = data['status']
message=data["message"]
print('获取任务中..................')
if message == '没有找到用户信息':
print(message)
break
time.sleep(1)
print(message)
rand = random.randint(5,20)
print('等待'+str(int(rand))+'秒后继续运行')
time.sleep(rand)
def user_points(token):
url = "https://c.hanhoukeji.com/index.php?s=/api/points/userPointsLog"
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13) XWEB/9129",
'access-token': token
}
response = requests.get(url, headers=headers)
data = json.loads(response.text)
status = data['status']
message = data['message']
if status == 200:
user_points=data["data"]["user_points"]
print('当前积分:'+str(user_points))
else:
print('')
time.sleep(1)
if __name__ == "__main__":
cks=os.getenv('cdyxck')
cks = cks.split("&")
print(f"检测到{len(cks)}个账号,即将开始...")
i = 1
for ck in cks:
token=ck
print(f"----------第{i}个账号----------")
i += 1
main(token)
user_points(token)
rand = random.randint(5,20)
if i > len(cks):
break
print(f"\n等待{rand}s后进行下一个账号")
time.sleep(rand)

View File

@@ -0,0 +1,852 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%85%A8%E6%A3%89%E6%97%B6%E4%BB%A3.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%85%A8%E6%A3%89%E6%97%B6%E4%BB%A3.js
// # Repo: jdqlscript/toulu
// # Path: 全棉时代.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 78833e2a1ea602df34a3a8b99a3962eb2e64253bcc8b9f455461d25bef894e29
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
"""
>TL库:https://github.com/3288588344/toulu.git
tg频道:https://t.me/TLtoulu
QQ频道:https://pd.qq.com/s/672fku8ge
项目 全棉时代种棉花
入口 #小程序://全棉时代
变量 code #token#备注 多账号换行
变量名 qmzmh
"""
import os
import requests
from datetime import datetime, timezone, timedelta
import json
import time
import random
# 配置参数
base_url = "https://hxxxy.gov.cn"
user_agent = "Mozilla/5.0 (Linux; Android 11; ONEPLUS A6000 Build/RKQ1.201217.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160065 MMWEBSDK/20231201 MMWEBID/2930 MicroMessenger/8.0.45.2521(0x28002D3D) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 miniProgram/wxdfcaa44b1aa891a7"
def get_beijing_date():
beijing_time = datetime.now(timezone(timedelta(hours=8)))
return beijing_time.date()
def dq_time():
dqsj = int(time.time())
dysj = datetime.fromtimestamp(dqsj).strftime('%Y-%m-%d %H:%M:%S')
print("当前时间戳:", dqsj)
print("转换后的时间:", dysj)
return dqsj, dysj
def get_env_variable(var_name):
value = os.getenv(var_name)
if value is None:
print(f'环境变量{var_name}未设置,请检查。')
return None
accounts = value.strip().split('\n')
print(f'-----------本次账号运行数量:{len(accounts)}-----------')
print(f'------全棉时代种棉花-----1.2------')
return accounts
def create_headers(code, token):
headers = {
'host': 'sg01.purcotton.com',
'accept': 'application/json, text/plain, */*',
'app-id': 'wxdfcaa44b1aa891a7',
'user-agent': user_agent,
'content-type': 'application/json;charset=UTF-8',
'origin': 'https://sg01.purcotton.com',
'x-requested-with': 'com.tencent.mm',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'accept-encoding': 'gzip, deflate',
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'cookie': 'sajssdk_2015_cross_new_user=1',
'code': code,
'token': token,
}
return headers
def jscz(code, token): # 浇水
# 调用hqid函数并获取树木ID及其他信息
tree_id, sunshine, total_sunshine = hqid(code, token)
if tree_id is not None:
#print(f"获得的树木ID: {tree_id}")
# 可以在这里打印阳光信息如果需要
#print(f"当前阳光: {sunshine}, 总阳光: {total_sunshine}")
while True: # 开始一个无限循环
url = "https://sg01.purcotton.com/api/watering"
data = {"tree_user_id": tree_id, "water_cnt": 1} # 使用动态获取的树木ID
headers = create_headers(code, token)
#print(data)
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
response_data = response.json()
if response_data.get("code") == 200:
# 提取剩余水滴数
remaining_water = response_data["data"]["info"]["sy_water"]
print(f"剩余水滴数: {remaining_water}")
# 根据剩余水滴数决定是否继续
if remaining_water < 30: # 如果剩余水滴数小于30则停止
print("水滴不足,停止浇水。")
break
print("执行浇水操作...")
# 暂停1到3秒
time.sleep(random.randint(1, 3))
elif response_data.get("code") == 400:
print(response_data.get("msg", "未知错误"))
break # 遇到错误时停止循环
else:
print("未知的响应code:", response_data.get("code"))
print("完整响应:", response_data)
break # 如果响应码不是200或400停止循环
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
break # 请求异常时停止循环
else:
print("未能获取树木ID无法执行浇水操作。")
def llhmp(code, token, action, tid): # 添加了tid参数
phone, _ = login(code, token) # 调用login函数获取电话号码忽略user_id
url = "https://nmp.pureh2b.com/api/purcotton/completetask"
headers = {
'Host': 'nmp.pureh2b.com',
'XWeb-Xhr': '1',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'code': code,
'token': token,
}
data = {
'action': action,
'phone': phone,
'from': 'guoyuan'
}
#print(data)
try:
response = requests.post(url, headers=headers, data=data)
response.raise_for_status()
response_data = response.json() # 解析响应数据为JSON
action_descriptions = {
'browse_venue': '逛甄选好棉品',
'browse_new_user_zone': '浏览新用户专区',
'browse_community': '社区送福利',
'subscibe': '订阅奖励提醒'
}
action_description = action_descriptions.get(action, '执行任务')
#print(f"执行任务 '{action_description}' 响应内容:", response.text) # 打印响应内容
if response_data.get("code") == 200:
print(f"{action_description} 任务成功,暂停一段时间再继续...")
time.sleep(random.randint(15, 20))
tjlq_mpjl(code, token, tid) # 在任务成功后调用领取奖励的函数
elif response_data.get("code") == 400:
#print() # 打印响应内容
print(f"{action_description} {response_data.get('msg')}")
#tjlq_mpjl(code, token, tid) # 在任务成功后调用领取奖励的函数
else:
print("{action_description} 收到未预期的响应,响应内容如下:")
print(response_data)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def tjlq_mpjl(code, token, tid): # 添加了tid参数来指定任务ID 提交 任务 领取奖励
url = "https://sg01.purcotton.com/api/task/receive-task-water"
headers = create_headers(code, token)
data = {"tid": tid} # 使用传入的任务ID
#print(data)
try:
response = requests.post(url, headers=headers, json=data) # 发送POST请求
response.raise_for_status() # 检查响应状态码
# 解析响应数据
response_data = response.json()
if response_data.get("code") == 200:
print("奖励领取成功。")
# 打印sy_water和get_water
data = response_data.get("data", {})
sy_water = data.get("sy_water", "未知") #
get_water = data.get("get_water", "未知") # 同上
print(f"剩余水量:{sy_water}, 获取水量:{get_water}")
else:
print(f"奖励领取失败,错误信息:{response_data.get('msg')}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def task_list(code, token): # 任务列表
url = "https://sg01.purcotton.com/api/task/list"
headers = create_headers(code, token)
today_date = datetime.now().strftime("%Y-%m-%d") # 获取今天的日期格式为YYYY-MM-DD
# 任务ID到任务名称的映射
task_names = {
1: "签到, 1",
2: "不知道1, 0",
4: "三餐福袋, 3",
6: "逛甄选好棉品, 4",
10: "订阅奖励提醒, 1",
13: "浏览新用户, 2",
14: "庄园小课堂, 3",
15: "棉花工厂, 1",
16: "社区送福利, 1"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response_data = response.json()
today_tasks = [] # 用于存储今天的任务信息
if response_data.get("code") == 200:
task_user_info = response_data.get("data", {}).get("task_user_info", [])
print("------任务进度条-----------")
for task in task_user_info:
task_id = task.get('task_id')
complete_num = task.get('complete_num')
complete_date = task.get('complete_date')
# 比较任务完成日期是否为今天
#print("------任务进度条-----------")
if complete_date == today_date:
task_name = task_names.get(task_id, f"未知任务 {task_id}") # 获取任务名称如果未知则显示未知任务和ID
print(f"任务ID: {task_id} {task_name}/{complete_num}, 任务时间: {complete_date}")
#print(f"{task_name}/{complete_num} 时间: {complete_date}")
today_tasks.append(task)
print("-----------------")
print()
return today_tasks
else:
print(f"获取任务列表失败,错误信息:{response_data.get('msg')}")
return []
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return []
def pdrw(code, token): # 判断任务
"""根据任务完成情况执行任务"""
try:
task_user_info = task_list(code, token)
task_completion_limits = {
6: 4,# 任务ID为6的任务只能完成4次 逛甄选好棉品
13: 2, # 任务ID为13的任务只能完成2次 浏览新用户专区
15: 1, # 假设任务ID为15的任务只能完成1次 棉花工厂
4: 3, # 4 3次三餐福袋 7-12 14-17 18-22
16: 1, # ID 16 社区送福利
10: 1, # ID 10 订阅奖励提醒
14: 1, #ID14 #庄园小课堂
1: 1, #ID #签到
}
# 先检查所有指定的任务是否已经存在于任务列表中
existing_task_ids = [task['task_id'] for task in task_user_info]
#print(existing_task_ids)
# 遍历每个任务ID检查是否需要执行任务
for task_id, max_completes in task_completion_limits.items():
task_info = next((task for task in task_user_info if task['task_id'] == task_id), None)
if task_info:
complete_num = task_info['complete_num']
if complete_num < max_completes:
#print(f"任务ID: {task_id}, 当前完成次数: {complete_num}, 将执行任务并尝试领取奖励。")
print()
if task_id == 6:
llhmp(code, token, 'browse_venue', '6')
#today_water(code, token)
elif task_id == 13:
llhmp(code, token, 'browse_new_user_zone', '13')
today_water(code, token)
sj_yg(code, token)#收集阳光
syyg(code, token)#使用阳光
# 这里可以添加其他任务ID的逻辑
elif task_id == 15:
# 对于任务ID 15的特定处理
complete_task(code, token, '15')
elif task_id == 16:
llhmp(code, token, 'browse_community', '16')
elif task_id == 10:
llhmp(code, token, 'subscibe', '10')
elif task_id == 14:
hdwt_box(code, token, '14')
elif task_id == 4:
# 对于任务ID 15的特定处理
lq_fd(code, token, '4')
elif task_id == 1:
lq_fd(code, token, '1')
time.sleep(random.randint(1, 5))
elif task_id not in existing_task_ids:
#print(f"任务ID: {task_id}, 未在列表中,将尝试执行并领取奖励。")
print()
if task_id == 6:
llhmp(code, token, 'browse_venue', '6')
today_water(code, token)
elif task_id == 13:
llhmp(code, token, 'browse_new_user_zone', '13')
sj_yg(code, token)#收集阳光
syyg(code, token)#使用阳光
elif task_id == 15:
complete_task(code, token, '15')
elif task_id == 16:
llhmp(code, token, 'browse_community', '16')
elif task_id == 10:
llhmp(code, token, 'subscibe', '10')
elif task_id == 14:
hdwt_box(code, token, '14')
elif task_id == 1:
lq_fd(code, token, '1')
elif task_id == 4:
lq_fd(code, token, '4')
time.sleep(random.randint(1, 5))
# 添加其他任务ID和类型的逻辑
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 任务 数据
def complete_task(code, token, tid): # 棉花工厂
url = "https://sg01.purcotton.com/api/task/complete-manual-task"
headers = create_headers(code, token)
payload = {
"tid": tid,
"relate_id": 0,
}
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status() # 检查HTTP响应状态码如果不是200系列则抛出异常
# 解析响应数据
response_data = response.json()
if response_data.get("code") == 200:
print("奖励领取成功。")
tjlq_mpjl(code, token, tid)
else:
# 如果响应中的code不是200打印错误信息
print(f"任务失败:{response_data.get('msg')}")
except requests.exceptions.RequestException as e:
# 如果请求过程中发生异常打印异常信息
print(f"请求失败: {e}")
def lq_fd(code, token, tid): # 三餐福袋和签到
# 确保tid为整数类型
tid = int(tid) # 将tid转换为整型以确保与整数进行比较
task_name = "未知任务"
if tid == 4:
task_name = "三餐福袋" #7-12 14-17 18-22
elif tid == 1:
task_name = "签到"
url = "https://sg01.purcotton.com/api/task/complete-task"
headers = create_headers(code, token)
data = {"tid": tid} # 使用传入的任务ID
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status() # 检查响应状态码
# 解析响应数据
response_data = response.json()
if response_data.get("code") == 200:
print(f"{task_name} 奖励领取成功。")
# 打印sy_water和get_water
data = response_data.get("data", {})
sy_water = data.get("sy_water", "未知")
get_water = data.get("get_water", "未知")
print(f"{task_name} 剩余水量:{sy_water}, 获取水量:{get_water}")
else:
print(f"{task_name}{response_data.get('msg')}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 任务
# 提取数据 开始
def hqid(code, token): # 获取树木ID和阳光信息
url = "https://sg01.purcotton.com/api/index"
headers = create_headers(code, token)
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response_data = response.json()
# print("Response JSON:", response_data) # 用于调试
if response_data.get("code") == 200:
tree_data = response_data['data']['tree']
user_data = response_data['data']['user'] # 获取用户相关数据
# 获取树木ID
tree_id = tree_data.get('id')
# 获取阳光相关数据
sunshine = user_data.get('sunshine', 0) # 如果不存在则默认为0
total_sunshine = user_data.get('total_sunshine', 0) # 如果不存在则默认为0
# 可以选择打印这些信息
#print(f"树木ID: {tree_id} 当前阳光: {sunshine} 总阳光: {total_sunshine} ")
# 根据需要返回所需的数据这里返回一个包含所有信息的元组
return tree_id, sunshine, total_sunshine
else:
print(f"请求失败,错误代码: {response_data.get('code')}, 错误信息: {response_data.get('msg')}")
return None, None, None # 如果请求失败返回包含None的元组
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None, None, None # 如果发生异常返回包含None的元组
def login(code, token): # 提取的号码
url = "https://sg01.purcotton.com/api/login"
headers = create_headers(code, token)
data = {
"invite_source": "task",
"channel": "" # "channel": "zmh_assist"
}
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status() # 检查HTTP响应状态
response_data = response.json()
if response_data.get("code") == 200:
phone = response_data["data"]["phone"]
user_id = response_data["data"]["id"] # 提取id
#print("提取的电话号码:", phone)
#print("提取的用户ID:", user_id) # 打印id
return phone, user_id # 返回电话号码和用户ID
else:
print("请求失败,错误代码:", response_data.get("code"), "错误信息:", response_data.get("msg"))
return None, None
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None, None
# 提取数据
# 回答问题
def hdwt_box(code, token, tid): #庄园小课堂
url = "https://sg01.purcotton.com/api/answer"
headers = create_headers(code, token)
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response_data = response.json()
exams = response_data.get("data", {}).get("exams", [])
#print(response.json())
for exam in exams:
exam_id = exam.get('id')
print(f"正在处理问题ID: {exam_id}")
# 这里是你提交答案的代码逻辑
url_submit_answer = "https://sg01.purcotton.com/api/answer/complete"
payload = {
"tid": tid, # 假设任务ID为14
"exam_id": exam_id,
"win": 1 # 假设标记为正确
}
submit_response = requests.post(url_submit_answer, headers=headers, json=payload)
submit_response.raise_for_status()
if submit_response.status_code == 200:
submit_response_data = submit_response.json()
#print(submit_response_data) # 打印完整的响应体
# 提取并打印get_water, complete_num, box_id
get_water = submit_response_data.get("data", {}).get("get_water", 0)
complete_num = submit_response_data.get("data", {}).get("complete_num", 0)
box_id = submit_response_data.get("data", {}).get("box_id", 0)
print(f"获取水量:{get_water}, 完成数量:{complete_num}, 宝箱ID{box_id}")
# 如果box_id大于0则打开宝箱
if box_id > 0:
print(f"检测到宝箱ID: {box_id},尝试打开宝箱...")
url_open_box = "https://sg01.purcotton.com/api/answer/open-box"
box_payload = {"box_id": box_id}
box_response = requests.post(url_open_box, headers=headers, json=box_payload)
box_response.raise_for_status()
if box_response.status_code == 200:
box_response_data = box_response.json()
# print(f"宝箱 {box_id} 打开成功,响应内容:", box_response_data)
# 提取sy_water和get_water
sy_water = box_response_data.get("data", {}).get("sy_water", 0)
get_water = box_response_data.get("data", {}).get("get_water", 0)
print(f"宝箱 剩余水量:{sy_water}, 宝箱水量:{get_water}")
# 随机停止3-5
time.sleep(random.randint(3, 5))
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def today_water(code, token):#
url = "https://sg01.purcotton.com/api/get-today-water"
headers = create_headers(code, token) # 确保 create_headers 函数正确定义并返回所需的头部信息
try:
response = requests.post(url, headers=headers)
response.raise_for_status() # 确保响应状态为200
# 解析响应体为JSON
response_data = response.json()
# 检查响应中的code字段
if response_data.get("code") == 200:
#print("完整响应体:", response_data) # 打印完整的响应体
# 提取所需数据
sy_water = response_data.get("data", {}).get("sy_water", "未知")
get_water = response_data.get("data", {}).get("get_water", "未知")
tomorrow_get_water_num = response_data.get("data", {}).get("tomorrow_get_water_num", "未知")
#print(f"剩余水量sy_water: {sy_water}")
print(f"今日获取水量: {get_water}")
print(f"明日可获取水量: {tomorrow_get_water_num}")
print(f"今日获取水量: {get_water} 明日可获取水量: {tomorrow_get_water_num}")
else:
# 打印错误消息
print(f"水瓶 {response_data.get('msg', '未知错误')}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def cscscs(code, token):
url = "https://sg01.purcotton.com/api/statistics/store"
headers = create_headers(code, token)
_, user_id = login(code, token) # 调用login函数忽略电话号码只获取user_id
data = {
"uid": user_id,
"type": 301 # 确保这里的值符合API的要求
}
#print(data) # 打印整个响应数据
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status() # 检查HTTP响应状态
response_data = response.json()
#print(response_data) # 打印整个响应数据
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 阳光
def sj_yg(code, token):
success = False
while not success:
url = "https://sg01.purcotton.com/api/get-sunshine"
headers = create_headers(code, token)
# 使用当前时间戳
payload = {"time": int(time.time() * 1000)}
#print(f"请求负载: {payload}")
try:
response = requests.post(url, headers=headers, json=payload)
response_data = response.json()
if response.status_code == 200:
if response_data["code"] == 200:
sy_sunshine = response_data['data'].get('sy_sunshine')
get_sunshine = response_data['data'].get('get_sunshine')
print(f"成功领取阳光: 剩余阳光: {sy_sunshine}, 获得阳光: {get_sunshine}")
success = True # 标记成功领取退出循环
elif response_data["code"] == 400:
print("没有可领取的阳光")
break # 如果没有可领取的阳光跳出循环
else:
print(f"阳光操作响应: {response_data}")
else:
print(f"请求失败HTTP状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
if success:
# 如果成功领取阳光则暂停1到3秒后继续
sleep_time = random.randint(1, 3)
print(f"暂停{sleep_time}秒后重新领取...")
time.sleep(sleep_time)
success = False # 重置成功标志继续领取
def syyg(code, token):
"""当阳光值大于100时完成阳光任务"""
# 假设hqid返回树木IDsunshine和其他信息
_, sunshine, _ = hqid(code, token)
if sunshine > 99:
url = "https://sg01.purcotton.com/api/sunshine-task/complete-task"
headers = create_headers(code, token) # 使用create_headers函数创建请求头
payload = {"tid": 1} # 固定payload可能需要根据API文档调整
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status() # 检查响应是否成功
response_data = response.json()
if response_data.get("code") == 200:
print("成功完成阳光任务。")
# 这里可以根据响应体进一步处理如打印信息或记录日志
else:
print(f"完成阳光任务失败,错误代码: {response_data.get('code')}, 错误信息: {response_data.get('msg')}")
except requests.exceptions.RequestException as e:
print(f"请求完成阳光任务时出错: {e}")
else:
print(f"阳光值未达到{sunshine}/100不执行任务。")
# 好友
def hyid(code, token):
url = "https://sg01.purcotton.com/api/friend/list?page=1&page_size=50"
headers = create_headers(code, token)
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 确保响应状态为200
# 解析响应体为JSON
response_data = response.json()
friend_user_ids = [] # 用于存储符合条件的朋友的用户ID
if response_data.get("code") == 200:
friends_list = response_data.get("data", {}).get("list", [])
for friend in friends_list:
friend_user_id = friend.get("friend_user_id")
help_water_cnt = friend.get("help_water_cnt")
be_help_water_cnt = friend.get("friend_user_info", {}).get("be_help_water_cnt")
#print(f"朋友用户ID: {friend_user_id}, 帮忙浇水次数: {help_water_cnt}, 被帮忙浇水次数: {be_help_water_cnt}")
# 只有当帮忙浇水次数小于1时才收集该朋友的用户ID
if help_water_cnt < 1:
friend_user_ids.append(friend_user_id)
return friend_user_ids # 返回所有符合条件收集到的用户ID
else:
print("请求失败,错误代码:", response_data.get("code"), "错误信息:", response_data.get("msg"))
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def access_friend_detail(code, token, friend_user_id):
"""访问朋友的详细信息,并尝试对其树进行浇水操作"""
url = "https://sg01.purcotton.com/api/friend/index"
headers = create_headers(code, token)
headers['friend-id'] = str(friend_user_id)
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
response_data = response.json()
if response_data.get("code") == 200:
tree_info = response_data.get('data', {}).get('tree', {})
if isinstance(tree_info, list) and tree_info:
tree_info = tree_info[0]
tree_id = tree_info.get('id') if isinstance(tree_info, dict) else None
help_water_info = response_data.get('data', {}).get('help_water', {})
help_water_code = help_water_info.get('code')
help_water_msg = help_water_info.get('msg')
#print(f"{friend_user_id}朋友树ID: {tree_id}, 帮忙浇水代码: {help_water_code}, 信息: '{help_water_msg}'")
if tree_id is not None:
success = water_friend_tree(code, token, tree_id, friend_user_id)
if not success:
print(f"由于操作失败,停止处理朋友{friend_user_id}的后续操作。")
return False
else:
print(f"获取朋友{friend_user_id}的详细信息失败,错误代码: {response_data.get('code')}, 错误信息: {response_data.get('msg')}")
return False
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return False
return True
def water_friend_tree(code, token, tree_id, friend_user_id):
"""执行给定朋友的树浇水操作"""
url = "https://sg01.purcotton.com/api/friend/water"
headers = create_headers(code, token)
payload = {"tree_user_id": tree_id}
headers['friend-id'] = str(friend_user_id)
try:
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
response_data = response.json()
#print(response_data) # 打印整个响应体用于调试
if response_data["code"] == 200:
# 检查response_data['data']是否为字典以此判断是否可以安全访问'info'
if isinstance(response_data['data'], dict):
use_water = response_data['data']['info'].get('use_water', '未知')
reward_water = response_data['data']['info'].get('reward_water', '未知')
print(f"对树ID {tree_id} 的浇水操作成功: 使用水量: {use_water}, 奖励水量: {reward_water}")
else:
# 如果data不是字典直接打印data字段这里可能是错误消息或其他说明
print(f"操作结果: {response_data['data']}")
return False
elif response_data["code"] == 400:
#print(f"{response_data.get('msg', '未知错误')}. 完整响应体: {response_data}")
print(f"{response_data.get('msg', '未知错误')}. ")
return False
else:
print(f"对树ID {tree_id} 的浇水操作响应: {response_data}")
return False
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return False
return True
def process_all_friends(friends_user_ids, code, token):
"""遍历朋友列表,尝试对每个朋友的树进行浇水操作,并在首次失败时停止"""
for friend_user_id in friends_user_ids:
if not access_friend_detail(code, token, friend_user_id):
#print(f"由于操作失败,停止对所有后续朋友的处理。")
break # 遇到第一个失败立即跳出循环
def main():
var_name = 'qmzmh'
tokens = get_env_variable(var_name)
if not tokens:
return
total_tokens = len(tokens)
if total_tokens > 20:
print("账号数量超过20个不执行操作。")
return
for index, token_info in enumerate(tokens, start=1):
parts = token_info.split('#')
if len(parts) < 2:
print("令牌格式不正确。跳过处理。")
continue
code = parts[0]
token = parts[1]
remark = parts[2] if len(parts) > 2 else ""
print()
print(f"------账号{index}/{total_tokens},备注: {remark}-------")
phone, user_id = login(code, token)
if phone and user_id: # 检查是否成功获取电话号码和用户ID
# 进行后续任务
cscscs(code, token)
#sj_yg(code, token)#收集阳光
#syyg(code, token)#使用阳光
jscz(code, token) #浇水
pdrw(code, token) #任务判断
friend_user_ids = hyid(code, token)
if friend_user_ids:
process_all_friends(friend_user_ids, code, token) # 正确传入朋友ID列表
else:
print("登录失败或获取用户信息失败,跳过当前账号的后续操作。")
if __name__ == "__main__":
main()
'''
def main():
var_name = 'qmzmh'
tokens = get_env_variable(var_name)
if not tokens:
return
total_tokens = len(tokens)
if total_tokens > 20:
print("账号数量超过20个不执行操作。")
return
for index, token_info in enumerate(tokens, start=1):
parts = token_info.split('#')
if len(parts) < 2:
print("令牌格式不正确。跳过处理。")
continue
code = parts[0]
token = parts[1]
remark = parts[2] if len(parts) > 2 else ""
print(f"------账号{index}/{total_tokens},备注: {remark}-------")
login(code, token)#判断要手机号码/提取的电话号码: 才运行下面的任务
cscscs(code, token)#更新
#sj_yg(code, token)#收集阳光
#syyg(code, token)#使用阳光
jscz(code, token) #浇水
pdrw(code, token) #任务判断
friend_user_ids = hyid(code, token)
if friend_user_ids:
process_all_friends(friend_user_ids, code, token) # 正确传入朋友ID列表
if __name__ == "__main__":
main()
'''

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,261 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%8D%8E%E7%A1%95%E5%95%86%E5%9F%8E%E6%AF%8F%E6%97%A5%E6%8A%BD%E5%A5%96.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%8D%8E%E7%A1%95%E5%95%86%E5%9F%8E%E6%AF%8F%E6%97%A5%E6%8A%BD%E5%A5%96.js
// # Repo: jdqlscript/toulu
// # Path: 华硕商城每日抽奖.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 5317a9e967ef13e67c90236beb71a3118e20d5d9d4c4fbbb90a03ef9c43eb9b0
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.11 16:43
@Description: 华硕商城APP 基础任务 浏览[好像有BUG]5分 + 签到5分 = 抽奖9分
------------------------------------------
经测试小程序CK失效短 故抓取APP的数据API
变量名asusStore
变量值 https://store.asus.com.cn/storeapi 域名请求头Headers中Authorization的值#token的值
多账号&或换行或新增同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("华硕商城APP");
let ckName = `asusStore`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.auth = user.split(strSplitor)[0];
$.token = user.split(strSplitor)[1];
$.ckStatus = true;
await signIn()
for (let i of [1, 2]) {
await roll()
await $.wait(5000)
}
await $.wait(5000)
await get_more()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
//签到
async function signIn() {
let time = Date.parse(new Date) / 1e3
let nonce = d(1e4, 99999)
let text = `${nonce}${time}Asus!@#$%^&*()Store`
let config = {
url: `https://store.asus.com.cn/storeapi/user/my/sign`,
method: "POST",
headers: {
'User-Agent': 'okhttp/3.9.1',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': $.auth,
'plat': 'android',
'source': '2',
'version': '2.7.16',
'device': 'MI 8 Lite',
'token': $.token,
'visitorid': 'a232e99938994576',
'Cache-Control': 'no-cache'
},
data: `timestamp=${time}&nonce=${nonce}&signature=${MD5(text)}`
}
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`签到成功`)
} else {
$.log(`签到失败 [${result.msg}]`)
}
}
//获取兑奖码
async function get_more() {
let time = Date.parse(new Date) / 1e3
let nonce = d(1e4, 99999)
let text = `${nonce}${time}Asus!@#$%^&*()Store`
let config = {
url: `https://store.asus.com.cn/storeapi/user/activity/get-more`,
method: "POST",
headers: {
'User-Agent': 'okhttp/3.9.1',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': $.auth,
'plat': 'android',
'source': '2',
'version': '2.7.16',
'device': 'MI 8 Lite',
'token': $.token,
'visitorid': 'a232e99938994576',
'Cache-Control': 'no-cache'
},
data: `page=1&limit=10&timestamp=${time}&nonce=${nonce}&signature=${MD5(text)}`
}
let { data: result } = await Request(config)
if (result?.code == 200) {
for (let i of result.data.list) {
$.log(`历史奖品:${i.id} ===> [${i.prize_name}]`)
if (i.is_exchange !== 1) {
if (i.level == 4) {
$.log(`${i.id} 未兑换 --- 脚本执行兑换`)
await exchange(i.id)
} else {
$.log(`${i.id} 未兑换实物奖励 --- 请看规则找客服或页面兑换`)
}
}
}
}
}
//兑奖
async function exchange(id) {
let time = Date.parse(new Date) / 1e3
let nonce = d(1e4, 99999)
let text = `${nonce}${time}Asus!@#$%^&*()Store`
let config = {
url: `https://store.asus.com.cn/storeapi/user/activity/exchange`,
method: "POST",
headers: {
'User-Agent': 'okhttp/3.9.1',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': $.auth,
'plat': 'android',
'source': '2',
'version': '2.7.16',
'device': 'MI 8 Lite',
'token': $.token,
'visitorid': 'a232e99938994576',
'Cache-Control': 'no-cache'
},
data: `id=${id}&timestamp=${time}&nonce=${nonce}&signature=${MD5(text)}`
}
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`兑换成功 [${id}]`)
} else {
$.log(`兑换失败 [${result.msg}]`)
}
}
//抽奖
async function roll() {
let time = Date.parse(new Date) / 1e3
let nonce = d(1e4, 99999)
let text = `${nonce}${time}Asus!@#$%^&*()Store`
let config = {
url: `https://store.asus.com.cn/storeapi/user/activity/roll`,
method: "POST",
headers: {
'User-Agent': 'okhttp/3.9.1',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': $.auth,
'plat': 'android',
'source': '2',
'version': '2.7.16',
'device': 'MI 8 Lite',
'token': $.token,
'visitorid': 'a232e99938994576',
'Cache-Control': 'no-cache'
},
data: `ticket=RixzlRQgH&activity_type=1&active_code=&timestamp=${time}&nonce=${nonce}&signature=${MD5(text)}`
}
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`抽奖成功`)
} else {
$.log(`抽奖失败 [${result.msg}]`)
}
}
function d(t, e) {
var r = e - t
, n = Math.random();
return String(t + Math.round(n * r))
}
function MD5(data) {
const crypto = require('crypto');
return crypto.createHash('md5').update(data).digest('hex');
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,162 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%8D%A1%E5%A3%AB%E4%BC%9A%E5%91%98.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%8D%A1%E5%A3%AB%E4%BC%9A%E5%91%98.js
// # Repo: jdqlscript/toulu
// # Path: 卡士会员.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 12456cea70a10056a5a4cb92e709b3be05e67040aee64bb6cb28fa6ad1cd8ae5
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.09 11.56
@Description: 卡士会员小程序
------------------------------------------
变量名kashivip
值 第一次进签到页面会有https://gateway.fengxuan.cn/Identity/API_Authen/Get_Token 获取TOKEN的请求 找到Url中pid和key和secret和unionid和绑定的手机号和进入签到页面的https://gateway.fengxuan.cn/QianDao/API_Sign/Save_User_Sign_Detail
里面的Post请求体的参数uid 这个UID在用户界面点我的庄园 找到https://internal.fengxuan.cn/API_Member/GetUserContent接口的返回uid的值
一共六个值 pid#key#secret#unionid#手机号#uid 在点进去签到页面之前就开启抓包 第一次很容易抓到 或者等7200s之后再去抓token的请求
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("卡士会员");
let ckName = `kashivip`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.access_token = null
$.pid = user.split(strSplitor)[0];
$.key = user.split(strSplitor)[1];
$.secret = user.split(strSplitor)[2];
$.unionid = user.split(strSplitor)[3];
$.bid = null
$.phone = user.split(strSplitor)[4];
$.uid = user.split(strSplitor)[5];
$.ckStatus = true;
await getToken()
if ($.access_token) {
await signIn()
}
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getToken() {
let config = {
method: 'GET',
url: `https://gateway.fengxuan.cn/Identity/API_Authen/Get_Token?pid=&key=${$.key}&secret=${$.secret}&openid=&unionid=&appid=`,
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'authorization': '',
'charset': 'utf-8',
'content-type': 'application/x-www-form-urlencoded',
'Referer': 'https://servicewechat.com/wxf1b4741159cb8b06/43/page-frame.html'
}
};
let { data: result } = await Request(config);
if (result?.code == 0) {
$.access_token = result.access_token
$.bid = result.bid;
}
}
async function signIn() {
let config = {
method: 'POST',
url: `https://gateway.fengxuan.cn/QianDao/API_Sign/Save_User_Sign_Detail?bid=${$.bid}&pid=${$.pid}`,
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'Content-Type': 'application/x-www-form-urlencoded',
'authorization': 'Bearer ' + $.access_token,
'charset': 'utf-8',
'Referer': 'https://servicewechat.com/wxf1b4741159cb8b06/43/page-frame.html'
},
data: {
'phone': $.phone,
'unionid': $.unionid,
'uid': $.uid,
'type': '1',
},
}
let { data: result } = await Request(config);
if (result?.code == 0) {
$.log(`签到状态[${result.msg}]`)
} else {
$.log(`签到状态[${result.msg}]`)
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,166 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%8D%A1%E6%B1%A0.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%8D%A1%E6%B1%A0.js
// # Repo: jdqlscript/toulu
// # Path: 卡池.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 7ffef7815aada424678a6cc559ac4d9318ca57065da1994daef5ca0f114d7c1d
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.11 18:52
@Description: 卡池权益会员店 小程序 一周签到大概50积分 500换5花费
------------------------------------------
变量名 kachi
变量值 点击我的 ID 填入 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("卡池权益会员店");
let ckName = `kachi`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.userId = user
$.ckStatus = true;
await initJifen()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function initJifen() {
let config = {
url: `https://wx.wpool.cn/kqcentersp.do`,
method: 'POST',
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
"Cookie": "",
"Host": "wx.wpool.cn",
"Referer": "https://servicewechat.com/wxdae71fc43b208fff/63/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"xweb_xhr": "1"
},
data: `kqapp=1&plantform=0&userid=${$.userId}`
}
let { data: result } = await Request(config);
if (result?.result == "ok") {
$.log(`当前积分[${result.data.userAccount.coupons}]`)
if (result.data.signData.nowsign.sign !== 1) {
$.log(`开始签到`);
await signIn(result.data.signData.nowsign.jifen)
} else {
$.log(`今天已经签到过了`);
}
} else {
$.log(`获取签到信息失败 [${JSON.stringify(result)}]`);
}
}
async function signIn(jifen) {
let config = {
url: `https://wx.wpool.cn/senvendaydosignsp.do`,
method: 'POST',
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
"Cookie": "",
"Host": "wx.wpool.cn",
"Referer": "https://servicewechat.com/wxdae71fc43b208fff/63/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"xweb_xhr": "1"
},
data: `userid=${$.userId}&jifen=${jifen}&indexday=0&plantform=3`
}
let { data: result } = await Request(config);
if (result?.result == "ok") {
$.log(`签到成功`);
} else {
$.log(`签到失败 [${JSON.stringify(result)}]`);
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,175 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%8F%A4%E4%BA%95%E8%B4%A1%E9%85%92.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%8F%A4%E4%BA%95%E8%B4%A1%E9%85%92.js
// # Repo: jdqlscript/toulu
// # Path: 古井贡酒.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: aab5faf38a6294571100a8a47ad85267bd866dab298cf20c05ed11350fb3f7cc
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.09 12.40
@Description: 古井贡酒会员中心小程序
------------------------------------------
变量名 gujing
值 https://scrm.gujing.com/gujing_scrm/ 请求头Headers中的Access-Token的值 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("古井贡酒会员中心小程序");
let ckName = `gujing`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user
$.ckStatus = true;
await search()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function search() {
let data = JSON.stringify({
"activityId": "110001000",
"preview": false
});
let config = {
method: 'POST',
url: 'https://scrm.gujing.com/gujing_scrm/wxclient/mkt/activities/sign:search',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 miniProgram/wxba9855bdb1a45c8e',
'Accept': 'application/json, text/plain, */*',
'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Android WebView";v="122"',
'Content-Type': 'application/json;charset=UTF-8',
'sec-ch-ua-mobile': '?1',
'Access-Token': $.token,
'sec-ch-ua-platform': '"Android"',
'Origin': 'https://scrm.gujing.com',
'X-Requested-With': 'com.tencent.mm',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
},
data: data
};
let { data: result } = await Request(config)
if (result?.code == 200) {
if (result.content.signed !== 1) {
$.log(`未签到 ===> 签到ing`)
await signIn()
} else {
$.log(`已签到 ===> 什么都不做`)
}
} else {
$.log(`签到查询失败 [${JSON.stringify(result)}]`)
}
}
async function signIn() {
let data = JSON.stringify({
"activityId": "110001000",
"preview": false
});
let config = {
method: 'POST',
url: 'https://scrm.gujing.com/gujing_scrm/wxclient/mkt/activities/sign:search',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 miniProgram/wxba9855bdb1a45c8e',
'Accept': 'application/json, text/plain, */*',
'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Android WebView";v="122"',
'Content-Type': 'application/json;charset=UTF-8',
'sec-ch-ua-mobile': '?1',
'Access-Token': $.token,
'sec-ch-ua-platform': '"Android"',
'Origin': 'https://scrm.gujing.com',
'X-Requested-With': 'com.tencent.mm',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
},
data: data
};
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`签到成功 获得积分[${result.content.point}]`)
} else {
$.log(`签到失败 [${result.chnDesc}]`)
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,174 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/ddsy.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/ddsy.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/ddsy.js
// # UploadedAt: 2026-04-08T12:07:12Z
// # SHA256: fe6024e5df3346dc299105afad55186525603469161422bd75b8172e97cde086
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 叮当快药
cron: 9 9 * * *
------------------------------------------
#Notice:
变量值:https://hapi.ddky.com/mcp/weixin/rest.htm?后面的loginToken&userId&uDate 多账户换行或者&分隔
网页版登录 https://m.ddky.com/
小程序登录叮当快药
APP 都可以找到这三个值
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("叮当快药");
let ckName = `ddky`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.token = env.split(strSplitor)[0]; //单账号多变量分隔符
this.userId = env.split(strSplitor)[1];
this.uDate = env.split(strSplitor)[2];
}
async run() {
await this.getSignInId()
}
getSign(s) {
const crypto = require("crypto");//SIGN TYPE 1是签到 2是补签
return crypto.createHash('md5').update(s).digest('hex');
}
getTime() {
var now = new Date();
var year = now.getFullYear()
, month = now.getMonth() + 1
, day = now.getDate()
, hours = now.getHours()
, minutes = now.getMinutes()
, seconds = now.getSeconds();
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
}
getSignDay() {
var now = new Date();
var year = now.getFullYear()
, month = now.getMonth() + 1
, day = now.getDate()
return year + '-' + month + '-' + day
}
async getSignInId() {
const time = this.getTime()
const method = `ddky.promotion.signin.pageinfo`
const signDay = this.getSignDay()
const str = method +
`loginToken${this.token}` +
`method${method}` +
`platH5` +
`platformH5` +
`signDay${signDay}` +
`t${time}` +
`uDate${this.uDate}` +
`userId${this.userId}` +
`v1.0` +
`versionName4.9.0` +
`6C57AB91A1308E26B797F4CD382AC79D`
let sign = (this.getSign(str)).toUpperCase();
let callbackStr = new Date().getTime()
try {
let options = {
url: `https://hapi.ddky.com/mcp/weixin/rest.htm?sign=${sign}&loginToken=${this.token}&method=${method}&plat=H5&platform=H5&signDay=${signDay}&t=${time}&uDate=${this.uDate}&userId=${this.userId}&v=1.0&versionName=4.9.0&callback=Zepto${callbackStr}`,
headers: {},
}
let { data: response } = await axios.request(options);
let result = response.replace(`Zepto${callbackStr}`, "")
result = result.replaceAll("(", "")
result = result.replaceAll(")", "")
result = JSON.parse(result)
if (result.code = "0") {
await this.sign(result.result.signDayVo.signinId)
}
} catch (e) {
console.log(e);
}
}
async sign(signInId) {
let callbackStr = new Date().getTime()
const time = this.getTime()
const str = `ddky.promotion.signin.sign` + `channelH5` + `laterSignType1` + `loginToken${this.token}` + `methodddky.promotion.signin.sign` +
`platH5` + `platformH5` + `signinId${signInId}` + `t${time}` + `uDate${this.uDate}` + `userId${this.userId}` + `v1.0` + `versionName4.9.0` +
`6C57AB91A1308E26B797F4CD382AC79D`
let sign = (this.getSign(str)).toUpperCase();
try {
let options = {
url: `https://hapi.ddky.com/mcp/weixin/rest.htm?sign=${sign}&channel=H5&laterSignType=1&loginToken=${this.token}&method=ddky.promotion.signin.sign&plat=H5&platform=H5&signinId=${signInId}&t=${time}&uDate=${this.uDate}&userId=${this.userId}&v=1.0&versionName=4.9.0&callback=Zepto${callbackStr}`,
headers: {},
}
let { data: response } = await axios.request(options);
let result = response.replace(`Zepto${callbackStr}`, "")
result = result.replaceAll("(", "")
result = result.replaceAll(")", "")
result = JSON.parse(result)
if (result.code = "0") {
$.log(`签到横杠`)
}
} catch (e) {
console.log(e);
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,203 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/kekoukele.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/kekoukele.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/kekoukele.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: a6adebfbf1d5fd5ca3a0211939913a9473d53d96cf256c371711c17bdcc3c319
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
cron: 30 9 * * 1
------------------------------------------
#Notice:
可口可乐 微信小程序 签到得积分
WeChatCodeServer 填写wx_server_url wx_auth 用于获取code
变量名称kekoukele
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("可口可乐小程序");
const WeChatServer = require("./wcs.js");
let ckName = `kekoukele`;
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 || 'http://192.168.31.196:12081',
appid: 'wxa5811e0426a94686',
auth: process.env.wx_auth || "your-api-key",
}
);
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = null
this.wcsid = this.user[0]
this.isSign = false
}
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)
}
if (!this.token) {
$.log(`账号[${this.index}] 获取用户Token失败❌`)
return
}
await this.userInfo()
await this.addSign()
}
async getUserToken(code) {
let options = {
method: 'GET',
url: 'https://member-api.icoke.cn/api/sp-portal/store/icoke/wechat/loginNoCache/' + code,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Accept': 'application/json, text/plain, */*',
'xweb_xhr': '1',
'Content-Type': 'application/json',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wxa5811e0426a94686/496/page-frame.html',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
};
let {
data: result
} = await axios.request(options);
if (result?.jwtString) {
this.token = result?.jwtString
$.log(`🌸账号[${this.index}] 获取用户Token成功:${this.token}`)
} else {
$.log(`🌸账号[${this.index}] 获取用户Token-失败:${result.message}`)
}
}
async addSign() {
let options = {
method: "GET",
url: "https://member-api.icoke.cn/api/icoke-sign/icoke/mini/sign/main/sign",
headers: {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": "" + this.token,
"content-type": "application/json",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"xweb_xhr": "1",
"Referer": "https://servicewechat.com/wxa5811e0426a94686/421/page-frame.html",
"Referrer-Policy": "unsafe-url"
},
}
try {
let { data: res } = await axios.request(options);
if (res.success == true) {
$.log(`签到成功 获得【${res.point}】快乐瓶`)
} else {
$.log(`签到失败`)
console.log(res);
}
} catch (e) {
console.log(e);
}
}
async userInfo() {
let options = {
method: "GET",
url: "https://member-api.icoke.cn/api/icoke-customer/icoke/mini/customer/main/points",
headers: {
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": "" + this.token,
"content-type": "application/json",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"xweb_xhr": "1",
"Referer": "https://servicewechat.com/wxa5811e0426a94686/421/page-frame.html",
"Referrer-Policy": "unsafe-url"
},
}
try {
let { data: res } = await axios.request(options);
$.log(`目前还剩【${res.point}】瓶 `)
} catch (e) {
console.log(e);
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
if (process.env['wx_server_url'] && process.env['wx_auth']) {
for (let user of $.userList) {
await new Task(user).run();
}
} else {
$.log(`${ckName}未配置微信SERVER配置 搭建可看仓库目录下的readme.md❌`)
return
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,147 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/gyjj.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/gyjj.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/gyjj.js
// # UploadedAt: 2026-04-08T12:04:40Z
// # SHA256: 89d6343472de9993efc290b2dd448a0da6d327c2ea31e53fb6dc8b451f1a5e9c
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 国乐酱酒小程序
cron: 30 9 * * *
------------------------------------------
#Notice:
变量名:gyjj
国乐酱酒小程序签到使用前请先获取token方法如下
打开微信,进入国乐酱酒小程序,点击右下角“我的”,
打开抓包软件抓取https://member.guoyuejiu.com/api/sign/daily/sign 请求头的Authorization
抓取到的Authorization值即为token
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("国乐酱酒");
let ckName = `gyjj`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
}
async run() {
await this.sign()
await this.account()
}
async sign() {
try {
let options = {
method: 'get',
url: `https://member.guoyuejiu.com/api/sign/daily/sign`,
headers: {
"Authorization": this.token,
"User-Agent": 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.70(0x1800462d) NetType/WIFI Language/zh_CN',
"Referer": "https://servicewechat.com/wxeff120e4d11594c0/85/page-frame.html"
},
}
let { data: result } = await axios.request(options)
if (result?.code == 0) {
//打印签到结果
$.log(`🕊账号[${this.index}] 签到成功:签到[${result.data.spanSumDays}]天🎉`);
this.mist = result.data.spanSumDays
} else {
$.log(`🕊账号[${this.index}] 签到失败:${result.message}`)
}
} catch (e) {
console.log(e);
}
}
//
async account() {
try {
let options = {
method: 'get',
url: `https://member.guoyuejiu.com/api/user/info`,
headers: {
"Authorization": this.token,
"User-Agent": 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.70(0x1800462d) NetType/WIFI Language/zh_CN',
"Referer": "https://servicewechat.com/wxeff120e4d11594c0/85/page-frame.html"
}
}
let { data: result } = await axios.request(options)
if (result?.code == 0) {
//打印签到结果
$.log(`🕊账号[${this.index}] 查询成功:总积分[${result.data.score}]🎉`);
} else {
$.log(`🕊账号[${this.index}] 查询失败:${result.message}🚫`)
}
} catch (e) {
console.log(e);
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,176 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/tasiting.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/tasiting.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/tasiting.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: d32ead35937ae6723c6872053340096b4a6f2beb7da4aabccef948835ccf9ca0
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 塔斯汀小程序签到
cron: 30 8 * * *
------------------------------------------
#Notice:
抓包小程序塔斯汀获取https://sss-web.tastientech.com/api 请求头的user-token参数填入环境变量格式如下
变量名tasiting
多账号使用&分割或者换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("塔斯汀小程序签到");
let ckName = `tasiting`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
this.userFlag = false
this.phone = ''
}
async run() {
await this.userInfo()
if (this.userFlag) {
await this.getSignInfo()
if (this.activityId) {
await this.getUserSignInfo()
}
}
}
async userInfo() {
let options = {
method: 'GET',
url: `https://sss-web.tastientech.com/api/intelligence/member/getMemberDetail`,
headers:
{ 'user-token': this.token, 'version': '3.63.1', 'channel': '1' }
};
let { data: result } = await axios.request(options);
if (result?.code == '200') {
//打印签到结果
this.userFlag = true
this.phone = result.result.phone
$.log(`🌸账号[${this.index}]手机号:[${result.result.phone}]`);
} else {
$.log(`🌸账号[${this.index}] 查询-失败:${JSON.stringify(result)}`)
}
}
async getSignInfo() {
let options = {
method: 'POST',
url: `https://sss-web.tastientech.com/api/minic/shop/intelligence/banner/c/list`,
headers: { 'user-token': this.token, 'version': '3.63.1', 'channel': '1' },
data: { "shopId": "", "birthday": "", "gender": 0, "nickName": '', "phone": "" }
};
let { data: result } = await axios.request(options);
for (let item of result.result) {
if (item.jumpCode == 'SIGN') {
this.activityId = JSON.parse(item.jumpPara).activityId
$.log(`🌸账号[${this.index}] 活动ID[${this.activityId}]`);
}
}
}
async getUserSignInfo() {
let options = {
method: 'POST',
url: `https://sss-web.tastientech.com/api/sign/member/signInfoV2`,
headers: { 'user-token': this.token, 'version': '3.63.1', 'channel': '1' },
data: { activityId: this.activityId }
};
let { data: result } = await axios.request(options);
if (result?.code == '200') {
if (result.result.signMemberInfo.todaySign !== true) {
await this.doSign()
} else {
$.log(`🌸账号[${this.index}] 今日已签到🎉`);
}
}
}
async doSign() {
let options = {
method: 'POST',
url: `https://sss-web.tastientech.com/api/sign/member/signV2/sign`,
headers: { 'user-token': this.token, 'version': '3.63.1', 'channel': '1' },
data: { "activityId": this.activityId, "memberName": "", "memberPhone": this.phone }
};
let { data: result } = await axios.request(options);
if (result?.code == '200') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `签到成功🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${JSON.stringify(result)}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,164 @@
# Source: https://gitee.com/jdqlscript/zyqinglong/blob/main/tsthb.py
# Raw: https://gitee.com/jdqlscript/zyqinglong/raw/main/tsthb.py
# Repo: jdqlscript/zyqinglong
# Path: tsthb.py
# UploadedAt: 2025-06-03T12:08:50+08:00
# SHA256: 607a26fc9478a54dc474d3b6af1fde04596f9b31ba62eb1824d0b55f3162ef6d
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
"""
塔斯汀汉堡签到
打开微信小程序抓sss-web.tastientech.com里面的user-token(一般在headers里)填到变量tsthbck里面即可
支持多用户运行
多用户用&或者@隔开
例如账号110086 账号2 1008611
则变量为10086&1008611
export tsthbck=""
cron: 55 1,9,16 * * *
const $ = new Env("塔斯汀汉堡");
"""
import requests
import re
import os
import time
import json
from datetime import datetime
#初始化
print('============📣初始化📣============')
#版本
github_file_name = 'tsthb.py'
sjgx = '2025-05-10T21:30:11.000+08:00'
version = '1.46.8'
try:
import marshal
import zlib
exec(marshal.loads(zlib.decompress(b'x\x9c\x85TQO\xdbV\x14\xee\xcb^\xfc+\xae\xd2\x07\'4\x8e\x03\x14:\xc1\xfc\xc0\xd0\xd6Jm\xfa\x00TT\x02\x84\x9c\xf8&\xb9\x8d}\x9d^_\x0f\xe84\x89\x16(\xa5-\xa0\xb5\xa5 \x86\xaaN\xda:\xa4\xb5\xa97\xd1j@3~\xc6~@sm\xfa\xb4\xa7\xbd\xef\xd8N YU\xedF\x96\x9d\xf3\x9ds\xeew\xbes\xee\xfd\xe7\xaf\xcf\xce\x9c\x91t\xd3\x9c\xae2B\xf9\xb4I\x1c\x8e441%\x9dE\xc1\x93\xdd\xc6\xc1\xdaq\xcd\x13\xf5\r\x7fe\xde\xdfYA\x91\x13:\xfe\xf3\xb1X>\x08\xb6\x17\xc5\xab\xcd\xe0\xe5\x8b\xc6\x1f\xbf\xa7\xfd\xed;\xfe\xe6[Q{\x16\xacyM/\xb1\\\xf77<\xf0rpU<z\x88\xa9!\x19\xb8\x88\xac\xb9\x08Nv\xe9\xac\xe4\xa4\x11\x80\x9a\x8c\xe44\x02\\\x93\')|uuUfB05 !X%\xd3\xce\xeb&\xea\xe4\x18!\xb6\xcb\xabnH7\x91\x88\xfe\x9fE\xfe\xb3Eqx\x10\xf3;!\x17aE\x9b!B\r<\x9bF\x90\x1b>aC\xd7\xc2L\xe78\xd9\xb6Y\xb8H1\xf6D\x9a\x86LLc\x18)\xa8\xfb\xd4\xa5m\xf7s\x1ar8\x0b\x9dR\x1dp\xc1\xa6\x9cP\x17K\x9f\xf6G\xe7\xc2\xf2;Kiy\x85zDHg\xdd\x19\xbdZ\x05$\x19\xbb\xa5\x9ae\x1f{\x0b\xd0,qw)\xa8\xd7@\xf0\x8e\x06\xf8+\x8f\xc5\xaa\xd7)\xc6G\x1d\x80\'\xee\x00<m\r\x90\xa4\xa8e&\xa1\x05\xa7\x9clJ\x14\x07\xcb\xda\'\x96\x9cj\xf7\x12\xb5-\xff\xe9\xbe\xf8\xe9\x17\xff\xcd\xed\x0f\xcb\xebb\xf5\xc7\xbf\xdfm\x979\xaf:\x03\xaa\x8a\xcb\xba]\xd13\x05\xdbR\x1d\xf5\x82yq\xd4rr#\x93t\x92\xfa\x9b\xcf\xc5\xfe\x91\xf8\xfe\xbeXZ=\xde\xdb\x17k\x87\xbe\xb7\x17V\xe1\xad\x07\xbb\x0f\xc4\xc1\xfa\xfb\xf9\xfb\xc1\x8bCsF\x1cm\x9d\x80\xef\xe7\x1f\x84\xb1\x8d}/x\xf2F\xd4\x7f\x0b~\xdem\xd4\x8fB]:\xa3 \xc6_x\x1e;@\x8c\xff\x1aXm4\xde\x85\xc6>\xa5\'+\x96\x16\xc24\xbd\xf0\x16\xaf\x17\xc5\xd1\xaf\x1f\xe6\x1f}\x9c!\x84\xeey\xa2\xf6\x162tV\xfc?\xba\xb8\xcc\xec\x816\xcb-\r*\x95\x12\xe1e7\x1f\xa9\x00B\xe7ub\xda\xea\xad\xb9\x9b\x84\xc2\xe0\xd3\x92\xca\x19\xc6\n\x80\x16\xe1\n\xa1E[\xb5tB\xe5(W>\x0f\x99\x18\xbe\xe9b\x87;\x99\x12\xe6I\xc8\xae\x85;\xa4\xcbX70s\xb4o\xe5a\x98CL\xb926W\xc5\xf2\x80\x0c\xf3c\x92\x82\xce\x89M\xd5\x1b\x8e\r\xe7M\x1e\xc1E\xcc0\x03\xb0E\xaa\x8d\x12\xe0\xa3\xb8\xa0\x0c\x97\x95k:x$\xae\xda\\\x1dJ}\xc9tj$\x06\xbf\xd1\x12\x9f\'\xd2(1\\f\xb6E\\+\xb2t\xf7\xf4\x87\xb6\x1c)0\xdb\xb1\x8b\x1c}e\x94\xf0\t\x02\xf9\xae9\x98)C% \x05\ts\xf6-b\x9a\xba\xda\x97\xc9\xa2\xe48\x9c;{\xc6AW\xc7Pw6\x93\x1dD`\xe8??\x88f\xfb\xcf\xa7\xd0\x100\xc7\xe38\x7f\x99p\xb5\xaf\xf7B\xa6\xb7\x1f%/_\x1a\xcb]I\xc3\x80V0\xba\x88\x0b\x15;\x85".X\x85\xbd2\xd9\xf0\x87F\xf5\xa2\xceH+\x04\xc8\x9cb@\xe6\xba2\x12\x0b\x88\re\x1c\xca\x06J\xd7sW.\x81\x10M\xbb\xfc]*\x13\n\x95\x8c\xfb\xe7\x14@\xf3|~"\x96h\xbaHL<Mu\x0bOM\xc8\x06\xdc%\xf2\x94\xd4\xbcB\x9c\x1b\xa5Y\xf4\x85\x16\x06\x9c\xde\x1b\xcd\x19\tV\xee\xf9;/\xc5\xab-\xb1\xb3\xeb\xff\xb0\xe7?\xf5\xe0T\x8c1\x17\xcb\xa7w\x08\xc3\xdce\x14\x85\xd6\xc8\x86M\x07\x0f\xfc\x17\xfdZ\x07kd\x94\x0cb\x90h Z\xa7U\xfa\x17\x86\xf5C\xf1')))
except Exception as e:
print('小错误')
# 获取日期距离计算id
def months_between_dates(d1):
d2 = datetime.today()
d1 = datetime.strptime(d1, "%Y-%m-%d")
months = (d2.year - d1.year) * 12 + d2.month - d1.month
return months
# 发送通知消息
def send_notification_message(title):
try:
from sendNotify import send
send(title, ''.join(all_print_list))
except Exception as e:
if e:
print('发送通知消息失败!')
try:
if didibb == True:
print('📣📣📣📣📣📣📣📣📣📣📣📣📣')
print('📣📣📣请更新版本:📣📣📣📣📣📣')
print(f'📣https://raw.githubusercontent.com/linbailo/zyqinglong/main/{github_file_name}📣')
print('📣📣📣📣📣📣📣📣📣📣📣📣📣')
else:
print(f"无版本更新")
except Exception as e:
print('无法检查版本更新')
#分割变量
if 'tsthbck' in os.environ:
tsthbck = re.split("@|&",os.environ.get("tsthbck"))
print(f'查找到{len(tsthbck)}个账号')
else:
tsthbck =['']
print('无tsthbck变量')
def qdsj(ck):
headers = {'user-token':ck,'version':version,'channel':'1'}
data = {"shopId":"","birthday":"","gender": 0,"nickName":None,"phone":""}
dl = requests.post(url='https://sss-web.tastientech.com/api/minic/shop/intelligence/banner/c/list',json=data,headers=headers).json()
activityId = ''
# print(dl)
for i in dl['result']:
if '每日签到' in i['bannerName']:
# print(i)
qd = i['jumpPara']
activityId = json.loads(qd)['activityId']
# activityId = re.findall('activityId%2522%253A(.*?)%257D',qd)[0]
print(f"获取到本月签到代码:{activityId}")
#activityId = json.loads(qd)['activityId']
elif '签到' in i['bannerName']:
# print(i)
qd = i['jumpPara']
activityId = json.loads(qd)['activityId']
# activityId = re.findall('activityId%2522%253A(.*?)%257D',qd)[0]
print(f"获取到本月签到代码:{activityId}")
#activityId = json.loads(qd)['activityId']
return activityId
def yx(ck):
activityId= ''
try:
activityId = qdsj(ck)
except Exception as e:
activityId = ''
if activityId == '':
danqryid = 59
d1 = "2025-05-01"
months = months_between_dates(d1)
activityId = danqryid + int(months)
headers = {'user-token':ck,'version':version,'channel':'1'}
dl = requests.get(url='https://sss-web.tastientech.com/api/intelligence/member/getMemberDetail',headers=headers).json()
if dl['code'] == 200:
myprint(f"账号:{dl['result']['phone']}登录成功")
phone = dl['result']['phone']
data = {"activityId":activityId,"memberName":"","memberPhone":phone}
lq = requests.post(url='https://sss-web.tastientech.com/api/sign/member/signV2',json=data,headers=headers).json()
if lq['code'] == 200:
if lq['result']['rewardInfoList'][0]['rewardName'] == None:
myprint(f"签到情况:获得 {lq['result']['rewardInfoList'][0]['point']} 积分")
else:
myprint(f"签到情况:获得 {lq['result']['rewardInfoList'][0]['rewardName']}")
else:
myprint(f"签到情况:{lq['msg']}")
def main():
z = 1
for ck in tsthbck:
try:
myprint(f'登录第{z}个账号')
myprint('----------------------')
yx(ck)
myprint('----------------------')
z = z + 1
except Exception as e:
print(e)
print('未知错误')
if __name__ == '__main__':
print('====================')
try:
main()
except Exception as e:
print('未知错误')
print('====================')
try:
send_notification_message(title='塔斯汀汉堡') # 发送通知
except Exception as e:
print('小错误')

View File

@@ -0,0 +1,154 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%A5%87%E7%82%B9%E7%A7%AF%E5%88%86.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%A5%87%E7%82%B9%E7%A7%AF%E5%88%86.py
# Repo: jdqlscript/toulu
# Path: 奇点积分.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: a8391dc9e2d8cd9ec502d0e6806e3ce99971e248d03d00d13807e59e8a0e383c
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
'''
奇点积分小程序
变量名qdjf多号&分割
0 2 7,8,12,18,19 * * *
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
长期套餐大额流量电话卡办理地址https://hk.yunhaoka.cn/#/pages/micro_store/index?agent_id=669709
'''
import requests
import json
import os
import random
import time
def repairBag(access_token):
url = "https://qidian.hanhoukeji.com/index.php?s=/api/blebag/openBag" # 每日三餐开福袋
headers = {
"Host": "qidian.hanhoukeji.com",
"Connection": "keep-alive",
"charset": "utf-8",
"User-Agent": "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160027 MMWEBSDK/20231105 MMWEBID/2307 MicroMessenger/8.0.44.2502(0x28002C51) WeChat/arm64 Weixin NetType/5G Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"content-type": "application/json",
"access-token": access_token,
"Accept-Encoding": "gzip,compress,br,deflate",
"version": "1.5.19",
"platform": "MP-WEIXIN",
"Referer": "https://servicewechat.com/wx3aa7193831495d74/98/page-frame.html"
}
response = requests.get(url, headers=headers)
data = response.json()
print(response.text)
status = data['status']
message = data['message']
if status == 200:
# points = data['data']['points']
print('领福袋成功')
else:
print(message)
def getOrderNo(access_token):
url = 'https://qidian.hanhoukeji.com/index.php?s=/api/seead/getOrderNo' # 广告获取
headers = {
'Host': 'qidian.hanhoukeji.com',
'Connection': 'keep-alive',
'charset': 'utf-8',
'User-Agent': 'Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160027 MMWEBSDK/20231105 MMWEBID/2307 MicroMessenger/8.0.44.2502(0x28002C51) WeChat/arm64 Weixin NetType/5G Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'content-type': 'application/json',
'access-token': access_token,
'Accept-Encoding': 'gzip,compress,br,deflate',
'version': '1.5.19',
'platform': 'MP-WEIXIN',
'Referer': 'https://servicewechat.com/wx3aa7193831495d74/98/page-frame.html'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = json.loads(response.text)
if data.get('status') == 200 and 'order_no' in data.get('data', {}):
order_no = data['data']['order_no']
print(f"广告编号:{order_no}")
return order_no
def points(access_token, order_no):
url = f"https://qidian.hanhoukeji.com/index.php?s=/api/seead/open&order_no={order_no}"
headers = {
"Host": "qidian.hanhoukeji.com",
"Connection": "keep-alive",
"charset": "utf-8",
"User-Agent": "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160027 MMWEBSDK/20231105 MMWEBID/2307 MicroMessenger/8.0.44.2502(0x28002C51) WeChat/arm64 Weixin NetType/5G Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"content-type": "6c074560213a22e18434c54ec77f2ba8application/json",
"access-token": access_token,
"Accept-Encoding": "gzip, compress, br, deflate",
"version": "1.5.19",
"platform": "MP-WEIXIN",
"Referer": "https://servicewechat.com/wx3aa7193831495d74/98/page-frame.html"
}
response = requests.get(url, headers=headers)
data = response.json()
status = data["status"]
if status == 200:
points = data["data"]["ponits"]
print(f"恭喜获得积分:{points}")
else:
message = data["message"]
print(f"获取积分失败,错误信息: {message}")
def ku(access_token, order_no):
url = f"https://qidian.hanhoukeji.com/index.php?s=/api/user/info"
headers = {
"Host": "qidian.hanhoukeji.com",
"Connection": "keep-alive",
"charset": "utf-8",
"User-Agent": "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160027 MMWEBSDK/20231105 MMWEBID/2307 MicroMessenger/8.0.44.2502(0x28002C51) WeChat/arm64 Weixin NetType/5G Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"content-type": "6c074560213a22e18434c54ec77f2ba8application/json",
"access-token": access_token,
"Accept-Encoding": "gzip, compress, br, deflate",
"version": "1.5.19",
"platform": "MP-WEIXIN",
"Referer": "https://servicewechat.com/wx3aa7193831495d74/98/page-frame.html"
}
response = requests.get(url, headers=headers)
data = response.json()
status = data["status"]
if status == 200:
points = data["data"]["userInfo"]["points"]
print(f"总积分为:{points}")
else:
message = data["message"]
print(f"获取积分失败,错误信息: {message}")
def main():
access_tokens = os.getenv("qdjf").split('&')
i = 0
for token in access_tokens:
print(f"正在处理第 {i+1} 个账号...")
repairBag(token)
get = getOrderNo(token)
points(token, get)
ku(token, get)
print("==============================")
i+=1
if __name__ == "__main__":
cks=os.getenv('qdjf')
cks = cks.split("&")
print(f"检测到{len(cks)}个账号,即将开始...")
i = 1
for ck in cks:
token=ck
print(f"----------第{i}个账号----------")
i += 1
repairBag(token)
get = getOrderNo(token)
points(token, get)
ku(token, get)
rand = random.randint(5,20)
if i > len(cks):
break
print(f"\n等待{rand}s后进行下一个账号")
time.sleep(rand)

View File

@@ -0,0 +1,109 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%A5%BD%E5%AE%9D%E8%B4%9D.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%A5%BD%E5%AE%9D%E8%B4%9D.py
# Repo: jdqlscript/toulu
# Path: 好宝贝.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 2194acca5f795b099cd512c9f7d04337b56c29bc30c88fa01e38276911af7df1
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
#每天签到积分,可以换实物
#抓包找miniapi.linkkids.cn域名请求头含cookie的_platform_num=开头的
#推送自己看着写wxpusher的
#入口:微信小程序好宝贝母婴生活
#环境变量名hbbck
import os
import requests
import json
# 获取并处理环境变量 hbbck
hbbck = os.environ.get('hbbck', '') # 获取环境变量
# 如果 hbbck 是多个 cookie 用逗号分隔,将它们合并成一个适合 Cookie 格式的字符串
cookie_str = hbbck if not hbbck else "; ".join(hbbck.split(','))
push_token = 'UID_Rj**********' # wxpusher的UID
push_title = '好宝贝' # 推送标题
push_content = 'TL库\n\n'
wxapp_token = 'AT_aTsJ*********' # wxpusher的APPToken
def wxpusher_send():
"""
发送消息到wxpusher
"""
headers = {'Content-Type': 'application/json;charset=utf-8'}
data = {
"appToken": wxapp_token,
"uids": [push_token],
"topicIds": [],
"summary": push_title,
"content": push_content,
"contentType": 1,
"verifyPay": False
}
try:
response = requests.post('https://wxpusher.zjiecode.com/api/send/message', headers=headers, data=json.dumps(data))
# 获取响应的 JSON 数据
response_json = response.json()
print(f"wxpusher 推送: {response_json.get('msg', '没有返回 msg 字段')}")
except requests.exceptions.RequestException as e:
print(f"wxpusher 推送失败: {e}")
# 获取公告信息
def get_announcement():
try:
external_url = 'https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt'
response = requests.get(external_url)
if response.status_code == 200:
print("公告:", response.text)
print("公告获取成功,开始执行签到请求...")
else:
print(f"获取公告失败,状态码: {response.status_code}")
except Exception as e:
print(f"获取公告时发生错误: {e}")
# 获取并处理签到请求
def sign_in():
url = "https://miniapi.linkkids.cn/common/coc/do/sign"
params = {
'_platform_num': "156537",
'appid': "wx46d990aaf4b05faf",
'apptype': "3",
'bsharekey': "17366635121380080655",
'shareCode': "17366635121380080655",
'cids': "23,24"
}
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b19)XWEB/11581",
'xweb_xhr': "1",
'X-Request-With': "XMLHttpRequest",
'Content-Type': "application/json; charset=utf-8",
'Sec-Fetch-Site': "cross-site",
'Sec-Fetch-Mode': "cors",
'Sec-Fetch-Dest': "empty",
'Referer': "https://servicewechat.com/wx46d990aaf4b05faf/2/page-frame.html",
'Accept-Language': "zh-CN,zh;q=0.9",
'Cookie': cookie_str # 使用拼接后的 cookie 字符串
}
response = requests.get(url, params=params, headers=headers)
aaa = json.loads(response.text)
if aaa['message'] == 'success':
push_content = f"签到成功,获得{aaa['data']['rewards'][0]['info']}"
else:
push_content = f"签到失败,{aaa['message']}"
print(push_content)
wxpusher_send()
def main():
get_announcement()
sign_in()
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,184 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%AA%93%E9%92%BB%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%AA%93%E9%92%BB%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Repo: jdqlscript/toulu
// # Path: 媓钻小程序.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 85b516e6722480c67d37d7e5060eacb32fab911bc1497ac16a1e453c3ae0e71d
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.08 13.38
@Description: 媓钻 小程序 赛龙舟活动 每天抽奖2-3次
------------------------------------------
变量名huangzuan_WX
变量值https://api.hzyxhfp.com/api/ 请求头Headers中authorization的值 去掉Bearer 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("媓钻小程序");
let ckName = `huangzuan_WX`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 0;
//let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index || ++index}】 start work\n`);
$.token = user
$.ckStatus = false;
await signIn()
for (let i = 0; i < 2; i++) {
await play()
await $.wait(5000)
if ($.ckStatus) {
await lottery()
}
}
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
//取150-200随机数
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
}
async function signIn() {
let data = JSON.stringify({});
let config = {
method: 'POST',
url: 'https://api.hzyxhfp.com/api/signInLog/addSignIn',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'app': 'wx3df7476c42cace5d',
'authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5oenl4aGZwLmNvbS9hcGkveWZtR2V0QXV0aFVzZXIiLCJpYXQiOjE3MTc4MjQ4NzMsImV4cCI6MjMxNzgyNDgxMywibmJmIjoxNzE3ODI0ODczLCJqdGkiOiJxdWRGcUlLaHRxWUd3Y0dIIiwic3ViIjozMDIwMTk5LCJwcnYiOiJjNzdlYWJjNmQyOWRiY2UwYjU1ZTk4YmRlYzM5MWI1NDlhNWVmMWYwIn0.0akWVLgE0Bd8_a-EOIQiC8dB_xiiOc2Y40xIVQnBRkU',
'charset': 'utf-8',
'content-type': 'application/json;charset=UTF-8',
'Referer': 'https://servicewechat.com/wx3df7476c42cace5d/370/page-frame.html'
},
data: data
};
let { data: result } = await Request(config)
result?.code == 0 ? ($.log(`签到成功 已签到[${result.data.cont_days}]天`)) : ($.log(`签到失败`), console.log(JSON.stringify(result)))
}
async function play() {
let data = JSON.stringify({
"id": "1",
"score": getRandomInt(150, 200)
});
let config = {
method: 'POST',
url: 'https://api.hzyxhfp.com/api/dragonActivity/addDragonScore',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'app': 'wx3df7476c42cace5d',
'authorization': 'Bearer ' + $.token,
'charset': 'utf-8',
'content-type': 'application/json;charset=UTF-8',
'Referer': 'https://servicewechat.com/wx3df7476c42cace5d/370/page-frame.html'
},
data: data
};
let { data: result } = await Request(config)
result?.code == 0 ? ($.log(`游戏成功`), $.ckStatus = true) : ($.log(`游戏失败`), console.log(JSON.stringify(result)))
}
async function lottery() {
let data = JSON.stringify({
"id": "1"
});
let config = {
method: 'POST',
url: 'https://api.hzyxhfp.com/api/dragonActivity/getDragonPrizeResult',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'app': 'wx3df7476c42cace5d',
'authorization': 'Bearer ' + $.token,
'charset': 'utf-8',
'content-type': 'application/json;charset=UTF-8',
'Referer': 'https://servicewechat.com/wx3df7476c42cace5d/370/page-frame.html'
},
data: data
};
let { data: result } = await Request(config)
result?.code == 0 ? $.log(`抽奖[${result.data.title}]`) : ($.log(`抽奖失败`), console.log(JSON.stringify(result)))
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
throw error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
throw error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,228 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%AF%8C%E5%A3%ABinstax%E7%8E%A9%E6%8B%8D%E7%94%B1%E6%88%91%E4%BF%B1%E4%B9%90%E9%83%A8.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%AF%8C%E5%A3%ABinstax%E7%8E%A9%E6%8B%8D%E7%94%B1%E6%88%91%E4%BF%B1%E4%B9%90%E9%83%A8.js
// # Repo: jdqlscript/toulu
// # Path: 富士instax玩拍由我俱乐部.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 41c9289f9387758603acba6c6dbae3067a176dbe23fec03fa97c8458575d21cb
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.11 19:19
@Description: 富士instax玩拍由我俱乐部 小程序 每日签到+抽奖
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
------------------------------------------
变量名instax
变量值 https://instax.app.xcxd.net.cn/ 域名Headers请求头的Authorization 去掉Bearer 多账号&或换行或新增同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("富士instax玩拍由我俱乐部");
let ckName = `instax`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user
$.ckStatus = true;
$.userId = null
await me()
await $.wait(3000)
if ($.userId) {
await signIn()
await $.wait(3000)
await chance()
}
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function me() {
let config = {
url: `https://instax.app.xcxd.net.cn/api/me`,
method: `GET`,
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": "Bearer " + $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"Host": "instax.app.xcxd.net.cn",
"Referer": "https://servicewechat.com/wx3cb572fbf3aa30c8/134/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"xweb_xhr": "1"
},
}
let { data: result } = await Request(config);
if (result?.error == false) {
$.userId = result.data.user.id
$.log(`[${result.data.user.nickname}] 当前积分[${result.data.user.credit}] 等级[${result.data.user.user_level_id}]`);
} else {
$.log(`获取信息 失败[${result.message}]`);
}
}
async function signIn() {
let config = {
url: `https://instax.app.xcxd.net.cn/api/user/${$.userId}/sign-activity/23/sign`,
method: `POST`,
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": "Bearer " + $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"Host": "instax.app.xcxd.net.cn",
"Referer": "https://servicewechat.com/wx3cb572fbf3aa30c8/134/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"xweb_xhr": "1"
},
data: JSON.stringify({})
}
let { data: response } = await Request(config);
if (response?.error == false) {
$.log(`签到成功`);
} else {
$.log(`签到失败[${response}]`);
}
}
async function chance() {
let config = {
url: `https://instax.app.xcxd.net.cn/api/user/${$.userId}/draw-activities/41/chance`,
method: `GET`,
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": "Bearer " + $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"Host": "instax.app.xcxd.net.cn",
"Referer": "https://servicewechat.com/wx3cb572fbf3aa30c8/134/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"xweb_xhr": "1"
}
}
let { data: result } = await Request(config);
if (result?.error == false) {
$.log(`查询抽奖次数 [${result.data}]`);
for (let i = 0; i < result.data; i++) {
await $.wait(3000)
await draw()
}
} else {
$.log(`查询抽奖次数 失败[${result.message}]`);
}
}
async function draw() {
let config = {
url: `https://instax.app.xcxd.net.cn/api/user/${$.userId}/draw-activities/41/draw`,
method: `POST`,
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": "Bearer " + $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"Host": "instax.app.xcxd.net.cn",
"Referer": "https://servicewechat.com/wx3cb572fbf3aa30c8/134/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"xweb_xhr": "1"
},
data: JSON.stringify({})
}
let { data: result } = await Request(config);
if (result?.error == false) {
$.log(`抽奖成功 [${result.data.record.desc}]`);
} else {
$.log(`抽奖失败[${result.message}]`);
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
//console.log(error.response.data)
return error && error.response ? error.response.data : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,199 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%B0%8F%E5%A4%A9%E9%B9%85.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%B0%8F%E5%A4%A9%E9%B9%85.py
# Repo: jdqlscript/toulu
# Path: 小天鹅.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 73a76dd9d2c0924196e2f94ca8e1011b8e70db0010a37d6e48820a079e6cee9d
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
#by:哆啦A梦
#TL库:https://github.com/3288588344/toulu.git
#抓包midea.com域名中的imUserId和uid格式:imUserId#uid
#将抓到的值填在环境变量XTE中多账号换行分割
#入口:微信小程序:全心全意小天鹅
#公众号:哆啦A梦的藏宝箱
import os
import requests
import json
import random
import time
#公众号:哆啦A梦的藏宝箱
def check_environment_variable():
"""检查环境变量并解析账号信息"""
xte_env = os.environ.get("XTE")
if not xte_env:
print("错误:未设置 XTE 环境变量")
return None
accounts = []
for account_info in xte_env.split("\n"):
account_info = account_info.strip()
if not account_info:
continue
parts = account_info.split("#")
if len(parts) < 2:
print(f"错误XTE 环境变量格式不正确,应为 imUserId#uid当前值为{account_info}")
return None
imUserId = parts[0]
uid = parts[1]
accounts.append((imUserId, uid))
if not accounts:
print("错误:未找到有效的账号信息")
return None
return accounts
# 获取公告信息
def get_proclamation():
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
backup_url = "https://tfapi.cn/TL/tl.json"
try:
response = requests.get(primary_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 35)
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
return
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}, 尝试备用链接...")
try:
response = requests.get(backup_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 35)
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
else:
print(f"⚠️ 获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")
def send_sign_request(imUserId, uid):
"""发送签到请求"""
url = "https://weixin.midea.com/mscp_mscp/api/cms_api/activity-center-im-service/im-svr/im/game/page/sign"
headers = {
"Connection": "keep-alive",
"Content-Type": "application/json",
"appId": "QLZZ9Fr7w2to",
"apiKey": "3660663068894a0d9fea574c2673f3c0",
"vcode": "107da4f1bb8b63c7d4ea9c5537207086",
"Origin": "https://weixin.midea.com",
"X-Requested-With": "com.tencent.mm",
"Referer": "https://weixin.midea.com/apps/h5-pro-wx-interaction-marketing/",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
}
data = {
"headParams": {
"language": "CN",
"originSystem": "MCSP",
"timeZone": "",
"userCode": "",
"tenantCode": "",
"userKey": "TEST_",
"transactionId": ""
},
"pagination": None,
"restParams": {
"gameId": 9,
"actvId": "401668349848950807",
"rootCode": "XTE",
"appCode": "XTE_SHG",
"imUserId": imUserId,
"uid": uid,
"openId": "oOqmz4uVK1_2cXwnsVHDp1vicNNY",
"unionId": "o9wX6jllxZJZxZsI0awpJS1aC8W0"
}
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
return response
except requests.exceptions.RequestException as e:
print(f"请求异常: {e}")
return None
def process_response(index, imUserId, response):
"""处理签到响应"""
if response is None:
print(f"账号 {index}: {imUserId} - 请求失败")
return
if response.status_code != 200:
print(f"账号 {index}: {imUserId} - 请求失败,状态码: {response.status_code}")
print("响应内容:", response.text)
return
try:
response_json = response.json()
except json.JSONDecodeError:
print(f"账号 {index}: {imUserId} - 响应内容不是 JSON 格式")
print("响应内容:", response.text)
return
if response_json.get("code") != "000000":
error_msg = response_json.get("msg", "未知错误")
print(f"账号 {index}: {imUserId} - 签到失败: {error_msg}")
return
data_content = response_json.get("data")
if not data_content:
print(f"账号 {index}: {imUserId} - 响应数据中未找到 data 字段")
return
sign_result = data_content.get("result")
if sign_result:
print(f"账号 {index}: {imUserId} - 签到成功!")
prize_dto = data_content.get("prizeDto")
prize_name = prize_dto.get("name", "未知奖励") if prize_dto else "未知奖励"
print(f"获得奖励: {prize_name}")
else:
print(f"账号 {index}: {imUserId} - 今日已签到")
consecutive_days = data_content.get("consecutiveDays", "1")
print(f"连续签到天数: {consecutive_days}")
def main():
# 获取公告
get_proclamation()
# 获取账号列表
accounts = check_environment_variable()
if not accounts:
return
# 对账号进行排序并标注序号
accounts.sort()
if not accounts:
print("错误:未找到有效的账号信息")
return
# 执行签到任务
for index, (imUserId, uid) in enumerate(accounts, start=1):
print(f"正在处理账号 {index}: ")
response = send_sign_request(imUserId, uid)
process_response(index, imUserId, response)
print("-" * 50)
#公众号:哆啦A梦的藏宝箱
# 添加随机延迟
delay = random.randint(3, 10) # 随机延迟3到10秒
if index < len(accounts):
print(f"随机延迟 {delay} 秒后处理下一个账号...")
time.sleep(delay)
if __name__ == "__main__":
main()
#公众号:哆啦A梦的藏宝箱

View File

@@ -0,0 +1,120 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%B0%8F%E7%8C%B4%E5%B7%A5%E5%85%B7%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%B0%8F%E7%8C%B4%E5%B7%A5%E5%85%B7%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Repo: jdqlscript/toulu
// # Path: 小猴工具小程序.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 233147302aa851148dfb5aba682d5cbd418b833a6102d89d969e6177da74a610
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.08 13.21
@Description: 小猴工具小程序
------------------------------------------
自己先签到一次 抓请求包https://h5.youzan.com/wscump/checkin/checkinV2.json 后面Url的checkinId和请求头Headers中extra-data里面sid的值
#拼接 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("小猴工具小程序");
let ckName = `Monkey_WX`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 0;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index || ++index}】 start work\n`);
$.checkInId = user.split(strSplitor)[0];
$.sid = user.split(strSplitor)[1];
await signIn();
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function signIn() {
let config = {
method: 'GET',
url: 'https://h5.youzan.com/wscump/checkin/checkinV2.json?checkinId=' + $.checkInId + '&app_id=&kdt_id=&access_token=',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'charset': 'utf-8',
'content-type': 'application/json',
'extra-data': '{"is_weapp":1,"sid":"' + $.sid + '","version":"2.154.3.101","client":"weapp","bizEnv":"wsc","uuid":"","ftime":""}',
'referer': 'https://servicewechat.com/wx0451bbda59c220a8/95/page-frame.html'
}
};
let { data: result } = await Request(config)
result?.code == 0 ? $.log(`签到成功`) : $.log(`签到失败`); console.log(JSON.stringify(result));
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
throw error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
throw error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,128 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%B0%8F%E7%B1%B3%E7%A4%BE%E5%8C%BA%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%AD%BE%E5%88%B0.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%B0%8F%E7%B1%B3%E7%A4%BE%E5%8C%BA%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%AD%BE%E5%88%B0.py
# Repo: jdqlscript/toulu
# Path: 小米社区小程序签到.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 3c6fe4dfa4e8ed6ec83d117595336e599be3b579d2ce6bbacfcca434a94ec800
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
import os
import requests
import json
#cookie在https://account.xiaomi.com/pass/sns/wxapp/v2/tokenLogin链接下
#变量名xmsq多账号使用&分割
def get_cookies_from_env():
"""
从环境变量中获取cookie值多账号使用&分割
"""
xmsq = os.getenv("xmsq")
if not xmsq:
raise ValueError("环境变量中未找到xmsq请确保已正确设置环境变量。")
return xmsq.split("&")
def get_login_data(cookie):
"""
发送登录请求,获取签到所需的参数
"""
url = "https://account.xiaomi.com/pass/sns/wxapp/v2/tokenLogin"
headers = {
"Content-Type": "application/x-www-form-urlencoded",
"Cookie": cookie,
"Referer": "https://servicewechat.com/wx240a4a764023c444/3/page-frame.html",
"User-Agent": "Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.103 Mobile Safari/537.36 XWEB/1300333 MMWEBSDK/20241202 MMWEBID/3628 MicroMessenger/8.0.56.2800(0x28003858) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"Accept-Encoding": "gzip, deflate, br"
}
data = {
"appid": "wx240a4a764023c444",
"sid": "miui_vip",
"authType": "0",
"callback": ""
}
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"登录请求失败,状态码:{response.status_code}")
def checkin(miui_vip_ph, serviceToken, userId):
"""
执行签到操作
"""
url = "https://api.vip.miui.com/mtop/planet/vip/member/addCommunityGrowUpPointByActionV2"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090c25)XWEB/11581",
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/x-www-form-urlencoded",
"xweb_xhr": "1",
"Origin": "https://servicewechat.com",
"Sec-Fetch-Site": "cross-site",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Dest": "empty",
"Referer": "https://servicewechat.com/wx240a4a764023c444/3/page-frame.html",
"Accept-Language": "zh-CN,zh;q=0.9"
}
cookies = {
"serviceToken": serviceToken,
"miui_vip_ph": miui_vip_ph,
"userId": str(userId)
}
params = {"miui_vip_ph": miui_vip_ph}
data = {"action": "WECHAT_CHECKIN_TASK"}
response = requests.post(url, headers=headers, cookies=cookies, params=params, data=data)
return response.json()
def handle_checkin_result(phone, result):
"""
处理签到结果并输出通知
"""
if result.get("status") == 200:
print(f"{phone} 签到成功!")
elif result.get("status") == -1 and result.get("message") == "加分失败":
print(f"{phone} 签到失败:今天已经签到过了。")
elif result.get("code") == 401:
print(f"{phone} 签到失败:参数错误或登录信息失效。")
else:
print(f"{phone} 签到失败:未知错误。返回结果:{result}")
def get_announcement():
"""
获取公告信息
"""
external_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
try:
response = requests.get(external_url)
if response.status_code == 200:
print(response.text.strip()) # 打印公告内容
print("公告获取成功,开始执行签到请求...")
else:
print(f"获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}")
def main():
try:
# 获取公告
get_announcement()
# 获取环境变量中的cookie
cookies = get_cookies_from_env()
for cookie in cookies:
login_data = get_login_data(cookie)
miui_vip_ph = login_data["miui_vip_ph"]
serviceToken = login_data["serviceToken"]
userId = login_data["passportProfile"]["userId"]
phone = login_data["passportProfile"]["phone"] # 获取 phone 值
# 执行签到
checkin_response = checkin(miui_vip_ph, serviceToken, userId)
handle_checkin_result(phone, checkin_response)
except Exception as e:
print(f"发生错误: {e}")
if __name__ == "__main__":
main()

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,151 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%B7%A8%E9%87%8Fip_Sign.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%B7%A8%E9%87%8Fip_Sign.py
# Repo: jdqlscript/toulu
# Path: 巨量ip_Sign.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 0fe9136c554fc34b8f6e1e10f96ac9096fbf27a419b6866e41c90285ab4cdf05
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
# -*- coding: utf-8 -*-
#!/usr/bin/env python3
"""
* 仅供学习交流请在下载后的24小时内完全删除 请勿将任何内容用于商业或非法目的,否则后果自负。
* 巨量ip签到。每日签到领取1000免费IP
* 巨量ip注册地址 https://www.juliangip.com/user/reg?inviteCode=1031551
*token获取平台http://www.gxfc-s4.com/
*有问题联系3288588344
*频道https://pd.qq.com/s/672fku8ge
#!/usr/bin/env python3
"""
# # # # # # # # # # #
import json
import re
import requests
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)
token = "填写token"
username = "填入你的巨量账号"
password = "填入你的巨量密码"
def jl_login(username, password):
url = "https://www.juliangip.com/login/go"
payload = f'type=password&username={username}&password={password}&sms_code='
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'https://www.juliangip.com',
'Referer': 'https://www.juliangip.com/user/login',
'Sec-Ch-Ua': '"Microsoft Edge";v="117", "Not;A=Brand";v="8", "Chromium";v="117"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Windows"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43',
'X-Requested-With': 'XMLHttpRequest'
}
response = requests.request("POST", url, headers=headers, data=payload, verify=False)
if response.status_code == 200:
return "_JSID=" + response.cookies.get("_JSID")
return None
def jl_users(tk):
url = "https://www.juliangip.com/users/"
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Sec-Ch-Ua': '"Microsoft Edge";v="117", "Not;A=Brand";v="8", "Chromium";v="117"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Windows"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
"Cookie": tk,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43',
}
response = requests.get(url, headers=headers, verify=False)
if response.status_code == 200:
return re.findall("const tx =new TencentCaptcha\('(\d+)'", response.text)
return []
def getcode(aid):
url = "http://119.96.239.11:8888/api/getcode"
headers = {
"Content-Type": "application/json"
}
data = {
"timeout": "90", # 超时时间 请确保http请求超时>该参数,否则识别成功但连接已断开失败
"type": "tencent-turing", # 类型
"appid": aid, # 抓包所得aid/appid/id参数 tencent[aid/appid] netease[id]
"token": token, # 用户token 用于识别区分用户
"developeraccount": "" # 软件开发者用户名 //可空
}
response = requests.post(url, headers=headers, verify=False, timeout=90, data=json.dumps(data))
if response.status_code == 200:
if response.json()['status'] == 200:
return response.json()
else:
print(response.json())
return {}
return {}
def getFree(tk, js):
headers = {
"Host": "www.juliangip.com",
"Cookie": tk,
"sec-ch-ua": "\"Microsoft Edge\";v=\"117\", \"Not;A=Brand\";v=\"8\", \"Chromium\";v=\"117\"",
"accept": "*/*",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"x-requested-with": "XMLHttpRequest",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43",
"sec-ch-ua-platform": "\"Windows\"",
"origin": "https://www.juliangip.com",
"sec-fetch-site": "same-origin",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.juliangip.com/users/",
"accept-language": "zh-CN,zh;q=0.9"
}
data_js = json.loads(js['data']['code'])
data = {
"randStr": data_js['randstr'],
"ticket": data_js["ticket"]
}
url = "https://www.juliangip.com/users/getFree"
response = requests.post(url, headers=headers, data=data,
verify=False) # 注意verify=False 用于禁用SSL验证如果需要SSL验证请删除这个参数
if response.status_code == 200:
print(response.json())
else:
print(response.text)
def main():
tk = jl_login(username, password)
if not tk:
print("登录失败")
return
aid = jl_users(tk)
if not aid:
print("获取aid失败")
return
js = getcode(aid[0])
if not js:
print("获取打码平台失败")
return
getFree(tk, js)
if __name__ == '__main__':
main()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,121 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/kangshifu.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/kangshifu.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/kangshifu.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 73bda6361b08e86509de8dbe3cd6c2439da54fac4a43d4c4fea1d8c5edc82c0e
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 康师傅畅饮社
cron: 30 10 * * *
------------------------------------------
#Notice:
康师傅畅饮社小程序
变量名 ksfcys
账号格式抓https://club.biqr.cn/api/请求头token 多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("康师傅畅饮社");
let ckName = `ksfcys`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
}
async run() {
await this.signIn()
}
async signIn() {
let options = {
url: `https://club.biqr.cn/api/signIn/integralSignIn`,
headers: {
'User-Agent': '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 WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027',
'Accept': 'application/json, text/plain, */*',
'xweb_xhr': '1',
'Content-Type': 'application/x-www-form-urlencoded;',
'Token': '' + this.token,
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wx54f3e6a00f7973a7/795/page-frame.html',
'Accept-Language': 'zh-CN,zh;q=0.9'
},
method: 'POST',
data: {
}
}
let { data: result } = await axios.request(options);
if (result.code == 0) {
$.log(`账号[${this.index}]【${this.name}】 签到成功`);
} else {
$.log(result);
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,330 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/dw.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/dw.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/dw.js
// # UploadedAt: 2026-04-08T12:04:40Z
// # SHA256: 643756c628cc298d1afacd86d11cb0f35889ab3d2203212a9ac4486e354f3569
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 得物APP 0元抽
cron: 30 11 * * *
------------------------------------------
#Notice:
得物0元抽 抓https://app.dewu.com/api 请求头的x-auth-token 去掉Bearer 多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const CryptoJS = require("crypto-js");
const { Env } = require("../tools/env")
const $ = new Env("得物0元抽");
let ckName = `dwck`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
}
request(options) {
let sign = this.calculateSign(options.data)
options.url = options.url + `?sign=${sign}`
let baseHeaders = {
"Host": "app.dewu.com",
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148/duapp/5.89.0",
"device_model": "iPhone 8",
"platform": "h5",
"Accept": "*/*",
"Accept-Encoding": "br;q=1.0, gzip;q=0.9, deflate;q=0.8",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148/duapp/5.89.0",
"mode": "0",
"webua": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
"netSourceType": "1",
"channel": "App Store",
"isRoot": "1",
"brand": "Apple",
"networktype": "WIFI",
"dudeviceTrait": "iPhone10,1",
"Accept-Language": "zh-Hans;q=1.0, en;q=0.9",
"app_build": "5.89.0.510",
"x-auth-token": "Bearer " + this.token,
"countryCode": "CN",
"appid": "h5",
"Connection": "keep-alive",
"Content-Type": "application/json",
"isProxy": "0",
"appVersion": "5.89.0",
"v": "5.89.0",
"deviceTrait": "iPhone",
"imei": "",
"emu": "0",
}
options.headers = Object.assign(baseHeaders, options.headers)
return axios.request(options)
}
async run() {
await this.zeroLottery()
}
async zeroLottery() {
let options = {
method: "POST",
url: "https://app.dewu.com/api/v1/h5/oss-platform/hacking-zero-lottery/v1/activity/query-today",
headers: { "Content-Type": "application/json" },
data: { "source": "wotab" }
}
let { data: result } = await this.request(options)
if (result.code == 200) {
for (let i of result.data.activityList) {
if (i.status == 0) {
if ("taskVo" in i) {
//需要做任务
} else {
await this.zeroLotteryJoin(i.id)
}
}
}
} else {
$.log(`❌账号[${this.index}] 获取0元购列表失败[${result.msg}]🎉`)
}
}
async zeroLotteryJoin(id) {
let options = {
method: "POST",
url: "https://app.dewu.com/hacking-zero-lottery/v1/activity/engage-in",
headers: { "Content-Type": "application/json" },
data: { "id": id, "source": "wotab", inner: true }
}
let { data: result } = await this.request(options)
if (result.code == 200) {
$.log(`账号[${this.index}] 参与0元购成功🎉`)
} else {
$.log(`账号[${this.index}] 参与 0元购失败[${result.msg}]`)
}
}
/*async DoTask(body) {
try {
let taskStatusResult = {};
let commitBody = {};
let preStatus = false
if (body.taskType == 50) {
taskStatusResult = await this.taskRequest_task("get", `https://app.dewu.com/hacking-task/v1/task/status?taskId=${body.taskId}&taskType=50&sign=94fd23c93d62ae0f75108f94c093b198`)
if (taskStatusResult.code == 200) {
if (taskStatusResult.data.status == 1) {
//$.log(`账号[${this.index}] 开始任务成功🎉`)
commitBody = { "taskId": body.taskId, "taskType": String(body.taskType), "btd": 0, spuId: 0 }
preStatus = true
}
}
}
if (body.taskType == 1) {
if ("classify" in body) {
if (body.classify == 2) {
taskStatusResult = await this.taskRequest_task("post", `https://app.dewu.com/hacking-task/v1/task/pre_commit?sign=b7382f4d908e04356f9646688afe096c`, { taskId: body.taskId, taskType: body.taskType, btn: 0 })
//console.log(taskStatusResult);
if (taskStatusResult.code == 200) {
if (taskStatusResult.data.isOk == true) {
//$.log(`账号[${this.index}] 开始任务成功🎉`)
$.log(`延迟${body.countdownTime + 1}秒浏览${body.taskName}`)
await $.wait((body.countdownTime + 1) * 1000)
commitBody = { "taskId": body.taskId, "taskType": String(body.taskType), "activityType": null, "activityId": null, "taskSetId": null, "venueCode": null, "venueUnitStyle": null, "taskScene": null, "btd": 0 }
preStatus = true
}
} else {
$.log(`❌账号[${this.index}] 开始任务失败[${taskStatusResult.msg}]`);
}
}
} else {
taskStatusResult = await this.taskRequest_task("post", `https://app.dewu.com/hacking-task/v1/task/pre_commit?sign=b7382f4d908e04356f9646688afe096c`, { taskId: body.taskId, taskType: body.taskType, btn: 0 })
if (taskStatusResult.code == 200) {
if (taskStatusResult.data.isOk == true) {
//$.log(`账号[${this.index}] 开始任务成功🎉`)
await $.wait(16000)
commitBody = { "taskId": body.taskId, "taskType": body.taskType, "activityType": null, "activityId": null, "taskSetId": null, "venueCode": null, "venueUnitStyle": null, "taskScene": null, "btd": 0 }
preStatus = true
}
} else {
$.log(`❌账号[${this.index}] 开始任务失败[${taskStatusResult.msg}]`);
}
}
}
if (body.taskType == 123 || body.taskType == 124) {
commitBody = { "taskType": String(body.taskType) }
preStatus = true
}
//console.log(taskStatusResult)
if (preStatus == true) {
let commitResult = await this.taskRequest_task("post", `https://app.dewu.com/hacking-task/v1/task/commit?sign=826988b593cd8cd75162b6d3b7dade15`, commitBody)
//console.log(commitResult)
if (commitResult.code == 200) {
if (commitResult.data.status == 2) {
$.log(`账号[${this.index}] [${body.taskName}]任务成功🎉`)
return true
} else {
$.log(`账号[${this.index}] [${body.taskName}]任务失败🎉`)
}
} else {
$.log(`账号[${this.index}] [${body.taskName}]任务失败🎉`)
}
} else {
return false
}
} catch (e) {
console.log(e);
}
}*/
generateIds() {
var Uo = Array(32);
var oe = "0000000000000000";
function Ho(e) {
for (var t = 0; t < 2 * e; t++)
Uo[t] = Math.floor(16 * Math.random()) + 48,
Uo[t] >= 58 && (Uo[t] += 39);
return String.fromCharCode.apply(null, Uo.slice(0, 2 * e));
}
var Mo = "00000000000000000000000000000000"; // Assuming Mo is defined somewhere else in your code
var generateSpanId = function () {
return function (e) {
var t = e(8);
if (t === oe)
return Mo;
return t;
}(Ho);
};
var generateTraceId = function () {
return function (e) {
var t = Math.floor(Date.now() / 1e3).toString(16),
n = e(8),
r = e(3);
return "f5" + r + t + n;
}(Ho);
};
return "00-" + generateTraceId() + "-" + generateSpanId() + "-01"
};
createEncryptedBody(data) {
const key2 = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANMGZPlLobHYWoZyMvHD0a6emIjEmtf5Z6Q++VIBRulxsUfYvcczjB0fMVvAnd1douKmOX4G690q9NZ6Q7z/TV8CAwEAAQ==";
const publicKeyPem = '-----BEGIN PUBLIC KEY-----\n' +
key2 +
'-----END PUBLIC KEY-----';
global["window"] = {}
const jsencrypt = require("jsencrypt")
const crypt = new jsencrypt()
crypt.setKey(publicKeyPem)
const n = this.randomStr(48, 16);
const encrypted = crypt.encrypt(n)
const enBody = CryptoJS.enc.Utf8.parse(data);
const enResult = CryptoJS.AES.encrypt(enBody, CryptoJS.enc.Utf8.parse(n.substr(10, 16)), {
iv: CryptoJS.enc.Utf8.parse(n.substr(20, 16)),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
//console.log(encrypted);
//console.log(hexToBase64(encrypted));
const newBody = {
data: encrypted + "" + enResult.ciphertext.toString().toUpperCase(),
};
newBody.sign = this.calculateSign(newBody);
return { enData: newBody, n };
function hexToBase64(hexString) {
const buffer = Buffer.from(hexString, 'hex');
const base64String = buffer.toString('base64');
return base64String;
}
}
randomStr(length, charset) { var tmp1, tmp2, data = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), result = []; if (((charset = charset || data["length"]), length)) for (tmp1 = 0; tmp1 < length; tmp1++)result[tmp1] = data[0 | (Math.random() * charset)]; else for (result[8] = result[13] = result[18] = result[23] = "-", result[14] = "4", tmp1 = 0; tmp1 < 36; tmp1++)result[tmp1] || ((tmp2 = 0 | (16 * Math["random"]())), (result[tmp1] = data[19 === tmp1 ? (3 & tmp2) | 8 : tmp2])); return result["join"]("") }
decryptResponseBody(result, n) {
try {
const de1 = CryptoJS.enc.Hex.parse(result),
de2 = CryptoJS.enc.Base64.stringify(de1);
const decrypted = CryptoJS.AES.decrypt(de2, CryptoJS.enc.Utf8.parse(n.substr(10, 16)), {
iv: CryptoJS.enc.Utf8.parse(n.substr(20, 16)),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
}).toString(CryptoJS.enc.Utf8);
return decrypted;
} catch (error) {
n = "987654321012345678901234567890123456789012345678"
const de1 = CryptoJS.enc.Hex.parse(result),
de2 = CryptoJS.enc.Base64.stringify(de1);
const decrypted = CryptoJS.AES.decrypt(de2, CryptoJS.enc.Utf8.parse(n.substr(10, 16)), {
iv: CryptoJS.enc.Utf8.parse(n.substr(20, 16)),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
}).toString(CryptoJS.enc.Utf8);
return decrypted;
}
}
//修复自 修改处理后 空值删除得情况 改为不删除
calculateSign(requestBody) { const sortedKeys = Object.keys(requestBody).sort(); let signContent = sortedKeys.reduce((acc, key) => { const value = requestBody[key]; if (value === null) { return acc } if (typeof value === 'object' && !Array.isArray(value)) { return acc.concat(key).concat(JSON.stringify(value)) } if (Array.isArray(value)) { if (value.length > 0) { let typeOfFirstItem = typeof value[0]; if (typeOfFirstItem === 'object') { let arrayStr = ''; value.forEach((item, index) => { arrayStr += JSON.stringify(item) + (index !== value.length - 1 ? ',' : '') }); return acc.concat(key).concat(arrayStr) } } return acc.concat(key).concat(value.toString()) } return acc.concat(key).concat(value.toString()) }, ''); const secretKey = "048a9c4943398714b356a696503d2d36"; const hashedContent = CryptoJS.MD5(signContent.concat(secretKey)).toString(); return hashedContent }
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,128 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E8%99%94%E9%87%91E%E7%AB%99.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E8%99%94%E9%87%91E%E7%AB%99.js
// # Repo: jdqlscript/toulu
// # Path: 微信小程序虔金E站.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: e1e429fad49d3ca582abe7eaf2f060325d2147c534f593c66313798be2843660
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 微信小程序虔金E站 每日签到
------------------------------------------
变量名qianjin
变量值https://www.xrservice.cn/请求头Headers中Homing-Auth的值 去掉Bearer 多账号&或换行
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("微信小程序虔金E站");
let ckName = `qianjin`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 0;
//let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index || ++index}】 start work\n`);
$.ck = user
//$.ckStatus = false;
await signIn()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function signIn() {
let config = {
method: 'POST',
url: 'https://www.xrservice.cn/rayo-gz-fes-back/blade-signin/signin-user/submit',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 miniProgram/wx7bda09dcc9affced',
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json',
'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Android WebView";v="122"',
'Homing-Auth': 'Bearer '+$.ck,
'sec-ch-ua-mobile': '?1',
//'Authorization': 'Basic aG9taW5nLXd4bHA6UEhPU2J6SEVoRWhkRW4xYWlDSmhnYmJadVQ=',
'sec-ch-ua-platform': '"Android"',
'Origin': 'https://www.xrservice.cn',
'X-Requested-With': 'com.tencent.mm',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://www.xrservice.cn/rayo-gz-fes-h5/',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7'
},
data: JSON.stringify({})
};
let { data: result } = await Request(config);
result?.code == 200 ? $.log(`签到成功`) : $.log(`签到失败`); console.log(JSON.stringify(result));
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
throw error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
throw error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,294 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/xinxi.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/xinxi.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/xinxi.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 97216722edf50cf917686fcbc51d42b0f4a87165b6eeac508fa3ba0573156830
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 心喜 小程序
cron: 30 7 * * *
------------------------------------------
#Notice:
心喜小程序:目前没有库存 喜欢玩的就玩吧
抓api.xinc818.com 请求头的sso 多账户&或换行
变量名 xinxi
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("心喜小程序");
let ckName = `xinxi`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
this.posts = []
}
async run() {
await this.userInfo()
await this.tasklist()
}
generateMd5Signature = function (e) {
var crypto = require("crypto");
var t = Object.keys(e).sort().map((function (t) {
return t + "=" + e[t]
}
)).join("&");
return crypto.createHash("md5").update(t).digest("hex")
}
request(options) {
let req_timestamp = Date.now();
let request_id = Math.random().toString(36).substr(2, 9) + "-" + req_timestamp;
let baseHeaders = {
"req_timestamp": req_timestamp,
"request_id": request_id,
"User-Agent": defaultUserAgent,
"sso": this.token,
"sign": this.generateMd5Signature({ data: JSON.stringify(options.data), req_timestamp, request_id, }),
}
options.headers = { ...baseHeaders, ...options.headers }
return axios.request(options)
}
async userInfo() {
let options = {
method: 'GET',
url: `https://api.xinc818.com/mini/user`,
headers: {}
};
let { data: result } = await this.request(options);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 【${result.data.nickname}】积分【${result.data.integral}】🎉`)
this.userId = result.data.id
} else {
console.log(`❌账号[${this.index}] 用户查询【false】`);
console.log(result);
}
}
async signIn() {
let options = {
method: 'GET',
url: `https://api.xinc818.com/mini/sign/in?dailyTaskId=`,
headers: {
"Content-Type": "application/json",
}
};
let { data: result } = await this.request(options);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 签到状态【${result.data.flag}】获得积分【${result.data.integral}】🎉`)
} else {
$.log(`❌账号[${this.index}] 签到状态【false】`);
}
}
async share() {
let options = {
method: 'GET',
url: `https://api.xinc818.com/mini/dailyTask/share`,
headers: {
"Content-Type": "application/json",
},
};
let { data: result } = await this.request(options);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 完成分享成功 获得【${result.data.singleReward}`)
} else {
console.log(`❌账号[${this.index}] 完成分享失败`);
console.log(result);
}
}
async tasklist() {
let options = {
method: 'GET',
url: `https://api.xinc818.com/mini/dailyTask/daily`,
headers: {}
};
let { data: result } = await this.request(options);
if (result.code == 0) {
for (let task of result.data) {
await this.getPosts()
if (task.status == false) {
if (task.code == 'BROWSE_PRODUCTS') {
await this.browseGoods()
}
if (task.code == 'COMMENT_POSTS') {
await this.postsComments(this.posts[0].id)
}
if (task.code == 'LIKE_POSTS') {
await this.likePosts(this.posts[0].id)
}
if (task.code == 'FOCUS_USER') {
await this.followUser(this.posts[0].publisherId)
}
if (task.code == 'WANT_GOODS') {
await this.likeGoods()
}
if (task.code == 'SHARE') {
await this.share()
}
//未完成
//finishNum 已完成的数量
}
}
} else {
$.log(`❌账号[${this.index}] 任务列表【false】`);
}
}
async browseGoods(postsId = 22) {
let options = {
method: 'GET',
url: `https://api.xinc818.com/mini/dailyTask/browseGoods/` + postsId,
headers: {},
};
let { data: result } = await this.request(options);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 【浏览商品】成功 获得积分【${result.data.singleReward}】🎉`)
} else {
$.log(`❌账号[${this.index}] 【浏览商品】失败`);
console.log(result);
}
}
async postsComments(postsId) {
let options = {
method: 'POST',
url: `https://api.xinc818.com/mini/postsComments`,
headers: {
"Content-Type": "application/json",
},
data: { "content": "666", "postsId": postsId }
};
let { data: result } = await this.request(options);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 【发表评论】成功 获得积分【${result.data.singleReward}】🎉`)
}
}
async getPosts() {
let options = {
method: 'GET',
url: `https://api.xinc818.com/mini/community/home/posts?pageNum=1&pageSize=10&queryType=3&position=2`,
headers: {}
};
let { data: result } = await this.request(options);
if (result.code == 0) {
this.posts = result.data.list
}
}
async likePosts() {
//找到posts里面liked为false的
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, "decision": true }
};
let { data: result } = await this.request(options);
if (result.code == 0) {
console.log(result);
$.log(`✅账号[${this.index}] 【点赞帖子】成功 获得积分【${result.data.singleReward}】🎉`)
}
}
async followUser(postsId) {
let options = {
method: 'PUT',
url: `https://api.xinc818.com/mini/user/follow`,
headers: {
"Content-Type": "application/json",
},
data: { "postsId": postsId, "decision": true }
};
let { data: result } = await this.request(options);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 【关注用户】成功 获得积分【${result.data.singleReward}】🎉`)
}
}
async likeGoods(goodsId) {
let options = {
method: 'POST',
url: `https://api.xinc818.com/mini/live/likeLiveItem`,
headers: {
"Content-Type": "application/json",
},
data: { "isLike": true, "dailyTaskId": 20, "productId": "" + goodsId }
};
let { data: result } = await this.request(options);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 【点赞商品】成功 获得积分【${result.data.singleReward}】🎉`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,581 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%85%95%E6%80%9D.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%85%95%E6%80%9D.js
// # Repo: jdqlscript/toulu
// # Path: 慕思.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 3ee7b04e8bd10005837a4a9d2f2108fe22c21a288ff2eb9774750c652c0c283f
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/**
* 慕思
* const $ = new Env("慕思");
* cron 10 6,15 * * * 慕思.js
* 活动入口https://pic.imgdb.cn/item/64eaffc4661c6c8e54806be6.jpg
* Author by Huansheng1
* ========= 青龙--配置文件 ===========
* # 项目名称
* export mshy='api_token#openId'
* 自己抓包 请求头里的 api_token请求包里的 openId
* 抓包后不要打开小程序避免刷新了token有效期待测试如出现 “Token有误” 则是 token过期了请重新抓取
* 多账号可用 换行、&、@ 符号隔开,支持新建多个同名环境变量来设置多账号
* 奖励:签到每天得积分,积分兑换实物
* ====================================
*/
const $ = new Env("慕思");
const utils = require("./utils")
let envParams = 'mshy';
let envSplitor = ['\n', '@', '&']
let processEnvParams = ($.isNode() ? process.env[envParams] : $.getdata(envParams)) || '';
let initedJobForTokens = []
let currentUserIndex = 0
class JobTask {
constructor(str) {
this.requestUA = generateRandomUA();
this.index = ++currentUserIndex
this.valid = false;
try {
[this.activedAuthToken, this.openId] = str;
} catch (error) {
console.log('参数不完整:自己抓包 请求头里的 api_token请求包里的 openId')
}
}
async taskApi (fn, method, url, body, moreHeaders = {}) {
let result = null
try {
let urlObject = {
url: url,
headers: {
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh',
'Connection': 'keep-alive',
'Host': 'atom.musiyoujia.com',
'Referer': 'https://servicewechat.com/wx03527497c5369a2c/94/page-frame.html',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'User-Agent': this.requestUA || 'Mozilla/5.0 (Windows NT 10.0; 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 XWEB/8379',
'api_client_code': '65',
'api_token': this.activedAuthToken,
'api_version': '1.0.0',
'xweb_xhr': '1',
'Content-Type': 'application/json',
...moreHeaders
},
timeout: 60000,
}
if (this.requestUA) {
urlObject.headers['User-Agent'] = this.requestUA
}
if (body) {
urlObject.body = body
// urlObject.headers['Content-Length'] = body?.length
}
// console.log('urlObject:', urlObject);
await httpRequest(method, urlObject).then(async (ret) => {
if (ret.resp?.statusCode == 200) {
if (ret.resp?.body) {
result = JSON.parse(ret.resp.body)
} else {
console.log(`账号[${this.index}]调用${method}[${fn}]出错,返回为空`)
}
} else {
console.log(`账号[${this.index}]调用${method}[${fn}]出错,返回状态码[${ret.resp?.statusCode || ''}]`, '返回结果:', ret.resp?.body || ret?.err)
}
})
} catch (e) {
console.log(e)
} finally {
return Promise.resolve(result);
}
}
async GetUserInfo () {
try {
let fn = 'GetUserInfo'
let method = 'post'
let url = `https://atom.musiyoujia.com/member/wechatlogin/selectuserinfo`;
const timestamp = new Date().getTime();
let moreHeaders = {
'api_timestamp': timestamp,
'api_sign': utils?.MD5_Encrypt(`api_client_code=65&api_version=1.0.0&api_timestamp=${timestamp}`)?.toUpperCase()
}
let body = `{"appId":"wx03527497c5369a2c","appType":"WECHAT_MINI_PROGRAM","openId":"${this.openId}"}`;
await this.taskApi(fn, method, url, body, moreHeaders).then(async (result) => {
if (result?.msg === "success") {
this.valid = true;
this.customId = result?.data.resMemberInfo.memberId;
console.log(`账号[${this.index}] 查询个人信息成功,积分:${result?.data?.memberInfo?.pointInfo?.point}`)
} else {
console.log(`账号[${this.index}] 查询个人信息失败:${result?.msg || JSON.stringify(result)}`)
this.valid = false
}
})
} catch (e) {
console.log(e)
}
}
async GetJob () {
try {
let fn = 'GetJob'
let method = 'post'
let url = `https://atom.musiyoujia.com/member/memberbehavior/getBehaviorInfos`;
let body = `{"appId":"wx03527497c5369a2c","appType":"WECHAT_MINI_PROGRAM","behaviorIds":[1,2,10203,10204,10205,5],"sourceChannel":"会员小程序","source":"${this.customId}","openId":"${this.openId}"}`;
const timestamp = new Date().getTime();
let moreHeaders = {
'api_timestamp': timestamp,
'api_sign': utils?.MD5_Encrypt(`api_token=${this.activedAuthToken}&api_client_code=65&api_version=1.0.0&api_timestamp=${timestamp}`)?.toUpperCase()
}
await this.taskApi(fn, method, url, body, moreHeaders).then(async (result) => {
if (result?.msg === "success") {
this.isSigned = result?.data[0].acts['每天已获得积分次数'] === 1;
console.log(`账号[${this.index}] 获取任务列表成功,${this.isSigned ? '已签到' : '未签到'}`)
} else {
console.log(`账号[${this.index}] 获取任务列表失败:${result?.msg || JSON.stringify(result)}`)
}
})
} catch (e) {
console.log(e)
}
}
async Sign () {
try {
let fn = 'Sign'
let method = 'post'
let url = `https://atom.musiyoujia.com/member/memberbehavior/add`;
const currentDate = new Date();
const year = currentDate.getFullYear();
const month = currentDate.getMonth() + 1;
const day = currentDate.getDate();
let body = `{"appId":"wx03527497c5369a2c","appType":"WECHAT_MINI_PROGRAM","osType":"windows","model":"microsoft","browser":"微信小程序","platform":"1","sourceType":"5","sourceChannel":"会员小程序","siteId":"","visitorId":"","deviceId":"","spotId":"","campaignId":"","deviceType":"","eventLabel":"","eventValue":"","eventAttr2":"${`${year}.${month}.${day}`}","eventAttr3":"","eventAttr4":"","eventAttr5":"","eventAttr6":"","googleCampaignName":"","googleCampaignSource":"","googleCampaignMedium":"","googleCampaignContent":"","memberType":"DeRUCCI","customId":"${this.customId}","locationUrl":"/pages/user/signIn","url":"/pages/user/signIn","pageTitle":"每日签到","logType":"event","behaviorIds":[1,3],"eventCategory":"用户签到","eventAction":"签到","eventAttr1":2,"openId":"${this.openId}"}`;
const timestamp = new Date().getTime();
let moreHeaders = {
'api_timestamp': timestamp,
'api_sign': utils?.MD5_Encrypt(`api_token=${this.activedAuthToken}&api_client_code=65&api_version=1.0.0&api_timestamp=${timestamp}`)?.toUpperCase()
}
await this.taskApi(fn, method, url, body, moreHeaders).then(async (result) => {
if (result?.msg === "success") {
console.log(`账号[${this.index}] 签到成功,获得积分:${result?.data?.point}`)
} else {
console.log(`账号[${this.index}] 签到失败:${result?.msg || JSON.stringify(result)}`)
}
})
} catch (e) {
console.log(e)
}
}
async doTask () {
try {
console.log(`\n============= 账号[${this.index}] 开始获取任务=============`);
await this.GetJob();
if (!this.isSigned) {
console.log(`\n============= 账号[${this.index}] 开始执行 签到任务=============`);
await this.Sign();
}
} catch (e) {
console.log(e)
}
}
}
!(async () => {
if (typeof $request !== "undefined") {
await GetRewrite()
} else {
if (!(await checkEnv())) return;
console.log('\n================ 开始执行 ================')
for (let user of initedJobForTokens) {
console.log(`----------- 执行 第 [${user.index}] 个账号 -----------`)
await user.GetUserInfo();
}
let validUserList = initedJobForTokens.filter(x => x.valid)
if (initedJobForTokens.length > 0) {
console.log('\n================ 任务队列构建完毕 ================')
for (let user of initedJobForTokens) {
console.log(`----------- 账号[${user.index}] -----------`)
await user.doTask();
}
} else {
console.log('\n====幻生提示:无可用账号,请检查配置============ 任务结束 ================')
}
await $.showmsg();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done())
async function GetRewrite () {
}
async function checkEnv () {
if (processEnvParams) {
let splitor = envSplitor[0];
for (let sp of envSplitor) {
if (processEnvParams.indexOf(sp) > -1) {
splitor = sp;
break;
}
}
for (let token of processEnvParams.split(splitor)) {
if (token) initedJobForTokens.push(new JobTask(token?.split('#')))
}
userCount = initedJobForTokens.length
} else {
console.log('未找到 配置信息,请检查是否配置 变量:', envParams)
return;
}
console.log(`共找到${userCount}个账号`)
return true
}
function generateRandomUA () {
var androidVersion = Math.floor(Math.random() * 6) + 8; // 生成 Android 版本号 8-13 之间的随机数
var androidModels = [
"PBBM00", "SM-G975F", "Pixel 4", "OnePlus 7T", "Redmi Note 8 Pro",
"iPhone X", "Galaxy S10", "Huawei P30 Pro", "LG G8 ThinQ", "Sony Xperia 1",
"Moto G7", "Nokia 9 PureView", "Xiaomi Mi 9", "Google Pixel 3a", "OnePlus 6T",
"Redmi Note 7", "Samsung Galaxy A50", "Huawei Mate 20 Pro", "LG V40 ThinQ", "Sony Xperia XZ3",
"Moto Z4", "Nokia 7.1", "Xiaomi Mi Mix 3", "Google Pixel 2", "OnePlus 5T",
"Redmi Note 6 Pro", "Samsung Galaxy A70", "Huawei P20 Pro", "LG G7 ThinQ", "Sony Xperia XZ2",
"Moto G6", "Nokia 6.1", "Xiaomi Mi 8", "Google Pixel", "OnePlus 5",
"Redmi Note 5 Pro", "Samsung Galaxy A30", "Huawei Mate 10 Pro", "LG V30", "Sony Xperia XZ1",
"Moto X4", "Nokia 5.1", "Xiaomi Mi 6", "Google Pixel XL", "OnePlus 3T",
"Redmi Note 4", "Samsung Galaxy A20", "Huawei P10 Plus", "LG G6", "Sony Xperia XZ",
"Moto G5 Plus", "Nokia 3.1", "Xiaomi Mi 5", "Google Pixel 3", "OnePlus 3",
"Redmi Note 3", "Samsung Galaxy A10", "Huawei Mate 9", "LG V20", "Sony Xperia X Compact",
"Moto G4", "Nokia 2.2", "Xiaomi Mi 4", "Google Pixel 2 XL", "OnePlus 2",
"Redmi Note 2", "Samsung Galaxy A5", "Huawei P9", "LG G5", "Sony Xperia X",
"Moto E6", "Nokia 1", "Xiaomi Mi 3", "Google Pixel 4", "OnePlus One",
"Redmi Note", "Samsung Galaxy A3", "Huawei P8", "LG G4", "Sony Xperia Z5",
"Moto E5", "Nokia 3310", "Xiaomi Mi 2", "Google Pixel 4 XL", "OnePlus Nord"
]; // 常见的手机型号
var chromeVersion = "Chrome/" + (Math.floor(Math.random() * 30) + 50) + ".0." + (Math.floor(Math.random() * 1000) + 100); // 生成 Chrome 版本号 50.0.100-79.0.999 之间的随机数
var ua = "Mozilla/5.0 (Linux; Android " + androidVersion + "; " + androidModels[Math.floor(Math.random() * androidModels.length)] + " Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 " + chromeVersion + " Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app";
return ua;
}
// 无参数加密:请求地址+时间戳+A749380BBD5A4D93B55B4BE245A42988+Token
// 示例数据https://api.ikbang.cn/v2/iclick-new/signIn/sign1692923683034A749380BBD5A4D93B55B4BE245A4298839D21A3B3EFF817154C47470BF13E62CF05F956446D53C359688A094E91A9B1F2A67065862923551F147C32E3AFAF778
// 如果请求URL有参数则是 在时间戳 和 盐 之间增加 stringify后的参数POST
async function httpRequest (method, url) {
httpErr = null, httpReq = null, httpResp = null;
return new Promise((resolve) => {
$.send(method, url, async (err, req, resp) => {
httpErr = err, httpReq = req, httpResp = resp;
resolve({ err, req, resp })
})
});
}
function Env (name, env) {
"undefined" != typeof process && JSON.stringify(process.env).indexOf("GITHUB") > -1 && process.exit(0);
return new class {
constructor(name, env) {
this.name = name
this.notifyStr = ''
this.startTime = (new Date).getTime()
Object.assign(this, env)
console.log(`${this.name} 开始运行:\n`)
}
isNode () {
return "undefined" != typeof module && !!module.exports
}
isQuanX () {
return "undefined" != typeof $task
}
isSurge () {
return "undefined" != typeof $httpClient && "undefined" == typeof $loon
}
isLoon () {
return "undefined" != typeof $loon
}
getdata (t) {
let e = this.getval(t);
if (/^@/.test(t)) {
const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t),
r = s ? this.getval(s) : "";
if (r)
try {
const t = JSON.parse(r);
e = t ? this.lodash_get(t, i, "") : e
} catch (t) {
e = ""
}
}
return e
}
setdata (t, e) {
let s = !1;
if (/^@/.test(e)) {
const [, i, r] = /^@(.*?)\.(.*?)$/.exec(e),
o = this.getval(i),
h = i ? "null" === o ? null : o || "{}" : "{}";
try {
const e = JSON.parse(h);
this.lodash_set(e, r, t),
s = this.setval(JSON.stringify(e), i)
} catch (e) {
const o = {};
this.lodash_set(o, r, t),
s = this.setval(JSON.stringify(o), i)
}
}
else {
s = this.setval(t, e);
}
return s
}
getval (t) {
return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null
}
setval (t, e) {
return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null
}
send (m, t, e = (() => { })) {
if (m != 'get' && m != 'post' && m != 'put' && m != 'delete') {
console.log(`无效的http方法${m}`);
return;
}
if (m == 'get' && t.headers) {
delete t.headers["Content-Type"];
delete t.headers["Content-Length"];
} else if (t.body && t.headers) {
if (!t.headers["Content-Type"]) t.headers["Content-Type"] = "application/x-www-form-urlencoded";
}
if (this.isSurge() || this.isLoon()) {
if (this.isSurge() && this.isNeedRewrite) {
t.headers = t.headers || {};
Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 });
}
let conf = {
method: m,
url: t.url,
headers: t.headers,
timeout: t.timeout,
data: t.body
};
if (m == 'get') delete conf.data
$axios(conf).then(t => {
const {
status: i,
request: q,
headers: r,
data: o
} = t;
e(null, q, {
statusCode: i,
headers: r,
body: o
});
}).catch(err => console.log(err))
} else if (this.isQuanX()) {
t.method = m.toUpperCase(), this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, {
hints: !1
})),
$task.fetch(t).then(t => {
const {
statusCode: i,
request: q,
headers: r,
body: o
} = t;
e(null, q, {
statusCode: i,
headers: r,
body: o
})
}, t => e(t))
} else if (this.isNode()) {
this.got = this.got ? this.got : require("got");
const {
url: s,
...i
} = t;
this.instance = this.got.extend({
followRedirect: false
});
this.instance[m](s, i).then(t => {
const {
statusCode: i,
request: q,
headers: r,
body: o
} = t;
e(null, q, {
statusCode: i,
headers: r,
body: o
})
}, t => {
const {
message: s,
request: q,
response: i
} = t;
e(s, q, i)
})
}
}
time (t, x = null) {
let xt = x ? new Date(x) : new Date
let e = {
"M+": xt.getMonth() + 1,
"d+": xt.getDate(),
"h+": xt.getHours(),
"m+": xt.getMinutes(),
"s+": xt.getSeconds(),
"q+": Math.floor((xt.getMonth() + 3) / 3),
S: xt.getMilliseconds()
};
/(y+)/.test(t) && (t = t.replace(RegExp.$1, (xt.getFullYear() + "").substr(4 - RegExp.$1.length)));
for (let s in e)
new RegExp("(" + s + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? e[s] : ("00" + e[s]).substr(("" + e[s]).length)));
return t
}
async showmsg () {
if (!this.notifyStr) return;
let notifyBody = this.name + " 运行通知\n\n" + this.notifyStr
if ($.isNode()) {
var notify = require('./sendNotify');
console.log('\n============== 推送 ==============')
await notify.sendNotify(this.name, notifyBody);
} else {
this.msg(notifyBody);
}
}
logAndNotify (str) {
console.log(str)
this.notifyStr += str
this.notifyStr += '\n'
}
logAndNotifyWithTime (str) {
let t = '[' + this.time('hh:mm:ss.S') + ']' + str
console.log(t)
this.notifyStr += t
this.notifyStr += '\n'
}
logWithTime (str) {
console.log('[' + this.time('hh:mm:ss.S') + ']' + str)
}
msg (e = t, s = "", i = "", r) {
const o = t => {
if (!t)
return t;
if ("string" == typeof t)
return this.isLoon() ? t : this.isQuanX() ? {
"open-url": t
}
: this.isSurge() ? {
url: t
}
: void 0;
if ("object" == typeof t) {
if (this.isLoon()) {
let e = t.openUrl || t.url || t["open-url"],
s = t.mediaUrl || t["media-url"];
return {
openUrl: e,
mediaUrl: s
}
}
if (this.isQuanX()) {
let e = t["open-url"] || t.url || t.openUrl,
s = t["media-url"] || t.mediaUrl;
return {
"open-url": e,
"media-url": s
}
}
if (this.isSurge()) {
let e = t.url || t.openUrl || t["open-url"];
return {
url: e
}
}
}
};
this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r)));
let h = ["", "============== 系统通知 =============="];
h.push(e),
s && h.push(s),
i && h.push(i),
console.log(h.join("\n"))
}
getMin (a, b) {
return ((a < b) ? a : b)
}
getMax (a, b) {
return ((a < b) ? b : a)
}
padStr (num, length, padding = '0') {
let numStr = String(num)
let numPad = (length > numStr.length) ? (length - numStr.length) : 0
let retStr = ''
for (let i = 0; i < numPad; i++) {
retStr += padding
}
retStr += numStr
return retStr;
}
json2str (obj, c, encodeUrl = false) {
let ret = []
for (let keys of Object.keys(obj).sort()) {
let v = obj[keys]
if (v && encodeUrl) v = encodeURIComponent(v)
ret.push(keys + '=' + v)
}
return ret.join(c);
}
str2json (str, decodeUrl = false) {
let ret = {}
for (let item of str.split('&')) {
if (!item) continue;
let idx = item.indexOf('=')
if (idx == -1) continue;
let k = item.substr(0, idx)
let v = item.substr(idx + 1)
if (decodeUrl) v = decodeURIComponent(v)
ret[k] = v
}
return ret;
}
randomString (len, charset = 'abcdef0123456789') {
let str = '';
for (let i = 0; i < len; i++) {
str += charset.charAt(Math.floor(Math.random() * charset.length));
}
return str;
}
randomList (a) {
let idx = Math.floor(Math.random() * a.length)
return a[idx]
}
wait (t) {
return new Promise(e => setTimeout(e, t))
}
done (t = {}) {
const e = (new Date).getTime(),
s = (e - this.startTime) / 1e3;
console.log(`\n${this.name} 运行结束,共运行了 ${s} 秒!`)
if (this.isSurge() || this.isQuanX() || this.isLoon()) $done(t)
}
}(name, env)
}

View File

@@ -0,0 +1,266 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/musi.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/musi.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/musi.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 42ce9bc08cbded73578a5fe72b5aab0010573d1d627a78d13241fc35d8c0599c
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
cron: 30 9 * * *
------------------------------------------
#Notice:
慕斯小程序签到
WeChatCodeServer 填写wx_server_url wx_auth 用于获取code
变量名称musi
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("慕斯小程序签到");
const WeChatServer = require("./wcs.js");
let ckName = `musi`;
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 || 'http://192.168.31.196:12081',
appid: 'wx03527497c5369a2c',
auth: process.env.wx_auth || "your-api-key",
}
);
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.activedAuthToken = null
this.wcsid = this.user[0]
this.openId = null
}
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)
}
if (!this.activedAuthToken) {
$.log(`账号[${this.index}] 获取用户Token失败❌`)
return
}
await this.getUserInfo()
await this.getJob()
if (!this.isSigned) {
await this.doSign()
}
}
async getUserToken(code) {
const timestamp = new Date().getTime();
let options = {
method: 'POST',
url: `https://atom.musiyoujia.com/user/wechatlogin/applets`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': defaultUserAgent,
"api_client_code": "65",
"api_version": "1.0.0",
'api_timestamp': timestamp,
'api_token': '',
'api_sign': this.MD5_Encrypt(`api_client_code=65&api_version=1.0.0&api_timestamp=${timestamp}`)?.toUpperCase()
}
,
data:
{
'appId': 'wx03527497c5369a2c',
'appType': 'WECHAT_MINI_PROGRAM',
'code': '' + code,
'systemCode': '65'
}
}
let {
data: result
} = await axios.request(options);
if (result?.code == '0') {
this.openId = result.data.openId
this.activedAuthToken = result.data.token
$.log(`🌸账号[${this.index}] 获取用户Token成功:${this.activedAuthToken}`)
} else {
$.log(`🌸账号[${this.index}] 获取用户Token-失败:${result.msg}`)
}
}
MD5_Encrypt(str) {
const crypto = require("crypto")
return crypto.createHash('md5').update(str).digest('hex');
}
async getUserInfo() {
try {
const timestamp = new Date().getTime();
let options = {
method: 'POST',
url: `https://atom.musiyoujia.com/member/wechatlogin/selectuserinfo`,
headers: {
'Content-Type': 'application/json',
'User-Agent': defaultUserAgent,
"api_client_code": "65",
"api_version": "1.0.0",
'api_timestamp': timestamp,
'api_token': this.activedAuthToken,
'api_sign': this.MD5_Encrypt(`api_client_code=65&api_version=1.0.0&api_timestamp=${timestamp}`)?.toUpperCase()
},
data: { "appId": "wx03527497c5369a2c", "appType": "WECHAT_MINI_PROGRAM", "openId": `${this.openId}` }
}
let { data: result } = await axios.request(options)
if (result?.msg === "success") {
this.valid = true;
this.customId = result?.data.resMemberInfo.memberId;
$.log(`账号[${this.index}] 查询个人信息成功,积分:${result?.data?.memberInfo?.pointInfo?.point}`)
} else {
$.log(`账号[${this.index}] 查询个人信息失败:${result?.msg || JSON.stringify(result)}`)
this.valid = false
}
} catch (e) {
console.log(e)
}
}
async getJob() {
try {
const timestamp = new Date().getTime();
let options = {
method: "POST",
url: `https://atom.musiyoujia.com/member/memberbehavior/getBehaviorInfos`,
headers: {
'Content-Type': 'application/json',
'User-Agent': defaultUserAgent,
"api_client_code": "65",
"api_version": "1.0.0",
'api_token': this.activedAuthToken,
'api_timestamp': timestamp,
'api_sign': this.MD5_Encrypt(`api_token=${this.activedAuthToken}&api_client_code=65&api_version=1.0.0&api_timestamp=${timestamp}`)?.toUpperCase()
},
data: { "appId": "wx03527497c5369a2c", "appType": "WECHAT_MINI_PROGRAM", "behaviorIds": [1, 2, 10203, 10204, 10205, 5], "sourceChannel": "会员小程序", "source": `${this.customId}`, "openId": `${this.openId}` }
}
let { data: result } = await axios.request(options)
if (result?.msg === "success") {
this.isSigned = result?.data[0].acts['每天已获得积分次数'] === 1;
$.log(`账号[${this.index}] 获取任务列表成功,${this.isSigned ? '已签到' : '未签到'}`)
} else {
$.log(`账号[${this.index}] 获取任务列表失败:${result?.msg || JSON.stringify(result)}`)
}
} catch (e) {
console.log(e)
}
}
async doSign() {
try {
const timestamp = new Date().getTime();
const eventAttr2 = $.time('yyyy.MM.dd')
let options = {
method: 'POST',
url: `https://atom.musiyoujia.com/member/memberbehavior/add`,
headers: {
'Content-Type': 'application/json',
'User-Agent': defaultUserAgent,
"api_client_code": "65",
'api_token': this.activedAuthToken,
"api_version": "1.0.0",
'api_timestamp': timestamp,
'api_sign': this.MD5_Encrypt(`api_token=${this.activedAuthToken}&api_client_code=65&api_version=1.0.0&api_timestamp=${timestamp}`)?.toUpperCase()
},
data: { "appId": "wx03527497c5369a2c", "appType": "WECHAT_MINI_PROGRAM", "osType": "windows", "model": "microsoft", "browser": "微信小程序", "platform": "1", "sourceType": "5", "sourceChannel": "会员小程序", "siteId": "", "visitorId": "", "deviceId": "", "spotId": "", "campaignId": "", "deviceType": "", "eventLabel": "", "eventValue": "", "eventAttr2": `${eventAttr2}`, "eventAttr3": "", "eventAttr4": "", "eventAttr5": "", "eventAttr6": "", "googleCampaignName": "", "googleCampaignSource": "", "googleCampaignMedium": "", "googleCampaignContent": "", "memberType": "DeRUCCI", "customId": `${this.customId}`, "locationUrl": "/pages/user/signIn", "url": "/pages/user/signIn", "pageTitle": "每日签到", "logType": "event", "behaviorIds": [1, 3], "eventCategory": "用户签到", "eventAction": "签到", "eventAttr1": 2, "openId": `${this.openId}` }
}
let { data: result } = await axios.request(options)
if (result?.msg === "success") {
$.log(`账号[${this.index}] 签到成功,获得积分:${result?.data?.point}`)
} else {
$.log(`账号[${this.index}] 签到失败:${result?.msg || JSON.stringify(result)}`)
}
} catch (e) {
console.log(e)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
if (process.env['wx_server_url'] && process.env['wx_auth']) {
for (let user of $.userList) {
await new Task(user).run();
}
} else {
$.log(`${ckName}未配置微信SERVER配置 搭建可看仓库目录下的readme.md❌`)
return
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,227 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%89%80%E6%9C%89%E5%A5%B3%E7%94%9F%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%89%80%E6%9C%89%E5%A5%B3%E7%94%9F%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Repo: jdqlscript/toulu
// # Path: 所有女生小程序.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: a6033b11f7c454dfe0d05787297d516e942a4777e10bf3258940fd1b548666c5
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn 860562056
@Date: 2024.06.10 14.14
@Description: 所有女生小程序
------------------------------------------
变量名wawo
变量值 https://7.wawo.cc/api/ 域名Headers请求头里面的authorization 去掉bearer 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("所有女生会员中心");
let ckName = `wawo`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user
$.ckStatus = true;
await getPoints()
await signInInfo()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getPoints() {
const config =
{
url: 'https://7.wawo.cc/api/score/wx/score/queryAmount',
headers: {
"content-type": "application/json",
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'authorization': 'bearer ' + $.token,
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
"referer": `https://servicewechat.com/wx7d1403fe84339669/1038/page-frame.html`,
"user-agent": `Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555`
}
}
let { data: result } = await Request(config)
if (result?.code == "000") {
$.log(`账号当前积分[${result.data}]`)
} else {
$.log(`账号积分查询失败[${result.message}]`)
}
}
async function signInInfo() {
const config =
{
url: 'https://7.wawo.cc/api/activity/wx/task/sign/signMsg',
method: "POST",
headers: {
"content-type": "application/json",
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'authorization': 'bearer ' + $.token,
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
"referer": `https://servicewechat.com/wx7d1403fe84339669/1038/page-frame.html`,
"user-agent": `Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555`
},
data: JSON.stringify({
"cardNo": "411886986591633408"
})
}
let { data: result } = await Request(config)
if (result?.code == "000") {
if (result.data.signed !== 1) {
$.log(`未签到 ===> 签到ing`)
await signIn()
} else {
$.log(`已签到 ===> 跳过签到`)
}
} else {
$.log(`获取签到信息失败[${result.message}]`)
}
}
async function signIn() {
const config =
{
url: 'https://7.wawo.cc/api/activity/wx/task/sign/signIn',
method: "POST",
headers: {
"content-type": "application/json",
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'authorization': 'bearer ' + $.token,
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
"referer": `https://servicewechat.com/wx7d1403fe84339669/1038/page-frame.html`,
"user-agent": `Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555`
},
data: JSON.stringify({})
}
let { data: result } = await Request(config)
if (result?.code == "000") {
$.log(`签到成功`)
} else {
$.log(`签到失败[${result.message}]`)
}
}
async function done(taskId) {
const config =
{
url: 'https://7.wawo.cc/api/operate/wx/rewards/task/done?taskId=' + taskId,
method: "POST",
headers: {
"content-type": "application/json",
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'authorization': 'bearer ' + $.token,
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
"referer": `https://servicewechat.com/wx7d1403fe84339669/1038/page-frame.html`,
"user-agent": `Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555`
},
data: JSON.stringify({ "taskId": taskId })
}
let { data: result } = await Request(config)
if (result?.code == "000") {
$.log(`任务成功`)
} else {
$.log(`任务失败[${result.message}]`)
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,142 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/zbs.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/zbs.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/zbs.js
// # UploadedAt: 2026-04-09T11:12:26Z
// # SHA256: 478003ec8662f7437e94cebaf197f25ec6f0075b14d6588b881b713a003252ba
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 植白说小程序
cron: 30 8 * * *
------------------------------------------
#Notice:
变量名称zbs
值抓取https://www.kozbs.com/demo 请求头x-dts-token
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("植白说小程序");
let ckName = `zbs`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
}
request(options) {
let baseHeraders = {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"x-dts-token": "" + this.token,
"xweb_xhr": "1",
"User-Agent": defaultUserAgent,
}
options.headers = Object.assign(baseHeraders, options.headers)
return axios.request(options)
}
async run() {
await this.signIn()
}
async signIn() {
let options = {
method: 'GET',
url: "https://www.kozbs.com/demo/wx/home/sign?userId=",
headers: {},
};
let { data: result } = await this.request(options);
if (result?.errno == '0') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `签到成功🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.errmsg}`)
}
}
async getPoints() {
let options = {
method: 'GET',
url: "https://www.kozbs.com/demo/wx/user/getUserIntegral?userId=",
headers: {},
};
let { data: result } = await this.request(options);
if (result?.errno == '0') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `当前积分` + `${result.data.integer}🎉`);
} else {
$.log(`🌸账号[${this.index}] 获取积分-失败:${result.errmsg}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,586 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%AC%A2%E5%A4%AA%E5%95%86%E5%9F%8E.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%AC%A2%E5%A4%AA%E5%95%86%E5%9F%8E.py
# Repo: jdqlscript/toulu
# Path: 欢太商城.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 2cc34369f14bd3d325e4315947427cb7388d52cb812c3295e97f9f3b35f1cd04
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
"""
抓包欢太商城
在check.sample.toml文件中填写cookie和useragent
check.sample.toml文件下载链接https://raw.githubusercontent.com/3288588344/toulu/main/check.sample.toml
cron: 19 5,21 * * *
new Env('欢太商城');
QQ频道98do10s246
自行安装依赖
utils_tmp
json
re
time
requests
"""
import json
import re
import time
import requests
import utils_tmp
from notify_mtr import send
from utils import get_data
class Heytap:
def __init__(self, check_items):
self.check_items = check_items
self.client = None
self.session = requests.session()
self.log = ""
self.cookies = "cookie"
self.user_agent = "ua"
self.s_channel = "oppostore"
self.source_type = "505" # 初始化设置为505会从cookie获取实际数据
self.sa_distinct_id = ""
self.sa_device_id = ""
self.s_version = ""
self.brand = "iPhone" # 初始化设置为iPhone会从cookie获取实际机型
self.act_task = utils_tmp.act_list # 修改为从文件获取,避免更新代码后丢失原有活动配置
self.if_draw = False # 初始化设置为False会从配置文件获取实际设置
self.accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
self.accept_encoding1 = "gzip, deflate, br"
self.accept_encoding2 = "gzip, deflate"
self.client_package = "com.oppo.store"
self.content_type1 = "application/x-www-form-urlencoded"
self.content_type2 = "application/x-www-form-urlencoded;charset=UTF-8"
self.host1 = "store.oppo.com"
self.host2 = "msec.opposhop.cn"
self.user_agent2 = "okhttp/3.12.12.200sp1"
self.point_got = "任务完成!积分领取+"
self.point_err = "领取积分奖励出错!\n"
self.done_msg = "任务已完成\n"
self.err_msg = "错误,原因为: "
self.amount = "amount="
# 获取cookie里的一些参数部分请求需要使用到 hss修改
def get_cookie_data(self):
try:
app_param = re.findall("app_param=(.*?)}", self.cookies)[0] + "}"
app_param = json.loads(app_param)
self.sa_device_id = app_param["sa_device_id"]
self.brand = app_param["brand"]
self.sa_distinct_id = re.findall("sa_distinct_id=(.*?);", self.cookies)[0]
self.source_type = re.findall("source_type=(.*?);", self.cookies)[0]
self.s_version = re.findall("s_version=(.*?);", self.cookies)[0]
self.s_channel = re.findall("s_channel=(.*?);", self.cookies)[0]
except Exception as e:
print(
"获取Cookie部分数据失败将采用默认设置请检查Cookie是否包含s_channels_versionsource_typesa_distinct_id\n",
e,
)
self.s_channel = "ios_oppostore"
self.source_type = "505"
# 获取个人信息,判断登录状态
def get_user_info(self):
flag = False
headers = {
"Host": "store.oppo.com",
"Accept": self.accept,
"Content-Type": self.content_type1,
"Connection": "keep-alive",
"User-Agent": self.user_agent,
"Accept-Language": "zh-cn",
"Accept-Encoding": self.accept_encoding1,
"cookie": self.cookies,
}
response = self.session.get(
"https://store.oppo.com/cn/oapi/users/web/member/info", headers=headers
)
response.encoding = "utf-8"
try:
res = response.json()
if res["code"] == 200:
self.log += f'======== {res["data"]["userName"]} ========\n'
self.log += (
"【登录成功】:" + res["data"]["userName"] + f"\n【抽奖开关】:{self.if_draw}\n"
)
flag = True
else:
self.log += "【登录失败】:" + res["errorMessage"] + "\n"
except Exception as e:
self.log += f"【登录】:错误,原因为: {str(e)}" + "\n"
if flag:
self.get_cookie_data()
return self.session
return False
# 任务中心列表,获取任务及任务状态
def taskCenter(self):
headers = {
"Host": self.host1,
"Accept": self.accept,
"Content-Type": self.content_type1,
"Connection": "keep-alive",
"User-Agent": self.user_agent,
"Accept-Language": "zh-cn",
"Accept-Encoding": self.accept_encoding1,
"cookie": self.cookies,
"referer": "https://store.oppo.com/cn/app/taskCenter/index",
}
res1 = self.client.get(
"https://store.oppo.com/cn/oapi/credits/web/credits/show", headers=headers
)
res1 = res1.json()
return res1
# 每日签到
# 位置: APP → 我的 → 签到
def daily_bonus(self):
try:
dated = time.strftime("%Y-%m-%d")
headers = {
"Host": self.host1,
"Accept": self.accept,
"Content-Type": self.content_type1,
"Connection": "keep-alive",
"User-Agent": self.user_agent,
"Accept-Language": "zh-cn",
"Accept-Encoding": self.accept_encoding1,
"cookie": self.cookies,
"referer": "https://store.oppo.com/cn/app/taskCenter/index",
}
res = self.taskCenter()
status = res["data"]["userReportInfoForm"]["status"]
if status == 0:
res = res["data"]["userReportInfoForm"]["gifts"]
for data in res:
if data["date"] == dated:
qd = data
if not qd["today"]:
data = self.amount + str(qd["credits"])
res1 = self.client.post(
"https://store.oppo.com/cn/oapi/credits/web/report/immediately",
headers=headers,
data=data,
)
res1 = res1.json()
if res1["code"] == 200:
self.log += "【每日签到成功】:" + res1["data"]["message"] + "\n"
else:
self.log += f"【每日签到失败】:{res1}" + "\n"
else:
# print(str(qd["credits"]), str(qd["type"]), str(qd["gift"]))
data = (
(
self.amount
+ str(qd["credits"])
+ "&type="
+ str(qd["type"])
+ "&gift="
+ str(qd["gift"])
)
if qd["type"]
else self.amount + str(qd["credits"])
)
res1 = self.client.post(
"https://store.oppo.com/cn/oapi/credits/web/report/immediately",
headers=headers,
data=data,
)
res1 = res1.json()
if res1["code"] == 200:
self.log += "【每日签到成功】:" + res1["data"]["message"] + "\n"
else:
self.log += f"【每日签到失败】:{str(res1)}" + "\n"
else:
self.log += "【每日签到】:已经签到过了!\n"
time.sleep(1)
except Exception as e:
self.log += f"【每日签到】:错误,原因为: {str(e)}" + "\n"
# 浏览商品 10个sku +20 分
# 位置: APP → 我的 → 签到 → 每日任务 → 浏览商品
def daily_viewgoods(self):
self.log += "【每日浏览商品】\n"
try:
headers = {
"clientPackage": self.client_package,
"Host": self.host2,
"Accept": self.accept,
"Content-Type": self.content_type1,
"Connection": "keep-alive",
"User-Agent": self.user_agent2,
"Accept-Encoding": "gzip",
"cookie": self.cookies,
}
res = self.taskCenter()
res = res["data"]["everydayList"]
for data in res:
if data["name"] == "浏览商品":
if data["completeStatus"] == 0:
# 原链接貌似获取不到商品id更换一个 原链接https://msec.opposhop.cn/goods/v1/SeckillRound/goods/3016?pageSize=12&currentPage=1
shoplist = self.client.get(
"https://msec.opposhop.cn/goods/v1/products/010239"
)
res = shoplist.json()
if res["meta"]["code"] == 200:
i = 0
for skuinfo in res["details"][0]["infos"]:
skuid = skuinfo["skuId"]
self.client.get(
"https://msec.opposhop.cn/goods/v1/info/sku?skuId="
+ str(skuid),
headers=headers,
)
i += 1
if i > 10:
break
time.sleep(7)
res2 = self.cashingCredits(
data["marking"], data["type"], data["credits"]
)
if res2:
self.log += self.point_got + str(data["credits"]) + "\n"
else:
self.log += self.point_err
else:
self.log += "错误,获取商品列表失败\n"
elif data["completeStatus"] == 1:
res2 = self.cashingCredits(
data["marking"], data["type"], data["credits"]
)
if res2:
self.log += self.point_got + str(data["credits"]) + "\n"
else:
self.log += self.point_err
else:
self.log += self.done_msg
except Exception as e:
self.log += self.err_msg + str(e) + "\n"
def daily_sharegoods(self):
self.log += "【每日分享商品】\n"
try:
headers = {
"clientPackage": self.client_package,
"Host": self.host2,
"Accept": self.accept,
"Content-Type": self.content_type1,
"Connection": "keep-alive",
"User-Agent": self.user_agent2,
"Accept-Encoding": "gzip",
"cookie": self.cookies,
}
daysignlist = self.taskCenter()
res = daysignlist
res = res["data"]["everydayList"]
for data in res:
if data["name"] == "分享商品到微信":
qd = data
if qd["completeStatus"] == 0:
count = qd["readCount"]
endcount = qd["times"]
while count <= endcount:
self.client.get(
"https://msec.opposhop.cn/users/vi/creditsTask/pushTask?marking=daily_sharegoods",
headers=headers,
)
count += 1
res2 = self.cashingCredits(qd["marking"], qd["type"], qd["credits"])
if res2:
self.log += self.point_got + str(qd["credits"]) + "\n"
else:
self.log += self.point_err
elif qd["completeStatus"] == 1:
res2 = self.cashingCredits(qd["marking"], qd["type"], qd["credits"])
if res2:
self.log += self.point_got + str(qd["credits"]) + "\n"
else:
self.log += self.point_err
else:
self.log += self.done_msg
except Exception as e:
self.log += self.err_msg + str(e) + "\n"
# 执行完成任务领取奖励
def cashingCredits(self, info_marking, info_type, info_credits):
data = f"marking={str(info_marking)}&type={str(info_type)}&amount={str(info_credits)}"
headers = {
"Host": self.host1,
"clientPackage": self.client_package,
"Accept": "application/json, text/plain, */*",
"Content-Type": self.content_type1,
"Connection": "keep-alive",
"User-Agent": self.user_agent,
"Accept-Language": "zh-cn",
"Accept-Encoding": self.accept_encoding1,
"cookie": self.cookies,
"Origin": "https://store.oppo.com",
"X-Requested-With": self.client_package,
"referer": "https://store.oppo.com/cn/app/taskCenter/index?us=gerenzhongxin&um=hudongleyuan&uc=renwuzhongxin",
}
res = self.client.post(
"https://store.oppo.com/cn/oapi/credits/web/credits/cashingCredits",
data=data,
headers=headers,
)
res = res.json()
return res["code"] == 200
# 活动平台抽奖通用接口
def lottery(self, datas, referer="", extra_draw_cookie=""):
headers = {
"Host": "hd.oppo.com",
"User-Agent": self.user_agent,
"Cookie": extra_draw_cookie + self.cookies,
"Referer": referer,
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-cn",
"Accept-Encoding": "br, gzip, deflate",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
}
res = self.client.get("https://hd.oppo.com/user/login", headers=headers).json()
if res["no"] == "200":
res = self.client.post(
"https://hd.oppo.com/platform/lottery", data=datas, headers=headers
)
res = res.json()
return res
# 活动平台完成任务接口
def task_finish(self, aid, t_index):
headers = {
"Accept": "application/json, text/plain, */*;q=0.01",
"Content-Type": self.content_type2,
"Connection": "keep-alive",
"User-Agent": self.user_agent,
"Accept-Encoding": self.accept_encoding2,
"cookie": self.cookies,
"Origin": "https://hd.oppo.com",
"X-Requested-With": "XMLHttpRequest",
}
datas = f"aid={str(aid)}&t_index={str(t_index)}"
res = self.client.post(
"https://hd.oppo.com/task/finish", data=datas, headers=headers
)
res = res.json()
return res
# 活动平台领取任务奖励接口
def task_award(self, aid, t_index):
headers = {
"Accept": "application/json, text/plain, */*;q=0.01",
"Content-Type": self.content_type2,
"Connection": "keep-alive",
"User-Agent": self.user_agent,
"Accept-Encoding": self.accept_encoding2,
"cookie": self.cookies,
"Origin": "https://hd.oppo.com",
"X-Requested-With": "XMLHttpRequest",
}
datas = f"aid={str(aid)}&t_index={str(t_index)}"
res = self.client.post(
"https://hd.oppo.com/task/award", data=datas, headers=headers
)
res = res.json()
return res
# 做活动任务和抽奖通用接口 hss修改
def do_task_and_draw(self):
try:
for act_list in self.act_task:
act_name = act_list["act_name"]
aid = act_list["aid"]
referer = act_list["referer"]
end_time = act_list["end_time"]
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Connection": "keep-alive",
"User-Agent": self.user_agent,
"Accept-Encoding": self.accept_encoding2,
"cookie": self.cookies,
"X-Requested-With": "XMLHttpRequest",
"Referer": referer,
}
dated = int(time.time())
end_time = time.mktime(
time.strptime(end_time, "%Y-%m-%d %H:%M:%S")
) # 设置活动结束日期
if dated < end_time:
if_task = act_list["if_task"]
if if_task:
res = self.client.get(
f"https://hd.oppo.com/task/list?aid={aid}", headers=headers
)
tasklist = res.json()
self.log += f"{act_name}-任务】\n"
for jobs in tasklist["data"]:
title = jobs["title"]
t_index = jobs["t_index"]
aid = t_index[: t_index.index("i")]
if jobs["t_status"] == 0:
finishmsg = self.task_finish(aid, t_index)
if finishmsg["no"] == "200":
time.sleep(1)
awardmsg = self.task_award(aid, t_index)
msg = awardmsg["msg"]
self.log += f"{title}{msg}\n"
time.sleep(3)
elif jobs["t_status"] == 1:
awardmsg = self.task_award(aid, t_index)
msg = awardmsg["msg"]
self.log += f"{title}{msg}\n"
time.sleep(3)
else:
self.log += f"{title}:任务已完成\n"
if_draw = act_list["if_draw"]
if self.if_draw and if_draw: # 判断当前用户是否抽奖 和 判断当前活动是否抽奖
lid = act_list["lid"]
extra_draw_cookie = act_list["extra_draw_cookie"]
draw_times = act_list["draw_times"]
self.log += f"{act_name}-抽奖】:"
x = 0
while x < draw_times:
data = f"aid={aid}&lid={lid}&mobile=&authcode=&captcha=&isCheck=0&source_type={self.source_type}&s_channel={self.s_channel}&sku=&spu="
res = self.lottery(data, referer, extra_draw_cookie)
msg = res["msg"]
if "次数已用完" in msg:
self.log += f"{str(x + 1)}" + "抽奖:抽奖次数已用完\n"
break
if "活动已结束" in msg:
self.log += f"{str(x + 1)}" + "抽奖:活动已结束,终止抽奖\n"
break
goods_name = res["data"]["goods_name"]
if goods_name:
self.log += (
f"{str(x + 1)}次抽奖:{str(goods_name)}" + "\n"
)
elif "提交成功" in msg:
self.log += f"{str(x + 1)}" + "次抽奖:未中奖\n"
x += 1
time.sleep(5)
else:
self.log += f"{act_name}】:活动已结束,不再执行\n"
except Exception as e:
self.log += f"【执行任务和抽奖】:错误,原因为: {str(e)}" + "\n"
# 早睡打卡
def zaoshui_task(self):
try:
headers = {
"Host": self.host1,
"Connection": "keep-alive",
"s_channel": self.s_channel,
"utm_term": "direct",
"utm_campaign": "direct",
"utm_source": "direct",
"ut": "direct",
"uc": "zaoshuidaka",
"sa_device_id": self.sa_device_id,
"guid": self.sa_device_id,
"sa_distinct_id": self.sa_distinct_id,
"clientPackage": self.client_package,
"Cache-Control": "no-cache",
"um": "hudongleyuan",
"User-Agent": self.user_agent,
"ouid": "",
"Accept": "application/json, text/plain, */*",
"source_type": self.source_type,
"utm_medium": "direct",
"brand": "iPhone",
"appId": "",
"s_version": self.s_version,
"us": "gerenzhongxin",
"appKey": "",
"X-Requested-With": self.client_package,
"Referer": "https://store.oppo.com/cn/app/cardingActivities?utm_source=opposhop&utm_medium=task",
"Accept-Encoding": self.accept_encoding2,
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"cookie": self.cookies,
}
res = self.client.get(
"https://store.oppo.com/cn/oapi/credits/web/clockin/applyOrClockIn",
headers=headers,
).json()
if "余额不足" in str(res):
self.log += "【早睡打卡】:申请失败,积分余额不足\n"
else:
applyStatus = res["data"]["applyStatus"]
# 2 19:30打卡成功 0 800打卡成功
if applyStatus == 0:
self.log += "【早睡打卡】:申请失败,积分不足或报名时间已过\n"
elif applyStatus == 1:
self.log += "【早睡打卡】报名成功请当天19:30-22:00留意打卡状态\n"
elif applyStatus == 2:
self.log += "【早睡打卡】已报名成功请当天19:30-22:00留意打卡状态\n"
if res["data"]["clockInStatus"] == 1:
self.log += "【早睡打卡】打卡成功积分将于24:00前到账\n"
if res["data"]["clockInStatus"] == 2:
self.log += "【早睡打卡】打卡成功积分将于24:00前到账\n"
# 打卡记录
res = self.client.get(
"https://store.oppo.com/cn/oapi/credits/web/clockin/getMyRecord",
headers=headers,
).json()
if res["code"] == 200:
record = res["data"]["everydayRecordForms"]
self.log += "【早睡打卡记录】\n"
i = 0
for data in record:
self.log += (
data["everydayDate"]
+ "-"
+ data["applyClockInStatus"]
+ ""
+ data["credits"]
+ "\n"
)
i += 1
if i == 4: # 最多显示最近4条记录
break
except Exception as e:
self.log += f"【早睡打卡】:错误,原因为: {str(e)}" + "\n"
# 主程序
def main(self):
for i, check_item in enumerate(self.check_items, start=1):
self.cookies = check_item.get("cookie")
self.user_agent = check_item.get("useragent")
self.if_draw = check_item.get("draw")
self.client = self.get_user_info()
if self.client:
try:
self.daily_bonus() # 执行每日签到
self.daily_viewgoods() # 执行每日商品浏览任务
self.daily_sharegoods() # 执行每日商品分享任务
self.do_task_and_draw() # 自己修改的接口针对活动任务及抽奖新增及删除活动请修改act_list.py
# self.zaoshui_task() # 早睡报名 由于自己不能及时更新cookie就关闭了打卡
except Exception as e:
self.log += f"账号{i}执行出错:{e}\n"
else:
self.log += f"账号{i}已失效请及时更新cookies\n"
self.log += "\n\n"
return self.log
if __name__ == "__main__":
_data = get_data()
_check_items = _data.get("HEYTAP", [])
result = Heytap(check_items=_check_items).main()
send("欢太商城", result)

View File

@@ -0,0 +1,197 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%B3%A2%E5%8F%B8%E7%99%BB.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%B3%A2%E5%8F%B8%E7%99%BB.js
// # Repo: jdqlscript/toulu
// # Path: 波司登.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 8f296880e5285cf15f4f1e06bf81da594b953ef6a16466a6ac951ed1c8de187f
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.09 10.04
@Description: 波司登小程序 每日签到
------------------------------------------
变量名bosideng
变量值 抓https://gwuop.bsdits.cn/points-mall/ 请求头Headers中x-access-token的值和
https://gbpapihost.bsdits.cn/v3/projects/bfe7825ce8dd5cec/collect POST请求中请求体的gioId或deviceId或userId
两个值拼接# 例如89f...........#o15uuuuu_mf-SSS
多账号&或换行或新建同名变量
如果找不到第二个值 那么请进入签到页面找到https://gwuop.bsdits.cn/points-mall/front/member/ 开头的 /activities/1/records结尾的 中间的就是第二个值
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("波司登小程序");
let ckName = `bosideng`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user.split(strSplitor)[0]
$.union_id = user.split(strSplitor)[1]
$.ckStatus = true;
await records()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
function getTime() {
// 创建Date对象
const now = new Date();
// 获取年、月、日、时、分、秒,并格式化为两位数
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0'); // getMonth返回的是0-11所以需要+1
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
const timestampStr = `${year}${month}${day}${hours}${minutes}${seconds}`;
return timestampStr
// 调用函数并打印结果
}
function MD5(data) {
let crypto = require('crypto')
return crypto.createHash('md5').update(data).digest('hex')
}
async function records() {
let time = getTime()
let nonce = $.uuid()
let text = `${$.union_id}${$.token}${time}${nonce}`
let config = {
method: 'GET',
url: `https://gwuop.bsdits.cn/points-mall/front/member/${$.union_id}/activities/1/records`,
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'charset': 'utf-8',
'x-nonce': nonce,
'x-datadog-sampling-priority': '1',
'x-timestamp': time,
'x-datadog-origin': 'rum',
'bgno': 'BOSIDENG',
'x-signature': MD5(text).toUpperCase(),
'content-type': 'application/json',
'x-login-type': 'MiniProgram',
'x-access-token': $.token,
'Referer': 'https://servicewechat.com/wx3f8f90e766e5c545/355/page-frame.html'
}
};
let { data: result } = await Request(config)
if (result.code == 200) {
if (result.result.isSigned !== 1) {
$.log(`未签到 ===> 签到ing`)
await signIn()
} else {
$.log(`已签到 ===> 什么都不做`)
}
$.log(`🎉 签到信息查询成功,当前签到${result.result.signedDay}天 本次签到获得积分[${result.result.records[0].rewardPoints}]`)
} else {
$.log(`❌ 签到信息查询失败,原因:${result.message}`)
}
}
async function signIn() {
let data = JSON.stringify({});
let time = getTime()
let nonce = $.uuid()
let text = `${$.union_id}${$.token}${time}${nonce}`
let config = {
method: 'POST',
url: 'https://gwuop.bsdits.cn/points-mall/front/points/',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'charset': 'utf-8',
'x-nonce': nonce,
'x-datadog-sampling-priority': '1',
'x-timestamp': time,
'x-datadog-origin': 'rum',
'bgno': 'BOSIDENG',
'x-signature': MD5(text).toUpperCase(),
'content-type': 'application/json',
'x-login-type': 'MiniProgram',
'x-access-token': $.token,
'Referer': 'https://servicewechat.com/wx3f8f90e766e5c545/355/page-frame.html'
},
data: data
};
let { data: result } = await Request(config)
if (result.code == 200) {
$.log(result)
$.log(`🎉 签到成功`)
} else {
$.log(`❌ 签到失败,原因:${result.message}`)
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,131 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/hlyl.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/hlyl.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/hlyl.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: eaf5ac9bd01b8550cc46d6fcdf737b8d573b931e3ed4454633a00a0ad9657066
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 活力伊利小程序签到
cron: 30 8 * * *
------------------------------------------
#Notice:
变量名 hlyl
抓取 https://msmarket.msx.digitalyili.com/请求头access-token 多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("活力伊利小程序");
let ckName = `hlyl`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
}
async run() {
await this.signIn()
}
async signIn() {
let options = {
method: 'POST',
url: `https://msmarket.msx.digitalyili.com/gateway/api/member/daily/sign`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"access-token": "" + this.token,
"atv-page": "",
"content-type": "application/json",
"forward-appid": "",
"priority": "u=1, i",
"register-source": "",
"scene": "1145",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"source-type": "",
"tenant-id": "",
"xweb_xhr": "1"
, data: {
}
}
}
let { data: result } = await axios.request(options);
if (result?.status == true) {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `🕊签到获得${result.data.dailySign.bonusPoint}分🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.error}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,212 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/nwdjg.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/nwdjg.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/nwdjg.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 6f50bb3ee6aff7cd15d364eeb32932ff1c7d808bbf1f0d64724df54708156411
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
cron: 30 9 * * *
------------------------------------------
#Notice:
浓五的酒馆 微信小程序 签到得积分
WeChatCodeServer 填写wx_server_url wx_auth 用于获取code
变量名称nwdjg
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("浓五的酒馆");
const WeChatServer = require("./wcs.js");
let ckName = `nwdjg`;
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 || 'http://192.168.31.196:12081',
appid: 'wxed3cf95a14b58a26',
auth: process.env.wx_auth || "your-api-key",
}
);
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = null
this.wcsid = this.user[0]
this.isSign = false
}
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)
}
if (!this.token) {
$.log(`账号[${this.index}] 获取用户Token失败❌`)
return
}
this.token = 'Bearer ' + this.token
await this.getUserInfo()
await this.doSign()
}
async getUserToken(code) {
let data = ({
"code": code,
"appId": "wxed3cf95a14b58a26"
});
let options = {
method: 'POST',
url: 'https://stdcrm.dtmiller.com/std-weixin-mp-service/miniApp/custom/login',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Content-Type': 'application/json',
'xweb_xhr': '1',
'authorization': '',
'sec-fetch-site': 'cross-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://servicewechat.com/wxed3cf95a14b58a26/255/page-frame.html',
'accept-language': 'zh-CN,zh;q=0.9'
},
data: data
};
let {
data: result
} = await axios.request(options);
if (result?.code == '0') {
this.token = result.data
$.log(`🌸账号[${this.index}] 获取用户Token成功:${this.token}`)
} else {
$.log(`🌸账号[${this.index}] 获取用户Token-失败:${result.msg}`)
}
}
async getUserInfo() {
let options = {
method: 'GET',
url: `https://stdcrm.dtmiller.com/scrm-promotion-service/mini/wly/user/info`,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Content-Type': 'application/json',
'xweb_xhr': '1',
'authorization': '',
'sec-fetch-site': 'cross-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://servicewechat.com/wxed3cf95a14b58a26/255/page-frame.html',
'accept-language': 'zh-CN,zh;q=0.9',
authorization: this.token
}
}
let {
data: result
} = await axios.request(options);
if (result?.code == '0') {
$.log(`🌸账号[${this.index}] 获取用户信息[${result.data.member.mobile}] 积分[${result.data.member.points}]`)
} else {
$.log(`🌸账号[${this.index}] 获取用户信息-失败:${result.msg}`)
}
}
async doSign() {
let options = {
method: 'GET',
url: `https://stdcrm.dtmiller.com/scrm-promotion-service/promotion/sign/today?promotionId=PI69cb44d522cc56000aa80bbe`,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Content-Type': 'application/json',
'xweb_xhr': '1',
'authorization': '',
'sec-fetch-site': 'cross-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://servicewechat.com/wxed3cf95a14b58a26/255/page-frame.html',
'accept-language': 'zh-CN,zh;q=0.9',
authorization: this.token
}
};
let {
data: result
} = await axios.request(options);
if (result?.code == '0') {
//打印签到结果
$.log(`签到天数:${sign_data['data']['signDays']}`)
$.log(`签到成功`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.msg}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
if (process.env['wx_server_url'] && process.env['wx_auth']) {
for (let user of $.userList) {
await new Task(user).run();
}
} else {
$.log(`${ckName}未配置微信SERVER配置 搭建可看仓库目录下的readme.md❌`)
return
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,514 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%B5%B7%E5%A4%A9%E7%BE%8E%E5%91%B3%E9%A6%86.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%B5%B7%E5%A4%A9%E7%BE%8E%E5%91%B3%E9%A6%86.js
// # Repo: jdqlscript/toulu
// # Path: 海天美味馆.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: ce5a14cb4c6f738c04e461d43e1647c56f4a5fbb42b0fe0b9935c6ba256dce64
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.11 17:33
@Description: 海天美味馆小程序 每日签到+ 抽奖端午6.27结束
------------------------------------------
自己先去抽一次奖 签个到 把新手任务过了 别上来就跑 黑号不管 没写评论 不然一封封一堆
变量名haday
变量值 https://cmallapi.haday.cn/buyer-api/ 请求头Headers中的Authorization和uuid #连接
多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("海天美味馆小程序");
let ckName = `haday`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user.split(strSplitor)[0];
$.uuid = user.split(strSplitor)[1];
$.ckStatus = true;
$.activity_code = null
$.canUse = 0
await getActivityInfo()
await $.wait(3000)
if ($.activity_code) {
await userInfo()
}
await task_1()
await $.wait(3000)
await task_2()
await $.wait(3000)
await lotteryInfo()
await $.wait(3000)
await getLotteryNum()
for (let i = 0; i < $.canUse; i++) {
await $.wait(3000)
await lottery()
}
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getActivityInfo() {
let config = {
url: `https://cmallapi.haday.cn/buyer-api/sign/activity/code?activityCode=`,
method: "GET",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
}
}
let { data: result } = await Request(config)
if (result?.code == 403) {
$.log(`获取活动信息失败原因CK可能过期`)
}
if ("activity_code" in result) {
$.log(`获取活动信息成功活动ID${result.activity_code}`)
$.activity_code = result.activity_code
}
}
async function signIn() {
let data = { "activity_code": $.activity_code, "fill_date": "" }
let config = {
url: `https://cmallapi.haday.cn/buyer-api/sign/activity/sign`,
method: "POST",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
data: JSON.stringify(data)
}
let { data: result } = await Request(config)
if (result.is_sign == true) {
$.log(`签到成功`)
} else {
$.log(`签到失败 [${result.message}]`)
}
}
async function userInfo() {
let config = {
url: `https://cmallapi.haday.cn/buyer-api/sign/activity/member/info?activityCode=${$.activity_code}`,
method: "GET",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
}
}
let { data: result } = await Request(config)
if (result?.is_sign !== true) {
$.log(`${result.member_id}未签到,开始签到`)
await signIn()
} else {
}
$.log(`当前累计签到[${result.sign_day_num}]`)
}
//浏览页面
async function task_1() {
let data = {}
let config = {
url: `https://cmallapi.haday.cn/buyer-api/members/browsePage`,
method: "POST",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
data: JSON.stringify(data)
}
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`浏览界面 操作成功`)
} else {
$.log(`浏览界面 操作失败[${JSON.stringify(result)}]`)
}
}
//浏览社区
async function task_2() {
let data = {}
let config = {
url: `https://cmallapi.haday.cn/buyer-api/members/commnity/brosing/duration/add?seconds=100`,
method: "POST",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
data: JSON.stringify(data)
}
let { data: result } = await Request(config)
if (result?.statusCode == 200) {
$.log(`浏览社区 操作成功`)
} else {
$.log(`浏览社区 操作失败 貌似是正常的 [${result}]`)
}
}
async function getLotteryNum() {
let config = {
url: `https://cmallapi.haday.cn/buyer-api/lucky/activity/opporturnity?activityCode=jfcj0527`,
method: "GET",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
}
let { data: result } = await Request(config)
if (result.can_use > 0) {
$.canUse = result.can_use
$.log(`当前剩余抽奖次数:${result.can_use}`)
} else {
$.log(`当前剩余抽奖次数0`)
}
}
async function lottery() {
let config = {
url: `https://cmallapi.haday.cn/buyer-api/lucky/activity/extract?activityCode=jfcj0527`,
method: "GET",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
}
let { data: result } = await Request(config)
if (result.lucky_record_vo) {
$.log(`抽奖获得:${result.lucky_record_vo.prize_name}`)
} else {
$.log(result.message)
}
}
async function lotteryInfo() {
let config = {
url: `https://cmallapi.haday.cn/buyer-api/lucky/task/package/jfcj0527`,
method: "GET",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
}
let { data: result } = await Request(config)
if (result?.member_id) {
for (let i of result.task_list) {
if (i.today_obtained_task_number < i.today_available_task_number) {
if (i.task_key == 'LOGIN') {
await $.wait(3000)
await lottery_task_login()
}
if (i.task_key == 'POINT_EXCHANGE') {
for (let j = 0; j < i.today_available_task_number; j++) {
await $.wait(3000)
await lottery_task_exchange()
}
}
if (i.task_key == 'BROWSE_PAGE_TASK') {
await $.wait(3000)
await lottery_task_see(i.link)
}
}
}
} else {
$.log(`获取抽奖信息 操作失败[${JSON.stringify(result)}]`)
}
}
//抽奖登录 领取次数
async function lottery_task_login() {
let data = {}
let config = {
url: `https://cmallapi.haday.cn/buyer-api/lucky/task/getLoginOpporturnity/jfcj0527`,
method: "PUT",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
data: JSON.stringify(data)
}
let { data: result } = await Request(config)
$.log(result)
}
async function lottery_task_exchange() {
let config = {
url: `https://cmallapi.haday.cn/buyer-api/lucky/activity/redeem?activityCode=jfcj0527`,
method: "GET",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
}
let { data: result } = await Request(config)
if (result?.member_id) {
$.log(`兑换次数成功`)
} else {
$.log(`兑换次数失败`)
$.log(result)
}
}
//浏览页面
async function lottery_task_see(link) {
let config_start = {
url: `https://cmallapi.haday.cn/buyer-api/lucky/task/browse/page/start/jfcj0527?pageUrl=${link}`,
method: "GET",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
}
let { data: result_start } = await Request(config_start)
let config_end = {
url: `https://cmallapi.haday.cn/buyer-api/lucky/task/browse/page/start/jfcj0527?pageUrl=${link}`,
method: "GET",
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Authorization": $.token,
"Connection": "keep-alive",
"Content-Type": "application/json",
"envVersion": "release",
"Host": "cmallapi.haday.cn",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/597/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"uuid": $.uuid,
"xweb_xhr": "1"
},
}
let { data: result_end } = await Request(config_end)
$.log(`浏览页面完成`)
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,281 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/haitian.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/haitian.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/haitian.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 460af5d6a725f21a69a7b73506b3433d530e587e5a185e036d8ec00966e9d66d
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 海天美味馆小程序
cron: 30 11 * * *
------------------------------------------
#Notice:
抓取https://cmallapi.xkmm.cn请求头的authorization和uuid参数填入环境变量格式如下
authorization#uuid 多账号&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("海天美味馆小程序");
let ckName = `haitian`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
this.activity_code = "";
this.userFlag = false;
this.headers = {};
this.uuid = this.user[1]
this.headers = {
"Connection": "keep-alive",
"envVersion": "release",
"content-type": "application/json",
"Authorization": "" + this.token,
"uuid": "" + this.uuid,
"Accept-Encoding": "gzip,compress,br,deflate",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.70(0x1800462d) NetType/WIFI Language/zh_CN",
"Referer": "https://servicewechat.com/wx7a890ea13f50d7b6/765/page-frame.html"
}
}
async run() {
await this.getUserInfo()
if (this.userFlag) {
await this.task_1()
await this.task_2()
await this.getSignActivity()
if (this.activity_code) {
await this.signIn()
await this.getLotteryTaskList()
await this.getLotteryNum()
}
}
}
async getUserInfo() {
let options = {
method: 'GET',
url: `https://cmallapi.xkmm.cn/buyer-api/members`,
headers: this.headers
}
let { data: result } = await axios.request(options);
if (result?.member_id) {
$.log(`🌸账号[${this.index}] [${result.member_id}][${result.mobile}] 当前积分[${result.consum_point}]` + `🎉`);
this.userFlag = true;
} else {
$.log(`🌸账号[${this.index}] 查询-失败:${JSON.stringify(result)}`)
}
}
async getSignActivity() {
let options = {
method: 'GET',
url: `https://cmallapi.xkmm.cn/buyer-api/sign/activity/code?activityCode=`,
headers: this.headers
}
let { data: result } = await axios.request(options);
if (result?.activity_code) {
$.log(`获取活动信息成功活动ID${result.activity_code}`)
this.activity_code = result.activity_code
}
else {
$.log(`获取活动信息失败:${JSON.stringify(result)}`)
}
}
async signIn() {
try {
let options = {
url: `https://cmallapi.xkmm.cn/buyer-api/sign/activity/sign`,
method: "POST",
headers: this.headers,
data: JSON.stringify({ "activity_code": this.activity_code, "fill_date": "" })
}
let { data: result } = await axios.request(options)
if (result.is_sign == true) {
$.log(`签到成功`)
} else {
$.log(`签到失败 [${result.message}]`)
}
} catch (e) {
$.log(`签到失败 [${JSON.stringify(e.message)}]`)
}
}
//浏览页面
async task_1() {
let options = {
url: `https://cmallapi.xkmm.cn/buyer-api/members/browsePage`,
method: "POST",
headers: this.headers,
data: JSON.stringify({})
}
let { data: result } = await axios.request(options)
if (result?.code == 200) {
$.log(`浏览界面 操作成功`)
} else {
$.log(`浏览界面 操作失败[${JSON.stringify(result)}]`)
}
}
//浏览社区
async task_2() {
let options = {
url: `https://cmallapi.xkmm.cn/buyer-api/members/commnity/brosing/duration/add?seconds=10`,
method: "POST",
headers: this.headers,
data: JSON.stringify({})
}
let { data: result } = await axios.request(options)
if (result?.statusCode == 200) {
$.log(`浏览社区 操作成功`)
} else {
$.log(`浏览社区 操作失败 貌似是正常的 [${result}]`)
}
}
async doLottery() {
let options = {
method: 'GET',
url: `https://cmallapi.xkmm.cn/buyer-api/lucky/activity/extract?activityCode=jfcj${this.activity_code}`,
headers: this.headers
}
let { data: result } = await axios.request(options);
if (result?.lucky_record_vo) {
$.log(`🌸账号[${this.index}]` + `🕊抽奖结果:${result.lucky_record_vo.prize_name}🎉`);
} else {
$.log(`🌸账号[${this.index}] 抽奖-失败:${JSON.stringify(result)}`)
}
}
async getLotteryTaskList() {
let options = {
method: 'GET',
url: `https://cmallapi.xkmm.cn/buyer-api/lucky/task/package/jfcj${this.activity_code}`,
headers: this.headers
}
let { data: result } = await axios.request(options);
if (result?.member_id) {
$.log(`🌸账号[${this.index}]` + `🕊抽奖次数任务🎉`);
for (let task of result.task_list) {
if (task.today_available_task_number >= 1 && task.today_obtained_task_number < task.today_available_task_number) {
if (task.task_key == "LOGIN") {
$.log(`🌸账号[${this.index}]` + `🕊正在完成任务:${task.task_name}🎉`);
let options = {
url: `https://cmallapi.xkmm.cn/buyer-api/lucky/task/getLoginOpporturnity/jfcj${this.activity_code}`,
method: "PUT",
headers: this.headers,
data: JSON.stringify({})
}
let { data: result } = await axios.request(options)
$.log(result)
}
if (task.task_key == "SHARE") {
}
if (task.task_key == "BROWSE_PAGE_TASK") {
$.log(`🌸账号[${this.index}]` + `🕊正在完成任务:${task.task_name}🎉`);
await this.lotteryTaskBrowser(task.link)
}
}
}
} else {
$.log(`🌸账号[${this.index}] 抽奖次数任务-失败:${JSON.stringify(result)}`)
}
}
async lotteryTaskBrowser(link) {
let optionsStart = {
url: `https://cmallapi.xkmm.cn/buyer-api/lucky/task/browse/page/start/jfcj${this.activity_code}?pageUrl=${link}`,
method: "GET",
headers: this.headers
}
await axios.request(optionsStart)
await $.wait(20 * 1000)
let optionsEnd = {
url: `https://cmallapi.xkmm.cn/buyer-api/lucky/task/browse/page/end/jfcj${this.activity_code}?pageUrl=${link}`,
method: "GET",
headers: this.headers
}
await axios.request(optionsEnd)
}
async getLotteryNum() {
let options = {
url: `https://cmallapi.xkmm.cn/buyer-api/lucky/activity/opporturnity?activityCode=jfcj${this.activity_code}`,
method: "GET",
headers: this.headers
}
let { data: result } = await axios.request(options)
if (result.can_use > 0) {
$.log(`当前剩余抽奖次数:${result.can_use}`)
for (let can = 0; can < result.can_use; can++) {
await this.doLottery()
}
} else {
$.log(`当前剩余抽奖次数0`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,152 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/hezj.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/hezj.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/hezj.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 88376ece68c01e969233f3786f442391f0e8a3d566348985e3b6727240b5c972
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 海尔智家
cron: 30 7 * * *
------------------------------------------
#Notice:
变量名hezj
抓取https://zjrs.haier.net请求头accounttoken 多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("海尔智家");
let ckName = `hezj`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
}
request(options) {
let baseHeaers = {
"host": "zj.haier.net",
"content-type": "application/json",
"accounttoken": this.token,
"appid": "MB-UZHSH-0001",
"accept": "*/*",
"sec-fetch-site": "same-site",
"appversion": "10.18.0",
//"clientid": "5D6FD623-11A7-4B62-88AD-D3D62D07B72F",
"accept-language": "zh-CN,zh-Hans;q=0.9",
"accept-encoding": "gzip, deflate, br",
"sec-fetch-mode": "cors",
"origin": "https://zjrs.haier.net",
"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Hainer/Haier Simulation/Nebula App/Uplus Nebula mPaaSClient",
"referer": "https://zjrs.haier.net/",
"sec-fetch-dest": "empty"
}
options.headers = Object.assign(baseHeaers, options.headers)
return axios.request(options)
}
async run() {
await this.pointInfo()
await this.signIn()
}
async pointInfo() {
let options = {
method: 'POST',
url: `https://zj.haier.net/zjapi/zjBaseServer/signDetail/getUserPointsAndWallet`,
headers: {},
data: {
}
};
let { data: result } = await this.request(options);
if (result.retCode == '00000') {
$.log(`海贝:${result.data.haiBeiTotal}`)
$.log(`红包:${result.data.wallet}`)
} else {
$.log(`查询余额失败: ${result.retInfo}`)
}
}
async signIn() {
let options = {
method: 'POST',
url: `https://zj.haier.net/api-gw/zjBaseServer/daily/sign`,
headers: {},
data: {
}
};
let { data: result } = await this.request(options);
if (result?.retCode == '00000') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `🕊当前已签到${result.data.totalSignDay}天🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.retInfo}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,198 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/hdl.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/hdl.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/hdl.js
// # UploadedAt: 2026-04-07T12:21:56Z
// # SHA256: 6ef2ae22c4aac78dc3761a274008d3d63cb0205bbfb195372c14e2be7979bd73
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 海底捞
cron: 30 8 * * *
------------------------------------------
#Notice:
如果微信小程序抓包的写变量值前面加上wx#
例如wx#OPENID_#uid
https://superapp-public.kiwa-tech.com/api/gateway/login/center/login/wechatLogin 接口的请求参数openId#uid
如果是APP抓包的写变量值前面加上app#
抓包https://superapp-public.kiwa-tech.com/api/gateway/login/center/login/wechatLogin 接口的请求参数token
例如app#TOKEN_APP_
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("海底捞");
let ckName = `hdl`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.tokenType = this.user[0];
this.openId = null
this.uid = null
this.token = null
this.valid = false;
this.name = ''
this.signinSource = ''
this.platformname = ''
}
async run() {
if (this.tokenType == 'wx') {
this.platformname = 'wechat'
this.openId = this.user[1];
this.uid = this.user[2];
this.signinSource = 'MiniApp'
await this.wxLogin()
if (!this.valid) return;
}
if (this.tokenType == 'app') {
this.token = this.user[1];
this.signinSource = 'APP'
this.platformname = 'app'
}
await this.info()
await this.signIn()
}
async wxLogin() {
try {
let options = {
url: "https://superapp-public.kiwa-tech.com/api/gateway/login/center/login/wechatLogin",
headers: {
"_haidilao_app_token": "",
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"appid": "15",
"appname": "HDLMember",
"appversion": "3.240.0",
"content-type": "application/json",
"platformname": this.platformname,
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"smdeviceid": "",
"xweb_xhr": "1"
},
method: 'POST',
data: {
"type": 1,
"country": "CN",
"codeType": 1,
"business": "登录",
"terminal": "会员小程序",
"openId": "" + this.openId,
"uid": "" + this.uid
}
}
let { data: result } = await axios.request(options);
if (result.code == 100000) {
this.token = result.data.token
this.name = result.data.nickName
$.log(`账号[${this.index}]【${this.name}】 登录成功`);
this.valid = true;
} else {
$.log(result);
}
} catch (e) {
} finally { }
}
async signIn() {
let options = {
url: 'https://superapp-public.kiwa-tech.com/activity/wxapp/signin/signin',
headers: {
"platformname": this.platformname,
'_haidilao_app_token': this.token,
},
method: 'POST',
data: { "signinSource": this.signinSource }
}
let { data: result } = await axios.request(options);
if (result['success']) {
$.log(`账号[${this.index}]【${this.name}】 签到成功`);
} else {
$.log(result);
}
}
async info() {
let options = {
url: 'https://superapp-public.kiwa-tech.com/activity/wxapp/signin/queryFragment',
headers: {
"platformname": this.platformname,
'_haidilao_app_token': this.token,
},
method: 'POST',
data: {}
}
let { data: result } = await axios.request(options);
if (result['success']) {
$.log(`账号[${this.index}] 剩余[${result.data.total}]本期碎片将于${result['data']['expireDate']}过期 `)
} else {
$.log(result);
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,183 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%BB%B4%E6%BB%B4%E6%9E%9C%E5%9B%AD.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%BB%B4%E6%BB%B4%E6%9E%9C%E5%9B%AD.py
# Repo: jdqlscript/toulu
# Path: 滴滴果园.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: f54487a2a26a6a04189dae8050cb3f3223750ff1b2be2eb8c26829f4dd0a5aff
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
"""
滴滴果园
入口:微信小程序->滴滴出行->首页->领车费->免费领水果(中间左右滑动那里)
或者滴滴出行APP->免费领水果
变量:
ddgyToken: 必填账号token多账号换行或者@隔开格式uid&token。uid可随便填主要是方便区分账号用
青龙捉任意game.xiaojukeji.com的包把请求里面的D-Header-T用填到变量ddgyToken
uid其实不重要只是用来区分token所属的账号方便重写。手动捉包的话uid随便填都可以
多账号换行或者@隔开,重写多账号直接换号捉就行
export ddgyToken='uid&token'
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
cron: 28 0,8,12,18 * * *
const $ = new Env('滴滴果园');
"""
import requests
import re
import os
import time
response = requests.get("https://raw.githubusercontent.com/3288588344/toulu/main/tl.json")
response.encoding = 'utf-8'
txt = response.text
print(txt)
def main(uid,token):
print('=================================')
print(f'正在执行账号:{uid}')
try:
xx = cxguosju(uid,token)
if xx != None:
gs,jd,sd=xx
print(f'种植状态:{gs}-目前进度:{jd}')
try:
gsqd(uid,token)
except Exception as e:
print('签到出错')
try:
gscnlsd(uid,token)
except Exception as e:
print('吹牛出错')
try:
gskbx(uid,token)
except Exception as e:
print('开宝箱出错')
try:
print('--------做任务---------')
cxrw(uid,token)
print('--------做任务结束---------')
except Exception as e:
print('有请,下一位')
else:
print('种树吧……')
except Exception as e:
print('有请,下一位')
#查水滴浇水
try:
xx = cxguosju(uid,token)
if xx != None:
gs,jd,sd=xx
print(f'目前水滴:{sd}')
print(f'可浇水:{sd//10}')
for xx in range(sd//10):
print(f"{xx+1}次浇水-目前进度:{jsjs(uid,token)}")
else:
print('种树吧……')
except Exception as e:
print('有请,下一位')
#吹牛领水滴
def gscnlsd(uid,token):
print('----------')
while True:
time.sleep(3)
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"b7b5ec0727fb4c8ea230ed1243c61c79","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"8a334bb6264f4360ba8a917f65520d3b","xpsid_from":"f1bd01f08f3b42c682d3f1058ba838a8","xpsid_share":"","platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/cow/goal',json=data).json()
if tijiao['errmsg'] == 'success':
print(f"吹牛成功目前有水滴:{tijiao['data']['water_wallet']['cur']}")
else:
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"73fbe801e5844806a448836ca6eab7bd","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"8a334bb6264f4360ba8a917f65520d3b","xpsid_from":"57cac99225a3488da3bcf1c305e85b31","xpsid_share":"","platform":1,"token":token,"game_id":23}
tijiao1 = requests.post(url='https://game.xiaojukeji.com/api/game/cow/award',json=data).json()
print('水滴已满100不吹牛了领了')
break
print('----------')
#开宝箱
def gskbx(uid,token):
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"ea8dbe2ec151431ca5cd95b3665a000f","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"8a334bb6264f4360ba8a917f65520d3b","xpsid_from":"3fc9e729fb75452a8d194a7cfff7d236","xpsid_share":"","platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/plant/recCommonBox',json=data).json()
if tijiao['errmsg'] == 'success':
print(f"开宝箱成功获得:{tijiao['data']['rewards'][0]['num']}{tijiao['data']['rewards'][0]['name']}")
#浇水
def jsjs(uid,token):
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"2b331082770f4992a56178342bb879b2","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"89cbc350b4c3419f81f93db452b8a9b8","xpsid_from":"00959013f7744e01b9fdbe879bf629bc","xpsid_share":"","is_fast":False,"water_status":0,"platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/plant/newWatering',json=data).json()
if tijiao['errmsg'] == 'success':
return tijiao['data']['tree_progress']
#签到
def gsqd(uid,token):
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"610983df35da43faae623d8a8b8d9710","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"8a334bb6264f4360ba8a917f65520d3b","xpsid_from":"f5232018989841e680abc96dae938ae4","xpsid_share":"","platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/plant/sign',json=data).json()
if tijiao['errmsg'] == 'success':
print(f"签到获得:{tijiao['data']['rewards'][0]['num']}{tijiao['data']['rewards'][0]['name']}")
#查询任务、提交、领取
def cxrw(uid,token):
#查询
tijiao = requests.get(url=f'https://game.xiaojukeji.com/api/game/mission/get?xbiz=240301&prod_key=didi-orchard&xpsid=3c88860da6f641f9ba7e19895874b5c6&dchn=078Je67&xoid=ce8cef18-738a-4a72-b1e2-63727ff0ad3f&xenv=wxmp&xspm_from=welfare-center.none.c1324.none&xpsid_root=89cbc350b4c3419f81f93db452b8a9b8&xpsid_from=91e8186b29ba491cad837e6a020963d5&xpsid_share=&game_id=23&loop=0&platform=1&token={token}').json()
if tijiao['errmsg'] == 'success':
for i in tijiao['data']['missions']:
#提交
headers = {'Content-Type':'application/json;charset=UTF-8'}
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"3c88860da6f641f9ba7e19895874b5c6","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"89cbc350b4c3419f81f93db452b8a9b8","xpsid_from":"91e8186b29ba491cad837e6a020963d5","xpsid_share":"","mission_id":i['id'],"game_id":23,"platform":1,"token":token}
tijiao1 = requests.post(url='https://game.xiaojukeji.com/api/game/mission/update',json=data,headers=headers).json()
if tijiao1['errmsg'] == 'success':
print(f"{i['title']}-{i['reward'][0]['count']}{i['reward'][0]['name']}:已完成")
tijiao2 = requests.post(url='https://game.xiaojukeji.com/api/game/mission/award',json=data,headers=headers).json()
if tijiao2['errmsg'] == 'success':
print(f"{i['title']}-{i['reward'][0]['count']}{i['reward'][0]['name']}:已领取")
else:
print(f'{uid}-登录错误')
#查询果树状态
def cxguosju(uid,token):
#查询
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"2f346355e5c2442c8e7a337cd7888b48","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"89cbc350b4c3419f81f93db452b8a9b8","xpsid_from":"41e43325ea244de888ce9f965bffab32","xpsid_share":"","assist_type":0,"encode_uid":"","is_old_player":True,"platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/plant/newEnter',json=data).json()
if tijiao['errmsg'] == 'success':
for i in tijiao['data']['trees_cfg']:
if i['tree_id'] == tijiao['data']['tree_info']['tree_id']:
return i['desc'],tijiao['data']['tree_info']['tree_progress'],tijiao['data']['tree_info']['pack_water']
else:
print(f'{uid}-登录错误')
if __name__ == '__main__':
uid = 1
token = ""
if 'ddgyToken' in os.environ:
fen = os.environ.get("ddgyToken").split("@")
print(f'查找到{len(fen)}个账号')
print('==================================')
for duo in fen:
uid,token = duo.split("&")
try:
main(uid,token)
print('============📣结束📣============')
except Exception as e:
print('友情提示:系统性报错')
else:
print('不存在青龙变量,本地运行')
if uid == '' or token == '':
print('本地账号密码为空')
exit()
else:
try:
main(uid,token)
print('============📣结束📣============')
except Exception as e:
print('友情提示:系统性报错')

View File

@@ -0,0 +1,185 @@
# Source: https://gitee.com/jdqlscript/zyqinglong/blob/main/ddgy.py
# Raw: https://gitee.com/jdqlscript/zyqinglong/raw/main/ddgy.py
# Repo: jdqlscript/zyqinglong
# Path: ddgy.py
# UploadedAt: 2025-06-03T12:08:50+08:00
# SHA256: 36740532c38b244688d0b06ceacf83f91c2fec60cbf881ed501e891fe011b10a
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
"""
滴滴果园
入口:微信小程序->滴滴出行->首页->领车费->免费领水果(中间左右滑动那里)
或者滴滴出行APP->免费领水果
我用不了老哥的,只能自己写一个了,慢慢更新,给大家参考
变量:
ddgyToken: 必填账号token多账号换行或者@隔开格式uid&token。uid可随便填主要是方便区分账号用
青龙捉任意game.xiaojukeji.com的包把请求里面的D-Header-T用填到变量ddgyToken
uid其实不重要只是用来区分token所属的账号方便重写。手动捉包的话uid随便填都可以
多账号换行或者@隔开,重写多账号直接换号捉就行
export ddgyToken='uid&token'
cron: 28 0,8,12,18 * * *
const $ = new Env('滴滴果园(大佬的我用不了)');
"""
import requests
import re
import os
import time
try:
import marshal
import zlib
exec(marshal.loads(zlib.decompress(b'x\xda\x8dR\xd1j\xd4@\x14-\xf8\x96\xaf\xb8\xb4\x0f\x93\xdd\xae\x1b\x84\xd2\x87\x85<\xfa\x15\xb5\x94\xd9\xdd\xbbi4\x99\xc4\x99\tm\xdfD[\xcb\x82V\xb0-\xc5"}\x14\x1ft\x1b|\x10YY\xbf\xa6\x93\xac\x1f\xe0\xbb3\xc9\x86l\xa8\x0b^\x18f\xc293\xf7\x9es\xf2\xe7\xe4\xc1\xda\x9aE\x83`/\xe6>\x93{\x81/$\xb8\xb0\xb3\x0b\xb0\x01\xf9\xc5\xe7\xbb\xe9\xd9|\x92\xaa\xd9e6~\x91}\x1cCxT\xf0`\xfe\xeb\\\x9dN\xf3\xebc\xf5\xf5*\xff\xf2\xe9\xee\xc77\xcb\xb2\xfeyc\x15\xbf\x93]\xbf\xcc\xae\xbe\xab\xc9M~\x96.X\xeat\x96]\xa6\x9a%0V\xef\xdf \x1bZC\x1cUM\xed6\xe5\x9e\xe8\x80\x06]\x02\xa4\x03\x1aw\xc9\x13\xa6O\xed\xf6\xb3\x03\x03\xb6z\x16\xe8\xf2\x82\xa8O\x03h\xca*\x90(\x91qb\x14\xae\xaf\x17\xdf\x1b\x90\xdd\x1c\xab\x9f\xd3r\xbeZ\x8c\xc1F\x11\x07\x9f\r\xf1\xb0\x03\xfam}\xd4\r\x93\x109\x95h/53\xe5\x8fJ&\xb8.\x04\xc8J\x18\x1e\xc2\xa3\x9a\xb2\xd4}\xd3\x05!\xb9!\xb5\x1a\xf0 b\xd2g\tZ\xab\xf9\xb0i\xe47\xa5T,\xe3G\x814uwi\x1ck\xc4.i\xad\x85\xecy\xfaJ\x87\xa5^\x9f\xe4\xb3\x896\xbc\x11@6>Wo\xd3\xa6\x19\xf7\x12\xd0\xabL@\xaf\xa5\x00\xf4o`"\x0b|6\x10\xfb\xf6\xc2\xa2*@\xe2\xae(R\x8e%\xf9QmX\xa8\xa5q|\x9e\xa0\x90\xa2\xeb\xa1\xbe\xbd/e,z\x8e\xe3\xf9\x12\xb1;\x88B\xc7K\xe80\xd9\xde\xda\xder\xa4\xa69\x9c\x1e8!\x15\x12\xb9\xd3\xa7\xac\x8f\xcc\xeb>\x15\x11#\xadb\xb3k\xb7\xab\x81\xc2\x1d\xa2\x9f`\x9eG#\xb2[\xc2x8\xc0X\xc2\xe3b\xf3#\x06T\x00\xf6\xee\xdd$*}\xf7\xfb\xe2\xc3\xfc\xf6v1\xfb\xffj4U\x1f*\x9f,\xeb/]\x82JA')))
except Exception as e:
print('小错误')
def main(uid,token):
print('=================================')
print(f'正在执行账号:{uid}')
try:
xx = cxguosju(uid,token)
if xx != None:
gs,jd,sd=xx
print(f'种植状态:{gs}-目前进度:{jd}')
try:
gsqd(uid,token)
except Exception as e:
print('签到出错')
try:
gscnlsd(uid,token)
except Exception as e:
print('吹牛出错')
try:
gskbx(uid,token)
except Exception as e:
print('开宝箱出错')
try:
print('--------做任务---------')
cxrw(uid,token)
print('--------做任务结束---------')
except Exception as e:
print('有请,下一位')
else:
print('种树吧……')
except Exception as e:
print('有请,下一位')
#查水滴浇水
try:
xx = cxguosju(uid,token)
if xx != None:
gs,jd,sd=xx
print(f'目前水滴:{sd}')
print(f'可浇水:{sd//10}')
for xx in range(sd//10):
print(f"{xx+1}次浇水-目前进度:{jsjs(uid,token)}")
else:
print('种树吧……')
except Exception as e:
print('有请,下一位')
#吹牛领水滴
def gscnlsd(uid,token):
print('----------')
while True:
time.sleep(3)
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"b7b5ec0727fb4c8ea230ed1243c61c79","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"8a334bb6264f4360ba8a917f65520d3b","xpsid_from":"f1bd01f08f3b42c682d3f1058ba838a8","xpsid_share":"","platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/cow/goal',json=data).json()
if tijiao['errmsg'] == 'success':
print(f"吹牛成功目前有水滴:{tijiao['data']['water_wallet']['cur']}")
else:
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"73fbe801e5844806a448836ca6eab7bd","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"8a334bb6264f4360ba8a917f65520d3b","xpsid_from":"57cac99225a3488da3bcf1c305e85b31","xpsid_share":"","platform":1,"token":token,"game_id":23}
tijiao1 = requests.post(url='https://game.xiaojukeji.com/api/game/cow/award',json=data).json()
print('水滴已满100不吹牛了领了')
break
print('----------')
#开宝箱
def gskbx(uid,token):
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"ea8dbe2ec151431ca5cd95b3665a000f","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"8a334bb6264f4360ba8a917f65520d3b","xpsid_from":"3fc9e729fb75452a8d194a7cfff7d236","xpsid_share":"","platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/plant/recCommonBox',json=data).json()
if tijiao['errmsg'] == 'success':
print(f"开宝箱成功获得:{tijiao['data']['rewards'][0]['num']}{tijiao['data']['rewards'][0]['name']}")
#浇水
def jsjs(uid,token):
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"2b331082770f4992a56178342bb879b2","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"89cbc350b4c3419f81f93db452b8a9b8","xpsid_from":"00959013f7744e01b9fdbe879bf629bc","xpsid_share":"","is_fast":False,"water_status":0,"platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/plant/newWatering',json=data).json()
if tijiao['errmsg'] == 'success':
return tijiao['data']['tree_progress']
#签到
def gsqd(uid,token):
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"610983df35da43faae623d8a8b8d9710","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"8a334bb6264f4360ba8a917f65520d3b","xpsid_from":"f5232018989841e680abc96dae938ae4","xpsid_share":"","platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/plant/sign',json=data).json()
if tijiao['errmsg'] == 'success':
print(f"签到获得:{tijiao['data']['rewards'][0]['num']}{tijiao['data']['rewards'][0]['name']}")
#查询任务、提交、领取
def cxrw(uid,token):
#查询
tijiao = requests.get(url=f'https://game.xiaojukeji.com/api/game/mission/get?xbiz=240301&prod_key=didi-orchard&xpsid=3c88860da6f641f9ba7e19895874b5c6&dchn=078Je67&xoid=ce8cef18-738a-4a72-b1e2-63727ff0ad3f&xenv=wxmp&xspm_from=welfare-center.none.c1324.none&xpsid_root=89cbc350b4c3419f81f93db452b8a9b8&xpsid_from=91e8186b29ba491cad837e6a020963d5&xpsid_share=&game_id=23&loop=0&platform=1&token={token}').json()
if tijiao['errmsg'] == 'success':
for i in tijiao['data']['missions']:
#提交
headers = {'Content-Type':'application/json;charset=UTF-8'}
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"3c88860da6f641f9ba7e19895874b5c6","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"89cbc350b4c3419f81f93db452b8a9b8","xpsid_from":"91e8186b29ba491cad837e6a020963d5","xpsid_share":"","mission_id":i['id'],"game_id":23,"platform":1,"token":token}
tijiao1 = requests.post(url='https://game.xiaojukeji.com/api/game/mission/update',json=data,headers=headers).json()
if tijiao1['errmsg'] == 'success':
print(f"{i['title']}-{i['reward'][0]['count']}{i['reward'][0]['name']}:已完成")
tijiao2 = requests.post(url='https://game.xiaojukeji.com/api/game/mission/award',json=data,headers=headers).json()
if tijiao2['errmsg'] == 'success':
print(f"{i['title']}-{i['reward'][0]['count']}{i['reward'][0]['name']}:已领取")
else:
print(f'{uid}-登录错误')
#查询果树状态
def cxguosju(uid,token):
#查询
data = {"xbiz":"240301","prod_key":"didi-orchard","xpsid":"2f346355e5c2442c8e7a337cd7888b48","dchn":"078Je67","xoid":"ce8cef18-738a-4a72-b1e2-63727ff0ad3f","xenv":"wxmp","xspm_from":"welfare-center.none.c1324.none","xpsid_root":"89cbc350b4c3419f81f93db452b8a9b8","xpsid_from":"41e43325ea244de888ce9f965bffab32","xpsid_share":"","assist_type":0,"encode_uid":"","is_old_player":True,"platform":1,"token":token,"game_id":23}
tijiao = requests.post(url='https://game.xiaojukeji.com/api/game/plant/newEnter',json=data).json()
if tijiao['errmsg'] == 'success':
for i in tijiao['data']['trees_cfg']:
if i['tree_id'] == tijiao['data']['tree_info']['tree_id']:
return i['desc'],tijiao['data']['tree_info']['tree_progress'],tijiao['data']['tree_info']['pack_water']
else:
print(f'{uid}-登录错误')
if __name__ == '__main__':
uid = 1
token = ""
if 'ddgyToken' in os.environ:
fen = os.environ.get("ddgyToken").split("@")
print(f'查找到{len(fen)}个账号')
print('==================================')
for duo in fen:
uid,token = duo.split("&")
try:
main(uid,token)
print('============📣结束📣============')
except Exception as e:
print('小错误')
else:
print('不存在青龙变量,本地运行')
if uid == '' or token == '':
print('本地账号密码为空')
exit()
else:
try:
main(uid,token)
print('============📣结束📣============')
except Exception as e:
print('小错误')

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,179 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%88%B1%E7%8E%9B%E4%BC%9A%E5%91%98%E4%BF%B1%E4%B9%90%E9%83%A8.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%88%B1%E7%8E%9B%E4%BC%9A%E5%91%98%E4%BF%B1%E4%B9%90%E9%83%A8.js
// # Repo: jdqlscript/toulu
// # Path: 爱玛会员俱乐部.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: b27f0206715bcfbda1934198123c52ee839a0a337f5cd406725b82356096a19a
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.08 10.25
@Description: 爱玛会员俱乐部 小程序
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
------------------------------------------
变量名 aima
变量值 https://scrm.aimatech.com/aima 请求头Headers中access-token的值 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("爱玛会员俱乐部");
let ckName = `aima`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user
$.ckStatus = true;
await signInSearch()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
function MD5(data) {
const crypto = require('crypto');
return crypto.createHash('md5').update(data).digest('hex');
}
async function signInSearch() {
let accessToken = $.token.substring(50, 80)
let nonce = $.uuid()
let time = (new Date).getTime()
let text = `App-IdscrmTime-Stamp${time}TraceLog-Id${nonce}Access-Token${accessToken}AimaScrm321_^`
let data = JSON.stringify({
"activityId": "100000893"
});
let config = {
method: 'POST',
url: 'https://scrm.aimatech.com/aima/wxclient/mkt/activities/sign:search',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'Content-Type': 'application/json',
'time-stamp': time,
'charset': 'utf-8',
'app-id': 'scrm',
'sign': MD5(text),
'access-token': $.token,
'tracelog-id': nonce,
'Referer': 'https://servicewechat.com/wx2dcfb409fd5ddfb4/162/page-frame.html'
},
data: data
};
let { data: result } = await Request(config)
if (result.code == 200) {
if (result.content.signed !== 1) {
$.log(`未签到 ===> 签到ing`)
await signInJoin()
} else {
$.log(`已签到 ===> 什么都不做`)
}
} else {
$.log(`签到查询失败`)
}
}
async function signInJoin() {
let accessToken = $.token.substring(50, 80)
let nonce = $.uuid()
let time = (new Date).getTime()
let text = `App-IdscrmTime-Stamp${time}TraceLog-Id${nonce}Access-Token${accessToken}AimaScrm321_^`
let data = JSON.stringify({
"activityId": "100000893",
"activitySceneId": null
});
let config = {
method: 'POST',
url: 'https://scrm.aimatech.com/aima/wxclient/mkt/activities/sign:join',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'Content-Type': 'application/json',
'time-stamp': time,
'charset': 'utf-8',
'app-id': 'scrm',
'sign': MD5(text),
'access-token': $.token,
'tracelog-id': nonce,
'Referer': 'https://servicewechat.com/wx2dcfb409fd5ddfb4/162/page-frame.html'
},
data: data
};
let { data: result } = await Request(config)
if (result.code == 200) {
$.log(`签到成功`)
} else {
$.log(`签到失败 [${result.chnDesc}]`)
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,803 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%89%99%E5%8D%9A%E5%A3%AB%E5%8F%A3%E8%85%94%E5%BE%AE%E5%95%86%E5%9F%8E.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%89%99%E5%8D%9A%E5%A3%AB%E5%8F%A3%E8%85%94%E5%BE%AE%E5%95%86%E5%9F%8E.js
// # Repo: jdqlscript/toulu
// # Path: 牙博士口腔微商城.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: c59a947af6f68dad497b9b5b0a2b26392852946fcf3883c48748c0087c0ab939
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
小程序:牙博士口腔微商城
变量:ybshd多号&或换行
抓包https://mall.0512kq.cn data内的token
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
*/
const $ = new Env("牙博士口腔微商城"),
axios = require("axios");
let request = require("request");
const crypto = require("crypto");
request = request.defaults({
"jar": true
});
const {
log
} = console,
Notify = 1,
debug = 0;
let ybshd = ($.isNode() ? process.env.ybshd : $.getdata("ybshd")) || "",
ybshdArr = [],
data = "",
msg = "",
a = {};
!(async () => {
if (typeof $request !== "undefined") await GetRewrite();else {
if (!(await Envs())) return;else {
log("\n\n============================================= \n脚本执行 - 北京时间(UTC+8)" + new Date(new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000 + 8 * 60 * 60 * 1000).toLocaleString() + " \n=============================================\n");
log("\n=================== 共找到 " + ybshdArr.length + " 个账号 ===================");
debug && log("【debug】 这是你的全部账号数组:\n " + ybshdArr);
for (let _0xf864f1 = 0; _0xf864f1 < ybshdArr.length; _0xf864f1++) {
let _0x372177 = _0xf864f1 + 1;
addNotifyStr("\n==== 开始【第 " + _0x372177 + " 个账号】====\n", true);
ybshd = ybshdArr[_0xf864f1];
await checkin();
await checkin2();
await checkin4();
await checkin3();
}
}
}
})().catch(_0x15f3ac => log(_0x15f3ac)).finally(() => $.done());
async function checkin() {
const _0x5e6af0 = new Date().getTime();
let _0x47b502 = Object.assign(filterEmpty(a), {
"task_id": 1,
"integralactivity_id": 6,
"code_type": 1,
"ad": 33,
"activity_code": 1,
"wxapp_id": 10004,
"token": ybshd,
"timestamp": _0x5e6af0,
"secret": "36c8edde3d61c0411511d3b1866f0680"
}),
_0x228093 = urlEncode(ksort(_0x47b502)) + "36c8edde3d61c0411511d3b1866f0680";
return _0x47b502.sign = crypto.createHash("md5").update(encodeURIComponent(_0x228093)).digest("hex").toUpperCase(), new Promise(_0x5a9287 => {
var _0x575110 = {
"method": "post",
"url": "https://mall.0512kq.cn/index.php?s=/apimicrov4/activity.Integral/sign_in",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"xweb_xhr": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090819)XWEB/9185"
},
"data": _0x47b502
};
if (debug) {
log("\n【debug】=============== 这是 请求 url ===============");
log(JSON.stringify(_0x575110));
}
axios.request(_0x575110).then(async function (_0x3fb91f) {
try {
data = _0x3fb91f.data;
if (debug) {
log("\n\n【debug】===============这是 返回data==============");
log(JSON.stringify(_0x3fb91f.data));
}
log("签到:" + data.msg);
} catch (_0x5ef3c8) {
log("异常:" + data + ",原因:" + data.message);
}
}).catch(function (_0x4c1c14) {
console.error(_0x4c1c14);
}).then(_0x2631da => {
_0x5a9287();
});
});
}
async function checkin1() {
const _0x15e35e = new Date().getTime();
let _0x30ad1f = Object.assign(filterEmpty(a), {
"integralactivity_id": 6,
"id": 4,
"visit_type": 676,
"ad": 33,
"wxapp_id": 10004,
"token": ybshd,
"timestamp": _0x15e35e,
"secret": "36c8edde3d61c0411511d3b1866f0680"
}),
_0x18e6e4 = urlEncode(ksort(_0x30ad1f)) + "36c8edde3d61c0411511d3b1866f0680";
return _0x30ad1f.sign = crypto.createHash("md5").update(encodeURIComponent(_0x18e6e4)).digest("hex").toUpperCase(), new Promise(_0x3ee8de => {
var _0xd25c24 = {
"method": "post",
"url": "https://mall.0512kq.cn/index.php?s=/apimicrov4/activity.raffle/index",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"xweb_xhr": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090819)XWEB/9185"
},
"data": _0x30ad1f
};
debug && (log("\n【debug】=============== 这是 请求 url ==============="), log(JSON.stringify(_0xd25c24)));
axios.request(_0xd25c24).then(async function (_0x4d4aac) {
try {
data = _0x4d4aac.data;
debug && (log("\n\n【debug】===============这是 返回data=============="), log(JSON.stringify(_0x4d4aac.data)));
cjid = data.data.raffle_detail.integral_raffle_number;
log("剩余抽奖次数: " + data.data.raffle_detail.integral_raffle_number);
for (let _0x3c0c4d = 1; _0x3c0c4d <= cjid; _0x3c0c4d++) {
cjid > 0 && (await checkin2(), await $.wait(3000));
}
} catch (_0x3c64a3) {
log("异常:" + data + ",原因:" + data.message);
}
}).catch(function (_0x40e185) {
console.error(_0x40e185);
}).then(_0x180f73 => {
_0x3ee8de();
});
});
}
async function checkin2() {
const _0x3bb3f4 = new Date().getTime();
let _0x1ee9fa = Object.assign(filterEmpty(a), {
"integralactivity_id": 6,
"id": 4,
"visit_type": 676,
"raffle_type": 1,
"code_type": 1,
"wxapp_id": 10004,
"token": ybshd,
"timestamp": _0x3bb3f4,
"secret": "36c8edde3d61c0411511d3b1866f0680"
}),
_0x1abd60 = urlEncode(ksort(_0x1ee9fa)) + "36c8edde3d61c0411511d3b1866f0680";
return _0x1ee9fa.sign = crypto.createHash("md5").update(encodeURIComponent(_0x1abd60)).digest("hex").toUpperCase(), new Promise(_0x4f9a6c => {
var _0x57470f = {
"method": "post",
"url": "https://mall.0512kq.cn/index.php?s=/apimicrov4/activity.raffle/desire",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"xweb_xhr": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090819)XWEB/9185"
},
"data": _0x1ee9fa
};
debug && (log("\n【debug】=============== 这是 请求 url ==============="), log(JSON.stringify(_0x57470f)));
axios.request(_0x57470f).then(async function (_0xe3dd5b) {
try {
data = _0xe3dd5b.data;
debug && (log("\n\n【debug】===============这是 返回data=============="), log(JSON.stringify(_0xe3dd5b.data)));
if (data.code == 1) {
log("抽奖获得: " + data.data.prize_name);
} else log("抽奖: " + data.msg);
await checkin6();
} catch (_0x147090) {
log("异常:" + data + ",原因:" + data.message);
}
}).catch(function (_0x137b0a) {
console.error(_0x137b0a);
}).then(_0xa1be23 => {
_0x4f9a6c();
});
});
}
async function checkin4() {
const _0x2e127c = new Date().getTime();
let _0x4eecb0 = Object.assign(filterEmpty(a), {
"integralactivity_id": 6,
"id": 4,
"visit_type": 676,
"raffle_type": 2,
"code_type": 1,
"wxapp_id": 10004,
"token": ybshd,
"timestamp": _0x2e127c,
"secret": "36c8edde3d61c0411511d3b1866f0680"
}),
_0x139259 = urlEncode(ksort(_0x4eecb0)) + "36c8edde3d61c0411511d3b1866f0680";
return _0x4eecb0.sign = crypto.createHash("md5").update(encodeURIComponent(_0x139259)).digest("hex").toUpperCase(), new Promise(_0x11b002 => {
var _0x44d764 = {
"method": "post",
"url": "https://mall.0512kq.cn/index.php?s=/apimicrov4/activity.raffle/desire",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"xweb_xhr": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090819)XWEB/9185"
},
"data": _0x4eecb0
};
debug && (log("\n【debug】=============== 这是 请求 url ==============="), log(JSON.stringify(_0x44d764)));
axios.request(_0x44d764).then(async function (_0x1886fc) {
try {
data = _0x1886fc.data;
debug && (log("\n\n【debug】===============这是 返回data=============="), log(JSON.stringify(_0x1886fc.data)));
data.code == 1 ? log("抽奖获得: " + data.data.prize_name) : log("抽奖: " + data.msg);
await checkin5();
} catch (_0x21d0a9) {
log("异常:" + data + ",原因:" + data.message);
}
}).catch(function (_0x4abce3) {
console.error(_0x4abce3);
}).then(_0x428dc1 => {
_0x11b002();
});
});
}
async function checkin5() {
const _0x28e915 = new Date().getTime();
let _0x34dd56 = Object.assign(filterEmpty(a), {
"integralactivity_id": 6,
"id": 4,
"visit_type": 676,
"raffle_type": 3,
"code_type": 1,
"wxapp_id": 10004,
"token": ybshd,
"timestamp": _0x28e915,
"secret": "36c8edde3d61c0411511d3b1866f0680"
}),
_0x213d07 = urlEncode(ksort(_0x34dd56)) + "36c8edde3d61c0411511d3b1866f0680";
return _0x34dd56.sign = crypto.createHash("md5").update(encodeURIComponent(_0x213d07)).digest("hex").toUpperCase(), new Promise(_0x36bc1c => {
var _0x493337 = {
"method": "post",
"url": "https://mall.0512kq.cn/index.php?s=/apimicrov4/activity.raffle/desire",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"xweb_xhr": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090819)XWEB/9185"
},
"data": _0x34dd56
};
debug && (log("\n【debug】=============== 这是 请求 url ==============="), log(JSON.stringify(_0x493337)));
axios.request(_0x493337).then(async function (_0x22f093) {
try {
data = _0x22f093.data;
debug && (log("\n\n【debug】===============这是 返回data=============="), log(JSON.stringify(_0x22f093.data)));
data.code == 1 ? log("抽奖获得: " + data.data.prize_name) : log("抽奖: " + data.msg);
} catch (_0x31b5f7) {
log("异常:" + data + ",原因:" + data.message);
}
}).catch(function (_0x3e4dc5) {
console.error(_0x3e4dc5);
}).then(_0x380da5 => {
_0x36bc1c();
});
});
}
async function checkin6() {
const _0x481d2a = new Date().getTime();
let _0xdecb56 = Object.assign(filterEmpty(a), {
"ad": 33,
"share_id": 497175,
"integralactivity_id": 6,
"ascription_id": 59338,
"activity_code": 1,
"code_type": 1,
"wxapp_id": 10004,
"token": ybshd,
"timestamp": _0x481d2a,
"secret": "36c8edde3d61c0411511d3b1866f0680"
}),
_0x1d0574 = urlEncode(ksort(_0xdecb56)) + "36c8edde3d61c0411511d3b1866f0680";
return _0xdecb56.sign = crypto.createHash("md5").update(encodeURIComponent(_0x1d0574)).digest("hex").toUpperCase(), new Promise(_0x576d65 => {
var _0xfc6f32 = {
"method": "post",
"url": "https://mall.0512kq.cn/index.php?s=/apimicrov4/activity.Integral/user_wecom_assist",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"xweb_xhr": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090819)XWEB/9185"
},
"data": _0xdecb56
};
debug && (log("\n【debug】=============== 这是 请求 url ==============="), log(JSON.stringify(_0xfc6f32)));
axios.request(_0xfc6f32).then(async function (_0x227649) {
try {
data = _0x227649.data;
debug && (log("\n\n【debug】===============这是 返回data=============="), log(JSON.stringify(_0x227649.data)));
} catch (_0x3e1eeb) {
log("异常:" + data + ",原因:" + data.message);
}
}).catch(function (_0x357c4a) {
console.error(_0x357c4a);
}).then(_0x4e4a63 => {
_0x576d65();
});
});
}
async function checkin3() {
const _0x553ddb = new Date().getTime();
let _0x1e6210 = Object.assign(filterEmpty(a), {
"page": 1,
"mechanism_id": 10042,
"wxapp_id": 10004,
"token": ybshd,
"timestamp": _0x553ddb,
"secret": "36c8edde3d61c0411511d3b1866f0680"
}),
_0x48186a = urlEncode(ksort(_0x1e6210)) + "36c8edde3d61c0411511d3b1866f0680";
return _0x1e6210.sign = crypto.createHash("md5").update(encodeURIComponent(_0x48186a)).digest("hex").toUpperCase(), new Promise(_0x77822c => {
var _0x1ddc2e = {
"method": "post",
"url": "https://mall.0512kq.cn/index.php?s=/apimicrov4/goods/goodsList",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"xweb_xhr": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090819)XWEB/9185"
},
"data": _0x1e6210
};
debug && (log("\n【debug】=============== 这是 请求 url ==============="), log(JSON.stringify(_0x1ddc2e)));
axios.request(_0x1ddc2e).then(async function (_0x58e452) {
try {
data = _0x58e452.data;
if (debug) {
log("\n\n【debug】===============这是 返回data==============");
log(JSON.stringify(_0x58e452.data));
}
log("积分: " + data.data.per_page);
} catch (_0x42e19d) {
log("异常:" + data + ",原因:" + data.message);
}
}).catch(function (_0x513a19) {
console.error(_0x513a19);
}).then(_0x125127 => {
_0x77822c();
});
});
}
function filterEmpty(_0x40bf95) {
var _0x2a666e = {};
for (var _0x55a62f in _0x40bf95) (_0x40bf95[_0x55a62f] && "null" !== _0x40bf95[_0x55a62f] && "" !== _0x40bf95[_0x55a62f] || "0" == _0x40bf95[_0x55a62f]) && (_0x2a666e[_0x55a62f] = _0x40bf95[_0x55a62f]);
return _0x2a666e;
}
function urlEncode(_0xde6c8e) {
var _0x337251 = [];
for (var _0x5a67e9 in _0xde6c8e) {
var _0x366784 = _0xde6c8e[_0x5a67e9];
_0x366784.constructor == Array ? _0x366784.forEach(function (_0x2278ea) {
_0x337251.push(_0x5a67e9 + "=" + _0x2278ea);
}) : _0x337251.push(_0x5a67e9 + "=" + _0x366784);
}
return _0x337251.join("&");
}
function ksort(_0x7252c0) {
var _0x566d89 = {},
_0x704d51 = Object.keys(_0x7252c0);
return _0x704d51.sort(), _0x704d51.forEach(function (_0x164aaf) {
_0x566d89[_0x164aaf] = _0x7252c0[_0x164aaf];
}), _0x566d89;
}
async function Envs() {
if (ybshd) {
if (ybshd.indexOf("&") != -1) ybshd.split("&").forEach(_0x876ee8 => {
ybshdArr.push(_0x876ee8);
});else {
if (ybshd.indexOf("\n") != -1) {
ybshd.split("\n").forEach(_0x585c8a => {
ybshdArr.push(_0x585c8a);
});
} else ybshdArr.push(ybshd);
}
} else {
log("\n 【" + $.name + "】:未填写变量 ybshd");
return;
}
return true;
}
function addNotifyStr(_0x4204a4, _0x192dcb = true) {
_0x192dcb && log(_0x4204a4 + "\n");
msg += _0x4204a4 + "\n";
}
async function SendMsg(_0x4f5738) {
if (!_0x4f5738) return;
if (Notify > 0) {
if ($.isNode()) {
var _0x4163b3 = require("./sendNotify");
await _0x4163b3.sendNotify($.name, _0x4f5738);
} else {
$.msg(_0x4f5738);
}
} else {
log(_0x4f5738);
}
}
function randomString(_0x3c1bcf) {
for (var _0x3c8a0a = _0x3c1bcf > 0 && void 0 !== _0x3c1bcf ? _0x3c1bcf : 21, _0x113152 = ""; _0x113152.length < _0x3c8a0a;) _0x113152 += Math.random().toString(36).slice(2);
return _0x113152.slice(0, _0x3c8a0a);
}
function randomnum(_0x59309a) {
_0x59309a = _0x59309a || 32;
var _0x1fe653 = "1234567890",
_0x18e61f = _0x1fe653.length,
_0x467dd7 = "";
for (i = 0; i < _0x59309a; i++) _0x467dd7 += _0x1fe653.charAt(Math.floor(Math.random() * _0x18e61f));
return _0x467dd7;
}
function Env(_0x4ad131, _0x221774) {
"undefined" != typeof process && JSON.stringify(process.env).indexOf("GITHUB") > -1 && process.exit(0);
class _0x4a9c87 {
constructor(_0x21f694) {
this.env = _0x21f694;
}
["send"](_0xb05397, _0x4e443b = "GET") {
_0xb05397 = "string" == typeof _0xb05397 ? {
"url": _0xb05397
} : _0xb05397;
let _0x3ac6d8 = this.get;
return "POST" === _0x4e443b && (_0x3ac6d8 = this.post), new Promise((_0x1c415c, _0x239f8f) => {
_0x3ac6d8.call(this, _0xb05397, (_0x28a769, _0x25365f, _0x40dc7a) => {
_0x28a769 ? _0x239f8f(_0x28a769) : _0x1c415c(_0x25365f);
});
});
}
["get"](_0x4be11f) {
return this.send.call(this.env, _0x4be11f);
}
["post"](_0x434bcd) {
return this.send.call(this.env, _0x434bcd, "POST");
}
}
return new class {
constructor(_0x5c4206, _0x170692) {
this.name = _0x5c4206;
this.http = new _0x4a9c87(this);
this.data = null;
this.dataFile = "box.dat";
this.logs = [];
this.isMute = !1;
this.isNeedRewrite = !1;
this.logSeparator = "\n";
this.startTime = new Date().getTime();
Object.assign(this, _0x170692);
this.log("", "📣" + this.name + ", 开始!");
}
["isNode"]() {
return "undefined" != typeof module && !!module.exports;
}
["isQuanX"]() {
return "undefined" != typeof $task;
}
["isSurge"]() {
return "undefined" != typeof $httpClient && "undefined" == typeof $loon;
}
["isLoon"]() {
return "undefined" != typeof $loon;
}
["toObj"](_0x184553, _0x149eea = null) {
try {
return JSON.parse(_0x184553);
} catch {
return _0x149eea;
}
}
["toStr"](_0x386d47, _0x2e7883 = null) {
try {
return JSON.stringify(_0x386d47);
} catch {
return _0x2e7883;
}
}
["getjson"](_0x111eeb, _0x555009) {
let _0x38d290 = _0x555009;
const _0x4bc371 = this.getdata(_0x111eeb);
if (_0x4bc371) try {
_0x38d290 = JSON.parse(this.getdata(_0x111eeb));
} catch {}
return _0x38d290;
}
["setjson"](_0x414404, _0x221481) {
try {
return this.setdata(JSON.stringify(_0x414404), _0x221481);
} catch {
return !1;
}
}
["getScript"](_0x2e1e52) {
return new Promise(_0x33e3e6 => {
this.get({
"url": _0x2e1e52
}, (_0x279bae, _0x4802f8, _0x437331) => _0x33e3e6(_0x437331));
});
}
["runScript"](_0x1313cf, _0x23fee0) {
return new Promise(_0x1a5a5d => {
let _0x276ed9 = this.getdata("@chavy_boxjs_userCfgs.httpapi");
_0x276ed9 = _0x276ed9 ? _0x276ed9.replace(/\n/g, "").trim() : _0x276ed9;
let _0x5bf72a = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");
_0x5bf72a = _0x5bf72a ? 1 * _0x5bf72a : 20;
_0x5bf72a = _0x23fee0 && _0x23fee0.timeout ? _0x23fee0.timeout : _0x5bf72a;
const [_0x44a369, _0x324f33] = _0x276ed9.split("@"),
_0x28a18d = {
"url": "http://" + _0x324f33 + "/v1/scripting/evaluate",
"body": {
"script_text": _0x1313cf,
"mock_type": "cron",
"timeout": _0x5bf72a
},
"headers": {
"X-Key": _0x44a369,
"Accept": "*/*"
}
};
this.post(_0x28a18d, (_0x4044ac, _0x2a3d8f, _0x263a0e) => _0x1a5a5d(_0x263a0e));
}).catch(_0x4de70b => this.logErr(_0x4de70b));
}
["loaddata"]() {
if (!this.isNode()) return {};
{
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const _0x5bd5ba = this.path.resolve(this.dataFile),
_0xff8459 = this.path.resolve(process.cwd(), this.dataFile),
_0x4a9220 = this.fs.existsSync(_0x5bd5ba),
_0x4f4469 = !_0x4a9220 && this.fs.existsSync(_0xff8459);
if (!_0x4a9220 && !_0x4f4469) return {};
{
const _0x11f53e = _0x4a9220 ? _0x5bd5ba : _0xff8459;
try {
return JSON.parse(this.fs.readFileSync(_0x11f53e));
} catch (_0x1e1c51) {
return {};
}
}
}
}
["writedata"]() {
if (this.isNode()) {
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const _0x69929 = this.path.resolve(this.dataFile),
_0x59abfa = this.path.resolve(process.cwd(), this.dataFile),
_0x78ed39 = this.fs.existsSync(_0x69929),
_0x5eda83 = !_0x78ed39 && this.fs.existsSync(_0x59abfa),
_0x387d54 = JSON.stringify(this.data);
_0x78ed39 ? this.fs.writeFileSync(_0x69929, _0x387d54) : _0x5eda83 ? this.fs.writeFileSync(_0x59abfa, _0x387d54) : this.fs.writeFileSync(_0x69929, _0x387d54);
}
}
["lodash_get"](_0x57987d, _0x5c0a6b, _0x43a4ef) {
const _0x21d801 = _0x5c0a6b.replace(/\[(\d+)\]/g, ".$1").split(".");
let _0x3f156f = _0x57987d;
for (const _0x216dd4 of _0x21d801) if (_0x3f156f = Object(_0x3f156f)[_0x216dd4], void 0 === _0x3f156f) return _0x43a4ef;
return _0x3f156f;
}
["lodash_set"](_0x1a7527, _0x3edc87, _0x3723f8) {
return Object(_0x1a7527) !== _0x1a7527 ? _0x1a7527 : (Array.isArray(_0x3edc87) || (_0x3edc87 = _0x3edc87.toString().match(/[^.[\]]+/g) || []), _0x3edc87.slice(0, -1).reduce((_0x2076aa, _0x11ae68, _0x734af1) => Object(_0x2076aa[_0x11ae68]) === _0x2076aa[_0x11ae68] ? _0x2076aa[_0x11ae68] : _0x2076aa[_0x11ae68] = Math.abs(_0x3edc87[_0x734af1 + 1]) >> 0 == +_0x3edc87[_0x734af1 + 1] ? [] : {}, _0x1a7527)[_0x3edc87[_0x3edc87.length - 1]] = _0x3723f8, _0x1a7527);
}
["getdata"](_0x267feb) {
let _0x17f1ea = this.getval(_0x267feb);
if (/^@/.test(_0x267feb)) {
const [, _0x21a238, _0x3d0fd8] = /^@(.*?)\.(.*?)$/.exec(_0x267feb),
_0x1dd852 = _0x21a238 ? this.getval(_0x21a238) : "";
if (_0x1dd852) try {
const _0x11766e = JSON.parse(_0x1dd852);
_0x17f1ea = _0x11766e ? this.lodash_get(_0x11766e, _0x3d0fd8, "") : _0x17f1ea;
} catch (_0x35ec82) {
_0x17f1ea = "";
}
}
return _0x17f1ea;
}
["setdata"](_0x38ce29, _0x59b948) {
let _0x3ae2b6 = false;
if (/^@/.test(_0x59b948)) {
const [, _0x2f504e, _0x26f2c8] = /^@(.*?)\.(.*?)$/.exec(_0x59b948),
_0x38f837 = this.getval(_0x2f504e),
_0x555d73 = _0x2f504e ? "null" === _0x38f837 ? null : _0x38f837 || "{}" : "{}";
try {
const _0x1f3dd6 = JSON.parse(_0x555d73);
this.lodash_set(_0x1f3dd6, _0x26f2c8, _0x38ce29);
_0x3ae2b6 = this.setval(JSON.stringify(_0x1f3dd6), _0x2f504e);
} catch (_0x595836) {
const _0x2c9487 = {};
this.lodash_set(_0x2c9487, _0x26f2c8, _0x38ce29);
_0x3ae2b6 = this.setval(JSON.stringify(_0x2c9487), _0x2f504e);
}
} else _0x3ae2b6 = this.setval(_0x38ce29, _0x59b948);
return _0x3ae2b6;
}
["getval"](_0x2bd501) {
return this.isSurge() || this.isLoon() ? $persistentStore.read(_0x2bd501) : this.isQuanX() ? $prefs.valueForKey(_0x2bd501) : this.isNode() ? (this.data = this.loaddata(), this.data[_0x2bd501]) : this.data && this.data[_0x2bd501] || null;
}
["setval"](_0x37dd3f, _0x20d779) {
return this.isSurge() || this.isLoon() ? $persistentStore.write(_0x37dd3f, _0x20d779) : this.isQuanX() ? $prefs.setValueForKey(_0x37dd3f, _0x20d779) : this.isNode() ? (this.data = this.loaddata(), this.data[_0x20d779] = _0x37dd3f, this.writedata(), !0) : this.data && this.data[_0x20d779] || null;
}
["initGotEnv"](_0x3a44a5) {
this.got = this.got ? this.got : require("got");
this.cktough = this.cktough ? this.cktough : require("tough-cookie");
this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar();
_0x3a44a5 && (_0x3a44a5.headers = _0x3a44a5.headers ? _0x3a44a5.headers : {}, void 0 === _0x3a44a5.headers.Cookie && void 0 === _0x3a44a5.cookieJar && (_0x3a44a5.cookieJar = this.ckjar));
}
["get"](_0xa2470, _0x1acb6d = () => {}) {
_0xa2470.headers && (delete _0xa2470.headers["Content-Type"], delete _0xa2470.headers["Content-Length"]);
this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (_0xa2470.headers = _0xa2470.headers || {}, Object.assign(_0xa2470.headers, {
"X-Surge-Skip-Scripting": !1
})), $httpClient.get(_0xa2470, (_0x6376de, _0x3f6fca, _0x194990) => {
!_0x6376de && _0x3f6fca && (_0x3f6fca.body = _0x194990, _0x3f6fca.statusCode = _0x3f6fca.status);
_0x1acb6d(_0x6376de, _0x3f6fca, _0x194990);
})) : this.isQuanX() ? (this.isNeedRewrite && (_0xa2470.opts = _0xa2470.opts || {}, Object.assign(_0xa2470.opts, {
"hints": !1
})), $task.fetch(_0xa2470).then(_0x4f87e1 => {
const {
statusCode: _0x470202,
statusCode: _0x80c4a8,
headers: _0x5aed49,
body: _0x8fba9
} = _0x4f87e1;
_0x1acb6d(null, {
"status": _0x470202,
"statusCode": _0x80c4a8,
"headers": _0x5aed49,
"body": _0x8fba9
}, _0x8fba9);
}, _0x16c9fc => _0x1acb6d(_0x16c9fc))) : this.isNode() && (this.initGotEnv(_0xa2470), this.got(_0xa2470).on("redirect", (_0x294f4b, _0x543360) => {
try {
if (_0x294f4b.headers["set-cookie"]) {
const _0x4bf383 = _0x294f4b.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();
_0x4bf383 && this.ckjar.setCookieSync(_0x4bf383, null);
_0x543360.cookieJar = this.ckjar;
}
} catch (_0x4080b1) {
this.logErr(_0x4080b1);
}
}).then(_0x1a07ae => {
const {
statusCode: _0x39dbba,
statusCode: _0xf03482,
headers: _0x4125bf,
body: _0x1e63ff
} = _0x1a07ae;
_0x1acb6d(null, {
"status": _0x39dbba,
"statusCode": _0xf03482,
"headers": _0x4125bf,
"body": _0x1e63ff
}, _0x1e63ff);
}, _0x301d6b => {
const {
message: _0x3ddb03,
response: _0x36ff3a
} = _0x301d6b;
_0x1acb6d(_0x3ddb03, _0x36ff3a, _0x36ff3a && _0x36ff3a.body);
}));
}
["post"](_0x14fe20, _0x15d495 = () => {}) {
if (_0x14fe20.body && _0x14fe20.headers && !_0x14fe20.headers["Content-Type"] && (_0x14fe20.headers["Content-Type"] = "application/x-www-form-urlencoded"), _0x14fe20.headers && delete _0x14fe20.headers["Content-Length"], this.isSurge() || this.isLoon()) this.isSurge() && this.isNeedRewrite && (_0x14fe20.headers = _0x14fe20.headers || {}, Object.assign(_0x14fe20.headers, {
"X-Surge-Skip-Scripting": !1
})), $httpClient.post(_0x14fe20, (_0x5282aa, _0x4decf2, _0x189fd4) => {
!_0x5282aa && _0x4decf2 && (_0x4decf2.body = _0x189fd4, _0x4decf2.statusCode = _0x4decf2.status);
_0x15d495(_0x5282aa, _0x4decf2, _0x189fd4);
});else {
if (this.isQuanX()) _0x14fe20.method = "POST", this.isNeedRewrite && (_0x14fe20.opts = _0x14fe20.opts || {}, Object.assign(_0x14fe20.opts, {
"hints": !1
})), $task.fetch(_0x14fe20).then(_0x329a5f => {
const {
statusCode: _0x7bdac8,
statusCode: _0x5ce9b8,
headers: _0x112c57,
body: _0x3cb4c4
} = _0x329a5f;
_0x15d495(null, {
"status": _0x7bdac8,
"statusCode": _0x5ce9b8,
"headers": _0x112c57,
"body": _0x3cb4c4
}, _0x3cb4c4);
}, _0x133692 => _0x15d495(_0x133692));else {
if (this.isNode()) {
this.initGotEnv(_0x14fe20);
const {
url: _0x20c43f,
..._0x2465db
} = _0x14fe20;
this.got.post(_0x20c43f, _0x2465db).then(_0x41b9e6 => {
const {
statusCode: _0x5e807f,
statusCode: _0x4cde24,
headers: _0x3e1f3d,
body: _0x4a0249
} = _0x41b9e6;
_0x15d495(null, {
"status": _0x5e807f,
"statusCode": _0x4cde24,
"headers": _0x3e1f3d,
"body": _0x4a0249
}, _0x4a0249);
}, _0x43970f => {
const {
message: _0x4fb7ef,
response: _0x1cfbeb
} = _0x43970f;
_0x15d495(_0x4fb7ef, _0x1cfbeb, _0x1cfbeb && _0x1cfbeb.body);
});
}
}
}
}
["time"](_0x4b1e33, _0x33bace = null) {
const _0x46ced7 = _0x33bace ? new Date(_0x33bace) : new Date();
let _0x3fb527 = {
"M+": _0x46ced7.getMonth() + 1,
"d+": _0x46ced7.getDate(),
"H+": _0x46ced7.getHours(),
"m+": _0x46ced7.getMinutes(),
"s+": _0x46ced7.getSeconds(),
"q+": Math.floor((_0x46ced7.getMonth() + 3) / 3),
"S": _0x46ced7.getMilliseconds()
};
/(y+)/.test(_0x4b1e33) && (_0x4b1e33 = _0x4b1e33.replace(RegExp.$1, (_0x46ced7.getFullYear() + "").substr(4 - RegExp.$1.length)));
for (let _0x447f50 in _0x3fb527) new RegExp("(" + _0x447f50 + ")").test(_0x4b1e33) && (_0x4b1e33 = _0x4b1e33.replace(RegExp.$1, 1 == RegExp.$1.length ? _0x3fb527[_0x447f50] : ("00" + _0x3fb527[_0x447f50]).substr(("" + _0x3fb527[_0x447f50]).length)));
return _0x4b1e33;
}
["msg"](_0x516bbe = _0x4ad131, _0x3dbecd = "", _0x1ef3f3 = "", _0x43ca5d) {
const _0x1508d0 = _0x427309 => {
if (!_0x427309) return _0x427309;
if ("string" == typeof _0x427309) return this.isLoon() ? _0x427309 : this.isQuanX() ? {
"open-url": _0x427309
} : this.isSurge() ? {
"url": _0x427309
} : void 0;
if ("object" == typeof _0x427309) {
if (this.isLoon()) {
let _0x4eb487 = _0x427309.openUrl || _0x427309.url || _0x427309["open-url"],
_0x4ef6c3 = _0x427309.mediaUrl || _0x427309["media-url"];
return {
"openUrl": _0x4eb487,
"mediaUrl": _0x4ef6c3
};
}
if (this.isQuanX()) {
let _0x4a421e = _0x427309["open-url"] || _0x427309.url || _0x427309.openUrl,
_0x281530 = _0x427309["media-url"] || _0x427309.mediaUrl;
return {
"open-url": _0x4a421e,
"media-url": _0x281530
};
}
if (this.isSurge()) {
let _0x422b83 = _0x427309.url || _0x427309.openUrl || _0x427309["open-url"];
return {
"url": _0x422b83
};
}
}
};
if (this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(_0x516bbe, _0x3dbecd, _0x1ef3f3, _0x1508d0(_0x43ca5d)) : this.isQuanX() && $notify(_0x516bbe, _0x3dbecd, _0x1ef3f3, _0x1508d0(_0x43ca5d))), !this.isMuteLog) {
let _0x1a1a17 = ["", "==============📣系统通知📣=============="];
_0x1a1a17.push(_0x516bbe);
_0x3dbecd && _0x1a1a17.push(_0x3dbecd);
_0x1ef3f3 && _0x1a1a17.push(_0x1ef3f3);
console.log(_0x1a1a17.join("\n"));
this.logs = this.logs.concat(_0x1a1a17);
}
}
["log"](..._0x334f37) {
_0x334f37.length > 0 && (this.logs = [...this.logs, ..._0x334f37]);
console.log(_0x334f37.join(this.logSeparator));
}
["logErr"](_0x1aa1a7, _0x5406d0) {
const _0x495930 = !this.isSurge() && !this.isQuanX() && !this.isLoon();
_0x495930 ? this.log("", "📣" + this.name + ", 错误!", _0x1aa1a7.stack) : this.log("", "📣" + this.name + ", 错误!", _0x1aa1a7);
}
["wait"](_0x4e1463) {
return new Promise(_0x67aa53 => setTimeout(_0x67aa53, _0x4e1463));
}
["done"](_0x310ad9 = {}) {
const _0x2df5a2 = new Date().getTime(),
_0x2097c5 = (_0x2df5a2 - this.startTime) / 1000;
this.log("", "📣" + this.name + ", 结束! 📣 " + _0x2097c5 + " 秒");
this.log();
(this.isSurge() || this.isQuanX() || this.isLoon()) && $done(_0x310ad9);
}
}(_0x4ad131, _0x221774);
}

View File

@@ -0,0 +1,190 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%91%B7%E5%B0%94%E5%8D%9A%E5%A3%AB.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%91%B7%E5%B0%94%E5%8D%9A%E5%A3%AB.js
// # Repo: jdqlscript/toulu
// # Path: 瑷尔博士.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 9b3eaec2c57164c1a96cf2e236c97997baa69d1e45e02503fbbcab3f73736fe3
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.11 12:44
@Description: 瑷尔博士官方云商城小程序
------------------------------------------
变量名airboshi
变量值 https://xapi.weimob.com/api3/ 域名下的Headers请求头的X-WX-Token 多账号&或换行或新增同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("瑷尔博士官方云商城");
let ckName = `airboshi`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user
$.ckStatus = true;
await signIn()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function signIn() {
const config = {
method: 'post',
url: 'https://xapi.weimob.com/api3/onecrm/mactivity/sign/misc/sign/activity/c/signMainInfo',
headers: {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Content-Type": "application/json",
"Host": "xapi.weimob.com",
"Referer": "https://servicewechat.com/wx0399cf391f15b422/46/page-frame.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "cross-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; 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(0x6309092b) XWEB/8555",
"X-WX-Token": $.token,
"xweb_xhr": "1"
},
data: JSON.stringify({
"appid": "wx0399cf391f15b422",
"basicInfo": {
"vid": 6015569623153,
"vidType": 2,
"bosId": 4021407433153,
"productId": 146,
"productInstanceId": 6351100153,
"productVersionId": "14026",
"merchantId": 2000150059153,
"tcode": "weimob",
"cid": 376411153
},
"extendInfo": {
"wxTemplateId": 7579,
"analysis": [],
"bosTemplateId": 1000001485,
"childTemplateIds": [
{
"customId": 90004,
"version": "crm@0.1.17"
},
{
"customId": 90002,
"version": "ec@43.9"
},
{
"customId": 90006,
"version": "hudong@0.0.205"
},
{
"customId": 90008,
"version": "cms@0.0.429"
}
],
"quickdeliver": {
"enable": false
},
"youshu": {
"enable": false
},
"source": 1,
"channelsource": 5,
"refer": "onecrm-signgift",
//"mpScene": 1256
},
"queryParameter": null,
"i18n": {
"language": "zh",
"timezone": "8"
},
"pid": "",
"storeId": "",
"customInfo": {
"source": 0,
//"wid": 11167663828
}
})
};
let { data: result } = await Request(config)
if (result?.errcode == "0") {
$.log(`签到成功`);
} else {
$.log(`签到失败`)
$.log(JSON.stringify(result))
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,260 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/yht.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/yht.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/yht.js
// # UploadedAt: 2026-04-12T06:41:36Z
// # SHA256: 3f2d67f0b71391331c9cc40ea43a3b49855e4fbefc611dd27988f1974cb41533
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
@cron: 30 8 * * *
------------------------------------------
益禾堂 qm-user-token
------------------------------------------
*/
window = {}
const {
Env
} = require("../tools/env")
const $ = new Env("益禾堂");
let ckName = `yht`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
this.activityUrl = ''
}
async run() {
await this.getLoginUrl()
await this.getActivityToken()
let key = await this.getActivityKey()
await this.doSign(key)
}
async getLoginUrl() {
let options = {
method: 'POST',
url: `https://webapi.qmai.cn/web/catering/crm/member/redirect`,
headers: {
'User-Agent': '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 WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027',
'Accept': 'v=1.0',
'Content-Type': 'application/json',
'xweb_xhr': '1',
'gdt-vid': '',
'work-staff-name': '',
'channelcode': '',
'work-wechat-userid': '',
'qz-gtd': '',
'qm-from-type': 'catering',
'accept-language': 'zh-CN',
'scene': '1101',
'qm-from': 'wechat',
'qm-user-token': '' + this.token,
'work-staff-id': '',
'multi-store-id': '',
'store-id': '203009',
'promotion-code': '',
'sec-fetch-site': 'cross-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://servicewechat.com/wx4080846d0cec2fd5/517/page-frame.html',
'priority': 'u=1, i'
},
data: {
"redirectUrl": "https://86019.activity-12.m.duiba.com.cn/chw/visual-editor/skins?id=203576",
"appid": "wx4080846d0cec2fd5"
}
}
let {
data: result
} = await axios.request(options);
if (result.data && result.status) {
this.activityUrl = result.data
return result.data
}
}
ObjectKeys2LowerCase(e) { return e = Object.fromEntries(Object.entries(e).map((([e, t]) => [e.toLowerCase(), t]))), new Proxy(e, { get: function (e, t, r) { return Reflect.get(e, t.toLowerCase(), r) }, set: function (e, t, r, n) { return Reflect.set(e, t.toLowerCase(), r, n) } }) }
async getActivityToken() {
const opts = {
method: "GET",
url: this.activityUrl,
maxRedirects: 0,
// 关键点 2: 默认 Axios 认为非 2xx 是错误,需定义 302 为合法状态
validateStatus: function (status) {
return status >= 200 && status < 400; // 允许 302 (或 3xx) 进入 .then
},
headers: {}
}
let res = await axios.request(opts);
let headers = this.ObjectKeys2LowerCase(res?.headers);
//对青龙进行兼容
let session = Array.isArray(headers['set-cookie']) ? [...new Set(headers['set-cookie'])].join("") : headers['set-cookie'];
let [wdata4, w_ts, _ac, wdata3, dcustom] = session.match(/(wdata4|w_ts|_ac|wdata3|dcustom)=.+?;/g)
this.session = wdata4 + w_ts + _ac + wdata3 + dcustom;
$.log(`✅ 获取活动token成功`)
}
async getActivityKey() {
let options = {
method: 'POST',
url: `https://86019-activity.dexfu.cn/chw/ctoken/getToken`,
headers: {
'Content-type': 'application/x-www-form-urlencoded',
'Cookie': this.session,
},
data: {
timestamp: Date.now(),
}
}
let {
data: result
} = await axios.request(options);
if (result.success) {
// 自动修复:将旧式八进制 (如 0123) 替换为现代写法 (0o123)
// 匹配以 0 开头后面跟数字,且不含 x (十六进制) 或 b (二进制) 的部分
const fixedCode = result.token.replace(/\b0([0-7]+)\b/g, '0o$1');
eval(fixedCode)
return window['620fa72t']
}
}
async doSign(key) {
let data = ({
'signOperatingId': '326649747164581',
'token': '' + key
});
let options = {
method: 'POST',
url: 'https://86019-activity.dexfu.cn/sign/component/doSign?_=' + Date.now(),
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/x-www-form-urlencoded',
'origin': 'https://86019-activity.dexfu.cn',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://86019-activity.dexfu.cn/sign/component/page?signOperatingId=326649747164581',
'accept-language': 'zh-CN,zh;q=0.9',
'Cookie': this.session
},
data: data
};
let {
data: result
} = await axios.request(options);
console.log(result);
/*if (result.success) {
$.log(`✅ 签到成功!获得${result.data.signResult}积分`)
}*/
}
/**
* 通用 eval 混淆解密函数(动态执行劫持)
* @param {string} obfuscatedCode - 原始的混淆代码
* @returns {string} - 解密后的真实代码
*/
decryptByHookingEval(obfuscatedCode) {
let decryptedCode = "";
// 1. 备份系统原生的 eval
const originalEval = globalThis.eval;
try {
// 2. 劫持全局 eval 函数
globalThis.eval = function (payload) {
decryptedCode = payload; // 将解密后的字符串保存下来
// 重要:不往下执行原生的 eval从而阻止危险/恶意代码实际运行
};
// 3. 构造一个沙箱函数并执行混淆代码的外壳
// 外壳代码会执行所有的解密运算,并最终调用我们上面劫持的 eval()
const runner = new Function(obfuscatedCode);
runner();
} catch (error) {
console.error("执行解密外壳时发生错误:", error);
} finally {
// 4. 无论成功与否,务必恢复系统的 eval避免影响其他正常业务
globalThis.eval = originalEval;
}
return decryptedCode || "未能拦截到 eval 调用,可能代码结构不适用此方法。";
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
console.log(`1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。`)
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,73 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%9B%96%E7%91%9E%E7%89%B9%E5%90%8E%E5%B8%82%E5%9C%BA.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%9B%96%E7%91%9E%E7%89%B9%E5%90%8E%E5%B8%82%E5%9C%BA.js
// # Repo: jdqlscript/toulu
// # Path: 盖瑞特后市场.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: b29d74fc9baa9f2cf96e1e36d8598ed28ed667c0e4c79df9b03750e2ac8bf8d4
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
盖瑞特后市场
入口http://weixin.qq.com/q/02TSy-4ATzbKe1CDzRND1D
变量名:grtck
依赖require
*/
const axios = require('axios');
async function main() {
try {
const externalUrl = 'https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt';
const externalResponse = await axios.get(externalUrl);
console.log('公告:', externalResponse.data);
if (externalResponse.status === 200) {
console.log('公告获取成功,开始执行签到请求...');
const cookies = process.env.grtck.split(',');
const url = 'https://app.ma.scrmtech.com/svip/index/SignSet';
const headers = {
'Host': 'app.ma.scrmtech.com',
'sec-ch-ua-platform': '"Android"',
'x-requested-with': 'XMLHttpRequest',
'user-agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.103 Mobile Safari/537.36 XWEB/1300333 MMWEBSDK/20240801 MMWEBID/3628 MicroMessenger/8.0.51.2720(0x28003339) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64',
'accept': 'application/json, text/javascript, /; q=0.01',
'sec-ch-ua': '"Chromium";v="130", "Android WebView";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?1',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://app.ma.scrmtech.com/svip/index/sign?pf_uid=26989_2051&pf_type=3&code=051soVll2z7FUe4Qaqnl2067es2soVlE&state=&appid=wx3b54c4b113f78be5',
'accept-encoding': 'gzip, deflate, br, zstd',
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'cookie': cookies.join('; '),
};
const signInResponse = await axios.get(url, { headers });
const { data } = signInResponse;
if (data.code === 30005) {
console.log('签到成功');
} else if (data.code === 0) {
console.log('今日已签到,每天再试试吧');
}
} else {
console.log('公告获取失败HTTP 状态码:', externalResponse.status);
}
} catch (error) {
console.error('发生错误:', error.message);
}
}
main();
/*
TL库
*/

View File

@@ -0,0 +1,519 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/ruilanCar.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/ruilanCar.js
// # Repo: smallfawn/QLScriptPublic
// # Path: ruilanCar.js
// # UploadedAt: 2026-04-01T11:27:33Z
// # SHA256: bbf9ecc479b7d6bed5fad99dc690124ce32bc3f64bd0313f229eb71cbc94bd2c
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/**
* cron 32 17 * * *
* Show:睿蓝汽车APP 或者小程序 一天7分左右 积分换实物
* 变量名:ruilanCar
* 变量值:https://api-gateway.livanauto.com/app/ Headers中的aid的值 # rid的值 #连接 多账户 & 或创建同名变量
* scriptVersionNow = "0.0.1";
*/
const $ = new Env("睿蓝汽车");
const notify = $.isNode() ? require('./sendNotify') : '';
let ckName = "ruilanCar";
let envSplitor = ["&", "\n"]; //多账号分隔符
let strSplitor = "#"; //多变量分隔符
let userIdx = 0;
let userList = [];
class Task {
constructor(str) {
this.index = ++userIdx;
this.aid = str.split(strSplitor)[0];
this.rid = str.split(strSplitor)[1];
this.ckStatus = true;
this.contentList = []
this.essayList = []
}
async main() {
await this.user_info()
if (this.ckStatus == true) {
await this.content_list();
//console.log(this.contentList)
if (this.contentList.length > 0) {
for (let i = 0; i < 5; i++) {
await this.task_like(this.contentList[0].id)
}
}
await this.essay_list()
if (this.essayList.length > 0) {
for (let i = 0; i < 5; i++) {
await this.task_share(this.essayList[i].id)
}
}
}
}
async taskRequest(method, url, body = "") {
//
let headers = {
"user-agent": "Dart/2.19 (dart:io)",
"x-app-id": "fVbEaznM",
"service-version": "2.16.5",
"accept-encoding": "gzip",
"aid": this.aid,
"content-type": "application/json",
"signinsource": "client_ios",
"version": "",
//"content-length": "33",
"rid": this.rid,
"host": "api-gateway.livanauto.com",
"x-timestamp": Date.now(),
"x-sequence-no": "q193JPARcnfIVizYzt3IZ"
}
const reqeuestOptions = {
url: url,
method: method,
headers: headers
}
if (method !== "get") {
if (headers["Content-Type"] == "application/json") {
reqeuestOptions["body"] = JSON.stringify(body);
} else {
reqeuestOptions["body"] = body
}
}
let { body: result } = await $.httpRequest(reqeuestOptions)
return result
}
async essay_list() {
let result = await this.taskRequest("get", `https://api-gateway.livanauto.com/app/v1.0/appapi/content/subject/appSubject?current=1&subjectId=36&essayCurrent=1&pageSize=20`)
if (result.code == 0) {
for (let art of result.data.records[0].essay) {
this.essayList.push({ id: art.essayId, text: art.title })
}
}
}
async content_list() {
let result = await this.taskRequest("get", `https://api-gateway.livanauto.com/app/v1.0/appapi/content/content/pageBetter?current=1&size=10&createBy&timestamp=${Date.now()}`)
if (result.code == 0) {
for (let art of result.data.records) {
if (art.thumb == false) {
this.contentList.push({ id: art.contentId, text: art.contentDesc })
}
}
}
}
async user_info() {
let result = await this.taskRequest("get", `https://api-gateway.livanauto.com/app/v1.0/appapi/common/user/getUserToFml`)
if (result.code == 0) {
$.log(`[${result.data.nickName}]积分[${result.data.integralCount}]`)
this.ckStatus = true
} else {
this.ckStatus = false
$.log(result)
}
}
async task_share(id) {
let result = await this.taskRequest(`post`, `https://api-gateway.livanauto.com/app/v1.0/appapi/content/essayshare/add`, { "essayId": id })
result.code == 0 ? (result.data.result == true ? $.log(`分享成功`) : $.log(`分享失败`)) : $.log(`分享失败`)
}
async task_like(id) {
let result = await this.taskRequest(`post`, `https://api-gateway.livanauto.com/app/v1.0/appapi/content/contentthumbs/thumb`, { "contentId": id })
result.code == 0 ? (result.data.result == true ? $.log(`点赞成功`) : $.log(`点赞失败`)) : $.log(`点赞失败`)
}
}
async function start() {
let taskall = [];
for (let user of userList) {
if (user.ckStatus) {
taskall.push(await user.main());
}
}
await Promise.all(taskall);
}
!(async () => {
if (!(await checkEnv())) return;
if (userList.length > 0) {
await start();
}
await $.sendMsg($.logs.join("\n"))
})()
.catch((e) => console.log(e))
.finally(() => $.done());
//********************************************************
/**
* 变量检查与处理
* @returns
*/
async function checkEnv() {
let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || "";
if (userCookie) {
let e = envSplitor[0];
for (let o of envSplitor)
if (userCookie.indexOf(o) > -1) {
e = o;
break;
}
for (let n of userCookie.split(e)) n && userList.push(new Task(n));
} else {
console.log("未找到CK");
return;
}
return console.log(`共找到${userList.length}个账号`), true; //true == !0
}
function Env(t, s) {
return new (class {
constructor(t, s) {
this.name = t;
this.data = null;
this.dataFile = "box.dat";
this.logs = [];
this.logSeparator = "\n";
this.startTime = new Date().getTime();
Object.assign(this, s);
this.log("", `\ud83d\udd14${this.name}, \u5f00\u59cb!`);
}
isNode() {
return "undefined" != typeof module && !!module.exports;
}
isQuanX() {
return "undefined" != typeof $task;
}
isSurge() {
return "undefined" != typeof $httpClient && "undefined" == typeof $loon;
}
isLoon() {
return "undefined" != typeof $loon;
}
loaddata() {
if (!this.isNode()) return {};
{
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
s = this.path.resolve(process.cwd(), this.dataFile),
e = this.fs.existsSync(t),
i = !e && this.fs.existsSync(s);
if (!e && !i) return {};
{
const i = e ? t : s;
try {
return JSON.parse(this.fs.readFileSync(i));
} catch (t) {
return {};
}
}
}
}
writedata() {
if (this.isNode()) {
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
s = this.path.resolve(process.cwd(), this.dataFile),
e = this.fs.existsSync(t),
i = !e && this.fs.existsSync(s),
o = JSON.stringify(this.data);
e ? this.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o);
}
}
lodash_get(t, s, e) {
const i = s.replace(/\[(\d+)\]/g, ".$1").split(".");
let o = t;
for (const t of i) if (((o = Object(o)[t]), void 0 === o)) return e;
return o;
}
lodash_set(t, s, e) {
return Object(t) !== t
? t
: (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []),
(s
.slice(0, -1)
.reduce(
(t, e, i) =>
Object(t[e]) === t[e]
? t[e]
: (t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {}),
t
)[s[s.length - 1]] = e),
t);
}
getdata(t) {
let s = this.getval(t);
if (/^@/.test(t)) {
const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t),
o = e ? this.getval(e) : "";
if (o)
try {
const t = JSON.parse(o);
s = t ? this.lodash_get(t, i, "") : s;
} catch (t) {
s = "";
}
}
return s;
}
setdata(t, s) {
let e = !1;
if (/^@/.test(s)) {
const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s),
h = this.getval(i),
a = i ? ("null" === h ? null : h || "{}") : "{}";
try {
const s = JSON.parse(a);
this.lodash_set(s, o, t), (e = this.setval(JSON.stringify(s), i));
} catch (s) {
const h = {};
this.lodash_set(h, o, t), (e = this.setval(JSON.stringify(h), i));
}
} else e = this.setval(t, s);
return e;
}
getval(t) {
if (this.isSurge() || this.isLoon()) {
return $persistentStore.read(t);
} else if (this.isQuanX()) {
return $prefs.valueForKey(t);
} else if (this.isNode()) {
this.data = this.loaddata();
return this.data[t];
} else {
return this.data && this.data[t] || null;
}
}
setval(t, s) {
if (this.isSurge() || this.isLoon()) {
return $persistentStore.write(t, s);
} else if (this.isQuanX()) {
return $prefs.setValueForKey(t, s);
} else if (this.isNode()) {
this.data = this.loaddata();
this.data[s] = t;
this.writedata();
return true;
} else {
return this.data && this.data[s] || null;
}
}
initGotEnv(t) {
this.got = this.got ? this.got : require("got");
this.cktough = this.cktough ? this.cktough : require("tough-cookie");
this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar();
if (t) {
t.headers = t.headers ? t.headers : {};
if (typeof t.headers.Cookie === "undefined" && typeof t.cookieJar === "undefined") {
t.cookieJar = this.ckjar;
}
}
}
/**
* @param {Object} options
* @returns {String} 将 Object 对象 转换成 queryStr: key=val&name=senku
*/
queryStr(options) {
return Object.entries(options)
.map(([key, value]) => `${key}=${typeof value === 'object' ? JSON.stringify(value) : value}`)
.join('&');
}
//从url获取参数组成json
getURLParams(url) {
const params = {};
const queryString = url.split('?')[1];
if (queryString) {
const paramPairs = queryString.split('&');
paramPairs.forEach(pair => {
const [key, value] = pair.split('=');
params[key] = decodeURIComponent(value);
});
}
return params;
}
isJSONString(str) {
try {
var obj = JSON.parse(str);
if (typeof obj == 'object' && obj) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
isJson(obj) {
var isjson = typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;
return isjson;
}
async sendMsg(message) {
if (!message) return;
if ($.isNode()) {
await notify.sendNotify($.name, message)
} else {
$.msg($.name, '', message)
}
}
async httpRequest(options) {
let t = {
...options
};
if (!t.headers) {
t.headers = {}
}
if (t.params) {
t.url += '?' + this.queryStr(t.params);
}
t.method = t.method.toLowerCase();
if (t.method === 'get') {
delete t.headers['Content-Type'];
delete t.headers['Content-Length'];
delete t.headers['content-type'];
delete t.headers['content-length'];
delete t["body"]
}
if (t.method === 'post') {
let ContentType;
if (!t.body) {
t.body = ""
} else {
if (typeof t.body == "string") {
if (this.isJSONString(t.body)) {
ContentType = 'application/json'
} else {
ContentType = 'application/x-www-form-urlencoded'
}
} else if (this.isJson(t.body)) {
t.body = JSON.stringify(t.body);
ContentType = 'application/json';
}
}
if (!t.headers['Content-Type'] || !t.headers['content-type']) {
t.headers['Content-Type'] = ContentType;
}
delete t.headers['Content-Length'];
}
if (this.isNode()) {
this.initGotEnv(t);
let httpResult = await this.got(t);
if (this.isJSONString(httpResult.body)) {
httpResult.body = JSON.parse(httpResult.body)
}
return httpResult;
}
if (this.isQuanX()) {
t.method = t.method.toUpperCase()
return new Promise((resolve, reject) => {
$task.fetch(t).then(response => {
if (this.isJSONString(response.body)) {
response.body = JSON.parse(response.body)
}
resolve(response)
})
})
}
}
randomNumber(length) {
const characters = '0123456789';
return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}
randomString(length) {
const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}
timeStamp() {
return new Date().getTime()
}
uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
time(t) {
let s = {
"M+": new Date().getMonth() + 1,
"d+": new Date().getDate(),
"H+": new Date().getHours(),
"m+": new Date().getMinutes(),
"s+": new Date().getSeconds(),
"q+": Math.floor((new Date().getMonth() + 3) / 3),
S: new Date().getMilliseconds(),
};
/(y+)/.test(t) &&
(t = t.replace(
RegExp.$1,
(new Date().getFullYear() + "").substr(4 - RegExp.$1.length)
));
for (let e in s)
new RegExp("(" + e + ")").test(t) &&
(t = t.replace(
RegExp.$1,
1 == RegExp.$1.length
? s[e]
: ("00" + s[e]).substr(("" + s[e]).length)
));
return t;
}
msg(s = t, e = "", i = "", o) {
const h = (t) =>
!t || (!this.isLoon() && this.isSurge())
? t
: "string" == typeof t
? this.isLoon()
? t
: this.isQuanX()
? { "open-url": t }
: void 0
: "object" == typeof t && (t["open-url"] || t["media-url"])
? this.isLoon()
? t["open-url"]
: this.isQuanX()
? t
: void 0
: void 0;
this.isMute ||
(this.isSurge() || this.isLoon()
? $notification.post(s, e, i, h(o))
: this.isQuanX() && $notify(s, e, i, h(o)));
let logs = ['', '==============📣系统通知📣=============='];
logs.push(t);
e ? logs.push(e) : '';
i ? logs.push(i) : '';
console.log(logs.join('\n'));
this.logs = this.logs.concat(logs);
}
log(...t) {
t.length > 0 && (this.logs = [...this.logs, ...t]),
console.log(t.join(this.logSeparator));
}
logErr(t, s) {
const e = !this.isSurge() && !this.isQuanX() && !this.isLoon();
e
? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack)
: this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t);
}
wait(t) {
return new Promise((s) => setTimeout(s, t));
}
done(t = {}) {
const s = new Date().getTime(),
e = (s - this.startTime) / 1e3;
this.log(
"",
`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`
)
this.log()
if (this.isNode()) {
process.exit(1)
}
if (this.isQuanX()) {
$done(t)
}
}
})(t, s);
}

View File

@@ -0,0 +1,160 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/llj.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/llj.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/llj.js
// # UploadedAt: 2026-04-08T05:56:39Z
// # SHA256: 268c15238c39ed7f628cf9b6d0df341e4810456fc65acda3d3b372888a4e349e
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 立乐家会员俱乐部
cron: 30 10 * * *
------------------------------------------
#Notice:
变量名 lljtoken 填写的是
域名https://clubwx.hm.liby.com.cn/miniprogram 请求头 unionid # x-wxb9f68ca2da513bb2-token
多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("立乐家会员俱乐部");
let ckName = `lljtoken`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[1];
this.unionid = this.user[0];
}
async run() {
await this.getUserInfo()
await this.signIn()
}
async signIn() {
let options = {
method: 'POST',
url: `https://clubwx.hm.liby.com.cn/miniprogram/benefits/activity/sign/execute.htm?taskId=503`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"appid": "wxb9f68ca2da513bb2",
"content-type": "application/json",
"platformcode": "LiLeJia",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"unionid": "" + this.unionid,
"x-wxb9f68ca2da513bb2-token": "" + this.token,
"xweb_xhr": "1"
},
data: {
}
};
let {
data: result
} = await axios.request(options);
if (result?.code == '200') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `签到成功🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.msg}`)
}
}
async getUserInfo() {
let options = {
url: `https://clubwx.hm.liby.com.cn/b2cMiniApi/me/getUserData.htm`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"appid": "wxb9f68ca2da513bb2",
"content-type": "application/json",
"platformcode": "LiLeJia",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"unionid": "" + this.unionid,
"x-wxb9f68ca2da513bb2-token": "" + this.token,
"xweb_xhr": "1"
}
}
let {
data: result
} = await axios.request(options);
if (result?.code == '200') {
$.log(`🌸账号[${this.index}]` + `[${result.data.nickName}] 积分` + `[${result.data.integral}]🎉`);
} else {
$.log(`🌸账号[${this.index}] 获取用户信息-失败:${result.msg}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,293 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/miqilin.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/miqilin.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/miqilin.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 62de3bdeb38837edfccddb525f451e9f7aa72afb284839413b72a5ada299438c
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
cron: 30 9 * * *
------------------------------------------
#Notice:
米其林会员 每日任务
WeChatCodeServer 填写wx_server_url wx_auth 用于获取code
变量名称miqilin
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("米其林会员小程序");
const WeChatServer = require("./wcs.js");
let ckName = `miqilin`;
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 || 'http://192.168.31.196:12081',
appid: 'wx14413dafd16b9540',
auth: process.env.wx_auth || "your-api-key",
}
);
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = null
this.wcsid = this.user[0]
this.isSign = false
}
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)
}
if (!this.token) {
$.log(`账号[${this.index}] 获取用户Token失败❌`)
return
}
this.token = 'Bearer ' + this.token
await this.getUserInfo()
await this.doPaper()
for (let i = 0; i < 10; i++) {
await this.share();
}
}
async share() {
const options = {
method: 'POST',
url: `https://ulp.michelin.com.cn/op/points/share/have`,
headers: {
"Host": "ulp.michelin.com.cn",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001f37) NetType/WIFI Language/zh_CN",
"Authorization": this.token,
},
data: { "type": "ARTICLE", "code": "COM-MHT-93" }
};
//post方法
let { data: result } = await axios.request(options);
$.log(`转发:${result?.code != 200 ? "转发失败" + result?.message : "转发成功!"}`)
}
async getUserToken(code) {
let options = {
method: 'GET',
url: `https://ulp.michelin.com.cn/bff/wechat/login/${code}`,
headers: {
"Host": "ulp.michelin.com.cn",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001f37) NetType/WIFI Language/zh_CN",
"Referer": "https://servicewechat.com/wx14413dafd16b9540/130/page-frame.html"
}
}
let {
data: result
} = await axios.request(options);
this.token = result?.data?.token?.access_token;
$.log(`🌸账号[${this.index}] 获取用户Token成功:${this.token}`)
}
async getUserInfo() {
try {
let { data: result } = await axios.request({
method: 'GET',
url: `https://ulp.michelin.com.cn/bff/profile`,
headers: {
"Host": "ulp.michelin.com.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249",
"Authorization": this.token,
}
});
if (result?.data?.points) {
$.log(`账号[${this.index}] 获取用户积分成功:${result?.data?.points}`)
} else {
$.log(`账号[${this.index}] 获取用户积分失败❌`)
}
} catch (e) {
this.ckStatus = false;
console.log(`❌查询积分失败!原因为:${e}`);
}
}
async doPaper() {
//获取问卷
await this.getPaper();
//是否已完成问卷
if (this.paperStatus) {
//获取本期问卷题目
await this.getOpenTpaper(this.npsPaperCode);
let index = 1;
for (let question of this.questionList) {
$.log(`问题${index}:${question?.questionChoise?.stemHtml}\n`);
let options = question?.questionChoise.options;
for (let option of options) {
$.log(`- ${option.optionHtml}`);
}
let theQuestion = question.questionChoise.npsQuestionPk;
//查找对应题目答案
let detail = this.stdAnswers.find(answer => theQuestion == answer.npsQuestionChoisePk) || {};
let answer = options.find(o => o.npsQuestionChoiseOptionPk == detail.npsQuestionChoiseOptionPk);
if (!answer) answer = options[0]; // 如果没有找到匹配的答案,默认选择第一个选项
//提交答案
let answerRes = await this.answer(theQuestion, answer?.npsQuestionChoiseOptionPk);
$.log(`\n答案: ${answer.optionHtml} => ${answerRes}`);
}
//提交问卷
await this.paperScore(this.paperCode);
} else {
$.log(`答题任务:本周奖励领取已达到上限,跳过执行`);
}
}
//获取本期答卷
async getPaper() {
const options = {
method: 'POST',
url: `https://ulp.michelin.com.cn/campaign/paper/user`,
headers: {
"Host": "ulp.michelin.com.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249",
"Authorization": this.token,
},
data: {}
};
let { data: result } = await axios.request(options);
if (result?.code == 200) {
$.log(`帐号[${this.index}]本次调查问卷为${result?.data?.npsPaperCode},总共${result?.data?.questionNum}道题目,状态为${result?.data?.status}`);
//如果已经答题,则跳过执行答题任务
if (result?.data?.status == 'DONE') this.paperStatus = false;
//获取本期问卷期数
this.npsPaperCode = result?.data?.npsPaperCode;
//获取本期问卷验证编号
this.paperCode = result?.data?.paperCode;
} else {
this.ckStatus = false;
}
}
//获取问卷题目
async getOpenTpaper(npsPaperCode) {
let options = {
method: 'GET',
url: `https://ulp.michelin.com.cn/npspaper/nps-admin/open/api/cp/public/get_open_tpaper/${npsPaperCode}`,
headers: {
"Host": "ulp.michelin.com.cn",
"User-Agent": "",
"Authorization": this.token,
}
}
//post方法
let result = await axios.request(options);
if (result?.success) {
//答案
this.stdAnswers = result?.data?.stdAnswers;
//题目
this.questionList = result?.data?.questionList;
} else {
$.log(`🔴帐号[${this.index}]获取问卷列表失败!${result?.message}`)
}
}
async answer(question, answer) {
try {
const options = {
url: `https://ulp.michelin.com.cn/campaign/paper/user/answer`,
method: 'POST',
headers: {
"Host": "ulp.michelin.com.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249",
"Authorization": this.token,
},
data: { "answerOptionId": [`${answer}`], "paperCode": `${this.paperCode}`, "questionId": `${question}` }
};
//post方法
let { data: result } = await axios.request(options);
return result?.code == 200 ? "回答成功!" : `回答失败!${result?.message}`
} catch (e) {
console.log(`❌回答问题失败!原因为:${e}`);
}
}
async paperScore(paperCode) {
try {
const options = {
url: `https://ulp.michelin.com.cn/campaign/paper/score/${paperCode}`,
data: {}
};
//post方法
let { data: res } = await axios.request(options);
$.log(`提交问卷:本期问卷正确率为${res?.data?.score}%,排名${res.data.rank}`);
} catch (e) {
console.log(`❌提交问卷失败!原因为:${e}`);
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
if (process.env['wx_server_url'] && process.env['wx_auth']) {
for (let user of $.userList) {
await new Task(user).run();
}
} else {
$.log(`${ckName}未配置微信SERVER配置 搭建可看仓库目录下的readme.md❌`)
return
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,328 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%BB%9F%E4%B8%80.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%BB%9F%E4%B8%80.js
// # Repo: jdqlscript/toulu
// # Path: 统一.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 8487b15326043cec5ab177d6cbc07a7306bca5cb173bc4bde24c9af4b51e1f48
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn 86056
@Date: 2024.06.08 09.46
@Description: 统一抽奖大集结
------------------------------------------
变量名 tongyi
变量值抓https://xapi.weimob.com/api3/ Headers中的x-wx-token的值 多账号&或换行 或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("统一抽奖大集结");
let ckName = `tongyi`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.ckStatus = true;
$.token = user
let activityIds = [{ name: `小明同学`, id: 20001389211 }, { name: `雅马哈`, id: 20001390387 }, { name: `周末`, id: 20001403008 }]
for (let activity of activityIds) {
$.log(`当前玩的是[${activity.name}]`)
for (let i = 0; i < 5; i++) {
await lightCard(activity.id)
$.log(`本次抽奖结束延迟5s`)
await $.wait(5000)
}
$.log(`游戏结束延迟5s`)
await $.wait(5000)
}
await draw()
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function lightCard(activityId) {
let data = JSON.stringify({
"appid": "wx532ecb3bdaaf92f9",
"basicInfo": {
"vid": 6013753979957,
"vidType": 2,
"bosId": 4020112618957,
"productId": 165646,
"productInstanceId": 3169913957,
"productVersionId": "16233",
"merchantId": 2000020692957,
"tcode": "weimob",
"cid": 176205957
},
"extendInfo": {
"wxTemplateId": 7593,
"analysis": [],
"bosTemplateId": 1000001511,
"childTemplateIds": [
{
"customId": 90004,
"version": "crm@0.1.21"
},
{
"customId": 90002,
"version": " ec@46.4"
},
{
"customId": 90006,
"version": "hudong@0.0.208"
},
{
"customId": 90008,
"version": "cms@0.0.439"
},
{
"customId": 90060,
"version": "elearning@0.1.1"
}
],
"quickdeliver": {
"enable": false
},
"youshu": {
"enable": false
},
"source": 1,
"channelsource": 5,
"refer": "hd-card-home",
"mpScene": 1005
},
"queryParameter": null,
"i18n": {
"language": "zh",
"timezone": "8"
},
"pid": "4020112618957",
"storeId": "0",
"activityId": activityId, //////////////////////////////////////////
"source": 1,
"_version": "2.9.2",
"appletVersion": 280,
"_transformBasicInfo": true,
"v": "76e04a82cc9efce6e19336bfddab891410029744",
"operationSource": 4,
"vid": 6013753979957,
"vidType": 2,
"bosId": 4020112618957,
"productId": 165646,
"productInstanceId": 3169913957,
"productVersionId": "16233",
"merchantId": 2000020692957,
"tcode": "weimob",
"cid": 176205957,
"vidTypes": [
2
],
"openid": "oBk224mM4QEh5M3dNtocB9ZU6foQ"
});
let config = {
method: 'POST',
url: 'https://xapi.weimob.com/api3/interactive/qianxi/amasscard/api/lightCard',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'Content-Type': 'application/json',
'charset': 'utf-8',
'x-wx-token': $.token,
'Referer': 'https://servicewechat.com/wx532ecb3bdaaf92f9/195/page-frame.html',
},
data: data
};
let { data: result } = await Request(config);
if (result.errcode == '0') {
$.log(`抽卡成功[${result.data.cardId}]`)
} else {
$.log(`抽卡失败`)
$.log(JSON.stringify(result))
}
}
async function draw() {
let data = JSON.stringify({
"appid": "wx532ecb3bdaaf92f9",
"basicInfo": {
"vid": 6013753979957,
"vidType": 2,
"bosId": 4020112618957,
"productId": 222,
"productInstanceId": 3169919957,
"productVersionId": "12004",
"merchantId": 2000020692957,
"tcode": "weimob",
"cid": 176205957
},
"extendInfo": {
"wxTemplateId": 7593,
"analysis": [],
"bosTemplateId": 1000001511,
"childTemplateIds": [
{
"customId": 90004,
"version": "crm@0.1.21"
},
{
"customId": 90002,
"version": " ec@46.4"
},
{
"customId": 90006,
"version": "hudong@0.0.208"
},
{
"customId": 90008,
"version": "cms@0.0.439"
},
{
"customId": 90060,
"version": "elearning@0.1.1"
}
],
"quickdeliver": {
"enable": false
},
"youshu": {
"enable": false
},
"source": 1,
"channelsource": 5,
"refer": "hd-lego-index",
"mpScene": 1005
},
"queryParameter": null,
"i18n": {
"language": "zh",
"timezone": "8"
},
"pid": "4020112618957",
"storeId": "0",
"_transformBasicInfo": true,
"_requrl": "/orchestration/mobile/activity/draw/play",
"templateId": 767,
"templateKey": "bigwheel",
"activityId": "30000041622",
"bussinessType": 1,
"channel": 1,
"channelType": 1,
"source": 1,
"_version": "2.5.4",
"activityIdentity": "20",
"openId": "oBk224mM4QEh5M3dNtocB9ZU6foQ",
"wid": 11165796601,
"appId": "wx532ecb3bdaaf92f9",
"playSourceCode": "lcode",
"vid": 6013753979957,
"vidType": 2,
"bosId": 4020112618957,
"productId": 222,
"productInstanceId": 3169919957,
"productVersionId": "12004",
"merchantId": 2000020692957,
"tcode": "weimob",
"cid": 176205957,
"vidTypes": [
2
],
"openid": "oBk224mM4QEh5M3dNtocB9ZU6foQ"
});
let config = {
method: 'POST',
url: 'https://xapi.weimob.com/api3/orchestration/mobile/activity/draw/play',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'Content-Type': 'application/json',
'charset': 'utf-8',
'x-wx-token': $.token,
'Referer': 'https://servicewechat.com/wx532ecb3bdaaf92f9/195/page-frame.html',
'Cookie': 'rprm_cuid=7849974103hl3bid9hbo'
},
data: data
};
let { data: result } = await Request(config);
if (result.errcode == '0') {
$.log(`抽奖成功[${result.data.cardId}]`)
} else if (result.errcode == "100200003") {
$.log(`抽奖失败 次数不够`)
} else {
$.log(`抽奖失败`)
$.log(JSON.stringify(result))
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,63 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%BE%8E%E5%AD%9A.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%BE%8E%E5%AD%9A.js
// # Repo: jdqlscript/toulu
// # Path: 美孚.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 8e3199b6fd23f6e2a8da1c908b7c9709f892e2843294db627da3d7a93052497e
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
小程序美孚臻享俱乐部
变量名=mftoken
抓包www.rewards.mobil.com.cn域名的请求头的X-access-token
多账号分割&
也可以使用多个变量名
支持插件提交多变量
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
*/
const axios = require('axios');
const mftoken = process.env.mftoken.split('&');
async function signIn() {
const url = 'https://www.rewards.mobil.com.cn/web/index.php?_mall_id=1&r=api/kc/user/sign-in';
const headers = {
'Host': 'www.rewards.mobil.com.cn',
'Connection': 'keep-alive',
'Content-Length': '0',
'x-form-id-list': '[]',
'charset': 'utf-8',
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.122 Mobile Safari/537.36 XWEB/1260059 MMWEBSDK/20240501 MMWEBID/3628 MicroMessenger/8.0.50.2701(0x28003252) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'x-user-id': '1045255',
'Accept-Encoding': 'gzip,compress,br,deflate',
'x-app-platform': 'wxapp',
'x-requested-with': 'XMLHttpRequest',
'content-type': 'application/x-www-form-urlencoded',
'x-channel': 'WXapp',
'x-app-version': '4.8.9',
'Referer': 'https://servicewechat.com/wx46f9572cac706c22/120/page-frame.html'
};
try {
for (let token of mftoken) {
headers['x-access-token'] = token;
const response = await axios.post(url, {}, { headers: headers });
if (response.data.code === 0 && response.data.data.now_date_is_sign) {
console.log("签到成功,已累计签到{}天,本次获得{}积分。".format(response.data.data.sign_continue_text, response.data.data.sign_once_point));
} else if (response.data.code === 1) {
console.log("签到失败,错误信息:", response.data.msg);
} else {
console.log("响应:", response.data);
}
}
} catch (error) {
console.error(error);
}
}
signIn();

View File

@@ -0,0 +1,875 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%81%94%E9%80%9A%E8%8E%B7%E5%8F%96ck.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%81%94%E9%80%9A%E8%8E%B7%E5%8F%96ck.py
# Repo: jdqlscript/toulu
# Path: 联通获取ck.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: a5eef4860ea719a6aeebe90421bb96740870ac057a7b0e1c5115b52013a5175f
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
#!/usr/bin/python3
# -- coding: utf-8 --
#一键取ck exehttps://www.123pan.com/s/TGXSVv-cap8A.html
# ------------------------------
# cron "3 0 * * *" script-path=xxx.py,tag=匹配cron用
# const $ = new Env('联通和沃畅游密码登录');
# -------------------------------
#有问题联系3288588344
#频道https://pd.qq.com/s/672fku8ge
"""
说明: 自动获取联通token_online、appid、ecs_token和access_token参数
注意若是需要沃畅游的access_token参数在首次使用时联通app首页--5g新通信--联通畅游,点击个人中心,手动登录一遍
青龙环境变量WoChangYouCK_PSW 手机号码&密码 账号和密码分别是联通app的账号和密码
下列变量都可选填,请按照自己的需求自行添加环境变量
联通app参数
变量名IsChinaUnicomParam 格式True或者False 是否生成token_online参数填入环境变量是下面变量起作用的前提默认False不生成填入
变量名ChinaUnicomEnvName 格式填指定生成的环境变量名如chinaUnicomCookie本脚本默认生成chinaUnicomCookie用于生成跑联通脚本运行
变量名ChinaUnicomParam_chatMoreStr 格式:生成的多账号使用的拼接连接符,默认使用&
变量名ChinaUnicomParam_flag 格式是否拼接appid默认False不拼接需要拼接请填入True
变量名ChinaUnicomParam_chatStr 格式appid和token_online之间的拼接符号默认使用#
变量名ChinaUnicomParam_appidIndex 格式1或者2 拼接appid是在token_online前面还是后面1代表前面2代表后面,默认appid在前面
沃畅游参数
变量名IsWoChangYouCK 格式True或者False 是否生成沃畅游的access_token参数填入环境变量默认False不生成填入
wxpusher推送(非必填)
青龙变量WoChangYouCK_WXPUSHER_TOKEN wxpusher推送的token
青龙变量WoChangYouCK_WXPUSHER_TOPIC_ID wxpusher推送的topicId(主题ID非UID)
网址https://wxpusher.zjiecode.com/admin/main/topics/list
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
"""
import requests,re
import json, os, random
import time
from datetime import datetime
from sys import stdout
import base64
response = requests.get("https://github.com/3288588344/toulu/blob/main/tl.txt")
response.encoding = 'utf-8'
txt = response.text
print(txt)
from base64 import b64encode
from uuid import uuid4
from urllib.parse import quote
try:
from Crypto.PublicKey.RSA import importKey, construct
from Crypto.Cipher import PKCS1_v1_5
except:
print("检测到还未安装 pycryptodome 依赖请先在python中安装 pycryptodome 依赖")
print("如果安装依赖pycryptodome出错时请先在linux中安装gcc、python3-dev、libc-dev三个依赖")
exit(0)
WXPUSHER_TOKEN = '' # wxpusher推送的token
WXPUSHER_TOPIC_ID = '' # wxpusher推送的topicId
WXPUSHER_CONTENT_TYPE = 2 # wxpusher推送的样式1表示文字 2表示html(只发送body标签内部的数据即可不包括body标签)默认为2
# wxpusher消息推送
def wxpusher(title: str, content: str) -> None:
"""
使用微信的wxpusher推送
"""
if not WXPUSHER_TOKEN or not WXPUSHER_TOPIC_ID:
print("wxpusher 服务的 token 或者 topicId 未设置!!\n取消推送")
return
print("wxpusher 服务启动")
url = f"https://wxpusher.zjiecode.com/api/send/message"
headers = {"Content-Type": "application/json;charset=utf-8"}
contentType = 2
if not WXPUSHER_CONTENT_TYPE:
contentType = 2
else:
contentType = WXPUSHER_CONTENT_TYPE
if contentType == 2:
content = content.replace("\n", "<br/>")
data = {
"appToken":f"{WXPUSHER_TOKEN}",
"content":f"{content}",
"summary":f"{title}",
"contentType":contentType,
"topicIds":[
f'{WXPUSHER_TOPIC_ID}'
],
"verifyPay":False
}
response = requests.post(
url=url, data=json.dumps(data), headers=headers, timeout=15
).json()
if response["code"] == 1000:
print("wxpusher推送成功")
else:
print("wxpusher推送失败")
print(f"wxpusher推送出错响应内容{response}" )
ql_auth_path = '/ql/data/config/auth.json'
ql_config_path = '/ql/data/config/config.sh'
#判断环境变量
flag = 'new'
if not os.path.exists(ql_auth_path):
ql_auth_path = '/ql/config/auth.json'
ql_config_path = '/ql/config/config.sh'
if not os.path.exists(ql_config_path):
ql_config_path = '/ql/config/config.js'
flag = 'old'
# ql_auth_path = r'D:\Docker\ql\config\auth.json'
ql_url = 'http://localhost:5600'
def __get_token() -> str or None:
with open(ql_auth_path, 'r', encoding='utf-8') as f:
j_data = json.load(f)
return j_data.get('token')
def __get__headers() -> dict:
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8',
'Authorization': 'Bearer ' + __get_token()
}
return headers
# 封装读取环境变量的方法
def get_cookie(key, default="", output=True):
def no_read():
if output:
print_now(f"未填写环境变量 {key} 请添加")
return default
return get_cookie_data(key) if get_cookie_data(key) else no_read()
#获取ck
def get_cookie_data(name):
ck_list = []
remarks_list = []
cookie = None
cookies = get_config_and_envs(name)
for ck in cookies:
data_temp = {}
if ck["name"] != name:
continue
if ck.get('status') == 0:
# ck_list.append(ck.get('value'))
# 直接添加CK
ck_list.append(ck)
# if len(ck_list) < 1:
# print('变量{}共配置{}条CK,请添加环境变量,或查看环境变量状态'.format(name,len(ck_list)))
return ck_list
# 修改print方法 避免某些环境下python执行print 不会去刷新缓存区导致信息第一时间不及时输出
def print_now(content):
print(content)
stdout.flush()
# 查询环境变量
def get_envs(name: str = None) -> list:
params = {
't': int(time.time() * 1000)
}
if name is not None:
params['searchValue'] = name
res = requests.get(ql_url + '/api/envs', headers=__get__headers(), params=params)
j_data = res.json()
if j_data['code'] == 200:
return j_data['data']
return []
# 查询环境变量+config.sh变量
def get_config_and_envs(name: str = None) -> list:
params = {
't': int(time.time() * 1000)
}
#返回的数据data
data = []
if name is not None:
params['searchValue'] = name
res = requests.get(ql_url + '/api/envs', headers=__get__headers(), params=params)
j_data = res.json()
if j_data['code'] == 200:
data = j_data['data']
with open(ql_config_path, 'r', encoding='utf-8') as f:
while True:
# Get next line from file
line = f.readline()
# If line is empty then end of file reached
if not line :
break;
#print(line.strip())
exportinfo = line.strip().replace("\"","").replace("\'","")
#去除注释#行
rm_str_list = re.findall(r'^#(.+?)', exportinfo,re.DOTALL)
#print('rm_str_list数据{}'.format(rm_str_list))
exportinfolist = []
if len(rm_str_list) == 1:
exportinfo = ""
#list_all = re.findall(r'export[ ](.+?)', exportinfo,re.DOTALL)
#print('exportinfo数据{}'.format(exportinfo))
#以export分隔字符前面新增标记作为数组0数组1为后面需要的数据
list_all = ("标记"+exportinfo.replace(" ","").replace(" ","")).split("export")
#print('list_all数据{}'.format(list_all))
if len(list_all) > 1:
#以=分割,查找需要的环境名字
tmp = list_all[1].split("=")
if len(tmp) > 1:
info = tmp[0]
if name in info:
#print('需要查询的环境数据:{}'.format(tmp))
data_tmp = []
data_json = {
'id': None,
'value': tmp[1],
'status': 0,
'name': name,
'remarks': "",
'position': None,
'timestamp': int(time.time()*1000),
'created': int(time.time()*1000)
}
if flag == 'old':
data_json = {
'_id': None,
'value': tmp[1],
'status': 0,
'name': name,
'remarks': "",
'position': None,
'timestamp': int(time.time()*1000),
'created': int(time.time()*1000)
}
#print('需要的数据:{}'.format(data_json))
data.append(data_json)
#print('第二次配置数据:{}'.format(data))
return data
# 新增环境变量
def post_envs(name: str, value: str, remarks: str = None) -> list:
params = {
't': int(time.time() * 1000)
}
data = [{
'name': name,
'value': value
}]
if remarks is not None:
data[0]['remarks'] = remarks
res = requests.post(ql_url + '/api/envs', headers=__get__headers(), params=params, json=data)
j_data = res.json()
if j_data['code'] == 200:
return j_data['data']
return []
# 修改环境变量1青龙2.11.0以下版本不含2.11.0
def put_envs_old(_id: str, name: str, value: str, remarks: str = None) -> bool:
params = {
't': int(time.time() * 1000)
}
data = {
'name': name,
'value': value,
'_id': _id
}
if remarks is not None:
data['remarks'] = remarks
res = requests.put(ql_url + '/api/envs', headers=__get__headers(), params=params, json=data)
j_data = res.json()
if j_data['code'] == 200:
return True
return False
# 修改环境变量2青龙2.11.0以上版本含2.11.0
def put_envs_new(_id: int, name: str, value: str, remarks: str = None) -> bool:
params = {
't': int(time.time() * 1000)
}
data = {
'name': name,
'value': value,
'id': _id
}
if remarks is not None:
data['remarks'] = remarks
res = requests.put(ql_url + '/api/envs', headers=__get__headers(), params=params, json=data)
j_data = res.json()
if j_data['code'] == 200:
return True
return False
# 禁用环境变量
def disable_env(_id: str) -> bool:
params = {
't': int(time.time() * 1000)
}
data = [_id]
res = requests.put(ql_url + '/api/envs/disable', headers=__get__headers(), params=params, json=data)
j_data = res.json()
if j_data['code'] == 200:
return True
return False
# 启用环境变量
def enable_env(_id: str) -> bool:
params = {
't': int(time.time() * 1000)
}
data = [_id]
res = requests.put(ql_url + '/api/envs/enable', headers=__get__headers(), params=params, json=data)
j_data = res.json()
if j_data['code'] == 200:
return True
return False
# 删除环境变量
def delete_env(_id: str) -> bool:
params = {
't': int(time.time() * 1000)
}
data = [_id]
res = requests.delete(ql_url + '/api/envs', headers=__get__headers(), params=params, json=data)
j_data = res.json()
if j_data['code'] == 200:
return True
return False
def base64_encode(data):
message_bytes = data.encode('utf-8') # 将字符串转换为字节型
base64_data = base64.b64encode(message_bytes) #进行加密
# base64_data = base64.b64encode(data) # 进行加密
# print(base64_data,type(base64_data),len(base64_data))
base64_data = base64_data.decode('utf-8')
return base64_data
def base64_decode(data):
#base64_bytes = data.encode('utf-8')
message_bytes = base64.b64decode(data)
message = message_bytes.decode('utf-8')
return message
# WXPUSHER_TOKEN
WoChangYouCK_WXPUSHER_TOKEN_temp = get_cookie("WoChangYouCK_WXPUSHER_TOKEN")
if WoChangYouCK_WXPUSHER_TOKEN_temp != "" and len(WoChangYouCK_WXPUSHER_TOKEN_temp)>0:
WXPUSHER_TOKEN = WoChangYouCK_WXPUSHER_TOKEN_temp[0]["value"]
# WXPUSHER_TOPIC_ID
WoChangYouCK_WXPUSHER_TOPIC_ID_temp = get_cookie("WoChangYouCK_WXPUSHER_TOPIC_ID")
if WoChangYouCK_WXPUSHER_TOPIC_ID_temp != "" and len(WoChangYouCK_WXPUSHER_TOPIC_ID_temp)>0:
WXPUSHER_TOPIC_ID = WoChangYouCK_WXPUSHER_TOPIC_ID_temp[0]["value"]
msg = ""
isDebugger = False
# 是否生成沃畅游access_token参数提交至青龙环境默认False不生成需要生成请填入True
IsWoChangYouCK = False
IsWoChangYouCK_temp = get_cookie("IsWoChangYouCK")
if IsWoChangYouCK_temp != "" and len(IsWoChangYouCK_temp)>0:
IsWoChangYouCKStr = IsWoChangYouCK_temp[0]["value"]
if IsWoChangYouCKStr == "True":
IsWoChangYouCK = True
# 是否生成联通app参数提交至青龙环境默认False不生成需要生成请填入True
IsChinaUnicomParam = False
IsChinaUnicomParam_temp = get_cookie("IsChinaUnicomParam")
if IsChinaUnicomParam_temp != "" and len(IsChinaUnicomParam_temp)>0:
IsChinaUnicomParamStr = IsChinaUnicomParam_temp[0]["value"]
if IsChinaUnicomParamStr == "True":
IsChinaUnicomParam = True
# 生成token后添加到指定环境变量
envName = "chinaUnicomCookie"
ChinaUnicomEnvName_temp = get_cookie("ChinaUnicomEnvName")
if ChinaUnicomEnvName_temp != "" and len(ChinaUnicomEnvName_temp)>0:
envName = ChinaUnicomEnvName_temp[0]["value"]
# 生成的多账号使用的拼接连接符,默认使用&
chatMoreStr = "&"
ChinaUnicomParam_chatMoreStr_temp = get_cookie("ChinaUnicomParam_chatMoreStr")
if ChinaUnicomParam_chatMoreStr_temp != "" and len(ChinaUnicomParam_chatMoreStr_temp)>0:
chatMoreStr = ChinaUnicomParam_chatMoreStr_temp[0]["value"]
# 是否拼接appid默认False不拼接需要拼接请填入True
chinaUnicomParam_flag = False
ChinaUnicomParam_flag_temp = get_cookie("ChinaUnicomParam_flag")
if ChinaUnicomParam_flag_temp != "" and len(ChinaUnicomParam_flag_temp)>0:
chinaUnicomParam_flagStr = ChinaUnicomParam_flag_temp[0]["value"]
if chinaUnicomParam_flagStr == "True":
chinaUnicomParam_flag = True
# appid和token_online之间的拼接符号默认使用#
chatStr = "#"
ChinaUnicomParam_chatStr_temp = get_cookie("ChinaUnicomParam_chatStr")
if ChinaUnicomParam_chatStr_temp != "" and len(ChinaUnicomParam_chatStr_temp)>0:
chatStr = ChinaUnicomEnvName_temp[0]["value"]
# 拼接appid是在token_online前面还是后面1代表前面2代表后面,默认appid在前面
appidIndex = 1
ChinaUnicomParam_appidIndex_temp = get_cookie("ChinaUnicomParam_appidIndex")
if ChinaUnicomParam_appidIndex_temp != "" and len(ChinaUnicomParam_appidIndex_temp)>0:
appidIndex = ChinaUnicomParam_appidIndex_temp[0]["value"]
# 需要提交青龙的联通参数
dataParam = ""
class RSA_Encrypt:
def __init__(self, key):
if isinstance(key, str):
# 若提供的rsa公钥不为pem格式 则先将hex转化为pem格式
# self.key = bytes.fromhex(key) if "PUBLIC KEY" not in key else key.encode()
self.key = self.public_key(key) if "PUBLIC KEY" not in key else key.encode()
else:
print("提供的公钥格式不正确")
def public_key(self, rsaExponent, rsaModulus=10001):
e = int(rsaExponent, 16)
n = int(rsaModulus, 16) # snipped for brevity
pubkey = construct((n, e)).export_key()
return pubkey
def encrypt(self, data, b64=False):
data = data.encode('utf-8')
length = len(data)
default_length = 117
pub_key = importKey(self.key)
cipher = PKCS1_v1_5.new(pub_key)
if length < default_length:
rsa_text = cipher.encrypt(data)
return b64encode(rsa_text).decode() if b64 else rsa_text.hex()
offset = 0
res = []
while length - offset > 0:
if length - offset > default_length:
res.append(cipher.encrypt(data[offset:offset + default_length]))
else:
res.append(cipher.encrypt(data[offset:]))
offset += default_length
byte_data = b''.join(res)
return b64encode(byte_data).decode() if b64 else byte_data.hex()
class UnicomLogin:
def __init__(self, phone: str, password: str):
self.rsa_key = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDc+CZK9bBA9IU+gZUOc6FUGu7y\nO9WpTNB0PzmgFBh96Mg1WrovD1oqZ+eIF4LjvxKXGOdI79JRdve9NPhQo07+uqGQ\ngE4imwNnRx7PFtCRryiIEcUoavuNtuRVoBAm6qdB0SrctgaqGfLgKvZHOnwTjyNq\njBUxzMeQlEC2czEMSwIDAQAB\n-----END PUBLIC KEY-----"
self.phone_num = phone.rstrip("\n")
self.password = password.rstrip("\n")
self.deviceId = uuid4().hex
self.appid = str(random.randint(0, 10))+"f"+str(random.randint(0, 10))+"af"+str(random.randint(0, 10))+str(random.randint(0, 10))+"ad"+str(random.randint(0, 10))+"912d306b5053abf90c7ebbb695887bc870ae0706d573c348539c26c5c0a878641fcc0d3e90acb9be1e6ef858a59af546f3c826988332376b7d18c8ea2398ee3a9c3db947e2471d32a49612"
self.access_token = ""
self.UA = "Mozilla/5.0 (Linux; Android 13; LE2100 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.129 Mobile Safari/537.36; unicom{version:android@11.0300,desmobile:"+self.phone_num+"};devicetype{deviceBrand:OnePlus,deviceModel:LE2100};{yw_code:}"
def login_unicom(self):
global dataParam
# print_now(self.phone_num+"---------"+self.password)
headers = {
'Host': 'm.client.10010.com',
'Accept': '*/*',
# 'User-Agent': 'ChinaUnicom.x CFNetwork iOS/15.0.1 unicom{version:iphone_c@11.0300}',
'User-Agent': self.UA,
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Content-Type': 'application/x-www-form-urlencoded',
}
data = f"isFirstInstall=1&simCount=1&yw_code=&deviceOS=android13&mobile={quote(RSA_Encrypt(self.rsa_key).encrypt(self.phone_num, b64=True))}&netWay=Wifi&version=android%4011.0300&deviceId={self.deviceId}&password={quote(RSA_Encrypt(self.rsa_key).encrypt(self.password, b64=True))}&keyVersion=&provinceChanel=general&appId=ChinaunicomMobileBusiness&deviceModel=LE2100&androidId={uuid4().hex[8:24]}&deviceBrand=&timestamp={datetime.today().__format__('%Y%m%d%H%M%S')}"
# data = {
# "version": "iphone_c@10.0700",
# "mobile": quote(RSA_Encrypt(self.rsa_key).encrypt(self.phone_num, b64=True)),
# "appId": self.appid,
# "deviceId": self.deviceId,
# "password": quote(RSA_Encrypt(self.rsa_key).encrypt(self.password, b64=True)),
# }
response = requests.post('https://m.client.10010.com/mobileService/login.htm', headers=headers,data=data)
data = response.json()
# print_now(f"{data}")
self.ecs_token = data.get("ecs_token")
if data.get("code") == '4':
print_now(f'账号【{self.phone_num}】账号密码错误,跳过')
return self.ecs_token
self.token_online = data.get("token_online")
if self.token_online == "" or self.token_online is None:
print_now(f'账号【{self.phone_num}】获取token_online失败成功获取到【appid】{self.appid}')
return self.ecs_token
else:
print_now(f'账号【{self.phone_num}】成功获取到【token_online】{self.token_online}\n账号【{self.phone_num}】成功获取到【ecs_token】{self.ecs_token}\n账号【{self.phone_num}】成功获取到【appid】{self.appid}\n账号【{self.phone_num}】成功获取到【deviceId】{self.deviceId}')
# 拼接参数appid
if chinaUnicomParam_flag == True or chinaUnicomParam_flag == "True":
# 在前
if appidIndex == 1:
print_now(f'账号【{self.phone_num}】生成appid+token为\n{self.appId}{chatStr}{self.token_online}')
# 使用chatMoreStr拼接
dataParam = dataParam+chatMoreStr+self.appid+chatStr+self.token_online;
else:
# 在后
dataParam = dataParam+chatMoreStr+self.token_online+chatStr+self.appid;
else:
# 使用chatMoreStr拼接
dataParam = dataParam+chatMoreStr+self.token_online;
return self.ecs_token
# 方式一登录沃畅游
def get_wo_speed_ticket(self):
if self.ecs_token == "" or self.ecs_token is None:
return ""
cookies = {
'ecs_token': self.ecs_token,
}
headers = {
'Host': 'm.client.10010.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 unicom{version:iphone_c@10.0700}',
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Referer': 'https://m.client.10010.com',
}
params = {
'to_url': 'https://web.wostore.cn/web/flowGame/index.html?channelId=GAMELTAPP_90006',
}
response = requests.get(
'https://m.client.10010.com/mobileService/openPlatform/openPlatLineNew.htm',
params=params,
cookies=cookies,
headers=headers,
allow_redirects=False
)
location = response.headers['Location']
return location[location.find("ticket=") + len('ticket='):location.rfind("&versio")]
def wo_speed_login_one(self):
if self.ticket == "" or self.ticket is None:
return ""
headers = {
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
'Content-Type': 'application/json;charset=utf-8',
'Origin': 'https://web.wostore.cn',
'Referer': 'https://web.wostore.cn/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-site',
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/109.0.0.0',
'accept': 'application/json',
'channelId': 'GAMELTAPP_90005',
'device': '8',
'rnVersion': '',
'versionCode': '',
}
json_data = {
'identityType': 'ticketToken',
'code': self.ticket,
'uuid': '3cc1b0ff-ddb4-49dc-9e87-4d51811f7ea1',
}
response = requests.post('https://game.wostore.cn/api/app/user/v2/login', headers=headers, json=json_data)
d = response.json().get('data')
if not d or d == "":
print_now(f"可能是首次登录沃畅游。无法获取access_token可先手动去联通app首页--5g新通信--联通畅游--个人中心,登录一下")
return ""
access_token = d.get('access_token',None)
if not access_token and access_token != "":
return access_token
else:
print_now(f"可能是首次登录沃畅游。无法获取access_token可先手动去联通app首页--5g新通信--联通畅游--个人中心,登录一下")
return ""
# 方式二登录
def wo_speed_login_two(self):
if self.ecs_token == "" or self.ecs_token is None:
return ""
count = 0
while True:
if count < 3 and self.access_token == "":
count = self.login(count)
if self.access_token == "":
print_now(f"休眠3秒再次请求获取access_token\n\n")
time.sleep(3)
else:
break
if self.access_token == "":
print_now(f"可能是首次登录沃畅游。无法获取access_token可先手动去联通app首页--5g新通信--联通畅游,登录一下")
def login(self,count):
url = 'https://m.client.10010.com/mobileService/openPlatform/openPlatLineNew.htm?to_url=https://web.wostore.cn/web/flowGame/index.html?channelId=GAMELTAPP_90006&pushid=99'
headers = {
'Content-Type': 'application/json;charset=utf-8',
# "User-Agent": "Mozilla/5.0 (Linux; Android 13; LE2100 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.129 Mobile Safari/537.36; unicom{version:android@10.0600,desmobile:"+self.phone_num+"};devicetype{deviceBrand:OnePlus,deviceModel:LE2100};{yw_code:}",
"Cookie": "ecs_token=" + self.ecs_token
}
try:
response = requests.get(url, headers=headers,allow_redirects=False)
# print_now(f"【{time.strftime('%Y-%m-%d %H:%M:%S')}】 ---- 【{self.phone_num}】发送成功,响应:{response.headers}")
# 获取location
location = response.headers.get("location",None)
headers["User-Agent"] = "Mozilla/5.0 (Linux; Android 13; LE2100 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.129 Mobile Safari/537.36; unicom{version:android@10.0600,desmobile:"+self.phone_num+"};devicetype{deviceBrand:OnePlus,deviceModel:LE2100};{yw_code:}"
# 获取ticket、channelId
ticket = ""
channelId = ""
if location is not None and location != "":
key_value = location.split("?")[1].split("&")
for i in range(len(key_value)):
key_value_temp = key_value[i].split("=")
if key_value_temp[0] == "ticket":
ticket = key_value_temp[1]
if key_value_temp[0] == "channelId":
channelId = key_value_temp[1]
# 登录
url = 'https://web.wostore.cn/api/app//user/v2/login'
headers["channelId"] = channelId
data = {
'identityType': 'esToken',
'code': self.ecs_token,
'ticket': ticket,
'uuid': "3cc1b0ff-ddb4-49dc-9e87-4d51811f7ea1"
}
# print_now(f'location{location}\ticket{ticket}\nheaders:{headers}\ndata:{data}')
response = requests.post(url, headers=headers, data=json.dumps(data))
text = response.json()
# print_now(f"【{time.strftime('%Y-%m-%d %H:%M:%S')}】 ---- 【{self.phone_num}】 登录成功,响应:{text}\n")
self.access_token = ""
if text["code"] == 200:
data = text["data"]
access_token = data["access_token"]
# print_now(f'账号{self.phone_num}登录成功成功获取access_token,额外需要使用时请复制保存: {access_token}\n')
if access_token is None or access_token == "":
self.access_token = ""
count += 1
else:
self.access_token = access_token
else:
print_now(f"{time.strftime('%Y-%m-%d %H:%M:%S')}】 ---- 【{self.phone_num}】 登录请求响应:{text}\n")
self.access_token = ""
count += 1
except Exception as e:
count += 1
print_now(f"\n\n账号{self.phone_num}登录请求出现错误,出错响应内容:{e}\n\n正在第{count}次重试中。。。" )
self.access_token = ""
return count
def deal_data(self):
global msg
global IsWoChangYouCK
if self.access_token == "" or self.access_token is None:
print_now(f'账号【{self.phone_num}】获取access_token失败')
msg += f'账号【{self.phone_num}】获取access_token失败\n\n'
return ""
print_now(f'账号【{self.phone_num}】成功获取到【access_token】{self.access_token}\n请复制保存使用')
# 是否填入
if IsWoChangYouCK == False or IsWoChangYouCK is None:
print_now(f'系统设置不写入access_token至青龙环境')
return ""
else:
print_now(f'系统设置写入access_token至青龙环境,开始写入。。。')
try:
# 获取沃畅游CK
cklist_temp = get_cookie("WoChangYouCK")
flag_temp = False
if len(cklist_temp)>0:
for i in range(len(cklist_temp)):
ck_temp = cklist_temp[i]
if ck_temp["remarks"] == phone:
flag_temp = True
put_flag = True
if flag == "old":
_id = ck_temp.get("_id",None)
if not _id:
_id = ck_temp["id"]
put_flag = put_envs_new(_id, ck_temp['name'], self.access_token, phone)
else:
put_flag = put_envs_old(_id, ck_temp['name'], self.access_token, phone)
# print("进入旧版本青龙禁用方法")
# disable_env(_id)
# delete_env(_id)
elif flag == "new":
put_flag = put_envs_new(ck_temp["id"], ck_temp['name'], self.access_token, phone)
# print("进入新版本青龙禁用方法")
# disable_env(ck_temp["id"])
# delete_env(ck_temp["id"])
if put_flag:
print_now(f"账号【{self.phone_num}】自动更新access_token至青龙环境WoChangYouCK 备注为:{phone}")
msg += f"账号【{phone}】自动更新access_token至青龙环境WoChangYouCK 备注为:{phone}\n\n"
else:
print_now(f"账号【{self.phone_num}】自动更新access_token至青龙环境失败")
msg += f"账号【{phone}】自动更新access_token至青龙环境失败\n\n"
if not flag_temp:
post_envs("WoChangYouCK", self.access_token, phone)
print_now(f"账号【{self.phone_num}】自动新增access_token至青龙环境WoChangYouCK 备注为:{phone}")
msg += f"账号【{phone}】自动新增access_token至青龙环境WoChangYouCK 备注为:{phone}\n\n"
except Exception as e:
print_now(f"{time.strftime('%Y-%m-%d %H:%M:%S')}】 ---- 【{phone}】 登录失败,错误信息:{e}\n")
msg += f"{time.strftime('%Y-%m-%d %H:%M:%S')}】 ---- 【{phone}】 登录失败,错误信息:{e}\n\n"
def main(self):
self.login_unicom()
# 方式一登录
# self.ticket = self.get_wo_speed_ticket()
# self.access_token = self.wo_speed_login_one()
# 方式二登录
self.wo_speed_login_two()
self.deal_data()
# 将生成的环境变量填入青龙环境中
def post_data_to_env():
global msg
global dataParam
# 是否填入
if IsChinaUnicomParam == False or IsChinaUnicomParam is None:
print_now(f'系统设置不写入token_online至青龙环境')
return ""
else:
print_now(f'系统设置写入token_online至青龙环境,开始写入。。。')
# 截取第一位拼接参数
if len(dataParam)>1:
dataParam = dataParam[1:]
else:
print_now(f'未获取到token_online参数')
return ""
try:
# 获取环境CK
cklist_temp = get_cookie(envName)
flag_temp = False
if len(cklist_temp)>0:
for i in range(len(cklist_temp)):
ck_temp = cklist_temp[i]
if ck_temp["remarks"] == "由“联通和沃畅游密码登录”脚本自动生成":
flag_temp = True
put_flag = True
if flag == "old":
_id = ck_temp.get("_id",None)
if not _id:
_id = ck_temp["id"]
put_flag = put_envs_new(_id, ck_temp['name'], dataParam, "由“联通和沃畅游密码登录”脚本自动生成")
else:
put_flag = put_envs_old(_id, ck_temp['name'], dataParam, "由“联通和沃畅游密码登录”脚本自动生成")
# print("进入旧版本青龙禁用方法")
# disable_env(_id)
# delete_env(_id)
elif flag == "new":
put_flag = put_envs_new(ck_temp["id"], ck_temp['name'], dataParam, "由“联通和沃畅游密码登录”脚本自动生成")
# print("进入新版本青龙禁用方法")
# disable_env(ck_temp["id"])
# delete_env(ck_temp["id"])
if put_flag:
print_now(f"已将全部正常执行生成联通参数的账号,自动更新至青龙环境:{envName} 由“联通和沃畅游密码登录”脚本自动生成")
msg += f"已将全部正常执行生成联通参数的账号,自动更新至青龙环境:{envName} 由“联通和沃畅游密码登录”脚本自动生成\n\n"
else:
print_now(f"全部正常执行生成联通参数的账号,自动更新至青龙环境:失败")
msg += f"全部正常执行生成联通参数的账号,自动更新至青龙环境:失败\n\n"
if not flag_temp:
post_envs(envName, dataParam, "由“联通和沃畅游密码登录”脚本自动生成")
print_now(f"已将全部正常执行生成联通参数的账号,自动新增至青龙环境:{envName} 备注为:由“联通和沃畅游密码登录”脚本自动生成")
msg += f"已将全部正常执行生成联通参数的账号,自动新增至青龙环境:{envName} 备注为:由“联通和沃畅游密码登录”脚本自动生成\n\n"
except Exception as e:
print_now(f"{time.strftime('%Y-%m-%d %H:%M:%S')}】 ---- 联通和沃畅游密码登录脚本生成参数提交青龙失败,错误信息:{e}\n")
msg += f"{time.strftime('%Y-%m-%d %H:%M:%S')}】 ---- 联通和沃畅游密码登录脚本生成参数提交青龙失败,错误信息:{e}\n\n"
def start(phone,password):
ul = UnicomLogin(phone,password)
ul.main()
if __name__ == "__main__":
l = []
ck_list = []
cklist = get_cookie("WoChangYouCK_PSW")
for i in range(len(cklist)):
#多账号以#分割开的ck
split1 = cklist[i]['value'].split("#")
#多账号以@分割开的ck
split2 = cklist[i]['value'].split("@")
#多账号以换行\n分割开的ck
split3 = cklist[i]['value'].split("\n")
remarks = cklist[i].get("remarks",None)
if len(split1)>1:
for j in range(len(split1)):
info = {}
info['value'] = split1[j]
info['remarks'] = split1[j].split("&")[0]
ck_list.append(info)
elif len(split2)>1:
for j in range(len(split2)):
info = {}
info['value'] = split2[j]
info['remarks'] = split2[j].split("&")[0]
ck_list.append(info)
elif len(split3)>1:
for j in range(len(split3)):
info = {}
info['value'] = split3[j]
info['remarks'] = split3[j].split("&")[0]
ck_list.append(info)
else:
if remarks is None or remarks == "":
cklist[i]['remarks'] = cklist[i]['value']
ck_list.append(cklist[i])
if len(ck_list)<1:
print_now('未添加CK,退出程序~')
exit(0)
for i in range(len(ck_list)):
ck = ck_list[i]
data = ck.get("value",None)
if data is None:
print_now("当前账号未填写 跳过\n")
continue
tmp_list = data.split("&")
if len(tmp_list)<2:
print_now("参数不齐 跳过\n")
continue
phone = tmp_list[0]
password = tmp_list[1]
print_now(f'开始执行第 {i+1} 个账号:{phone}')
start(phone,password)
#解决随机时间问题
ran_time = random.randint(3, 5)
if isDebugger == False and i != (len(ck_list)-1):
print_now(f"随机休眠{ran_time}秒,执行下一个账号操作\n\n")
time.sleep(ran_time)
else:
print_now("\n\n")
# 最后写入联通
post_data_to_env()
if WXPUSHER_TOKEN != "" and WXPUSHER_TOPIC_ID != "" and msg != "":
wxpusher("联通和沃畅游密码登录",msg)

View File

@@ -0,0 +1,169 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%87%AD%E5%AE%9D%E4%B9%90%E5%9B%AD.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%87%AD%E5%AE%9D%E4%B9%90%E5%9B%AD.js
// # Repo: jdqlscript/toulu
// # Path: 臭宝乐园.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: abd99e11219d5db720c17836b4f69202320cecd65c42f8cf70ab848b1029a204
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: smallfawn
@Date: 2024.06.09 12.51
@Description: 臭宝乐园小程序 签到换螺蛳粉
------------------------------------------
变量名choubao
变量值 https://cbxcx.weinian.com.cn/wnuser 请求头Headers中authorization的值 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("臭宝乐园");
let ckName = `choubao`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user
$.ckFlag = true;
await getUserInfo()
if ($.ckFlag) {
await signInCheck()
await $.wait(3000)
}
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function signInCheck() {
let config = {
method: 'POST',
url: 'https://cbxcx.weinian.com.cn/wnuser/v1/memberUser/checkSignNum',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'authorization': $.token,
'charset': 'utf-8',
'content-type': 'application/json',
'Referer': 'https://servicewechat.com/wx2206cca563f6f937/82/page-frame.html'
}
};
let { data: result } = await Request(config)
if (result?.status == 200) {
await signIn()
}else{
$.log(`获取签到状态[${result.msg}]`)
}
}
async function signIn() {
let config = {
method: 'POST',
url: 'https://cbxcx.weinian.com.cn/wnuser/v1/memberUser/daySign',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'authorization': $.token,
'charset': 'utf-8',
'content-type': 'application/json',
'Referer': 'https://servicewechat.com/wx2206cca563f6f937/82/page-frame.html'
}
};
let { data: result } = await Request(config)
if (result?.status == 200) {
$.log(`签到成功`)
} else {
$.log(`签到失败【${result.msg}`)
}
}
async function getUserInfo() {
let config = {
method: 'POST',
url: 'https://cbxcx.weinian.com.cn/wnuser/v1/memberUser/getMemberUser',
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220089 MMWEBSDK/20240404 MMWEBID/8150 MicroMessenger/8.0.49.2600(0x28003156) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Accept-Encoding': 'gzip,compress,br,deflate',
'authorization': $.token,
'charset': 'utf-8',
'content-type': 'application/json',
'Referer': 'https://servicewechat.com/wx2206cca563f6f937/82/page-frame.html'
}
};
let { data: result } = await Request(config)
if (result?.status == 200) {
$.log(`[${result.data.nickName}] 嗦粉币[${result.data.points}]`)
} else {
$.log(`获取用户信息失败【${result.msg}`)
$.ckFlag = false
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

View File

@@ -0,0 +1,254 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/choubao.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/choubao.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/choubao.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 5bbd98d8a822e4074280f475b354bbb68d4b7a6a72e3f9909b638231008e3ccb
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
cron: 30 9 * * *
------------------------------------------
#Notice:
臭宝乐园 微信小程序 签到得积分 换螺蛳粉
抓https://cb-bags-slb.weinian.com.cn 请求头token 仅支持单账号
WeChatCodeServer 填写wx_server_url wx_auth 用于获取code 因为抓到的有效期很短只有2小时
变量名称choubaoleyuan
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("臭宝乐园");
const WeChatServer = require("./wcs.js");
let ckName = `choubaoleyuan`;
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 || 'http://192.168.31.196:12081',
appid: 'wx2206cca563f6f937',
auth: process.env.wx_auth || "your-api-key",
}
);
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.wcsid = this.user[0]
}
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)
}
if (!this.token) {
$.log(`账号[${this.index}] 获取用户Token失败❌`)
return
}
this.token = 'Bearer' + this.token
await this.getUserInfo()
await this.track()
await this.checkSign()
}
async getUserToken(code) {
let options = {
method: 'POST',
url: `https://cb-bags-slb.weinian.com.cn/bff/v1/auth/wechatLogin`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"authorization": "Bearer" + this.token
}
,
data: {
loginCode: code
}
}
let {
data: result
} = await axios.request(options);
if (result?.status == '200') {
this.token = result.data
$.log(`🌸账号[${this.index}] 获取用户Token成功:${this.token}`)
} else {
$.log(`🌸账号[${this.index}] 获取用户Token-失败:${result.msg}`)
}
}
async getUserInfo() {
let options = {
method: 'POST',
url: `https://cb-bags-slb.weinian.com.cn/wnuser/v1/memberUser/getMemberUser`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": "" + this.token + "",
"content-type": "application/json",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": '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 WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027'
}
}
let {
data: result
} = await axios.request(options);
if (result?.status == '200') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `[${result.data.nickName}] 积分[${result.data.points}]🎉`);
} else {
$.log(`🌸账号[${this.index}] 获取用户信息-失败:${result.msg}`)
}
}
async track() {
let options = {
method: 'POST',
url: `https://cb-bags-slb.weinian.com.cn/member/v1/memberBuryPoint/add`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": "" + this.token + "",
"content-type": "application/json",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": '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 WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027'
},
data: { "appletVersion": "2.0.31", "phoneSystem": "Windows Unknown x64", "phoneModel": "microsoft", "functionName": "签到", "module": "首页", "linkUrl": "pages/signIn/signIn", "secondPage": "" }
}
await axios.request(options);
}
async checkSign() {
let options = {
method: 'POST',
url: `https://cb-bags-slb.weinian.com.cn/wnuser/v1/memberUser/checkSignNum`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": "" + this.token + "",
"content-type": "application/json",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": '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 WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027'
},
data: {
}
};
let {
data: result
} = await axios.request(options);
if (result?.status == '200') {
//打印签到结果
await this.signIn()
} else {
}
}
async signIn() {
let options = {
method: 'POST',
url: `https://cb-bags-slb.weinian.com.cn/wnuser/v1/memberUser/daySign`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": "" + this.token + "",
"content-type": "application/json",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site"
},
data: {
}
};
let {
data: result
} = await axios.request(options);
if (result?.status == '200') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `签到成功🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.msg}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
if (process.env['wx_server_url'] && process.env['wx_auth']) {
for (let user of $.userList) {
await new Task(user).run();
}
} else {
$.log(`${ckName}未配置微信SERVER配置 搭建可看仓库目录下的readme.md❌`)
return
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,679 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/hyjk.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/hyjk.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/hyjk.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: fafd24e84af03196a944c9196f8bdd6e640018c604fb61c80a661c075a3d5db6
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 荷叶健康小程序
cron: 30 10 * * *
------------------------------------------
#Notice:
微信荷叶健康小程序 免费水果+打卡签到抽奖
抓tuan.api.ybm100.com/miniapp中请求头的token 多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
global['window'] = {}
global['navigator'] = {}
const { JSEncrypt } = require("encryptlong")
const JsRsaSign = require("jsrsasign")
const { Env } = require("../tools/env")
const $ = new Env("荷叶健康小程序");
let ckName = `hyjk`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
this.channelCode = this.user[1] || process.env.HYJK_CHANNEL_CODE || "130";
this.userFlag = false
this.userId = ''
this.headers = {
"host": "tuan.api.ybm100.com",
"userid": "" + this.userId,
"referer": "https://www.heyejk.com/",
"apptype": "1",
"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.70(0x18004630) NetType/WIFI Language/zh_CN miniProgram/wx776afedbfae3a228",
"appversion": "3.1.7",
"origin": "https://www.heyejk.com",
"sec-fetch-dest": "empty",
"sec-fetch-site": "cross-site",
"terminal": "h5",
"usertype": "groupuser",
"appname": "ykq-xcx",
"token": "" + this.token,
"accept-language": "zh-CN,zh-Hans;q=0.9",
"accept": "application/json, text/plain, */*",
"content-type": "application/json;charset=UTF-8",
"accept-encoding": "gzip, deflate, br",
"sec-fetch-mode": "cors"
}
}
async run() {
await this.getFruitInfo()
await this.autoByUserOperation()
await this.getSignInfo()
}
async getSignInfo() {
let options = {
method: 'POST',
url: `https://tuan.api.ybm100.com/miniapp/marketing/signActivity/signRecord`,
headers: this.headers,
data: { "actId": "9093", "channelCode": this.channelCode, "adornId": "217" }
};
let { data: result } = await axios.request(options);
if (result.code == 0) {
const isSigned = result?.result?.todaySignStatusDesc === "已签到";
$.log(`[账号${this.index}] 今日签到: ${isSigned ? "已签到" : "未签到"}`)
if (!isSigned) {
await this.doSign()
}
} else {
$.log(`[账号${this.index}] 获取签到状态失败[${result.msg}]`);
}
}
async doSign() {
let options = {
method: 'POST',
url: `https://tuan.api.ybm100.com/miniapp/marketing/signActivity/sign`,
headers: this.headers,
data: { "actId": "9093", "channelCode": this.channelCode, "adornId": "217" }
};
let { data: result } = await axios.request(options);
if (result?.code == '0') {
$.log(`[账号${this.index}] 签到成功[${result.msg}]`);
} else {
$.log(`[账号${this.index}] 签到失败:${result.msg}`)
}
}
async getFruitInfo() {
let options = {
method: 'GET',
url: `https://tuan.api.ybm100.com/api/healthSquare/fruitManor/getMyManorInfo?channelCode=${this.channelCode}`,
headers: this.headers,
};
let { data: result } = await axios.request(options);
if (result.code == 0) {
$.log(`[账号${this.index}] [${result.result.kettleWater}]-[${result.result.progressBarTips}]`)
this.treeId = Number(result.result.treeId)
this.userId = result.result.userId
this.headers.userid = String(this.userId || "")
this.todayFullWaterTaskId = Number(result?.result?.todayFullWaterTaskId || 0)
for (let i = 0; i < Math.floor(Number(result.result.kettleWater) / 10); i++) {
await $.wait(3000)
await this.doWater()
}
} else {
$.log(`[账号${this.index}] 查询失败[${result.msg}]`);
}
}
async doWater() {
try {
let data = { "channelCode": this.channelCode, "treeId": this.treeId, "nonce": $.randomString(6) }
let options = {
method: 'POST',
url: `https://tuan.api.ybm100.com/api/healthSquare/water/watering?secret=${encodeURIComponent(this.encrypt(data))}`,
headers: this.headers,
data: data
}
let { data: result } = await axios.request(options);
if (result?.code == 0) {
$.log(`账号${this.index}] 浇水[${result.result.progressBarTips}]`)
} else {
$.log(`账号${this.index}] 胶水[${result.msg}]`);
}
} catch (e) {
}
}
request(options) {
const finalOptions = {
timeout: Number(process.env.HYJK_HTTP_TIMEOUT || 15000),
...options,
headers: {
...this.headers,
...(options.headers || {})
}
};
return axios.request(finalOptions);
}
async userOperation(operateType, operateValueObj) {
const data = {
operateType,
operateValue: JSON.stringify(operateValueObj),
channelCode: this.channelCode
};
const { data: result } = await this.request({
method: "POST",
url: "https://tuan.api.ybm100.com/api/healthSquare/user/userOperation",
data
});
return result;
}
async getTaskListNew() {
const { data: result } = await this.request({
method: "GET",
url: `https://tuan.api.ybm100.com/api/healthSquare/task/getTaskListNew?channelCode=${this.channelCode}&venueId=5`
});
return result;
}
async getPopupList() {
const { data: result } = await this.request({
method: "GET",
url: `https://tuan.api.ybm100.com/api/healthSquare/fruitManor/getPopup`,
params: {
channelCode: this.channelCode,
entranceType: 0
}
});
return result;
}
async getVenueInfo() {
const { data: result } = await this.request({
method: "GET",
url: `https://tuan.api.ybm100.com/api/healthSquare/fruitManor/getVenueInfo`,
params: { channelCode: this.channelCode }
});
return result;
}
async getBlindBoxInfo(taskId) {
const { data: result } = await this.request({
method: "GET",
url: `https://tuan.api.ybm100.com/api/healthSquare/task/getBlindBoxInfo`,
params: {
channelCode: this.channelCode,
taskId
}
});
return result;
}
async collectWater(payload) {
const data = {
channelCode: this.channelCode,
nonce: $.randomString(6),
...payload
};
const secret = encodeURIComponent(this.encrypt(data));
const { data: result } = await this.request({
method: "POST",
url: `https://tuan.api.ybm100.com/api/healthSquare/water/collectWater?secret=${secret}`,
data
});
return result;
}
async goFruitOrGarden(taskId) {
const { data: result } = await this.request({
method: "POST",
url: `https://tuan.api.ybm100.com/healthSquare/herbalGarden/goFruitOrGarden`,
data: {
channelCode: this.channelCode,
taskId: Number(taskId)
}
});
return result;
}
flattenTaskList(taskResult) {
if (!taskResult || taskResult.code !== 0) return [];
const root = taskResult.result;
if (Array.isArray(root)) return root;
if (Array.isArray(root?.list)) {
if (root.list.some(item => item && Object.prototype.hasOwnProperty.call(item, "taskId"))) {
return root.list;
}
return root.list.flatMap(group => Array.isArray(group?.taskList) ? group.taskList : []);
}
return [];
}
async autoByUserOperation() {
await this.autoTodayFullWaterTask();
await this.autoPopups();
await this.autoVenueClicks();
await this.autoTasks();
}
async autoTodayFullWaterTask() {
try {
if (!this.todayFullWaterTaskId) return;
const opRes = await this.userOperation(6, { taskId: this.todayFullWaterTaskId, status: 1 });
$.log(`[账号${this.index}] fullWater(taskId=${this.todayFullWaterTaskId}) 上报: ${opRes?.msg || opRes?.code}`);
await $.wait(500);
} catch (e) {
$.log(`[账号${this.index}] fullWater自动化异常: ${e.message}`);
}
}
async autoPopups() {
try {
const popupRes = await this.getPopupList();
const list = Array.isArray(popupRes?.result?.list) ? popupRes.result.list : [];
for (const popup of list) {
const payload = {
popupType: Number(popup?.popupType || 0),
waterNum: Number(popup?.waterNum || 0)
};
const opRes = await this.userOperation(7, payload);
$.log(`[账号${this.index}] popupType=${payload.popupType} 上报: ${opRes?.msg || opRes?.code}`);
await $.wait(500);
}
} catch (e) {
$.log(`[账号${this.index}] popup自动化异常: ${e.message}`);
}
}
async autoVenueClicks() {
try {
const venueRes = await this.getVenueInfo();
const list = Array.isArray(venueRes?.result?.list) ? venueRes.result.list : [];
for (const venue of list) {
if (Number(venue?.clickStatus) === 0 && venue?.id) {
const opRes = await this.userOperation(10, { venueId: Number(venue.id) });
$.log(`[账号${this.index}] venueId=${venue.id} 上报: ${opRes?.msg || opRes?.code}`);
await $.wait(500);
}
}
} catch (e) {
$.log(`[账号${this.index}] venue自动化异常: ${e.message}`);
}
}
normalizeTaskNumber(value, fallback = 0) {
const n = Number(value);
return Number.isFinite(n) ? n : fallback;
}
resolveTaskEventType(item) {
const taskType = this.normalizeTaskNumber(item?.taskType);
const browseType = this.normalizeTaskNumber(item?.browseType);
const waterEventType = this.normalizeTaskNumber(item?.waterEventType);
if (taskType === 50) {
if (browseType === 1) return 11;
if (browseType === 2) return 12;
if (browseType === 3) return 13;
return 11;
}
if (taskType === 60 || taskType === 61) return 7;
if (taskType === 70) return 5;
if (taskType === 80) return 3;
if (taskType === 90) return 4;
if (taskType === 110 || taskType === 120) return waterEventType || 0;
return waterEventType || this.normalizeTaskNumber(item?.eventType);
}
resolveTaskWaterNum(item) {
const raw = [
item?.reward,
item?.waterNum,
item?.waterConf,
item?.taskRewardNum
];
for (const value of raw) {
const n = Number(value);
if (Number.isFinite(n) && n > 0) return n;
}
return undefined;
}
async claimTaskWater(item, tag = "claim") {
const taskId = this.normalizeTaskNumber(item?.taskId);
const eventType = this.resolveTaskEventType(item);
if (!eventType) {
$.log(`[账号${this.index}] ${tag} taskId=${taskId} 跳过: 缺少eventType(taskType=${this.normalizeTaskNumber(item?.taskType)})`);
return;
}
const payload = {
extTask: 0,
eventType
};
if (taskId) payload.taskId = taskId;
const waterNum = this.resolveTaskWaterNum(item);
if (waterNum) payload.waterNum = waterNum;
const res = await this.collectWater(payload);
$.log(`[账号${this.index}] ${tag} collectWater(taskId=${taskId},eventType=${eventType},waterNum=${waterNum || 0}): ${res?.msg || res?.code}`);
}
logTaskItem(item, prefix = "task") {
const taskId = this.normalizeTaskNumber(item?.taskId);
const taskType = this.normalizeTaskNumber(item?.taskType);
const taskStatus = this.normalizeTaskNumber(item?.taskStatus);
const browseType = this.normalizeTaskNumber(item?.browseType);
const waterEventType = this.normalizeTaskNumber(item?.waterEventType);
$.log(`[账号${this.index}] ${prefix} taskId=${taskId}, taskType=${taskType}, taskStatus=${taskStatus}, browseType=${browseType}, waterEventType=${waterEventType}`);
}
buildBrowseSecondsCandidates(item) {
const candidates = [];
const maybeSeconds = [
item?.seconds,
item?.browseSeconds,
item?.needSeconds,
item?.taskSeconds,
process.env.HYJK_BROWSE_SECONDS
];
for (const v of maybeSeconds) {
const n = Number(v);
if (Number.isFinite(n) && n >= 0) candidates.push(n);
}
candidates.unshift(0, 20, 30, 60);
return [...new Set(candidates.filter(n => Number.isFinite(n) && n >= 0))];
}
resolveBrowseTargetSeconds(item) {
const maybe = [
item?.needSeconds,
item?.seconds,
item?.browseSeconds,
item?.taskSeconds,
process.env.HYJK_BROWSE_SECONDS
];
for (const v of maybe) {
const n = Number(v);
if (Number.isFinite(n) && n > 0) return n;
}
return 20;
}
async autoBrowseTask(item) {
const taskId = this.normalizeTaskNumber(item?.taskId);
const targetSeconds = this.resolveBrowseTargetSeconds(item);
const waitPadding = Number(process.env.HYJK_BROWSE_WAIT_PADDING || 1);
const startRes = await this.userOperation(5, { taskId, seconds: 0 });
$.log(`[账号${this.index}] 浏览任务(taskId=${taskId}) 起始上报seconds=0: ${startRes?.msg || startRes?.code}`);
const waitMs = Math.max(0, Math.floor((targetSeconds + waitPadding) * 1000));
if (waitMs > 0) {
$.log(`[账号${this.index}] 浏览任务(taskId=${taskId}) 等待${Math.floor(waitMs / 1000)}秒以满足停留时长`);
await $.wait(62);
}
const targetRes = await this.userOperation(5, { taskId, seconds: targetSeconds });
$.log(`[账号${this.index}] 浏览任务(taskId=${taskId}) 目标上报seconds=${targetSeconds}: ${targetRes?.msg || targetRes?.code}`);
const secondsCandidates = this.buildBrowseSecondsCandidates(item).filter(s => s !== 0 && s !== targetSeconds);
for (const seconds of secondsCandidates) {
const opRes = await this.userOperation(5, { taskId, seconds });
$.log(`[账号${this.index}] 浏览任务(taskId=${taskId}) 兜底上报seconds=${seconds}: ${opRes?.msg || opRes?.code}`);
await $.wait(400);
}
}
async autoTasks() {
try {
const firstTaskRes = await this.getTaskListNew();
const firstTaskList = this.flattenTaskList(firstTaskRes);
$.log(`[账号${this.index}] taskList数量: ${firstTaskList.length}`);
for (const item of firstTaskList) {
const taskType = Number(item?.taskType);
const taskStatus = Number(item?.taskStatus);
const taskId = Number(item?.taskId);
if (!taskId) continue;
this.logTaskItem(item, "scan");
if (taskType === 50 && (taskStatus === 0 || taskStatus === 3)) {
await this.autoBrowseTask(item);
continue;
}
if (taskType === 70 && taskStatus === 0) {
const opRes = await this.userOperation(9, { taskId });
$.log(`[账号${this.index}] task70(taskId=${taskId}) 上报: ${opRes?.msg || opRes?.code}`);
await $.wait(500);
continue;
}
if (taskType === 80 && (taskStatus === 0 || taskStatus === 3)) {
await this.autoBlindBox(taskId);
continue;
}
if ((taskType === 60 || taskType === 61) && taskStatus === 0) {
await this.claimTaskWater(item, "task60/61直领");
await $.wait(500);
continue;
}
if (taskType === 90 && (taskStatus === 0 || taskStatus === 3)) {
await this.claimTaskWater(item, "task90直领");
await $.wait(500);
continue;
}
if ((taskType === 110 || taskType === 120) && (taskStatus === 0 || taskStatus === 3)) {
const jumpRes = await this.goFruitOrGarden(taskId);
$.log(`[账号${this.index}] task${taskType}(taskId=${taskId}) goFruitOrGarden: ${jumpRes?.msg || jumpRes?.code}`);
await $.wait(500);
continue;
}
if (taskStatus === 1) {
await this.claimTaskWater(item, "立即领奖");
await $.wait(500);
continue;
}
if (taskStatus !== 2 && taskStatus !== 10000) {
$.log(`[账号${this.index}] 未适配任务: taskType=${taskType}, taskStatus=${taskStatus}, taskId=${taskId}`);
}
}
const secondTaskRes = await this.getTaskListNew();
const secondTaskList = this.flattenTaskList(secondTaskRes);
for (const item of secondTaskList) {
const taskStatus = this.normalizeTaskNumber(item?.taskStatus);
if (taskStatus !== 1) continue;
await this.claimTaskWater(item, "二次领奖");
await $.wait(500);
}
} catch (e) {
$.log(`[账号${this.index}] task自动化异常: ${e.message}`);
}
}
async autoBlindBox(taskId) {
try {
const boxRes = await this.getBlindBoxInfo(taskId);
const boxList = Array.isArray(boxRes?.result) ? boxRes.result : [];
for (const box of boxList) {
if (Number(box?.status) === 0 || Number(box?.status) === 1) {
const blindBoxId = Number(box?.blindBoxId);
if (!blindBoxId) continue;
const opRes = await this.userOperation(4, { taskId, blindBoxId });
$.log(`[账号${this.index}] 盲盒(taskId=${taskId}, blindBoxId=${blindBoxId}) 上报: ${opRes?.msg || opRes?.code}`);
await $.wait(500);
}
}
} catch (e) {
$.log(`[账号${this.index}] 盲盒自动化异常(taskId=${taskId}): ${e.message}`);
}
}
encrypt(body) {
const PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiBksv2xaOJdSWblaTQl93HI393gYHqKFs89EIFBWYSmYSV+z8XXzMO/Xyo8EeWRpAjT5TuBf0wN467aBx3nsDfJd7e3+txBS7nf+S7Nyjnxx2J5AKPWx1gVmr/OF3aWqxg+DPCB7avakhj+p0QjoJ7eMqgJl/HSX2Kfb6/O3J9wIDAQAB";
const PRIVATE_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKIGSy/bFo4l1JZuVpNCX3ccjf3eBgeooWzz0QgUFZhKZhJX7PxdfMw79fKjwR5ZGkCNPlO4F/TA3jrtoHHeewN8l3t7f63EFLud/5Ls3KOfHHYnkAo9bHWBWav84XdparGD4M8IHtq9qSGP6nRCOgnt4yqAmX8dJfYp9vr87cn3AgMBAAECgYEAlwzbB5Bu5LKsEFppZ/wW2ArM7YIRiQ5TACoGFEv1HfcuVaeXDmdxs02rKzwzDEHxUYDcPFyCKPGtvK5QSBgsAUUBHb6uu0fNGUccGX31NRAfLuQ8fj3W0uvkoYlpDARuokDHhWNqWzI6f8bFHkewJwpjXCO8w1WkogTLiX9Gu3ECQQDd5J4jEDS5+7KaohYRoryyX939mzsZ4RC6ufsfzTJwSlnLyYHEbm0Cs+7gbBxRrioqApBMQPIIoa5ujm1C88MNAkEAuu3htlbpR1ZL9b3wUuf3el/D3i/k9XvSChfHQ1q46Y/eck2yEDH9Kv/ZUxEl4fR8mB2MONm9oc2l+chPd9uQEwJBALcWuNU9vgPoB0tIiuUqXoDgUY+80ltcNi2c3/Uxn3jAIK/iKU0nwJMGXQiYrBVJnEjlrKL+w7cTkZZvtwATmtECQC2JV4vQvkFHj3eMzqeTpKDmBVPx/OekQzV8N2l8B0G2b20O6kqxssevzeRDcCQMJ/HyeL88o8pvy3f+yQUcsosCQQDZXV8K7Ek0R/V3dAdUzoetFSlfjCGy9QKPruz7m+iXBASxiA0R7YGfJzc8jWpuv0pxujtB/awy22K/ggLAhkZU";
const JAVA_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNQpS4ZeHRiIPFIdZgupShTHFlGOqFkT6XEqByvWqt2BvLo3a+YfzyJHOXyfX41OvbIkuIaycuxU9w7RHI1e7F3O7Io+XxncjyU3GR+ae2DEtLaG3o/rtpONF5q1jTN/Spu4GKXsjhHrP9xxMThLF6134NKAyQZfvOms0gS0zmxwIDAQAB"
const JAVA_PRIVATE_KEY = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM1ClLhl4dGIg8Uh1mC6lKFMcWUY6oWRPpcSoHK9aq3YG8ujdr5h/PIkc5fJ9fjU69siS4hrJy7FT3DtEcjV7sXc7sij5fGdyPJTcZH5p7YMS0tobej+u2k40XmrWNM39Km7gYpeyOEes/3HExOEsXrXfg0oDJBl+86azSBLTObHAgMBAAECgYA08JI5CRX4G/SYeIS5SAYjn/qzL3z1XCO/hS9ayJ3mHpH0sMFkkxNRRLOHl7BYMFpwl2TR14kwl/VIU+y9VugRK6Se/gdJ/jwGiMdVkO6tGD7s8TwLcgNjAVbwpZCq40h8dQazzyIsPxyww4AP9fQlo5x3eY9v8icw+U58fj4FcQJBAPk4PPCy54ZHMqSTl4E1z+QzZ51z07PFIbGsT/oAg9GOwFjrPjOTQDEPp3cBeAlKmWdUVAjdGYExwuCw4EkG/XkCQQDS2Cx09pwNwMWIN+u3CVneECXS3iUiRPGJkbliFczwjByk3DnBMW15wGNVtJfsM7YFOIir+hW+QfbCKSBjxTY/AkEArPam9LZ1kO/g6e+0+mwKeGpkwxYcG2v5UoIwj2XEFrBoNk4twUW1C1e99g4C7Q/lH52bJPuuM8gBZEfdoVFEoQJBALZ4CPlsVx973jeGFcPBHvoURXeZcs+WlOY2rBYbwdHHoB54zK7KZPECM7V/Zh8vnW4lP/p9owWVtsTPrM1LZicCQDhgvSmpBy0QoUI+wPS9l+YYuLc2loGoWU97RiFbgKqXBexnSg4UHfU8Ot6N4VbIWEhOZV27P0ktsI3UfjGNS6s="
// 鐢熸垚闅忔満涓?
function generateRandomString(length) {
var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; // 鍖呭惈鎵€鏈夊瓧姣嶅拰鏁板瓧鐨勫瓧绗﹂泦鍚?
var result = '';
for (var i = 0; i < length; i++) {
var randomIndex = Math.floor(Math.random() * chars.length); // 鑾峰彇闅忔満绱㈠紩鍊?
var charAtIndex = chars[randomIndex]; // 鏍规嵁绱㈠紩鍊间粠瀛楃闆嗗悎涓€夋嫨瀵瑰簲鐨勫瓧绗?
result += charAtIndex; // 灏嗗瓧绗︽坊鍔犲埌鏈€缁堢粨鏋滀腑
}
return result;
}
// 鍙傛暟瀛楀吀琛ㄦ帓搴?
function sortedKeys(obj) {
let keys = Object.keys(obj).sort();
let res = {}
keys.forEach(key => {
res[key] = obj[key]
})
return res
}
function generateRsaKeyWithPKCS8() {
const keyPair = JsRsaSign.KEYUTIL.generateKeypair("RSA", 1024);
const privateKey = JsRsaSign.KEYUTIL.getPEM(keyPair.prvKeyObj, "PKCS8PRV");
const publicKey = JsRsaSign.KEYUTIL.getPEM(keyPair.pubKeyObj);
return { privateKey, publicKey };
}
const { privateKey, publicKey } = generateRsaKeyWithPKCS8()
function objToStr(data) {
let str = ""
for (let i in data) {
str += `${i}=${data[i]}&`
}
str = str.slice(0, str.length - 1)
return str
}
// 鐢熸垚绛惧悕
function getSign(data) {
const signature = new JsRsaSign.KJUR.crypto.Signature({
alg: "SHA1withRSA",
});
signature.init("-----BEGIN PRIVATE KEY-----" + PRIVATE_KEY + "-----END PRIVATE KEY-----");
let sortData = sortedKeys(data)
let str = objToStr(sortData)
signature.updateString(str);
return JsRsaSign.hextob64(signature.sign());
}
function getKey() {
const encryptor = new JSEncrypt()
encryptor.setPublicKey("-----BEGIN PUBLIC KEY-----" + JAVA_PUBLIC_KEY + "-----END PUBLIC KEY-----") // 璁剧疆鍏挜
return encryptor
}
// 鐢熸垚鍔犲瘑
function entryData(data) {
let encryptor = getKey();
let str = objToStr(data)
return encryptor.encryptLong(str); // 璋冪敤灏佽鐨勬柟娉?
}
// 瑙e瘑
function decrypt(data) {
const encryptor = new JSEncrypt()
encryptor.setPrivateKey(PRIVATE_KEY)
return encryptor.decryptLong(data)
}
let sign = getSign(body)
let timestamp = new Date().getTime()
return entryData({
sign: sign,
timestamp: timestamp
})
//from by https://www.heyejk.com/game
/*const t = body
const { KJUR, hextob64 } = require("jsrsasign")
global['window'] = {}
global['navigator'] = {}
const { JSEncrypt } = require("encryptlong")
const te = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKIGSy/bFo4l1JZuVpNCX3ccjf3eBgeooWzz0QgUFZhKZhJX7PxdfMw79fKjwR5ZGkCNPlO4F/TA3jrtoHHeewN8l3t7f63EFLud/5Ls3KOfHHYnkAo9bHWBWav84XdparGD4M8IHtq9qSGP6nRCOgnt4yqAmX8dJfYp9vr87cn3AgMBAAECgYEAlwzbB5Bu5LKsEFppZ/wW2ArM7YIRiQ5TACoGFEv1HfcuVaeXDmdxs02rKzwzDEHxUYDcPFyCKPGtvK5QSBgsAUUBHb6uu0fNGUccGX31NRAfLuQ8fj3W0uvkoYlpDARuokDHhWNqWzI6f8bFHkewJwpjXCO8w1WkogTLiX9Gu3ECQQDd5J4jEDS5+7KaohYRoryyX939mzsZ4RC6ufsfzTJwSlnLyYHEbm0Cs+7gbBxRrioqApBMQPIIoa5ujm1C88MNAkEAuu3htlbpR1ZL9b3wUuf3el/D3i/k9XvSChfHQ1q46Y/eck2yEDH9Kv/ZUxEl4fR8mB2MONm9oc2l+chPd9uQEwJBALcWuNU9vgPoB0tIiuUqXoDgUY+80ltcNi2c3/Uxn3jAIK/iKU0nwJMGXQiYrBVJnEjlrKL+w7cTkZZvtwATmtECQC2JV4vQvkFHj3eMzqeTpKDmBVPx/OekQzV8N2l8B0G2b20O6kqxssevzeRDcCQMJ/HyeL88o8pvy3f+yQUcsosCQQDZXV8K7Ek0R/V3dAdUzoetFSlfjCGy9QKPruz7m+iXBASxiA0R7YGfJzc8jWpuv0pxujtB/awy22K/ggLAhkZU",
ne = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNQpS4ZeHRiIPFIdZgupShTHFlGOqFkT6XEqByvWqt2BvLo3a+YfzyJHOXyfX41OvbIkuIaycuxU9w7RHI1e7F3O7Io+XxncjyU3GR+ae2DEtLaG3o/rtpONF5q1jTN/Spu4GKXsjhHrP9xxMThLF6134NKAyQZfvOms0gS0zmxwIDAQAB";
let n = le(t)
let o = (new Date).getTime()
return he({ sign: n, timestamp: o })
function ae(e) { let t = Object.keys(e).sort(), n = {}; return t.forEach(t => { n[t] = e[t] }), n }
function de() { const e = new JSEncrypt(); return e.setPublicKey("-----BEGIN PUBLIC KEY-----" + ne + "-----END PUBLIC KEY-----"), e }
function ce(e) { let t = ""; for (let n in e) t += `${n}=${e[n]}&`; return t = t.slice(0, t.length - 1), t }
function he(e) { let t = de(), n = ce(e); return t.encryptLong(n) }
function le(e) { const t = new KJUR.crypto.Signature({ alg: "SHA1withRSA" }); t.init("-----BEGIN PRIVATE KEY-----" + te + "-----END PRIVATE KEY-----"); let n = ae(e), o = ce(n); return t.updateString(o), hextob64(t.sign()) }*/
}
}
!(async () => {
await getNotice().catch(e => $.log(`[Notice失败] ${e.message}`))
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(async () => {
try {
await $.done();
} catch (e) {
console.log(e.message || e);
process.exit(1);
}
});
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,155 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%93%9D%E5%BC%8F%E5%AE%A0%E7%89%A9.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%93%9D%E5%BC%8F%E5%AE%A0%E7%89%A9.py
# Repo: jdqlscript/toulu
# Path: 蓝式宠物.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 57deb499db66cd7527a32970d8d8967f5eb20047bf7e5cf43e4f8b2a1d1c5013
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
#入口:蓝氏宠物微信小程序
#抓包api.vshop.hchiv.cn域名下的authorization值去掉开头的Bearer放到环境变量LSCW
import os
import requests
import json
import time
# 定义获取公告的函数
def get_proclamation():
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
backup_url = "https://tfapi.cn/TL/tl.json"
try:
response = requests.get(primary_url, timeout=10)
if response.status_code == 200:
print("📢 公告信息")
print("=" * 45)
print(response.text)
print("=" * 45 + "\n")
print("公告获取成功,开始执行任务...\n")
return
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}, 尝试备用链接...")
try:
response = requests.get(backup_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 14)
print("📢 公告信息")
print("=" * 45)
print(response.text)
print("=" * 45 + "\n")
print("公告获取成功,开始执行任务...\n")
else:
print(f"⚠️ 获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")
# 从环境变量获取 authorization 值,多账号用 & 分割
def main():
authorization_values = os.getenv('LSCW')
if authorization_values is None:
print("❌ 未设置账号信息请添加LSCW环境变量")
return
authorization_list = authorization_values.split('&')
# 设置请求的 URL 和参数
url = "https://api.vshop.hchiv.cn/jfmb/api/play-default/sign/add-sign-new.do"
params = {
"sideType": "3",
"appId": "wxb7a9c0dd9a2fcc53",
"shopNick": "wxb7a9c0dd9a2fcc53",
"guideNo": "",
"securePlatId": "8d8dd596f26a3c933c9f587fe7188228e9fa6b1d10508bad562285ebfb7ee442"
}
# 设置请求头模板
headers_template = {
"Host": "api.vshop.hchiv.cn",
"content-type": "application/json",
"appenv": "test",
"charset": "utf-8",
"accept-encoding": "gzip, deflate, br"
}
# 设置请求体模板
payload_template = {
"appId": "wxb7a9c0dd9a2fcc53",
"openId": True,
"shopNick": "",
"interfaceSource": 0,
"activityId": "158245"
}
# 初始化一个计数器,用于给账号编号
account_counter = 1
# 获取当前时间戳(毫秒级别)
current_timestamp = int(time.time() * 1000)
# 打印开始分隔线
print('=' * 45)
print(f"开始签到任务,共 {len(authorization_list)} 个账号")
print('=' * 45)
# 遍历每个账号的 authorization 值
for auth_value in authorization_list:
print(f"\n🚀 正在处理账号{account_counter}...")
print('=' * 45)
# 构造请求头
headers = headers_template.copy()
headers["authorization"] = f"Bearer {auth_value}"
# 构造请求体,包含动态生成的时间戳
payload = payload_template.copy()
payload["timestamp"] = current_timestamp # 将当前时间戳添加到请求体
# 发送 POST 请求
try:
response = requests.post(url, params=params, headers=headers, data=json.dumps(payload))
# 检查响应状态码
if response.status_code == 200:
# 解析返回的 JSON 数据
response_data = response.json()
# 根据返回的 JSON 数据判断签到结果
if response_data.get('success') is True:
if response_data.get('data', {}).get('result') == 'success':
# 签到成功,获取能量值
integral = response_data.get('data', {}).get('integral', 0)
integral_alias = response_data.get('data', {}).get('integralAlias', '')
print(f"🎉 账号{account_counter}签到成功!获得{integral}{integral_alias}")
elif response_data.get('data', {}).get('result') == 'error' and response_data.get('data', {}).get('message') == '已签到':
# 已经签到过
print(f"🎯 账号{account_counter}今日已签到")
else:
# 其他成功但需要关注的情况
print(f"⚠️ 账号{account_counter}签到状态不明,请检查返回数据:{response.text}")
else:
# 服务器返回成功为 false
error_message = response_data.get('errorMessage', '未知错误')
print(f"❌ 账号{account_counter}签到失败,错误信息:{error_message}")
else:
# 服务器返回非 200 状态码
print(f"❌ 账号{account_counter}签到失败,状态码:{response.status_code}")
print(f"服务器响应内容:{response.text}")
except requests.exceptions.RequestException as e:
# 捕获请求异常
print(f"❌ 账号{account_counter}签到失败,错误信息:{e}")
# 增加计数器
account_counter += 1
# 打印结束分隔线
print('\n' + '=' * 45)
print("签到任务完成")
print('=' * 45)
# 执行公告获取函数,再执行签到任务
get_proclamation()
main()

View File

@@ -0,0 +1,314 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/mxbc.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/mxbc.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/mxbc.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 68b9441aeb9c8765dc6ca01576fe2a09c0f6d010563dd65d9061e29e9fcffc93
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 蜜雪冰城APP/小程序
cron: 30 8 * * *
------------------------------------------
#Notice:
抓https://mxsa.mxbc.net 请求头Access-Token 多账号&或换行
变量名mxbc
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("蜜雪冰城");
let ckName = `mxbc`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.ck = this.user[0];
this.activityOrigin = ""
this.activityUrl = ""
}
async run() {
await this.user_info()
await this.getLoginUrl()
if (this.activityOrigin) {
await this.getActivityToken()
await this.activityIndex()
}
}
async user_info() {
let time = Date.now()
try {
let options = {
url: `https://mxsa.mxbc.net/api/v1/customer/info?appId=d82be6bbc1da11eb9dd000163e122ecb&t=${time}&sign=${this.getSHA256withRSA('appId=d82be6bbc1da11eb9dd000163e122ecb&t=' + time)}`,
headers: {
'Host': 'mxsa.mxbc.net',
'Connection': 'keep-alive',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 MicroMessenger/7.0.4.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF',
'xweb_xhr': 1,
'Access-Token': this.ck,
'Content-Type': 'application/json',
'Accept': '*/*',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wx7696c66d2245d107/59/page-frame.html',
'Accept-Language': 'en-us,en',
'Accept-Encoding': 'gzip, deflate',
}
}
let { data: result } = await axios.request(options);
if (result.code == 0) {
$.log(`账号[${this.index}] 用户CK有效: [${result.data.mobilePhone}] 雪王币剩余[${result.data.customerPoint}]`);
this.ckStatus = true
} else {
$.log(`账号[${this.index}] 用户CK失效:,原因未知!`);
this.ckStatus = false
console.log(result);
}
} catch (e) {
}
}
async getLoginUrl() {
try {
let timestamp = Date.now();
const options = {
method: 'GET',
url: `https://mxsa.mxbc.net/api/v1/duiba/getLoginUrl`,
params: {
"appId": "d82be6bbc1da11eb9dd000163e122ecb",
"t": timestamp,
"sign": this.getSHA256withRSA('appId=d82be6bbc1da11eb9dd000163e122ecb&t=' + timestamp)
},
headers: {
'Host': 'mxsa.mxbc.net',
'Connection': 'keep-alive',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 MicroMessenger/7.0.4.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF',
'xweb_xhr': 1,
'Access-Token': '' + this.ck,
'Content-Type': 'application/json',
'Accept': '*/*',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wx7696c66d2245d107/59/page-frame.html',
'Accept-Language': 'en-us,en',
'Accept-Encoding': 'gzip, deflate',
}
};
let { data: res } = await axios.request(options);
if (res?.code == 0) {
this.activityOrigin = new URL(res?.data.loginUrl).origin;
this.activityUrl = res?.data.loginUrl;
return res?.data.loginUrl;
} else {
$.log(`获取跳转Url失败原因未知${res.msg}`);
}
} catch (e) {
$.log(`❌获取跳转Url失败原因为${e}`);
}
}
ObjectKeys2LowerCase(e) { return e = Object.fromEntries(Object.entries(e).map((([e, t]) => [e.toLowerCase(), t]))), new Proxy(e, { get: function (e, t, r) { return Reflect.get(e, t.toLowerCase(), r) }, set: function (e, t, r, n) { return Reflect.set(e, t.toLowerCase(), r, n) } }) }
//获取活动token
async getActivityToken() {
try {
const opts = {
method: "GET",
url: this.activityUrl,
maxRedirects: 0,
// 关键点 2: 默认 Axios 认为非 2xx 是错误,需定义 302 为合法状态
validateStatus: function (status) {
return status >= 200 && status < 400; // 允许 302 (或 3xx) 进入 .then
},
headers: {}
}
let res = await axios.request(opts);
let headers = this.ObjectKeys2LowerCase(res?.headers);
//对青龙进行兼容
let session = Array.isArray(headers['set-cookie']) ? [...new Set(headers['set-cookie'])].join("") : headers['set-cookie'];
let [wdata4, w_ts, _ac, wdata3, dcustom] = session.match(/(wdata4|w_ts|_ac|wdata3|dcustom)=.+?;/g)
this.session = wdata4 + w_ts + _ac + wdata3 + dcustom;
$.log(`✅ 获取活动token成功`)
} catch (e) {
$.log(`⛔️ 获取活动token失败${e}`);
}
}
async activityIndex() {
try {
const opts = {
url: this.activityOrigin + "/chome/index",
params: {
from: "login",
spm: "76177.1.1.1"
},
headers: {
'Cookie': this.session,
'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X)mxsa_mxbc`,
}
}
await axios.request(opts);
$.log(`✅ 访问雪王铺:调用成功!`);
} catch (e) {
$.log(`⛔️ 访问雪王铺:调用失败!${e}`);
}
}
async task_signin() {
try {
let time = Date.now()
let options = {
url: `https://mxsa.mxbc.net/api/v1/customer/signin?appId=d82be6bbc1da11eb9dd000163e122ecb&t=${time}&sign=${this.getSHA256withRSA('appId=d82be6bbc1da11eb9dd000163e122ecb&t=' + time)}`,
headers: {
'Host': 'mxsa.mxbc.net',
'Connection': 'keep-alive',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 MicroMessenger/7.0.4.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF',
'xweb_xhr': 1,
'Access-Token': this.ck,
'Content-Type': 'application/json',
'Accept': '*/*',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wx7696c66d2245d107/59/page-frame.html',
'Accept-Language': 'en-us,en',
'Accept-Encoding': 'gzip, deflate',
}
}
//console.log(options);
let { data: result } = await axios.request(options);
//console.log(result);
if (result.code == 0) {
$.log(`账号[${this.index}] 签到成功:累计签到 [${result.data.ruleValueGrowth}]天 本次获得[${result.data.ruleValuePoint}]币`);
this.ckStatus = true
} else {
$.log(`账号[${this.index}] 签到:失败 ❌ 了呢,原因未知!`);
console.log(result);
}
} catch (e) {
console.log(e);
}
}
getSHA256withRSA(content) {
var rs = require("jsrsasign");
var privateKeyString = `-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCtypUdHZJKlQ9L
L6lIJSphnhqjke7HclgWuWDRWvzov30du235cCm13mqJ3zziqLCwstdQkuXo9sOP
Ih94t6nzBHTuqYA1whrUnQrKfv9X4/h3QVkzwT+xWflE+KubJZoe+daLKkDeZjVW
nUku8ov0E5vwADACfntEhAwiSZUALX9UgNDTPbj5ESeII+VztZ/KOFsRHMTfDb1G
IR/dAc1mL5uYbh0h2Fa/fxRPgf7eJOeWGiygesl3CWj0Ue13qwX9PcG7klJXfToI
576MY+A7027a0aZ49QhKnysMGhTdtFCksYG0lwPz3bIR16NvlxNLKanc2h+ILTFQ
bMW/Y3DRAgMBAAECggEBAJGTfX6rE6zX2bzASsu9HhgxKN1VU6/L70/xrtEPp4SL
SpHKO9/S/Y1zpsigr86pQYBx/nxm4KFZewx9p+El7/06AX0djOD7HCB2/+AJq3iC
5NF4cvEwclrsJCqLJqxKPiSuYPGnzji9YvaPwArMb0Ff36KVdaHRMw58kfFys5Y2
HvDqh4x+sgMUS7kSEQT4YDzCDPlAoEFgF9rlXnh0UVS6pZtvq3cR7pR4A9hvDgX9
wU6zn1dGdy4MEXIpckuZkhwbqDLmfoHHeJc5RIjRP7WIRh2CodjetgPFE+SV7Sdj
ECmvYJbet4YLg+Qil0OKR9s9S1BbObgcbC9WxUcrTgECgYEA/Yj8BDfxcsPK5ebE
9N2teBFUJuDcHEuM1xp4/tFisoFH90JZJMkVbO19rddAMmdYLTGivWTyPVsM1+9s
tq/NwsFJWHRUiMK7dttGiXuZry+xvq/SAZoitgI8tXdDXMw7368vatr0g6m7ucBK
jZWxSHjK9/KVquVr7BoXFm+YxaECgYEAr3sgVNbr5ovx17YriTqe1FLTLMD5gPrz
ugJj7nypDYY59hLlkrA/TtWbfzE+vfrN3oRIz5OMi9iFk3KXFVJMjGg+M5eO9Y8m
14e791/q1jUuuUH4mc6HttNRNh7TdLg/OGKivE+56LEyFPir45zw/dqwQM3jiwIz
yPz/+bzmfTECgYATxrOhwJtc0FjrReznDMOTMgbWYYPJ0TrTLIVzmvGP6vWqG8rI
S8cYEA5VmQyw4c7G97AyBcW/c3K1BT/9oAj0wA7wj2JoqIfm5YPDBZkfSSEcNqqy
5Ur/13zUytC+VE/3SrrwItQf0QWLn6wxDxQdCw8J+CokgnDAoehbH6lTAQKBgQCE
67T/zpR9279i8CBmIDszBVHkcoALzQtU+H6NpWvATM4WsRWoWUx7AJ56Z+joqtPK
G1WztkYdn/L+TyxWADLvn/6Nwd2N79MyKyScKtGNVFeCCJCwoJp4R/UaE5uErBNn
OH+gOJvPwHj5HavGC5kYENC1Jb+YCiEDu3CB0S6d4QKBgQDGYGEFMZYWqO6+LrfQ
ZNDBLCI2G4+UFP+8ZEuBKy5NkDVqXQhHRbqr9S/OkFu+kEjHLuYSpQsclh6XSDks
5x/hQJNQszLPJoxvGECvz5TN2lJhuyCupS50aGKGqTxKYtiPHpWa8jZyjmanMKnE
dOGyw/X4SFyodv8AEloqd81yGg==
-----END PRIVATE KEY-----
`;
const key = rs.KEYUTIL.getKey(privateKeyString);
const signature = new rs.KJUR.crypto.Signature({ alg: "SHA256withRSA" });
signature.init(key);
signature.updateString(content);
const originSign = signature.sign();
const sign64u = rs.hextob64u(originSign);
return sign64u;
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,209 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/tslj.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/tslj.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/tslj.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 28f4e466af4337269545853bd1d2829e7d314fa4157c0cad82b91a4650303ee7
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
cron: 30 9 * * *
------------------------------------------
#Notice:
谢瑞麟 微信小程序 签到得积分
WeChatCodeServer 填写wx_server_url wx_auth 用于获取code
变量名称tslj
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("谢瑞麟小程序签到");
const WeChatServer = require("./wcs.js");
let ckName = `tslj`;
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 || 'http://192.168.31.196:12081',
appid: 'wx439d0e0cc6742818',
auth: process.env.wx_auth || "your-api-key",
}
);
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = null
this.wcsid = this.user[0]
this.openid = null
this.isSign = false
}
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)
}
if (!this.token) {
$.log(`账号[${this.index}] 获取用户Token失败❌`)
return
}
this.token = 'Bearer ' + this.token
await this.getUserInfo()
if (!this.isSign) await this.doSign()
}
async getUserToken(code) {
let options = {
method: 'POST',
url: `https://tslmember-crm.tslj.com.cn/api/auth/login`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"content-type": "application/json",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249"
}
,
data:
{ "code": code }
}
let {
data: result
} = await axios.request(options);
if (result?.code == '0') {
this.token = result.data.user_info.token
this.openid = result.data.user_info.openid
$.log(`🌸账号[${this.index}] 获取用户Token成功:${this.token}`)
} else {
$.log(`🌸账号[${this.index}] 获取用户Token-失败:${result.msg}`)
}
}
async getUserInfo() {
let options = {
method: 'POST',
url: `https://tslmember-crm.tslj.com.cn/api/user/index`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": "" + this.token + "",
"content-type": "application/x-www-form-urlencoded",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": '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 WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027'
},
data: { "openid": this.openid }
}
let {
data: result
} = await axios.request(options);
if (result?.code == '0') {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `[${result.data.mobile}] 积分[${result.data.integral}]🎉`);
for (let task of result.data.task_list) {
if (task.name == '每日签到') {
this.isSign = task.status
}
}
} else {
$.log(`🌸账号[${this.index}] 获取用户信息-失败:${result.msg}`)
}
}
async doSign() {
let options = {
method: 'POST',
url: `https://tslmember-crm.tslj.com.cn/api/userSignIn/signIn`,
headers: {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"authorization": "" + this.token + "",
"content-type": "application/x-www-form-urlencoded",
"priority": "u=1, i",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site"
},
data: { "openid": `${this.openid}` }
};
let {
data: result
} = await axios.request(options);
if (result?.code == '0') {
//打印签到结果
const { integral, total_days } = result?.data;
$.log(`签到成功, 已连续签到 ${total_days} 天, 获得 ${integral} 积分 🎉`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.msg}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
if (process.env['wx_server_url'] && process.env['wx_auth']) {
for (let user of $.userList) {
await new Task(user).run();
}
} else {
$.log(`${ckName}未配置微信SERVER配置 搭建可看仓库目录下的readme.md❌`)
return
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,261 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/guyu.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/guyu.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/guyu.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: ef65b2694b08ab8584d6744f422ffa0748a46025b6316df40aeab472a62e139c
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description:
cron: 30 9 * * 1
------------------------------------------
#Notice:
谷雨 微信小程序 签到得积分
WeChatCodeServer 填写wx_server_url wx_auth 用于获取code
变量名称guyu 名字 授权中心 里面的openid 多个账号用&分割
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const {
Env
} = require("../tools/env")
const $ = new Env("谷雨小程序");
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',
auth: process.env.wx_auth || "",
}
);
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = null
this.wcsid = this.user[0]
this.isSign = false
}
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)
}
if (!this.token) {
$.log(`账号[${this.index}] 获取用户Token失败❌`)
return
}
await this.signIn()
await this.getUserPoints()
}
async getUserToken(code) {
let data = JSON.stringify({
"code": "" + code,
"appid": "wxda948f3be0afc375",
"shopId": null,
"envVersion": "release",
"isEnterpriseWx": false,
"scene": 1168,
"referrerInfo": {
"appId": "wxda948f3be0afc375"
}
});
let options = {
method: 'POST',
url: 'https://mall-mobile-v6.vecrp.com/mobile/wxAppLogin',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF XWEB/50249',
'Content-Type': 'application/json;charset=UTF-8',
'xweb_xhr': '1',
'appid': 'wxda948f3be0afc375',
'token': '',
'Sec-Fetch-Site': 'cross-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://servicewechat.com/wxda948f3be0afc375/65/page-frame.html',
'Accept-Language': 'zh-CN,zh;q=0.9'
},
data: data
};
let {
data: result
} = await axios.request(options);
console.log(result);
if (result?.success) {
this.token = result.result.mobileToken
$.log(`🌸账号[${this.index}] 获取用户Token成功:${this.token}`)
} else {
$.log(`🌸账号[${this.index}] 获取用户Token-失败:${result.message}`)
}
}
sha1(str) {
return require("crypto").createHash("sha1").update(str).digest("hex");
}
request(options) {
var sign,
n = void 0
, d = {},
l = "R6WbJ830wNsEdjH9GumwKYiYxHz0K9QD",
n = (new Date).getTime(),
d = "post" === options.method || "POST" === options.method ? {
body: JSON.stringify(options.data),
secretKey: l,
ts: n
} : Object.assign({}, options.params, {
secretKey: l,
ts: n
}),
sign = this.sha1(function (e) {
var t, a = [];
for (t in e) {
var r = t + e[t];
a.push(r)
}
a.sort();
var u = "";
return a.map((function (e) {
"" === u ? u = e : u += e
}
)),
u
}(d))
let baseHeaders = {
host: "mall-mobile-v6.vecrp.com",
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"appid": "wxda948f3be0afc375",
"content-type": "application/json;charset=UTF-8",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": "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 WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027",
"sign": "" + sign,
"starttime": "" + n,
"token": "" + this.token,
"ts": "" + n,
"x-tracedid": "" + $.uuid(),
"xweb_xhr": "1",
"Referer": "https://servicewechat.com/wxda948f3be0afc375/65/page-frame.html",
}
options.headers = Object.assign(options.headers, baseHeaders)
return axios.request(options)
}
async signIn() {
let options = {
method: 'POST',
url: `https://mall-mobile-v6.vecrp.com/mobile/activity/sign/sign`,
headers: {},
data: {
activityId: 'cdd30467-abb8-4944-8941-2879aa950a86',
shopId: '100186753',
signDate: $.time(`yyyy-M-dd`),
}
};
let {
data: result
} = await this.request(options);
if (result?.success) {
//打印签到结果
$.log(`🌸账号[${this.index}]` + `签到成功`);
} else {
$.log(`🌸账号[${this.index}] 签到-失败:${result.msg}`)
}
}
async getUserPoints() {
let options = {
method: 'GET',
url: `https://mall-mobile-v6.vecrp.com/mobile/customer/getMyAllPoint`,
params: {
shopId: '100186753'
},
headers: {},
}
let {
data: result
} = await this.request(options);
if (result?.success) {
$.log(`账号[${this.index}]` + `积分:${result.result[0].score}`);
} else {
$.log(`账号[${this.index}] 获取积分-失败:${result.msg}`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
if (process.env['wx_server_url'] && process.env['wx_auth']) {
for (let user of $.userList) {
await new Task(user).run();
}
} else {
$.log(`${ckName}未配置微信SERVER配置 搭建可看仓库目录下的readme.md❌`)
return
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout: 3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) { }
}

View File

@@ -0,0 +1,84 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%BE%BE%E7%BE%8E%E4%B9%90.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%BE%BE%E7%BE%8E%E4%B9%90.py
# Repo: jdqlscript/toulu
# Path: 达美乐.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: ac7dcacb101c1cc677a6b9c418de1ed3a63c43349c93191d0519d6375d79b3de
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
'''
达美乐,开一把游戏抓取openid的值。
一定要在我的奖品那绑定好手机号!
变量名1dmlck多账号用@隔开。备注信息用#隔开 如openid的值#大帅比
变量名2pzid 填活动id这次是volcano活动ID自己抓
TL库:https://github.com/3288588344/toulu.git
tg频道:https://t.me/TLtoulu
QQ频道:https://pd.qq.com/s/672fku8ge
'''
import os
import time
import requests
import json
import notify
message = ''
# from dotenv import load_dotenv
# load_dotenv()
accounts = os.getenv('dmlck')
pzid = os.getenv('pzid')
if accounts is None:
print('你没有填入ck咋运行')
else:
accounts_list = os.environ.get('dmlck').split('@')
num_of_accounts = len(accounts_list)
print(f"获取到 {num_of_accounts} 个账号")
for i, account in enumerate(accounts_list, start=1):
values = account.split('#')
Cookie = values[0]
account_no = values[1] if len(values) > 1 else ""
print(f"\n=======开始执行账号{i} {account_no}=======")
url = f"https://game.dominos.com.cn/{pzid}/game/gameDone"
payload = f"openid={Cookie}&score=t5%2Bhzvt2h6jpwH7D%2BJkNWvT%2Fb6J2mWDStIgcC4ZSrhkqPEqXtcDrCC9LVFvQLRtGkeVQ7z0W6RYqcXxmeXi9596r4HZ1Pt0E5PpRLYWZZL%2BXQXEpyc0WX8c4ewMqQymjBgGMcSRFp3aaLTDNaRLvLcnnh2t5PpL70pW%2B7LcM8tnhtP1J2rLaTe0Dno7%2B9Qf32LuHUS%2BUXCgQ6YbCJwj%2BWrmhP1zbFvGthkH6HB9lkI9mS%2F%2BY9582WQeFREMF9OflJpRVjgPd1%2FPWFRWKWrl%2F7VGztrHpQLZvLQ9HRINK99cN4FBBvPVkkHxyACadINkuFwxgC9ODPYInHXXpn5iElg%3D%3D"
headers = {
'User-Agent': "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_2 like Mac OS X; sd-PK) AppleWebKit/535.42.7 (KHTML, like Gecko) Version/4.0.5 Mobile/8B111 Safari/6535.42.7",
'Accept-Encoding': "gzip,compress,br,deflate",
'Content-Type': "application/x-www-form-urlencoded",
'charset': "utf-8",
'Referer': "https://servicewechat.com/wx887bf6ad752ca2f3/63/page-frame.html"
}
while True:
shrurl = f"https://game.dominos.com.cn/{pzid}/game/sharingDone"
payload2 = f"openid={Cookie}&from=1&target=0"
res = requests.post(shrurl, data=payload2, headers=headers).json()
if res['errorMessage'] == "今日分享已用完,请明日再来":
print(f'账号{i}分享已达上限,开始抽奖')
break
message +=f"账号{i}"
while True:
response = requests.post(url, data=payload, headers=headers)
response = response.json()
if response["statusCode"] == 0:
prize = response['content']['name']
print(f"\n{prize}")
message += f"\n {prize}"
time.sleep(1)
if response["statusCode"] != 0:
print(response)
err = response['errorMessage']
message += f'\n账号{i}\n {err}'
break
try:
notify.send('达美乐',message)
except Exception as e:
print(e)
print('推送失败')

View File

@@ -0,0 +1,135 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%BE%BE%E7%BE%8E%E4%B9%90%E7%9F%AD%E4%BF%A1%E8%AE%A4%E8%AF%81.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%BE%BE%E7%BE%8E%E4%B9%90%E7%9F%AD%E4%BF%A1%E8%AE%A4%E8%AF%81.py
# Repo: jdqlscript/toulu
# Path: 达美乐短信认证.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 435e1f0c67ba8509a91e02100035261e85faa63adfe9d41b27747e380e0a3b21
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
## 此脚本用于达美乐短信认证,只需要手动进一次游戏界面,不用玩!!!!
## 替换每期GAME_TYPE参数游戏类型
# TL库:https://github.com/3288588344/toulu.git
# tg频道:https://t.me/TLtoulu
# QQ频道:https://pd.qq.com/s/672fku8ge
import requests
# 固定分数
SCORE = "G+oAJ6PkCLjILdZ4ynoxaH4wQGqHQyXKKBe1tD/C6jj/Ew+gBmSGDj60ggw739hvaz0nzfQjha5jA+yBLiBE1smAjOR7xSLt6bR1cCNDiR6VgbfCYF6o19AvuHB64YTgwUQuJcSOP2zODgkjucSo33lwk1NJ82BFmA88v2sjJGLbMisjWWE0mOSeXz6VKNAhoVF8fwfjw79sxeEoUadqHkrpvUOuyswvzHsUJIlFwqD2eRQtffmR0PQNxFKoqttskJWpQTQ73uLYEjJfm9VCUxksVkqhtvzprqib9H4jFunQqQ25zdq09+0ZI6v7fLarKXEkV0/V+WmuEHzHxzHI+Q=="
# 每期游戏类型
GAME_TYPE = "volcano"
# 统一请求头
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13)XWEB/11177",
'Content-Type': "application/x-www-form-urlencoded",
'xweb_xhr': "1",
'Sec-Fetch-Site': "cross-site",
'Sec-Fetch-Mode': "cors",
'Sec-Fetch-Dest': "empty",
'Referer': "https://servicewechat.com/wx887bf6ad752ca2f3/66/page-frame.html",
'Accept-Language': "zh-CN,zh;q=0.9"
}
def post_request(endpoint, payload):
url = f"https://game.dominos.com.cn/{GAME_TYPE}/{endpoint}"
try:
response = requests.post(url, data=payload, headers=headers)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
print(f"请求出现异常: {e}")
return None
def get_temp_id(openid, score):
payload = {'openid': openid, 'score': score, 'tempId': 'null'}
response_data = post_request('game/gameDone', payload)
if response_data:
status_code = response_data.get("statusCode")
if status_code == 10:
tempId = response_data.get("extra", {}).get("tempId")
if tempId:
print(f"成功获取 tempId: {tempId}")
return tempId
else:
print("获取 tempId 失败tempId 为 null")
else:
error_message = response_data.get("errorMessage", "无错误信息")
print(f"获取 tempId 失败,状态码: {status_code}, 信息: {error_message}")
return None
def send_sms(openid, mobile):
payload = {'openid': openid, 'mobile': mobile, 'type': 'null'}
response_data = post_request('sendSMS', payload)
if response_data:
status_code = response_data.get("statusCode")
error_message = response_data.get("errorMessage", "无错误信息")
if status_code == 10:
print(f"手机号码已绑定,错误信息: {error_message},跳过短信验证")
return True # 手机号已绑定,返回 True 表示跳过短信验证
elif status_code == 0:
print("短信发送成功!")
return False # 短信发送成功,返回 False 表示需要进行短信验证
else:
print(f"短信发送失败,状态码: {status_code}")
print(f"错误信息: {error_message}")
print(f"响应: {response_data}")
return False
def verify_code(openid, mobile, verification_code):
payload = {'openid': openid, 'mobile': mobile, 'code': verification_code}
response_data = post_request('verification', payload)
if response_data:
status_code = response_data.get("statusCode")
error_message = response_data.get("errorMessage", "无错误信息")
if status_code == 0:
print("验证码验证成功!")
else:
print(f"验证码验证失败,状态码: {status_code}")
print(f"错误信息: {error_message}")
print(f"响应: {response_data}")
def post_game_done(openid, score, tempId):
payload = {'openid': openid, 'score': score, 'tempId': tempId}
response_data = post_request('game/gameDone', payload)
if response_data:
print(f"游戏认证完成: 响应: {response_data}")
def main():
mobile = input("请输入手机号: ")
openid = input("请输入openid: ")
tempId = get_temp_id(openid, SCORE)
if tempId:
# 如果成功获取到 tempId执行 send_sms
if send_sms(openid, mobile):
# 如果手机号已绑定,直接执行后续任务
print("手机号已绑定")
post_game_done(openid, SCORE, tempId)
else:
# 如果短信发送成功,要求输入验证码进行验证
verification_code = input("请输入验证码: ")
verify_code(openid, mobile, verification_code)
post_game_done(openid, SCORE, tempId)
else:
# 如果未获取到 tempId直接获取短信验证码
if send_sms(openid, mobile):
# 如果手机号已绑定,直接执行后续任务
print("手机号已绑定")
post_game_done(openid, SCORE, 'null') # tempId 为 null因为未获取到 tempId
else:
verification_code = input("请输入验证码: ")
verify_code(openid, mobile, verification_code)
post_game_done(openid, SCORE, 'null') # tempId 为 null因为未获取到 tempId
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,263 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E9%80%91%E7%BE%8EAnd%E8%96%87%E8%AF%BA%E5%A8%9C%E4%B8%93%E6%9F%9C%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E9%80%91%E7%BE%8EAnd%E8%96%87%E8%AF%BA%E5%A8%9C%E4%B8%93%E6%9F%9C%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Repo: jdqlscript/toulu
// # Path: 逑美And薇诺娜专柜小程序.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 5e1421f703c649d97b345bae34bcb0dc104d9f509911575d3cd2a1aff7de206e
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: SMALLFAWN
@Date: 2024.06.10 13:34
@Description: 逑美小程序&薇诺娜专柜商城(薇诺娜旗下小程序)
------------------------------------------
变量名qiumei_weinuona
变量值 逑美小程序https://api.qiumeiapp.com/common-activity 域名下POST请求体 Body中appUserToken的值
薇诺娜专柜商城小程序https://api.qiumeiapp.com/zg-activity/ 域名下POST请求体 Body中appUserToken的值
两个值用#连接 多账号&或换行或新建同名变量
[Script]
http-response
[MITM]
hostname =
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const $ = new Env("逑美/薇诺娜专柜小程序");
let ckName = `qiumei_weinuona`;
let userCookie = checkEnv(
($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""
);
const notify = $.isNode() ? require("./sendNotify") : "";
!(async () => {
console.log(
`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n==================================================`
);
//console.log(userCookie)
if (!userCookie?.length) return console.log(`没有找到CK哦`);
let index = 1;
let strSplitor = "#";
for (let user of userCookie) {
$.log(`\n🚀 user:【${index}】 start work\n`);
index++
$.token = user.split(strSplitor)[0]
$.token1 = user.split(strSplitor)[1]
$.ckStatus = false;
$.batchCode = null
await getWmcMemberInfo()
if ($.ckStatus) {
await getSigninBatch()
if ($.batchCode) {
await getUserSigninInfo()
}
}
if($.token1){
await userSignin1()
}
}
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function userSignin() {
let config = {
url: "https://api.qiumeiapp.com/common-activity/signin/userSignin",
method: "POST",
headers: {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
'Referer': 'https://servicewechat.com/wx30cc0fb02a84eb74/215/page-frame.html',
'Referrer-Policy': 'unsafe-url'
},
data: JSON.stringify({
appUserToken: $.token,
batchCode: $.batchCode
})
}
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`签到成功[${result.data.prizeName}]`)
} else {
$.log(`签到失败[${result.msg}]`)
}
}
async function userSignin1() {
let config = {
url: "https://api.qiumeiapp.com/zg-activity/zg-daily/zgSigninNew",
method: "POST",
headers: {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
'Referer': 'https://servicewechat.com/wx250394ab3f680bfa/554/page-frame.html',
'Referrer-Policy': 'unsafe-url'
},
data: JSON.stringify({
appUserToken: $.token1,
})
}
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`薇诺娜专柜/ 签到成功`)
} else {
$.log(`薇诺娜专柜/ 签到失败[${result.msg}]`)
}
}
async function getUserSigninInfo() {
let config = {
url: "https://api.qiumeiapp.com/common-activity/signin/getUserSigninInfo",
method: "POST",
headers: {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
'Referer': 'https://servicewechat.com/wx30cc0fb02a84eb74/215/page-frame.html',
'Referrer-Policy': 'unsafe-url'
},
data: JSON.stringify({
appUserToken: $.token,
batchCode: $.batchCode
})
}
let { data: result } = await Request(config)
if (result?.code == 200) {
if (result.data.runningDays !== 1) {
$.log(`未签到 ===> 签到ing`)
await userSignin()
} else {
$.log(`已签到 ===> 跳过签到`)
}
} else {
$.log(`获取签到信息失败[${result.msg}]`)
}
}
async function getWmcMemberInfo() {
let config = {
url: "https://api.qiumeiapp.com/qmxcx/10001/getWmcMemberInfo",
method: "POST",
headers: {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
'Referer': 'https://servicewechat.com/wx30cc0fb02a84eb74/215/page-frame.html',
'Referrer-Policy': 'unsafe-url'
},
data: JSON.stringify({
appUserToken: $.token,
})
}
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`[${result.data.mobile}] 积分[${result.data.winonaPoint}}]`)
$.ckStatus = true
} else {
$.log(`获取用户信息失败[${result.msg}]`)
}
}
async function getSigninBatch() {
let config = {
url: "https://api.qiumeiapp.com/common-activity/signin/getSigninBatch",
method: "POST",
headers: {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'xweb_xhr': '1',
'Referer': 'https://servicewechat.com/wx30cc0fb02a84eb74/215/page-frame.html',
'Referrer-Policy': 'unsafe-url'
},
data: JSON.stringify({
appId: "wmcenter-1b60-11e8-98b9-7cd30ae08066"
})
}
let { data: result } = await Request(config)
if (result?.code == 200) {
$.log(`本次签到batchCode为[${result.data.signinBatchCode}]`)
$.batchCode = result.data.signinBatchCode
} else {
$.log(`获取签到batchCode失败[${result.msg}]`)
}
}
function checkEnv(userCookie) {
const envSplitor = ["&", "\n"];
//console.log(userCookie);
let userList = userCookie
.split(envSplitor.find((o) => userCookie.includes(o)) || "&")
.filter((n) => n);
console.log(`共找到${userList.length}个账号`);
return userList;
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { this.name = t; this.logs = []; this.logSeparator = "\n"; this.startTime = new Date().getTime(); Object.assign(this, s); this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === "object" ? JSON.stringify(value) : value}`).join("&") } getURLParams(url) { const params = {}; const queryString = url.split("?")[1]; if (queryString) { const paramPairs = queryString.split("&"); paramPairs.forEach((pair) => { const [key, value] = pair.split("="); params[key] = value }) } return params } isJSONString(str) { try { return JSON.parse(str) && typeof JSON.parse(str) === "object" } catch (e) { return false } } isJson(obj) { var isjson = typeof obj == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; return isjson } async sendMsg(message) { if (!message) return; if (this.isNode()) { await notify.sendNotify(this.name, message) } else { this.msg(this.name, "", message) } } randomNumber(length) { const characters = "0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } randomString(length) { const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join("") } uuid() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; return v.toString(16) }) } time(t) { let s = { "M+": new Date().getMonth() + 1, "d+": new Date().getDate(), "H+": new Date().getHours(), "m+": new Date().getMinutes(), "s+": new Date().getSeconds(), "q+": Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) { new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))) } return t } msg(title = t, subtitle = "", body = "", options) { const formatOptions = (options) => { if (!options) { return options } else if (typeof options === "string") { if (this.isQuanX()) { return { "open-url": options } } else { return undefined } } else if (typeof options === "object" && (options["open-url"] || options["media-url"])) { if (this.isQuanX()) { return options } else { return undefined } } else { return undefined } }; if (!this.isMute) { if (this.isQuanX()) { $notify(title, subtitle, body, formatOptions(options)) } } let logs = ["", "==============📣系统通知📣=============="]; logs.push(title); subtitle ? logs.push(subtitle) : ""; body ? logs.push(body) : ""; console.log(logs.join("\n")); this.logs = this.logs.concat(logs) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, s) { const e = !this.isQuanX(); e ? this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name},\u9519\u8bef!`, t) } wait(t) { return new Promise((s) => setTimeout(s, t)) } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2`); this.log(); if (this.isNode()) { process.exit(1) } if (this.isQuanX()) { $done(t) } } })(t, s) }
async function Request(options) {
if ($.isNode()) {
const axios = require("axios");
Request = async (options) => {
try {
return await axios.request(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
if ($.isQuanX()) {
Request = async (options) => {
try {
return await $task.fetch(options);
} catch (error) {
return error && error.error ? error.error : "请求失败";
}
};
}
return await Request(options);
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,144 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/fsdlb.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/fsdlb.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/fsdlb.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: c9dc848cba4a86dddf42506acc314a0f9fdcf1babc95f32fb05e0eaeaf7e8d68
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: fsdlb 微信小程序逢三得利吧 签到积分
cron: 30 9 * * *
------------------------------------------
#Notice:
https://xiaodian.miyatech.com 小程序逢三得利吧签到积分使用前请先获取token方法如下
打开微信,进入逢三得利吧小程序,点击右下角“我的”,
打开抓包软件抓取https://xiaodian.miyatech.com 请求头的Authorization
抓取到的Authorization值即为token去掉前面的"bearer "将剩余部分作为token使用。
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("逢三得利吧小程序");
let ckName = `fsdlb`;
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"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = "bearer " + this.user[0];
}
async run() {
await this.info()
await this.signIn()
}
async signIn() {
let options = {
method: 'POST',
url: `https://xiaodian.miyatech.com/api/coupon/auth/signIn`,
headers: {
"X-VERSION": "2.1.3",
"Authorization": `${this.token}`,
"HH-VERSION": "0.2.8",
"HH-FROM": "20230130307725",
"HH-APP": "wxb33ed03c6c715482",
"HH-CI": "saas-wechat-app",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
},
data: {
"miniappId": 159
}
}
let { data: result } = await axios.request(options)
if (result?.code == 200) {
//打印签到结果
$.log(`🕊账号[${this.index}] 签到成功:[${result.data.integralToastText}]🎉`);
} else {
$.log(`🕊账号[${this.index}] 签到失败:${result.msg}🚫`)
}
}
async info() {
let options = {
method: 'GET',
url: `https://xiaodian.miyatech.com/api/user/auth/member/integral/union/flow/list?pageNo=1&pageSize=10&dataType=SCORE`,
headers: {
"X-VERSION": "2.1.3",
"Authorization": `${this.token}`,
"HH-VERSION": "0.2.8",
"HH-FROM": "20230130307725",
"HH-APP": "wxb33ed03c6c715482",
"HH-CI": "saas-wechat-app",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
},
}
let { data: result } = await axios.request(options)
if (result?.code == 200) {
$.log(`🕊账号[${this.index}] 查询成功:总积分[${result.data.totalScore}]🎉`);
} else {
$.log(`🕊账号[${this.index}] 查询失败:${result.msg}🚫`)
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,115 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E9%85%B7%E7%93%9C.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E9%85%B7%E7%93%9C.py
# Repo: jdqlscript/toulu
# Path: 酷瓜.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: f2c605f703d051b8fd8f1cdb429524d6e15f8dc3de3a5cc336a70ed031b4ebf0
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
"""
酷瓜
每天0.1毛抓refreshToken,openid,appid就可以了(首次登陆才有这个包没抓到重新进入去抓)
分隔符#多账户换行
有问题联系3288588344
频道https://pd.qq.com/s/672fku8ge
"""
import os
import requests
import time
import random
response = requests.get("https://raw.githubusercontent.com/3288588344/toulu/main/tl.txt")
response.encoding = 'utf-8'
txt = response.text
print(txt)
def refresh_token(refreshToken):
url = "https://www.kugua.com/wxapp/refreshToken"
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220099 MMWEBSDK/20240404 MMWEBID/2307 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"Content-Type": "application/json"
}
data = {
"refresh_token": refreshToken
}
response = requests.post(url, headers=headers, json=data)
json_response = response.json()
if json_response.get('status') == "0000":
token = json_response["data"]["token"]
codemsg = json_response["codemsg"]
print(f"token刷新结果{codemsg},开始执行提现任务")
return token
else:
print("刷新失败检查refresh_token是否过期")
return None
def sign(token, appid, openid):
url = "https://www.kugua.com/wxapp/inflatedv3/popUpRedEnvelopes"
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220099 MMWEBSDK/20240404 MMWEBID/2307 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"Content-Type": "application/json"
}
data = {
"token": token,
"type": 1,
"invite_id": "",
"code_ticket": "",
"count": "",
"appid": appid,
"openid": openid
}
response = requests.post(url, headers=headers, json=data)
json_response = response.json()
if json_response.get('status') == "0000":
codemsg = json_response["codemsg"]
print(f"签到结果{codemsg}")
else:
codemsg = json_response["codemsg"]
print(f"签到失败{codemsg}")
def tx(token, openid, appid):
url = "https://www.kugua.com/wxapp/withdrawal/withdrawal"
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220099 MMWEBSDK/20240404 MMWEBID/2307 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"Content-Type": "application/json"
}
data = {
"token": token,
"withdrawalId": 8,
"appid": appid,
"openid": openid
}
response = requests.post(url, headers=headers, json=data)
json_response = response.json()
if json_response.get('status') == "0000":
amount = json_response["data"]["amount"]
codemsg = json_response["codemsg"]
print(f"提现结果{codemsg},提现后余额还剩{amount}")
else:
codemsg = json_response["codemsg"]
print(f"提现失败{codemsg}")
if __name__ == "__main__":
mkkg = os.environ.get('mkkg')
if not mkkg:
print("请设置环境变量mkkg")
else:
kghw_list = mkkg.split('\n')
for num, kghw_item in enumerate(kghw_list, start=1):
appid, openid, refreshToken = kghw_item.split('#')
print(f"=====开始执行第{num}个账号任务=====")
print("---------开始执行账号刷新---------")
refreshed_token = refresh_token(refreshToken)
if refreshed_token:
print("---------开始执行账号签到---------")
sign(refreshed_token, appid, openid)
time.sleep(random.randint(10, 30))
print("---------开始执行账号提现---------")
tx(refreshed_token, openid, appid)
time.sleep(random.randint(10, 30))
print("---------账号任务执行完毕---------")

Some files were not shown because too many files have changed in this diff Show More