# Source: https://github.com/back-101/zyqinglong/blob/main/tst.py # Raw: https://raw.githubusercontent.com/back-101/zyqinglong/main/tst.py # Repo: back-101/zyqinglong # Path: tst.py # UploadedAt: 2025-11-27T10:49:43Z # SHA256: bb3abb0a9bff29861a10318c1ea94861781faafe5dc21b2d43f5b7f65281cfaf # Category: web版/抓包 # Evidence: web/H5关键词 + cookie/token/header # -*- coding: utf-8 -*- """ 塔斯汀汉堡签到脚本(使用青龙notify模块) 原作者:https://github.com/linbailo/zyqinglong 二改:https://github.com/wanvfx/zyqinglong 最后更新日期:2025.6.8 功能说明: 1. 每日自动签到获取积分 2. 支持多账号管理 3. 使用青龙面板自带的notify.py模块发送通知 使用方法: 1. 添加环境变量 tst_tk_env 2. 格式:每行一个账号,格式为 token 示例: sss113-23129-123123-123123 sss234-23129-123123-234312 """ import os import time import requests import json import sys from datetime import datetime # 配置区域 DEBUG_MODE = False # 调试模式开关 MAX_RETRIES = 3 # 请求最大重试次数 # 全局通知内容 notification_list = [] # 导入青龙通知模块 try: sys.path.append('/ql/scripts') import notify except ImportError: notify = None print("警告:未找到青龙通知模块,通知功能将不可用") def log_debug(msg): """调试日志""" if DEBUG_MODE: print(f"[DEBUG] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {msg}") def log_info(msg): """信息日志""" print(f"[INFO] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {msg}") def log_error(msg): """错误日志""" print(f"[ERROR] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {msg}") def safe_request(method, url, **kwargs): """带重试机制的请求函数""" retries = 0 while retries < MAX_RETRIES: try: response = requests.request(method, url, **kwargs) if response.status_code == 200: return response log_error(f"请求失败: {url} 状态码: {response.status_code}") except Exception as e: log_error(f"请求异常: {url} 错误: {str(e)}") retries += 1 if retries < MAX_RETRIES: time.sleep(2 ** retries) # 指数退避 return None def add_notification(title, content): """添加到通知列表""" notification_list.append(f"【{title}】\n{content}") log_info(f"已添加通知: {title}") def send_notification(): """使用青龙通知模块发送通知""" if not notification_list: log_info("无通知内容,跳过发送") return if notify is None: log_error("通知模块未导入,无法发送通知") return content = "\n\n".join(notification_list) try: notify.send("塔斯汀签到脚本通知", content) log_info("通知发送成功") except Exception as e: log_error(f"发送通知异常: {str(e)}") def checkin(tk): """签到功能""" # 获取动态活动ID activityId = qdsj(tk) # 如果动态获取失败,使用计算的活动ID if not activityId: current_date = datetime.now() activityId = 59 + (current_date.year - 2025) * 12 + (current_date.month - 5) log_info(f"使用计算的活动ID: {activityId}") url = "https://sss-web.tastientech.com/api/sign/member/signV2" payload = {"activityId": activityId, "memberName": "", "memberPhone": ""} headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254032b) XWEB/13655", 'Content-Type': "application/json", 'xweb_xhr': "1", 'user-token': tk, 'channel': "1" } response = safe_request('POST', url, data=json.dumps(payload), headers=headers) if response: try: data = response.json() if data.get("code") == 200: # 解析签到结果 if data['result']['rewardInfoList'][0].get('rewardName'): reward = data['result']['rewardInfoList'][0]['rewardName'] else: reward = f"{data['result']['rewardInfoList'][0]['point']}积分" # 添加到通知 add_notification( "签到成功", f"账号: {tk[:10]}...\n" f"结果: 获得 {reward}\n" f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}" ) return True, f"签到成功,获得: {reward}" else: add_notification( "签到失败", f"账号: {tk[:10]}...\n" f"原因: {data.get('msg', '未知错误')}\n" f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}" ) return False, data.get("msg", f"签到失败: {response.text}") except Exception as e: add_notification( "签到异常", f"账号: {tk[:10]}...\n" f"错误: {str(e)}\n" f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}" ) return False, f"解析签到响应异常: {str(e)}" else: add_notification( "签到请求失败", f"账号: {tk[:10]}...\n" f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}" ) return False, "请求失败" def qdsj(ck): """获取签到活动ID""" headers = { 'user-token': ck, 'channel': '1' } data = {"shopId": "", "birthday": "", "gender": 0, "nickName": None, "phone": ""} response = safe_request('POST', 'https://sss-web.tastientech.com/api/minic/shop/intelligence/banner/c/list', json=data, headers=headers) if not response: return '' try: dl = response.json() activityId = '' for i in dl['result']: if '每日签到' in i['bannerName'] or '签到' in i['bannerName']: qd = i['jumpPara'] activityId = json.loads(qd)['activityId'] log_info(f"获取到本月签到代码:{activityId}") return activityId except Exception as e: log_error(f"解析签到活动ID异常: {str(e)}") return '' def filter_lines(input_string): """过滤有效账号行""" lines = input_string.splitlines() return [ line.strip() for line in lines if line.strip() ] def start(): """主启动函数""" global notification_list # 环境变量处理 env = os.getenv('tst_tk_env', '') accounts = filter_lines(env) if not accounts: log_error("未找到有效账号配置") add_notification("配置错误", "未找到有效账号配置,请检查环境变量tst_tk_env") return log_info(f"===== 开始执行签到,共 {len(accounts)} 个账号 =====") # 处理每个账号 for account in accounts: try: tk = account.split('|')[0].strip() # 只取token部分 log_info(f"处理账号: {tk[:10]}...") # 签到 success, message = checkin(tk) log_info(f"签到结果: {message}") except Exception as e: log_error(f"处理账号异常: {str(e)}") # 发送所有通知 send_notification() log_info("===== 签到执行结束 =====") if __name__ == '__main__': start()