├── README.md ├── screen_recording.gif ├── sign.py └── wechat.jpg /README.md: -------------------------------------------------------------------------------- 1 | # Sign 2 | 签到啦 3 | 4 | (目前支持京东京豆、南航、川航、携程、微信支付有优惠小程序龙舟游戏刷免费提现券、美团优惠券、统一快乐星球、中国移动、中国联通、东鹏特饮、云闪付、卡亨星球、鸿星尔克、迪卡侬、萤石、掘金、途虎养车、爱奇艺) 5 | 6 | [使用教程](https://www.litre.us.kg/2024/02/21/%E6%AF%8F%E6%97%A5%E7%AD%BE%E5%88%B0/) 7 | 8 | ```bash 9 | pip install uvicorn fastapi websockets httpx loguru diskcache apscheduler SQLAlchemy python-dateutil -i https://pypi.tuna.tsinghua.edu.cn/simple 10 | ``` 11 | 12 | 运行项目(两种方式运行: 第一种直接运行脚本;第二种启动服务后通过接口添加token设置定时任务) 13 | 14 | 第一种:直接运行脚本 15 | 16 | ```bash 17 | python sign.py 18 | ``` 19 | 20 | 追加参数 21 | 22 | ```bash 23 | python sign.py --pt_pin jd_XXX --pt_key AAJXXX 24 | ``` 25 | 26 | 第二种:启动服务(服务可用于添加token和设置定时任务) 27 | 28 | ```bash 29 | uvicorn sign:app --host 0.0.0.0 --port 8081 30 | ``` 31 | 32 | 访问 [http://127.0.0.1:8081/docs](http://127.0.0.1:8081/docs) 通过接口添加账户token等 33 | 34 | ![视频教程](https://github.com/Litre-WU/Sign/blob/master/screen_recording.gif) 35 | 36 | #### 开发描述 37 | 程序主要使用fastapi开发的接口,请求库主要使用httpx,定时调度器使用的是apschedule,数据库使用的是sqlite,缓存使用的是diskcache,调度器和缓存是共用同一个sqlite数据库,使用sqlite数据库主要是减少环境依赖和方便,也方便的查看任务执行情况。当然也可以换成其它数据库,修改一些脚本数据库配置即可。 38 | 39 | 接口可以方面添加token等令牌信息,之后的定时运行可以使用apschedule定时调度运行(默认早上九点签到),也可使用crontab运行脚本。 40 | 41 | crontab运行脚本后面添加参数即可(例如 0 9 * * * ~/python3 ~/sign.py --pt_pin jd_XXX --pt_key AAJXXX)。 42 | 43 | 签到状态提醒目前只写了钉钉通知,修改脚本的dingAlert函数中的access_token和secret即可。 44 | 45 | 后续也会增加其它平台... 46 | 47 | 脚本运行命令设置选项 48 | 49 | ``` 50 | Options: 51 | --pt_pin [/signBeanAct]京东Cookie中获取pt_pin值 52 | --pt_key [/signBeanAct]京东Cookie中获取pt_key值 53 | --csai [/csairSign]南航账户Cookie中sign_user_token值 54 | --sichuanair [/sichuanairSign]川航账户Cookie中access-token值 55 | --ctrip [/ctripSign]携程账户Cookie中cticket值 56 | --meituan [/meituan]美团账户Cookie中token值 57 | --weimob [/weimob]统一快乐星球账户Cookie中X-WX-Token值 58 | --10086 [/10086]中国移动账户Cookie中SESSION_TOKEN值 59 | --10010 [/10010]中国联通账户Cookie中ecs_token值 60 | --dp [/dp]东鹏账户header中sid值 61 | --95516 [/95516]云闪付账户header中Authorization值 62 | --kraf [/kraf]卡亨星球账户header中token值 63 | --erke [/erke]鸿星尔克账户的memberId值 64 | --honda [/honda]本田账户的Authori-zation值 65 | --decathlon [/decathlon]迪卡侬账户的Authorization值 66 | --ys [/ys]萤石账户的sessionid值 67 | --juejin [/juejin]掘金账户的sessionid值 68 | --tuhu [/tuhu]途虎养车账户的Authorization值 69 | 70 | ``` 71 | 72 | 说明: 73 | 74 | 京东`--pt_pin`pt_pin和`--pt_key`需同时传入!脚本也支持使用青龙面板运行,追加的参数设置为环境变量即可。 75 | 76 | ## 常见问题 77 | 78 | ### 关于 令牌 获取 79 | 可以使用抓包工具,例如Fiddler、Wireshark,或者浏览器插件,或者使用浏览器自带的开发者工具,例如Chrome的开发者工具。 80 | 手机抓包可以设置代理去抓包(需安装证书才可以抓取https协议请求),也可以使用app去抓包,苹果用户推荐使用Stream,安卓用户推荐使用HttpCanary。 81 | 82 | ### 青龙面板支持 83 | 程序也是支持了青龙面板,令牌通过环境变量传入即可。 84 | 85 | ### 关于 docs 空白页面 86 | 由于fastapi的docs使用的是swagger-ui的远程静态文件,远程静态文件偶尔会加载异常,所以docs出现空白页面,不影响接口使用。 87 | 88 | 89 | ## 阶段计划 90 | - 添加Cookie签到(解决多参数认证) 91 | - 加入任务灵活配置页面 92 | - 重新编写部署教程 93 | 94 | 95 | ## 总结 96 | 由于这是本人业余时间开发的项目,可能还有很多问题不能及时解决(也会抽时间解决),这个项目也可能存在很多不尽如人意的地方,在细节方面我也会尽力地去修改,也欢迎大家提出自己的问题,以及项目的相关建议,也欢迎大家提交代码。如果觉得这个主题不错,欢迎大家去使用。当然了,如果能[赞赏](https://ko-fi.com/litre)我一下,我也是不介意的。(●ˇ∀ˇ●) 97 | 98 | 99 | 100 | 这个项目对于部分人群可能无法灵活配置,后续抽时间开发web版和app去让各类用户方便使用,欢迎大家修改,也希望这个项目越来越多的人能够喜欢。 101 | -------------------------------------------------------------------------------- /screen_recording.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Litre-WU/Sign/7cc2abc9529ac04f95fd651f6a813b5e0f994603/screen_recording.gif -------------------------------------------------------------------------------- /sign.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import asyncio 3 | from httpx import AsyncClient 4 | from time import time, sleep, asctime 5 | from datetime import datetime 6 | from calendar import monthrange 7 | from loguru import logger 8 | from fastapi import FastAPI, BackgroundTasks, Body, WebSocket, WebSocketDisconnect 9 | from fastapi.middleware.cors import CORSMiddleware 10 | from starlette.requests import Request 11 | from typing import Dict, Union 12 | from diskcache import Cache 13 | from json import dumps 14 | import hmac 15 | import hashlib 16 | from base64 import b64encode 17 | from pathlib import Path 18 | from uuid import uuid4 19 | from random import uniform, sample, choice 20 | from urllib.parse import urlparse, parse_qs 21 | from http import cookies 22 | 23 | # 使用apscheduler 调用定时任务 24 | from datetime import datetime, timedelta 25 | from apscheduler.schedulers.background import BackgroundScheduler 26 | from apscheduler.schedulers.asyncio import AsyncIOScheduler 27 | from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor 28 | # from apscheduler.jobstores.redis import RedisJobStore 29 | from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore 30 | from dateutil.parser import parse 31 | import socket 32 | import sys 33 | import os 34 | import string 35 | 36 | db_path = str(Path(__file__).parent / "tmp") 37 | 38 | cache = Cache(db_path) 39 | 40 | 41 | description = """ 42 | 脚本输入参数及路由地址 43 | 44 | --pt_pin [/signBeanAct]京东Cookie中获取pt_pin值 45 | --pt_key [/signBeanAct]京东Cookie中获取pt_key值 46 | --csai [/csairSign]南航账户Cookie中sign_user_token值 47 | --sichuanair [/sichuanairSign]川航账户Cookie中access-token值 48 | --ctrip [/ctripSign]携程账户Cookie中cticket值 49 | --meituan [/meituan]美团账户Cookie中token值 50 | --weimob [/weimob]统一快乐星球账户Cookie中X-WX-Token值 51 | --10086 [/10086]中国移动账户Cookie中SESSION_TOKEN值 52 | --10010 [/10010]中国联通账户Cookie中ecs_token值 53 | --dp [/dp]东鹏账户header中sid值 54 | --95516 [/95516]云闪付账户header中Authorization值 55 | --kraf [/kraf]卡亨星球账户header中token值 56 | --erke [/erke]鸿星尔克账户的memberId值 57 | --decathlon [/decathlon]迪卡侬账户的Authorization值 58 | --ys [/ys]萤石账户的sessionid值 59 | --juejin [/juejin]掘金账户的sessionid值 60 | --tuhu [/tuhu]途虎养车账户的Authorization值 61 | 62 | 63 | 京东pt_pin和pt_key需同时传入!!! 64 | """ 65 | 66 | print(description) 67 | 68 | args = sys.argv 69 | 70 | for i, arg in enumerate(args): 71 | try: 72 | if arg.startswith("-"): 73 | k = arg.strip("-") 74 | v = args[i + 1] 75 | if v.startswith("-"): 76 | continue 77 | if v: 78 | if k.startswith("pt_"): 79 | if k == "pt_pin": 80 | for i_, v_ in enumerate(v.split(";")): 81 | try: 82 | # cache.set(v_, args[i + 3].split(";")[i_]) 83 | cache.set(f'jd_{v_}', args[i + 3].split(";")[i_]) 84 | except: 85 | pass 86 | else: 87 | for v_ in v.split(";"): 88 | cache.set(f'{k}_{v_}', v_) 89 | except Exception as e: 90 | pass 91 | 92 | 93 | scheduler = AsyncIOScheduler( 94 | jobstores={ 95 | # "default": RedisJobStore(**{ 96 | # "host": '127.0.0.1', 97 | # "port": 6379, 98 | # "db": 10, 99 | # "max_connections": 10 100 | # }) 101 | "default": SQLAlchemyJobStore(url=f'sqlite:///{db_path}/cache.db') 102 | }, 103 | executorsexecutors={ 104 | 'default': ThreadPoolExecutor(20), 105 | 'processpool': ProcessPoolExecutor(5), 106 | 107 | }, 108 | job_defaultsjob_defaults={ 109 | 'coalesce': False, 110 | 'max_instances': 3 111 | }, 112 | timezone="Asia/Shanghai") 113 | 114 | app = FastAPI(title="定时脚本") 115 | 116 | app.add_middleware( 117 | CORSMiddleware, 118 | allow_origins=["*"], 119 | allow_credentials=True, 120 | allow_methods=["*"], 121 | allow_headers=["*"], 122 | ) 123 | 124 | 125 | # 程序开始 126 | @app.on_event("startup") 127 | async def startup_event(): 128 | print("程序开始") 129 | print(f'设备IP: {socket.gethostbyname(socket.gethostname())} 当127.0.0.1无法访问时,可以使用设备ip替换') 130 | for k in cache.iterkeys(): 131 | if k.startswith("jd_"): 132 | if not cache[k]: 133 | cache.delete("test_pageId") 134 | try: 135 | scheduler.start() 136 | print(scheduler.get_jobs()) 137 | scheduler.remove_all_jobs() 138 | except Exception as e: 139 | print(f'定时任务启动异常{e}') 140 | 141 | 142 | # 程序停止 143 | @app.on_event("shutdown") 144 | async def shutdown_event(): 145 | print("程序结束") 146 | scheduler.shutdown(wait=False) 147 | 148 | 149 | # 京豆签到 150 | @app.post("/signBeanAct", tags=["京东签到"]) 151 | async def jd_sign(request: Request, background_tasks: BackgroundTasks, 152 | pt_pin: Union[str, None] = Body(default="jd_XXX"), 153 | pt_key: Union[str, None] = Body(default="AAJkPgXXX_XXX"), time: Union[str, None] = Body(default="09:00:00")): 154 | # cache.set(pt_pin, pt_key) 155 | cache.set(f'jd_{pt_pin}', pt_key) 156 | data_time = parse(time) 157 | background_tasks.add_task(signBeanAct, **{"pt_pin": pt_pin, "pt_key": pt_key}) 158 | task_id = str(uuid4()) 159 | scheduler.add_job(id=pt_pin, name=f'{pt_pin}', func=signBeanAct, kwargs={"pt_pin": pt_pin, "pt_key": pt_key}, trigger='cron', hour=data_time.hour, minute=data_time.minute, second=data_time.second, replace_existing=True) 160 | return {"code": 200, "msg": f'{pt_pin} 已更新', "task_id": f'{task_id}'} 161 | 162 | 163 | # 类token签到签到 164 | @app.post("/{path}", tags=["类token签到"], description=description) 165 | async def token_sign(request: Request, path: str, background_tasks: BackgroundTasks, 166 | token: Union[str, None] = Body(default="XXX"), time: Union[str, None] = Body(default="09:00:00")): 167 | result = {"code": 400, "msg": "请检查路由路径!"} 168 | data_time = parse(time) 169 | path_dict = {"csairSign": csairSign, "sichuanairSign": sichuanairSign, "ctripSign": ctripSign, "dragon_boat_2023":dragon_boat_2023, "meituan": meituan, "weimob": weimob, "10086": m10086, "10010": m10010, "dp": youzan_dp, "95516": m95516, "kraf": kraf, "erke": demogic_erke, "decathlon": decathlon, "ys": ys, "juejin": juejin, "tuhu": tuhu} 170 | if path in path_dict.keys(): 171 | background_tasks.add_task(path_dict[path], **{"token": token}) 172 | scheduler.add_job(id=token, name=f'{token}', func=path_dict[path], kwargs={"token": token}, trigger='cron', hour=data_time.hour, minute=data_time.minute, second=data_time.second, replace_existing=True) 173 | result.update({"code": 200, "msg": f'{path} {token} 已更新'}) 174 | return result 175 | 176 | 177 | # Cookie签到 178 | @app.post("/cookie/{path}", tags=["cookie签到"]) 179 | async def cookie_sign(request: Request, path: str, background_tasks: BackgroundTasks, 180 | cookie: Union[str, None] = Body(default="XXX"), time: Union[str, None] = Body(default="09:00:00")): 181 | Cookie = cookies.SimpleCookie() 182 | Cookie.load(cookie) 183 | cookie = {k: morsel.value for k, morsel in Cookie.items()} 184 | result = {"code": 400, "msg": "请检查路由路径!"} 185 | path_dict = {"qqstock": qqstock} 186 | if path in path_dict.keys(): 187 | background_tasks.add_task(path_dict[path], **{"cookie": cookie}) 188 | data_time = parse(time) 189 | scheduler.add_job(id="", name="", func=path_dict[path], kwargs={"cookie": cookie}, trigger='cron', hour=data_time.hour, minute=data_time.minute, second=data_time.second, replace_existing=True) 190 | result.update({"code": 200, "msg": f'{path} cookie 已更新'}) 191 | return result 192 | 193 | 194 | # WebSocket连接管理器 195 | class ConnectionManager: 196 | def __init__(self): 197 | self.active_connections: List[WebSocket] = [] 198 | 199 | async def connect(self, websocket: WebSocket): 200 | await websocket.accept() 201 | self.active_connections.append(websocket) 202 | await websocket.send_text("服务已启动!") 203 | 204 | def disconnect(self, websocket: WebSocket): 205 | self.active_connections.remove(websocket) 206 | 207 | async def send_personal_message(self, message: str, websocket: WebSocket): 208 | await websocket.send_text(message) 209 | 210 | async def broadcast(self, message: str): 211 | for connection in self.active_connections: 212 | await connection.send_text(message) 213 | 214 | 215 | manager = ConnectionManager() 216 | 217 | 218 | @app.websocket("/ws/{client_id}") 219 | async def websocket_endpoint(websocket: WebSocket, client_id: int, background_tasks: BackgroundTasks): 220 | print(websocket.client.host, client_id, websocket.query_params._dict) 221 | await manager.connect(websocket) 222 | await asyncio.sleep(2) 223 | try: 224 | while True: 225 | data = await websocket.receive_text() 226 | print(data) 227 | await manager.send_personal_message(data, websocket) 228 | await asyncio.sleep(2) 229 | await manager.send_personal_message("任务已完成!", websocket) 230 | # await manager.broadcast(f"{client_id} : {data}") 231 | except WebSocketDisconnect: 232 | manager.disconnect(websocket) 233 | await manager.broadcast(f"{client_id} 下线!") 234 | 235 | 236 | # 请求函数 237 | async def req(**kwargs): 238 | url = kwargs.get("url", "") 239 | if not url: return None 240 | headers = kwargs.get("headers", {"User-Agent": "okhttp/3.12.1;jdmall;android;version/10.3.4;build/92451;"}) 241 | proxy = None 242 | proxies = kwargs.get("proxies", {"all://": proxy} if proxy else {}) 243 | try: 244 | async with asyncio.Semaphore(100): 245 | async with AsyncClient(http2=kwargs.get("http2", False), proxies=proxies, headers=headers, 246 | cookies=kwargs.get("cookies", {}), verify=False, 247 | trust_env=False, 248 | follow_redirects=True, timeout=20) as client: 249 | rs = await client.request(method=kwargs.get("method", "GET"), url=url, params=kwargs.get("params", {}), 250 | data=kwargs.get("data", {}), json=kwargs.get("json", {}), files=kwargs.get("files", {}), 251 | headers=headers) 252 | return rs 253 | except Exception as e: 254 | logger.error(f'req {url} {e}') 255 | retry = kwargs.get("retry", 0) 256 | retry += 1 257 | if retry > 2: 258 | return None 259 | return await req(**kwargs | {"retry": retry}) 260 | 261 | 262 | # 钉钉通知 263 | async def dingAlert(**kwargs): 264 | access_token = kwargs.get("access_token", "") 265 | secret = kwargs.get("secret", "") 266 | if access_token and secret: 267 | timestamp = str(round(time() * 1000)) 268 | sign = b64encode( 269 | hmac.new(secret.encode(), f'{timestamp}\n{secret}'.encode(), digestmod=hashlib.sha256).digest()).decode() 270 | meta = { 271 | "method": "POST", 272 | "url": "https://oapi.dingtalk.com/robot/send", 273 | "params": { 274 | "access_token": access_token, 275 | "timestamp": timestamp, 276 | "sign": sign, 277 | }, 278 | "data": dumps({ 279 | 'msgtype': 'text', 280 | 'text': {'content': f'{kwargs.get("msg", "测试")} {asctime()}'} 281 | }), 282 | "headers": {"Content-Type": "application/json"} 283 | } 284 | res = await req(**meta) 285 | # print(res.text) 286 | if res and not res.json().get('errcode'): 287 | return True 288 | else: 289 | logger.error(f'{res.text}') 290 | return False 291 | 292 | 293 | # 京豆签到 294 | async def signBeanAct(**kwargs): 295 | pt_key = kwargs.get("pt_key", "") 296 | pt_pin = kwargs.get("pt_pin", "") 297 | result = { 298 | "code": 400, 299 | "msg": f'请输入pt_key及pt_pin', 300 | "time": int(time()) 301 | } 302 | if not all([pt_pin, pt_key]): 303 | return result 304 | meta = { 305 | "method": "POST", 306 | "url": "https://api.m.jd.com/client.action", 307 | "data": { 308 | 'functionId': 'signBeanAct', 309 | 'body': '{}', 310 | 'appid': 'signed_wh5_ihub', 311 | 'client': 'apple', 312 | 'clientVersion': '13.0.2', 313 | 'h5st': '20240528100518226;5iy5yi6zngmi9yy4;9d49c;tk03w8a731b9741lMisyKzMrMjR382m8OHl6CME_42gdIK27Ztj59og7qFiXW6ANYumVHShrpZ3_ZS0YdGWqK3iY4Ppz;a791835d42061f132ff014304320d32c1e961322573832c7224985fdbbdb4a80;4.7;1716861918226;TKmWymVS34wMWdBCuoFxiVU9ZqmOQttKGrKnVObP83GJZYMza1mupKRvk-ZU6Nj4VdHOVgWbZu9qpwinIhHDWj703eS-Lz7cpZSUJmuAoevLoTGJlVk6nrDCJdsEqPdA9VL9QQJR-PzYFJipNAfyfKvauarIRTW7fGPA3pkTLjrAv_LsOFwkARWPBstGvW-pydLMlupoMyLwh15Je73wD50dMGxrcZXqP7KOLYCx4Hx-qv2YVtqPIE7qCyGHs292qExyfL-Qs_zDVBv1VTC1WM4xDMmWUHeHJUS_WWDFGYnOuVooASH9TGgekE09b_Aj42dBNZkEFasDO7ahC5QYbLg43mTNIeOt1gtErtxLkus9fR6JaZOlgE5dzuZ_tAfhzDpmY2LQb1zwv8oA91VEmsQRYtqe3KzB7K89QdjAvxWa1hwGxzRNDtBwYXJoTMRJ0YDA', 314 | }, 315 | "headers": { 316 | "User-Agent": "jdapp", 317 | "Referer": "https://pro.m.jd.com", 318 | }, 319 | "cookies": { 320 | "pt_key": pt_key, 321 | "pt_pin": pt_pin 322 | } 323 | } 324 | res = await req(**meta) 325 | result.update({"msg": f'pt_key: {pt_key}; pt_pin: {pt_pin} 已失效,请重新获取pt_key和pt_pin'}) 326 | if res.status_code == 200: 327 | text = res.text 328 | # print(text) 329 | try: 330 | res = res.json() 331 | if res.get("errorMessage"): 332 | cache.delete(pt_pin) 333 | else: 334 | if res["data"]["status"] == '1': 335 | result.update({ 336 | "code": 200, 337 | "msg": f'{pt_pin} {res["data"]["newUserAward"]["title"]}' if res["data"].get( 338 | "newUserAward") else f"{pt_pin} 今天已签到", 339 | }) 340 | else: 341 | result.update({ 342 | "code": 200, 343 | "msg": f"京东用户:{pt_pin} 今天已签到", 344 | }) 345 | except Exception as e: 346 | logger.error(f'{text} {e}') 347 | result.update({"msg": f"京豆签到程序异常 {kwargs}"}) 348 | # 京东快递 349 | meta.update({ 350 | "url": "https://lop-proxy.jd.com/jiFenApi/signInAndGetReward", 351 | "params": {}, 352 | "json": [{"userNo": "$cooMrdGatewayUid$"}], 353 | "headers": { 354 | "AppParams": '{"appid":158,"ticket_type":"m"}', 355 | # "uuid": "16999712042251211957764", 356 | "uuid": "%.f" % (time() * 10 ** 13), 357 | "LOP-DN": "jingcai.jd.com" 358 | } 359 | }) 360 | await req(**meta) 361 | # 钉钉通知 362 | logger.info(result) 363 | await dingAlert(**result) 364 | return result 365 | 366 | 367 | # 南航签到 368 | async def csairSign(**kwargs): 369 | result = { 370 | "code": 400, 371 | "msg": f'请输入sign_user_token', 372 | "time": int(time()) 373 | } 374 | token = kwargs.get("token", "") 375 | if not token: 376 | return result 377 | cache.set(f'csai_{token}', token) 378 | # 签到 379 | createTime = int(time() * 1000) 380 | meta = { 381 | "method": "POST", 382 | "url": "https://wxapi.csair.com/marketing-tools/activity/join", 383 | "params": { 384 | "type": "APPTYPE", 385 | "chanel": "ss", 386 | "lang": "zh" 387 | }, 388 | "json": { 389 | "activityType": "sign", 390 | "channel": "app", 391 | "entrance": None 392 | }, 393 | "headers": {"Content-Type": "application/json"}, 394 | "cookies": { 395 | "sign_user_token": token, 396 | "TOKEN": token, 397 | "cs1246643sso": token, 398 | } 399 | } 400 | res = await req(**meta) 401 | if res.status_code == 200: 402 | try: 403 | info = res.json() 404 | if info.get("respCode") == "S00011": 405 | result.update({"code": 200, "msg": f'南航用户:{token} 检查token是否有效'}) 406 | cache.delete(f'csai_{token}') 407 | if info.get("respCode") == "S2001": 408 | result.update({"code": 200, "msg": f'南航用户:{token} 今天已签到!'}) 409 | else: 410 | result.update({"msg": f'{token} {info.get("respMsg", "")}'}) 411 | # 奖励列表 412 | meta.update({ 413 | "url": "https://wxapi.csair.com/marketing-tools/award/awardList", 414 | "json": {"activityType": "sign", "awardStatus": "waitReceive", "pageNum": 1, "pageSize": 100}, 415 | }) 416 | res = await req(**meta) 417 | if res.status_code == 200: 418 | for d in res.json()["data"]["list"]: 419 | logger.info(d["id"]) 420 | meta.update({ 421 | "url": "https://wxapi.csair.com/marketing-tools/award/getAward", 422 | "json": {"activityType": "sign", "signUserRewardId": d["id"]}, 423 | }) 424 | res = await req(**meta) 425 | if res.status_code == 200: 426 | logger.info(res.json()["data"]["result"]) 427 | except Exception as e: 428 | logger.error(f'南航签到程序异常 {e}') 429 | result.update({"msg": f"南航签到程序异常 {kwargs}"}) 430 | logger.info(result) 431 | # 签到日历 432 | month_start = datetime(datetime.now().year, datetime.now().month, 1).strftime("%Y%m%d") 433 | month_end = datetime(datetime.now().year, datetime.now().month, 434 | monthrange(datetime.now().year, datetime.now().month)[1]).strftime("%Y%m%d") 435 | meta = { 436 | "url": "https://wxapi.csair.com/marketing-tools/sign/getSignCalendar", 437 | "params": { 438 | "type": "APPTYPE", 439 | "chanel": "ss", 440 | "lang": "zh", 441 | "startQueryDate": month_start, 442 | "endQueryDate": month_end 443 | }, 444 | "cookies": {"sign_user_token": token} 445 | } 446 | res = await req(**meta) 447 | if res: 448 | try: 449 | info = res.json() 450 | if info.get("respCode") == "0000": 451 | result.update({ 452 | "code": 200, 453 | "msg": f'南航用户:{token} 当月 {info["data"]["dateList"]} 已签到', 454 | }) 455 | else: 456 | result.update({"msg": f'{token} {info.get("respMsg", "")}'}) 457 | except Exception as e: 458 | logger.error(f'{text} {e}') 459 | result.update({"msg": f"南航签到程序异常 {kwargs}"}) 460 | # 钉钉通知 461 | logger.info(result) 462 | await dingAlert(**result) 463 | return result 464 | 465 | 466 | # 川航签到 467 | async def sichuanairSign(**kwargs): 468 | result = { 469 | "code": 400, 470 | "msg": f'请输入access-token', 471 | "time": int(time()) 472 | } 473 | token = kwargs.get("token", "") 474 | if not token: 475 | return result 476 | cache.set(f'sichuanair_{token}', token) 477 | meta = { 478 | "method": "POST", 479 | "url": "https://fx.sichuanair.com/api/v1/sign/get-sign-rotation", 480 | "params": { 481 | "access-token": token 482 | }, 483 | } 484 | res = await req(**meta) 485 | if res.status_code == 200: 486 | try: 487 | info = res.json() 488 | if info.get("code") == 200: 489 | result.update({"code": 200, "msg": f'川航用户:{token} 今天已签到'}) 490 | else: 491 | cache.delete(f'sichuanair_{token}') 492 | result.update({"msg": f'{token} {info.get("message", "")}'}) 493 | except Exception as e: 494 | logger.error(f'川航签到程序异常 {e}') 495 | result.update({"msg": f"南航签到程序异常 {kwargs}"}) 496 | # 钉钉通知 497 | logger.info(result) 498 | await dingAlert(**result) 499 | return result 500 | 501 | 502 | # 携程签到 503 | async def ctripSign(**kwargs): 504 | result = { 505 | "code": 400, 506 | "msg": f'请输入cticket', 507 | "time": int(time()) 508 | } 509 | token = kwargs.get("token", "") 510 | if not token: 511 | return result 512 | token = kwargs["token"] 513 | cache.set(f'ctrip_{token}', token) 514 | meta = { 515 | "method": "POST", 516 | "url": "https://m.ctrip.com/restapi/soa2/22769/signToday", 517 | "params": { 518 | # "_fxpcqlniredt": "09031177218518661420", 519 | # "x-traceID": "09031177218518661420-1682060530972-8434515" 520 | }, 521 | "data": dumps({ 522 | # "platform": "H5", 523 | "openId": "", 524 | # "rmsToken": "", 525 | # "head": { 526 | # "cid": "09031177218518661420", 527 | # "ctok": "", 528 | # "cver": "1.0", 529 | # "lang": "01", 530 | # "sid": "8888", 531 | # "syscode": "09", 532 | # "auth": "", 533 | # "xsid": "", 534 | # "extension": [] 535 | # } 536 | }), 537 | "cookies": {"cticket": token}, 538 | } 539 | res = await req(**meta) 540 | # print(res.text) 541 | if res and res.status_code == 200: 542 | msg = res.json()["message"] 543 | # if res.json()["code"] == "": 544 | # cache.delete(f'csai_{token}') 545 | result.update({ 546 | "code": 200, 547 | "msg": f'携程用户:{token} {msg}', 548 | }) 549 | # 钉钉通知 550 | logger.info(result) 551 | await dingAlert(**result) 552 | return result 553 | 554 | 555 | # 微信龙舟游戏 556 | async def dragon_boat_2023(**kwargs): 557 | result = { 558 | "code": 400, 559 | "msg": f'请输入session_token', 560 | "time": int(time()) 561 | } 562 | session_token = kwargs.get("token", "") 563 | if not session_token: 564 | return result 565 | activity_id = 1000005 566 | # 目标分数及提现额度 567 | total_score = 10000 568 | # 获取game_id 569 | meta = { 570 | "method": "POST", 571 | "url": "https://payapp.weixin.qq.com/coupon-center-activity/game/create", 572 | "params": { 573 | "session_token": session_token}, 574 | "headers": { 575 | "Content-Type": "application/json", 576 | "X-Requested-With": "com.tencent.mm", 577 | }, 578 | "json": {"activity_id": activity_id, "game_pk_id": ""} 579 | } 580 | res = await req(**meta) 581 | if res: 582 | res = res.json() 583 | if res.get("data"): 584 | game_id = res["data"]["game_id"] 585 | game_score = 0 586 | score_items = [] 587 | for tracks in res["data"]["play_script"]["dragon_boat_2023_play_script"]["tracks"]: 588 | for prop in tracks["props"]: 589 | if prop.get("score"): 590 | score_items.append({"prop_id": prop["prop_id"], "award_score": prop["score"], 591 | "fetch_timestamp_ms": int(round(time() * 1000))}) 592 | game_score += prop["score"] 593 | logger.info(f'游戏ID: {game_id} 游戏总分: {game_score}') 594 | if game_score < total_score: 595 | sleep(uniform(0, 0.2)) 596 | return await dragon_boat_2023(**kwargs) 597 | else: 598 | logger.error(f'账号状态: {res}') 599 | cache.delete(f'dragon_boat_2023_{session_token}') 600 | return res 601 | cache.set(f'dragon_boat_2023_{session_token}', session_token) 602 | # 开始游戏 603 | meta.update({ 604 | "url": "https://payapp.weixin.qq.com/coupon-center-report/statistic/batchreport", 605 | "json": { 606 | "source_scene": "scene", 607 | "device": "DEVICE_ANDROID", 608 | "device_platform": "DEVICE_ANDROID", 609 | "device_system": "DEVICE_ANDROID", 610 | "device_brand": "DEVICE_ANDROID", 611 | "device_model": "DEVICE_ANDROID", 612 | "wechat_version": "1.0.0", 613 | "wxa_sdk_version": "1.0.0", 614 | "wxa_custom_version": "1.1.6", 615 | "event_list": [ 616 | { 617 | "event_code": "ActivityGameBegin", 618 | "event_target": str(activity_id), 619 | "intval1": 2, 620 | "strval1": game_id, 621 | } 622 | ], 623 | } 624 | }) 625 | res = await req(**meta) 626 | if res: 627 | logger.info(f'开始: {res.text}') 628 | # 游戏间隔时间 629 | sleep(25) 630 | # 提交分数 631 | meta.update({ 632 | "url": "https://payapp.weixin.qq.com/coupon-center-activity/game/report", 633 | "json": { 634 | "activity_id": activity_id, 635 | "game_id": game_id, 636 | "game_report_score_info": { 637 | "score_items": score_items, 638 | "game_score": game_score, 639 | "total_score": game_score, 640 | }, 641 | } 642 | }) 643 | res = await req(**meta) 644 | if res: 645 | logger.info(f'提交: {res.text}') 646 | res = res.json() 647 | if res.get("msg"): 648 | return res 649 | # 获取分数 650 | meta.update( 651 | { 652 | "method": "GET", 653 | "url": "https://payapp.weixin.qq.com/coupon-center-activity/game/get", 654 | "params": { 655 | "session_token": session_token, 656 | "activity_id": "1000000", 657 | "game_id": game_id, 658 | "sid": "a5299654f1f5e423c1fc9757f9bf071d", 659 | "coutom_version": "6.30.6" 660 | }, 661 | "json": {} 662 | } 663 | ) 664 | res = await req(**meta) 665 | if res: 666 | logger.info(f'分数: {res.text}') 667 | # 反馈 668 | meta.update({ 669 | "method": "POST", 670 | "url": "https://payapp.weixin.qq.com/coupon-center-activity/award/obtain", 671 | "params": { 672 | "session_token": session_token}, 673 | "json": { 674 | "activity_id": activity_id, 675 | "game_id": game_id, 676 | "obtain_ornament": True, 677 | "request_id": f'osd2L5ZiTu4UDWiNrB8bxnlVB-bQ_lj440mdj_{"".join(sample("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 4))}', 678 | "sid": "3bec088206a229c0cd925c464809cd24", 679 | "coutom_version": "6.30.8", 680 | } 681 | }) 682 | res = await req(**meta) 683 | if res: 684 | logger.info(f'反馈: {res.text}') 685 | 686 | 687 | # 美团 688 | async def meituan(**kwargs): 689 | result = { 690 | "code": 400, 691 | "msg": f'请输入token', 692 | "time": int(time()) 693 | } 694 | token = kwargs.get("token", "") 695 | if not token: 696 | return result 697 | cache.set(f'meituan_{token}', token) 698 | meta = { 699 | "method": "POST", 700 | "url": "https://mediacps.meituan.com/gundam/gundamGrabV4", 701 | "params": { 702 | "yodaReady": "h5", 703 | "csecplatform": "4", 704 | "csecversion": "2.2.1", 705 | "mtgsig": {"a1": "1.1", "a2": 1697448144738, 706 | "a3": "u626yx251w20527zyu3u86u04986u3u581y62xzuyu597958zz4xw60z", 707 | "a5": "El5tTKIDIoaunAdQRzBvNtJBlIIZKjUZLZ==", 708 | "a6": "hs1.4a4gsvX1s4RLQYqBR3sFhAcJZUrn8+3VWbJ+meaysJ2qQF48MWzawMI/8cXpLkxCgeHru+9OaWxcRKi7x76XJ3HkJvJ3GxbJAa4mOXU4A8LE=", 709 | "x0": 4, "d1": "0b94373b8946cbddef86192182d2fcfd"}}, 710 | "data": """{"gundamId":531693,"instanceId":"16970942475020.88256599968703330","actualLongitude":113404419,"actualLatitude":23163929,"needTj":true,"couponConfigIdOrderCommaString":"620969479,2189245219456,2237835510400,4298495230601,10393817973385,8650758750857,9217094451849,9769502114441,9285949325961,7458408104585,11075935339145,4987378139785,9219588883081,8368840966793,7285182431881,7349815083657,9123712533129,7281017291401,9218550006409,7282280694409,5513815065225,603844019,11131204469385,9137512120969,11040176931465,516213972,622936732,622197908,622740453,10494188389001,10495566742153","couponAllConfigIdOrderString":"620969479,2189245219456,2237835510400,4298495230601,10393817973385,8650758750857,9217094451849,9769502114441,9285949325961,7458408104585,11075935339145,4987378139785,9219588883081,8368840966793,7285182431881,7349815083657,9123712533129,7281017291401,9218550006409,7282280694409,5513815065225,603844019,11131204469385,9137512120969,11040176931465,516213972,622936732,622197908,622740453,10494188389001,10495566742153","rubikCouponKey":"PrizePool-200043026","platform":13,"app":-1,"h5Fingerprint":"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"}""", 711 | "headers": { 712 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36", 713 | "Content-Type": "application/json;charset=utf-8", 714 | }, 715 | "cookies": {"token": token} 716 | } 717 | res = await req(**meta) 718 | if res: 719 | try: 720 | logger.info(res.text) 721 | if res.status_code != 200: 722 | result.update({"msg": f"mt {token} 领取失败!"}) 723 | cache.delete(f'meituan_{token}') 724 | else: 725 | t = str(time_ns()) 726 | meta.update({ 727 | "method": "POST", 728 | "url": "https://promotion.waimai.meituan.com/playcenter/common/v1/doaction", 729 | "params": {}, 730 | "data": {}, 731 | "json": { 732 | "activityViewId": "jXL-9iEaRTsv-FZdpX4Z4g", 733 | "actionCode": 1000, 734 | "lat": 23.16397476196289, 735 | "lng": 113.40444946289062, 736 | "gdId": 422324, 737 | "instanceId": f'{t[:14]}.{t[14:].zfill(16)}', 738 | "fpPlatform": 13, 739 | "utmSource": "", 740 | "utmCampaign": "", 741 | } 742 | }) 743 | res = await req(**meta) 744 | if res: 745 | logger.info(res.text) 746 | result.update({"msg": f"mt {token} 签到成功!"}) 747 | except Exception as e: 748 | result.update({"msg": f"mt {token} 签到程序异常"}) 749 | # 钉钉通知 750 | await dingAlert(**result) 751 | 752 | 753 | # 统一快乐星球 754 | async def weimob(**kwargs): 755 | result = { 756 | "code": 400, 757 | "msg": f'请输入X-WX-Token', 758 | "time": int(time()) 759 | } 760 | token = kwargs.get("token", "") 761 | if not token: 762 | return result 763 | meta = { 764 | "method": "POST", 765 | "url": "https://xapi.weimob.com/api3/onecrm/mactivity/sign/misc/sign/activity/core/c/sign", 766 | "json": {"appid": "wx532ecb3bdaaf92f9", 767 | "basicInfo": {"vid": 6013753979957, "vidType": 2, "bosId": 4020112618957, "productId": 146, 768 | "productInstanceId": 3168798957, "productVersionId": "12017", 769 | "merchantId": 2000020692957, "tcode": "weimob", "cid": 176205957}, 770 | "extendInfo": {"wxTemplateId": 7083, 771 | "childTemplateIds": [{"customId": 90004, "version": "crm@0.0.159"}, 772 | {"customId": 90002, "version": "ec@31.1"}, 773 | {"customId": 90006, "version": "hudong@0.0.175"}, 774 | {"customId": 90008, "version": "cms@0.0.328"}], "analysis": [], 775 | "quickdeliver": {"enable": False}, "bosTemplateId": 1000001061, 776 | "youshu": {"enable": False}, "source": 1, "channelsource": 5, 777 | "refer": "onecrm-signgift", "mpScene": 1089}, 778 | "queryParameter": {"tracePromotionId": "100006218", "tracepromotionid": "100006218"}, 779 | "i18n": {"language": "zh", "timezone": "8"}, "pid": "4020112618957", "storeId": "0", 780 | "customInfo": {"source": 0, "wid": 10613173124}, "tracePromotionId": "100006218", 781 | "tracepromotionid": "100006218"} 782 | , 783 | "headers": { 784 | "X-WX-Token": token, 785 | }, 786 | } 787 | res = await req(**meta) 788 | logger.info(res.text) 789 | if res: 790 | res = res.json() 791 | if res["errcode"] == 1041: 792 | cache.delete(f'weimob_{token}') 793 | else: 794 | cache.set(f'weimob_{token}', token) 795 | result.update({"msg": res.get("errmsg", "")}) 796 | await dingAlert(**result) 797 | 798 | 799 | # 中国移动 800 | async def m10086(**kwargs): 801 | result = { 802 | "code": 400, 803 | "msg": f'请输入SESSION_TOKEN', 804 | "time": int(time()) 805 | } 806 | token = kwargs.get("token", "") 807 | if not token: 808 | return result 809 | # 公众号签到 810 | meta = { 811 | "url": "https://wx.10086.cn/qwhdhub/api/mark/do/mark", 812 | "headers": { 813 | "x-requested-with": "XMLHttpRequest", 814 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.42(0x18002a2a) NetType/4G Language/zh_CN", 815 | "login-check": "1", 816 | "Cookie": f"SESSION_TOKEN={token}", 817 | } 818 | } 819 | res = await req(**meta) 820 | try: 821 | if res: 822 | logger.info(f'公众号签到 {res.text}') 823 | res = res.json() 824 | cache.set(f'10086_{token}', token) 825 | result.update({"msg": f'10086_{token} {res.get("msg", "")}'}) 826 | 827 | # app签到 828 | meta.update({ 829 | "method": "POST", 830 | "url": "https://wx.10086.cn/qwhdhub/api/mark/mark31/domark", 831 | "json": {"date": datetime.now().strftime("%Y%m%d")} 832 | }) 833 | res = await req(**meta) 834 | logger.info(f'app 签到 {res.text}') 835 | 836 | # # 补签 837 | # meta.update({ 838 | # "url": "https://wx.10086.cn/qwhdhub/api/mark/mark31/redomark", 839 | # }) 840 | # res = await req(**meta) 841 | # logger.info(f'app 补签{res.text}') 842 | 843 | # 任务列表 844 | meta.update({ 845 | "url": "https://wx.10086.cn/qwhdhub/api/mark/task/taskList", 846 | "json": {}, 847 | }) 848 | res = await req(**meta) 849 | print(res.text) 850 | for t in res.json()["data"]["tasks"]: 851 | taskName, taskId, taskType, jumpUrl = t["taskName"], t["taskId"], t["taskCategory"], t["jumpUrl"] 852 | 853 | # 任务详情 854 | meta.update({ 855 | "method": "POST", 856 | "url": "https://wx.10086.cn/qwhdhub/api/mark/task/taskInfo", 857 | "json": {"taskId": str(taskId)}, 858 | }) 859 | res = await req(**meta) 860 | logger.info(f'taskInfo {taskName} {taskType} {taskId} {res.text}') 861 | 862 | taskType = res.json()["data"]["taskType"] 863 | 864 | # if jumpUrl.isalnum(): 865 | # meta.update({ 866 | # "url": "https://wx.10086.cn/qwhdhub/api/mark/mark31/isMark31", 867 | # "headers": { 868 | # "Referer": f'{res.json()["data"]["backUrl"]}?function={taskId}&completeTaskId={taskType}' 869 | # } 870 | # }) 871 | # res = await req(**meta) 872 | # print(res.text) 873 | 874 | # # 公众号任务 获取回调地址 (需要sid) 875 | # meta.update({ 876 | # "method": "POST", 877 | # "url": "https://wx.10086.cn/website/nrapigate/nrmix/activityGroup/getSignTask", 878 | # "json": {"ystitle": "", "taskId": str(taskId)}, 879 | # }) 880 | # res = await req(**meta) 881 | # logger.info(f'getSignTask {taskName} {taskType} {taskId} {res.text}') 882 | # 883 | # # 公众号任务完成 884 | # meta.update({ 885 | # "url": "https://wx.10086.cn/website/nrapigate/nrmix/activityGroup/finishSignTask", 886 | # "json": {"ystitle": "", "taskId": str(taskId)}, 887 | # }) 888 | # res = await req(**meta) 889 | # logger.info(f'finishSignTask {taskName} {taskType} {taskId} {res.text}') 890 | 891 | # app任务完成 892 | meta.update({ 893 | "url": "https://wx.10086.cn/qwhdhub/api/mark/task/finishTask", 894 | "json": {"taskId": str(taskId), "taskType": str(taskType)}, 895 | }) 896 | res = await req(**meta) 897 | logger.info(f'finishTask {taskName} {taskType} {taskId} {res.text}') 898 | 899 | # 领取奖励 900 | meta.update({ 901 | "url": "https://wx.10086.cn/qwhdhub/api/mark/task/getTaskAward", 902 | "json": {"taskId": str(t["taskId"])} 903 | }) 904 | res = await req(**meta) 905 | logger.info(f'getTaskAward {taskName} {taskType} {taskId} {res.text}') 906 | 907 | except Exception as e: 908 | logger.error(f'10086 {token} 签到程序异常:{e}') 909 | cache.delete(f'10086_{token}') 910 | 911 | await dingAlert(**result) 912 | 913 | 914 | # 中国联通 915 | async def m10010(**kwargs): 916 | result = { 917 | "code": 400, 918 | "msg": f'请输入ecs_token', 919 | "time": int(time()) 920 | } 921 | token = kwargs.get("token", "") 922 | if not token: 923 | return result 924 | cache.set(f'10010_{token}', token) 925 | # 签到 926 | meta = { 927 | "method": "POST", 928 | "url": "https://act.10010.com/SigninApp/signin/daySign", 929 | "json": { 930 | "shareCl": "", 931 | "shareCode": "" 932 | }, 933 | "headers": { 934 | "Cookie": f"ecs_token={token}" 935 | }, 936 | } 937 | res = await req(**meta) 938 | try: 939 | if res.status_code == 200: 940 | logger.info(f'10010 daySign {res.text}') 941 | res = res.json() 942 | if res["status"] == "0001": 943 | cache.delete(f"10010_{token}") 944 | result.update({"code": 200, "msg": f'10010用户:{token} 检查token是否有效'}) 945 | return result 946 | result.update({"msg": f'10010 {res["msg"]}'}) 947 | # 任务 948 | meta.update({ 949 | "url": "https://act.10010.com/SigninApp/superSimpleTask/getTask", 950 | }) 951 | res = await req(**meta) 952 | for r in res.json()["data"]: 953 | for t in r["taskMsg"]: 954 | # print(t) 955 | if t["achieve"] == '0': 956 | # meta.update({ 957 | # "url": "https://act.10010.com/SigninApp/task/doTask", 958 | # "json": { 959 | # "id": "eda7a0714642495f9ffd9fe16be1c57a", 960 | # # "orderId": "6750f3ae1e79489289ad4e1a08b0fa66", 961 | # # "imei": "FBE7973D-8368-465C-AF0A-AA979110ECC2", 962 | # # "prizeType": "nq", 963 | # "positionFlag": "3" 964 | # } 965 | # }) 966 | meta.update({ 967 | "url": "https://act.10010.com/SigninApp/simplyDotask/accomplishDotask", 968 | "json": { 969 | "actId": t.get("actId", ""), 970 | "taskId": t.get("taskId", ""), 971 | "systemCode": "QDQD", 972 | "orderId": "", 973 | "taskName": t.get("title", ""), 974 | "taskType": t.get("taskType", "2") 975 | } 976 | }) 977 | res = await req(**meta) 978 | meta.update({ 979 | "url": "https://act.10010.com/SigninApp/simplyDotask/doTaskS", 980 | "json": { 981 | "actId": t.get("actId", ""), 982 | "taskId": t.get("taskId", ""), 983 | # "taskType": "2", 984 | "taskType": t.get("taskType", "2"), 985 | }, 986 | }) 987 | res = await req(**meta) 988 | logger.info(f'{r["id"]} {res.text}') 989 | except Exception as e: 990 | logger.error(f'10010 签到程序异常:{e}') 991 | cache.delete(f"10010_{token}") 992 | result.update({"msg": f"10010 签到程序异常"}) 993 | # 钉钉通知 994 | await dingAlert(**result) 995 | return result 996 | 997 | 998 | # 有赞(东鹏特饮) 999 | async def youzan_dp(**kwargs): 1000 | result = { 1001 | "code": 400, 1002 | "msg": f'请输入sid', 1003 | "time": int(time()) 1004 | } 1005 | token = kwargs.get("token", "") 1006 | if not token: 1007 | return result 1008 | cache.set(f'dp_{token}', token) 1009 | # 签到 1010 | meta = { 1011 | "url": "https://h5.youzan.com/wscump/checkin/checkinV2.json", 1012 | "params": { 1013 | "checkinId": "3124", 1014 | # "app_id": "wxbe8abd76a650b858", 1015 | # "kdt_id": "15131322", 1016 | # "access_token": "" 1017 | }, 1018 | "headers": { 1019 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.42(0x18002a2b) NetType/4G Language/zh_CN", 1020 | "Extra-Data": '{"is_weapp":1,"sid":"%s","version":"2.151.5","client":"weapp","bizEnv":"wsc","uuid":""}' % token 1021 | } 1022 | } 1023 | res = await req(**meta) 1024 | try: 1025 | if res.status_code == 200: 1026 | logger.info(f'东鹏 checkin {res.text}') 1027 | res = res.json() 1028 | result.update({"msg": f'dp {res["msg"]}'}) 1029 | if res["code"] == -1: 1030 | cache.delete(f"dp_{token}") 1031 | except Exception as e: 1032 | logger.error(f'dp 签到程序异常:{e}') 1033 | cache.delete(f"dp_{token}") 1034 | result.update({"msg": f"dp {token} 签到程序异常"}) 1035 | # 钉钉通知 1036 | await dingAlert(**result) 1037 | 1038 | 1039 | # 云闪付 1040 | async def m95516(**kwargs): 1041 | result = { 1042 | "code": 400, 1043 | "msg": f'请输入Authorization', 1044 | "time": int(time()) 1045 | } 1046 | token = kwargs.get("token", "") 1047 | if not token: 1048 | return result 1049 | cache.set(f'95516_{token}', token) 1050 | # 签到 1051 | meta = { 1052 | "method": "POST", 1053 | "url": "https://youhui.95516.com/newsign/api/daily_sign_in", 1054 | "json": {"date": datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")}, 1055 | "headers": { 1056 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.42(0x18002a2b) NetType/4G Language/zh_CN", 1057 | "Referer": "https://youhui.95516.com/newsign/public/app/index.html", 1058 | "Authorization": token if token.startswith("Bearer") else f"Bearer {token}" 1059 | } 1060 | } 1061 | res = await req(**meta) 1062 | try: 1063 | if res and res.status_code == 200: 1064 | logger.info(f'95516 daily_sign_in {res.text}') 1065 | result.update({"msg": f'95516 签到成功!'}) 1066 | else: 1067 | logger.error(f'95516 {res.text}') 1068 | result.update({"msg": f'95516 {token} {res.json().get("message", "")}'}) 1069 | if res.status_code == 401: 1070 | cache.delete(f"95516_{token}") 1071 | except Exception as e: 1072 | logger.error(f'95516 签到程序异常:{e}') 1073 | cache.delete(f"95516_{token}") 1074 | result.update({"msg": f"95516 {token} 签到程序异常"}) 1075 | 1076 | # 钉钉通知 1077 | await dingAlert(**result) 1078 | 1079 | 1080 | # 卡亨星球 1081 | async def kraf(**kwargs): 1082 | result = { 1083 | "code": 400, 1084 | "msg": f'请输入token', 1085 | "time": int(time()) 1086 | } 1087 | token = kwargs.get("token", "") 1088 | if not token: 1089 | return result 1090 | cache.set(f'kraf_{token}', token) 1091 | # 签到 1092 | meta = { 1093 | "method": "POST", 1094 | "url": "https://kraftheinzcrm.kraftheinz.net.cn/crm/public/index.php/api/v1/dailySign", 1095 | 1096 | "headers": { 1097 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.42(0x18002a2f) NetType/4G", 1098 | "Content-Type": "application/x-www-form-urlencoded", 1099 | "token": token, 1100 | } 1101 | } 1102 | res = await req(**meta) 1103 | try: 1104 | if res and res.status_code == 200: 1105 | logger.info(f'kraf dailySign {res.text}') 1106 | result.update({"msg": f'kraf {res.json()["msg"]}'}) 1107 | # 分享 1108 | meta.update({ 1109 | "url": "https://kraftheinzcrm.kraftheinz.net.cn/crm/public/index.php/api/v1/recordScoreShare", 1110 | "data": { 1111 | "invite_id": token, 1112 | "cookbook_id": "21" 1113 | }, 1114 | }) 1115 | res = await req(**meta) 1116 | logger.info(f'kraf recordScoreShare {res.text}') 1117 | else: 1118 | # 解锁菜谱 1119 | meta = { 1120 | "url": "https://inspiration.kraftheinz.net.cn/inspiration/web/", 1121 | "params": {"s": "/api/menu/unlockDailyMenu"}, 1122 | "headers": { 1123 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.42(0x18002a2f) NetType/4G", 1124 | "Content-Type": "application/x-www-form-urlencoded", 1125 | "token": token, 1126 | } 1127 | } 1128 | res = await req(**meta) 1129 | if res and res.status_code == 200: 1130 | logger.info(f'kraf unlockDailyMenu {res.text}') 1131 | result.update({"msg": f'kraf 解锁每日菜谱!'}) 1132 | else: 1133 | cache.delete(f"kraf_{token}") 1134 | except Exception as e: 1135 | logger.error(f'kraf 签到程序异常:{e}') 1136 | cache.delete(f"kraf_{token}") 1137 | result.update({"msg": f"kraf {token} 签到程序异常"}) 1138 | 1139 | # 钉钉通知 1140 | await dingAlert(**result) 1141 | 1142 | 1143 | # 达摩网络(鸿星尔克) 1144 | async def demogic_erke(**kwargs): 1145 | result = { 1146 | "code": 400, 1147 | "msg": f'请输入memberId', 1148 | "time": int(time()) 1149 | } 1150 | token = kwargs.get("token", "") 1151 | if not token: 1152 | return result 1153 | cache.set(f'erke_{token}', token) 1154 | # 签到 1155 | meta = { 1156 | "method": "POST", 1157 | "url": "https://hope.demogic.com/gic-wx-app/member_sign.json", 1158 | "data": { 1159 | "memberId": token, 1160 | }, 1161 | "headers": { 1162 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.42(0x18002a2f) NetType/4G Language/zh_CN" 1163 | } 1164 | } 1165 | res = await req(**meta) 1166 | try: 1167 | if res and res.status_code == 200: 1168 | logger.info(f'erke dailySign {res.text}') 1169 | result.update({"msg": f'erke {res.json()["errmsg"]}'}) 1170 | else: 1171 | cache.delete(f"erke_{token}") 1172 | except Exception as e: 1173 | logger.error(f'erke 签到程序异常:{e}') 1174 | cache.delete(f"erke_{token}") 1175 | result.update({"msg": f"erke {token} 签到程序异常"}) 1176 | 1177 | # 钉钉通知 1178 | await dingAlert(**result) 1179 | 1180 | 1181 | # 腾讯自选股微信每日任务 1182 | async def wx_daily_task(**kwargs): 1183 | uin = kwargs.get("uin") 1184 | skey = kwargs.get("skey") 1185 | if not any([uin, skey]): 1186 | return None 1187 | 1188 | meta = { 1189 | "url": "https://wzq.gtimg.com/resources/vtools/daily_task_config_utf8.json", 1190 | "params": { 1191 | "t": int(time() * 1000), 1192 | } 1193 | } 1194 | res = await req(**meta) 1195 | print(res.text) 1196 | # for t in res.json()["daily_task_config"]: 1197 | # await activity_task(**{"actid": t["actid"], "id": t["act_id"], "tid": t["tid"]}) 1198 | meta.update({ 1199 | "url": "https://wzq.tenpay.com/cgi-bin/welfare_center.fcgi", 1200 | "params": { 1201 | "action": "home", 1202 | "channel": "0", 1203 | # "sign_actid": "2002", 1204 | # "daily_task_actid": "1110", 1205 | # "continue_task_actid": "1032", 1206 | "zxgmp_lct": "0", 1207 | "suprise_position": "welfare", 1208 | "_": int(time() * 1000) 1209 | }, 1210 | "headers": { 1211 | "Referer": "https://wzq.tenpay.com/activity/page/welwareCenterNew/", 1212 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.43(0x18002b2d) NetType/4G Language/zh_CN", 1213 | }, 1214 | "cookies": { 1215 | "wzq_qlskey": skey, 1216 | "wzq_qluin": uin, 1217 | } 1218 | }) 1219 | res = await req(**meta) 1220 | print(res.text) 1221 | # 日常任务 1222 | act_id = res.json()["continue_task"]["act_id"] 1223 | for pkgs in res.json()["continue_task"]["task_pkgs"]: 1224 | for t in pkgs["tasks"]: 1225 | kwargs.update({"actid": act_id, "id": t["id"], "tid": t["tid"]}) 1226 | await activity_task(**kwargs) 1227 | # 日常分享任务 1228 | act_id = "1110" 1229 | for pkgs in res.json()["daily_task"]["task_pkgs"]: 1230 | for t in pkgs["tasks"]: 1231 | kwargs.update({"actid": act_id, "id": t["id"], "tid": t["tid"]}) 1232 | await activity_task(**kwargs) 1233 | await activity_share(**kwargs) 1234 | 1235 | # 猜涨跌 1236 | meta.update({ 1237 | "method": "POST", 1238 | "url": "https://wzq.tenpay.com/cgi-bin/guess_op.fcgi", 1239 | "data": { 1240 | "action": "2", 1241 | "act_id": "3", 1242 | "user_answer": "1", 1243 | "date": (datetime.now() + timedelta(days=1)).strftime("%Y%m%d"), 1244 | "outer_src": "1", 1245 | "scenes": "5", 1246 | "xcxname": "zxgxcx", 1247 | "come_from": "2", 1248 | }, 1249 | }) 1250 | res = await req(**meta) 1251 | print(res.text) 1252 | 1253 | 1254 | # 腾讯自选股分享任务 1255 | async def activity_share(**kwargs): 1256 | share_type = kwargs.get("share_type", "") or f'task_{kwargs.get("tid", "51")}_{kwargs.get("actid", "1110")}' 1257 | meta = { 1258 | "method": "POST", 1259 | "url": "https://wzq.tenpay.com/cgi-bin/activity_share.fcgi", 1260 | "data": { 1261 | "action": "query_share_code", 1262 | "share_type": share_type, 1263 | "extra_info": kwargs.get("id", "21") 1264 | }, 1265 | "headers": { 1266 | "Referer": "https://wzq.tenpay.com/mp/v2/index.html", 1267 | "User-Agent": "QQStock/23110918 CFNetwork/1485 Darwin/23.1.0", 1268 | }, 1269 | "cookies": { 1270 | "wzq_qlskey": "v0b94cb14256565a21828f0fd89e04d9", 1271 | "wzq_qluin": "os-ppuL8gr8GFVR4CVdDZOmAaajI", 1272 | } 1273 | } 1274 | res = await req(**meta) 1275 | logger.info(f'share_code {res.text}') 1276 | if res and res.json().get("share_code"): 1277 | # 其它账号 1278 | meta["data"].update({ 1279 | "action": "share_code_info", 1280 | "share_type": share_type, 1281 | "share_code": res.json()["share_code"] 1282 | }) 1283 | res = await req(**meta) 1284 | if res: 1285 | logger.info(f'share_done {res.text}') 1286 | 1287 | 1288 | # 日常任务 1289 | async def activity_task(**kwargs): 1290 | meta = { 1291 | "method": "POST", 1292 | "url": "https://wzq.tenpay.com/cgi-bin/activity_task.fcgi", 1293 | "params": { 1294 | "t": int(time() * 1000), 1295 | }, 1296 | "data": { 1297 | "channel": "0", 1298 | "action": "taskstatus", 1299 | "actid": kwargs.get("actid", ""), 1300 | "id": kwargs.get("id", ""), 1301 | "tid": kwargs.get("tid", ""), 1302 | }, 1303 | "headers": { 1304 | "Referer": "https://wzq.tenpay.com/mp/v2/index.html", 1305 | "User-Agent": "QQStock/23110918 CFNetwork/1485 Darwin/23.1.0", 1306 | }, 1307 | "cookies": { 1308 | "wzq_qlskey": kwargs.get("skey", "v1e2b04f21065601afd25f4889dcabea"), 1309 | "wzq_qluin": kwargs.get("uin", "os-ppuP1KuvWz1b3asAs7PVrrMxc"), 1310 | } 1311 | } 1312 | res = await req(**meta) 1313 | logger.info(f'taskstatus {res.text}') 1314 | if res.json().get("done") == "0": 1315 | meta["data"].update({"action": "taskticket"}) 1316 | res = await req(**meta) 1317 | logger.info(f'taskticket {res.text}') 1318 | meta["data"].update({"action": "taskdone", "task_ticket": res.json()["task_ticket"]}) 1319 | res = await req(**meta) 1320 | logger.info(f'taskdone {res.text}') 1321 | 1322 | 1323 | # 腾讯自选股app每日任务 1324 | async def qqstock(**kwargs): 1325 | openid = kwargs.get("openid", "") 1326 | fskey = kwargs.get("skey", "") 1327 | meta = { 1328 | "url": "https://wzq.tenpay.com/cgi-bin/welfare_center.fcgi", 1329 | "params": { 1330 | "action": "home", 1331 | "channel": "1", 1332 | "zxgmp_lct": "0", 1333 | "suprise_position": "welfare", 1334 | "_": int(time() * 1000), 1335 | "openid": openid, 1336 | "fskey": fskey, 1337 | "access_token": "", 1338 | "_appName": "ios", 1339 | "_appver": "11.13.0", 1340 | "_osVer": "17.3", 1341 | "_devId": "", 1342 | "_ui": "", 1343 | }, 1344 | "headers": { 1345 | "Referer": "https://wzq.tenpay.com/activity/page/welwareCenterNew/", 1346 | # "User-Agent": "QQStock/23110918 CFNetwork/1485 Darwin/23.1.0", 1347 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 qqstock/11.13.0 deviceType/iphone", 1348 | } 1349 | } 1350 | res = await req(**meta) 1351 | # 日常任务 1352 | act_id = res.json()["continue_task"]["act_id"] 1353 | for pkgs in res.json()["continue_task"]["task_pkgs"]: 1354 | for t in pkgs["tasks"]: 1355 | kwargs.update({"actid": act_id, "id": t["id"], "tid": t["tid"]}) 1356 | await qqstock_activity_task(**kwargs) 1357 | for pkgs in res.json()["daily_task"]["task_pkgs"]: 1358 | for t in pkgs["tasks"]: 1359 | kwargs.update({"actid": 1111, "id": t["id"], "tid": t["tid"]}) 1360 | await qqstock_activity_task(**kwargs) 1361 | # 日常分享任务 1362 | task_list = ['news_share', 'user_public', 'task_72_1113', 'task_51_1101', 'task_50_1110', 'task_50_1112', 1363 | 'task_51_1032', 1364 | 'task_50_1111', 'task_50_1113', 'task_50_1101', 'task_51_1111', 'task_51_1100', 'task_75_1112', 1365 | 'task_50_1033', 'task_51_1113', 'task_76_1113', 'task_51_1112', 'task_51_1033', 'task_50_1032', 1366 | 'task_74_1113', 'task_51_1110', 'task_66_1110', 'task_75_1113', 'task_50_1100'] 1367 | for t in task_list: 1368 | kwargs.update({"share_type": t}) 1369 | await qqstock_activity_share(**kwargs) 1370 | 1371 | # 猜涨跌 1372 | meta.update({ 1373 | "url": "https://zqact.tenpay.com/cgi-bin/guess_op.fcgi", 1374 | "params": { 1375 | "channel": "1", 1376 | "action": "6", 1377 | "bid": "1001", 1378 | "new_version": "3", 1379 | "_": int(time() * 1000), 1380 | "openid": kwargs.get("openid", ""), 1381 | "fskey": kwargs.get("skey", ""), 1382 | "channel": "1", 1383 | "access_token": "", 1384 | "_appName": "ios", 1385 | "_appver": "11.10.0", 1386 | "_osVer": "17.1.1", 1387 | "_devId": "", 1388 | "_ui": "" 1389 | }, 1390 | }) 1391 | res = await req(**meta) 1392 | if res: 1393 | print(res.text.strip()) 1394 | # 长牛任务 1395 | kwargs.update({"actid": 1105}) 1396 | await qqstock_activity_year_party(**kwargs) 1397 | 1398 | # 微信任务 1399 | kwargs.update({"skey": kwargs["wx_skey"]}) 1400 | await wx_daily_task(**meta) 1401 | 1402 | 1403 | # 腾讯自选股日常任务 1404 | async def qqstock_activity_task(**kwargs): 1405 | meta = { 1406 | "url": "https://wzq.tenpay.com/cgi-bin/activity_task.fcgi", 1407 | "params": { 1408 | "actid": kwargs.get("actid", "1033"), 1409 | "id": kwargs.get("id", "5"), 1410 | "tid": kwargs.get("tid", "47"), 1411 | "action": "taskstatus", 1412 | "_": int(time() * 1000), 1413 | "openid": kwargs.get("openid", ""), 1414 | "fskey": kwargs.get("skey", ""), 1415 | "channel": "1", 1416 | "access_token": "", 1417 | "_appName": "ios", 1418 | "_appver": "11.10.0", 1419 | "_osVer": "17.1.1", 1420 | "_devId": "", 1421 | "_ui": "" 1422 | }, 1423 | "headers": { 1424 | "Referer": "https://wzq.tenpay.com/activity/page/welwareCenterNew/", 1425 | "User-Agent": "QQStock/23110918 CFNetwork/1485 Darwin/23.1.0", 1426 | } 1427 | } 1428 | res = await req(**meta) 1429 | if res and res.json().get("done") == "0": 1430 | logger.info(f'taskstatus {res.text.strip()}') 1431 | meta["params"].update({"action": "taskticket"}) 1432 | res = await req(**meta) 1433 | logger.info(f'taskticket {res.text.strip()}') 1434 | meta["params"].update({"action": "taskdone", "task_ticket": res.json()["task_ticket"]}) 1435 | res = await req(**meta) 1436 | logger.info(f'taskdone {res.text.strip()}') 1437 | 1438 | 1439 | # 腾讯自选股日常分享任务 1440 | async def qqstock_activity_share(**kwargs): 1441 | share_type = kwargs.get("share_type", "") or f'task_{kwargs.get("tid", "50")}_{kwargs.get("actid", "1033")}' 1442 | meta = { 1443 | "method": "POST", 1444 | "url": "https://wzq.tenpay.com/cgi-bin/activity_share.fcgi", 1445 | "params": { 1446 | "t": int(time() * 1000) 1447 | }, 1448 | "data": { 1449 | "channel": "1", 1450 | "action": "query_share_code", 1451 | "share_type": share_type, 1452 | "_rndtime": int(time()), 1453 | "_appName": "ios", 1454 | "openid": kwargs.get("openid", ""), 1455 | "fskey": kwargs.get("skey", ""), 1456 | "buildType": "store", 1457 | "check": "11", 1458 | "_idfa": "", 1459 | "lang": "zh_CN" 1460 | }, 1461 | "headers": { 1462 | # "Referer": "https://wzq.tenpay.com/activity/page/welwareCenterNew/", 1463 | "User-Agent": "QQStock/23110918 CFNetwork/1485 Darwin/23.1.0", 1464 | } 1465 | } 1466 | if share_type == "news_share": 1467 | meta["data"].update({"zappid": "zxg_h5"}) 1468 | res = await req(**meta) 1469 | logger.info(f'share_code {res.text.strip()}') 1470 | if res and res.json().get("share_code"): 1471 | meta["data"].update({ 1472 | "action": "share_code_info", 1473 | "share_type": share_type, 1474 | "share_code": res.json()["share_code"] 1475 | }) 1476 | meta.update({ 1477 | "cookies": { 1478 | "wzq_qlskey": "", 1479 | "wzq_qluin": "", 1480 | "zxg_openid": "" 1481 | }}) 1482 | res = await req(**meta) 1483 | if res: 1484 | logger.info(f'share_done {res.text.strip()}') 1485 | return share_type 1486 | 1487 | 1488 | # 长牛任务 1489 | async def qqstock_activity_year_party(**kwargs): 1490 | actid = kwargs.get("actid", "1105") 1491 | # 任务领取 1492 | meta = { 1493 | "url": "https://zqact03.tenpay.com/cgi-bin/activity_year_party.fcgi", 1494 | "params": { 1495 | "invite_code": "", 1496 | "help_code": "", 1497 | "share_date": "", 1498 | "nickname": "", 1499 | "headimgurl": "", 1500 | "type": "bullish", 1501 | "action": "home", 1502 | "actid": actid, 1503 | "_": int(time() * 1000), 1504 | "openid": kwargs.get("openid", ""), 1505 | "fskey": kwargs.get("skey", ""), 1506 | "channel": "1", 1507 | "access_token": "", 1508 | "_appName": "ios", 1509 | "_appver": "11.10.0", 1510 | "_osVer": "17.1.1", 1511 | "_devId": "", 1512 | "_ui": "" 1513 | } 1514 | } 1515 | res = await req(**meta) 1516 | for task in res.json()["task_pkg"][0]["tasks"]: 1517 | meta.update({ 1518 | "url": "https://zqact03.tenpay.com/cgi-bin/activity_task.fcgi", 1519 | "params": { 1520 | "action": "taskstatus", 1521 | "actid": actid, 1522 | "tid": task["tid"], 1523 | "id": task["id"], 1524 | "_": int(time() * 1000), 1525 | "openid": kwargs.get("openid", ""), 1526 | "fskey": kwargs.get("skey", ""), 1527 | "channel": "1", 1528 | "access_token": "", 1529 | "_appName": "ios", 1530 | "_appver": "11.10.0", 1531 | "_osVer": "17.1.1", 1532 | "_devId": "", 1533 | "_ui": "", 1534 | } 1535 | }) 1536 | res = await req(**meta) 1537 | if res and res.json().get("done") == "0": 1538 | meta["params"].update({ 1539 | "action": "taskticket", 1540 | "_": int(time() * 1000), 1541 | }) 1542 | res = await req(**meta) 1543 | if res and res.json().get("task_ticket"): 1544 | meta["params"].update({ 1545 | "action": "taskdone", 1546 | "task_ticket": res.json()["task_ticket"], 1547 | "_": int(time() * 1000), 1548 | }) 1549 | res = await req(**meta) 1550 | print(res.text.strip()) 1551 | while True: 1552 | meta.update({ 1553 | "url": "https://zqact03.tenpay.com/cgi-bin/activity_year_party.fcgi", 1554 | "params": { 1555 | "type": "bullish", 1556 | "action": "rock_bullish", 1557 | "actid": actid, 1558 | "_": int(time() * 1000), 1559 | "openid": kwargs.get("openid", ""), 1560 | "fskey": kwargs.get("skey", ""), 1561 | "channel": "1", 1562 | "access_token": "", 1563 | "_appName": "ios", 1564 | "_appver": "11.10.0", 1565 | "_osVer": "17.1.1", 1566 | "_devId": "", 1567 | "_ui": "" 1568 | } 1569 | }) 1570 | res = await req(**meta) 1571 | if res.json().get("forbidden_code") == "190721002": 1572 | break 1573 | meta["params"].update({"action": "open_box", "_": int(time() * 1000)}) 1574 | res = await req(**meta) 1575 | await asyncio.sleep(2) 1576 | 1577 | while True: 1578 | meta["params"].update({ 1579 | "type": "bullish", 1580 | "action": "feed", 1581 | }) 1582 | res = await req(**meta) 1583 | print(res.text.strip()) 1584 | await asyncio.sleep(1) 1585 | if res.json().get("retcode") != "0": 1586 | break 1587 | 1588 | 1589 | # 迪卡侬 1590 | async def decathlon(**kwargs): 1591 | result = { 1592 | "code": 400, 1593 | "msg": f'请输入Authorization', 1594 | "time": int(time()) 1595 | } 1596 | token = kwargs.get("token", "") 1597 | if not token: 1598 | return result 1599 | cache.set(f'decathlon_{token}', token) 1600 | # 签到 1601 | meta = { 1602 | "method": "POST", 1603 | "url": "https://api-cn.decathlon.com.cn/membership/membership-portal/mp/api/v1/business-center/reward/CHECK_IN_DAILY", 1604 | "headers": { 1605 | "Authorization": token if token.startswith("Bearer") else f"Bearer {token}", 1606 | "Content-Type": "application/json", 1607 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.43(0x18002b2d) NetType/4G Language/zh_CN", 1608 | } 1609 | } 1610 | res = await req(**meta) 1611 | try: 1612 | if res and res.status_code == 200: 1613 | logger.info(f'decathlon sign {res.text}') 1614 | result.update({"msg": f'decathlon {res.json()["code"]}'}) 1615 | else: 1616 | cache.delete(f"decathlon_{token}") 1617 | except Exception as e: 1618 | logger.error(f'迪卡侬 签到程序异常:{e}') 1619 | cache.delete(f"decathlon_{token}") 1620 | result.update({"msg": f"迪卡侬 {token} 签到程序异常"}) 1621 | 1622 | # 钉钉通知 1623 | await dingAlert(**result) 1624 | 1625 | 1626 | # 萤石 1627 | async def ys(**kwargs): 1628 | result = { 1629 | "code": 400, 1630 | "msg": f'请输入sessionid', 1631 | "time": int(time()) 1632 | } 1633 | token = kwargs.get("token", "") 1634 | if not token: 1635 | return result 1636 | cache.set(f'ys_{token}', token) 1637 | # 签到 1638 | meta = { 1639 | "method": "POST", 1640 | "url": "https://api.ys7.com/v3/videoclips/user/check_in", 1641 | "headers": { 1642 | "sessionid": token, 1643 | } 1644 | } 1645 | try: 1646 | res = await req(**meta) 1647 | if res and res.status_code == 200: 1648 | logger.info(f'萤石 sign {res.text}') 1649 | result.update({"msg": f'萤石 {res.json()["meta"]["message"]}'}) 1650 | # 每日任务 1651 | meta.update({ 1652 | "url": "https://api.ys7.com/v3/integral/task/list", 1653 | "data": { 1654 | "pageNum": "0", 1655 | "pageSize": "100", 1656 | "appDevInfo": dumps( 1657 | {"model": "iPhone 12 Pro", "brand": "apple", "packageName": "com.hikvision.videogo", 1658 | "platform": 1}) 1659 | } 1660 | }) 1661 | res = await req(**meta) 1662 | if res and res.status_code == 200: 1663 | for t in res.json()["taskList"]: 1664 | meta.update({ 1665 | "url": "https://api.ys7.com/v3/integral/task/complete", 1666 | "data": { 1667 | "eventkey": t["taskEventKey"], 1668 | "filterParam": "12345", 1669 | } 1670 | }) 1671 | res = await req(**meta) 1672 | if res and res.status_code == 200: 1673 | logger.info(f'萤石 {t["taskName"]} {res.text}') 1674 | except Exception as e: 1675 | logger.error(f'萤石 签到程序异常:{e}') 1676 | cache.delete(f"ys_{token}") 1677 | result.update({"msg": f"萤石 {token} 签到程序异常"}) 1678 | 1679 | # 钉钉通知 1680 | await dingAlert(**result) 1681 | 1682 | 1683 | # 掘金 1684 | async def juejin(**kwargs): 1685 | result = { 1686 | "code": 400, 1687 | "msg": f'请输入sessionid', 1688 | "time": int(time()) 1689 | } 1690 | token = kwargs.get("token", "") 1691 | if not token: 1692 | return result 1693 | cache.set(f'juejin_{token}', token) 1694 | # 签到 1695 | meta = { 1696 | "method": "POST", 1697 | "url": "https://api.juejin.cn/growth_api/v1/check_in", 1698 | "headers": { 1699 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", 1700 | }, 1701 | "cookies": {"sessionid_ss": token} 1702 | } 1703 | res = await req(**meta) 1704 | try: 1705 | if res and res.status_code == 200: 1706 | logger.info(f'juejin sign {res.text}') 1707 | result.update({"msg": f'juejin {res.json()["err_msg"]}'}) 1708 | else: 1709 | cache.delete(f"juejin_{token}") 1710 | except Exception as e: 1711 | logger.error(f'掘金 签到程序异常:{e}') 1712 | cache.delete(f"juejin_{token}") 1713 | result.update({"msg": f"掘金 {token} 签到程序异常"}) 1714 | # 抽奖 1715 | meta.update({"url": "https://api.juejin.cn/growth_api/v1/lottery/draw"}) 1716 | await req(**meta) 1717 | 1718 | # 钉钉通知 1719 | await dingAlert(**result) 1720 | 1721 | 1722 | # 途虎养车 1723 | async def tuhu(**kwargs): 1724 | result = { 1725 | "code": 400, 1726 | "msg": f'请输入Authorization', 1727 | "time": int(time()) 1728 | } 1729 | token = kwargs.get("token", "") 1730 | if not token: 1731 | return result 1732 | cache.set(f'tuhu_{token}', token) 1733 | # 签到 1734 | meta = { 1735 | "method": "GET", 1736 | "url": "https://api.tuhu.cn/user/UserCheckInVersion1", 1737 | "params": { 1738 | "channel": "wxapp", 1739 | }, 1740 | "headers": { 1741 | "Authorization": token if token.startswith("Bearer") else f"Bearer {token}", 1742 | "blackbox": "sMPSo1708653812YYEWM5GF936", 1743 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.47(0x18002f28) NetType/4G Language/zh_CN", 1744 | } 1745 | } 1746 | res = await req(**meta) 1747 | try: 1748 | if res and res.status_code == 200: 1749 | logger.info(f'途虎 sign {res.text}') 1750 | result.update({"msg": f'途虎 {res.json()["Message"]}'}) 1751 | else: 1752 | cache.delete(f"tuhu_{token}") 1753 | except Exception as e: 1754 | logger.error(f'途虎 签到程序异常:{e}') 1755 | cache.delete(f"tuhu_{token}") 1756 | result.update({"msg": f"途虎 {token} 签到程序异常"}) 1757 | 1758 | # 钉钉通知 1759 | await dingAlert(**result) 1760 | 1761 | 1762 | # 爱奇艺 1763 | async def iqiyi(**kwargs): 1764 | P00001 = kwargs.get("P00001", "") 1765 | P00003 = kwargs.get("P00003", "") 1766 | result = { 1767 | "code": 400, 1768 | "msg": f'请输入P00001及P00003', 1769 | "time": int(time()) 1770 | } 1771 | if not all([P00001, P00003]): 1772 | return result 1773 | 1774 | qyid = hashlib.md5("".join(choice(string.ascii_letters + string.digits) for _ in range(16)).encode()).hexdigest() 1775 | 1776 | params = { 1777 | "agentType": "1", 1778 | "agentversion": "1.0", 1779 | "appKey": "basic_pcw", 1780 | "authCookie": P00001, 1781 | "qyid": qyid, 1782 | "task_code": "natural_month_sign", 1783 | "timestamp": int(time() * 1000), 1784 | "typeCode": "point", 1785 | "userId": P00003, 1786 | } 1787 | params_list = [f'{k}={v}' for k, v in params.items()] 1788 | params_list.append("UKobMjDMsDoScuWOfp6F") 1789 | sign = hashlib.md5("|".join(params_list).encode()).hexdigest() 1790 | params.update({"sign": sign}) 1791 | data = { 1792 | "natural_month_sign": { 1793 | "agentType": "1", 1794 | "agentversion": "1", 1795 | "authCookie": P00001, 1796 | "qyid": qyid, 1797 | "taskCode": "iQIYI_mofhr", 1798 | "verticalCode": "iQIYI" 1799 | } 1800 | } 1801 | # 签到 1802 | meta = { 1803 | "method": "POST", 1804 | "url": "https://community.iqiyi.com/openApi/task/execute", 1805 | "params": params, 1806 | "json": data, 1807 | "headers": {"Content-Type": "application/json"} 1808 | } 1809 | res = await req(**meta) 1810 | try: 1811 | if res and res.status_code == 200: 1812 | logger.info(f'爱奇艺 签到 {res.text}') 1813 | result.update({"msg": f'爱奇艺 签到 {res.json()["message"]}'}) 1814 | cache.set(f'iqiyi_{P00003}', P00001) 1815 | else: 1816 | cache.delete(f'iqiyi_{P00003}') 1817 | except Exception as e: 1818 | logger.error(f'爱奇艺 签到 :{e}') 1819 | cache.delete(f'iqiyi_{P00003}') 1820 | result.update({"msg": f"爱奇艺 签到 {P00003} 程序异常"}) 1821 | 1822 | # 钉钉通知 1823 | await dingAlert(**result) 1824 | 1825 | 1826 | # 定时任务 1827 | async def crontab_task(**kwargs): 1828 | account_list = [ 1829 | { 1830 | "pt_key": "XXX", 1831 | "pt_pin": "jd_XXX", 1832 | }, 1833 | { 1834 | "pt_key": "XXX", 1835 | "pt_pin": "jd_XXX", 1836 | } 1837 | ] 1838 | 1839 | pre_list = ['jd', 'csai', 'sichuanair', 'dragon_boat_2023', 'meituan', 'weimob', '10086', '10010', 'dp', '95516', 'kraf', 'erke', 'honda', 'decathlon', 'ys', 'juejin'] 1840 | 1841 | for k, v in os.environ.items(): 1842 | if k.lower().lstrip("_") in pre_list: 1843 | for v_ in v.split(";"): 1844 | cache.set(f'{k.lower().lstrip("_")}_{v_}', v_) 1845 | 1846 | # tasks = [asyncio.create_task(signBeanAct(**account_list[i])) for i in range(len(account_list))] 1847 | # tasks = [] 1848 | # 京豆任务 1849 | tasks = [asyncio.create_task(signBeanAct(**{"pt_pin": k.strip("jd_"), "pt_key": cache[k]})) for k in cache.iterkeys() if 1850 | k.startswith("jd_")] 1851 | # 南航任务 1852 | tasks += [asyncio.create_task(csairSign(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("csai_")] 1853 | # 川航任务 1854 | tasks += [asyncio.create_task(sichuanairSign(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("sichuanair_")] 1855 | # 携程任务 1856 | tasks += [asyncio.create_task(ctripSign(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("ctrip_")] 1857 | # 微信龙舟任务 1858 | tasks += [asyncio.create_task(dragon_boat_2023(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("dragon_boat_2023_")] 1859 | # 美团优惠券 1860 | tasks += [asyncio.create_task(meituan(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("meituan_")] 1861 | # 统一星球 1862 | tasks += [asyncio.create_task(weimob(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("weimob_")] 1863 | # 10086 1864 | tasks += [asyncio.create_task(m10086(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("10086_")] 1865 | # 10010 1866 | tasks += [asyncio.create_task(m10010(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("10010_")] 1867 | # 东鹏特饮 1868 | tasks += [asyncio.create_task(youzan_dp(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("dp_")] 1869 | # 云闪付 1870 | tasks += [asyncio.create_task(m95516(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("95516_")] 1871 | # 卡亨星球 1872 | tasks += [asyncio.create_task(kraf(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("kraf_")] 1873 | # 鸿星尔克 1874 | tasks += [asyncio.create_task(demogic_erke(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("erke_")] 1875 | # 迪卡侬 1876 | tasks += [asyncio.create_task(decathlon(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("decathlon")] 1877 | # 萤石 1878 | tasks += [asyncio.create_task(ys(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("ys")] 1879 | # 掘金 1880 | tasks += [asyncio.create_task(juejin(**{"token": cache[k]})) for k in cache.iterkeys() if k.startswith("juejin")] 1881 | 1882 | result_list = await asyncio.gather(*tasks) 1883 | # logger.info(result_list) 1884 | 1885 | meta = { 1886 | "openid": "", 1887 | "uin": "", 1888 | # app 1889 | "skey": "", 1890 | # wx 1891 | "wx_skey": "", 1892 | } 1893 | try: 1894 | await qqstock(**meta) 1895 | except: 1896 | pass 1897 | return result_list 1898 | 1899 | 1900 | if __name__ == '__main__': 1901 | # import uvicorn 1902 | # uvicorn.run(app, host="0.0.0.0", port=8082) 1903 | asyncio.run(crontab_task()) 1904 | -------------------------------------------------------------------------------- /wechat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Litre-WU/Sign/7cc2abc9529ac04f95fd651f6a813b5e0f994603/wechat.jpg --------------------------------------------------------------------------------