mirror of
https://github.com/3288588344/toulu.git
synced 2025-12-16 23:11:00 +08:00
117 lines
3.6 KiB
Python
117 lines
3.6 KiB
Python
#环境变量名:TOI 格式:access_token#sid#uuid
|
||
#抓包h5.youzan.com域名下的以上值填到环境变量TOI中,多账号用&分割
|
||
#入口:微信小程序:toi图益官方商城
|
||
import os
|
||
import json
|
||
import time
|
||
import requests
|
||
|
||
# ====== 常量 ======
|
||
KDT_ID = "97827637"
|
||
APP_ID = "wxbb5a91aacbab57f2"
|
||
CHECKIN_ID = "2163238"
|
||
|
||
# ====== 通用请求头工厂 ======
|
||
def _headers(sid: str, uuid: str) -> dict:
|
||
return {
|
||
"Host": "h5.youzan.com",
|
||
"content-type": "application/json",
|
||
"charset": "utf-8",
|
||
"referer": "https://servicewechat.com/wxbb5a91aacbab57f2/38/page-frame.html",
|
||
"extra-data": json.dumps(
|
||
{
|
||
"is_weapp": 1,
|
||
"sid": sid,
|
||
"version": "3.165.8.103",
|
||
"client": "weapp",
|
||
"bizEnv": "retail",
|
||
"uuid": uuid,
|
||
"ftime": int(time.time() * 1000),
|
||
},
|
||
separators=(",", ":"),
|
||
),
|
||
}
|
||
|
||
# ====== 获取用户信息 ======
|
||
def get_user_info(access_token: str, sid: str, uuid: str) -> tuple[str, str]:
|
||
|
||
url = "https://h5.youzan.com/wscaccount/api/authorize/data.json"
|
||
params = {
|
||
"kdt_id": KDT_ID,
|
||
"app_id": APP_ID,
|
||
"access_token": access_token,
|
||
"kdtId": KDT_ID,
|
||
}
|
||
try:
|
||
r = requests.get(url, params=params, headers=_headers(sid, uuid), timeout=5)
|
||
data = r.json()
|
||
info = data.get("data", {}).get("userInfo", {})
|
||
nick = info.get("nickname", "")
|
||
mobile = info.get("mobile", "")
|
||
if mobile and len(mobile) >= 11:
|
||
mobile = mobile[:3] + "****" + mobile[-4:]
|
||
return nick, mobile
|
||
except Exception:
|
||
return "", ""
|
||
|
||
# ====== 签到 ======
|
||
def do_checkin(access_token: str, sid: str, uuid: str) -> str:
|
||
url = "https://h5.youzan.com/wscump/checkin/checkinV2.json"
|
||
params = {
|
||
"checkinId": CHECKIN_ID,
|
||
"app_id": APP_ID,
|
||
"kdt_id": KDT_ID,
|
||
"access_token": access_token,
|
||
}
|
||
try:
|
||
r = requests.get(url, params=params, headers=_headers(sid, uuid), timeout=10)
|
||
data = r.json()
|
||
code = data.get("code")
|
||
if code == 0:
|
||
return "签到成功"
|
||
if code == 1000030071:
|
||
return "今日已签到"
|
||
return data.get("msg") or f"未知错误({code})"
|
||
except Exception as e:
|
||
return str(e)
|
||
|
||
#--------------- 公告 ---------------
|
||
def get_proclamation():
|
||
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
|
||
backup_url = "https://tfapi.cn/TL/tl.json"
|
||
|
||
for url in (primary_url, backup_url):
|
||
try:
|
||
r = requests.get(url, timeout=10)
|
||
if r.status_code == 200:
|
||
print("📢 公告信息")
|
||
print("=" * 45)
|
||
print(r.text)
|
||
print("=" * 45 + "\n")
|
||
return
|
||
except Exception as e:
|
||
continue
|
||
print("⚠️ 获取公告失败,跳过公告直接执行签到...\n")
|
||
|
||
# ====== 主流程 ======
|
||
def main() -> None:
|
||
raw = os.getenv("TOI", "").strip()
|
||
if not raw:
|
||
print("环境变量 TOI 为空")
|
||
return
|
||
|
||
for idx, item in enumerate(raw.split("&"), 1):
|
||
parts = item.strip().split("#")
|
||
if len(parts) != 3:
|
||
print(f"#{idx} 格式错误")
|
||
continue
|
||
token, sid, uuid = parts
|
||
nick, mobile = get_user_info(token, sid, uuid)
|
||
account_desc = f"{nick} {mobile}" if nick and mobile else uuid
|
||
result = do_checkin(token, sid, uuid)
|
||
print(f"{account_desc} {result}")
|
||
|
||
if __name__ == "__main__":
|
||
get_proclamation()
|
||
main()
|