├── 57Box.py ├── 7dian5.py ├── Coca.py ├── aliyunpan.py ├── alyp.js ├── anmuxi.py ├── babycare.js ├── baitianGame.js ├── bhxcy.js ├── bilibili.py ├── bjxd.js ├── bucket.js ├── changhongmeiling.py ├── chaoxinwen.js ├── chery.js ├── cheryev.js ├── cyh.js ├── ddsy_songyao.js ├── dffx.js ├── dfyc.js ├── dianxin.js ├── didi.js ├── dt.js ├── dw.js ├── dwnc.py ├── dydd.py ├── enshan.py ├── exeedcars.js ├── fenxiang.js ├── fsdlb.js ├── ftej.js ├── gjzp.js ├── gqaa.js ├── gqftbz.js ├── gujinggongjiu.js ├── guolejiangjiu.js ├── haitianmeiweiguan.js ├── hfzj.js ├── hl.js ├── hqcsh.js ├── htx.js ├── huangli.js ├── hyjk.js ├── imaotai.py ├── iqiyi.py ├── jetta.js ├── jlqc.js ├── jlyh.js ├── jlzx.js ├── jrttjsb.js ├── kgdzb.js ├── kgyy.js ├── ks_fruit.js ├── ksjsb.js ├── leidaCar.js ├── lenovoapp.js ├── liyingyunjie.js ├── ljfsjlb.js ├── maisiweier.js ├── meituan.js ├── mtf.js ├── musi.js ├── mxbc.js ├── nhsy.js ├── pddFruit.js ├── piaopiaochaoshi.js ├── qbd.js ├── ql.js ├── qtx.js ├── quanmianshidai.py ├── quanzhan.py ├── quzanmi.js ├── ruilanCar.js ├── sendNotify.js ├── sfsy.js ├── shangshaban.js ├── shangzhanwangluo.js ├── smart汽车+.js ├── sysxc.js ├── sysxc.py ├── sytt.js ├── taipingtong.py ├── topspace.py ├── tyqh.js ├── utils.js ├── wangchao.py ├── wnn.js ├── wyyx_app.js ├── xiaosatonglu.js ├── xinxi.js ├── xipigou.js ├── xmly.js ├── xqz.js ├── ycj.js ├── yidongyunpan.py ├── yingsheng_v2.js ├── yinxiang.js ├── ysfqd.js ├── yuebai.js ├── yyq.js ├── zhiwuxingqiu.js ├── 上官新闻.py ├── 中健365.py ├── 仑传.js ├── 卡萨帝签到提现.py ├── 叮叮联盟阅读.js ├── 叮当快药.py ├── 可乐读书.js ├── 品赞HTTP代理签到.js ├── 商战网络.js ├── 多娇江山.js ├── 太平洋知科技.js ├── 悦临平.js ├── 掌上天津极速版.js ├── 掌上瓯海.js ├── 星空穿透签到.py ├── 杜蕾斯会员中心.js ├── 熊猫赚.js ├── 爱海盐.js ├── 猫猫看看.py ├── 王老吉越龙门.js ├── 百观.js ├── 看岱山.js ├── 立白VIP.js ├── 美数.js ├── 蔚来.js ├── 鄞响.js ├── 阅龙湾.js ├── 霸王茶姬抢券.js ├── 鱼儿阅读.js ├── 鸿星尔克.js └── 龙湖U享家.js /57Box.py: -------------------------------------------------------------------------------- 1 | """ 2 | 57Box 1.10 3 | 仅供学习交流,请在下载后的24小时内完全删除 请勿将任何内容用于商业或非法目的,否则后果自负。 4 | Author By Qim肖恩 5 | Updated By Huansheng 6 | 更新说明:修复sign接口问题 7 | 玩法: 8 | 微信小程序 57Box 玩法:完成基础任务抽免费箱子 9 | 登录微信小程序授权手机号然后下载APP设置密码 10 | export BOX_data=手机号@密码 11 | 多账号用'===='隔开 例 账号1====账号2 12 | cron: 0 8 * * * 13 | """ 14 | 15 | import urllib3 16 | 17 | urllib3.disable_warnings() 18 | lottery = 1 # 抽鞋盒开关 1开启 0关闭 19 | enabledTaskAndLottery = True 20 | # 盲盒需要的矿石数量 21 | lotteryBoxPrize = 80 22 | # 进群密码 23 | joinGroupPassword = "123456" 24 | import os 25 | import time 26 | import requests 27 | import datetime 28 | import hashlib 29 | 30 | 31 | def getSign(userId): 32 | def getDate(): 33 | e = datetime.datetime.now() 34 | a = e.year 35 | t = e.month 36 | l = e.day 37 | n = e.weekday() 38 | o = e.hour 39 | i = e.minute 40 | s = e.second 41 | c = int(e.timestamp()) 42 | r = str(e) 43 | return { 44 | "year": a, 45 | "month": t, 46 | "date": l, 47 | "hours": o, 48 | "minute": i, 49 | "second": s, 50 | "day": n, 51 | "timeStamp": c, 52 | "dateDateTime": r, 53 | "dates": r.split(" ")[0].replace("/", "-"), 54 | } 55 | 56 | s = getDate() 57 | c = s["year"] 58 | r = s["month"] 59 | u = s["date"] 60 | d = s["hours"] 61 | m = s["minute"] 62 | v = str(c) + "-" + str(r) + "-" + str(u) + " " + str(d) + ":" + str(m) 63 | currentTime = int(datetime.datetime.strptime(v, "%Y-%m-%d %H:%M").timestamp()) 64 | return hashlib.md5((str(currentTime) + userId + "box57").encode()).hexdigest() 65 | 66 | 67 | # from dotenv import load_dotenv 68 | # 69 | # load_dotenv() 70 | accounts = os.getenv("BOX_data") 71 | print( 72 | "原作者肖恩公告:" + requests.get("http://1.94.61.34:50/index.txt").content.decode("utf-8") 73 | ) 74 | if accounts is None: 75 | print("你没有填入BOX_data,咋运行?") 76 | exit() 77 | accounts_list = accounts.split("====") 78 | num_of_accounts = len(accounts_list) 79 | print(f"获取到 {num_of_accounts} 个账号") 80 | for i, account in enumerate(accounts_list, start=1): 81 | values = account.split("@") 82 | if len(values) == 2: 83 | mobile, password = values[0], values[1] 84 | else: 85 | print(f"\n{'=' * 8}第【{i}】个账号数据有误,请检查!该数据为:{account}") 86 | continue 87 | print(f"\n{'=' * 8}开始执行第【{i}】个账号[{mobile}]{'=' * 8}") 88 | url = "https://www.57box.cn/app/index.php?i=2&t=0&v=1&from=wxapp&c=entry&a=wxapp&do=login&m=greatriver_lottery_operation" 89 | headers = { 90 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Html5Plus/1.0 (Immersed/47) uni-app", 91 | } 92 | 93 | data = { 94 | "mobile": mobile, 95 | "password": password, 96 | "password2": "", 97 | "code": "", 98 | "invite_uid": "0", 99 | "source": "app", 100 | } 101 | 102 | response = requests.post(url, headers=headers, data=data).json() 103 | if response["errno"] == 0: 104 | # print(f"{response['data']}") 105 | print(f"{response['message']}") 106 | token = response["data"]["token"] 107 | print(f"{'=' * 12}获取账号信息{'=' * 12}") 108 | url = f"https://www.57box.cn/app/index.php?i=2&t=0&v=1&from=wxapp&c=entry&a=wxapp&do=getuserinfo&&token={token}" 109 | data = { 110 | "m": "greatriver_lottery_operation", 111 | "title": "", 112 | } 113 | response = requests.post(url, headers=headers, data=data).json() 114 | if response["errno"] == 999: 115 | print(f"{response['message']}") 116 | elif response["errno"] == 0: 117 | userId = response["data"]["id"] 118 | money = response["data"]["money"] 119 | nickname = response["data"]["nickname"] 120 | integral_str = response["data"]["integral"] 121 | try: 122 | integral = int(float(integral_str)) 123 | print(f"Name:{nickname}---矿石余额:{integral}---水晶余额:{money}") 124 | except ValueError: 125 | print(f"无效的integral值: {integral_str}") 126 | else: 127 | print(f"错误未知{response}") 128 | break 129 | if enabledTaskAndLottery: 130 | print(f"{'=' * 12}开始每日任务{'=' * 12}") 131 | sign = getSign(userId) 132 | time.sleep(3) 133 | # 进群密码 134 | answerText = joinGroupPassword 135 | response = requests.get( 136 | f"https://www.57box.cn/app/index.php?i=2&t=0&v=1&from=wxapp&c=entry&a=wxapp&do=uptaskinfo&m=greatriver_lottery_operation&radomstr={sign}&id=26&answer={answerText}&token={token}&source=app", 137 | headers=headers, 138 | ).json() 139 | state = "进群密码" 140 | if response["errno"] == 999: 141 | print(f"{state}---{response['message']}") 142 | elif response["errno"] == 0: 143 | print(f"{state}---{response['message']}") 144 | else: 145 | print(f"{state}错误未知{response}") 146 | break 147 | time.sleep(3) 148 | response = requests.get( 149 | f"https://www.57box.cn/app/index.php?i=2&t=0&v=1&from=wxapp&c=entry&a=wxapp&do=uptaskinfo&m=greatriver_lottery_operation&radomstr={sign}&id=30&answer=%E7%94%A8%E4%BA%8E%E5%95%86%E5%9F%8E%E5%92%8C%E6%8A%98%E6%89%A3%E5%95%86%E5%9F%8E%E5%85%91%E6%8D%A2%E5%95%86%E5%93%81&token={token}&source=app", 150 | headers=headers, 151 | ).json() 152 | state = "每日答题(二)" 153 | if response["errno"] == 999: 154 | print(f"{state}---{response['message']}") 155 | elif response["errno"] == 0: 156 | print(f"{state}---{response['message']}") 157 | else: 158 | print(f"{state}错误未知{response}") 159 | break 160 | time.sleep(3) 161 | response = requests.get( 162 | f"https://www.57box.cn/app/index.php?i=2&t=0&v=1&from=wxapp&c=entry&a=wxapp&do=uptaskinfo&m=greatriver_lottery_operation&radomstr={sign}&id=42&answer=%E9%80%9A%E8%BF%87%E5%BC%80%E7%9B%92%E8%8E%B7%E5%BE%97%E6%AF%8F1000%E8%83%BD%E9%87%8F%E7%9F%B3%E5%8F%AF%E4%BB%A5%E5%85%91%E6%8D%A21%E6%B0%B4%E6%99%B6&token={token}&source=app", 163 | headers=headers, 164 | ).json() 165 | state = "每日答题领福利(一)" 166 | if response["errno"] == 999: 167 | print(f"{state}---{response['message']}") 168 | elif response["errno"] == 0: 169 | print(f"{state}---{response['message']}") 170 | else: 171 | print(f"{state}错误未知{response}") 172 | break 173 | print(f"{'=' * 12}获取账号信息{'=' * 12}") 174 | url = f"https://www.57box.cn/app/index.php?i=2&t=0&v=1&from=wxapp&c=entry&a=wxapp&do=getuserinfo&&token={token}" 175 | data = { 176 | "m": "greatriver_lottery_operation", 177 | "title": "", 178 | } 179 | response = requests.post(url, headers=headers, data=data).json() 180 | if response["errno"] == 999: 181 | print(f"{response['message']}") 182 | elif response["errno"] == 0: 183 | # print("response:", response) 184 | money = response["data"]["money"] 185 | nickname = response["data"]["nickname"] 186 | integral_str = response["data"]["integral"] 187 | try: 188 | integral = int(float(integral_str)) 189 | print(f"Name:{nickname}---矿石余额:{integral}---水晶余额:{money}") 190 | except ValueError: 191 | print(f"无效的integral值: {integral_str}") 192 | else: 193 | print(f"错误未知{response}") 194 | break 195 | if lottery == 1: # 开始抽奖 196 | print(f"{'=' * 12}执行开鞋盒{'=' * 12}") 197 | num = integral // lotteryBoxPrize 198 | for i in range(num): 199 | url = "https://www.57box.cn/app/index.php" 200 | params = { 201 | "i": "2", 202 | "t": "0", 203 | "v": "1", 204 | "from": "wxapp", 205 | "c": "entry", 206 | "a": "wxapp", 207 | "do": "openthebox", 208 | "token": token, 209 | "m": "greatriver_lottery_operation", 210 | "box_id": "586", 211 | "paytype": "1", 212 | "answer": "", 213 | "num": 1, 214 | } 215 | res = requests.post(url, headers=headers, data=params) 216 | response = res.json() 217 | if len(response["data"]["prizes_data"]): 218 | print( 219 | f"第{str(i)}次开盲盒结果:", 220 | response["message"], 221 | response["data"]["prizes_data"][0]["complete_prize_title"], 222 | ) 223 | else: 224 | print(f"第{str(i)}次开盲盒结果:", response["data"]["message"]) 225 | if response["errno"] == 0: 226 | complete_prize_title = response["data"]["prizes_data"][0][ 227 | "complete_prize_title" 228 | ] 229 | prize_market_price = response["data"]["prizes_data"][0][ 230 | "prize_market_price" 231 | ] 232 | print( 233 | f"{response['message']}---{complete_prize_title} 市场价:{prize_market_price}" 234 | ) 235 | elif response["errno"] == 999: 236 | print(f"{response['message']}") 237 | else: 238 | print(f"错误未知{response}") 239 | break 240 | print(f"开盲盒操作执行完毕") 241 | if num >= 1: 242 | url = f"https://www.57box.cn/app/index.php?i=2&t=0&v=1&from=wxapp&c=entry&a=wxapp&do=uptaskinfo&&token={token}" 243 | data = { 244 | "m": "greatriver_lottery_operation", 245 | "id": "39", 246 | "answer": "", 247 | } 248 | response = requests.post(url, headers=headers, data=data).json() 249 | state = "开盒看视频领矿石" 250 | if response["errno"] == 999: 251 | print(f"{state}---{response['message']}") 252 | elif response["errno"] == 0: 253 | print(f"{state}---{response['message']}") 254 | else: 255 | print(f"{state}错误未知{response}") 256 | break 257 | else: 258 | print() 259 | 260 | elif lottery == 0: 261 | print(f"{'=' * 12}不执行开鞋盒{'=' * 12}") 262 | 263 | # 查询奖品列表 264 | url = "https://www.57box.cn/app/index.php" 265 | 266 | params = { 267 | "i": "2", 268 | "t": "0", 269 | "v": "1", 270 | "from": "wxapp", 271 | "c": "entry", 272 | "a": "wxapp", 273 | "do": "getmemberprizes", 274 | "token": token, 275 | "m": "greatriver_lottery_operation", 276 | "page": "0", 277 | "type": "1", 278 | "prize_level": "1", 279 | } 280 | 281 | response = requests.get(url, headers=headers, params=params).json() 282 | 283 | all_prizes = response["data"] 284 | accountTotalPrize = 0 285 | for prize in all_prizes: 286 | prize_market_price = prize["prize"]["prize_market_price"] 287 | prize_title = prize["prize"]["complete_prize_title"] 288 | prizes_count = prize["prizes_count"] 289 | print(f"{prize_title} 数量:x{prizes_count} 单价:{prize_market_price}") 290 | accountTotalPrize = accountTotalPrize + float(prize_market_price) * int( 291 | prizes_count 292 | ) 293 | print(f"奖品总价:{accountTotalPrize}") 294 | elif response["errno"] == 999: 295 | print(f"{response['message']}") 296 | else: 297 | print(f"错误未知{response}") 298 | -------------------------------------------------------------------------------- /7dian5.py: -------------------------------------------------------------------------------- 1 | 2 | #微信小程序:七点五饮用天然矿泉水 3 | 4 | 5 | import requests 6 | from os import path 7 | import json 8 | import time 9 | import os 10 | 11 | def load_send(): 12 | cur_path = path.abspath(path.dirname(__file__)) 13 | notify_file = cur_path + "/notify.py" 14 | 15 | if path.exists(notify_file): 16 | try: 17 | from notify import send # 导入模块的send为notify_send 18 | print("加载通知服务成功!") 19 | return send # 返回导入的函数 20 | except ImportError: 21 | print("加载通知服务失败~") 22 | else: 23 | print("加载通知服务失败~") 24 | 25 | return False # 返回False表示未成功加载通知服务 26 | 27 | 28 | 29 | def sign(): 30 | url = "https://h5.youzan.com/wscump/checkin/checkinV2.json?checkinId=3997371" 31 | headers = { 32 | '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", 33 | 'xweb_xhr': "1", 34 | 'extra-data': sid, 35 | 'sec-fetch-site': "cross-site", 36 | 'sec-fetch-mode': "cors", 37 | 'sec-fetch-dest': "empty", 38 | 'referer': "https://servicewechat.com/wx5508c9ab0d2118ff/63/page-frame.html", 39 | 'accept-language': "zh-CN,zh;q=0.9", 40 | 'Cookie': "KDTWEAPPSESSIONID="+sid 41 | } 42 | 43 | response = requests.get(url, headers=headers) 44 | time.sleep(2) 45 | print(response.text) 46 | time.sleep(2) 47 | return response.text 48 | 49 | def jifen(): 50 | url = "https://h5.youzan.com/wscump/pointstore/getCustomerPoints.json" 51 | 52 | headers = { 53 | '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", 54 | 'Cookie': "KDTWEAPPSESSIONID="+sid 55 | } 56 | 57 | response = requests.get(url, headers=headers) 58 | time.sleep(2) 59 | # print(response.text) 60 | try: 61 | xiaoku=json.loads(response.text) 62 | jifen1=str(xiaoku["data"]["currentAmount"]) 63 | print('目前积分为'+jifen1) 64 | time.sleep(2) 65 | 66 | url = "https://h5.youzan.com/wscump/checkin/get_activity_by_yzuid_v2.json?checkinId=3997371" 67 | 68 | headers = { 69 | '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", 70 | 'extra-data': "sid="+sid, 71 | 'Cookie': "KDTWEAPPSESSIONID="+sid 72 | } 73 | 74 | response = requests.get(url, headers=headers) 75 | xiaoku=json.loads(response.text) 76 | print('目前签到天数为'+str(xiaoku["data"]["continuesDay"])) 77 | # print(response.text) 78 | tongzhi='\n目前积分为'+jifen1+'\n签到天数为'+str(xiaoku["data"]["continuesDay"]) 79 | return tongzhi 80 | except: 81 | print('积分查询失败,检查变量是否正确') 82 | 83 | 84 | 85 | if __name__ == "__main__": 86 | var_name='qdwxcxcookie' 87 | values = os.getenv(var_name) 88 | values=values.split('\n') 89 | content='' 90 | for value in values: 91 | beizhu=value.split('#')[0]; 92 | sid=value.split('#')[1]; 93 | print('-------开始' + str(beizhu) + '签到------') 94 | content=content+'\n===='+str(beizhu)+'账号签到情况====\n' 95 | content=content+str(sign()) 96 | print('-------开始' + str(beizhu) + '查询积分------') 97 | content=content+str(jifen()) 98 | content=content+'\n----------------------\n' 99 | # 在load_send中获取导入的send函数 100 | send = load_send() 101 | print() 102 | 103 | 104 | print('------运行结束-------') 105 | content=content+'\n签到10天送100积分,连续20天送20元券,连续30天送25元券,连续45天送七点五饮用天然泉水高端弱碱饮用天然泉水 表白礼物 整箱520ml*15\n' 106 | content=content+'\n所有账号运行完毕\n' 107 | print('签到10天送100积分,连续20天送20元券,连续30天送25元券,连续45天送七点五饮用天然泉水高端弱碱饮用天然泉水 表白礼物 整箱520ml*15') 108 | # 判断send是否可用再进行调用 109 | print() 110 | if send: 111 | send('七点五饮用天然矿泉水签到推送', content) 112 | else: 113 | print('通知服务不可用') 114 | -------------------------------------------------------------------------------- /Coca.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | # @Time : 18:57 3 | # @Author : yuxian 4 | # @Email : 1503889663@qq.com 5 | # @File : Coca.py 6 | # @SoftWare : PyCharm 7 | # 可口可乐吧小程序,抓包authorization(全部内容 copy即可),填入环境变量Coca中,多账号换行或@隔开 8 | import json, os, hashlib, random, time, requests as r 9 | 10 | 11 | def UF(): return f"Mozilla/5.0 (iPhone; CPU iPhone OS {f'{random.randint(12, 15)}.{random.randint(0, 6)}.{random.randint(0, 9)}'} like Mac OS X) AppleWebKit/{f'{random.randint(600, 700)}.{random.randint(1, 4)}.{random.randint(1, 5)}'} (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.20(0x16001422) NetType/WIFI Language/zh_CN" 12 | 13 | 14 | def generate_random_string_and_timestamp(): 15 | T = ''.join(random.choices('0123456789abcdefghijklmnopqrstuvwxyz', k=8)) 16 | d = str(int(time.time() * 1000)) 17 | return T, d 18 | 19 | 20 | def sha256_encrypt(data): 21 | hash_object = hashlib.sha256() 22 | hash_object.update(data.encode('utf-8')) 23 | hex_dig = hash_object.hexdigest() 24 | return hex_dig 25 | 26 | 27 | def get_header(url1): 28 | T, d = generate_random_string_and_timestamp() 29 | message = url1.replace("https://koplus.icoke.cn/cre-bff", "") 30 | encrypted_data = sha256_encrypt(message + T + d + "apyuc3#7%m4*") 31 | headers = {"x-sg-id": T, "x-sg-timestamp": d, "x-sg-signature": encrypted_data} 32 | return headers 33 | 34 | 35 | U = "https://koplus.icoke.cn/cre-bff/wechat/" 36 | P = os.environ.get("Coca") 37 | if P and P != "": 38 | C = P.split("\n") if "\n" in P else P.split("@") 39 | A = 1 40 | for B in C: 41 | try: 42 | H = { 43 | "Host": "koplus.icoke.cn", 44 | "Connection": "keep-alive", 45 | "xweb_xhr": "1", 46 | "Authorization": B, 47 | "User-Agent": UF(), 48 | "Content-Type": "application/json", 49 | "Accept": "*/*", 50 | "Accept-Language": "*", 51 | "Sec-Fetch-Site": "cross-site", 52 | "Sec-Fetch-Mode": "cors", 53 | "Sec-Fetch-Dest": "empty", 54 | "Referer": "https://servicewechat.com/wxa5811e0426a94686/364/page-frame.html", 55 | "Accept-Encoding": "gzip, deflate, br" 56 | } 57 | url = f"{U}checkin" 58 | H.update(get_header(url)) 59 | signReq = r.post(url=url, headers=H) 60 | signResp = json.loads(signReq.text) 61 | print(f"🎉开始签到账号:{A}🎉") 62 | A += 1 63 | if signResp["meta"]["transactionPoint"]: 64 | print(f"⭕签到成功,获得{str(int(signResp['meta']['transactionPoint']) / 10)}个快乐瓶⭕") 65 | elif signResp["meta"]["transactionPoint"] is None: 66 | print("❗今日已签到,请勿重复签到❗") 67 | else: 68 | print("❌出现未知错误,签到失败❌") 69 | time.sleep(3) 70 | url = f"{U}profile" 71 | H.update(get_header(url)) 72 | qReq = r.get(url=url, headers=H) 73 | qResp = json.loads(qReq.text) 74 | print(f"🎉开始查询账号积分🎉") 75 | if qResp["data"]: 76 | print(f"🎆账号快乐瓶总额:{str(int(qResp['data']['point']) / 10)}🎆") 77 | else: 78 | print("❌出现未知错误,查询失败❌") 79 | except: 80 | print("⚠️⚠️⚠️脚本报错执行下一个账号⚠️⚠️⚠️") 81 | -------------------------------------------------------------------------------- /aliyunpan.py: -------------------------------------------------------------------------------- 1 | 2 | import json 3 | import os 4 | 5 | import requests 6 | import urllib3 7 | 8 | from dailycheckin import CheckIn 9 | 10 | urllib3.disable_warnings() 11 | 12 | 13 | class AliYun(CheckIn): 14 | name = "阿里云盘" 15 | 16 | def __init__(self, check_item: dict): 17 | self.check_item = check_item 18 | 19 | def update_token(self, refresh_token): 20 | url = "https://auth.aliyundrive.com/v2/account/token" 21 | data = {"grant_type": "refresh_token", "refresh_token": refresh_token} 22 | response = requests.post(url=url, json=data).json() 23 | access_token = response.get("access_token") 24 | return access_token 25 | 26 | def sign(self, access_token): 27 | url = "https://member.aliyundrive.com/v1/activity/sign_in_list" 28 | headers = {"Authorization": access_token, "Content-Type": "application/json"} 29 | result = requests.post(url=url, headers=headers, json={}).json() 30 | sign_days = result["result"]["signInCount"] 31 | data = {"signInDay": sign_days} 32 | url_reward = "https://member.aliyundrive.com/v1/activity/sign_in_reward" 33 | requests.post(url=url_reward, headers=headers, data=json.dumps(data)) 34 | if "success" in result: 35 | print("签到成功") 36 | for i, j in enumerate(result["result"]["signInLogs"]): 37 | if j["status"] == "miss": 38 | day_json = result["result"]["signInLogs"][i - 1] 39 | if not day_json["isReward"]: 40 | msg = [ 41 | { 42 | "name": "阿里云盘", 43 | "value": "签到成功,今日未获得奖励", 44 | } 45 | ] 46 | else: 47 | msg = [ 48 | { 49 | "name": "累计签到", 50 | "value": result["result"]["signInCount"], 51 | }, 52 | { 53 | "name": "阿里云盘", 54 | "value": "获得奖励:{}{}".format( 55 | day_json["reward"]["name"], 56 | day_json["reward"]["description"], 57 | ), 58 | }, 59 | ] 60 | 61 | return msg 62 | 63 | def main(self): 64 | refresh_token = self.check_item.get("refresh_token") 65 | access_token = self.update_token(refresh_token) 66 | if not access_token: 67 | return [{"name": "阿里云盘", "value": "token 过期"}] 68 | msg = self.sign(access_token) 69 | msg = "\n".join([f"{one.get('name')}: {one.get('value')}" for one in msg]) 70 | return msg 71 | 72 | 73 | if __name__ == "__main__": 74 | with open( 75 | os.path.join(os.path.dirname(os.path.dirname(__file__)), "config.json"), 76 | encoding="utf-8", 77 | ) as f: 78 | datas = json.loads(f.read()) 79 | _check_item = datas.get("ALIYUN", [])[0] 80 | print(AliYun(check_item=_check_item).main()) 81 | -------------------------------------------------------------------------------- /anmuxi.py: -------------------------------------------------------------------------------- 1 | 2 | # !/usr/bin/python3 3 | # -- coding: utf-8 -- 4 | # cron "30 9 * * *" script-path=xxx.py,tag=匹配cron用 5 | # const $ = new Env('安慕希小程序') 6 | import json 7 | import os 8 | import random 9 | import time 10 | from datetime import datetime, time as times 11 | import requests 12 | from requests.packages.urllib3.exceptions import InsecureRequestWarning 13 | # 禁用安全请求警告 14 | requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 15 | 16 | IS_DEV = False 17 | if os.path.isfile('DEV_ENV.py'): 18 | import DEV_ENV 19 | 20 | IS_DEV = True 21 | if os.path.isfile('notify.py'): 22 | from notify import send 23 | 24 | print("加载通知服务成功!") 25 | else: 26 | print("加载通知服务失败!") 27 | send_msg = '' 28 | one_msg = '' 29 | 30 | 31 | def Log(cont=''): 32 | global send_msg, one_msg 33 | print(cont) 34 | if cont: 35 | one_msg += f'{cont}\n' 36 | send_msg += f'{cont}\n' 37 | 38 | 39 | class RUN: 40 | def __init__(self, info, index): 41 | global one_msg 42 | one_msg = '' 43 | split_info = info.split('@') 44 | self.access_token = split_info[0] 45 | len_split_info = len(split_info) 46 | last_info = split_info[len_split_info - 1] 47 | self.send_UID = None 48 | if len_split_info > 0 and "UID_" in last_info: 49 | print('检测到设置了UID') 50 | print(last_info) 51 | self.send_UID = last_info 52 | self.index = index + 1 53 | # print(self.access_token) 54 | self.UA = '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(0x6309080f) XWEB/8555' 55 | # if ENV_NAME == 'YL_ZXBQL': 56 | # appid = "wx06af0ef532292cd3" 57 | # scene = "1037" 58 | # scene = "1037" 59 | self.headers = { 60 | 'Host': 'amxshop.yili.com', 61 | 'accesstoken': self.access_token, 62 | 'scene': '1302', 63 | 'xweb_xhr': '1', 64 | 'user-agent': self.UA, 65 | 'content-type': 'application/x-www-form-urlencoded', 66 | 'accept': '*/*', 67 | 'sec-fetch-site': 'cross-site', 68 | 'sec-fetch-mode': 'cors', 69 | 'sec-fetch-dest': 'empty', 70 | 'referer': 'https://servicewechat.com/wxf2a6206f7e2fd712/664/page-frame.html', 71 | 'accept-language': 'zh-CN,zh;q=0.9', 72 | } 73 | self.s = requests.session() 74 | self.s.verify = False 75 | self.baseUrl = 'https://amxshop.yili.com/api/' 76 | 77 | 78 | def make_request(self, url, method='post', headers={}, data={}, params=None): 79 | if headers == {}: 80 | headers = self.headers 81 | try: 82 | if method.lower() == 'get': 83 | response = self.s.get(url, headers=headers, verify=False, params=params) 84 | elif method.lower() == 'post': 85 | response = self.s.post(url, headers=headers, json=data, params=params, verify=False) 86 | else: 87 | raise ValueError("不支持的请求方法❌: " + method) 88 | return response.json() 89 | except requests.exceptions.RequestException as e: 90 | print("请求异常❌:", e) 91 | except ValueError as e: 92 | print("值错误或不支持的请求方法❌:", e) 93 | except Exception as e: 94 | print("发生了未知错误❌:", e) 95 | 96 | def get_user_info(self): 97 | act_name = '获取用户信息' 98 | Log(f'\n====== {act_name} ======') 99 | url = f"{self.baseUrl}user/getUser" 100 | response = self.make_request(url,method='get') 101 | if response.get('code', -1) == 200: 102 | print(f'{act_name}成功!✅') 103 | data = response.get('data',{}) 104 | user = data.get('user',{}) 105 | user_id = user.get('id') 106 | user_name = user.get('name') 107 | mobilePhone = user.get('mobilePhone') 108 | myCode = user.get('myCode') 109 | 110 | mobile = mobilePhone[:3] + "*" * 4 + mobilePhone[7:] 111 | Log(f">用户名:{user_name}\n>手机号:{mobile}") 112 | 113 | return True 114 | elif not response: 115 | print(f">账号 {self.index}: ck过期 请重新抓取 access-token") 116 | return False 117 | else: 118 | print(response) 119 | return False 120 | 121 | def get_Point(self,END=False): 122 | act_name = '获取积分信息' 123 | if not END:Log(f'\n====== {act_name} ======') 124 | url = f"{self.baseUrl}user/score" 125 | response = self.make_request(url,method='get') 126 | if response.get('code', -1) == 200: 127 | data = response.get('data', '') 128 | print(f'{act_name}成功!✅') 129 | if END: 130 | Log(f'执行后积分:【{data}】') 131 | else: 132 | Log(f'当前积分:【{data}】') 133 | return True 134 | else: 135 | print(response) 136 | return False 137 | 138 | def daily_sign(self): 139 | act_name = '签到' 140 | Log(f'\n====== {act_name} ======') 141 | url = f"{self.baseUrl}user/daily/sign?exParams=false" 142 | response = self.make_request(url,method='get') 143 | if response.get('code', -1) == 200: 144 | data = response.get('data',{}) 145 | point = data.get('dailySign', {}).get('bonusPoint', '') 146 | print(f'{act_name}成功!✅') 147 | Log(f'获得积分:【{point}】') 148 | return True 149 | else: 150 | print(response) 151 | return False 152 | 153 | def get_sign_status(self): 154 | act_name = '获取签到信息' 155 | Log(f'\n====== {act_name} ======') 156 | url = f"{self.baseUrl}user/sign/status" 157 | response = self.make_request(url,method='get') 158 | if response.get('code', -1) == 200: 159 | data = response.get('data',{}) 160 | signed = data.get('signed','') 161 | signDays = data.get('signDays','') 162 | print(f'{act_name}成功!✅') 163 | Log(f'今日:【{"已签到" if signed else "未签到"}】') 164 | print(f'累计签到:【{signDays}】天') 165 | if not signed: 166 | self.daily_sign() 167 | return True 168 | else: 169 | print(response) 170 | return False 171 | 172 | 173 | def main(self): 174 | Log(f"\n开始执行第{self.index}个账号--------------->>>>>") 175 | if self.get_user_info(): 176 | # random_delay() 177 | self.get_Point() 178 | random_delay() 179 | self.get_sign_status() 180 | random_delay() 181 | self.get_Point(True) 182 | # self.daily_sign() 183 | 184 | self.sendMsg() 185 | return True 186 | else: 187 | self.sendMsg() 188 | return False 189 | 190 | def sendMsg(self): 191 | if self.send_UID: 192 | push_res = CHERWIN_TOOLS.wxpusher(self.send_UID, one_msg, APP_NAME) 193 | print(push_res) 194 | 195 | 196 | def random_delay(min_delay=1, max_delay=5): 197 | """ 198 | 在min_delay和max_delay之间产生一个随机的延时时间,然后暂停执行。 199 | 参数: 200 | min_delay (int/float): 最小延时时间(秒) 201 | max_delay (int/float): 最大延时时间(秒) 202 | """ 203 | delay = random.uniform(min_delay, max_delay) 204 | print(f">本次随机延迟:【{delay:.2f}】 秒.....") 205 | time.sleep(delay) 206 | 207 | 208 | def down_file(filename, file_url): 209 | print(f'开始下载:{filename},下载地址:{file_url}') 210 | try: 211 | response = requests.get(file_url, verify=False, timeout=10) 212 | response.raise_for_status() 213 | with open(filename + '.tmp', 'wb') as f: 214 | f.write(response.content) 215 | print(f'【{filename}】下载完成!') 216 | 217 | # 检查临时文件是否存在 218 | temp_filename = filename + '.tmp' 219 | if os.path.exists(temp_filename): 220 | # 删除原有文件 221 | if os.path.exists(filename): 222 | os.remove(filename) 223 | # 重命名临时文件 224 | os.rename(temp_filename, filename) 225 | print(f'【{filename}】重命名成功!') 226 | return True 227 | else: 228 | print(f'【{filename}】临时文件不存在!') 229 | return False 230 | except Exception as e: 231 | print(f'【{filename}】下载失败:{str(e)}') 232 | return False 233 | 234 | 235 | def import_Tools(): 236 | global CHERWIN_TOOLS, ENV, APP_INFO, TIPS, TIPS_HTML, amxCode 237 | import CHERWIN_TOOLS 238 | ENV, APP_INFO, TIPS, TIPS_HTML, amxCode = CHERWIN_TOOLS.main(APP_NAME, local_script_name, ENV_NAME,local_version) 239 | 240 | 241 | if __name__ == '__main__': 242 | APP_NAME = '安慕希小程序' 243 | ENV_NAME = 'AMX' 244 | CK_URL = 'amxshop.yili.com请求头' 245 | CK_NAME = 'accesstoken' 246 | CK_EX = 'wTUhu5IlL9uQDRelKgMRbao2bxii+O8+4FffOnxxxxxxx' 247 | print(f''' 248 | ✨✨✨ {APP_NAME}脚本✨✨✨ 249 | ✨ 功能: 250 | 积分签到 251 | ✨ 抓包步骤: 252 | 打开{APP_NAME} 253 | 授权登陆 254 | 打开抓包工具 255 | 找{CK_URL}{CK_NAME} 256 | 参数示例:{CK_EX} 257 | ✨ ✨✨wxpusher一对一推送功能, 258 | ✨需要定义变量export WXPUSHER=wxpusher的app_token,不设置则不启用wxpusher一对一推送 259 | ✨需要在{ENV_NAME}变量最后添加@wxpusher的UID 260 | ✨ 设置青龙变量: 261 | export {ENV_NAME}='{CK_NAME}参数值'多账号#或&分割 262 | export SCRIPT_UPDATE = 'False' 关闭脚本自动更新,默认开启 263 | ✨ ✨ 注意:抓完CK没事儿别打开小程序,重新打开小程序请重新抓包 264 | ✨ 推荐cron:5 7,11,15,20 * * * 265 | ''') 266 | local_script_name = os.path.basename(__file__) 267 | local_version = '2024.05.23' 268 | if IS_DEV: 269 | import_Tools() 270 | else: 271 | if os.path.isfile('amx.py'): 272 | import_Tools() 273 | else: 274 | if down_file('amx.py', 'amx.py'): 275 | print('脚本检测完成') 276 | import_Tools() 277 | else: 278 | print( 279 | '脚本检测失败') 280 | exit() 281 | print(TIPS) 282 | token = '' 283 | token = ENV if ENV else token 284 | if not token: 285 | print(f"未填写{ENV_NAME}变量\n青龙可在环境变量设置 {ENV_NAME} 或者在本脚本文件上方将{CK_NAME}填入token =''") 286 | exit() 287 | tokens = CHERWIN_TOOLS.ENV_SPLIT(token) 288 | # print(tokens) 289 | if len(tokens) > 0: 290 | print(f"\n>>>>>>>>>>共获取到{len(tokens)}个账号<<<<<<<<<<") 291 | access_token = [] 292 | for index, infos in enumerate(tokens): 293 | run_result = RUN(infos, index).main() 294 | if not run_result: continue 295 | if send: send(f'{APP_NAME}挂机通知', send_msg + TIPS_HTML) 296 | -------------------------------------------------------------------------------- /bucket.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | getBucket, 3 | updateBucket 4 | } 5 | const fs = require('fs') 6 | function getBucket(bucketName) { 7 | return fs.readFileSync(bucketName) 8 | } 9 | 10 | function updateBucket(bucketName, bucket) { 11 | return fs.writeFileSync(bucketName, bucket) 12 | } 13 | 14 | -------------------------------------------------------------------------------- /changhongmeiling.py: -------------------------------------------------------------------------------- 1 | 2 | #环境变量 chmlck 取url请求头中的token 3 | #变量格式 token#备注,多账号换行 4 | #搜微信小程序长虹美菱 5 | 6 | import os 7 | import requests 8 | response = requests.get("#小程序://长虹美菱会员服务/VgBR6WSiyJxrs4G") 9 | response.encoding = 'utf-8' 10 | txt = response.text 11 | print(txt) 12 | 13 | 14 | accounts = os.getenv("chmlck", "").splitlines() 15 | print("☞☞☞ 长虹美菱每日签到 ☜☜☜\n") 16 | 17 | if not accounts: 18 | print("未找到任何账号信息。") 19 | else: 20 | for account in accounts: 21 | if not account.strip(): 22 | continue 23 | try: 24 | token, note = account.split("#") 25 | except ValueError: 26 | print(f"格式错误: {account}") 27 | continue 28 | 29 | url = "https://hongke.changhong.com/gw/applet/aggr/signin" 30 | params = {'aggrId': "608"} 31 | headers = { 32 | 'User-Agent': "Mozilla/5.0 (Linux; Android 10; Mobile Safari/537.36)", 33 | 'Accept-Encoding': "gzip, deflate", 34 | 'Content-Type': "application/json", 35 | 'Token': token.strip() 36 | } 37 | 38 | try: 39 | response = requests.post(url, params=params, headers=headers) 40 | if response.status_code == 200: 41 | print(f"{note.strip()}:签到成功") 42 | elif response.status_code == 400: 43 | print(f"{note.strip()}:请勿重复签到") 44 | else: 45 | print(f"{note.strip()}:响应状态码 {response.status_code} - {response.text}") 46 | except requests.RequestException as e: 47 | print(f"{note.strip()}:请求失败 - {e}") 48 | -------------------------------------------------------------------------------- /cheryev.js: -------------------------------------------------------------------------------- 1 | /** 2 | * cron 5 15 * * * V3.js 3 | * Show: 4 | * 变量名:cheryev 5 | * 变量值:midend.icar-ecology.com Headers中 token的值 多账号换行或者 @ 分隔 6 | */ 7 | 8 | const $ = new Env("奇瑞Ev"); 9 | const ckName = "cheryev"; 10 | let envSplitor = ["@", "\n"]; //多账号分隔符 11 | let strSplitor = "&"; //多变量分隔符 12 | let userIdx = 0; 13 | let userList = []; 14 | class UserInfo { 15 | constructor(str) { 16 | this.index = ++userIdx; 17 | this.ck = str.split(strSplitor)[0]; //单账号多变量分隔符 18 | this.ckStatus = true; 19 | } 20 | async main() { 21 | await this.user_info(); 22 | } 23 | async user_info() { 24 | try { 25 | let options = { 26 | url: `https://midend.icar-ecology.com/credits/task/app/v1/attendance`, 27 | headers: { 28 | "app": "cheryev", 29 | "authorization": `Bearer ${this.ck}`, 30 | "app-v": "2.9.0", 31 | //"uid": "1721053872548581377", 32 | "net-type": "wifi", 33 | "lng": 0.00, 34 | "channel": 2, 35 | "dev-id": "29f8b4555e18235b6b1ef94fa59541f7a", 36 | "platform": 7, 37 | "dev-model": "MI8Lite", 38 | "lat": 0.00, 39 | "token": `${this.ck}`, 40 | "Content-Length": 0, 41 | "Host": "midend.icar-ecology.com", 42 | "Connection": "Keep-Alive", 43 | "Accept-Encoding": "gzip", 44 | "User-Agent": "okhttp/4.10.0" 45 | }, 46 | body: JSON.stringify({}) 47 | }, 48 | result = await httpRequest(options); 49 | //console.log(options); 50 | //console.log(result); 51 | if (result.data.success == true) { 52 | console.log(`✅账号[${this.index}] 签到成功 => 获得${result.data.rewardPoints}🎉`); 53 | } else { 54 | console.log(`❌账号[${this.index}] 签到 => 失败`); 55 | console.log(JSON.stringify(result)); 56 | } 57 | } catch (e) { 58 | console.log(e); 59 | } 60 | } 61 | } 62 | 63 | async function start() { 64 | let taskall = []; 65 | for (let user of userList) { 66 | if (user.ckStatus) { 67 | taskall.push(await user.main()); 68 | } 69 | } 70 | await Promise.all(taskall); 71 | } 72 | 73 | !(async () => { 74 | if (!(await checkEnv())) return; 75 | if (userList.length > 0) { 76 | await start(); 77 | } 78 | })() 79 | .catch((e) => console.log(e)) 80 | .finally(() => $.done()); 81 | 82 | //******************************************************** 83 | /** 84 | * 变量检查与处理 85 | * @returns 86 | */ 87 | async function checkEnv() { 88 | let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""; 89 | if (userCookie) { 90 | console.log(userCookie); 91 | let e = envSplitor[0]; 92 | for (let o of envSplitor) 93 | if (userCookie.indexOf(o) > -1) { 94 | e = o; 95 | break; 96 | } 97 | for (let n of userCookie.split(e)) n && userList.push(new UserInfo(n)); 98 | } else { 99 | console.log("未找到CK"); 100 | return; 101 | } 102 | return console.log(`共找到${userList.length}个账号`), true; //true == !0 103 | } 104 | 105 | ///////////////////////////////////////////////////////////////////////////////////// 106 | function httpRequest(options, timeout = 5 * 1000) { 107 | method = options.method 108 | ? options.method.toLowerCase() 109 | : options.body 110 | ? "post" 111 | : "get"; 112 | return new Promise((resolve) => { 113 | setTimeout(() => { 114 | $[method](options, (err, resp, data) => { 115 | try { 116 | if (err) { 117 | console.log(JSON.stringify(err)); 118 | $.logErr(err); 119 | } else { 120 | try { 121 | data = JSON.parse(data); 122 | } catch (error) { } 123 | } 124 | } catch (e) { 125 | console.log(e); 126 | $.logErr(e, resp); 127 | } finally { 128 | resolve(data); 129 | } 130 | }); 131 | }, timeout); 132 | }); 133 | } 134 | // prettier-ignore 135 | 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 } getScript(t) { return new Promise((s) => { this.get({ url: t }, (t, e, i) => s(i)) }) } runScript(t, s) { return new Promise((e) => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let o = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); (o = o ? 1 * o : 20), (o = s && s.timeout ? s.timeout : o); const [h, a] = i.split("@"), r = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: o }, headers: { "X-Key": h, Accept: "*/*" }, }; this.post(r, (t, s, i) => e(i)) }).catch((t) => this.logErr(t)) } 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.fs.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) { 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, s) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : this.isNode() ? ((this.data = this.loaddata()), (this.data[s] = t), this.writedata(), !0) : (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()), t && ((t.headers = t.headers ? t.headers : {}), void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, s = () => { }) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? $httpClient.get(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i) }) : this.isQuanX() ? $task.fetch(t).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t)) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, s) => { try { const e = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(e, null), (s.cookieJar = this.ckjar) } catch (t) { this.logErr(t) } }).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h, } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t))) } post(t, s = () => { }) { if ((t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), delete t.headers["Content-Length"], this.isSurge() || this.isLoon())) $httpClient.post(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i) }); else if (this.isQuanX()) (t.method = "POST"), $task.fetch(t).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: e, ...i } = t; this.got.post(e, i).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t)) } } 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))), this.logs.push("", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="), this.logs.push(s), e && this.logs.push(e), i && this.logs.push(i) } 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(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } })(t, s) } 136 | -------------------------------------------------------------------------------- /cyh.js: -------------------------------------------------------------------------------- 1 | 404: Not Found -------------------------------------------------------------------------------- /ddsy_songyao.js: -------------------------------------------------------------------------------- 1 | /** 2 | * cron 27 19 * * * ddsy_songyao.js 3 | * Show:叮当快药APP 积分抵钱 我的=>签到有礼 4 | * 变量名:ddsy_songyao 5 | * 变量值:https://hapi.ddky.com/mcp/weixin/rest.htm?后面的loginToken&userId&uDate 多账户@ 6 | * scriptVersionNow = "0.0.1"; 7 | * / 8 | */ 9 | 10 | const $ = new Env("叮当快药APP"); 11 | const notify = $.isNode() ? require('./sendNotify') : ''; 12 | let ckName = "ddsy_songyao"; 13 | let envSplitor = ["@", "\n"]; //多账号分隔符 14 | let strSplitor = "&"; //多变量分隔符 15 | let userIdx = 0; 16 | let userList = []; 17 | class UserInfo { 18 | constructor(str) { 19 | this.index = ++userIdx; 20 | this.token = str.split(strSplitor)[0]; //单账号多变量分隔符 21 | this.ckStatus = true; 22 | this.userId = str.split(strSplitor)[1]; 23 | this.uDate = str.split(strSplitor)[2]; 24 | } 25 | async main() { 26 | await this.getSignInId() 27 | } 28 | getSign(s) { 29 | const crypto = require("crypto");//SIGN TYPE 1是签到 2是补签 30 | return crypto.createHash('md5').update(s).digest('hex'); 31 | } 32 | getTime() { 33 | var now = new Date(); 34 | var year = now.getFullYear() 35 | , month = now.getMonth() + 1 36 | , day = now.getDate() 37 | , hours = now.getHours() 38 | , minutes = now.getMinutes() 39 | , seconds = now.getSeconds(); 40 | return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds; 41 | } 42 | getSignDay() { 43 | var now = new Date(); 44 | var year = now.getFullYear() 45 | , month = now.getMonth() + 1 46 | , day = now.getDate() 47 | return year + '-' + month + '-' + day 48 | } 49 | async getSignInId() { 50 | const time = this.getTime() 51 | const method = `ddky.promotion.signin.pageinfo` 52 | const signDay = this.getSignDay() 53 | const str = method + 54 | `loginToken${this.token}` + 55 | `method${method}` + 56 | `platH5` + 57 | `platformH5` + 58 | `signDay${signDay}` + 59 | `t${time}` + 60 | `uDate${this.uDate}` + 61 | `userId${this.userId}` + 62 | `v1.0` + 63 | `versionName4.9.0` + 64 | `6C57AB91A1308E26B797F4CD382AC79D` 65 | let sign = (this.getSign(str)).toUpperCase(); 66 | let callbackStr = new Date().getTime() 67 | try { 68 | let options = { 69 | 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}`, 70 | headers: {}, 71 | }, 72 | result = await httpRequest(options); 73 | //console.log(options); 74 | result = result.replace(`Zepto${callbackStr}`, "") 75 | result = result.replaceAll("(", "") 76 | result = result.replaceAll(")", "") 77 | result = JSON.parse(result) 78 | if(result.code = "0"){ 79 | console.log(result.result.signDayVo.signinId); 80 | await this.user_info(result.result.signDayVo.signinId) 81 | } 82 | 83 | } catch (e) { 84 | console.log(e); 85 | } 86 | } 87 | async user_info(signInId) { 88 | let callbackStr = new Date().getTime() 89 | 90 | const time = this.getTime() 91 | const str = `ddky.promotion.signin.sign` + `channelH5` + `laterSignType1` + `loginToken${this.token}` + `methodddky.promotion.signin.sign` + 92 | `platH5` + `platformH5` + `signinId${signInId}` + `t${time}` + `uDate${this.uDate}` + `userId${this.userId}` + `v1.0` + `versionName4.9.0` + 93 | `6C57AB91A1308E26B797F4CD382AC79D` 94 | let sign = (this.getSign(str)).toUpperCase(); 95 | try { 96 | let options = { 97 | 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}`, 98 | headers: {}, 99 | }, 100 | result = await httpRequest(options); 101 | //console.log(options); 102 | console.log(result); 103 | } catch (e) { 104 | console.log(e); 105 | } 106 | } 107 | } 108 | 109 | async function start() { 110 | let taskall = []; 111 | for (let user of userList) { 112 | if (user.ckStatus) { 113 | taskall.push(await user.main()); 114 | } 115 | } 116 | await Promise.all(taskall); 117 | } 118 | 119 | !(async () => { 120 | if (!(await checkEnv())) return; 121 | if (userList.length > 0) { 122 | await start(); 123 | } 124 | })() 125 | .catch((e) => console.log(e)) 126 | .finally(() => $.done()); 127 | 128 | //******************************************************** 129 | /** 130 | * 变量检查与处理 131 | * @returns 132 | */ 133 | async function checkEnv() { 134 | let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""; 135 | if (userCookie) { 136 | let e = envSplitor[0]; 137 | for (let o of envSplitor) 138 | if (userCookie.indexOf(o) > -1) { 139 | e = o; 140 | break; 141 | } 142 | for (let n of userCookie.split(e)) n && userList.push(new UserInfo(n)); 143 | } else { 144 | console.log("未找到CK"); 145 | return; 146 | } 147 | return console.log(`共找到${userList.length}个账号`), true; //true == !0 148 | } 149 | 150 | ///////////////////////////////////////////////////////////////////////////////////// 151 | function httpRequest(options, timeout = 5 * 1000) { 152 | method = options.method 153 | ? options.method.toLowerCase() 154 | : options.body 155 | ? "post" 156 | : "get"; 157 | return new Promise((resolve) => { 158 | setTimeout(() => { 159 | $[method](options, (err, resp, data) => { 160 | try { 161 | if (err) { 162 | console.log(JSON.stringify(err)); 163 | $.logErr(err); 164 | } else { 165 | try { 166 | data = JSON.parse(data); 167 | } catch (error) { } 168 | } 169 | } catch (e) { 170 | console.log(e); 171 | $.logErr(e, resp); 172 | } finally { 173 | resolve(data); 174 | } 175 | }); 176 | }, timeout); 177 | }); 178 | } 179 | // prettier-ignore 180 | 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 } getScript(t) { return new Promise((s) => { this.get({ url: t }, (t, e, i) => s(i)) }) } runScript(t, s) { return new Promise((e) => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let o = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); (o = o ? 1 * o : 20), (o = s && s.timeout ? s.timeout : o); const [h, a] = i.split("@"), r = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: o }, headers: { "X-Key": h, Accept: "*/*" }, }; this.post(r, (t, s, i) => e(i)) }).catch((t) => this.logErr(t)) } 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.fs.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) { 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, s) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : this.isNode() ? ((this.data = this.loaddata()), (this.data[s] = t), this.writedata(), !0) : (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()), t && ((t.headers = t.headers ? t.headers : {}), void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, s = () => { }) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? $httpClient.get(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i) }) : this.isQuanX() ? $task.fetch(t).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t)) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, s) => { try { const e = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(e, null), (s.cookieJar = this.ckjar) } catch (t) { this.logErr(t) } }).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h, } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t))) } post(t, s = () => { }) { if ((t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), delete t.headers["Content-Length"], this.isSurge() || this.isLoon())) $httpClient.post(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i) }); else if (this.isQuanX()) (t.method = "POST"), $task.fetch(t).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: e, ...i } = t; this.got.post(e, i).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t)) } } 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))), this.logs.push("", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="), this.logs.push(s), e && this.logs.push(e), i && this.logs.push(i) } 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(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } })(t, s) } 181 | -------------------------------------------------------------------------------- /dffx.js: -------------------------------------------------------------------------------- 1 | /** 2 | * cron 45 19 * * * dffx.js 3 | * Show:东方风行 APP 4 | * @author https://github.com/smallfawn/QLScriptPublic 5 | * 变量名:dffxCookie 6 | * 变量值:https://lqdm-app.dflzm.com请求头Headers中Cookie 7 | * scriptVersionNow = "0.0.1"; 8 | */ 9 | 10 | const $ = new Env("东方风行"); 11 | const notify = $.isNode() ? require('./sendNotify') : ''; 12 | let ckName = "dffxCookie"; 13 | let envSplitor = ["@", "\n"]; //多账号分隔符 14 | let strSplitor = "&"; //多变量分隔符 15 | let userIdx = 0; 16 | let userList = []; 17 | class UserInfo { 18 | constructor(str) { 19 | this.index = ++userIdx; 20 | this.ck = str.split(strSplitor)[0]; //单账号多变量分隔符 21 | this.ckStatus = true; 22 | this.artList = []//文章列表 23 | this.taskList = []//任务列表 24 | this.task_num_like = null //待做点赞任务数 25 | this.task_num_share = null//待做转发任务数 26 | this.userPoint = null 27 | 28 | } 29 | async main() { 30 | $.log(`===== 开始第[${this.index}]个账号 =====`) 31 | await this.user_info(); 32 | if (this.ckStatus) { 33 | await this.addSign() 34 | 35 | } 36 | 37 | } 38 | 39 | 40 | async addSign() { 41 | try { 42 | let options = { 43 | fn: "签到", 44 | method: "get", 45 | url: `https://lqdm-app.dflzm.com/customer/app-vip-user/exterior/user/task/signIn?isReSign=0`, 46 | } 47 | options.headers = this.get_headers(options.method, options.url) 48 | let { body: result } = await $.httpRequest(options); 49 | //console.log(options); 50 | //console.log(result); 51 | if (result.code == 0) { 52 | $.log(`✅[${options.fn}]成功🎉`) 53 | } else { 54 | console.log(`❌[${options.fn}]失败`); 55 | console.log(JSON.stringify(result)); 56 | } 57 | } catch (e) { 58 | console.log(e); 59 | } 60 | } 61 | 62 | async user_info() { 63 | try { 64 | let options = { 65 | fn: "信息查询", 66 | method: "get", 67 | url: `https://lqdm-app.dflzm.com/customer/app-vip-user/exterior/user/getMe`, 68 | } 69 | options.headers = this.get_headers(options.method, options.url) 70 | let { body: result } = await $.httpRequest(options); 71 | //console.log(options); 72 | //console.log(result); 73 | if (result.code == 0) { 74 | //console.log(`✅账号[${this.index}] 欢迎用户: ${result.errcode}🎉`); 75 | $.log(`✅[${result.data.nickname}][${result.data.phone}][${result.data.id}]当前积分[${result.data.integral}]🎉`) 76 | this.ckStatus = true; 77 | } else { 78 | console.log(`❌[UserInfo]查询: 失败`); 79 | this.ckStatus = false; 80 | console.log(result); 81 | } 82 | } catch (e) { 83 | console.log(e); 84 | } 85 | } 86 | 87 | 88 | 89 | 90 | sha256(str) { 91 | const crypto = require("crypto"); 92 | return crypto.createHash("sha256").update(str).digest("hex"); 93 | 94 | } 95 | get_headers(method, url, body = "") { 96 | url = url.replace("https://lqdm-app.dflzm.com", "") 97 | let path = url.split('?')[0] 98 | let params 99 | if(url.split('?')[1]){ 100 | params = url.split('?')[1].split('&').sort().join("").toLowerCase() 101 | }else{ 102 | params = "" 103 | } 104 | method = method.toUpperCase(); 105 | let timestamp = new Date().getTime() 106 | const key = `3b8379a44daa6ab982c886d8bcdcc82a` 107 | let str 108 | if (method == "POST") { 109 | str = `${method}${path}ice-auth-appkey:9831532554ice-auth-timestamp:${timestamp}json=${body}${params}${key}` 110 | } else { 111 | str = `${method}${path}ice-auth-appkey:9831532554ice-auth-timestamp:${timestamp}${params}${key}` 112 | 113 | } 114 | //console.log(encodeURIComponent(str)) 115 | const sign = this.sha256(encodeURIComponent(str)) 116 | return { 117 | "Content-Type": "application/json;charset=UTF-8", 118 | "User-Agent": "okhttp/3.14.9 (Android 10; Xiaomi MI 8 Lite Build/V11.0.2.0.QDTCNXM 3.2.6 40059 release dflqApp)", 119 | "appInfo": JSON.stringify({ "appVersion": "3.2.6", "osVersion": "Android 10", "appType": "Android", "deviceName": "Xiaomi MI 8 Lite", "deviceId": "7ec3eaf292dc3ead268d7335cc308f88@1703156059659" }), 120 | "Cache-Control": "no-cache", 121 | "platform": 2, 122 | "device": "cAndroid", 123 | "deviceSN": "7ec3eaf292dc3ead268d7335cc308f88@1703156059659", 124 | "Cookie": this.ck, 125 | //"userId": "", 126 | "appKey": 9831532554, 127 | "ice-auth-appkey": 9831532554, 128 | "ice-auth-timestamp": timestamp, 129 | "ice-auth-sign": sign, 130 | "Content-Type": "application/json;charset=UTF-8", 131 | "Host": "lqdm-app.dflzm.com", 132 | "Connection": "Keep-Alive", 133 | "Accept-Encoding": "identity" 134 | } 135 | } 136 | get_uuid() { 137 | return 'xxxxxxxx-xxxx-xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { 138 | var r = Math.random() * 16 | 0, 139 | v = c == 'x' ? r : (r & 0x3 | 0x8); 140 | return v.toString(16); 141 | }); 142 | } 143 | } 144 | 145 | async function start() { 146 | let taskall = []; 147 | for (let user of userList) { 148 | if (user.ckStatus) { 149 | taskall.push(await user.main()); 150 | } 151 | } 152 | await Promise.all(taskall); 153 | $.msg($.name, `任务已完成`) 154 | } 155 | 156 | !(async () => { 157 | if (!(await checkEnv())) return; 158 | if (userList.length > 0) { 159 | await start(); 160 | } 161 | 162 | await $.sendMsg($.logs.join("\n")) 163 | })() 164 | .catch((e) => console.log(e)) 165 | .finally(() => $.done()); 166 | 167 | //******************************************************** 168 | /** 169 | * 变量检查与处理 170 | * @returns 171 | */ 172 | async function checkEnv() { 173 | let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || "" 174 | if (userCookie) { 175 | let e = envSplitor[0]; 176 | for (let o of envSplitor) 177 | if (userCookie.indexOf(o) > -1) { 178 | e = o; 179 | break; 180 | } 181 | for (let n of userCookie.split(e)) n && userList.push(new UserInfo(n)); 182 | } else { 183 | console.log("未找到CK"); 184 | return; 185 | } 186 | return console.log(`共找到${userList.length}个账号`), true; //true == !0 187 | } 188 | 189 | ///////////////////////////////////////////////////////////////////////////////////// 190 | // prettier-ignore 191 | 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 } } } queryStr(options) { return Object.entries(options).map(([key, value]) => `${key}=${typeof value === 'object' ? JSON.stringify(value) : value}`).join('&') } 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) { const 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["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'] = 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 } } 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(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } })(t, s) } 192 | -------------------------------------------------------------------------------- /dydd.py: -------------------------------------------------------------------------------- 1 | 2 | #环境变量 dydd 3 | import os 4 | import requests 5 | import time 6 | import hashlib 7 | 8 | # 获取青龙面板环境变量 dydd 9 | dydd = os.environ.get('dydd', '') 10 | 11 | # 按换行符分割账号,并过滤空行 12 | accounts = [line.strip() for line in dydd.strip().split('\n') if line.strip()] 13 | 14 | url = "https://app2.d1ev.com/api/user/add-integral" 15 | 16 | # 公共参数 17 | params_base = { 18 | 'app_id': "d1ev_app", 19 | 'appName': "第一电动", 20 | 'os': "android", 21 | 'osVer': "9", 22 | 'vName': "2.5.6", 23 | 'vCode': "20506" 24 | } 25 | 26 | headers = { 27 | 'User-Agent': "Dalvik/2.1.0 (Linux; U; Android 9; PCRT00 Build/PQ3A.190605.06201646)", 28 | 'Connection': "Keep-Alive", 29 | 'Accept-Encoding': "gzip", 30 | 'TE': "gzip, deflate; q=0.5" 31 | } 32 | 33 | # 定义任务列表,每个任务包括任务类型和执行次数 34 | tasks = [ 35 | {'type': 11, 'name': '签到', 'count': 1}, 36 | {'type': 3, 'name': '分享', 'count': 3}, 37 | {'type': 5, 'name': '点赞', 'count': 5}, 38 | {'type': 2, 'name': '阅读', 'count': 1} 39 | ] 40 | 41 | for account in accounts: 42 | # 分割账号为 uid 和 token 43 | parts = account.split('#') 44 | if len(parts) != 2: 45 | print(f"跳过无效格式账号: {account}") 46 | continue 47 | 48 | uid, token = parts 49 | 50 | # 生成当前时间戳 51 | current_timestamp = str(int(time.time())) 52 | 53 | for task in tasks: 54 | task_type = task['type'] 55 | task_name = task['name'] 56 | task_count = task['count'] 57 | 58 | for _ in range(task_count): 59 | # 构造签名字符串 60 | sign_str = f"OMKCy2UxZwn8e4Ak{params_base['appName']}{params_base['app_id']}{params_base['os']}{params_base['osVer']}{current_timestamp}{token}{task_type}{uid}{params_base['vCode']}{params_base['vName']}" 61 | 62 | # 计算 MD5 签名 63 | sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest() 64 | 65 | # 定义带有动态值的参数 66 | params = { 67 | 'timestamp': current_timestamp, 68 | 'token': token, 69 | 'uid': uid, 70 | 'type': task_type, 71 | 'sign': sign.upper(), 72 | **params_base 73 | } 74 | 75 | try: 76 | # 发送 GET 请求 77 | response = requests.get(url, params=params, headers=headers) 78 | response.raise_for_status() # 如果请求失败,则抛出异常 79 | 80 | # 打印任务执行结果 81 | print(f"账号: {uid}, 任务: {task_name}, 响应: {response.text}") 82 | except requests.exceptions.RequestException as e: 83 | print(f"账号: {uid}, 任务: {task_name}, 请求失败: {e}") 84 | 85 | # 任务间隔5秒 86 | time.sleep(5) 87 | 88 | # 任务类型间隔10秒 89 | time.sleep(10) 90 | 91 | -------------------------------------------------------------------------------- /enshan.py: -------------------------------------------------------------------------------- 1 | 2 | import json 3 | import os 4 | import re 5 | 6 | import requests 7 | import urllib3 8 | 9 | from dailycheckin import CheckIn 10 | 11 | urllib3.disable_warnings() 12 | 13 | 14 | class EnShan(CheckIn): 15 | name = "恩山无线论坛" 16 | 17 | def __init__(self, check_item): 18 | self.check_item = check_item 19 | 20 | @staticmethod 21 | def sign(cookie): 22 | msg = [] 23 | headers = { 24 | "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36", 25 | "Cookie": cookie, 26 | } 27 | response = requests.get( 28 | url="https://www.right.com.cn/FORUM/home.php?mod=spacecp&ac=credit&showcredit=1", 29 | headers=headers, 30 | verify=False, 31 | ) 32 | try: 33 | coin = re.findall("恩山币: (.*?) ", response.text)[0] 34 | point = re.findall("积分: (.*?) { 120 | const value = obj[key]; 121 | if (value !== null && typeof value !== 'object') { 122 | queryString += `&${key}=${value}`; 123 | } 124 | }); 125 | } 126 | return queryString.slice(1); 127 | } 128 | return convertObjectToQueryString(e) 129 | } 130 | function v(e) { 131 | const crypto = require("crypto") 132 | return crypto.createHash("md5").update(e).digest("hex") 133 | } 134 | const g = { 135 | traceid: v((new Date).getTime().toString() + Math.random().toString()), 136 | noncestr: Math.random().toString().slice(2, 10), 137 | timestamp: Date.now(), 138 | platform: "h5", 139 | did: this.did, 140 | version: "1.0.0", 141 | finger: this.finger, 142 | token: this.token, 143 | oaid: this.oaid, 144 | } 145 | const c = "\u7c89\u8c61\u597d\u725b\u903ca8c19d8267527ea4c7d2f011acf7766f" 146 | let s = method === "get" ? void 0:JSON.parse(body) 147 | let e = void 0 === s ? {} : s 148 | g.sign = v(re(e) + re(g) + c) 149 | let headers = { 150 | '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/80.0.3987.99 Mobile Safari/537.36 AgentWeb/5.0.0 UCBrowser/11.6.4.950', 151 | 'Accept': 'application/json, text/plain, */*', 152 | 'Accept-Encoding': 'gzip, deflate', 153 | 'Content-Type': 'application/json', 154 | 'origin': 'https://m.fenxianglife.com', 155 | 'sec-fetch-dest': 'empty', 156 | 'x-requested-with': 'com.n_add.android', 157 | 'sec-fetch-site': 'same-site', 158 | 'sec-fetch-mode': 'cors', 159 | 'referer': 'https://m.fenxianglife.com/h5-lottery/index.html?hideBack=1&sourceType=lottery_tab&token=030e7e9158af06dea2b3d0175a471ada&AppToken=96e06ae9f3cab6784de443015b8d9ad8&uid=515226607&v=5.4.3&did=njia992631e6-b9b2-4383-b67c-86b5d0fe818a&level=1&platform=android×tamp=1717426249&channel=xiaomi&traFromId=23192687628924991393323633117947', 160 | 'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 161 | "Content-Type":"application/json" 162 | } 163 | Object.assign(headers, g) 164 | //console.log(headers) 165 | const reqeuestOptions = { 166 | url: url, 167 | method: method, 168 | headers: headers, 169 | body:body 170 | } 171 | let { body: result } = await $.httpRequest(reqeuestOptions) 172 | return result 173 | } 174 | } 175 | 176 | 177 | 178 | !(async () => { 179 | console.log(`==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date( 180 | new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000 + 8 * 60 * 60 * 1000 181 | ).toLocaleString()} \n==================================================`); 182 | if (!(await checkEnv())) return; 183 | if (userList.length > 0) { 184 | let taskall = []; 185 | for (let user of userList) { 186 | if (user.ckStatus) { 187 | taskall.push(user.main()); 188 | } 189 | } 190 | await Promise.all(taskall); 191 | } 192 | await $.sendMsg($.logs.join("\n")) 193 | })() 194 | .catch((e) => console.log(e)) 195 | .finally(() => $.done()); 196 | 197 | //******************************************************** 198 | /** 199 | * 变量检查与处理 200 | * @returns 201 | */ 202 | async function checkEnv() { 203 | let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ""; 204 | if (userCookie) { 205 | let e = envSplitor[0]; 206 | for (let o of envSplitor) 207 | if (userCookie.indexOf(o) > -1) { 208 | e = o; 209 | break; 210 | } 211 | for (let n of userCookie.split(e)) n && userList.push(new Task(n)); 212 | } else { 213 | console.log(`未找到CK【${ckName}】`); 214 | return; 215 | } 216 | return console.log(`共找到${userList.length}个账号`), true; //true == !0 217 | } 218 | //Env Api ============================= 219 | /* 220 | * @modifyAuthor @smallfawn 221 | * @modifyTime 2024-05-01 222 | * @modifyInfo 抽离操作文件的函数 223 | */ 224 | 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 } isSurge() { return "undefined" != typeof $httpClient && "undefined" == typeof $loon } isLoon() { return "undefined" != typeof $loon } initRequestEnv(t) { try { require.resolve("got") && ((this.requset = require("got")), (this.requestModule = "got")) } catch (e) { } try { require.resolve("axios") && ((this.requset = require("axios")), (this.requestModule = "axios")) } catch (e) { } 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 } } } 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) } } async httpRequest(options) { let t = { ...options }; 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 } else if (t.method === "post") { let ContentType; if (!t.body) { t.body = "" } else if (typeof t.body === "string") { ContentType = this.isJSONString(t.body) ? "application/json" : "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 } } if (this.isNode()) { this.initRequestEnv(t); if (this.requestModule === "axios" && t.method === "post") { t.data = t.body; delete t.body } let httpResult; if (this.requestModule === "got") { httpResult = await this.requset(t); if (this.isJSONString(httpResult.body)) { httpResult.body = JSON.parse(httpResult.body) } } else if (this.requestModule === "axios") { httpResult = await this.requset(t); httpResult.body = httpResult.data } 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) } 225 | function Bucket() { return new (class { constructor(fileName) { this.fileName = fileName; this.ensureFileExists(); this.data = this.readFile() } ensureFileExists() { this.fs ? this.fs : (this.fs = require("fs")); this.path ? this.path : (this.path = require("path")); this.filePath = this.path.join(__dirname, this.fileName); if (!this.fs.existsSync(this.filePath)) { this.fs.writeFileSync(this.filePath, "{}") } } readFile() { try { const data = this.fs.readFileSync(this.filePath, "utf-8"); return JSON.parse(data) } catch (error) { console.error(`Error reading file:${error}`); return {} } } writeFile() { try { this.fs.writeFileSync(this.filePath, JSON.stringify(this.data, null, 2)) } catch (error) { } } set(key, value) { this.data[key] = value; this.writeFile() } get(key) { return this.data[key] } })() } 226 | -------------------------------------------------------------------------------- /gujinggongjiu.js: -------------------------------------------------------------------------------- 1 | /* 2 | ------------------------------------------ 3 | @Date: 2024.08.01 4 | @Description: 古井贡酒会员中心小程序 5 | ------------------------------------------ 6 | 变量名 gujing 7 | [Script] 8 | http-response 9 | 10 | [MITM] 11 | hostname = 12 | 13 | 14 | const $ = new Env("古井贡酒会员中心小程序"); 15 | let ckName = `gujing`; 16 | let userCookie = checkEnv( 17 | ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || "" 18 | ); 19 | const notify = $.isNode() ? require("./sendNotify") : ""; 20 | 21 | !(async () => { 22 | console.log( 23 | `==================================================\n 脚本执行 - 北京时间(UTC+8): ${new Date( 24 | new Date().getTime() + 25 | new Date().getTimezoneOffset() * 60 * 1000 + 26 | 8 * 60 * 60 * 1000 27 | ).toLocaleString()} \n==================================================` 28 | ); 29 | //console.log(userCookie) 30 | if (!userCookie?.length) return console.log(`没有找到CK哦`); 31 | let index = 1; 32 | let strSplitor = "#"; 33 | 34 | for (let user of userCookie) { 35 | $.log(`\n🚀 user:【${index}】 start work\n`); 36 | index++ 37 | $.token = user 38 | $.ckStatus = true; 39 | await search() 40 | } 41 | 42 | await $.sendMsg($.logs.join("\n")); 43 | })() 44 | .catch((e) => console.log(e)) 45 | .finally(() => $.done()); 46 | async function search() { 47 | let data = JSON.stringify({ 48 | "activityId": "110001000", 49 | "preview": false 50 | }); 51 | 52 | let config = { 53 | method: 'POST', 54 | url: 'https://scrm.gujing.com/gujing_scrm/wxclient/mkt/activities/sign:search', 55 | headers: { 56 | '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', 57 | 'Accept': 'application/json, text/plain, */*', 58 | 'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Android WebView";v="122"', 59 | 'Content-Type': 'application/json;charset=UTF-8', 60 | 'sec-ch-ua-mobile': '?1', 61 | 'Access-Token': $.token, 62 | 'sec-ch-ua-platform': '"Android"', 63 | 'Origin': 'https://scrm.gujing.com', 64 | 'X-Requested-With': 'com.tencent.mm', 65 | 'Sec-Fetch-Site': 'same-origin', 66 | 'Sec-Fetch-Mode': 'cors', 67 | 'Sec-Fetch-Dest': 'empty', 68 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 69 | 70 | }, 71 | data: data 72 | }; 73 | let { data: result } = await Request(config) 74 | if (result?.code == 200) { 75 | if (result.content.signed !== 1) { 76 | $.log(`未签到 ===> 签到ing`) 77 | await signIn() 78 | } else { 79 | $.log(`已签到 ===> 什么都不做`) 80 | } 81 | } else { 82 | $.log(`签到查询失败 [${JSON.stringify(result)}]`) 83 | } 84 | } 85 | async function signIn() { 86 | let data = JSON.stringify({ 87 | "activityId": "110001000", 88 | "preview": false 89 | }); 90 | 91 | let config = { 92 | method: 'POST', 93 | url: 'https://scrm.gujing.com/gujing_scrm/wxclient/mkt/activities/sign:search', 94 | headers: { 95 | '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', 96 | 'Accept': 'application/json, text/plain, */*', 97 | 'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Android WebView";v="122"', 98 | 'Content-Type': 'application/json;charset=UTF-8', 99 | 'sec-ch-ua-mobile': '?1', 100 | 'Access-Token': $.token, 101 | 'sec-ch-ua-platform': '"Android"', 102 | 'Origin': 'https://scrm.gujing.com', 103 | 'X-Requested-With': 'com.tencent.mm', 104 | 'Sec-Fetch-Site': 'same-origin', 105 | 'Sec-Fetch-Mode': 'cors', 106 | 'Sec-Fetch-Dest': 'empty', 107 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 108 | }, 109 | data: data 110 | }; 111 | let { data: result } = await Request(config) 112 | if (result?.code == 200) { 113 | $.log(`签到成功 获得积分[${result.content.point}]`) 114 | } else { 115 | $.log(`签到失败 [${result.chnDesc}]`) 116 | } 117 | } 118 | 119 | function checkEnv(userCookie) { 120 | const envSplitor = ["&", "\n"]; 121 | //console.log(userCookie); 122 | let userList = userCookie 123 | .split(envSplitor.find((o) => userCookie.includes(o)) || "&") 124 | .filter((n) => n); 125 | console.log(`共找到${userList.length}个账号`); 126 | return userList; 127 | } 128 | // prettier-ignore 129 | 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) } 130 | 131 | async function Request(options) { 132 | if ($.isNode()) { 133 | const axios = require("axios"); 134 | Request = async (options) => { 135 | try { 136 | return await axios.request(options); 137 | } catch (error) { 138 | return error && error.error ? error.error : "请求失败"; 139 | } 140 | }; 141 | } 142 | if ($.isQuanX()) { 143 | Request = async (options) => { 144 | try { 145 | return await $task.fetch(options); 146 | } catch (error) { 147 | return error && error.error ? error.error : "请求失败"; 148 | } 149 | }; 150 | } 151 | return await Request(options); 152 | } 153 | -------------------------------------------------------------------------------- /hl.js: -------------------------------------------------------------------------------- 1 | /* 2 | 软件名称:哈啰 3 | 版本:0.0.4 4 | 抓包位置:首页 福利中心 查看更多 抓包 api.hellobike.com/api?urser 请求里面的 TOKEN 5 | 定时:一天一次 6 | 变量名:hlToken 7 | 多账号用&隔开 8 | export hlToken="23fexxxxxxxxxxxxxxxxxxxxxxxxxxxx" 9 | 奖励:奖励金可换手机话费抵用券,便宜充话费 10 | */ 11 | const _0x389411=_0x4d39;(function(_0x7b3aed,_0x2ef8a3){const _0x219594=_0x4d39,_0x5adf9=_0x7b3aed();while(!![]){try{const _0x390367=-parseInt(_0x219594(0x1e2))/0x1*(-parseInt(_0x219594(0x1e0))/0x2)+-parseInt(_0x219594(0x1ec))/0x3*(parseInt(_0x219594(0x1d8))/0x4)+-parseInt(_0x219594(0x1eb))/0x5+-parseInt(_0x219594(0x1e8))/0x6*(-parseInt(_0x219594(0x1dc))/0x7)+-parseInt(_0x219594(0x1f4))/0x8+parseInt(_0x219594(0x1db))/0x9+parseInt(_0x219594(0x1d5))/0xa;if(_0x390367===_0x2ef8a3)break;else _0x5adf9['push'](_0x5adf9['shift']());}catch(_0x480ab0){_0x5adf9['push'](_0x5adf9['shift']());}}}(_0xc102,0xce09a));const axios=require(_0x389411(0x1d2));function _0x4d39(_0x3eb44c,_0x545b67){const _0xc10201=_0xc102();return _0x4d39=function(_0x4d3914,_0x59f643){_0x4d3914=_0x4d3914-0x1d0;let _0xb06f56=_0xc10201[_0x4d3914];return _0xb06f56;},_0x4d39(_0x3eb44c,_0x545b67);}let hlToken=process[_0x389411(0x1f8)][_0x389411(0x1de)];!hlToken&&(console[_0x389411(0x1dd)](_0x389411(0x1f7)),process['exit'](0x1));let tokens=hlToken['includes']('&')?hlToken[_0x389411(0x1f0)]('&'):[hlToken];const SIGN_URL='https://api.hellobike.com/api?common.welfare.signAndRecommend',POINT_URL=_0x389411(0x1ee);async function requestPost(_0x3b1aee,_0x1d60b9,_0x277345){const _0x17f805=_0x389411;try{const _0x5989b2={'User-Agent':'Mozilla/5.0\x20(Windows\x20NT\x2010.0;\x20Mobile)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/96.0.4664.104\x20Mobile\x20Safari/537.36','Content-Type':_0x17f805(0x1d6),'Authorization':_0x277345},_0x44d747=await axios[_0x17f805(0x1d3)](_0x3b1aee,_0x1d60b9,{'headers':_0x5989b2});return _0x44d747[_0x17f805(0x1f5)];}catch(_0xea967c){return console[_0x17f805(0x1ea)](_0x17f805(0x1f1),_0xea967c[_0x17f805(0x1d7)]?_0xea967c[_0x17f805(0x1d7)]['data']:_0xea967c[_0x17f805(0x1ef)]),null;}}async function signIn(_0x34d077,_0x1a938f){const _0x5b299b=_0x389411;console[_0x5b299b(0x1dd)](_0x5b299b(0x1d1)+(_0x1a938f+0x1)+_0x5b299b(0x1fa));const _0x5b52fc={'from':'h5','systemCode':0x3e,'platform':0x4,'version':_0x5b299b(0x1e3),'action':_0x5b299b(0x1da),'token':_0x34d077,'pointType':0x1},_0x4940a9=await requestPost(SIGN_URL,_0x5b52fc,_0x34d077);if(_0x4940a9&&_0x4940a9[_0x5b299b(0x1f5)]){const {bountyCountToday:_0xcd307a,didSignToday:_0x496aca}=_0x4940a9[_0x5b299b(0x1f5)];if(_0xcd307a)return console[_0x5b299b(0x1dd)](_0x5b299b(0x1e1)+(_0x1a938f+0x1)+_0x5b299b(0x1f6)+_0xcd307a),!![];else{if(_0x496aca)return console[_0x5b299b(0x1dd)](_0x5b299b(0x1f2)+(_0x1a938f+0x1)+_0x5b299b(0x1f3)),![];}}return console[_0x5b299b(0x1dd)](_0x5b299b(0x1d0)+(_0x1a938f+0x1)+'\x20签到失败,API\x20返回异常:',JSON['stringify'](_0x4940a9)),![];}async function getRewards(_0x5380f3,_0x1447b8){const _0x2b5d00=_0x389411;console[_0x2b5d00(0x1dd)]('💰\x20查询账号\x20'+(_0x1447b8+0x1)+_0x2b5d00(0x1e6));const _0xfb3730={'from':'h5','systemCode':0x3d,'platform':0x4,'version':_0x2b5d00(0x1e3),'action':_0x2b5d00(0x1e5),'token':_0x5380f3,'pointType':0x1},_0xf366f9=await requestPost(POINT_URL,_0xfb3730,_0x5380f3);if(_0xf366f9&&_0xf366f9[_0x2b5d00(0x1f5)]&&_0xf366f9['data'][_0x2b5d00(0x1e7)]!==undefined){const _0x1af42b=_0xf366f9[_0x2b5d00(0x1f5)][_0x2b5d00(0x1e7)];console[_0x2b5d00(0x1dd)]('🎉\x20账号\x20'+(_0x1447b8+0x1)+_0x2b5d00(0x1ed)+_0x1af42b);}else console['log'](_0x2b5d00(0x1d0)+(_0x1447b8+0x1)+_0x2b5d00(0x1e9),JSON[_0x2b5d00(0x1e4)](_0xf366f9));}function _0xc102(){const _0x252742=['points','24XHUbvN','\x20查询奖励金失败,API\x20返回异常:','error','2254910vgXnXj','3puJyNJ','\x20可用奖励金:','https://api.hellobike.com/api?user.taurus.pointInfo','message','split','❌\x20请求失败:','⚠️\x20账号\x20','\x20今天已经签到过了!','11359680EmTOcz','data','\x20签到成功!获得奖励金\x20+','❌\x20未设置环境变量\x20hlToken,请检查配置!','env','✨✨✨\x20哈啰签到脚本启动\x20✨✨✨','\x20开始签到...','❌\x20账号\x20','\x0a🚀\x20账号\x20','axios','post','\x0a🎉\x20所有账号任务执行完毕!','16508740vGrDBP','application/json','response','893852VWBewm','length','common.welfare.signAndRecommend','342450vfFeXW','2037917SANNdn','log','hlToken','random','2PYLQVJ','✅\x20账号\x20','84887arhOPN','6.46.0','stringify','user.taurus.pointInfo','\x20奖励金...'];_0xc102=function(){return _0x252742;};return _0xc102();}((async()=>{const _0x1c8492=_0x389411;console['log'](_0x1c8492(0x1f9));for(let _0x274007=0x0;_0x274007setTimeout(_0x8b3f08,Math[_0x1c8492(0x1df)]()*0xbb8+0x7d0)),await getRewards(_0x562af6,_0x274007));}console[_0x1c8492(0x1dd)](_0x1c8492(0x1d4));})()); 12 | -------------------------------------------------------------------------------- /imaotai.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # -- coding: utf-8 -- 3 | # ------------------------------- 4 | # cron "15 0,30 9 * * *" script-path=xxx.py,tag=匹配cron用 5 | # const $ = new Env('imaotai') 6 | 7 | import datetime 8 | import os 9 | import r和om 10 | import time,re 11 | 12 | import requests 13 | import base64 14 | import json 15 | from Crypto.Cipher import AES 16 | from Crypto.Util.Padding import pad 17 | 18 | from notify import send 19 | 20 | # 青龙面板加入环境变量 export MTTokenD 21 | # MTTokenD是茅台预约参数,多个请换行,格式'省份,城市,经度,维度,设备id,token,MT-Token-Wap(抓包小茅运)' 22 | # MT-Token-Wap参数是小茅运的领奖励,不需要的话MTTokenD格式改成 省份,城市,经度,维度,设备id,token,'' 23 | # 依赖pycryptodome 24 | p_c_map = {} 25 | mt_r = 'clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/' 26 | # 下面定义的是申请哪几个,可通过iMT_Products环境变量来设置,比如{"10941": "贵州茅台酒(甲辰龙年)", "2478": "贵州茅台酒(珍品)", "10942": "贵州茅台酒(甲辰龙年)x2"} 27 | #res_map = json.loads(os.getenv('iMT_Products', '')) 28 | #if not res_map: 29 | # res_map = {"10941": "贵州茅台酒(甲辰龙年)", "10942": "贵州茅台酒(甲辰龙年)x2"} 30 | res_map = {"10941": "贵州茅台酒(甲辰龙年)", "10942": "贵州茅台酒(甲辰龙年)x2"} 31 | print('拟预约商品:') 32 | print(res_map) 33 | #加密 34 | def aes_cbc_encrypt(data, key, iv): 35 | cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8')) 36 | padded_data = pad(data.encode('utf-8'), AES.block_size) 37 | encrypted_data = cipher.encrypt(padded_data) 38 | return base64.b64encode(encrypted_data).decode('utf-8') 39 | 40 | def mt_add(itemId, shopId, sessionId, userId, token, Device_ID): 41 | MT_K = f'{int(time.time() * 1000)}' 42 | headers = {'User-Agent': 'iPhone 14', 43 | 'MT-Token': token, 44 | 'MT-Network-Type': 'WIFI', 'MT-User-Tag': '0', 45 | 'MT-R': mt_r, 'MT-K': MT_K, 46 | 'MT-Info': '028e7f96f6369cafe1d105579c5b9377', 'MT-APP-Version': mt_version, 47 | 'MT-Request-ID': f'{int(time.time() * 1000)}', 'Accept-Language': 'zh-Hans-CN;q=1', 48 | 'MT-Device-ID': Device_ID, 49 | 'MT-Bundle-ID': 'com.moutai.mall', 50 | 'mt-lng': lng, 51 | 'mt-lat': lat} 52 | d = {"itemInfoList": [{"count": 1, "itemId": str(itemId)}], "sessionId": sessionId, "userId": str(userId), 53 | "shopId": str(shopId)} 54 | r = aes_cbc_encrypt(json.dumps(d),'qbhajinldepmucsonaaaccgypwuvcjaa','2018534749963515') 55 | d['actParam'] = r 56 | json_data = d 57 | response = requests.post('https://app.moutai519.com.cn/xhr/front/mall/reservation/add', headers=headers, 58 | json=json_data) 59 | code = response.json().get('code', 0) 60 | if code == 2000: 61 | return response.json().get('data', {}).get('successDesc', "未知") 62 | return '申购失败:' + response.json().get('message', "未知原因") 63 | 64 | 65 | def tongzhi(ss): 66 | user_list = os.getenv('mtec_user', '').split(',') 67 | for user in user_list: 68 | url = 'http://wxpusher.zjiecode.com/api/send/message/?appToken=&content={}&uid={}'.format( 69 | ss, user) 70 | r = requests.get(url) 71 | print(r.text) 72 | 73 | 74 | def get_session_id(device_id, token): 75 | headers = { 76 | 'mt-device-id': device_id, 77 | 'mt-user-tag': '0', 78 | 'accept': '*/*', 79 | 'mt-network-type': 'WIFI', 80 | 'mt-token': token, 81 | 'mt-bundle-id': 'com.moutai.mall', 82 | 'accept-language': 'zh-Hans-CN;q=1', 83 | 'mt-request-id': f'{int(time.time() * 1000)}', 84 | 'mt-app-version': mt_version, 85 | 'user-agent': 'iPhone 14', 86 | 'mt-r': mt_r, 87 | 'mt-lng': lng, 88 | 'mt-lat': lat 89 | } 90 | 91 | response = requests.get('https://static.moutai519.com.cn/mt-backend/xhr/front/mall/index/session/get/' + time_keys, 92 | headers=headers) 93 | sessionId = response.json().get('data', {}).get('sessionId') 94 | itemList = response.json().get('data', {}).get('itemList', []) 95 | itemCodes = [item.get('itemCode') for item in itemList] 96 | return sessionId, itemCodes 97 | 98 | # 打印所有商品列表 99 | def get_shop_items(sessionId, device_id, token, province, city): 100 | headers = { 101 | 'mt-device-id': device_id, 102 | 'mt-user-tag': '0', 103 | 'mt-lat': '', 104 | 'accept': '*/*', 105 | 'mt-network-type': 'WIFI', 106 | 'mt-token': token, 107 | 'mt-bundle-id': 'com.moutai.mall', 108 | 'accept-language': 'zh-Hans-CN;q=1', 109 | 'mt-request-id': f'{int(time.time() * 1000)}', 110 | 'mt-r': mt_r, 111 | 'mt-app-version': mt_version, 112 | 'user-agent': 'iPhone 14', 113 | 'mt-lng': lng, 114 | 'mt-lat': lat 115 | } 116 | 117 | response = requests.get( 118 | 'https://static.moutai519.com.cn/mt-backend/xhr/front/mall/index/session/get/' + time_keys, headers=headers) 119 | item_list = response.json().get('data', {}).get("itemList", []) 120 | # 创建一个空字典,用于存储 itemCode 和 title 的映射关系 121 | item_code_title_map = {} 122 | # 遍历 itemList,提取 itemCode 和 title,并将它们添加到字典中 123 | for item in item_list: 124 | item_code_title_map[item.get("itemCode")] = item.get("title") 125 | print('可预约商品列表:') 126 | print(item_code_title_map) 127 | return item_code_title_map 128 | 129 | def get_shop_item(sessionId, itemId, device_id, token, province, city): 130 | headers = { 131 | 'mt-device-id': device_id, 132 | 'mt-user-tag': '0', 133 | 'mt-lat': '', 134 | 'accept': '*/*', 135 | 'mt-network-type': 'WIFI', 136 | 'mt-token': token, 137 | 'mt-bundle-id': 'com.moutai.mall', 138 | 'accept-language': 'zh-Hans-CN;q=1', 139 | 'mt-request-id': f'{int(time.time() * 1000)}', 140 | 'mt-r': mt_r, 141 | 'mt-app-version': mt_version, 142 | 'user-agent': 'iPhone 14', 143 | 'mt-lng': lng, 144 | 'mt-lat': lat 145 | } 146 | 147 | response = requests.get( 148 | 'https://static.moutai519.com.cn/mt-backend/xhr/front/mall/shop/list/slim/v3/' + str( 149 | sessionId) + '/' + province + '/' + str(itemId) + '/' + time_keys, 150 | headers=headers) 151 | data = response.json().get('data', {}) 152 | shops = data.get('shops', []) 153 | shop_id_ = p_c_map[province][city] 154 | for shop in shops: 155 | if not shop.get('shopId') in shop_id_: 156 | continue 157 | if itemId in str(shop): 158 | return shop.get('shopId') 159 | 160 | 161 | def get_user_id(token, Device_ID): 162 | headers = { 163 | 'MT-User-Tag': '0', 164 | 'Accept': '*/*', 165 | 'MT-Network-Type': 'WIFI', 166 | 'MT-Token': token, 167 | 'MT-Bundle-ID': 'com.moutai.mall', 168 | 'Accept-Language': 'zh-Hans-CN;q=1, en-CN;q=0.9', 169 | 'MT-Request-ID': f'{int(time.time() * 1000)}', 170 | 'MT-APP-Version': mt_version, 171 | 'User-Agent': 'iOS;16.0.1;Apple;iPhone 14 ProMax', 172 | 'MT-R': mt_r, 173 | 'MT-Device-ID': Device_ID, 174 | 'mt-lng': lng, 175 | 'mt-lat': lat 176 | } 177 | 178 | response = requests.get( 179 | 'https://app.moutai519.com.cn/xhr/front/user/info', headers=headers) 180 | userName = response.json().get('data', {}).get('userName') 181 | userId = response.json().get('data', {}).get('userId') 182 | mobile = response.json().get('data', {}).get('mobile') 183 | return userName, userId, mobile 184 | 185 | 186 | def getUserEnergyAward(device_id, ck): 187 | """ 188 | 领取耐力 189 | :return: 190 | """ 191 | 192 | cookies = { 193 | 'MT-Device-ID-Wap': device_id, 194 | 'MT-Token-Wap': ck, 195 | 'YX_SUPPORT_WEBP': '1', 196 | } 197 | 198 | headers = { 199 | 'X-Requested-With': 'XMLHttpRequest', 200 | 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_2_1 like Mac OS X)', 201 | 'Referer': 'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2', 202 | 'Client-User-Agent': 'iOS;15.0.1;Apple;iPhone 12 ProMax', 203 | 'MT-R': mt_r, 204 | 'Origin': 'https://h5.moutai519.com.cn', 205 | 'MT-APP-Version': mt_version, 206 | 'MT-Request-ID': f'{int(time.time() * 1000)}', 207 | 'Accept-Language': 'zh-CN,zh-Hans;q=0.9', 208 | 'MT-Device-ID': device_id, 209 | 'Accept': 'application/json, text/javascript, */*; q=0.01', 210 | 'mt-lng': lng, 211 | 'mt-lat': lat 212 | } 213 | response = requests.post('https://h5.moutai519.com.cn/game/isolationPage/getUserEnergyAward', cookies=cookies, 214 | headers=headers, json={}) 215 | return response.json().get('message') if '无法领取奖励' in response.text else "领取奖励成功" 216 | 217 | 218 | def get_map(): 219 | global p_c_map 220 | url = 'https://static.moutai519.com.cn/mt-backend/xhr/front/mall/resource/get' 221 | headers = { 222 | 'X-Requested-With': 'XMLHttpRequest', 223 | 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X)', 224 | 'Referer': 'https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2', 225 | 'Client-User-Agent': 'iOS;16.0.1;Apple;iPhone 14 ProMax', 226 | 'MT-R': mt_r, 227 | 'Origin': 'https://h5.moutai519.com.cn', 228 | 'MT-APP-Version': mt_version, 229 | 'MT-Request-ID': f'{int(time.time() * 1000)}{random.randint(1111111, 999999999)}{int(time.time() * 1000)}', 230 | 'Accept-Language': 'zh-CN,zh-Hans;q=1', 231 | 'MT-Device-ID': f'{int(time.time() * 1000)}{random.randint(1111111, 999999999)}{int(time.time() * 1000)}', 232 | 'Accept': 'application/json, text/javascript, */*; q=0.01', 233 | 'mt-lng': lng, 234 | 'mt-lat': lat 235 | } 236 | res = requests.get(url, headers=headers, ) 237 | mtshops = res.json().get('data', {}).get('mtshops_pc', {}) 238 | urls = mtshops.get('url') 239 | r = requests.get(urls) 240 | for k, v in dict(r.json()).items(): 241 | provinceName = v.get('provinceName') 242 | cityName = v.get('cityName') 243 | if not p_c_map.get(provinceName): 244 | p_c_map[provinceName] = {} 245 | if not p_c_map[provinceName].get(cityName, None): 246 | p_c_map[provinceName][cityName] = [k] 247 | else: 248 | p_c_map[provinceName][cityName].append(k) 249 | return p_c_map 250 | 251 | 252 | def login(phone, vCode, Device_ID): 253 | """ 254 | 255 | :param phone: 手机号 256 | :param vCode: 验证码 257 | :param Device_ID: 设备id 258 | :return: 259 | """ 260 | MT_K = f'{int(time.time() * 1000)}' 261 | r = requests.get( 262 | f'http://82.157.10.108:8086/get_mtv?DeviceID={Device_ID}&MTk={MT_K}&version={mt_version}&key=yaohuo') 263 | headers = { 264 | 'MT-Device-ID': Device_ID, 265 | 'MT-User-Tag': '0', 266 | 'Accept': '*/*', 267 | 'MT-Network-Type': 'WIFI', 268 | 'MT-Token': '', 269 | 'MT-K': MT_K, 270 | 'MT-Bundle-ID': 'com.moutai.mall', 271 | 'MT-V': r.text, 272 | 'User-Agent': 'iOS;16.0.1;Apple;iPhone 14 ProMax', 273 | 'Accept-Language': 'zh-Hans-CN;q=1', 274 | 'MT-Request-ID': f'{int(time.time() * 1000)}18342', 275 | 'MT-R': mt_r, 276 | 'MT-APP-Version': mt_version, 277 | } 278 | 279 | json_data = { 280 | 'ydToken': '', 281 | 'mobile': f'{phone}', 282 | 'vCode': f'{vCode}', 283 | 'ydLogId': '', 284 | } 285 | 286 | response = requests.post('https://app.moutai519.com.cn/xhr/front/user/register/login', headers=headers, 287 | json=json_data) 288 | data = response.json().get('data', {}) 289 | token = data.get('token') 290 | cookie = data.get('cookie') # MT-Token-Wap 291 | print(Device_ID, token, cookie) 292 | return Device_ID, token, cookie 293 | 294 | 295 | if __name__ == '__main__': 296 | plustoken = os.getenv("plustoken") 297 | # mt_tokens = os.getenv("MTTokenD") 298 | mt_tokens = '浙江省,温州市,120.123456,27.123456,123456-B851-4574-913D-5C38E19CF14C,eyJ0eXAiO123456CJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtd123456ImV4cCI6MTcyNDE2OTk3OCwidXNlcklkIjoxMTI3NTA3ODg3LCJkZXZpY2VJZCI6IjAxNEU2REU3LUI4NTEtNDU3NC05MTNELTVDMzhFMTlDRjE0QyIsImlhdCI6MTcyMTU3Nzk3OH0.UH2r-aIv5pw9u4D7e2SxEcmdex5IRyvkoe2-FTkR5bc,eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3M123456IsImV4cCI6MTcyNDE2OTk3OCwidXNlcklkIjoxMTI3NTA3ODg3LCJkZXZ123456I6IjAxNEU2REU3LUI4NTEtNDU3NC05MTNELTVDMzhFMTlDRjE0QyIsImlhdCI6MTcy123456zk3OH0.piTWOifeQx8oNdEeLzHyd2RML4xT1t-F6PYqDawd_hU' 299 | mt_version = "".join(re.findall('whats-new__latest__version">(.*?)

', 300 | requests.get('https://apps.apple.com/cn/app/i%E8%8C%85%E5%8F%B0/id1600482450').text, 301 | re.S)).replace('版本 ', '').replace('版本 ', '') # line:248 302 | print('当前最新版本为:' + mt_version) # line:249 303 | if not mt_tokens: 304 | print('MTToken is null') 305 | exit() 306 | if not mt_version: 307 | print('版本号为空 is null') 308 | exit() 309 | mt_token_list = mt_tokens.split('&') 310 | s = "-------------------总共" + \ 311 | str(int(len(mt_token_list))) + \ 312 | "个用户-------------------"+'\n' 313 | userCount = 0 314 | if len(mt_token_list) > 0: 315 | for mt_token in mt_token_list: 316 | userCount += 1 317 | try: 318 | province, city, lng, lat, device_id, token, ck = mt_token.split(',') 319 | province, city, lng, lat, device_id, token, ck = province.strip(), city.strip(), lng.strip(), lat.strip(), device_id.strip(), token.strip(), ck.strip() 320 | except Exception as e: 321 | s = "MTTokenD未正确配置,格式'省份,城市,经度,维度,设备id,token,MT-Token-Wap(抓包小茅运)'" 322 | send("i茅台申购+小茅运", s) 323 | exit() 324 | time_keys = str( 325 | int(time.mktime(datetime.date.today().timetuple())) * 1000) 326 | get_map() 327 | 328 | try: 329 | sessionId, itemCodes = get_session_id(device_id, token) 330 | userName, user_id, mobile = get_user_id(token, device_id) 331 | if not user_id: 332 | s += "第"+str(userCount)+"个用户token失效,请重新登录"+'\n' 333 | continue 334 | s += "第"+str(userCount)+"个用户----------------"+userName + '_' + \ 335 | mobile + "开始任务" + "----------------"+'\n' 336 | items = get_shop_items(sessionId, device_id, token, province, city) 337 | for itemCode in itemCodes: 338 | name = res_map.get(str(itemCode)) 339 | if name: 340 | shop_id = get_shop_item( 341 | sessionId, itemCode, device_id, token, province, city) 342 | res = mt_add(itemCode, str(shop_id), sessionId, 343 | user_id, token, device_id) 344 | s += itemCode + \ 345 | '_' + name + '---------------' + res + '\n' 346 | if ck: 347 | if ck == "\'\'" : 348 | s += userName + '_' + mobile + '---------------' + \ 349 | "未设置MT-Token-Wap,小茅运领取奖励跳过" + '\n' 350 | else : 351 | r = getUserEnergyAward(device_id, ck) 352 | s += userName + '_' + mobile + '---------------' + \ 353 | "小茅运:" + r + '\n' 354 | s += userName + '_' + mobile + "正常结束任务"+'\n \n' 355 | except Exception as e: 356 | s += userName + '_' + mobile + "异常信息"+e 357 | send("i茅台申购+小茅运", s) 358 | -------------------------------------------------------------------------------- /jrttjsb.js: -------------------------------------------------------------------------------- 1 | 404: Not Found -------------------------------------------------------------------------------- /pddFruit.js: -------------------------------------------------------------------------------- 1 | 404: Not Found -------------------------------------------------------------------------------- /qbd.js: -------------------------------------------------------------------------------- 1 | /* 2 | 版本:v2 3 | 入口:Q必达APP 4 | 奖励:低价寄快递+看广告得积分换余额 5 | 实现功能:签到+看广告+自动积分换现金 6 | 7 | 登录需要填写邀请码才能进入:8M5RUA6 8 | 变量名:qbd 9 | 变量值:export qbd="账号&密码" 10 | 多账号换行. 11 | */ 12 | const _0x522308=_0x4a97;(function(_0x3e9e1a,_0x2529b3){const _0x24bb19=_0x4a97,_0x4b9bd0=_0x3e9e1a();while(!![]){try{const _0x326c39=-parseInt(_0x24bb19(0x107))/0x1+-parseInt(_0x24bb19(0x111))/0x2+parseInt(_0x24bb19(0xeb))/0x3+parseInt(_0x24bb19(0x10d))/0x4*(-parseInt(_0x24bb19(0xf9))/0x5)+-parseInt(_0x24bb19(0x104))/0x6*(-parseInt(_0x24bb19(0x102))/0x7)+-parseInt(_0x24bb19(0xee))/0x8*(parseInt(_0x24bb19(0x100))/0x9)+parseInt(_0x24bb19(0x10c))/0xa*(parseInt(_0x24bb19(0xf7))/0xb);if(_0x326c39===_0x2529b3)break;else _0x4b9bd0['push'](_0x4b9bd0['shift']());}catch(_0x3ad53b){_0x4b9bd0['push'](_0x4b9bd0['shift']());}}}(_0x5a97,0x892f4));const axios=require(_0x522308(0xfc)),dotenv=require(_0x522308(0xf1));function _0x5a97(){const _0xcf3bd5=['env','580684uLZoXd','log','❌\x20登录失败:','application/json;charset=utf-8','code','includes','data','error','token','http://xcx.wanhuida888.com/ht/web/login/loginNew?t=','Keep-Alive','2824242ylcpCU','1000','❌\x20登录异常:','1656huuiGk','\x0a🎉\x20所有账号任务执行完毕!','application/json','dotenv','✅\x20账号登录成功','✅\x20广告获取积分:','❌\x20登录失败,跳过该账号任务','❌\x20未设置环境变量\x20qbd,请检查配置!','now','22MVbSIw','✅\x20账号签到结果:','5VpjxQG','post','qbd','axios','gzip','length','msg','44424OsPebz','尝试登录账号:\x20','681331CuBxIp','exit','6gvXWfD','https://xcx.wanhuida888.com/ht/web/task/watchVideo?t=','split','621375ILuYsm','1835','❌\x20请求失败:','com.qsongq.fjqexpress','http://r2mslggpvtq3.wuliucps.com/ht/web/mine/turnIntegral?t=','12293740xYfuhW','4008472JCXWQo','okhttp-okgo/jeasonlzy','ANDROID'];_0x5a97=function(){return _0xcf3bd5;};return _0x5a97();}dotenv['config']();const authorization=process[_0x522308(0x110)][_0x522308(0xfb)];!authorization&&(console['error'](_0x522308(0xf5)),process[_0x522308(0x103)](0x1));const accounts=authorization[_0x522308(0xe5)]('\x0a')||authorization[_0x522308(0xe5)]('@')?authorization['replace'](/\n/g,'@')[_0x522308(0x106)]('@'):[authorization];function getHeaders(_0x975661){const _0x4a3837=_0x522308;return{'Accept-Language':'zh-CN,zh;q=0.8','User-Agent':_0x4a3837(0x10e),'source':_0x4a3837(0x10f),'appId':_0x4a3837(0x10a),'version':_0x4a3837(0x108),'token':_0x975661,'Content-Type':_0x4a3837(0xe3),'Connection':_0x4a3837(0xea),'Accept-Encoding':_0x4a3837(0xfd)};}function _0x4a97(_0x2438bd,_0x99a32a){const _0x5a97ac=_0x5a97();return _0x4a97=function(_0x4a97b3,_0x145b08){_0x4a97b3=_0x4a97b3-0xe1;let _0x15c337=_0x5a97ac[_0x4a97b3];return _0x15c337;},_0x4a97(_0x2438bd,_0x99a32a);}async function requestPost(_0x4c36f4,_0x3f0bc2,_0x5d06e9={}){const _0x2769c7=_0x522308;try{const _0x1f3ef2=await axios[_0x2769c7(0xfa)](_0x4c36f4,_0x5d06e9,{'headers':getHeaders(_0x3f0bc2)});return _0x1f3ef2[_0x2769c7(0xe6)];}catch(_0x387190){return console[_0x2769c7(0xe7)](_0x2769c7(0x109),_0x387190['message']),null;}}async function login(_0x226592,_0x4bac4e){const _0x109951=_0x522308,_0x2a8058=_0x109951(0xe9)+Date[_0x109951(0xf6)](),_0x33e1f1={'password':_0x4bac4e,'account':_0x226592};try{console[_0x109951(0xe1)](_0x109951(0x101)+_0x226592);const _0x3794f6=await axios['post'](_0x2a8058,_0x33e1f1,{'headers':{'Content-Type':_0x109951(0xf0)}});return _0x3794f6[_0x109951(0xe6)][_0x109951(0xe4)]===0x0?(console[_0x109951(0xe1)](_0x109951(0xf2)),_0x3794f6['data'][_0x109951(0xe6)][_0x109951(0xe8)]):(console[_0x109951(0xe7)](_0x109951(0xe2),_0x3794f6['data'][_0x109951(0xff)]),null);}catch(_0x30b98d){return console[_0x109951(0xe7)](_0x109951(0xed),_0x30b98d['message']),null;}}async function sign(_0x4ee73d){const _0x58c12c=_0x522308,_0x21531c='http://a2e403quwt.wuliucps.com/ht/web/mine/signIn?t='+Date[_0x58c12c(0xf6)](),_0x29031b=await requestPost(_0x21531c,_0x4ee73d);if(_0x29031b)console[_0x58c12c(0xe1)](_0x58c12c(0xf8),_0x29031b[_0x58c12c(0xff)]);}async function watchVideos(_0x3f808f){const _0x4371b9=_0x522308,_0x5085e5=_0x4371b9(0x105)+Date['now']();for(let _0x5282e3=0x0;_0x5282e3<0x3;_0x5282e3++){const _0x1a2ec0=await requestPost(_0x5085e5,_0x3f808f);if(_0x1a2ec0)console[_0x4371b9(0xe1)](_0x4371b9(0xf3),_0x1a2ec0[_0x4371b9(0xff)]);await new Promise(_0x10f527=>setTimeout(_0x10f527,0x4e20+_0x5282e3*0x2710));}}async function turnIntegral(_0x4b4bf7){const _0x175d92=_0x522308,_0x2a8152=_0x175d92(0x10b)+Date[_0x175d92(0xf6)](),_0xd820ad={'integral':_0x175d92(0xec)},_0x23fb57=await requestPost(_0x2a8152,_0x4b4bf7,_0xd820ad);if(_0x23fb57)console[_0x175d92(0xe1)]('✅\x20积分转换结果:',_0x23fb57[_0x175d92(0xff)]);}async function main(){const _0x6663b2=_0x522308;console['log']('\x0a✨✨✨\x20Q必达任务脚本启动\x20✨✨✨');for(let _0x5752b3=0x0;_0x5752b3setTimeout(_0x57119b,0x7d0));}console[_0x6663b2(0xe1)](_0x6663b2(0xef));}main(); 13 | -------------------------------------------------------------------------------- /ql.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /* 3 | ========================= 4 | qinglong api 5 | base qinglong project 6 | ========================= 7 | */ 8 | const got = require('got'); 9 | require('dotenv').config(); 10 | const { readFile } = require('fs/promises'); 11 | const path = require('path'); 12 | 13 | const qlDir = '/ql'; 14 | const fs = require('fs'); 15 | let Fileexists = fs.existsSync('/ql/data/config/auth.json'); 16 | let authFile=""; 17 | if (Fileexists) 18 | authFile="/ql/data/config/auth.json" 19 | else 20 | authFile="/ql/config/auth.json" 21 | //const authFile = path.join(qlDir, 'config/auth.json'); 22 | 23 | const api = got.extend({ 24 | prefixUrl: 'http://127.0.0.1:5600', 25 | retry: { limit: 0 }, 26 | }); 27 | 28 | async function getToken() { 29 | const authConfig = JSON.parse(await readFile(authFile)); 30 | return authConfig.token; 31 | } 32 | 33 | module.exports.getEnvs = async (envName) => { 34 | const token = await getToken(); 35 | const body = await api({ 36 | url: 'api/envs', 37 | searchParams: { 38 | searchValue: envName, 39 | t: Date.now(), 40 | }, 41 | headers: { 42 | Accept: 'application/json', 43 | authorization: `Bearer ${token}`, 44 | }, 45 | }).json(); 46 | return body.data; 47 | }; 48 | 49 | module.exports.getEnvsCount = async () => { 50 | const data = await this.getEnvs(); 51 | return data.length; 52 | }; 53 | 54 | module.exports.addEnv = async (cookie, remarks,envName) => { 55 | const token = await getToken(); 56 | const body = await api({ 57 | method: 'post', 58 | url: 'api/envs', 59 | params: { t: Date.now() }, 60 | json: [{ 61 | name: envName, 62 | value: cookie, 63 | remarks, 64 | }], 65 | headers: { 66 | Accept: 'application/json', 67 | authorization: `Bearer ${token}`, 68 | 'Content-Type': 'application/json;charset=UTF-8', 69 | }, 70 | }).json(); 71 | return body; 72 | }; 73 | 74 | module.exports.updateEnv = async (cookie, eid, remarks,envName) => { 75 | const token = await getToken(); 76 | const body = await api({ 77 | method: 'put', 78 | url: 'api/envs', 79 | params: { t: Date.now() }, 80 | json: { 81 | name: envName, 82 | value: cookie, 83 | _id: eid, 84 | remarks, 85 | }, 86 | headers: { 87 | Accept: 'application/json', 88 | authorization: `Bearer ${token}`, 89 | 'Content-Type': 'application/json;charset=UTF-8', 90 | }, 91 | }).json(); 92 | return body; 93 | }; 94 | 95 | module.exports.updateEnv11 = async (cookie, eid, remarks,envName) => { 96 | const token = await getToken(); 97 | const body = await api({ 98 | method: 'put', 99 | url: 'api/envs', 100 | params: { t: Date.now() }, 101 | json: { 102 | name: envName, 103 | value: cookie, 104 | id: eid, 105 | remarks, 106 | }, 107 | headers: { 108 | Accept: 'application/json', 109 | authorization: `Bearer ${token}`, 110 | 'Content-Type': 'application/json;charset=UTF-8', 111 | }, 112 | }).json(); 113 | return body; 114 | }; 115 | 116 | module.exports.DisableCk = async (eid) => { 117 | const token = await getToken(); 118 | const body = await api({ 119 | method: 'put', 120 | url: 'api/envs/disable', 121 | params: { t: Date.now() }, 122 | body: JSON.stringify([eid]), 123 | headers: { 124 | Accept: 'application/json', 125 | authorization: `Bearer ${token}`, 126 | 'Content-Type': 'application/json;charset=UTF-8', 127 | }, 128 | }).json(); 129 | return body; 130 | }; 131 | 132 | module.exports.EnableCk = async (eid) => { 133 | const token = await getToken(); 134 | const body = await api({ 135 | method: 'put', 136 | url: 'api/envs/enable', 137 | params: { t: Date.now() }, 138 | body: JSON.stringify([eid]), 139 | headers: { 140 | Accept: 'application/json', 141 | authorization: `Bearer ${token}`, 142 | 'Content-Type': 'application/json;charset=UTF-8', 143 | }, 144 | }).json(); 145 | return body; 146 | }; 147 | 148 | module.exports.getstatus = async(eid) => { 149 | const envs = await this.getEnvs(); 150 | var tempid = 0; 151 | for (let i = 0; i < envs.length; i++) { 152 | tempid = 0; 153 | if (envs[i]._id) { 154 | tempid = envs[i]._id; 155 | } 156 | if (envs[i].id) { 157 | tempid = envs[i].id; 158 | } 159 | if (tempid == eid) { 160 | return envs[i].status; 161 | } 162 | } 163 | return 99; 164 | }; 165 | 166 | module.exports.getEnvById = async(eid) => { 167 | const envs = await this.getEnvs(); 168 | var tempid = 0; 169 | for (let i = 0; i < envs.length; i++) { 170 | tempid = 0; 171 | if (envs[i]._id) { 172 | tempid = envs[i]._id; 173 | } 174 | if (envs[i].id) { 175 | tempid = envs[i].id; 176 | } 177 | if (tempid == eid) { 178 | return envs[i].value; 179 | } 180 | } 181 | return ""; 182 | }; 183 | 184 | /*module.exports.getEnvByCookie = async (cookie) => { 185 | const envs = await this.getEnvs(); 186 | for (let i = 0; i < envs.length; i++) { 187 | var tempptpin = decodeURIComponent(envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/) && envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/)[1]); 188 | if(tempptpin==cookie){ 189 | return envs[i]; 190 | } 191 | } 192 | return ""; 193 | };*/ 194 | 195 | module.exports.delEnv = async (eid) => { 196 | const token = await getToken(); 197 | const body = await api({ 198 | method: 'delete', 199 | url: 'api/envs', 200 | params: { t: Date.now() }, 201 | body: JSON.stringify([eid]), 202 | headers: { 203 | Accept: 'application/json', 204 | authorization: `Bearer ${token}`, 205 | 'Content-Type': 'application/json;charset=UTF-8', 206 | }, 207 | }).json(); 208 | return body; 209 | }; 210 | -------------------------------------------------------------------------------- /quanzhan.py: -------------------------------------------------------------------------------- 1 | 2 | """ 3 | 小程序搜 泉站大桶订水桶装水同城送水 4 | 5 | 变量 authcode # authorization #备注 (没有备注 也可以运行) 6 | 变量名 qztoken 7 | 项目 泉站订水 8 | 9 | """ 10 | import os 11 | import requests 12 | from datetime import datetime, timezone, timedelta 13 | import json 14 | import sys 15 | import time 16 | import random 17 | from io import StringIO 18 | 19 | enable_notification =1 # 控制是否启用通知的变量 0 不发送 1 发 20 | 21 | # 只有在需要发送通知时才尝试导入notify模块 22 | if enable_notification == 1: 23 | try: 24 | from notify import send 25 | except ModuleNotFoundError: 26 | print("警告:未找到notify.py模块。它不是一个依赖项,请勿错误安装。程序将退出。") 27 | sys.exit(1) 28 | 29 | #---------解--的简化0.2框架-------- 30 | # 配置参数 31 | base_url = "https://microuser.quanzhan888.com" # 实际的基础URL 32 | 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(0x6309080f)XWEB/8519" 33 | 34 | def get_beijing_date(): # 获取北京日期的函数 35 | beijing_time = datetime.now(timezone(timedelta(hours=8))) 36 | return beijing_time.date() 37 | 38 | def timestamp_to_beijing_time(timestamp): 39 | utc_zone = timezone.utc 40 | beijing_zone = timezone(timedelta(hours=8)) 41 | utc_time = datetime.fromtimestamp(timestamp, utc_zone) 42 | beijing_time = utc_time.astimezone(beijing_zone) 43 | return beijing_time.strftime("%Y-%m-%d %H:%M:%S") 44 | 45 | def get_env_variable(var_name): 46 | value = os.getenv(var_name) 47 | if value is None: 48 | print(f'环境变量{var_name}未设置,请检查。') 49 | return None 50 | 51 | accounts = value.strip().split('\n') # 使用 \n 分割 52 | num_accounts = len(accounts) 53 | print(f'-----------本次账号运行数量:{num_accounts}-----------') 54 | print(f'泉站大桶订水--QGh3amllamll ') 55 | 56 | return accounts 57 | 58 | #113.28824159502027 59 | #23.103660007697727 60 | def fz_hs(auth_code, authorization, user_agent, sign): #封装headers 61 | return { 62 | 'Host': 'microuser.quanzhan888.com', 63 | 'Connection': 'keep-alive', 64 | 'Content-Length': '2', 65 | 'charset': 'utf-8', 66 | 'product': "shop", 67 | 'authcode': auth_code, 68 | 'authorization': authorization, 69 | 'user-agent': user_agent, 70 | 'sign': sign, 71 | 'Accept-Encoding': 'gzip,compress,br,deflate', 72 | 'platform': "wx", 73 | 'x-requested-with': 'xmlhttprequest', 74 | 'content-type': 'application/x-www-form-urlencoded', 75 | } 76 | 77 | def wdqbsj(auth_code, authorization): # 个人信息/钱包 78 | url = f"{base_url}/user/get-wallet-info" 79 | headers = fz_hs(auth_code, authorization, user_agent, "99914b932bd37a50b983c5e7c90ae93b") 80 | data = json.dumps({}) # 发送空的JSON数据 81 | #print(url) 82 | 83 | try: 84 | response = requests.post(url, headers=headers, data=data) 85 | response.raise_for_status() 86 | response_data = response.json() 87 | #print("解析的JSON数据:", response_data) 88 | 89 | # 判断code并提取所需数据 90 | if response_data.get('code') == 0: 91 | user_id = response_data['data']['wallet_info'].get('user_id') 92 | total_balance = response_data['data']['wallet_info'].get('total_balance') 93 | today_income = response_data['data']['wallet_info'].get('today_income') 94 | #print(f"用户ID: {user_id}, 总余额: {total_balance}, 今日收入: {today_income}") 95 | print(f"🆔: {user_id}, 总💸: {total_balance}, 今日: {today_income}") 96 | 97 | # 判断今日收入是否大于0 98 | if float(today_income) > 0: 99 | print("今日已有收入,不需要签到") 100 | #tj_sign(auth_code, authorization)#测试提交签到 101 | else: 102 | print("今日无收入,需要签到") 103 | tj_sign(auth_code, authorization) 104 | 105 | 106 | else: 107 | print("响应代码不为0,完整响应体:", response_data) 108 | 109 | except ValueError: 110 | print("响应不是有效的JSON格式。") 111 | except requests.exceptions.RequestException as e: 112 | print(f"请求失败: {e}") 113 | 114 | 115 | def tj_sign(auth_code, authorization): # 提交签到 116 | url = f"{base_url}/user/do-sign" 117 | headers = fz_hs(auth_code, authorization, user_agent, "99914b932bd37a50b983c5e7c90ae93b") 118 | data = json.dumps({}) # 发送空的JSON数据 119 | 120 | try: 121 | response = requests.post(url, headers=headers, data=data) 122 | response.raise_for_status() 123 | response_data = response.json() 124 | #print("解析的JSON数据:", response_data) 125 | 126 | # 提取所需数据并转换时间戳 127 | if 'data' in response_data and len(response_data['data']) > 0: 128 | for item in response_data['data']: 129 | user_id = item.get('user_id') 130 | sign_date = timestamp_to_beijing_time(item.get('sign_date')) 131 | sign_time = timestamp_to_beijing_time(item.get('sign_time')) 132 | #print(f"用户: {user_id}, 签名日期: {sign_date}, 签到时间: {sign_time}") 133 | print(f" 签名日期: {sign_date}, 签到🎉: {sign_time}") 134 | return response_data 135 | except ValueError: 136 | print("响应不是有效的JSON格式。") 137 | return None 138 | except requests.exceptions.RequestException as e: 139 | print(f"请求失败: {e}") 140 | return None 141 | 142 | #------------通知开始----------- 143 | 144 | class Tee: 145 | def __init__(self, *files): 146 | self.files = files 147 | 148 | def write(self, obj): 149 | for file in self.files: 150 | file.write(obj) 151 | file.flush() # 确保及时输出 152 | 153 | def flush(self): 154 | for file in self.files: 155 | file.flush() 156 | #------------通知结束----------- 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | def main(): 167 | string_io = StringIO() 168 | original_stdout = sys.stdout 169 | 170 | try: 171 | sys.stdout = Tee(sys.stdout, string_io) 172 | 173 | var_name = 'qztoken' # 环境变量名 174 | accounts = get_env_variable(var_name) 175 | if not accounts: 176 | return 177 | 178 | print(f'找到 {len(accounts)} 个账号的令牌。') 179 | total_tokens = len(accounts) 180 | 181 | for index, account in enumerate(accounts, start=1): 182 | parts = account.split('#') 183 | auth_code, authorization = parts[0], parts[1] 184 | remark = None if len(parts) == 2 else parts[2] # 检查是否有备注 185 | 186 | remark_info = f" --- 备注: {remark}" if remark else "" 187 | print(f"------账号 {index}/{total_tokens}{remark_info} ------") 188 | 189 | wdqbsj(auth_code, authorization) # 个人信息/钱包 190 | 191 | # 暂停3到5秒 192 | time.sleep(random.randint(3, 5)) 193 | 194 | finally: 195 | sys.stdout = original_stdout 196 | output_content = string_io.getvalue() 197 | 198 | if enable_notification: 199 | send("-泉站大桶订水-通知", output_content) 200 | 201 | if __name__ == "__main__": 202 | main() 203 | 204 | """ 205 | #本地测试用 206 | os.environ['qztoken'] = ''' 207 | authcode # authorization 208 | 209 | ''' 210 | 211 | def main(): 212 | var_name = 'qztoken' # 环境变量名 213 | accounts = get_env_variable(var_name) 214 | if not accounts: 215 | return 216 | 217 | print(f'找到 {len(accounts)} 个账号的令牌。') 218 | total_tokens = len(accounts) 219 | 220 | for index, account in enumerate(accounts, start=1): 221 | parts = account.split('#') 222 | auth_code, authorization = parts[0], parts[1] 223 | remark = None if len(parts) == 2 else parts[2] # 检查是否有备注 224 | 225 | remark_info = f" --- 备注: {remark}" if remark else "" 226 | print(f"------账号 {index}/{total_tokens}{remark_info} ------") 227 | 228 | wdqbsj(auth_code, authorization)# 个人信息/钱包 229 | 230 | 231 | if __name__ == "__main__": 232 | main() 233 | """ 234 | -------------------------------------------------------------------------------- /sysxc.py: -------------------------------------------------------------------------------- 1 | """ 2 | new Env("书亦烧仙草python版") 3 | 1. 书亦烧仙草签到 抓包scrm-prod.shuyi.org.cn域名请求头里的auth 4 | 脚本仅供学习交流使用, 请在下载后24h内删除 5 | 2. cron 以防ocr识别出错每天运行两次左右 6 | 3. ddddocr搭建方法https://github.com/sml2h3/ocr_api_server #如果脚本里的失效请自行搭建 7 | """ 8 | import json,logging,os,sys,time,base64,requests 9 | from os import environ, system, path 10 | 11 | logger = logging.getLogger(name=None) 12 | logging.Formatter("%(message)s") 13 | logger.setLevel(logging.INFO) 14 | logger.addHandler(logging.StreamHandler()) 15 | 16 | def load_send(): 17 | global send, mg 18 | cur_path = path.abspath(path.dirname(__file__)) 19 | if path.exists(cur_path + "/notify.py"): 20 | try: 21 | from notify import send 22 | print("加载通知服务成功!") 23 | except: 24 | send = False 25 | print("加载通知服务失败~") 26 | else: 27 | send = False 28 | print("加载通知服务失败~") 29 | 30 | load_send() 31 | 32 | try: 33 | from Crypto.Cipher import AES 34 | except: 35 | logger.info( 36 | "\n未检测到pycryptodome\n需要Python依赖里安装pycryptodome\n安装失败先linux依赖里安装gcc、python3-dev、libc-dev\n如果还是失败,重启容器,或者重启docker就能解决") 37 | exit(0) 38 | 39 | def setHeaders(i): 40 | headers = { 41 | "auth": cookies[i], 42 | "hostname": "scrm-prod.shuyi.org.cn", 43 | "content-type": "application/json", 44 | "host": "scrm-prod.shuyi.org.cn", 45 | "User-Agent": "Mozilla/5.0 (Linux; Android 10; V2203A Build/SP1A.210812.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/107.0.5304.141 Mobile Safari/537.36 XWEB/5023 MMWEBSDK/20221012 MMWEBID/1571 MicroMessenger/8.0.30.2260(0x28001E55) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android" 46 | } 47 | return headers 48 | 49 | cookies = [] 50 | try: 51 | cookies = os.environ["sysxc_auth"].split("&") 52 | if len(os.environ["sysxc_auth"]) > 0: 53 | logger.info("已获取并使用Env环境Cookie\n声明:本脚本为学习python,请勿用于非法用途\n") 54 | 55 | 56 | except: 57 | logger.info( 58 | "【提示】请先添加sysxc_auth") 59 | exit(3) 60 | 61 | def getVCode(headers): 62 | """获取滑块图片""" 63 | data = { 64 | "captchaType": "blockPuzzle", 65 | "clientUid": "slider-6292e85b-e871-4abd-89df-4d97709c6e0c", 66 | "ts": int(time.time() * 1000) 67 | } 68 | url = 'https://scrm-prod.shuyi.org.cn/saas-gateway/api/agg-trade/v1/signIn/getVCode' 69 | response = requests.post(url, json=data, headers=headers) 70 | return response.json() 71 | 72 | 73 | 74 | def ocr(tg,bg): 75 | """使用自有ocr识别滑块坐标""" 76 | url = 'http://103.45.185.224:9898/slide/match/b64/json' 77 | jsonstr = json.dumps({'target_img': tg, 'bg_img': bg}) 78 | response = requests.post(url, data=base64.b64encode(jsonstr.encode()).decode()) 79 | return response.json() 80 | 81 | 82 | ''' 83 | 采用AES对称加密算法 84 | ''' 85 | 86 | BLOCK_SIZE = 16 # Bytes 87 | pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \ 88 | chr(BLOCK_SIZE - len(s) % BLOCK_SIZE) 89 | unpad = lambda s: s[:-ord(s[len(s) - 1:])] 90 | 91 | 92 | def aesEncrypt(key, data): 93 | ''' 94 | AES的ECB模式加密方法 95 | :param key: 密钥 96 | :param data:被加密字符串(明文) 97 | :return:密文 98 | ''' 99 | key = key.encode('utf8') 100 | # 字符串补位 101 | data = pad(data) 102 | cipher = AES.new(key, AES.MODE_ECB) 103 | # 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串 104 | result = cipher.encrypt(data.encode()) 105 | encodestrs = base64.b64encode(result) 106 | enctext = encodestrs.decode('utf8') 107 | return enctext 108 | 109 | 110 | def aesDecrypt(key, data): 111 | ''' 112 | :param key: 密钥 113 | :param data: 加密后的数据(密文) 114 | :return:明文 115 | ''' 116 | key = key.encode('utf8') 117 | data = base64.b64decode(data) 118 | cipher = AES.new(key, AES.MODE_ECB) 119 | 120 | # 去补位 121 | text_decrypted = unpad(cipher.decrypt(data)) 122 | text_decrypted = text_decrypted.decode('utf8') 123 | return text_decrypted 124 | 125 | 126 | def checkVCode(pointJson, token): 127 | """验证""" 128 | try: 129 | data = { 130 | "captchaType": "blockPuzzle", 131 | "pointJson": pointJson, 132 | "token": token 133 | } 134 | 135 | url = 'https://scrm-prod.shuyi.org.cn/saas-gateway/api/agg-trade/v1/signIn/checkVCode' 136 | response = requests.post(url, json=data, headers=headers) 137 | result = response.json() 138 | resultCode = result['resultCode'] 139 | resultMsg = result['resultMsg'] 140 | if resultCode == '0000': 141 | logger.info(f"校验结果:成功") 142 | else: 143 | logger.info(f"校验结果: {resultMsg}") 144 | time.sleep(3) 145 | main() 146 | except Exception as err: 147 | print(err) 148 | 149 | 150 | def check_sign(pointJson): 151 | """签到""" 152 | try: 153 | data = { 154 | "captchaVerification": pointJson 155 | } 156 | url = 'https://scrm-prod.shuyi.org.cn/saas-gateway/api/agg-trade/v1/signIn/insertSignInV3' 157 | response = requests.post(url, json=data, headers=headers) 158 | result = response.json() 159 | resultCode = result['resultCode'] 160 | 161 | resultMsg = result['resultMsg'] 162 | if resultCode == '0': 163 | logger.info(f"签到结果:{result}") 164 | send('书亦烧仙草签到通知', result) 165 | else: 166 | logger.info(f"签到结果: {resultMsg}") 167 | send('书亦烧仙草签到通知', resultMsg) 168 | except Exception as err: 169 | print(err) 170 | sys.exit(0) 171 | 172 | def main(): 173 | logger.info("--------------------任务开始--------------------") 174 | result = getVCode(headers) 175 | bg = result['data']['originalImageBase64'] 176 | tg = result['data']['jigsawImageBase64'] 177 | key = result['data']['secretKey'] 178 | token = result['data']['token'] 179 | logger.info(f"本次口令为: {token}") 180 | logger.info(f"本次密钥为: {key}") 181 | time.sleep(1.5) 182 | logger.info("--------------------识别滑块--------------------") 183 | result = ocr(tg,bg) 184 | res = result['result']['target'] 185 | d = (res[0]) 186 | logger.info(f"滑动距离为: {d}") 187 | logger.info("--------------------执行算法--------------------") 188 | aes_str = json.dumps({"x": d, "y": 5}) 189 | data = aes_str.replace(' ', '') 190 | logger.info(f"加密前: {data}") 191 | time.sleep(1.5) 192 | ecdata = aesEncrypt(key, data) 193 | aesDecrypt(key, ecdata) 194 | pointJson = aesEncrypt(key, data) 195 | logger.info(f"加密后: {pointJson}") 196 | logger.info("--------------------校验滑块--------------------") 197 | checkVCode(pointJson, token) 198 | logger.info("--------------------开始签到--------------------") 199 | str = (token + '---' + aes_str) 200 | data = str.replace(' ', '') 201 | ecdata = aesEncrypt(key, data) 202 | aesDecrypt(key, ecdata) 203 | pointJson = aesEncrypt(key, data) 204 | time.sleep(0.5) 205 | check_sign(pointJson) 206 | 207 | if __name__ == '__main__': 208 | for i in range(len(cookies)): 209 | logger.info(f"\n开始第{i + 1}个账号") 210 | 211 | headers = setHeaders(i) 212 | main() 213 | logger.info("所有账号执行完成\n") 214 | sys.exit(0) 215 | 216 | -------------------------------------------------------------------------------- /topspace.py: -------------------------------------------------------------------------------- 1 | 2 | ''' 3 | topspace微信小程序 4 | 5 | 6 | new Env('topspace'); 7 | 抓x-vcs-user-token和app-id用&分割并且多号@ 8 | ''' 9 | import requests 10 | import os 11 | 12 | class AC: 13 | def __init__(self, cookie): 14 | self.headers = { 15 | '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", 16 | 'app-id': cookie.split('&')[1], 17 | 'x-vcs-user-token': cookie.split('&')[0] 18 | } 19 | 20 | def info(self): 21 | url = "https://m.sda.changan.com.cn/app-apigw/user-info-api/api/v1/sda-app/personal-info/basic-information" 22 | response = requests.get(url, headers=self.headers) 23 | data = response.json() 24 | if data['code'] == 0: 25 | userNickname = data["data"]["userNickname"] 26 | totalPoints = data["data"]["pointInfo"]["totalPoints"] 27 | print(f"用户:{userNickname}当前共有{totalPoints}币") 28 | return userNickname 29 | else: 30 | msg = data["msg"] 31 | print(f"登录失败: {msg}") 32 | return None 33 | 34 | def check(self, userNickname): 35 | url = "https://m.sda.changan.com.cn/app-apigw/user-info-api/api/v2/point/check-in" 36 | response = requests.post(url, headers=self.headers) 37 | data = response.json() 38 | if data['code'] == 0: 39 | description = data["data"]["description"] 40 | total = data["data"]["total"] 41 | print(f"用户:{userNickname}{description}获得{total}TOP币") 42 | else: 43 | msg = data["msg"] 44 | print(f"签到失败: {msg}") 45 | 46 | def list_articles(self, userNickname): 47 | url = "https://m.sda.changan.com.cn/app-apigw/sda-zone-api/api/v1/post/list" 48 | data = { 49 | "section_id": "1002", 50 | "page": { 51 | "current_page": 1, 52 | "page_size": 20 53 | }, 54 | "sort_type": "RECOMMEND_FIRST" 55 | } 56 | response = requests.post(url, headers=self.headers, json=data) 57 | data = response.json() 58 | if data['code'] == 0: 59 | article_id = data["data"]["list"][0]["id"] 60 | print(f"用户:{userNickname}获取文章{article_id}") 61 | return article_id 62 | else: 63 | msg = data["msg"] 64 | print(f"获取文章失败: {msg}") 65 | 66 | def publish_comment(self, userNickname, article_id): 67 | url = "https://m.sda.changan.com.cn/app-apigw/sda-zone-api/api/v1/comment/publish" 68 | data = { 69 | "content": "很酷", 70 | "post_id": article_id 71 | } 72 | response = requests.post(url, headers=self.headers, json=data) 73 | data = response.json() 74 | if data['code'] == 0: 75 | print("发布成功") 76 | else: 77 | print(f"发布失败: {data['msg']}") 78 | 79 | def share_article(self, userNickname, article_id): 80 | url = "https://m.sda.changan.com.cn/app-apigw/sda-zone-api/api/v1/action/share" 81 | data = { 82 | "post_id": article_id 83 | } 84 | response = requests.post(url, headers=self.headers, json=data) 85 | data = response.json() 86 | if data['code'] == 0: 87 | print("转发成功") 88 | else: 89 | print(f"转发失败: {data['msg']}") 90 | 91 | if __name__ == "__main__": 92 | topspace = os.environ.get('topspace') 93 | if not topspace: 94 | print("请设置环境变量 'topspace' 后再运行") 95 | else: 96 | topspace_list = topspace.split('@') 97 | for num, topspace_item in enumerate(topspace_list, start=1): 98 | x_vcs_user_token, app_id = topspace_item.split('&') 99 | cookie = f"{x_vcs_user_token}&{app_id}" 100 | ac = AC(cookie) 101 | print(f"=====开始执行第{num}个账号任务=====") 102 | user_nickname = ac.info() 103 | if user_nickname: 104 | ac.check(user_nickname) 105 | article_id = ac.list_articles(user_nickname) 106 | if article_id: 107 | ac.publish_comment(user_nickname, article_id) 108 | ac.share_article(user_nickname, article_id) 109 | print("---------账号任务执行完毕---------") 110 | -------------------------------------------------------------------------------- /wangchao.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import hashlib 4 | import math 5 | import time 6 | import requests 7 | import datetime 8 | import os 9 | from urllib.parse import urlparse, parse_qs 10 | import random 11 | from Crypto.PublicKey import RSA 12 | from Crypto.Cipher import PKCS1_v1_5 13 | import base64 14 | from requests.adapters import HTTPAdapter 15 | from urllib3.util.retry import Retry 16 | import urllib.parse 17 | debug=0 18 | def jm(password): 19 | public_key_base64 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD6XO7e9YeAOs+cFqwa7ETJ+WXizPqQeXv68i5vqw9pFREsrqiBTRcg7wB0RIp3rJkDpaeVJLsZqYm5TW7FWx/iOiXFc+zCPvaKZric2dXCw27EvlH5rq+zwIPDAJHGAfnn1nmQH7wR3PCatEIb8pz5GFlTHMlluw4ZYmnOwg+thwIDAQAB" 20 | public_key_der = base64.b64decode(public_key_base64) 21 | key = RSA.importKey(public_key_der) 22 | cipher = PKCS1_v1_5.new(key) 23 | password_bytes = password.encode('utf-8') 24 | encrypted_password = cipher.encrypt(password_bytes) 25 | encrypted_password_base64 = base64.b64encode(encrypted_password).decode('utf-8') 26 | url_encoded_data = urllib.parse.quote(encrypted_password_base64) 27 | return url_encoded_data 28 | 29 | #生成设备号 30 | def generate_random_uuid(): 31 | # 设备号其实可以写死,保险起见选择随机生成 32 | uuid_str = '00000000-{:04x}-{:04x}-0000-0000{:08x}'.format( 33 | random.randint(0, 0xfff) | 0x4000, 34 | random.randint(0, 0x3fff) | 0x8000, 35 | random.getrandbits(32) 36 | ) 37 | return uuid_str 38 | 39 | # 签名并获取认证码 40 | def sign(phone, password): 41 | url_encoded_data = jm(password) 42 | url = "https://passport.tmuyun.com/web/oauth/credential_auth" 43 | payload = f"client_id=10019&password={url_encoded_data}&phone_number={phone}" 44 | headers = { 45 | 'User-Agent': "ANDROID;13;10019;6.0.2;1.0;null;MEIZU 20", 46 | 'Connection': "Keep-Alive", 47 | 'Accept-Encoding': "gzip", 48 | 'Content-Type': "application/x-www-form-urlencoded", 49 | 'Cache-Control': "no-cache", 50 | 'X-SIGNATURE': "185d21c6f3e9ec4af43e0065079b8eb7f1bb054134481e57926fcc45e304b896", 51 | } 52 | 53 | response = requests.post(url, data=payload, headers=headers) 54 | try: 55 | code = response.json()['data']['authorization_code']['code'] 56 | url = "https://vapp.taizhou.com.cn/api/zbtxz/login" 57 | payload = f"check_token=&code={code}&token=&type=-1&union_id=" 58 | headers = { 59 | 'User-Agent': "6.0.2;{deviceid};Meizu MEIZU 20;Android;13;tencent;6.10.0", 60 | 'Connection': "Keep-Alive", 61 | 'Accept-Encoding': "gzip", 62 | 'Content-Type': "application/x-www-form-urlencoded", 63 | 'X-SESSION-ID': "66586b383f293a7173e4c8f4", 64 | 'X-REQUEST-ID': "110c1987-1637-4f4e-953e-e35272bb891e", 65 | 'X-TIMESTAMP': "1717072109065", 66 | 'X-SIGNATURE': "a69f171e284594a5ecc4baa1b2299c99167532b9795122bae308f27592e94381", 67 | 'X-TENANT-ID': "64", 68 | 'Cache-Control': "no-cache" 69 | } 70 | response = requests.post(url, data=payload, headers=headers) 71 | message = response.json()['message'] 72 | account_id = response.json()['data']['account']['id'] 73 | session_id = response.json()['data']['session']['id'] 74 | name = response.json()['data']['account']['nick_name'] 75 | return message, account_id, session_id, name 76 | except Exception: 77 | print('出错啦!') 78 | return None, None, None, None 79 | 80 | #生成验证码 81 | def generate_md5(input_str): 82 | md5_obj = hashlib.md5() 83 | input_str_encoded = input_str.encode('utf-8') 84 | md5_obj.update(input_str_encoded) 85 | return md5_obj.hexdigest() 86 | 87 | #获取阅读的JSESSIONID 88 | def get_special_cookie(): 89 | special_cookie_url = f'https://xmt.taizhou.com.cn/prod-api/user-read/app/login?id={account_id}&sessionId={session_id}&deviceId={deviceid}' 90 | 91 | headers = { 92 | 'Host': 'xmt.taizhou.com.cn', 93 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0', 94 | 'Accept': '*/*', 95 | 'X-Requested-With': 'com.shangc.tiennews.taizhou', 96 | 'Sec-Fetch-Site': 'same-origin', 97 | 'Sec-Fetch-Mode': 'cors', 98 | 'Sec-Fetch-Dest': 'empty', 99 | 'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01', 100 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 101 | } 102 | response = requests.get(special_cookie_url, headers=headers) 103 | if debug and response.status_code == 200: 104 | print('执行任务获取阅读jse') 105 | print('下面是访问的url\n',special_cookie_url) 106 | print('下面是访问的headers\n',headers) 107 | print('下面是返回的response\n',response.headers) 108 | if response.status_code == 200 and response.headers['Set-Cookie']: 109 | jsessionid1 =response.headers['Set-Cookie'].split(';')[0]+';' 110 | print('获取特殊cookie成功',jsessionid1) 111 | return response.headers['Set-Cookie'] 112 | else: 113 | print('获取jsesesionid失败',response.headers) 114 | 115 | #获取日期 116 | def get_current_date(): 117 | now = datetime.datetime.now() 118 | year_str = str(now.year) 119 | month_str = f"0{now.month}" if now.month < 10 else str(now.month) 120 | day_str = f"0{now.day}" if now.day < 10 else str(now.day) 121 | print(f"当前日期{year_str}{month_str}{day_str}") 122 | return year_str + month_str + day_str 123 | 124 | #获取阅读列表 125 | def fetch_article_list(): 126 | headers = { 127 | 'Host': 'xmt.taizhou.com.cn', 128 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0', 129 | 'Accept': '*/*', 130 | 'X-Requested-With': 'com.shangc.tiennews.taizhou', 131 | 'Sec-Fetch-Site': 'same-origin', 132 | 'Sec-Fetch-Mode': 'cors', 133 | 'Sec-Fetch-Dest': 'empty', 134 | 'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01', 135 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 136 | 'cookie': f'{special_cookie};' 137 | } 138 | url=f'https://xmt.taizhou.com.cn/prod-api/user-read/list/{get_current_date()}' 139 | response = requests.get(url, headers=headers) 140 | if debug and response.status_code == 200: 141 | print('执行任务获取阅读列表') 142 | print('下面是访问的url\n',url) 143 | print('下面是访问的headers\n',headers) 144 | print('下面是返回的response\n',response.headers) 145 | msg = response.json()['msg'] 146 | print(msg) 147 | return response.json() 148 | 149 | #阅读文章 150 | def mark_article_as_read(article_id,retry_count=3): 151 | headers = { 152 | 'Host': 'xmt.taizhou.com.cn', 153 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0', 154 | 'Accept': '*/*', 155 | 'X-Requested-With': 'com.shangc.tiennews.taizhou', 156 | 'Sec-Fetch-Site': 'same-origin', 157 | 'Sec-Fetch-Mode': 'cors', 158 | 'Sec-Fetch-Dest': 'empty', 159 | 'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01', 160 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 161 | 'cookie': f'{special_cookie}', 162 | } 163 | timestamp_str = str(math.floor(time.time() * 1000)) 164 | signature = generate_md5('&&' + str(article_id) + '&&TlGFQAOlCIVxnKopQnW&&' + timestamp_str) 165 | url = f'https://xmt.taizhou.com.cn/prod-api/already-read/article?articid={article_id}×tamp={timestamp_str}&signature={signature}' 166 | 167 | # 创建一个包含重试策略的会话 168 | session = requests.Session() 169 | retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504]) 170 | session.mount('https://', HTTPAdapter(max_retries=retries)) 171 | 172 | for attempt in range(retry_count): 173 | try: 174 | response = session.get(url, headers=headers, timeout=10) 175 | if response.status_code == 200: 176 | print(response.text) 177 | return 178 | else: 179 | print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}") 180 | except requests.exceptions.RequestException as e: 181 | print(f"请求失败 (尝试 {attempt + 1}/{retry_count}): {e}") 182 | time.sleep(2) # 在重试前增加延迟 183 | 184 | 185 | # 登录并获取抽奖JSESSIONID 186 | def login(account_id, session_id, retry_count=3): 187 | base_url = 'https://srv-app.taizhou.com.cn' 188 | url = f'{base_url}/tzrb/user/loginWC' 189 | headers = { 190 | 'Host': 'srv-app.taizhou.com.cn', 191 | 'Connection': 'keep-alive', 192 | 'Pragma': 'no-cache', 193 | 'Cache-Control': 'no-cache', 194 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0', 195 | 'Accept': '*/*', 196 | 'X-Requested-With': 'com.shangc.tiennews.taizhou', 197 | 'Sec-Fetch-Site': 'same-origin', 198 | 'Sec-Fetch-Mode': 'cors', 199 | 'Sec-Fetch-Dest': 'empty', 200 | 'Referer': 'https://srv-app.taizhou.com.cn/luckdraw/', 201 | 'Accept-Encoding': 'gzip, deflate', 202 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7' 203 | } 204 | params = { 205 | 'accountId': account_id, 206 | 'sessionId': session_id 207 | } 208 | 209 | # 创建一个包含重试策略的会话 210 | session = requests.Session() 211 | retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504]) 212 | session.mount('https://', HTTPAdapter(max_retries=retries)) 213 | 214 | for attempt in range(retry_count): 215 | try: 216 | response = session.get(url, params=params, headers=headers, timeout=10) 217 | if response.status_code == 200: 218 | cookies_dict = response.cookies.get_dict() 219 | s_JSESSIONID = '; '.join([f'{k}={v}' for k, v in cookies_dict.items()]) 220 | return s_JSESSIONID 221 | else: 222 | print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}") 223 | except requests.exceptions.RequestException as e: 224 | print(f"请求失败 (尝试 {attempt + 1}/{retry_count}): {e}") 225 | time.sleep(2) # 在重试前增加延迟 226 | 227 | return None 228 | 229 | #抽奖 230 | def cj(jsessionid, retry_count=3): 231 | url = "https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/saveUpdate" 232 | payload = "activityId=67&sessionId=undefined&sig=undefined&token=undefined" 233 | headers = { 234 | 'Host': 'srv-app.taizhou.com.cn', 235 | 'Connection': 'keep-alive', 236 | 'Content-Length': '63', 237 | '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/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0', 238 | 'Content-type': 'application/x-www-form-urlencoded', 239 | 'Accept': '*/*', 240 | 'Origin': 'https://srv-app.taizhou.com.cn', 241 | 'X-Requested-With': 'com.shangc.tiennews.taizhou', 242 | 'Sec-Fetch-Site': 'same-origin', 243 | 'Sec-Fetch-Mode': 'cors', 244 | 'Sec-Fetch-Dest': 'empty', 245 | 'Referer': 'https://srv-app.taizhou.com.cn/luckdraw-ra-1/', 246 | 'Accept-Encoding': 'gzip, deflate', 247 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 248 | 'Cookie': f'{jsessionid}' 249 | } 250 | 251 | # 创建一个包含重试策略的会话 252 | session = requests.Session() 253 | retries = Retry(total=4, backoff_factor=1, status_forcelist=[502, 503, 504]) 254 | session.mount('https://', HTTPAdapter(max_retries=retries)) 255 | 256 | for attempt in range(retry_count): 257 | try: 258 | response = session.post(url, data=payload, headers=headers, timeout=10) 259 | if response.status_code == 200: 260 | print(response.text) 261 | display_draw_results(jsessionid) 262 | return # 成功则退出函数 263 | else: 264 | print(f"POST 请求失败,状态码: {response.status_code}, 响应内容: {response.text}") 265 | except requests.exceptions.RequestException as e: 266 | print(f"POST 请求失败 (尝试 {attempt + 1}/{retry_count}): {e}") 267 | time.sleep(2) # 在重试前增加延迟 268 | 269 | #查询抽奖结果 270 | def display_draw_results(cookies): 271 | draw_result_headers = { 272 | 'Host': 'srv-app.taizhou.com.cn', 273 | 'Connection': 'keep-alive', 274 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0', 275 | 'Accept': '*/*', 276 | 'X-Requested-With': 'com.shangc.tiennews.taizhou', 277 | 'Sec-Fetch-Site': 'same-origin', 278 | 'Sec-Fetch-Mode': 'cors', 279 | 'Sec-Fetch-Dest': 'empty', 280 | 'Referer': 'https://srv-app.taizhou.com.cn/luckdraw-awsc-231023/', 281 | 'Accept-Encoding': 'gzip, deflate', 282 | 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 283 | 'Cookie': f'{cookies}', 284 | } 285 | result_url = 'https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/pageList?pageSize=10&pageNum=1&activityId=67' 286 | result_data = requests.get(result_url, headers=draw_result_headers).json()["data"]["records"] 287 | for record in result_data: 288 | create_time_str = str(record["createTime"]) 289 | award_name_str = str(record["awardName"]) 290 | print(f"{create_time_str}---------{award_name_str}") 291 | 292 | # 从环境变量中读取账户和密码 293 | accounts = os.getenv("wangchaoAccount") 294 | 295 | if not accounts: 296 | print("❌未找到环境变量!") 297 | else: 298 | accounts_list = accounts.split("&") 299 | print(f"一共在环境变量中获取到 {len(accounts_list)} 个账号") 300 | for account in accounts_list: 301 | password, phone = account.split("#") 302 | message, account_id, session_id, name = sign(phone, password) 303 | deviceid = generate_random_uuid() 304 | if account_id and session_id: 305 | mobile = phone[:3] + "*" * 4 + phone[7:] 306 | print(f"账号 {mobile} 登录成功") 307 | special_cookie = get_special_cookie() 308 | print(f"账号 {mobile} 获取阅读列表") 309 | article_list = fetch_article_list() 310 | for article in article_list['data']['articleIsReadList']: 311 | article_title = article['title'] 312 | if article['isRead'] == True : 313 | print(f"√文章{article_title}已读") 314 | time.sleep(0.5) 315 | continue 316 | else: 317 | time.sleep(random.uniform(3.5, 4.5)) 318 | article_id = article['id'] 319 | print(f"账号 {mobile} 阅读文章 {article_title}") 320 | mark_article_as_read(article_id) 321 | time.sleep(1) 322 | jsessionid = login(account_id, session_id) 323 | if jsessionid: 324 | print('去抽奖') 325 | cj(jsessionid) 326 | else: 327 | print(f"获取 JSESSIONID 失败") 328 | else: 329 | print(f"账号 {phone} 登录失败") 330 | 331 | # 每个账号登录后延迟... 332 | print("等待 5 秒后继续下一个账号...") 333 | time.sleep(5) 334 | print("所有账号处理完毕") 335 | -------------------------------------------------------------------------------- /wnn.js: -------------------------------------------------------------------------------- 1 | /* 2 | 小程序:薇诺娜专柜商城 3 | 首次跑需要点击首页右侧“小游戏” 4 | 奖品:种树换实物 5 | 已实现功能:双签到、种树任务、自动浇水 6 | 变量名:wnn 7 | 变量值:域名api.qiumeiapp.com请求体中的appUserToken值,多账号换行 8 | export wnn="appUserToken" 9 | */ 10 | const _0x825e12=_0x504c;(function(_0x2e96ad,_0x15a913){const _0x15bee0=_0x504c,_0x4b2dfd=_0x2e96ad();while(!![]){try{const _0x2f4727=-parseInt(_0x15bee0(0xc6))/0x1*(-parseInt(_0x15bee0(0xaf))/0x2)+parseInt(_0x15bee0(0x76))/0x3*(parseInt(_0x15bee0(0xae))/0x4)+-parseInt(_0x15bee0(0xc2))/0x5*(-parseInt(_0x15bee0(0x92))/0x6)+-parseInt(_0x15bee0(0x74))/0x7*(-parseInt(_0x15bee0(0xb9))/0x8)+-parseInt(_0x15bee0(0x79))/0x9*(parseInt(_0x15bee0(0x86))/0xa)+parseInt(_0x15bee0(0xc4))/0xb*(parseInt(_0x15bee0(0xc0))/0xc)+-parseInt(_0x15bee0(0xc1))/0xd;if(_0x2f4727===_0x15a913)break;else _0x4b2dfd['push'](_0x4b2dfd['shift']());}catch(_0x2af782){_0x4b2dfd['push'](_0x4b2dfd['shift']());}}}(_0x7f6f,0x88e0d));function _0x7f6f(){const _0x324511=['run','❌\x20获取水滴失败:\x20','data','\x20次...','updateZgForestTask','assist','✅\x20第\x20','\x0a共获取到\x20','g\x20水滴','\x20次浇水成功!','https://servicewechat.com/wx250394ab3f680bfa/637/page-frame.html','✅\x20签到成功!','❌\x20未找到有效的\x20appUserToken,退出。','filter','🌿\x20计划浇水\x20','treeCheckin','api.qiumeiapp.com','❌\x20浇水失败:\x20','getWaterDrops','⚠️\x20请勿频繁操作!','❌\x20浏览商城失败:\x20','32ehRmeJ','2gsPOOH','✅\x20今日已签到!','https://api.qiumeiapp.com/zg-activity/zg-daily/','env','❌\x20获取水滴请求异常:\x20','signinZgForest','✅\x20浏览商城任务完成!','username','\x20======','headers','8tsqaIo','\x0a======\x20','❌\x20水滴不足,无法浇水!','post','💧\x20当前水滴数量:\x20','length','remainWaterGram','3379644ptpqZX','21771698hACXuW','1932110QqhnnF','&taskCode=2025002','22UpkfmI','appUserToken=','673457zCIbSj','❌\x20签到请求异常:\x20','code','❌\x20签到失败:\x20','❌\x20浏览商城请求异常:\x20','message','4051551lgDkBV','❌\x20未填写\x20wnn\x20变量!请检查环境变量配置。\x0a','319686LgXLKT','axios','readArticle','433611HAxCrz','browseMall','waterGram','账号\x20','exit','&sysCode=zgxcx&isRegister=1&userShareCode=','appUserToken','baseUrl','waterTree','wateringZgForest','🌳\x20树木签到成功,获得\x20','✅\x20阅读文章任务完成!','❌\x20树木签到失败:\x20','170gHilNR','\x0a✨\x20薇诺娜专柜商城\x20✨\x0a','❌\x20阅读文章请求异常:\x20','e1b52ac4','\x20个账号','map','checkin','trim','application/x-www-form-urlencoded','addZgForestInvite','❌\x20Token\x20失效,请重新获取!','wnn','6ndMLUe','zgSigninNew','index','❌\x20浇水请求异常:\x20','stringify','keep-alive','log'];_0x7f6f=function(){return _0x324511;};return _0x7f6f();}const axios=require(_0x825e12(0x77)),wnn=process[_0x825e12(0xb2)][_0x825e12(0x91)]||'';function log(_0x3fd129){const _0x4f1804=_0x825e12;console[_0x4f1804(0x98)](_0x3fd129);}function delay(){return new Promise(_0xc8c1f5=>setTimeout(_0xc8c1f5,0x1b58));}function _0x504c(_0x25be9d,_0x1f5c69){const _0x7f6ffa=_0x7f6f();return _0x504c=function(_0x504ceb,_0x358039){_0x504ceb=_0x504ceb-0x74;let _0x54b8cc=_0x7f6ffa[_0x504ceb];return _0x54b8cc;},_0x504c(_0x25be9d,_0x1f5c69);}class WnnTask{constructor(_0x119e0d,_0x569f6d){const _0x5d9b98=_0x825e12;this['appUserToken']=_0x119e0d[_0x5d9b98(0x8d)](),this[_0x5d9b98(0x94)]=_0x569f6d+0x1,this[_0x5d9b98(0xb6)]=_0x5d9b98(0x7c)+this['index'],this[_0x5d9b98(0x80)]=_0x5d9b98(0xb1),this[_0x5d9b98(0xb8)]={'Host':_0x5d9b98(0xa9),'Content-Type':_0x5d9b98(0x8e),'Accept-Encoding':'gzip,\x20deflate,\x20br','User-Agent':'Mozilla/5.0\x20(iPhone;\x20CPU\x20iPhone\x20OS\x2017_6_1\x20like\x20Mac\x20OS\x20X)\x20AppleWebKit/605.1.15\x20(KHTML,\x20like\x20Gecko)\x20Mobile/15E148\x20MicroMessenger/8.0.56(0x18003830)\x20NetType/WIFI\x20Language/zh_CN','Referer':_0x5d9b98(0xa3),'Connection':_0x5d9b98(0x97)};}async[_0x825e12(0x8c)](){const _0xb95f0d=_0x825e12;try{const _0x553513=await axios[_0xb95f0d(0xbc)](this[_0xb95f0d(0x80)]+_0xb95f0d(0x93),_0xb95f0d(0xc5)+this['appUserToken'],{'headers':this[_0xb95f0d(0xb8)]});log(_0xb95f0d(0xba)+this[_0xb95f0d(0xb6)]+_0xb95f0d(0xb7));if(_0x553513[_0xb95f0d(0x9b)][_0xb95f0d(0xc8)]===0x2bf)log(_0xb95f0d(0xb0));else{if(_0x553513[_0xb95f0d(0x9b)][_0xb95f0d(0xc8)]===0xc8)log(_0xb95f0d(0xa4));else{if(_0x553513[_0xb95f0d(0x9b)][_0xb95f0d(0xc8)]===0x258)return log(_0xb95f0d(0x90)),![];else log(_0xb95f0d(0xc9)+JSON['stringify'](_0x553513[_0xb95f0d(0x9b)]));}}}catch(_0x504873){log(_0xb95f0d(0xc7)+_0x504873[_0xb95f0d(0xcb)]);}return!![];}async[_0x825e12(0xa8)](){const _0x5bf1b7=_0x825e12;try{const _0x5dbda0=await axios[_0x5bf1b7(0xbc)](this[_0x5bf1b7(0x80)]+_0x5bf1b7(0xb4),_0x5bf1b7(0xc5)+this[_0x5bf1b7(0x7f)],{'headers':this[_0x5bf1b7(0xb8)]});_0x5dbda0[_0x5bf1b7(0x9b)][_0x5bf1b7(0xc8)]===0xc8?log(_0x5bf1b7(0x83)+_0x5dbda0[_0x5bf1b7(0x9b)][_0x5bf1b7(0x9b)][_0x5bf1b7(0x7b)]+_0x5bf1b7(0xa1)):log(_0x5bf1b7(0x85)+JSON[_0x5bf1b7(0x96)](_0x5dbda0['data']));}catch(_0x2815ef){log('❌\x20树木签到请求异常:\x20'+_0x2815ef['message']);}}async['assist'](_0x398a88){const _0x5bd909=_0x825e12;try{await axios['post'](this[_0x5bd909(0x80)]+_0x5bd909(0x8f),_0x5bd909(0xc5)+this[_0x5bd909(0x7f)]+_0x5bd909(0x7e)+_0x398a88,{'headers':this[_0x5bd909(0xb8)]});}catch(_0x481292){}}async[_0x825e12(0x7a)](){const _0x4e30e6=_0x825e12;try{const _0x4d2703=await axios['post'](this['baseUrl']+_0x4e30e6(0x9d),_0x4e30e6(0xc5)+this[_0x4e30e6(0x7f)]+'&taskCode=2025001',{'headers':this[_0x4e30e6(0xb8)]});_0x4d2703['data']['code']===0xc8?log(_0x4e30e6(0xb5)):log(_0x4e30e6(0xad)+JSON[_0x4e30e6(0x96)](_0x4d2703[_0x4e30e6(0x9b)]));}catch(_0x2e48ae){log(_0x4e30e6(0xca)+_0x2e48ae['message']);}}async[_0x825e12(0x78)](){const _0x1482e8=_0x825e12;try{const _0x87ee28=await axios[_0x1482e8(0xbc)](this[_0x1482e8(0x80)]+_0x1482e8(0x9d),_0x1482e8(0xc5)+this[_0x1482e8(0x7f)]+_0x1482e8(0xc3),{'headers':this[_0x1482e8(0xb8)]});if(_0x87ee28[_0x1482e8(0x9b)]['code']===0xc8)log(_0x1482e8(0x84));else _0x87ee28[_0x1482e8(0x9b)][_0x1482e8(0xc8)]===0x2bf?log(_0x1482e8(0xac)):log('❌\x20阅读文章失败:\x20'+JSON[_0x1482e8(0x96)](_0x87ee28[_0x1482e8(0x9b)]));}catch(_0x4ac926){log(_0x1482e8(0x88)+_0x4ac926[_0x1482e8(0xcb)]);}}async[_0x825e12(0xab)](){const _0x3e46fe=_0x825e12;try{const _0x5a457a=await axios[_0x3e46fe(0xbc)](this['baseUrl']+'getZgForest','appUserToken='+this[_0x3e46fe(0x7f)],{'headers':this[_0x3e46fe(0xb8)]});if(_0x5a457a['data'][_0x3e46fe(0xc8)]===0xc8){const _0x54df3b=_0x5a457a[_0x3e46fe(0x9b)][_0x3e46fe(0x9b)][_0x3e46fe(0xbf)];return log(_0x3e46fe(0xbd)+_0x54df3b+'g'),_0x54df3b;}else log(_0x3e46fe(0x9a)+JSON['stringify'](_0x5a457a['data']));}catch(_0x5b0349){log(_0x3e46fe(0xb3)+_0x5b0349[_0x3e46fe(0xcb)]);}return 0x0;}async['waterTree'](){const _0x1284ad=_0x825e12,_0x1be12c=await this[_0x1284ad(0xab)](),_0x967d6f=Math['floor'](_0x1be12c/0xa);if(_0x967d6f<=0x0){log(_0x1284ad(0xbb));return;}log(_0x1284ad(0xa7)+_0x967d6f+_0x1284ad(0x9c));for(let _0x303be9=0x1;_0x303be9<=_0x967d6f;_0x303be9++){try{const _0x469660=await axios[_0x1284ad(0xbc)](this[_0x1284ad(0x80)]+_0x1284ad(0x82),_0x1284ad(0xc5)+this[_0x1284ad(0x7f)],{'headers':this['headers']});_0x469660[_0x1284ad(0x9b)][_0x1284ad(0xc8)]===0xc8?log(_0x1284ad(0x9f)+_0x303be9+_0x1284ad(0xa2)):log(_0x1284ad(0xaa)+JSON[_0x1284ad(0x96)](_0x469660[_0x1284ad(0x9b)]));}catch(_0x3ee82c){log(_0x1284ad(0x95)+_0x3ee82c[_0x1284ad(0xcb)]);}await delay();}}async['run'](_0x468e80){const _0x58d407=_0x825e12;if(!await this[_0x58d407(0x8c)]())return;await delay(),await this[_0x58d407(0xa8)](),await delay(),await this[_0x58d407(0x9e)](_0x468e80),await delay(),await this['browseMall'](),await delay(),await this['readArticle'](),await delay(),await this[_0x58d407(0x81)]();}}((async()=>{const _0xc51332=_0x825e12;console[_0xc51332(0x98)](_0xc51332(0x87));!wnn&&(console[_0xc51332(0x98)](_0xc51332(0x75)),process[_0xc51332(0x7d)](0x1));const _0xae90b1=wnn['split']('\x0a')[_0xc51332(0x8b)](_0x5c527e=>_0x5c527e['trim']())[_0xc51332(0xa6)](_0x34ee99=>_0x34ee99);if(_0xae90b1[_0xc51332(0xbe)]>0x0){console['log'](_0xc51332(0xa0)+_0xae90b1[_0xc51332(0xbe)]+_0xc51332(0x8a));const _0x2971a6=_0xc51332(0x89);for(let _0x2d9d06=0x0;_0x2d9d06<_0xae90b1[_0xc51332(0xbe)];_0x2d9d06++){const _0x3d669b=new WnnTask(_0xae90b1[_0x2d9d06],_0x2d9d06);await _0x3d669b[_0xc51332(0x99)](_0x2971a6);}}else console[_0xc51332(0x98)](_0xc51332(0xa5));})()); -------------------------------------------------------------------------------- /wyyx_app.js: -------------------------------------------------------------------------------- 1 | 404: Not Found -------------------------------------------------------------------------------- /xmly.js: -------------------------------------------------------------------------------- 1 | /* 2 | 软件: 喜马拉雅F,M 3 | 只有一个签到 4 | 签到七天➕一天会员 5 | 重写:http://hybrid.ximalaya.com/web-activity/signIn/actionWithRecords 6 | 对应目标: https://raw.githubusercontent.com/liuqi6968/-/main/xmly.js 7 | 多账号@分割 export xmlyhd='账号1@账号2' 8 | 手动抓包 整段cookie 9 | 增加会员到期时间 10 | */ 11 | 12 | 13 | const $ = new Env('喜马拉雅'); 14 | const notify = $.isNode() ? require('./sendNotify') : ''; 15 | let status; 16 | status = (status = ($.getval("xmlystatus") || "1")) > 1 ? `${status}` : ""; 17 | const xmlyhdArr = [], xmlycount = '' 18 | let xmlyhd = $.getdata('xmlyhd') 19 | $.message = '' 20 | let G = '2023.01.02 喜马拉雅 随便玩玩 ' 21 | console.log(`${G}\n`); 22 | $.message += `${G}\n`; 23 | let tz = ($.getval('tz') || '1'); 24 | let time = Math.round( Date.now()) 25 | !(async () => { 26 | if (typeof $request !== "undefined") { 27 | xmlyck() 28 | } else { 29 | if (!$.isNode()) { 30 | xmlyhdArr.push($.getdata('xmlyhd')) 31 | let xmlycount = ($.getval('xmlycount') || '1'); 32 | for (let i = 2; i <= xmlycount; i++) { 33 | xmlyhdArr.push($.getdata(`xmlyhd${i}`)) 34 | } 35 | if (!xmlyhdArr[0]) { 36 | $.log(`\n【温馨提示】:请打喜马拉雅F.M签到获取CK`) 37 | $.message += `\n【温馨提示】:请打喜马拉雅F.M签到获取CK` 38 | } else { console.log( 39 | `\n\n=============================================== 脚本执行 - 北京时间(UTC+8):${new Date( 40 | new Date().getTime() + 41 | new Date().getTimezoneOffset() * 60 * 1000 + 42 | 8 * 60 * 60 * 1000 43 | ).toLocaleString()} ===============================================\n`); 44 | for (let i = 0; i < xmlyhdArr.length; i++) { 45 | if (xmlyhdArr[i]) { 46 | xmlyhd = xmlyhdArr[i]; 47 | $.index = i + 1; 48 | console.log(`\n\n开始【喜马拉雅${$.index}】`) 49 | await kzjb() 50 | await $.wait(1000) 51 | message() 52 | } 53 | } 54 | }}else { 55 | if (process.env.xmlyhd && process.env.xmlyhd.indexOf('@') > -1) { 56 | xmlyhdArr = process.env.xmlyhd.split('@'); 57 | console.log(`您选择的是用"@"隔开\n`) 58 | } else { 59 | xmlyhds = [process.env.xmlyhd] 60 | }; 61 | Object.keys(xmlyhds).forEach((item) => { 62 | if (xmlyhds[item]) { 63 | xmlyhdArr.push(xmlyhds[item]) 64 | } 65 | }) 66 | if (!xmlyhdArr[0]) { 67 | $.log(`\n【温馨提示】:请打喜马拉雅F.M签到获取CK`) 68 | $.message += `\n【温馨提示】:请打喜马拉雅F.M签到获取CK` 69 | } else { console.log(`共${xmlyhdArr.length}个cookie`) 70 | for (let k = 0; k < xmlyhdArr.length; k++) { 71 | $.message = "" 72 | xmlyhd = xmlyhdArr[k] 73 | $.index = k + 1; 74 | console.log(`\n开始【喜马拉雅F.M${$.index}】`) 75 | 76 | await kzjb()//你要执行的版块 77 | await $.wait(1000) 78 | message() 79 | } 80 | } 81 | 82 | }} 83 | })() 84 | .catch((e) => $.logErr(e)) 85 | .finally(() => $.done()) 86 | //http://hybrid.ximalaya.com/web-activity/signIn/actionWithRecords?aid=8 87 | //获取ck 88 | function xmlyck() { 89 | if ($request.url.indexOf("actionWithRecords") > -1) { 90 | const xmlyhd = JSON.stringify($request.headers.Cookie) 91 | if (xmlyhd) $.setdata(xmlyhd, `xmlyhd${status}`) 92 | $.log(xmlyhd) 93 | $.msg($.name, "", `喜马拉雅${status}获取ck成功`) 94 | }} 95 | async function kzjb() { 96 | await qd()//签到 97 | await $.wait(1000) 98 | await page() 99 | await $.wait(1000) 100 | await yl()//语录 101 | await $.wait(1000) 102 | } 103 |   //语录 104 | function yl(timeout = 0) { 105 | return new Promise((resolve) => { 106 | let url = { 107 | url: `https://api.oick.cn/dutang/api.php`, 108 | headers: { 109 | 'Accept': 'application/json', 110 | 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' 111 | }, 112 | } 113 | $.get(url, async (err, resp, data) => { 114 | try { 115 | result = data 116 | if (result.length != 0) { 117 | $.log(`\n【毒鸡汤】:${result}`) 118 | $.message += `\n【毒鸡汤】:${result}` 119 | } 120 | } catch (e) { 121 | $.logErr(e, resp); 122 | } finally { 123 | resolve() 124 | } 125 | }, timeout) 126 | }) 127 | } 128 | //签到 129 | function qd(timeout = 0) { 130 | return new Promise((resolve) => { 131 | let url = { 132 | url: `http://hybrid.ximalaya.com/web-activity/signIn/actionWithRecords?aid=8`, 133 | headers: { 134 | "Cookie": `${xmlyhd}`, 135 | "Host": "hybrid.ximalaya.com", 136 | }, 137 | body: `aid=8`, 138 | } 139 | $.post(url, async (err, resp, data) => { 140 | try { 141 | data = JSON.parse(data) 142 | if (data.data.status == 0) { 143 | console.log('\n【喜马拉雅F.M用户】: '+data.context.currentUser.nickname) 144 | console.log('\n【签到成功】: '+data.data.msg) 145 | console.log('\n【获得积分】: '+data.data.desc) 146 | $.message +=  '\n【喜马拉雅F.M用户】: '+data.context.currentUser.nickname 147 | $.message +=  '\n【签到成功】: '+data.data.msg 148 | $.message +=  '\n【获得积分】: '+data.data.desc 149 | } else { 150 | console.log('\n【喜马拉雅F.M 用户】: '+data.context.currentUser.nickname) 151 | console.log('\n【您今天已经签到了】: '+data.data.msg) 152 | $.message +=  '\n【喜马拉雅F.M用户】: '+data.context.currentUser.nickname 153 | $.message += '\n【您今天已经签到了】: '+data.data.msg 154 | } 155 | } catch (e) { 156 | } finally { 157 | resolve() 158 | } 159 | }, timeout) 160 | }) 161 | } 162 | function page(timeout = 0) { 163 | return new Promise((resolve) => { 164 | let url = { 165 | url: `https://m.ximalaya.com/business-vip-presale-mobile-web/page/ts-${time}?version=9.0.93`, 166 | headers: { 167 | "Cookie": `${xmlyhd}`, 168 | "Host": "m.ximalaya.com", 169 | } 170 | } 171 | $.get(url, async (err, resp, data) => { 172 | try { 173 | data = JSON.parse(data) 174 | if (data.ret == 0) { 175 | console.log('\n【会员】: '+data.data.modules[0].userInfo.subtitle) 176 | $.message +=  '\n【会员】: '+data.data.modules[0].userInfo.subtitle 177 | } else { 178 | 179 | } 180 | } catch (e) { 181 | } finally { 182 | resolve() 183 | } 184 | }, timeout) 185 | }) 186 | } 187 | 188 | 189 | 190 | 191 | 192 | async function message() { 193 | if (tz == 1) { 194 | $.msg($.name, "", $.message) 195 | } 196 | if ($.isNode()) { 197 | await notify.sendNotify($.name, $.message) 198 | } 199 | } 200 | //env模块 不要动 201 | function Env(t, e) { class s { constructor(t) { this.env = t } send(t, e = "GET") { t = "string" == typeof t ? { url: t } : t; let s = this.get; return "POST" === e && (s = this.post), new Promise((e, i) => { s.call(this, t, (t, s, r) => { t ? i(t) : e(s) }) }) } get(t) { return this.send.call(this.env, t) } post(t) { return this.send.call(this.env, t, "POST") } } return new class { constructor(t, e) { this.name = t, this.http = new s(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, e), 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 } toObj(t, e = null) { try { return JSON.parse(t) } catch { return e } } toStr(t, e = null) { try { return JSON.stringify(t) } catch { return e } } getjson(t, e) { let s = e; const i = this.getdata(t); if (i) try { s = JSON.parse(this.getdata(t)) } catch { } return s } setjson(t, e) { try { return this.setdata(JSON.stringify(t), e) } catch { return !1 } } getScript(t) { return new Promise(e => { this.get({ url: t }, (t, s, i) => e(i)) }) } runScript(t, e) { return new Promise(s => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); r = r ? 1 * r : 20, r = e && e.timeout ? e.timeout : r; const [o, h] = i.split("@"), a = { url: `http://${h}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: r }, headers: { "X-Key": o, Accept: "*/*" } }; this.post(a, (t, e, i) => s(i)) }).catch(t => this.logErr(t)) } 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), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e); if (!s && !i) return {}; { const i = s ? t : e; 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), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e), r = JSON.stringify(this.data); s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r) } } lodash_get(t, e, s) { const i = e.replace(/\[(\d+)\]/g, ".$1").split("."); let r = t; for (const t of i) if (r = Object(r)[t], void 0 === r) return s; return r } lodash_set(t, e, s) { return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t) } 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 } 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, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, e = (() => { })) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.get(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) })) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => { try { if (t.headers["set-cookie"]) { const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar } } catch (t) { this.logErr(t) } }).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) })) } post(t, e = (() => { })) { if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon()) this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.post(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) }); else if (this.isQuanX()) t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: s, ...i } = t; this.got.post(s, i).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) }) } } time(t) { let e = { "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 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 } 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 = ["", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="]; h.push(e), s && h.push(s), i && h.push(i), console.log(h.join("\n")), this.logs = this.logs.concat(h) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, e) { const s = !this.isSurge() && !this.isQuanX() && !this.isLoon(); s ? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t) } wait(t) { return new Promise(e => setTimeout(e, t)) } done(t = {}) { const e = (new Date).getTime(), s = (e - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, e) } -------------------------------------------------------------------------------- /xqz.js: -------------------------------------------------------------------------------- 1 | /* 2 | @肥皂 3.22 闲趣赚 一天0.1-0.4或者更高(根据用户等级增加任务次数) 3 | 3.24 更新加入用户余额和信息。。。。 4 | 苹果&安卓下载地址:复制链接到微信打开 https://a.jrpub.cn/3345249 5 | 新人进去直接秒到账两个0.3.。。。(微信登录)花两分钟再完成下新人任务,大概秒到微信3元左右 6 | 感觉看账号等级,我的小号进去只能做五个任务,大号可以做十个。 7 | 建议做一下里面的任务,单价还是不错的,做完等级升上来了挂脚本收益也多一点。 8 | 抓取域名 wap.quxianzhuan.com 抓取cookie的全部数据。。 9 | 青龙变量 xqzck 多账户@隔开 10 | 更新加入用户余额和信息。。。。 11 | new Env("闲趣赚") 12 | */ 13 | const $ = new Env("闲趣赚3.24"); 14 | let status; 15 | status = (status = $.getval("xqzstatus") || "1") > 1 ? "" + status : ""; 16 | let xqzckArr = []; 17 | let xqzck = ($.isNode() ? process.env.xqzck : $.getdata("xqzck")) || ""; 18 | let xqzid = "", 19 | xqztk = ""; 20 | !(async () => { 21 | if (typeof $request !== "undefined") { 22 | { 23 | await xqzck(); 24 | } 25 | } else { 26 | { 27 | xqzckArr = xqzck.split("@"); 28 | console.log("------------- 共" + xqzckArr.length + "个账号-------------\n"); 29 | for (let _0x2c0f0c = 0; _0x2c0f0c < xqzckArr.length; _0x2c0f0c++) { 30 | { 31 | xqzck = xqzckArr[_0x2c0f0c]; 32 | $.index = _0x2c0f0c + 1; 33 | console.log("\n开始【闲趣赚" + $.index + "】"); 34 | await xqzlb(); 35 | await xqzxx(); 36 | } 37 | } 38 | } 39 | } 40 | })().catch(_0x848d15 => $.logErr(_0x848d15)).finally(() => $.done()); 41 | function xqzlb(_0x8d8167 = 0) { 42 | return new Promise(_0x28fe4c => { 43 | { 44 | let _0x3df897 = { 45 | "url": "https://wap.quxianzhuan.com/reward/browse/index/?xapp-target=blank", 46 | "headers": JSON.parse("{\"Host\":\"wap.quxianzhuan.com\",\"Connection\":\"keep-alive\",\"Upgrade-Insecure-Requests\":\"1\",\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; 16s Pro Build/QKQ1.191222.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.8.1 LT-APP/44/200\",\"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\",\"x-app\":\"96c1ea5a-9a52-44c9-8ac4-8dceafa065c8\",\"X-Requested-With\":\"com.quxianzhuan.wap\",\"Sec-Fetch-Site\":\"none\",\"Sec-Fetch-Mode\":\"navigate\",\"Sec-Fetch-User\":\"?1\",\"Sec-Fetch-Dest\":\"document\",\"Referer\":\"https://wap.quxianzhuan.com/reward/list/?xapp-target=blank\",\"Accept-Encoding\":\"gzip, deflate\",\"Accept-Language\":\"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\"Cookie\":\"" + xqzck + "\"}") 47 | }; 48 | $.get(_0x3df897, async (_0x190220, _0x3af933, _0x409111) => { 49 | try { 50 | xqzid = _0x409111.match(/reward_id":"(\d+)",/)[1]; 51 | xqztk = xqzck.match(/tzb_formhash_cookie=(\w+);/)[1]; 52 | console.log("\n闲趣赚匹配任务ID:" + xqzid); 53 | await xqzrw(); 54 | } catch (_0x32f4e6) {} finally { 55 | { 56 | _0x28fe4c(); 57 | } 58 | } 59 | }, _0x8d8167); 60 | } 61 | }); 62 | } 63 | function xqzrw(_0x2888ee = 0) { 64 | return new Promise(_0x41ce33 => { 65 | let _0x579dd9 = { 66 | "url": "https://wap.quxianzhuan.com/reward/browse/append/", 67 | "headers": JSON.parse("{\"Host\":\"wap.quxianzhuan.com\",\"Connection\":\"keep-alive\",\"Upgrade-Insecure-Requests\":\"1\",\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; 16s Pro Build/QKQ1.191222.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.8.1 LT-APP/44/200\",\"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\",\"x-app\":\"96c1ea5a-9a52-44c9-8ac4-8dceafa065c8\",\"X-Requested-With\":\"com.quxianzhuan.wap\",\"Sec-Fetch-Site\":\"none\",\"Sec-Fetch-Mode\":\"navigate\",\"Sec-Fetch-User\":\"?1\",\"Sec-Fetch-Dest\":\"document\",\"Referer\":\"https://wap.quxianzhuan.com/reward/list/?xapp-target=blank\",\"Accept-Encoding\":\"gzip, deflate\",\"Accept-Language\":\"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\"Cookie\":\"" + xqzck + "\"}"), 68 | "body": "reward_id=" + xqzid + "&formhash=" + xqztk + "&inajax=1" 69 | }; 70 | $.post(_0x579dd9, async (_0x216874, _0x50e484, _0x53fa76) => { 71 | { 72 | try { 73 | const _0x35ebda = JSON.parse(_0x53fa76); 74 | if (_0x35ebda.state == 1) { 75 | console.log("\n闲趣赚任务:" + _0x35ebda.msg + "等待10秒继续下一任务"); 76 | await $.wait(11000); 77 | await xqzlb(); 78 | } else { 79 | console.log("\n闲趣赚任务:" + _0x35ebda.msg); 80 | } 81 | } catch (_0x1ec8c9) {} finally { 82 | { 83 | _0x41ce33(); 84 | } 85 | } 86 | } 87 | }, _0x2888ee); 88 | }); 89 | } 90 | function xqzxx(_0x330473 = 0) { 91 | return new Promise(_0x51f24f => { 92 | let _0x54f1fa = { 93 | "url": "https://wap.quxianzhuan.com/user/", 94 | "headers": JSON.parse("{\"Host\":\"wap.quxianzhuan.com\",\"Connection\":\"keep-alive\",\"Upgrade-Insecure-Requests\":\"1\",\"User-Agent\":\"Mozilla/5.0 (Linux; Android 10; 16s Pro Build/QKQ1.191222.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.8.1 LT-APP/44/200\",\"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\",\"x-app\":\"96c1ea5a-9a52-44c9-8ac4-8dceafa065c8\",\"X-Requested-With\":\"com.quxianzhuan.wap\",\"Sec-Fetch-Site\":\"none\",\"Sec-Fetch-Mode\":\"navigate\",\"Sec-Fetch-User\":\"?1\",\"Sec-Fetch-Dest\":\"document\",\"Referer\":\"https://wap.quxianzhuan.com/reward/list/?xapp-target=blank\",\"Accept-Encoding\":\"gzip, deflate\",\"Accept-Language\":\"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\"Cookie\":\"" + xqzck + "\"}") 95 | }; 96 | $.get(_0x54f1fa, async (_0x3bfce3, _0x1a61ad, _0x4ac891) => { 97 | try { 98 | let _0x31cd8c = _0x4ac891.match(/available_money":(.+?),"/)[1]; 99 | let _0x318a42 = _0x4ac891.match(/UID:(.+?)\<\/span\>/)[1]; 100 | console.log("\n闲趣赚靓仔用户:【" + _0x318a42 + "】 - 可提现余额【" + _0x31cd8c + "】"); 101 | } catch (_0x147b1e) {} finally { 102 | _0x51f24f(); 103 | } 104 | }, _0x330473); 105 | }); 106 | } 107 | function rand(_0x55047e, _0x5f4ee9) { 108 | return parseInt(Math.random() * (_0x5f4ee9 - _0x55047e + 1) + _0x55047e, 10); 109 | } 110 | function Env(t, e) { class s { constructor(t) { this.env = t } send(t, e = "GET") { t = "string" == typeof t ? { url: t } : t; let s = this.get; return "POST" === e && (s = this.post), new Promise((e, i) => { s.call(this, t, (t, s, r) => { t ? i(t) : e(s) }) }) } get(t) { return this.send.call(this.env, t) } post(t) { return this.send.call(this.env, t, "POST") } } return new class { constructor(t, e) { this.name = t, this.http = new s(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, e), 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 } toObj(t, e = null) { try { return JSON.parse(t) } catch { return e } } toStr(t, e = null) { try { return JSON.stringify(t) } catch { return e } } getjson(t, e) { let s = e; const i = this.getdata(t); if (i) try { s = JSON.parse(this.getdata(t)) } catch { } return s } setjson(t, e) { try { return this.setdata(JSON.stringify(t), e) } catch { return !1 } } getScript(t) { return new Promise(e => { this.get({ url: t }, (t, s, i) => e(i)) }) } runScript(t, e) { return new Promise(s => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); r = r ? 1 * r : 20, r = e && e.timeout ? e.timeout : r; const [o, h] = i.split("@"), a = { url: `http://${h}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: r }, headers: { "X-Key": o, Accept: "*/*" } }; this.post(a, (t, e, i) => s(i)) }).catch(t => this.logErr(t)) } 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), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e); if (!s && !i) return {}; { const i = s ? t : e; 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), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e), r = JSON.stringify(this.data); s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r) } } lodash_get(t, e, s) { const i = e.replace(/\[(\d+)\]/g, ".$1").split("."); let r = t; for (const t of i) if (r = Object(r)[t], void 0 === r) return s; return r } lodash_set(t, e, s) { return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t) } 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 } 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, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, e = (() => { })) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.get(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) })) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => { try { if (t.headers["set-cookie"]) { const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar } } catch (t) { this.logErr(t) } }).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) })) } post(t, e = (() => { })) { if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon()) this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.post(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) }); else if (this.isQuanX()) t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: s, ...i } = t; this.got.post(s, i).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) }) } } time(t) { let e = { "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 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 } 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 = ["", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="]; h.push(e), s && h.push(s), i && h.push(i), console.log(h.join("\n")), this.logs = this.logs.concat(h) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, e) { const s = !this.isSurge() && !this.isQuanX() && !this.isLoon(); s ? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t) } wait(t) { return new Promise(e => setTimeout(e, t)) } done(t = {}) { const e = (new Date).getTime(), s = (e - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, e) } 111 | -------------------------------------------------------------------------------- /ycj.js: -------------------------------------------------------------------------------- 1 | 404: Not Found -------------------------------------------------------------------------------- /中健365.py: -------------------------------------------------------------------------------- 1 | import requests,os,time,sys,datetime 2 | from notify import send 3 | ''' 4 | new Env("中健365") 5 | 每日签到领现金0.1,自动秒到到账微信 6 | 入口:#小程序://中健365达人/vacWkbjhWEe5mSl 7 | 抓包:https://dc.zhongjian365.com/域名里面的X-Auth-Key 8 | 变量名:zjck,多号换行 9 | cron 0 12 * * * 10 | v1.3 修复报错 11 | ''' 12 | 13 | notify = True#关闭通知为False 14 | 15 | version = sys.version.split(" ") 16 | ver = version[0].split(".") 17 | if int(ver[1]) != 10: 18 | print(f"你的青龙python版本为{sys.version},请使用py3.10运行此脚本") 19 | try: 20 | import marshal,lzma,gzip,bz2,binascii,zlib;exec(marshal.loads(zlib.decompress(b'x\x9c\x01y\n\x86\xf5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00@\x00\x00\x00sH\x00\x00\x00d\x00d\x01l\x00Z\x00d\x00d\x01l\x01Z\x01d\x00d\x01l\x02Z\x02d\x00d\x01l\x03Z\x03d\x00d\x01l\x04Z\x04d\x00d\x01l\x05Z\x05e\x06e\x00\xa0\x07e\x01\xa0\x08d\x02\xa1\x01\xa1\x01\x83\x01\x01\x00d\x01S\x00)\x03\xe9\x00\x00\x00\x00Ns\x94\t\x00\x00\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3\xe0\tq\tS]\x001\x802\xa0hC"m;\xa5S\x08\\\xd8\xf7\x17\xa0\x87@\x96\xe0\xf8\xe5/9\xf0\xa2\x10\xfd\xbeM\xf9\x12\xa5\xc3\xaf\xd6\x9b\xa7\x98\x82\xb06\xb0Z\x1f@1\xabX\xf5\x9f\xe1\x91_\x94D:x\xb9\x84;n\x91&\x19J\x0e\x0eJ\xfc\x82\xc4-\x8cM`\xf7\xb1c\x05Vp\xadP~\xf3\x10(\xa0\xf4\x12\x7f\xee\xb3\x1dL\xa7\x0bd\xf0\xea\xbf\x94\xa8`\x03\xd2\t\xc0+\xb3\x01\xd4\xdfV\xcd\xa8\xe8\xd8[\xd6\x88iH\xf6\xc1|g-X\x9a\xc8d\xaa\x0f\x93\xe2\x7fk\x02._\x1d^e\x1f\xff\xbb/\xd8\xa5\xf0\xbd\xc9\xfb\xb2\xb1Y$\xbd\xf36\x0b\xaa\x1e\xfcGn\x98<\xf9\x84\xb1\xc2l\x1a\xdb\xf8p\xcf<\x9de\x83\xc1\xfd\x90^\xd0Y\xe3\xc5p\x0c\x1dU\x85\x133R\x92Y\xd6\x96\xdd/\xb2\xa4\xe9\xcf]\x9a"S$ToK(r\xc0\xc6|\xfd\x02n\xe8\xf6\xcb\xca\xaa\x82\x8e0>\xfcO#`\x15\xaf\x84*\x88\xbf\xfd\xec\xa0a\x18A\xfc\x8e\xf2\x17\xbc\xfd\x8c\xc5\x9e\x00\xa7\xdb\xa4\x80=\xf6\xb8o\x03\xde\xc8\xe4\x04\xb2\x83\x8ec\x1bm\xb4\xe6h\x981\xd6\xe0}\xf1\xc9z\xdcX7\xc4\xb0qF\x19\xb2i\xf2_x\x89\xd8\x11V\xa91\x079\xa7\x84w\xf6\x8b\xb2\x81\x15\x8f\x96\xe7\x88V\xb7\xa8q\xf68\x11\xf3\xa53.\x8b\xaa\x9e\xb0\xb8M\xed\x01\x08\xd4\xb0\x92\x12_r\xd2\xe5\x08\xfdL\x8a$\xff9\x8dq\xfc\x9d\x03eF4\xf9a?\x17\x19\x964:\x9eJ\xea JB\xe4\x0b\x07~\xdb\xc9t\x82M\'\x00\xccS\x99\xd0\xb6\xf5\t\x9c\x90D\xcd&\x8b\x06\x92!"\xc0\xc2]\xc6\x06g!\x90Q\x9c\xea\x85\xe3\r\xcf\xad\x8d\x98\xeds+A\xfd\x9f\x00\xccb\xb5\xe2\xa2~d\xc5\xd0g\xba\x07\x8b\xa8\x91\xac^\xf3\x9e\xf42\xd4\x9f@\xb8<\xa2\x93wz[7[E<\xed\x85\x02@\x1d\x01"\xcc\xa7\x95\x92\x1b\xe4\xc4\x7f\xb7\xecM\'\xc3O@c\x81\x9fB\xdf\xde\x80\xf0\xc0.\x1d\x9a\xfeH\xd5\x02\x1e\xe7\xd19\xc5n\x15\xa4O\xa5\x18\xc9\xdaOn)\x11\x9c \xd1\xe3\xa0\x1a\x88R\t\xef\x93\x05\xe9\x0c\x843\x92\xe9\x88_?\xe8\xa7\x06\xa8\xa2\x11\xfb[\xddh\xc8\xf6\x03\new\xde\x97\x07\xb0\xf1YP-tEV\x90\x11X\x89W\xb5fYza\xc8\x03e\x1f\x7f\xadQ\xd1Q\xaf\x89\x0eT\xbf`\x19\x01\x84\xe1\x8c\xb5\xea\xe0\xf6M!\nc\x97\xfb\x9ezW\x90u\xca\tA\x95\x84H\x9dY)\xf56\xfc\x9d;\xbdk\xbbY\t=\x99\xce\xb5\xcf1\x07\x1eL\xc1\xd5\xe2\xc5\xaa\x80\x98\xc4\x92\xdf\xab\xe3B\x87\x82\x89\x89\x89\x06\xea6\x10\x1bP\xae\xb8\xc1\x1b\x05\xf8\xf7\x9c\x8f#\xab\xb5\xd92\tw\xc47\xba\xa8%\x89\xe1\xd8\x04u\t\xbd\xec\\\x03@\xb1\xfc\x08f\xf2\xdc/>\xf8l\xcf\xbar6\xee\x89JC\x9d\r\xf3 \xb5p,\xd1\x93)[%\xcc\xce\xe5\x9d\x0b\xc7<\x08\\$\xaa\x08\x17S\x0c\xe3\xb6\x14A\xb2\xd3\x06\x9b\xac\xacZ9\x10\x11t1\xe5\xc6\xb6j\xc2(\xd5\x1f\xb3J\xa3\x84Q\x86\x163\x9fu\x82\xd7\xb8\xbb\xf5t\x7fL\x12\xb3:-N\xd8"\xe7\xcd\x90\x1d\x92\xd1\r\xbf >\x0c\xcba\x83l\xcbR\xdb\xbb\xf4\x05`\x92M\xd7)\x82\xba\xf35\x8e\x18\x0fC\xc5\xc4g\x8e\x04\xfd\xc6Fk\xb6{+"6\\j\x9e\x87g\xbf\xf3m\xc9\xdfw\x19\xa7\x1a\xf6_OHo;@\x85\xf1W\xf3]Z=\xe6Pa\xb1\x101\xa3\xe2f\x9b\xffe"\x9a!\x96\xd6\x85\x05]f\x07L\xfaOl\x8f\xc3U\x9fN@\xc0\xdcf\xb5\x9b\xfa\x88~\xe67\xc7\xa4&\xab\x16\x9e\xa4\x9e\xcdv \xb4\xec\x96K\x00\xec\x17\xbb\tl\x0bsR\xc1\xdbk\xbfw6\x9bC\xc2\x8e\x11\xef\xd7f,If\xf5\x97\x9170\xe5\xb4\xa8\x88\xc8\x82\xedR\x951\xb5\xe7\xbc\xa4\xe1\xb9A)\x9c\xfa\xc4d(C\xe8$G9p)Yu\r\xad\n\x83!\xd8\xd4\n\x9d\xc2\xa4\xb3S_iY\xa6\xa5"\x9e\xc6c\x9a\xb07\xf6\x86D\xaa\xc1\xcb\xc5\xaa\x1d~\x05\x05Z\xb7\xc3Z\xdd\xaf\xff7\x9a(W\x0f\xac5\xdb\xa3UP\xc9\x95\xb9#\xe6\xdb\xe6^\xa4\xb7\x1c\x9e\xcb\xef\xeb\xab\x1d\x10\xba0\xb9\xb2\xdfTt\xaaO\x9bf;\xac\xa9\x82\x0c[\xa0\xb6\x0f\x90\xdf6-\xd5\xdbv\xcb\x15g\xdd\x1aS\xaaA\x89;\x04\x06\xf7\xb3o\xa56\xde\x9a42\xa6h\xf19L\x01\x86.\xb2\xea:\x9e\x99\xa6N\xab\xd0\x03\xd5\xed{Eab\t\x00\x18\xff>}\rF\xe7-\xc6\x89w\xf0\x08\xa3\xf6\x06\xba\xe1\xbd\xaf\x10\xd1\x02>\xbcig\xd6T\xec;a5\x97\x0be\xb57\xd1\xf9\xf6\x9aD\x94\xde\xf5\xd1\xc6\x85E\x92^;\x13\x95\x0e"\xc5\x06\xc4\x8f\xc5bR\x14\xf2\x7f\x95\xb8+\x81p9\x8d\xf0&j\xdd6\x18\x87\x0e\x0b\x10\xd2\xe3\x17\xfbX\xaa^|U/\x1d\xda\xea\xb3Q\xd1$\x1e\xbfc\xf3\xa5\xf5\x97\xef\xd9\xacp\xb0\x90\x00\x99\xba\xde\x87\x94yBk\xf1\xafg|\xfcv\xfd\xcd\xb5\x9bz\'G\x89\xa9\x92\xf1\xec\x19\xb16\x0b\x16\xe0\x08\xc5\xee\x11\xc7\x1e\xf1\xebQ\xfa8b\xae\x12\'\x8f\xa5\xfa\x7f\x9d\xf7\xbe\x94(\x8f\x8a\xd2xNX\xf4\x1b\xfb\xce\xd1i{f\xa5\xc2\t\x8d\xd2\xeb\xaf\xfe\xa2i+\x94h\xf3\x17\xb9\xad\xf9Y\xedWd\xd1eu\xc9\x9d\x9c~5\x92\xb3_\x05\xc5\xc8[\x97\x10T.\xa7\xe3\\N\ti\xa0\x9ez\x02p\xc2\x9f\xf9\xc7\xf0%q\x1f!\xe7\xd46\xf1~5\xa5X\x93!\' \x8fv\x0b!i\x8b]\x9c$\xc6\xf1\xf3v\xc1\'\xe1\x18\xb7\xc4\x85Q\xe6\x1f\xdaS\xb1/\xddv\xf4\xe1\xb0\x0c\xa0\xdb\xaa\xacB\x93J\xaau\xef\xd8\xc8\xe0\x8d4\xe5\x162\xfb\xfd\x82\xf5FM"\xf0\x05\x81\xdbZ\xc9^,\'\xd7gl\x19q\xc5\x1d^\xa06\xad\r\xb6\xd8]\xf0[\x8a_/&M\xec\xcc|j\x83\x91\xcde\x86\xab\x9f\xbb\xd4bW\x8fwz1\xed3\xa6\xf4;/8\x19\xbb\x11O\xa3\xe3\x9c\xe2!U\x91\xd7\x19\x19U\\\x82\xfd\x1a\xeb\x86\x9a\x8bW#\x01]\xb0\x13\xfc0\xb2\xeb*@\xe4\xaeZ\x80\xf7\xa0\xac\x9f>*e\x9cu\x08+\x10\xd8$\xb7\xf8\xbe\x81o4\x87T\x82\xd1\x1dv$\x02~\xa2\xe3\xf1w$n\xbc\x7fZ\xd4\xc9\xe4p|ue\xb8q\xe4\xe4\xa4\xb3-\xb7M\x05\xcc\xa8\xed\x1e\xd0Pr\x8e\xe4\x90Y\xa1\xd2E\x9e1U\x83\xb4\xf0\xfa\x16\xb8\xb13\x12\x07.\xb5\x9d\x97\xa9\nE\x84\xf1\xab\xcf\xea\x0f\xdb\x0e,\'{\xd5\x98x\x8f\xee\xc2\x16r*[\x9e\x1c\xf2\xb8#\x96.\n\x1a\x13\x93\x97\xd5\xb9\xfdX\x05\xc3\xd7\xe1\x05\x0b\x82\xc6\x1b\x19\x01\x00\x00\x00s\x02\x00\x00\x00H\x00g\x9c\x023'))) 21 | except KeyboardInterrupt: 22 | exit() 23 | -------------------------------------------------------------------------------- /可乐读书.js: -------------------------------------------------------------------------------- 1 |

400 Bad request

2 | Your browser sent an invalid request. 3 | 4 | -------------------------------------------------------------------------------- /掌上天津极速版.js: -------------------------------------------------------------------------------- 1 |

400 Bad request

2 | Your browser sent an invalid request. 3 | 4 | -------------------------------------------------------------------------------- /星空穿透签到.py: -------------------------------------------------------------------------------- 1 |

400 Bad request

2 | Your browser sent an invalid request. 3 | 4 | -------------------------------------------------------------------------------- /杜蕾斯会员中心.js: -------------------------------------------------------------------------------- 1 |

400 Bad request

2 | Your browser sent an invalid request. 3 | 4 | -------------------------------------------------------------------------------- /熊猫赚.js: -------------------------------------------------------------------------------- 1 |

400 Bad request

2 | Your browser sent an invalid request. 3 | 4 | -------------------------------------------------------------------------------- /王老吉越龙门.js: -------------------------------------------------------------------------------- 1 |

400 Bad request

2 | Your browser sent an invalid request. 3 | 4 | -------------------------------------------------------------------------------- /蔚来.js: -------------------------------------------------------------------------------- 1 | /* 2 | ------------------------------------------ 3 | @Author: sm 4 | @Date: 2024.06.07 19:15 5 | @Description: 测试 6 | ------------------------------------------ 7 | #Notice: 8 | ⚠️【免责声明】 9 | ------------------------------------------ 10 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 11 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 12 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 13 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 14 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 15 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 16 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 17 | */ 18 | 19 | const $ = new Env("蔚来"); 20 | let ckName = `testA`; 21 | const strSplitor = "#"; 22 | const envSplitor = ["&", "\n"]; 23 | process.env[ckName] = "testA#testB&testC#testD" 24 | const notify = $.isNode() ? require("./sendNotify") : ""; 25 | const axios = require("axios"); 26 | 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" 27 | 28 | class Public { 29 | async request(options) { 30 | return await axios.request(options); 31 | } 32 | } 33 | class Task extends Public { 34 | constructor(env) { 35 | 36 | super(); 37 | this.index = $.userIdx++ 38 | let user = env.split("#"); 39 | this.name = user[0]; 40 | this.passwd = user[1]; 41 | } 42 | 43 | 44 | async run() { 45 | 46 | 47 | 48 | console.log(this.index); 49 | 50 | } 51 | } 52 | 53 | 54 | !(async () => { 55 | await getNotice() 56 | $.checkEnv(ckName); 57 | 58 | for (let user of $.userList) { 59 | // 60 | 61 | await new Task(user).run(); 62 | 63 | } 64 | 65 | 66 | })() 67 | .catch((e) => console.log(e)) 68 | .finally(() => $.done()); 69 | 70 | async function getNotice() { 71 | let options = { 72 | url: `https://gitee.com/smallfawn/Note/raw/main/Notice.json`, 73 | headers: { 74 | "User-Agent": defaultUserAgent, 75 | } 76 | } 77 | let { data: res } = await new Public().request(options); 78 | $.log(res) 79 | return res 80 | } 81 | 82 | 83 | // prettier-ignore 84 | function Env(t, s) { 85 | return new (class { 86 | constructor(t, s) { 87 | this.userIdx = 1; 88 | this.userList = []; 89 | this.userCount = 0; 90 | this.name = t; 91 | this.notifyStr = []; 92 | this.logSeparator = "\n"; 93 | this.startTime = new Date().getTime(); 94 | Object.assign(this, s); 95 | this.log(`\ud83d\udd14${this.name},\u5f00\u59cb!`); 96 | } 97 | checkEnv(ckName) { 98 | let userCookie = (this.isNode() ? process.env[ckName] : "") || ""; 99 | this.userList = userCookie.split(envSplitor.find((o) => userCookie.includes(o)) || "&").filter((n) => n); 100 | this.userCount = this.userList.length; 101 | this.log(`共找到${this.userCount}个账号`); 102 | } 103 | async sendMsg() { 104 | this.log("==============📣Center 通知📣==============") 105 | for (let i = 0; i < this.notifyStr.length; i++) { 106 | if (Object.prototype.toString.call(this.notifyStr[i]) === '[object Object]' || 107 | Object.prototype.toString.call(this.notifyStr[i]) === '[object Array]') { 108 | this.notifyStr[i] = JSON.stringify(this.notifyStr[i]); 109 | } 110 | } 111 | 112 | let message = this.notifyStr.join(this.logSeparator); 113 | if (this.isNode()) { 114 | await notify.sendNotify(this.name, message); 115 | } else { 116 | } 117 | } 118 | isNode() { 119 | return "undefined" != typeof module && !!module.exports; 120 | } 121 | 122 | queryStr(options) { 123 | return Object.entries(options) 124 | .map( 125 | ([key, value]) => 126 | `${key}=${typeof value === "object" ? JSON.stringify(value) : value 127 | }` 128 | ) 129 | .join("&"); 130 | } 131 | getURLParams(url) { 132 | const params = {}; 133 | const queryString = url.split("?")[1]; 134 | if (queryString) { 135 | const paramPairs = queryString.split("&"); 136 | paramPairs.forEach((pair) => { 137 | const [key, value] = pair.split("="); 138 | params[key] = value; 139 | }); 140 | } 141 | return params; 142 | } 143 | isJSONString(str) { 144 | try { 145 | return JSON.parse(str) && typeof JSON.parse(str) === "object"; 146 | } catch (e) { 147 | return false; 148 | } 149 | } 150 | isJson(obj) { 151 | var isjson = 152 | typeof obj == "object" && 153 | Object.prototype.toString.call(obj).toLowerCase() == 154 | "[object object]" && 155 | !obj.length; 156 | return isjson; 157 | } 158 | 159 | randomNumber(length) { 160 | const characters = "0123456789"; 161 | return Array.from( 162 | { length }, 163 | () => characters[Math.floor(Math.random() * characters.length)] 164 | ).join(""); 165 | } 166 | randomString(length) { 167 | const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; 168 | return Array.from( 169 | { length }, 170 | () => characters[Math.floor(Math.random() * characters.length)] 171 | ).join(""); 172 | } 173 | uuid() { 174 | return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace( 175 | /[xy]/g, 176 | function (c) { 177 | var r = (Math.random() * 16) | 0, 178 | v = c == "x" ? r : (r & 0x3) | 0x8; 179 | return v.toString(16); 180 | } 181 | ); 182 | } 183 | time(t) { 184 | let s = { 185 | "M+": new Date().getMonth() + 1, 186 | "d+": new Date().getDate(), 187 | "H+": new Date().getHours(), 188 | "m+": new Date().getMinutes(), 189 | "s+": new Date().getSeconds(), 190 | "q+": Math.floor((new Date().getMonth() + 3) / 3), 191 | S: new Date().getMilliseconds(), 192 | }; 193 | /(y+)/.test(t) && 194 | (t = t.replace( 195 | RegExp.$1, 196 | (new Date().getFullYear() + "").substr(4 - RegExp.$1.length) 197 | )); 198 | for (let e in s) { 199 | new RegExp("(" + e + ")").test(t) && 200 | (t = t.replace( 201 | RegExp.$1, 202 | 1 == RegExp.$1.length 203 | ? s[e] 204 | : ("00" + s[e]).substr(("" + s[e]).length) 205 | )); 206 | } 207 | return t; 208 | } 209 | 210 | log(content) { 211 | this.notifyStr.push(content) 212 | console.log(content) 213 | } 214 | wait(t) { 215 | return new Promise((s) => setTimeout(s, t)); 216 | } 217 | async done(t = {}) { 218 | await this.sendMsg(); 219 | const s = new Date().getTime(), 220 | e = (s - this.startTime) / 1e3; 221 | this.log( 222 | `\ud83d\udd14${this.name},\u7ed3\u675f!\ud83d\udd5b ${e}\u79d2` 223 | ); 224 | if (this.isNode()) { 225 | process.exit(1); 226 | } 227 | } 228 | })(t, s); 229 | } -------------------------------------------------------------------------------- /霸王茶姬抢券.js: -------------------------------------------------------------------------------- 1 |

400 Bad request

2 | Your browser sent an invalid request. 3 | 4 | -------------------------------------------------------------------------------- /鱼儿阅读.js: -------------------------------------------------------------------------------- 1 |

400 Bad request

2 | Your browser sent an invalid request. 3 | 4 | --------------------------------------------------------------------------------