# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%B0%8F%E5%A4%A9%E9%B9%85.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%B0%8F%E5%A4%A9%E9%B9%85.py
# Repo: jdqlscript/toulu
# Path: 小天鹅.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 73a76dd9d2c0924196e2f94ca8e1011b8e70db0010a37d6e48820a079e6cee9d
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段

#by:哆啦A梦
#TL库:https://github.com/3288588344/toulu.git
#抓包midea.com域名中的imUserId和uid，格式:imUserId#uid
#将抓到的值填在环境变量XTE中，多账号换行分割
#入口:微信小程序:全心全意小天鹅


#公众号:哆啦A梦的藏宝箱
import os
import requests
import json
import random
import time
#公众号:哆啦A梦的藏宝箱
def check_environment_variable():
    """检查环境变量并解析账号信息"""
    xte_env = os.environ.get("XTE")
    if not xte_env:
        print("错误：未设置 XTE 环境变量")
        return None

    accounts = []
    for account_info in xte_env.split("\n"):
        account_info = account_info.strip()
        if not account_info:
            continue
        parts = account_info.split("#")
        if len(parts) < 2:
            print(f"错误：XTE 环境变量格式不正确，应为 imUserId#uid，当前值为：{account_info}")
            return None
        imUserId = parts[0]
        uid = parts[1]
        accounts.append((imUserId, uid))
    
    if not accounts:
        print("错误：未找到有效的账号信息")
        return None
    
    return accounts

# 获取公告信息
def get_proclamation():
    primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
    backup_url = "https://tfapi.cn/TL/tl.json"
    try:
        response = requests.get(primary_url, timeout=10)
        if response.status_code == 200:
            print("\n" + "=" * 50)
            print("📢 公告信息")
            print("=" * 35)
            print(response.text)
            print("=" * 35 + "\n")
            print("公告获取成功，开始执行任务...\n")
            return
    except requests.exceptions.RequestException as e:
        print(f"获取公告时发生错误: {e}, 尝试备用链接...")

    try:
        response = requests.get(backup_url, timeout=10)
        if response.status_code == 200:
            print("\n" + "=" * 50)
            print("📢 公告信息")
            print("=" * 35)
            print(response.text)
            print("=" * 35 + "\n")
            print("公告获取成功，开始执行任务...\n")
        else:
            print(f"⚠️ 获取公告失败，状态码: {response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")


def send_sign_request(imUserId, uid):
    """发送签到请求"""
    url = "https://weixin.midea.com/mscp_mscp/api/cms_api/activity-center-im-service/im-svr/im/game/page/sign"
    
    headers = {
        "Connection": "keep-alive",
        "Content-Type": "application/json",
        "appId": "QLZZ9Fr7w2to",
        "apiKey": "3660663068894a0d9fea574c2673f3c0",
        "vcode": "107da4f1bb8b63c7d4ea9c5537207086",
        "Origin": "https://weixin.midea.com",
        "X-Requested-With": "com.tencent.mm",
        "Referer": "https://weixin.midea.com/apps/h5-pro-wx-interaction-marketing/",
        "Accept-Encoding": "gzip, deflate, br, zstd",
        "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
    }

    data = {
        "headParams": {
            "language": "CN",
            "originSystem": "MCSP",
            "timeZone": "",
            "userCode": "",
            "tenantCode": "",
            "userKey": "TEST_",
            "transactionId": ""
        },
        "pagination": None,
        "restParams": {
            "gameId": 9,
            "actvId": "401668349848950807",
            "rootCode": "XTE",
            "appCode": "XTE_SHG",
            "imUserId": imUserId,
            "uid": uid,
            "openId": "oOqmz4uVK1_2cXwnsVHDp1vicNNY",
            "unionId": "o9wX6jllxZJZxZsI0awpJS1aC8W0"
        }
    }

    try:
        response = requests.post(url, headers=headers, data=json.dumps(data))
        return response
    except requests.exceptions.RequestException as e:
        print(f"请求异常: {e}")
        return None

def process_response(index, imUserId, response):
    """处理签到响应"""
    if response is None:
        print(f"账号 {index}: {imUserId} - 请求失败")
        return

    if response.status_code != 200:
        print(f"账号 {index}: {imUserId} - 请求失败，状态码: {response.status_code}")
        print("响应内容:", response.text)
        return

    try:
        response_json = response.json()
    except json.JSONDecodeError:
        print(f"账号 {index}: {imUserId} - 响应内容不是 JSON 格式")
        print("响应内容:", response.text)
        return

    if response_json.get("code") != "000000":
        error_msg = response_json.get("msg", "未知错误")
        print(f"账号 {index}: {imUserId} - 签到失败: {error_msg}")
        return

    data_content = response_json.get("data")
    if not data_content:
        print(f"账号 {index}: {imUserId} - 响应数据中未找到 data 字段")
        return

    sign_result = data_content.get("result")
    if sign_result:
        print(f"账号 {index}: {imUserId} - 签到成功！")
        prize_dto = data_content.get("prizeDto")
        prize_name = prize_dto.get("name", "未知奖励") if prize_dto else "未知奖励"
        print(f"获得奖励: {prize_name}")
    else:
        print(f"账号 {index}: {imUserId} - 今日已签到")

    consecutive_days = data_content.get("consecutiveDays", "1")
    print(f"连续签到天数: {consecutive_days}")

def main():
    # 获取公告
    get_proclamation()

    # 获取账号列表
    accounts = check_environment_variable()
    if not accounts:
        return

    # 对账号进行排序并标注序号
    accounts.sort()
    if not accounts:
        print("错误：未找到有效的账号信息")
        return

    # 执行签到任务
    for index, (imUserId, uid) in enumerate(accounts, start=1):
        print(f"正在处理账号 {index}: ")
        response = send_sign_request(imUserId, uid)
        process_response(index, imUserId, response)
        print("-" * 50)
#公众号:哆啦A梦的藏宝箱
        # 添加随机延迟
        delay = random.randint(3, 10)  # 随机延迟3到10秒
        if index < len(accounts):
            print(f"随机延迟 {delay} 秒后处理下一个账号...")
            time.sleep(delay)

if __name__ == "__main__":
    main()
#公众号:哆啦A梦的藏宝箱