[
  {
    "path": "README.md",
    "content": "青龙拉库：ql repo https://github.com/Bidepanlong/ql.git \"bd_\" \"README\" \"SendNotify\"\r\n\r\nWX机器人\r\n\r\n![机器人二维码](https://github.com/Bidepanlong/ql/assets/115330776/115c94e8-d5da-404d-9505-faa8e7dbfcc8)\r\n"
  },
  {
    "path": "SendNotify.py",
    "content": "#!/usr/bin/env python3\r\n# _*_ coding:utf-8 _*_\r\nimport base64\r\nimport hashlib\r\nimport hmac\r\nimport json\r\nimport os\r\nimport re\r\nimport threading\r\nimport time\r\nimport urllib.parse\r\nimport smtplib\r\nfrom email.mime.text import MIMEText\r\nfrom email.header import Header\r\nfrom email.utils import formataddr\r\n\r\nimport requests\r\n\r\n# 原先的 print 函数和主线程的锁\r\n_print = print\r\nmutex = threading.Lock()\r\n\r\n\r\n# 定义新的 print 函数\r\ndef print(text, *args, **kw):\r\n    \"\"\"\r\n    使输出有序进行，不出现多线程同一时间输出导致错乱的问题。\r\n    \"\"\"\r\n    with mutex:\r\n        _print(text, *args, **kw)\r\n\r\n\r\n# 通知服务\r\n# fmt: off\r\npush_config = {\r\n    'HITOKOTO': False,  # 启用一言（随机句子）\r\n\r\n    'BARK_PUSH': '',  # bark IP 或设备码，例：https://api.day.app/DxHcxxxxxRxxxxxxcm/\r\n    'BARK_ARCHIVE': '',  # bark 推送是否存档\r\n    'BARK_GROUP': '',  # bark 推送分组\r\n    'BARK_SOUND': '',  # bark 推送声音\r\n    'BARK_ICON': '',  # bark 推送图标\r\n\r\n    'CONSOLE': True,  # 控制台输出\r\n\r\n    'DD_BOT_SECRET': '',  # 钉钉机器人的 DD_BOT_SECRET\r\n    'DD_BOT_TOKEN': '',  # 钉钉机器人的 DD_BOT_TOKEN\r\n\r\n    'FSKEY': '',  # 飞书机器人的 FSKEY\r\n\r\n    'GOBOT_URL': '',  # go-cqhttp\r\n    # 推送到个人QQ：http://127.0.0.1/send_private_msg\r\n    # 群：http://127.0.0.1/send_group_msg\r\n    'GOBOT_QQ': '',  # go-cqhttp 的推送群或用户\r\n    # GOBOT_URL 设置 /send_private_msg 时填入 user_id=个人QQ\r\n    #               /send_group_msg   时填入 group_id=QQ群\r\n    'GOBOT_TOKEN': '',  # go-cqhttp 的 access_token\r\n\r\n    'GOTIFY_URL': '',  # gotify地址,如https://push.example.de:8080\r\n    'GOTIFY_TOKEN': '',  # gotify的消息应用token\r\n    'GOTIFY_PRIORITY': 0,  # 推送消息优先级,默认为0\r\n\r\n    'IGOT_PUSH_KEY': '',  # iGot 聚合推送的 IGOT_PUSH_KEY\r\n\r\n    'PUSH_KEY': '',  # server 酱的 PUSH_KEY，兼容旧版与 Turbo 版\r\n\r\n    'DEER_KEY': '',  # PushDeer 的 PUSHDEER_KEY\r\n    'DEER_URL': '',  # PushDeer 的 PUSHDEER_URL\r\n\r\n    'CHAT_URL': '',  # synology chat url\r\n    'CHAT_TOKEN': '',  # synology chat token\r\n\r\n    'PUSH_PLUS_TOKEN': '',  # push+ 微信推送的用户令牌\r\n    'PUSH_PLUS_USER': '',  # push+ 微信推送的群组编码\r\n\r\n    'QMSG_KEY': '',  # qmsg 酱的 QMSG_KEY\r\n    'QMSG_TYPE': '',  # qmsg 酱的 QMSG_TYPE\r\n\r\n    'QYWX_ORIGIN': '',  # 企业微信代理地址\r\n\r\n    'QYWX_AM': '',  # 企业微信应用\r\n\r\n    'QYWX_KEY': '',  # 企业微信机器人\r\n\r\n    'TG_BOT_TOKEN': '',  # tg 机器人的 TG_BOT_TOKEN，例：1407203283:AAG9rt-6RDaaX0HBLZQq0laNOh898iFYaRQ\r\n    'TG_USER_ID': '',  # tg 机器人的 TG_USER_ID，例：1434078534\r\n    'TG_API_HOST': '',  # tg 代理 api\r\n    'TG_PROXY_AUTH': '',  # tg 代理认证参数\r\n    'TG_PROXY_HOST': '',  # tg 机器人的 TG_PROXY_HOST\r\n    'TG_PROXY_PORT': '',  # tg 机器人的 TG_PROXY_PORT\r\n\r\n    'AIBOTK_KEY': '',  # 智能微秘书 个人中心的apikey 文档地址：http://wechat.aibotk.com/docs/about\r\n    'AIBOTK_TYPE': '',  # 智能微秘书 发送目标 room 或 contact\r\n    'AIBOTK_NAME': '',  # 智能微秘书  发送群名 或者好友昵称和type要对应好\r\n\r\n    'SMTP_SERVER': '',  # SMTP 发送邮件服务器，形如 smtp.exmail.qq.com:465\r\n    'SMTP_SSL': 'false',  # SMTP 发送邮件服务器是否使用 SSL，填写 true 或 false\r\n    'SMTP_EMAIL': '',  # SMTP 收发件邮箱，通知将会由自己发给自己\r\n    'SMTP_PASSWORD': '',  # SMTP 登录密码，也可能为特殊口令，视具体邮件服务商说明而定\r\n    'SMTP_NAME': '',  # SMTP 收发件人姓名，可随意填写\r\n\r\n    'PUSHME_KEY': '',  # PushMe 酱的 PUSHME_KEY\r\n}\r\nnotify_function = []\r\n# fmt: on\r\n\r\n# 首先读取 面板变量 或者 github action 运行变量\r\nfor k in push_config:\r\n    if os.getenv(k):\r\n        v = os.getenv(k)\r\n        push_config[k] = v\r\n\r\n\r\ndef bark(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 bark 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"BARK_PUSH\"):\r\n        print(\"bark 服务的 BARK_PUSH 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"bark 服务启动\")\r\n\r\n    if push_config.get(\"BARK_PUSH\").startswith(\"http\"):\r\n        url = f'{push_config.get(\"BARK_PUSH\")}/{urllib.parse.quote_plus(title)}/{urllib.parse.quote_plus(content)}'\r\n    else:\r\n        url = f'https://api.day.app/{push_config.get(\"BARK_PUSH\")}/{urllib.parse.quote_plus(title)}/{urllib.parse.quote_plus(content)}'\r\n\r\n    bark_params = {\r\n        \"BARK_ARCHIVE\": \"isArchive\",\r\n        \"BARK_GROUP\": \"group\",\r\n        \"BARK_SOUND\": \"sound\",\r\n        \"BARK_ICON\": \"icon\",\r\n    }\r\n    params = \"\"\r\n    for pair in filter(\r\n            lambda pairs: pairs[0].startswith(\"BARK_\")\r\n                          and pairs[0] != \"BARK_PUSH\"\r\n                          and pairs[1]\r\n                          and bark_params.get(pairs[0]),\r\n            push_config.items(),\r\n    ):\r\n        params += f\"{bark_params.get(pair[0])}={pair[1]}&\"\r\n    if params:\r\n        url = url + \"?\" + params.rstrip(\"&\")\r\n    response = requests.get(url).json()\r\n\r\n    if response[\"code\"] == 200:\r\n        print(\"bark 推送成功！\")\r\n    else:\r\n        print(\"bark 推送失败！\")\r\n\r\n\r\ndef console(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 控制台 推送消息。\r\n    \"\"\"\r\n    # print(f\"{title}\\n\\n{content}\")\r\n\r\n\r\ndef dingding_bot(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 钉钉机器人 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"DD_BOT_SECRET\") or not push_config.get(\"DD_BOT_TOKEN\"):\r\n        print(\"钉钉机器人 服务的 DD_BOT_SECRET 或者 DD_BOT_TOKEN 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"钉钉机器人 服务启动\")\r\n\r\n    timestamp = str(round(time.time() * 1000))\r\n    secret_enc = push_config.get(\"DD_BOT_SECRET\").encode(\"utf-8\")\r\n    string_to_sign = \"{}\\n{}\".format(timestamp, push_config.get(\"DD_BOT_SECRET\"))\r\n    string_to_sign_enc = string_to_sign.encode(\"utf-8\")\r\n    hmac_code = hmac.new(\r\n        secret_enc, string_to_sign_enc, digestmod=hashlib.sha256\r\n    ).digest()\r\n    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))\r\n    url = f'https://oapi.dingtalk.com/robot/send?access_token={push_config.get(\"DD_BOT_TOKEN\")}&timestamp={timestamp}&sign={sign}'\r\n    headers = {\"Content-Type\": \"application/json;charset=utf-8\"}\r\n    data = {\"msgtype\": \"text\", \"text\": {\"content\": f\"{title}\\n\\n{content}\"}}\r\n    response = requests.post(\r\n        url=url, data=json.dumps(data), headers=headers, timeout=15\r\n    ).json()\r\n\r\n    if not response[\"errcode\"]:\r\n        print(\"钉钉机器人 推送成功！\")\r\n    else:\r\n        print(\"钉钉机器人 推送失败！\")\r\n\r\n\r\ndef feishu_bot(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 飞书机器人 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"FSKEY\"):\r\n        print(\"飞书 服务的 FSKEY 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"飞书 服务启动\")\r\n\r\n    url = f'https://open.feishu.cn/open-apis/bot/v2/hook/{push_config.get(\"FSKEY\")}'\r\n    data = {\"msg_type\": \"text\", \"content\": {\"text\": f\"{title}\\n\\n{content}\"}}\r\n    response = requests.post(url, data=json.dumps(data)).json()\r\n\r\n    if response.get(\"StatusCode\") == 0:\r\n        print(\"飞书 推送成功！\")\r\n    else:\r\n        print(\"飞书 推送失败！错误信息如下：\\n\", response)\r\n\r\n\r\ndef go_cqhttp(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 go_cqhttp 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"GOBOT_URL\") or not push_config.get(\"GOBOT_QQ\"):\r\n        print(\"go-cqhttp 服务的 GOBOT_URL 或 GOBOT_QQ 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"go-cqhttp 服务启动\")\r\n\r\n    url = f'{push_config.get(\"GOBOT_URL\")}?access_token={push_config.get(\"GOBOT_TOKEN\")}&{push_config.get(\"GOBOT_QQ\")}&message=标题:{title}\\n内容:{content}'\r\n    response = requests.get(url).json()\r\n\r\n    if response[\"status\"] == \"ok\":\r\n        print(\"go-cqhttp 推送成功！\")\r\n    else:\r\n        print(\"go-cqhttp 推送失败！\")\r\n\r\n\r\ndef gotify(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 gotify 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"GOTIFY_URL\") or not push_config.get(\"GOTIFY_TOKEN\"):\r\n        print(\"gotify 服务的 GOTIFY_URL 或 GOTIFY_TOKEN 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"gotify 服务启动\")\r\n\r\n    url = f'{push_config.get(\"GOTIFY_URL\")}/message?token={push_config.get(\"GOTIFY_TOKEN\")}'\r\n    data = {\r\n        \"title\": title,\r\n        \"message\": content,\r\n        \"priority\": push_config.get(\"GOTIFY_PRIORITY\"),\r\n    }\r\n    response = requests.post(url, data=data).json()\r\n\r\n    if response.get(\"id\"):\r\n        print(\"gotify 推送成功！\")\r\n    else:\r\n        print(\"gotify 推送失败！\")\r\n\r\n\r\ndef iGot(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 iGot 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"IGOT_PUSH_KEY\"):\r\n        print(\"iGot 服务的 IGOT_PUSH_KEY 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"iGot 服务启动\")\r\n\r\n    url = f'https://push.hellyw.com/{push_config.get(\"IGOT_PUSH_KEY\")}'\r\n    data = {\"title\": title, \"content\": content}\r\n    headers = {\"Content-Type\": \"application/x-www-form-urlencoded\"}\r\n    response = requests.post(url, data=data, headers=headers).json()\r\n\r\n    if response[\"ret\"] == 0:\r\n        print(\"iGot 推送成功！\")\r\n    else:\r\n        print(f'iGot 推送失败！{response[\"errMsg\"]}')\r\n\r\n\r\ndef serverJ(title: str, content: str) -> None:\r\n    \"\"\"\r\n    通过 serverJ 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"PUSH_KEY\"):\r\n        print(\"serverJ 服务的 PUSH_KEY 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"serverJ 服务启动\")\r\n\r\n    data = {\"text\": title, \"desp\": content.replace(\"\\n\", \"\\n\\n\")}\r\n    if push_config.get(\"PUSH_KEY\").find(\"SCT\") != -1:\r\n        url = f'https://sctapi.ftqq.com/{push_config.get(\"PUSH_KEY\")}.send'\r\n    else:\r\n        url = f'https://sc.ftqq.com/{push_config.get(\"PUSH_KEY\")}.send'\r\n    response = requests.post(url, data=data).json()\r\n\r\n    if response.get(\"errno\") == 0 or response.get(\"code\") == 0:\r\n        print(\"serverJ 推送成功！\")\r\n    else:\r\n        print(f'serverJ 推送失败！错误码：{response[\"message\"]}')\r\n\r\n\r\ndef pushdeer(title: str, content: str) -> None:\r\n    \"\"\"\r\n    通过PushDeer 推送消息\r\n    \"\"\"\r\n    if not push_config.get(\"DEER_KEY\"):\r\n        print(\"PushDeer 服务的 DEER_KEY 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"PushDeer 服务启动\")\r\n    data = {\r\n        \"text\": title,\r\n        \"desp\": content,\r\n        \"type\": \"markdown\",\r\n        \"pushkey\": push_config.get(\"DEER_KEY\"),\r\n    }\r\n    url = \"https://api2.pushdeer.com/message/push\"\r\n    if push_config.get(\"DEER_URL\"):\r\n        url = push_config.get(\"DEER_URL\")\r\n\r\n    response = requests.post(url, data=data).json()\r\n\r\n    if len(response.get(\"content\").get(\"result\")) > 0:\r\n        print(\"PushDeer 推送成功！\")\r\n    else:\r\n        print(\"PushDeer 推送失败！错误信息：\", response)\r\n\r\n\r\ndef chat(title: str, content: str) -> None:\r\n    \"\"\"\r\n    通过Chat 推送消息\r\n    \"\"\"\r\n    if not push_config.get(\"CHAT_URL\") or not push_config.get(\"CHAT_TOKEN\"):\r\n        print(\"chat 服务的 CHAT_URL或CHAT_TOKEN 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"chat 服务启动\")\r\n    data = \"payload=\" + json.dumps({\"text\": title + \"\\n\" + content})\r\n    url = push_config.get(\"CHAT_URL\") + push_config.get(\"CHAT_TOKEN\")\r\n    response = requests.post(url, data=data)\r\n\r\n    if response.status_code == 200:\r\n        print(\"Chat 推送成功！\")\r\n    else:\r\n        print(\"Chat 推送失败！错误信息：\", response)\r\n\r\n\r\ndef pushplus_bot(title: str, content: str) -> None:\r\n    \"\"\"\r\n    通过 push+ 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"PUSH_PLUS_TOKEN\"):\r\n        print(\"PUSHPLUS 服务的 PUSH_PLUS_TOKEN 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"PUSHPLUS 服务启动\")\r\n\r\n    url = \"http://www.pushplus.plus/send\"\r\n    data = {\r\n        \"token\": push_config.get(\"PUSH_PLUS_TOKEN\"),\r\n        \"title\": title,\r\n        \"content\": content,\r\n        \"topic\": push_config.get(\"PUSH_PLUS_USER\"),\r\n    }\r\n    body = json.dumps(data).encode(encoding=\"utf-8\")\r\n    headers = {\"Content-Type\": \"application/json\"}\r\n    response = requests.post(url=url, data=body, headers=headers).json()\r\n\r\n    if response[\"code\"] == 200:\r\n        print(\"PUSHPLUS 推送成功！\")\r\n\r\n    else:\r\n        url_old = \"http://pushplus.hxtrip.com/send\"\r\n        headers[\"Accept\"] = \"application/json\"\r\n        response = requests.post(url=url_old, data=body, headers=headers).json()\r\n\r\n        if response[\"code\"] == 200:\r\n            print(\"PUSHPLUS(hxtrip) 推送成功！\")\r\n\r\n        else:\r\n            print(\"PUSHPLUS 推送失败！\")\r\n\r\n\r\ndef qmsg_bot(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 qmsg 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"QMSG_KEY\") or not push_config.get(\"QMSG_TYPE\"):\r\n        print(\"qmsg 的 QMSG_KEY 或者 QMSG_TYPE 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"qmsg 服务启动\")\r\n\r\n    url = f'https://qmsg.zendee.cn/{push_config.get(\"QMSG_TYPE\")}/{push_config.get(\"QMSG_KEY\")}'\r\n    payload = {\"msg\": f'{title}\\n\\n{content.replace(\"----\", \"-\")}'.encode(\"utf-8\")}\r\n    response = requests.post(url=url, params=payload).json()\r\n\r\n    if response[\"code\"] == 0:\r\n        print(\"qmsg 推送成功！\")\r\n    else:\r\n        print(f'qmsg 推送失败！{response[\"reason\"]}')\r\n\r\n\r\ndef wecom_app(title: str, content: str) -> None:\r\n    \"\"\"\r\n    通过 企业微信 APP 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"QYWX_AM\"):\r\n        print(\"QYWX_AM 未设置!!\\n取消推送\")\r\n        return\r\n    QYWX_AM_AY = re.split(\",\", push_config.get(\"QYWX_AM\"))\r\n    if 4 < len(QYWX_AM_AY) > 5:\r\n        print(\"QYWX_AM 设置错误!!\\n取消推送\")\r\n        return\r\n    print(\"企业微信 APP 服务启动\")\r\n\r\n    corpid = QYWX_AM_AY[0]\r\n    corpsecret = QYWX_AM_AY[1]\r\n    touser = QYWX_AM_AY[2]\r\n    agentid = QYWX_AM_AY[3]\r\n    try:\r\n        media_id = QYWX_AM_AY[4]\r\n    except IndexError:\r\n        media_id = \"\"\r\n    wx = WeCom(corpid, corpsecret, agentid)\r\n    # 如果没有配置 media_id 默认就以 text 方式发送\r\n    if not media_id:\r\n        message = title + \"\\n\\n\" + content\r\n        response = wx.send_text(message, touser)\r\n    else:\r\n        response = wx.send_mpnews(title, content, media_id, touser)\r\n\r\n    if response == \"ok\":\r\n        print(\"企业微信推送成功！\")\r\n    else:\r\n        print(\"企业微信推送失败！错误信息如下：\\n\", response)\r\n\r\n\r\nclass WeCom:\r\n    def __init__(self, corpid, corpsecret, agentid):\r\n        self.CORPID = corpid\r\n        self.CORPSECRET = corpsecret\r\n        self.AGENTID = agentid\r\n        self.ORIGIN = \"https://qyapi.weixin.qq.com\"\r\n        if push_config.get(\"QYWX_ORIGIN\"):\r\n            self.ORIGIN = push_config.get(\"QYWX_ORIGIN\")\r\n\r\n    def get_access_token(self):\r\n        url = f\"{self.ORIGIN}/cgi-bin/gettoken\"\r\n        values = {\r\n            \"corpid\": self.CORPID,\r\n            \"corpsecret\": self.CORPSECRET,\r\n        }\r\n        req = requests.post(url, params=values)\r\n        data = json.loads(req.text)\r\n        return data[\"access_token\"]\r\n\r\n    def send_text(self, message, touser=\"@all\"):\r\n        send_url = f\"{self.ORIGIN}/cgi-bin/message/send?access_token={self.get_access_token()}\"\r\n        send_values = {\r\n            \"touser\": touser,\r\n            \"msgtype\": \"text\",\r\n            \"agentid\": self.AGENTID,\r\n            \"text\": {\"content\": message},\r\n            \"safe\": \"0\",\r\n        }\r\n        send_msges = bytes(json.dumps(send_values), \"utf-8\")\r\n        respone = requests.post(send_url, send_msges)\r\n        respone = respone.json()\r\n        return respone[\"errmsg\"]\r\n\r\n    def send_mpnews(self, title, message, media_id, touser=\"@all\"):\r\n        send_url = f\"https://{self.HOST}/cgi-bin/message/send?access_token={self.get_access_token()}\"\r\n        send_values = {\r\n            \"touser\": touser,\r\n            \"msgtype\": \"mpnews\",\r\n            \"agentid\": self.AGENTID,\r\n            \"mpnews\": {\r\n                \"articles\": [\r\n                    {\r\n                        \"title\": title,\r\n                        \"thumb_media_id\": media_id,\r\n                        \"author\": \"Author\",\r\n                        \"content_source_url\": \"\",\r\n                        \"content\": message.replace(\"\\n\", \"<br/>\"),\r\n                        \"digest\": message,\r\n                    }\r\n                ]\r\n            },\r\n        }\r\n        send_msges = bytes(json.dumps(send_values), \"utf-8\")\r\n        respone = requests.post(send_url, send_msges)\r\n        respone = respone.json()\r\n        return respone[\"errmsg\"]\r\n\r\n\r\ndef wecom_bot(title: str, content: str) -> None:\r\n    \"\"\"\r\n    通过 企业微信机器人 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"QYWX_KEY\"):\r\n        print(\"企业微信机器人 服务的 QYWX_KEY 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"企业微信机器人服务启动\")\r\n\r\n    origin = \"https://qyapi.weixin.qq.com\"\r\n    if push_config.get(\"QYWX_ORIGIN\"):\r\n        origin = push_config.get(\"QYWX_ORIGIN\")\r\n\r\n    url = f\"{origin}/cgi-bin/webhook/send?key={push_config.get('QYWX_KEY')}\"\r\n    headers = {\"Content-Type\": \"application/json;charset=utf-8\"}\r\n    data = {\"msgtype\": \"text\", \"text\": {\"content\": f\"{title}\\n\\n{content}\"}}\r\n    response = requests.post(\r\n        url=url, data=json.dumps(data), headers=headers, timeout=15\r\n    ).json()\r\n\r\n    if response[\"errcode\"] == 0:\r\n        print(\"企业微信机器人推送成功！\")\r\n    else:\r\n        print(\"企业微信机器人推送失败！\")\r\n\r\n\r\ndef telegram_bot(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 telegram 机器人 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"TG_BOT_TOKEN\") or not push_config.get(\"TG_USER_ID\"):\r\n        print(\"tg 服务的 bot_token 或者 user_id 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"tg 服务启动\")\r\n\r\n    if push_config.get(\"TG_API_HOST\"):\r\n        url = f\"https://{push_config.get('TG_API_HOST')}/bot{push_config.get('TG_BOT_TOKEN')}/sendMessage\"\r\n    else:\r\n        url = (\r\n            f\"https://api.telegram.org/bot{push_config.get('TG_BOT_TOKEN')}/sendMessage\"\r\n        )\r\n    headers = {\"Content-Type\": \"application/x-www-form-urlencoded\"}\r\n    payload = {\r\n        \"chat_id\": str(push_config.get(\"TG_USER_ID\")),\r\n        \"text\": f\"{title}\\n\\n{content}\",\r\n        \"disable_web_page_preview\": \"true\",\r\n    }\r\n    proxies = None\r\n    if push_config.get(\"TG_PROXY_HOST\") and push_config.get(\"TG_PROXY_PORT\"):\r\n        if push_config.get(\"TG_PROXY_AUTH\") is not None and \"@\" not in push_config.get(\r\n                \"TG_PROXY_HOST\"\r\n        ):\r\n            push_config[\"TG_PROXY_HOST\"] = (\r\n                    push_config.get(\"TG_PROXY_AUTH\")\r\n                    + \"@\"\r\n                    + push_config.get(\"TG_PROXY_HOST\")\r\n            )\r\n        proxyStr = \"http://{}:{}\".format(\r\n            push_config.get(\"TG_PROXY_HOST\"), push_config.get(\"TG_PROXY_PORT\")\r\n        )\r\n        proxies = {\"http\": proxyStr, \"https\": proxyStr}\r\n    response = requests.post(\r\n        url=url, headers=headers, params=payload, proxies=proxies\r\n    ).json()\r\n\r\n    if response[\"ok\"]:\r\n        print(\"tg 推送成功！\")\r\n    else:\r\n        print(\"tg 推送失败！\")\r\n\r\n\r\ndef aibotk(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 智能微秘书 推送消息。\r\n    \"\"\"\r\n    if (\r\n            not push_config.get(\"AIBOTK_KEY\")\r\n            or not push_config.get(\"AIBOTK_TYPE\")\r\n            or not push_config.get(\"AIBOTK_NAME\")\r\n    ):\r\n        print(\"智能微秘书 的 AIBOTK_KEY 或者 AIBOTK_TYPE 或者 AIBOTK_NAME 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"智能微秘书 服务启动\")\r\n\r\n    if push_config.get(\"AIBOTK_TYPE\") == \"room\":\r\n        url = \"https://api-bot.aibotk.com/openapi/v1/chat/room\"\r\n        data = {\r\n            \"apiKey\": push_config.get(\"AIBOTK_KEY\"),\r\n            \"roomName\": push_config.get(\"AIBOTK_NAME\"),\r\n            \"message\": {\"type\": 1, \"content\": f\"【青龙快讯】\\n\\n{title}\\n{content}\"},\r\n        }\r\n    else:\r\n        url = \"https://api-bot.aibotk.com/openapi/v1/chat/contact\"\r\n        data = {\r\n            \"apiKey\": push_config.get(\"AIBOTK_KEY\"),\r\n            \"name\": push_config.get(\"AIBOTK_NAME\"),\r\n            \"message\": {\"type\": 1, \"content\": f\"【青龙快讯】\\n\\n{title}\\n{content}\"},\r\n        }\r\n    body = json.dumps(data).encode(encoding=\"utf-8\")\r\n    headers = {\"Content-Type\": \"application/json\"}\r\n    response = requests.post(url=url, data=body, headers=headers).json()\r\n    print(response)\r\n    if response[\"code\"] == 0:\r\n        print(\"智能微秘书 推送成功！\")\r\n    else:\r\n        print(f'智能微秘书 推送失败！{response[\"error\"]}')\r\n\r\n\r\ndef smtp(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 SMTP 邮件 推送消息。\r\n    \"\"\"\r\n    if (\r\n            not push_config.get(\"SMTP_SERVER\")\r\n            or not push_config.get(\"SMTP_SSL\")\r\n            or not push_config.get(\"SMTP_EMAIL\")\r\n            or not push_config.get(\"SMTP_PASSWORD\")\r\n            or not push_config.get(\"SMTP_NAME\")\r\n    ):\r\n        print(\r\n            \"SMTP 邮件 的 SMTP_SERVER 或者 SMTP_SSL 或者 SMTP_EMAIL 或者 SMTP_PASSWORD 或者 SMTP_NAME 未设置!!\\n取消推送\"\r\n        )\r\n        return\r\n    print(\"SMTP 邮件 服务启动\")\r\n\r\n    message = MIMEText(content, \"plain\", \"utf-8\")\r\n    message[\"From\"] = formataddr(\r\n        (\r\n            Header(push_config.get(\"SMTP_NAME\"), \"utf-8\").encode(),\r\n            push_config.get(\"SMTP_EMAIL\"),\r\n        )\r\n    )\r\n    message[\"To\"] = formataddr(\r\n        (\r\n            Header(push_config.get(\"SMTP_NAME\"), \"utf-8\").encode(),\r\n            push_config.get(\"SMTP_EMAIL\"),\r\n        )\r\n    )\r\n    message[\"Subject\"] = Header(title, \"utf-8\")\r\n\r\n    try:\r\n        smtp_server = (\r\n            smtplib.SMTP_SSL(push_config.get(\"SMTP_SERVER\"))\r\n            if push_config.get(\"SMTP_SSL\") == \"true\"\r\n            else smtplib.SMTP(push_config.get(\"SMTP_SERVER\"))\r\n        )\r\n        smtp_server.login(\r\n            push_config.get(\"SMTP_EMAIL\"), push_config.get(\"SMTP_PASSWORD\")\r\n        )\r\n        smtp_server.sendmail(\r\n            push_config.get(\"SMTP_EMAIL\"),\r\n            push_config.get(\"SMTP_EMAIL\"),\r\n            message.as_bytes(),\r\n        )\r\n        smtp_server.close()\r\n        print(\"SMTP 邮件 推送成功！\")\r\n    except Exception as e:\r\n        print(f\"SMTP 邮件 推送失败！{e}\")\r\n\r\n\r\ndef pushme(title: str, content: str) -> None:\r\n    \"\"\"\r\n    使用 PushMe 推送消息。\r\n    \"\"\"\r\n    if not push_config.get(\"PUSHME_KEY\"):\r\n        print(\"PushMe 服务的 PUSHME_KEY 未设置!!\\n取消推送\")\r\n        return\r\n    print(\"PushMe 服务启动\")\r\n\r\n    url = f'https://push.i-i.me/?push_key={push_config.get(\"PUSHME_KEY\")}'\r\n    data = {\r\n        \"title\": title,\r\n        \"content\": content,\r\n    }\r\n    response = requests.post(url, data=data)\r\n\r\n    if response.status_code == 200 and response.text == \"success\":\r\n        print(\"PushMe 推送成功！\")\r\n    else:\r\n        print(f\"PushMe 推送失败！{response.status_code} {response.text}\")\r\n\r\n\r\ndef one() -> str:\r\n    \"\"\"\r\n    获取一条一言。\r\n    :return:\r\n    \"\"\"\r\n    url = \"https://v1.hitokoto.cn/\"\r\n    res = requests.get(url).json()\r\n    return res[\"hitokoto\"] + \"    ----\" + res[\"from\"]\r\n\r\n\r\nif push_config.get(\"BARK_PUSH\"):\r\n    notify_function.append(bark)\r\nif push_config.get(\"CONSOLE\"):\r\n    notify_function.append(console)\r\nif push_config.get(\"DD_BOT_TOKEN\") and push_config.get(\"DD_BOT_SECRET\"):\r\n    notify_function.append(dingding_bot)\r\nif push_config.get(\"FSKEY\"):\r\n    notify_function.append(feishu_bot)\r\nif push_config.get(\"GOBOT_URL\") and push_config.get(\"GOBOT_QQ\"):\r\n    notify_function.append(go_cqhttp)\r\nif push_config.get(\"GOTIFY_URL\") and push_config.get(\"GOTIFY_TOKEN\"):\r\n    notify_function.append(gotify)\r\nif push_config.get(\"IGOT_PUSH_KEY\"):\r\n    notify_function.append(iGot)\r\nif push_config.get(\"PUSH_KEY\"):\r\n    notify_function.append(serverJ)\r\nif push_config.get(\"DEER_KEY\"):\r\n    notify_function.append(pushdeer)\r\nif push_config.get(\"CHAT_URL\") and push_config.get(\"CHAT_TOKEN\"):\r\n    notify_function.append(chat)\r\nif push_config.get(\"PUSH_PLUS_TOKEN\"):\r\n    notify_function.append(pushplus_bot)\r\nif push_config.get(\"QMSG_KEY\") and push_config.get(\"QMSG_TYPE\"):\r\n    notify_function.append(qmsg_bot)\r\nif push_config.get(\"QYWX_AM\"):\r\n    notify_function.append(wecom_app)\r\nif push_config.get(\"QYWX_KEY\"):\r\n    notify_function.append(wecom_bot)\r\nif push_config.get(\"TG_BOT_TOKEN\") and push_config.get(\"TG_USER_ID\"):\r\n    notify_function.append(telegram_bot)\r\nif (\r\n        push_config.get(\"AIBOTK_KEY\")\r\n        and push_config.get(\"AIBOTK_TYPE\")\r\n        and push_config.get(\"AIBOTK_NAME\")\r\n):\r\n    notify_function.append(aibotk)\r\nif (\r\n        push_config.get(\"SMTP_SERVER\")\r\n        and push_config.get(\"SMTP_SSL\")\r\n        and push_config.get(\"SMTP_EMAIL\")\r\n        and push_config.get(\"SMTP_PASSWORD\")\r\n        and push_config.get(\"SMTP_NAME\")\r\n):\r\n    notify_function.append(smtp)\r\nif push_config.get(\"PUSHME_KEY\"):\r\n    notify_function.append(pushme)\r\n\r\n\r\ndef send(title: str, content: str) -> None:\r\n    if not content:\r\n        print(f\"{title} 推送内容为空！\")\r\n        return\r\n\r\n    # 根据标题跳过一些消息推送，环境变量：SKIP_PUSH_TITLE 用回车分隔\r\n    skipTitle = os.getenv(\"SKIP_PUSH_TITLE\")\r\n    if skipTitle:\r\n        if title in re.split(\"\\n\", skipTitle):\r\n            print(f\"{title} 在SKIP_PUSH_TITLE环境变量内，跳过推送！\")\r\n            return\r\n\r\n    hitokoto = push_config.get(\"HITOKOTO\")\r\n\r\n    text = one() if hitokoto else \"\"\r\n    content += \"大自然的搬运工\\nhttp://www.bedee.top/\\n\\n\" + text\r\n\r\n    ts = [\r\n        threading.Thread(target=mode, args=(title, content), name=mode.__name__)\r\n        for mode in notify_function\r\n    ]\r\n    [t.start() for t in ts]\r\n    [t.join() for t in ts]\r\n\r\n\r\ndef main():\r\n    send(\"title\", \"content\")\r\n\r\n\r\nif __name__ == \"__main__\":\r\n    main()\r\n"
  },
  {
    "path": "bd_ikuuu.py",
    "content": "\"\"\"\n\ntime：2023.7.8\ncron: 23 0 * * *\nnew Env('ikuuu签到');\n地址：https://ikuuu.pw/\n环境变量 bd_ikuuu = 邮箱#密码\n多账号新建变量或者用 & 分开\n\n\"\"\"\n\nimport time\nimport requests\nfrom os import environ, path\nfrom bs4 import BeautifulSoup\n\n\n# 读取通知\ndef load_send():\n    global send\n    cur_path = path.abspath(path.dirname(__file__))\n    if path.exists(cur_path + \"/SendNotify.py\"):\n        try:\n            from SendNotify import send\n            print(\"加载通知服务成功！\")\n        except:\n            send = False\n            print(\n                '''加载通知服务失败~\\n请使用以下拉库地址\\nql repo https://github.com/Bidepanlong/ql.git \"bd_\" \"README\" \"SendNotify\"''')\n    else:\n        send = False\n        print(\n            '''加载通知服务失败~\\n请使用以下拉库地址\\nql repo https://github.com/Bidepanlong/ql.git \"bd_\" \"README\" \"SendNotify\"''')\n\n\nload_send()\n\n\n# 获取环境变量\ndef get_environ(key, default=\"\", output=True):\n    def no_read():\n        if output:\n            print(f\"未填写环境变量 {key} 请添加\")\n            exit(0)\n        return default\n\n    return environ.get(key) if environ.get(key) else no_read()\n\n\nclass ikuuu():\n    def __init__(self, ck):\n        self.msg = ''\n        self.ck = ck\n        self.cks = \"\"\n\n    def sign(self):\n        time.sleep(0.5)\n        url = \"https://ikuuu.pw/user/checkin\"\n        url1 = 'https://ikuuu.pw/user'\n        login_url = 'https://ikuuu.pw/auth/login'\n\n        login_header = {\n            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'\n        }\n\n        data = {\n            'email': self.ck[0],\n            'passwd': self.ck[1],\n        }\n        response = requests.post(login_url, headers=login_header, data=data)\n        cookies = response.cookies\n        cookies_dict = cookies.get_dict()\n        for key, value in cookies_dict.items():\n            ck = f\"{key}={value}\"\n            self.cks += ck + ';'\n\n        headers = {\n            'Cookie': self.cks,\n            'sec-ch-ua': '\"Microsoft Edge\";v=\"111\", \"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"111\"',\n        }\n        time.sleep(0.5)\n        r = requests.post(url, headers=headers)\n        time.sleep(0.5)\n        r1 = requests.get(url1, headers=headers)\n        try:\n            soup = BeautifulSoup(r1.text, 'html.parser')\n            bs = soup.find('span', {'class': 'counter'})\n            syll = bs.text\n            dl = soup.find('div', {'class': 'd-sm-none d-lg-inline-block'})\n            name = dl.text\n        except:\n            xx = f\"[登录]：请检查ck有效性：{self.ck}\\n\\n\"\n            print(xx)\n            self.msg += xx\n            return self.msg\n\n        if r.status_code != 200:\n            xx = f\"[登录]：{name}\\n[签到]：请求失败，请检查网络或者ck有效性：{self.ck}\\n\\n\"\n            print(xx)\n            self.msg += xx\n            return self.msg\n        try:\n            if \"已经签到\" in r.json()['msg']:\n                xx = f\"[登录]：{name}\\n[签到]：{r.json()['msg']}\\n[流量]：{syll}GB\\n\\n\"\n                print(xx)\n                self.msg += xx\n                return self.msg\n            elif \"获得\" in r.json()['msg']:\n                xx = f\"[登录]：{name}\\n[签到]：{r.json()['msg']}\\n[流量]：{syll}GB\\n\\n\"\n                print(xx)\n                self.msg += xx\n                return self.msg\n            else:\n                xx = f\"[登录]：未知错误，请检查网络或者ck有效性：{self.ck}\\n\\n\"\n                print(xx)\n                self.msg += xx\n                return self.msg\n        except:\n            xx = f\"[登录]：解析响应失败，请检查网络或者ck有效性：{self.ck}\\n\\n\"\n            print(xx)\n            self.msg += xx\n            return self.msg\n\n    def get_sign_msg(self):\n        return self.sign()\n\n\nif __name__ == '__main__':\n    token = get_environ(\"bd_ikuuu\")\n    msg = ''\n    cks = token.split(\"&\")\n    print(\"检测到{}个ck记录\\n开始ikuuu签到\\n\".format(len(cks)))\n    for ck_all in cks:\n        ck = ck_all.split(\"#\")\n        run = ikuuu(ck)\n        msg += run.get_sign_msg()\n    if send:\n        send(\"ikuuu签到通知\", msg)\n"
  },
  {
    "path": "bd_xtb.py",
    "content": "\"\"\"\ntime：2024.4.19\n定时：一天一次就行了\nnew Env('团币自备接口版本')\n抓包小程序或者app或者网页的token=Agxxxx  只要token后面的值\n环境变量: 名称：bd_mttoken   值：token的值#uuid的值\n\n如果需要一对一推送的用户，\nwx打开https://wxpusher.zjiecode.com/wxuser/?type=1&id=67067#/follow\n关注推送应用。在进入\"WxPusher消息推送平台\"公众号-我的-我的UID。获取自己的UID，需要推送的用户\n环境变量的值就是 token的值#uuid的值#推送UID的值\n\n如果没推送，大概的环境变量格式就是\nAgXXXXXXXXXX#00000000XXXXXXX\n有推送就是\nAgXXXXXXXXXX#00000000XXXXXXX#UID_XXXXXXX\n\n\n多账号默认新建变量或者用 & 分开\n并发变量: bd_xtbbf  默认不设置为1\n\n\"\"\"\nimport requests.utils\nimport json\nimport random\nimport base64\nimport os\nimport string\nfrom datetime import datetime\nimport requests\nimport time\nfrom functools import partial\nfrom user_agent import generate_user_agent\nimport concurrent.futures\nfrom urllib3.exceptions import InsecureRequestWarning\nimport threading\nfrom cryptography.hazmat.primitives import padding\nfrom cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\nfrom cryptography.hazmat.backends import default_backend\n\n# 自己设备的接口穿透的 ip:port\nkm = '127.0.0.1:12345'\n\n# 无法获取id的是否使用内置id直接运行！慎用！默认关闭！\nnzidrun = False\n\n# 活动开关 True/False\n# 果园刮刮乐\nrun_ggl = True\n\n# 自定义变量设置，不需要的不用管。\n########################################################\n# wxpusher管理员运行日志汇总推送 填入管理员的 UID_xxxxxxx\nwxpusher_alluid = os.environ.get(\"bd_wxpusher_alluid\")\nif wxpusher_alluid is None:\n    wxpusher_alluid = ''\n\n# 自定义变量名，\n# 可以自己设置一个环境变量在外面调用，默认自定义变量名 bd_zdyblm，默认不设置是bd_mttoken来调用ck\nblname = os.environ.get(\"bd_zdyblm\")\nif blname is None:\n    blname = 'bd_mttoken'\n\n# 自定义变量分隔符，默认是 & 或者 新建变量。比如需要换行分割就改成 \\n。\n# 可以自己设置一个环境变量在外面调用，默认自定义分割变量名 bd_zdyblm，值 &\nzdyfg = os.environ.get(\"bd_zdyfg\")\nif zdyfg is None:\n    zdyfg = '&'\n########################################################\n\n\n# 调试设置\n########################################################\n# 是否打印详细日志 True/False\nisprint = os.environ.get(\"bd_isprint\")\nif isprint is None:\n    isprint = False\nelse:\n    isprint = eval(isprint)\n\n# 今日团币默认大于900就不跑任务了\njrtb_nums = os.environ.get(\"bd_jrtbnums\")\nif jrtb_nums is None:\n    jrtb_nums = 900\nelse:\n    jrtb_nums = int(jrtb_nums)\n\n# 最大游戏任务循环次数\nmax_gamexh = os.environ.get(\"bd_gamexh\")\nif max_gamexh is None:\n    max_gamexh = 5\nelse:\n    max_gamexh = int(max_gamexh)\n\n# 理论现在我接口生成指纹，这个不需要动，如果没跑成功，改成100。默认最大出现50个提交完成有异常的就不跑!\nmax_zt3 = os.environ.get(\"bd_maxzt3\")\nif max_zt3 is None:\n    max_zt3 = 500\nelse:\n    max_zt3 = int(max_zt3)\n\n# 玄学数字，默认4，但是如果有时候提示指纹问题，上面改了100还是无法运行，改成5\nxxsz = os.environ.get(\"bd_xxsz\")\nif xxsz is None:\n    xxsz = 4\nelse:\n    xxsz = int(xxsz)\n\n# 如果改成100，4和5都没法运行，手动看看能不能正常领取游戏中心的币\n########################################################\n\n\n# 代理设置 代理池和代理api只能选择一个使用\n########################################################\n# 是否启用代理运行 True/False\n# isdl = os.environ.get(\"bd_isdlt\")\nisdl = os.environ.get(\"bd_isdlt\")\nif isdl is None:\n    isdl = False\nelse:\n    isdl = eval(isdl)\n\n# 代理api，请保证api打开直接现在一个ip地址和端口即可。环境变量bd_dlapi 值：获取的代理api\nproxy_api_url = os.environ.get(\"bd_dlapi\")\nif proxy_api_url is None:\n    proxy_api_url = ''\n# 代理api设置每多少秒切换一次\ndl_sleep = os.environ.get(\"bd_dlsleep\")\nif dl_sleep is None:\n    dl_sleep = 20\nelse:\n    dl_sleep = int(dl_sleep)\n\n# 代理池的地址 环境变量bd_dlc 值：自己的代理池的 ip:prot\nproxy_url = os.environ.get(\"bd_dlc\")\nif proxy_url is None:\n    proxy_url = ''\n\n# 定义全局变量的\nproxy = {\n    'http': f'http://{proxy_url}',\n    'https': f'http://{proxy_url}'\n}\n\n\n#########################################################\n\ndef start_dlapi():\n    dlstart = threading.Thread(target=get_proxy, args=(stop_event,))\n    dlstart.start()\n\n\nstop_event = threading.Event()\n\n\ndef get_proxy(stop):\n    a = 0\n    while not stop.is_set():\n        global proxy\n        a += 1\n        response = requests.get(proxy_api_url)\n        if response.status_code == 200:\n            proxy_data = response.text\n            if isdl:\n                print(f'🔔第{a}次获取代理成功: {proxy_data}')\n            proxy = {\n                'http': f'http://{proxy_data}',\n                'https': f'http://{proxy_data}'\n            }\n            time.sleep(dl_sleep)\n            continue\n        else:\n            if isdl:\n                print(f'🔔第{a}次获取代理失败！重新获取！')\n            continue\n\n\ndef ts_qb(data):\n    # WxPusher API地址\n    api_url = 'https://wxpusher.zjiecode.com/api/send/message'\n\n    # 按照序号字段对数据进行排序\n    sorted_data = sorted(data, key=lambda x: x['序号'])\n\n    # 构造要推送的表格内容\n    table_content = ''\n    for row in sorted_data:\n        table_content += f\"<tr><td style='border: 1px solid #ccc; padding: 6px;'>{row['序号']}</td><td style='border: 1px solid #ccc; padding: 6px;'>{row['用户']}</td><td style='border: 1px solid #ccc; padding: 6px;'>{row['今日团币']}</td><td style='border: 1px solid #ccc; padding: 6px;'>{row['总共团币']}</td></tr>\"\n\n    table_html = f\"<table style='border-collapse: collapse;'><tr style='background-color: #f2f2f2;'><th style='border: 1px solid #ccc; padding: 8px;'>🆔</th><th style='border: 1px solid #ccc; padding: 8px;'>用户</th><th style='border: 1px solid #ccc; padding: 8px;'>今日团币</th><th style='border: 1px solid #ccc; padding: 8px;'>总共团币</th></tr>{table_content}</table>\"\n\n    # 构造请求参数\n    params = {\n        \"appToken\": 'AT_F84lDjyaKceMNQshI4ZYhNyENLlnh5qW',\n        'content': table_html,\n        'contentType': 3,  # 表格类型\n        'topicIds': [],  # 接收消息的用户ID列表，为空表示发送给所有用户\n        \"summary\": f'小团币运行日志汇总',\n        \"uids\": [wxpusher_alluid],\n    }\n\n    # 发送POST请求\n    response = requests.post(api_url, json=params)\n\n    # 检查API响应\n    if response.status_code == 200:\n        result = response.json()\n        if result['code'] == 1000:\n            print('🎉管理员汇总推送成功')\n        else:\n            print(f'💔管理员汇总推送失败，错误信息：{result[\"msg\"]}')\n    else:\n        print('⛔️管理员汇总推送请求失败')\n\n\nclass Mttb:\n    def __init__(self, zh, ck):\n        self.zw = None\n        self.title = None\n        self.xslist = None\n        self.xs_headers = None\n        self.xsid = None\n        self.jobId = None\n        self.property = None\n        self.condition = None\n        self.mtgsig = None\n        global ts_all\n        self.num = zh\n        self.coins = None\n        try:\n            if \"UID\" in ck:\n                self.ck = ck.split('#')[0]\n                self.uuid = ck.split('#')[1]\n                self.uid = ck.split('#')[2]\n            else:\n                self.ck = ck.split('#')[0]\n                self.uuid = ck.split('#')[1]\n                self.uid = None\n        except:\n            print(f'⛔️⛔️⛔️⛔️⛔️⛔️⛔️⛔️账户{self.num}异常!!!')\n            exit(0)\n        self.ddmsg = None\n        self.lisss = None\n        self.lastGmtCreated = None\n        self.qdrwids = [10002, 10024, 10041, 10015, 10014]\n        self.qdid = None\n        self.llid = None\n        self.startmsg = ''\n        self.endmsg = ''\n        self.llids = []\n        self.qdactoken = None\n        self.xtb = None\n        self.wcxtb = None\n        self.t_h = None\n        self.actoken = None\n        self.usid = None\n        self.name = None\n        self.ua = generate_user_agent(os='android')\n        self.msg = \"\"\n        self.ids = []\n        self.noids = [15169, 15170, 15171, 15172, 15173]\n        self.id = None\n        self.tid = None\n        self.data_list = None\n        self.mtbb = 'meituan'\n        self.platform = xxsz\n        self.gglactoken = None\n        self.ggl_list = None\n        self.gglid = None\n        self.cardId = None\n\n    def wxpusher(self):\n        msg = f'🆔{self.name}<br>💰今日团币: {self.coins}<br>🎁总共团币: {self.wcxtb}({int(self.wcxtb) / 1000}元)'\n        str = f'''<section style=\"width: 24rem; max-width: 100%;border:none;border-style:none;margin:2.5rem auto;\">\n        <section\n            style=\"margin: 0px auto;text-align: left;border: 1.5px solid #212122;padding: 10px 0px;box-sizing:border-box; width: 100%; display:inline-block;background-color:#F3FFF1\">\n            <section style=\"margin-top: 1rem; float: left; margin-left: 1rem; margin-left: 1rem; font-size: 3.3rem; font-weight: bold;\">\n                <p style=\"margin: 0; color: black\">\n                    通知\n                </p>\n            </section>\n            <section style=\"display: block;width: 0;height: 0;clear: both;\"></section>\n            <section\n                style=\"margin-top:20px; display: inline-block; border-bottom: 1px solid #212122; padding: 4px 20px; box-sizing:border-box;\"\n                class=\"ipaiban-bbc\">\n                <section\n                    style=\"width:25px; height:25px; border-radius:50%; background-color:#212122;display:inline-block;line-height: 25px\">\n                    <p style=\"text-align:center;font-weight:1000;margin:0\">\n                        <span style=\"color: #ffffff;font-size:20px;\">🗣</span>\n                    </p>\n                </section>\n                <section style=\"display:inline-block;padding-left:10px;vertical-align: top;box-sizing:border-box;\">\n                </section>\n            </section>\n            <section style=\"margin-top:0rem;padding: 0.8rem;box-sizing:border-box;\">\n                <p style=\" line-height: 1.6rem; font-size: 1.1rem; \">\n                    {msg} \n                </p>            \n            </section>\n        </section>\n    </section>'''\n        data = {\n            \"appToken\": 'AT_F84lDjyaKceMNQshI4ZYhNyENLlnh5qW',\n            \"content\": str,\n            \"summary\": f'{self.name}小团币运行日志',\n            \"contentType\": 2,\n            \"uids\": [self.uid],\n        }\n        url = 'http://wxpusher.zjiecode.com/api/send/message'\n        try:\n            res = requests.post(url=url, json=data).json()\n            if res['code'] == 1000:\n                self.endmsg += f'🎉日志推送完成\\n'\n                return True\n            else:\n                self.endmsg += f'💔日志推送失败\\n'\n                return False\n        except:\n            self.endmsg += f'⛔️日志推送出错\\n'\n            return False\n\n    def login(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                url = \"https://open.meituan.com/user/v1/info/auditting?fields=auditAvatarUrl%2CauditUsername\"\n                h = {\n                    'Connection': 'keep-alive',\n                    'Origin': 'https://mtaccount.meituan.com',\n                    'User-Agent': self.ua,\n                    'token': self.ck,\n                    'Referer': 'https://mtaccount.meituan.com/user/',\n                    'Accept-Encoding': 'gzip, deflate',\n                    'Accept-Language': 'zh-CN,en-US;q=0.9',\n                    'X-Requested-With': 'com.sankuai.meituan',\n                }\n                r = requests.get(url, headers=h)\n                # print(r.text)\n                if 'username' in r.text:\n                    rj = r.json()\n                    self.name = rj[\"user\"][\"username\"]\n                    self.usid = rj[\"user\"][\"id\"]\n                    self.zw = self.sc_zw()\n                    self.startmsg += f'🆔账号{self.num}-{self.name}({self.usid}) ✅登录成功！\\n'\n                    return True\n                elif '失败' in r.text:\n                    return False\n                else:\n                    if isprint:\n                        self.startmsg += f'🆔账号{self.num} 登录失败：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(2, 5))\n                    continue\n            except:\n                if isprint:\n                    self.startmsg += f'🆔账号{self.num} 登录异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(2, 5))\n                continue\n\n    def Getmtgsig_data(self, urls, headers, body):\n        try_count = 5\n        while try_count > 0:\n            try:\n                encoded_data = base64.b64encode(body.encode('utf-8'))\n                bodybase64 = encoded_data.decode('utf-8')\n                data = {\n                    'km': km,\n                    'usid': self.usid,\n                    'method': 'POST',\n                    'url': urls,\n                    'ua': self.ua,\n                    'bbody': bodybase64\n                }\n                r = requests.post('http://bedee.top:12333/mtgsig', json=data)\n                if '成功' in r.text and r.json()['usid'] == self.usid:\n                    if isprint:\n                        print(f'🆔账号{self.num}-{self.name} {r.json()[\"msg\"]}')\n                    self.mtgsig = r.json()['mtgsig']\n                    headers['mtgsig'] = self.mtgsig\n                    if isdl:\n                        r = requests.post(url=urls, headers=headers, data=body, timeout=10, verify=False,proxies=proxy)\n                    else:\n                        r = requests.post(url=urls, headers=headers, data=body, timeout=10, verify=False)\n                    return r\n                elif '失败' in r.text:\n                    print(r.json()['msg'])\n                    return False\n                elif r.json()['usid'] != self.usid:\n                    print(f'🆔账号{self.num}-{self.name} 请求异常,返回的参数不对！\\n')\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n                else:\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except Exception as e:\n                try_count -= 1\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 请求异常,还有{try_count}次重试机会\\n'\n                time.sleep(random.randint(3, 8))\n                if try_count == 0:\n                    print(f'🆔账号{self.num}-{self.name} 结束运行~')\n                    return False\n\n    def sc_zw(self):\n        # 设置加密秘钥和加密Iv\n        key = b'kwBq8snI'\n        iv = b'kwBq8snI'\n\n        # 转换加密内容为字节类型\n        data = b'{\"A32\":[],\"A38\":42,\"A14\":\"AA\\\\u003d\\\\u003d\\\\n\",\"A53\":\"1200190209\",\"A23\":\"MOLY.LR13.R1.TC8.SP.V2.P59,MOLY.LR13.R1.TC8.SP.V2.P59\",\"A16\":97.0,\"A21\":\"Unplugged\",\"A29\":1710463703,\"A10\":\"Redmi\",\"A48\":\"Redmi/begonia/begonia:11/RP1A.200720.011/V12.5.6.0.RGGCNXM:user/release-keys\",\"A8\":\"RP1A.200720.011\",\"A12\":\"unknown\",\"A51\":\"DP\",\"A25\":[],\"A56\":\"xiaomi\",\"A33\":8,\"A20\":\"2000000\",\"A4\":\"aarch64\",\"A18\":\"Redmi Note 8 Pro\",\"A26\":\"1080,2220\",\"A19\":440,\"A52\":\"DP\",\"A54\":\"3.14159265358979323846264338327950288419716939937510\",\"A40\":1710654956463,\"A7\":\"unknown\",\"A35\":{\"hashInfo\":[],\"number\":0},\"A24\":\"unknown\",\"A34\":\"unknown\",\"A41\":1710857434000,\"A3\":\"unknown\",\"A28\":1710857983443,\"A57\":\"////PwAAAgAQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\\u003d\\\\n\",\"A36\":null,\"A42\":1,\"A9\":\"unknown\",\"A55\":\"428410883\",\"A1\":\"android\",\"A30\":{\"hashInfo\":[],\"number\":0},\"A11\":\"WIFI\",\"A15\":\"\",\"A37\":\"com.android.browser-com.android.calendar-com.android.camera-com.android.contacts-com.android.contacts-com.android.deskclock-com.android.fileexplorer-com.android.mms-com.android.settings-com.android.thememanager\",\"A22\":\"11\",\"A13\":\"unknown\",\"A43\":\"1230768000000\",\"A5\":\"dpsheb275afb5fc715339061ebc6571adfccatpu\",\"A44\":0,\"A6\":1,\"A2\":1710857982866,\"A45\":5,\"A49\":\"DP\",\"A46\":\"97460768768@118164561920\",\"A39\":\"com.android.soundrecorder-com.miui.calculator-com.xiaomi.scanner-bin.mt.plus-com.guoshi.httpcanary.premium-com.jingdong.app.mall-com.jmxxqyand.bingcheng-com.junge.algorithmAide-com.meituan.turbo-com.miui.screenrecorder\",\"A27\":0.0,\"A50\":\"000000000000016066FDF138B43928771EF787713DCF1A171003093481310199\",\"A47\":\"unknown\",\"A31\":[],\"A17\":[]}'\n\n        # 将data解码为字符串\n        data_str = data.decode('utf-8')\n\n        # 将字符串转换为JSON对象\n        json_obj = json.loads(data_str)\n\n        json_obj['A29'] = int(time.time() - random.randint(100, 300))\n        json_obj['A2'] = int(time.time() * 1000.0000001)\n        json_obj['A28'] = json_obj['A2'] + random.randint(280, 300)\n        json_obj['A40'] = int(time.time() * 1000 - random.randint(4000, 5000))\n        a = random.randint(12345678911, 98765432101)\n        b = random.randint(123456789102, 987654321012)\n        json_obj['A46'] = f'{a}@{b}'\n        json_obj['A50'] = self.uuid\n        # json_obj['A36']['latitude'] = round(random.uniform(29.6067111, 29.6067999), 7)\n        # json_obj['A36']['longitude'] = round(random.uniform(94.3670111, 94.3670999), 7)\n        updated_data = json.dumps(json_obj).replace(\", \", \",\").replace(\": \", \":\").replace(\"=\", \"\\\\u003d\").encode(\n            'utf-8')\n        padder = padding.PKCS7(64).padder()\n        padded_data = padder.update(updated_data) + padder.finalize()\n        cipher = Cipher(algorithms.TripleDES(key), modes.CBC(iv), backend=default_backend())\n        encryptor = cipher.encryptor()\n        encrypted_data = encryptor.update(padded_data) + encryptor.finalize()\n        encoded_data = base64.b64encode(encrypted_data).decode('utf-8')\n        lines = [encoded_data[i:i + 76] for i in range(0, len(encoded_data), 76)]\n        formatted_data = '\\n'.join(lines)\n        if len(lines[-1]) < 76:\n            formatted_data += '\\n'\n        # formatted_data = formatted_data.replace('\\n', '\\\\n')\n        return formatted_data\n\n    def act(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                url = 'https://game.meituan.com/mgc/gamecenter/front/api/v1/login?yodaReady=h5&csecplatform=4&csecversion=2.3.1'\n                h = {\n                    'accessToken': '',\n                    'Accept': 'application/json, text/plain, */*',\n                    'Content-Length': '307',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json;charset=UTF-8',\n                    'Cookie': f'token={self.ck}'\n                }\n                sing = ''.join(random.choices(string.ascii_letters + string.digits, k=16))\n                data = {\n                    \"mtToken\": self.ck,\n                    \"deviceUUID\": self.uuid,\n                    \"mtUserId\": self.usid,\n                    \"idempotentString\": sing\n                }\n                # body = json.dumps(data)\n                # r = self.Getmtgsig_data(url, h, body)\n                if isdl:\n                    r = requests.post(url, headers=h, json=data, timeout=10, verify=False)\n                else:\n                    r = requests.post(url, headers=h, json=data, timeout=10, verify=False)\n                if r.json()['data']['loginInfo']['accessToken'] is not None:\n                    self.actoken = r.json()['data']['loginInfo']['accessToken']\n                    return True\n                else:\n                    if isprint:\n                        self.startmsg += f'🆔账号{self.num}-{self.name} 获取actoken异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(2, 5))\n                    continue\n            except:\n                if isprint:\n                    self.startmsg += f'🆔账号{self.num}-{self.name} 获取actoken异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(2, 5))\n                continue\n\n    def get_mtgsig(self, urls, body):\n        try_count = 5\n        while try_count > 0:\n            try:\n                encoded_data = base64.b64encode(body.encode('utf-8'))\n                bodybase64 = encoded_data.decode('utf-8')\n                data = {\n                    'km': km,\n                    'usid': self.usid,\n                    'method': 'POST',\n                    'url': urls,\n                    'ua': self.ua,\n                    'bbody': bodybase64\n                }\n                r = requests.post('http://bedee.top:12333/mtgsig', json=data)\n                if '成功' in r.text and r.json()['usid'] == self.usid:\n                    if isprint:\n                        print(f'🆔账号{self.num}-{self.name} {r.json()[\"msg\"]}')\n                    return r.json()['mtgsig']\n                elif '卡密次数不足' in r.text or '失败' in r.text:\n                    print(r.json()['msg'])\n                    return False\n                elif r.json()['usid'] != self.usid:\n                    print(f'🆔账号{self.num}-{self.name} 请求异常,返回的参数不对！\\n')\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n                else:\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except Exception as e:\n                try_count -= 1\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 请求异常,还有{try_count}次重试机会\\n'\n                time.sleep(random.randint(3, 8))\n                if try_count == 0:\n                    print(f'🆔账号{self.num}-{self.name} 结束运行~')\n                    return False\n\n    def get_ids(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                url = f'https://game.meituan.com/mgc/gamecenter/front/api/v1/mgcUser/task/queryMgcTaskInfo?yodaReady=h5&csecplatform=4&csecversion=2.3.1'\n                data = {\n                    'externalStr': '',\n                    'riskParams': {\n                        'uuid': self.uuid,\n                        \"platform\": self.platform,\n                        \"fingerprint\": self.zw,\n                        \"version\": \"12.19.209\",\n                        \"app\": 0,\n                        \"cityid\": \"351\"\n                    },\n                    'gameType': 10102\n                }\n                body = json.dumps(data, separators=(',', ':'))  # 压缩数据去空格\n                mtgsig = self.get_mtgsig(url, body)\n                h = {\n                    \"Host\": \"game.meituan.com\",\n                    \"Connection\": \"keep-alive\",\n                    \"Content-Length\": \"2401\",\n                    'accessToken': '',\n                    \"mtgsig\": mtgsig,\n                    \"User-Agent\": self.ua,\n                    \"Content-Type\": \"application/json;charset=UTF-8\",\n                    \"Accept\": \"application/json, text/plain, */*\",\n                    \"x-requested-with\": \"XMLHttpRequest\",\n                    \"actoken\": self.actoken,\n                    'mtoken': self.ck,\n                    \"Origin\": \"https://mgc.meituan.com\",\n                    \"Sec-Fetch-Site\": \"same-site\",\n                    \"Sec-Fetch-Mode\": \"cors\",\n                    \"Sec-Fetch-Dest\": \"empty\",\n                    # \"Referer\": f\"https://mgc.meituan.com/h5/gamehallv2.html?inner_source=10102_ch290&f=android&token=AgFXIxdLTEtVLswl3aJH_Vh80Q79nmM7UFeewkfVFXBL4Qwx9ZaXjnd5zLh_CUJkm--dHQ-0l9jH1QAAAAC1HgAAcdk87pFda7nvWTIk0vcHu81tNStEfzIUvuJzRYLp_goE4K6L2zIuCPaPfJ5TUhfS&userid=4208094795&utm_source=xiaomi&utm_medium=android&utm_term=1200190207&version_name=12.19.207&utm_content=38a5cc27b89946099157f5d8488f40f9a171003093481337514&utm_campaign=AgroupBgroupC0D300E0Gmine&ci=351&msid=38a5cc27b89946099157f5d8488f40f9a1710030934813375141710654811064&uuid=000000000000016066FDF138B43928771EF787713DCF1A171003093481310199&p_appid=10\",\n                    \"Accept-Encoding\": \"gzip, deflate\",\n                    \"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\n                    \"Cookie\": f\"token={self.ck};mt_c_token={self.ck};uuid={self.uuid}\"\n                }\n                if isdl:\n                    r = requests.post(url, headers=h, data=body, timeout=10, verify=False,proxies=proxy)\n                else:\n                    r = requests.post(url, headers=h, data=body, timeout=10, verify=False)\n                rj = r.json()\n                if rj['msg'] == 'ok' and rj['data']['taskList'] != []:\n                    self.data_list = rj['data']['taskList']\n                    return True\n                elif not rj['data']['taskList']:\n                    return False\n                else:\n                    if isprint:\n                        self.startmsg += f'🆔账号{self.num}-{self.name} 获取游戏任务异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(2, 5))\n                    continue\n            except Exception as e:\n                if isprint:\n                    self.startmsg += f'🆔账号{self.num}-{self.name} 获取游戏任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(2, 5))\n                continue\n\n    def startcxtb(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                url = 'https://game.meituan.com/mgc/gamecenter/skuExchange/resource/counts?sceneId=3&gameId=10102'\n                self.t_h = {\n                    'User-Agent': self.ua,\n                    'actoken': self.actoken,\n                    'mtoken': self.ck,\n                    'Cookie': f'token={self.ck}'\n                }\n                if isdl:\n                    r = requests.get(url, headers=self.t_h, timeout=10, verify=False)\n\n                else:\n                    r = requests.get(url, headers=self.t_h, timeout=10, verify=False)\n                rj = r.json()\n                if rj['msg'] == 'ok':\n                    data = rj['data']\n                    for d in data:\n                        self.xtb = d['count']\n                        self.startmsg += f'🎁运行前小团币: {int(self.xtb)}({int(self.xtb) / 1000}元)\\n'\n                    return True\n                else:\n                    if isprint:\n                        self.startmsg += f'🆔账号{self.num}-{self.name} 查询运行前团币失败：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except:\n                if isprint:\n                    self.startmsg += f'🆔账号{self.num}-{self.name} 查询运行前团币异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def endcxtb(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                url = 'https://game.meituan.com/mgc/gamecenter/skuExchange/resource/counts?sceneId=3&gameId=10102'\n                # self.t_h = {\n                #     'User-Agent': self.ua,\n                #     'actoken': self.actoken,\n                #     'mtoken': self.ck,\n                #     'cookie': f'token={self.ck}'\n                # }\n                self.t_h = {\n                    'Accept': 'application/json, text/plain, */*',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json;charset=UTF-8',\n                    'actoken': self.actoken,\n                    'mtoken': self.ck,\n                    'Cookie': f'token={self.ck}'\n                }\n                if isdl:\n                    r = requests.get(url, headers=self.t_h, timeout=10, verify=False)\n                else:\n                    r = requests.get(url, headers=self.t_h, timeout=10, verify=False)\n                rj = r.json()\n                if rj['msg'] == 'ok':\n                    data = rj['data']\n                    for d in data:\n                        self.wcxtb = d['count']\n                        self.endmsg += f'🎁运行后小团币: {int(self.wcxtb)}({int(self.wcxtb) / 1000}元)\\n'\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 查询运行后团币失败：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 查询运行后团币异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def b64(self):\n        y_bytes = base64.b64encode(self.tid.encode('utf-8'))\n        y_bytes = y_bytes.decode('utf-8')\n        return y_bytes\n\n    def get_game(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                self.tid = f'mgc-gamecenter{self.id}'\n                self.tid = self.b64()\n                url = f'https://game.meituan.com/mgc/gamecenter/common/mtUser/mgcUser/task/finishV2'\n                params = {\n                    'taskId': self.tid,\n                }\n                if isdl:\n                    r = requests.get(url, headers=self.t_h, params=params, timeout=10, verify=False)\n                else:\n                    r = requests.get(url, headers=self.t_h, params=params, timeout=10, verify=False)\n                if isprint:\n                    print(f'🆔账号{self.num}-{self.name}({self.usid}) 领取{self.id} {r.json()}')\n                if r.status_code == 200:\n                    if r.json()['msg'] == 'ok':\n                        time.sleep(random.randint(1, 3))\n                        return True\n                    elif '完成过' in r.text:\n                        time.sleep(random.randint(1, 3))\n                        return False\n                    else:\n                        if isprint:\n                            print(f'🆔账号{self.num}-{self.name}({self.usid}) 任务状态: {r.text}')\n                        return False\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} {self.id}领取任务失败：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} {self.id}领取任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def post_id(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'game.meituan.com',\n                    'Connection': 'keep-alive',\n                    # 'Content-Length': '2725',\n                    'Accept': 'application/json, text/plain, */*',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'actoken': self.actoken,\n                    'mtoken': self.ck,\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json;charset=UTF-8',\n                    'Origin': 'https://mgc.meituan.com',\n                    'Sec-Fetch-Site': 'same-site',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Referer': 'https://mgc.meituan.com/',\n                    # 'Accept-Encoding': 'gzip, deflate',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                    'Cookie': f'token={self.ck}'\n                }\n                data = {\n                    \"taskId\": self.id,\n                    \"externalStr\": \"\",\n                    \"riskParams\": {\n                        \"uuid\": self.uuid,\n                        \"platform\": 4,\n                        \"fingerprint\": self.zw,\n                        \"version\": \"12.19.209\",\n                        \"app\": 0,\n                        \"cityid\": \"351\"\n                    },\n                    \"gameType\": 10102\n                }\n                body = json.dumps(data)\n                r = self.Getmtgsig_data(\n                    'https://game.meituan.com/mgc/gamecenter/front/api/v1/mgcUser/task/receiveMgcTaskReward?yodaReady=h5&csecplatform=4&csecversion=2.3.1',\n                    headers, body)\n                if isprint:\n                    print(f'🆔账号{self.num}-{self.name}({self.usid}) 完成{self.id} {r.json()}')\n                if r.status_code == 200:\n                    if r.json()['msg'] == 'ok':\n                        time.sleep(random.randint(1, 3))\n                        return True\n                    elif '异常' in r.text:\n                        time.sleep(random.randint(1, 3))\n                        return False\n                    else:\n                        print(f'🆔账号{self.num}-{self.name} {self.id},{r.text}\\n')\n                        time.sleep(random.randint(1, 3))\n                        return False\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} {self.id}完成任务异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} {self.id}完成任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def coin_login(self):\n        \"\"\"获取签到浏览的actoken\"\"\"\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Origin': 'https://awp.meituan.com',\n                    'Cookie': f'token={self.ck}',\n                    'Accept': '*/*',\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json',\n                    'Host': 'game.meituan.com',\n                    'Connection': 'Keep-Alive',\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'mtUserId': self.usid,\n                    'mtDeviceId': self.uuid,\n                    'mtToken': self.ck,\n                    'nonceStr': 'tq0wppcrgrc0nk26',\n                    'gameType': 10273,\n                    'externalStr': {\"cityId\": \"351\"},\n                    'shark': 1,\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                if isdl:\n                    r = requests.get('https://game.meituan.com/coin-marketing/login/loginMgc', headers=headers,\n                                     params=params, timeout=10, verify=False)\n                else:\n                    r = requests.get('https://game.meituan.com/coin-marketing/login/loginMgc', headers=headers,\n                                     params=params, timeout=10, verify=False)\n                self.qdactoken = r.json().get('accessToken', None)\n                if self.qdactoken is not None:\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 获取qdactoken异常，还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 获取qdactoken异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def qd(self):\n        \"\"\"签到和浏览任务\"\"\"\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'game.meituan.com',\n                    'Connection': 'keep-alive',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'appName': 'meituan',\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json',\n                    'Accept': '*/*',\n                    'Origin': 'https://awp.meituan.com',\n                    'Sec-Fetch-Site': 'same-site',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                data = {\n                    \"protocolId\": self.qdid,\n                    \"data\": {},\n                    \"riskParams\": {\n                        \"ip\": \"\",\n                        \"uuid\": self.uuid,\n                        \"platform\": self.platform,\n                        \"version\": \"12.19.209\",\n                        \"app\": 0,\n                        \"fingerprint\": self.zw,\n                        \"cityId\": \"351\"\n                    },\n                    \"acToken\": self.qdactoken\n                }\n                if self.qdid == 10024:\n                    while True:\n                        if isdl:\n                            r = requests.post('https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                                              json=data, params=params, timeout=10, verify=False)\n                        else:\n                            r = requests.post('https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                                              json=data, params=params, timeout=10, verify=False)\n                        if isprint:\n                            print(f'🆔账号{self.num}-{self.name}({self.usid}) {self.qdid}: {r.json()}')\n                        if 'interval' in r.text:\n                            xxsj = r.json()['data']['timedReward']['interval']\n                            time.sleep(xxsj / 1000)\n                            time.sleep(random.randint(1, 3))\n                            continue\n                        else:\n                            time.sleep(random.randint(1, 3))\n                            break\n                    return True\n                elif self.qdid == 10041:\n                    while True:\n                        if isdl:\n                            r = requests.post('https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                                              json=data,\n                                              params=params, timeout=10, verify=False)\n                        else:\n                            r = requests.post('https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                                              json=data,\n                                              params=params, timeout=10, verify=False)\n                        if isprint:\n                            print(f'🆔账号{self.num}-{self.name}({self.usid}) {self.qdid}: {r.json()}')\n                        if 'rewardAmount' in r.text:\n                            time.sleep(random.randint(1, 3))\n                            continue\n                        else:\n                            time.sleep(random.randint(1, 3))\n                            break\n                    return True\n                else:\n                    if isdl:\n                        r = requests.post('https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                                          json=data,\n                                          params=params, timeout=10, verify=False)\n                    else:\n                        r = requests.post('https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                                          json=data,\n                                          params=params, timeout=10, verify=False)\n                    if isprint:\n                        print(f'🆔账号{self.num}-{self.name}({self.usid}) {self.qdid}: {r.json()}')\n                    time.sleep(random.randint(1, 3))\n                    return True\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} {self.qdid}签到任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def get_llids(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'game.meituan.com',\n                    'Connection': 'keep-alive',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'appName': self.mtbb,\n                    'User-Agent': self.ua,\n                    'Accept': '*/*',\n                    'Origin': 'https://awp.meituan.com',\n                    'Sec-Fetch-Site': 'same-site',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                # \"protocolId\": 10002,  # 签到\n                # \"protocolId\": 10024,  # 1 3 5 要等待时间\n                # \"protocolId\": 10041,  # 下滑浏览\n                # \"protocolId\": 10008,  # 获取id\n                # \"protocolId\": 10014,  # 抽奖\n                # \"protocolId\": 10015,  # 抽奖前运行\n                data = {\n                    \"protocolId\": 10008,\n                    \"data\": {},\n                    \"riskParams\": {\n                        \"ip\": \"\",\n                        \"uuid\": self.uuid,\n                        \"platform\": 4,\n                        \"version\": \"12.19.209\",\n                        \"app\": 0,\n                        \"fingerprint\": self.zw,\n                        \"cityId\": \"351\"\n                    },\n                    \"acToken\": self.qdactoken,\n                }\n                if isdl:\n                    r = requests.post('https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                                      json=data,\n                                      params=params, timeout=10, verify=False)\n                else:\n                    r = requests.post('https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                                      json=data,\n                                      params=params, timeout=10, verify=False)\n                time.sleep(random.randint(1, 3))\n                self.lisss = r.json()['data']['taskInfoList']\n                return True\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} {self.qdid}签到任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def get_ll(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'game.meituan.com',\n                    'Connection': 'keep-alive',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'appName': self.mtbb,\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json',\n                    'Accept': '*/*',\n                    'Origin': 'https://awp.meituan.com',\n                    'Sec-Fetch-Site': 'same-site',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n\n                get_data = {\n                    \"protocolId\": 10010,  # 先运行获取任务\n                    \"data\": {\n                        \"externalStr\": {\"cityId\": \"351\"},\n                        \"taskId\": self.llid,  # 任务id\n                        \"taskEntranceType\": \"normal\"\n                    },\n                    \"riskParams\": {\n                        \"ip\": \"\",\n                        \"uuid\": self.uuid,\n                        \"platform\": 4,\n                        \"version\": \"12.19.209\",\n                        \"app\": 0,\n                        \"fingerprint\": self.zw,\n                        \"cityId\": \"351\"\n                    },\n                    \"acToken\": self.qdactoken,\n                    \"mtToken\": self.ck\n                }\n                if isdl:\n                    r = requests.post(\n                        'https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                        json=get_data,\n                        params=params, timeout=10, verify=False\n                    )\n                else:\n                    r = requests.post(\n                        'https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                        json=get_data,\n                        params=params, timeout=10, verify=False\n                    )\n                if isprint:\n                    print(f'🆔账号{self.num}-{self.name}({self.usid}) {self.llid} 领取任务 {r.json()}')\n                if r.json()['data'] is None:\n                    time.sleep(random.randint(1, 3))\n                    return False\n                else:\n                    time.sleep(random.randint(1, 3))\n                    return True\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} {self.llid}获取浏览任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def post_ll(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    \"Host\": \"game.meituan.com\",\n                    \"Connection\": \"keep-alive\",\n                    \"Content-Length\": \"747\",\n                    \"x-requested-with\": \"XMLHttpRequest\",\n                    \"appName\": self.mtbb,\n                    \"innerSource\": \"10273_yxdt\",\n                    \"User-Agent\": self.ua,\n                    \"Content-Type\": \"application/json\",\n                    \"Accept\": \"*/*\",\n                    \"Origin\": \"https://mgc.meituan.com\",\n                    \"Sec-Fetch-Site\": \"same-site\",\n                    \"Sec-Fetch-Mode\": \"cors\",\n                    \"Sec-Fetch-Dest\": \"empty\",\n                    \"Accept-Encoding\": \"gzip, deflate\",\n                    \"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n\n                post_data = {\n                    \"protocolId\": 10009,\n                    \"data\": {\n                        \"externalStr\": \"{\\\"cityId\\\":\\\"351\\\"}\",\n                        \"taskId\": f'{self.llid}',\n                        \"taskEntranceType\": \"normal\"\n                    },\n                    \"riskParams\": {\n                        \"ip\": \"\",\n                        \"uuid\": self.uuid,\n                        \"platform\": 4,\n                        \"version\": \"12.19.209\",\n                        \"app\": 0,\n                        \"fingerprint\": self.zw,\n                        \"cityId\": \"351\"\n                    },\n                    \"acToken\": self.qdactoken,\n                    \"mtToken\": self.ck\n                }\n                if isdl:\n                    r = requests.post(\n                        'https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                        json=post_data,\n                        params=params, timeout=10, verify=False,\n                        proxies=proxy\n                    )\n                else:\n                    r = requests.post(\n                        'https://game.meituan.com/coin-marketing/msg/post', headers=headers,\n                        json=post_data,\n                        params=params, timeout=10, verify=False\n                    )\n                if isprint:\n                    print(f'🆔账号{self.num}-{self.name}({self.usid}) {self.llid} 完成任务 {r.json()}\\n')\n                if r.json()['data'] is None:\n                    time.sleep(random.randint(1, 3))\n                    return False\n                else:\n                    time.sleep(random.randint(1, 3))\n                    return True\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} {self.llid}完成浏览任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def runq_jrtb(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                url = \"https://game.meituan.com/mgc/gamecenter/skuExchange/resources/change/logs?changeType=1&limit=50&sceneId=2&gameId=10139&mtToken=&acToken=&shark=1&yodaReady=h5&csecplatform=4&csecversion=2.3.1\"\n                headers = {\n                    \"Host\": \"game.meituan.com\",\n                    \"Connection\": \"keep-alive\",\n                    \"x-requested-with\": \"XMLHttpRequest\",\n                    \"actoken\": self.qdactoken,\n                    \"mtoken\": self.ck,\n                    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; V2055A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.74 Mobile Safari/537.36 TitansX/11.38.10 KNB/1.2.0 android/13 mt/com.meituan.turbo/2.0.202 App/10120/2.0.202 MeituanTurbo/2.0.202\",\n                    \"Content-Type\": \"application/json\",\n                    \"Accept\": \"*/*\",\n                    \"Origin\": \"https://awp.meituan.com\",\n                    \"Sec-Fetch-Site\": \"same-site\",\n                    \"Sec-Fetch-Mode\": \"cors\",\n                    \"Sec-Fetch-Dest\": \"empty\",\n                    \"Referer\": \"https://awp.meituan.com/\",\n                    \"Accept-Encoding\": \"gzip, deflate\",\n                    \"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n                }\n                if isdl:\n                    r = requests.get(url, headers=headers, timeout=10, verify=False)\n                else:\n                    r = requests.get(url, headers=headers, timeout=10, verify=False)\n                if r.json()['msg'] == 'ok':\n                    datalist = r.json()['data']\n                    coins = 0\n                    for data in datalist:\n                        coin = data['changeCount']\n                        gmtCreated = data['gmtCreated']\n                        if gmtCreated >= f\"{datetime.now().strftime('%Y-%m-%d')} 00:00:00\":\n                            coins += coin\n                        else:\n                            break\n                    self.lastGmtCreated = datalist[-1]['gmtCreated']\n                    while True:\n                        if self.lastGmtCreated >= f\"{datetime.now().strftime('%Y-%m-%d')} 00:00:00\":\n                            url1 = f\"https://game.meituan.com/mgc/gamecenter/skuExchange/resources/change/logs?changeType=1&limit=50&sceneId=2&lastGmtCreated={self.lastGmtCreated}&gameId=10139&mtToken=&acToken=&shark=1&yodaReady=h5&csecplatform=4&csecversion=2.3.1\"\n                            if isdl:\n                                r = requests.get(url1, headers=headers, timeout=10, verify=False)\n                            else:\n                                r = requests.get(url1, headers=headers, timeout=10, verify=False)\n                            # if isprint:\n                            #     print(r.json())\n                            #     print()\n                            if 'ok' in r.text and r.json()['data'] != []:\n                                datalist = r.json()['data']\n                                for data in datalist:\n                                    coin = data['changeCount']\n                                    gmtCreated = data['gmtCreated']\n                                    if gmtCreated >= f\"{datetime.now().strftime('%Y-%m-%d')} 00:00:00\":\n                                        coins += coin\n                                    else:\n                                        break\n                                self.lastGmtCreated = datalist[-1]['gmtCreated']\n                                if self.lastGmtCreated >= f\"{datetime.now().strftime('%Y-%m-%d')} 00:00:00\":\n                                    time.sleep(random.randint(1, 3))\n                                    continue\n                                else:\n                                    self.coins = coins\n                                    self.startmsg += f'💰今日团币: {coins}\\n'\n                                    return True\n                            elif 'ok' in r.text and r.json()['data'] == []:\n                                self.coins = coins\n                                self.endmsg += f'💰今日团币: {coins}\\n'\n                                return True\n                            else:\n                                if isprint:\n                                    self.startmsg += f'🆔账号{self.num}-{self.name} 获取今日团币异常：还有{try_count - 1}次重试机会\\n'\n                                try_count -= 1\n                                time.sleep(random.randint(2, 5))\n                                continue\n                        else:\n                            self.coins = coins\n                            self.startmsg += f'💰今日团币: {coins}\\n'\n                            return True\n                    break\n                else:\n                    if isprint:\n                        self.startmsg += f'🆔账号{self.num}-{self.name} 获取今日团币异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(2, 5))\n                    continue\n            except:\n                if isprint:\n                    self.startmsg += f'🆔账号{self.num}-{self.name} 获取今日团币异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(2, 5))\n                continue\n\n    def tj_bchd(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                bchd = int(self.wcxtb) - int(self.xtb)\n                url = \"https://game.meituan.com/mgc/gamecenter/skuExchange/resources/change/logs?changeType=1&limit=50&sceneId=2&gameId=10139&mtToken=&acToken=&shark=1&yodaReady=h5&csecplatform=4&csecversion=2.3.1\"\n                headers = {\n                    \"Host\": \"game.meituan.com\",\n                    \"Connection\": \"keep-alive\",\n                    \"x-requested-with\": \"XMLHttpRequest\",\n                    \"actoken\": self.qdactoken,\n                    \"mtoken\": self.ck,\n                    \"User-Agent\": \"Mozilla/5.0 (Linux; Android 13; V2055A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.74 Mobile Safari/537.36 TitansX/11.38.10 KNB/1.2.0 android/13 mt/com.meituan.turbo/2.0.202 App/10120/2.0.202 MeituanTurbo/2.0.202\",\n                    \"Content-Type\": \"application/json\",\n                    \"Accept\": \"*/*\",\n                    \"Origin\": \"https://awp.meituan.com\",\n                    \"Sec-Fetch-Site\": \"same-site\",\n                    \"Sec-Fetch-Mode\": \"cors\",\n                    \"Sec-Fetch-Dest\": \"empty\",\n                    \"Referer\": \"https://awp.meituan.com/\",\n                    \"Accept-Encoding\": \"gzip, deflate\",\n                    \"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\"\n\n                }\n                if isdl:\n                    r = requests.get(url, headers=headers, timeout=10, verify=False)\n                else:\n                    r = requests.get(url, headers=headers, timeout=10, verify=False)\n                if r.json()['msg'] == 'ok':\n                    datalist = r.json()['data']\n                    coins = 0\n                    for data in datalist:\n                        coin = data['changeCount']\n                        gmtCreated = data['gmtCreated']\n                        if gmtCreated >= f\"{datetime.now().strftime('%Y-%m-%d')} 00:00:00\":\n                            coins += coin\n                        else:\n                            break\n                    self.lastGmtCreated = datalist[-1]['gmtCreated']\n                    while True:\n                        if self.lastGmtCreated >= f\"{datetime.now().strftime('%Y-%m-%d')} 00:00:00\":\n                            url1 = f\"https://game.meituan.com/mgc/gamecenter/skuExchange/resources/change/logs?changeType=1&limit=50&sceneId=2&lastGmtCreated={self.lastGmtCreated}&gameId=10139&mtToken=&acToken=&shark=1&yodaReady=h5&csecplatform=4&csecversion=2.3.1\"\n                            if isdl:\n                                r = requests.get(url1, headers=headers, timeout=10, verify=False)\n                            else:\n                                r = requests.get(url1, headers=headers, timeout=10, verify=False)\n                            # if isprint:\n                            #     print(r.json())\n                            #     print()\n                            if 'ok' in r.text and r.json()['data'] != []:\n                                datalist = r.json()['data']\n                                for data in datalist:\n                                    coin = data['changeCount']\n                                    gmtCreated = data['gmtCreated']\n                                    if gmtCreated >= f\"{datetime.now().strftime('%Y-%m-%d')} 00:00:00\":\n                                        coins += coin\n                                    else:\n                                        break\n                                self.lastGmtCreated = datalist[-1]['gmtCreated']\n                                if self.lastGmtCreated >= f\"{datetime.now().strftime('%Y-%m-%d')} 00:00:00\":\n                                    time.sleep(random.randint(1, 3))\n                                    continue\n                                else:\n                                    self.coins = coins\n                                    self.endmsg += f'🔥本次获得小团币: {bchd}\\n💰今日团币: {coins}\\n'\n                                    return True\n                            elif 'ok' in r.text and r.json()['data'] == []:\n                                self.coins = coins\n                                self.endmsg += f'🔥本次获得小团币: {bchd}\\n💰今日团币: {coins}\\n'\n                                return True\n                            else:\n                                if isprint:\n                                    self.endmsg += f'🆔账号{self.num}-{self.name} 获取今日团币异常：还有{try_count - 1}次重试机会\\n'\n                                try_count -= 1\n                                time.sleep(random.randint(2, 5))\n                                continue\n                        else:\n                            self.coins = coins\n                            self.endmsg += f'🔥本次获得小团币: {bchd}\\n💰今日团币: {coins}\\n'\n                            return True\n                    break\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 获取今日团币异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(2, 5))\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 获取今日团币异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(2, 5))\n                continue\n\n    def run_game2(self):\n        i_num = 0\n        for i in self.ids:\n            zong = len(self.ids)\n            self.id = i\n            if self.id in self.noids:\n                pass\n            else:\n                if self.id in [386, 510, 511, 332]:\n                    i_num += 1\n                    a = 0\n                    while a < 5:\n                        a += 1\n                        if isprint:\n                            print(\n                                f'\\n🆔账号{self.num}-{self.name}({self.usid}) 任务{i_num}/{zong} id: {self.id} 第{a}次')\n                        if self.get_game():\n                            self.post_id()\n                            continue\n                        else:\n                            break\n                    continue\n                else:\n                    i_num += 1\n                    if isprint:\n                        print(\n                            f'\\n🆔账号{self.num}-{self.name}({self.usid}) 任务{i_num}/{zong} id: {self.id}')\n                    if self.get_game():\n                        self.post_id()\n                    continue\n\n    def get_new_llids(self):\n        if self.get_llids():\n            self.llids = []\n            for i in self.lisss:\n                taskTitles = json.loads(i['mgcTaskBaseInfo']['viewExtraJson'])\n                buttonName = taskTitles.get('common', None).get('buttonName', '去完成')\n                zt = i['status']\n                if zt == 2 and buttonName in ['去完成', '去浏览', '去阅读', '去领取']:\n                    self.llids.append(i['id'])\n                elif zt == 3 and buttonName in ['去完成', '去浏览', '去阅读', '去领取']:\n                    self.llids.append(i['id'])\n                else:\n                    pass\n            if isprint:\n                print(f'🆔账号{self.num}-{self.name}({self.usid}) 获取到{len(self.llids)}个浏览任务！\\n{self.llids}')\n            if self.llids:\n                return True\n            else:\n                return False\n        else:\n            return False\n\n    def run_tbzx(self):\n        for i in self.lisss:\n            zt = i['status']\n            self.llid = i['id']\n            taskTitles = json.loads(i['mgcTaskBaseInfo']['viewExtraJson'])\n            taskTitle = taskTitles['common']['taskTitle']\n            taskDesc = taskTitles['common']['taskDesc']\n            buttonName = taskTitles.get('common', None).get('buttonName', '去完成')\n            if zt in [2, 3] and self.llid == 15181:\n                if isprint:\n                    print(\n                        f'🆔账号{self.num}-{self.name}({self.usid}) {self.llid}: 状态：{zt} {taskTitle}({taskDesc}) {buttonName}')\n                while True:\n                    if self.get_ll():\n                        if self.post_ll():\n                            continue\n                        else:\n                            break\n                    else:\n                        break\n            elif zt == 2 and buttonName in ['去完成', '去浏览', '去阅读', '去领取']:\n                if isprint:\n                    print(\n                        f'🆔账号{self.num}-{self.name}({self.usid}) {self.llid}: 状态：{zt} {taskTitle}({taskDesc}) {buttonName}')\n                if self.get_ll():\n                    self.post_ll()\n            elif zt == 3 and buttonName in ['去完成', '去浏览', '去阅读', '去领取']:\n                if isprint:\n                    print(\n                        f'🆔账号{self.num}-{self.name}({self.usid}) {self.llid}: 状态：{zt} {taskTitle}({taskDesc}) {buttonName}')\n                self.post_ll()\n            else:\n                continue\n\n    def run_tbrw(self):\n        self.read_sign()\n        if self.get_new_llids():\n            self.run_tbzx()\n        self.mtbb = 'meituanturbo'\n        if self.get_new_llids():\n            self.run_tbzx()\n        # self.llid = 17622\n        # if self.get_ll():\n        #     self.post_ll()\n        #     self.qdid = 10014\n        #     self.qd()\n        for i in self.qdrwids:\n            self.qdid = i\n            self.qd()\n        else:\n            pass\n\n    def read_sign(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                url = 'https://web.meituan.com/novel/marketing/sign/signV2'\n                headers = {\n                    'Host': 'web.meituan.com',\n                    'appType': 'group',\n                    'token': self.ck,\n                    'content-type': 'application/json',\n                    'User-Agent': self.ua,\n                    'Referer': 'https://servicewechat.com/wxde8ac0a21135c07d/1248/page-frame.html',\n                }\n\n                params = {\n                    'yodaReady': 'wx',\n                    'csecappid': 'wxde8ac0a21135c07d',\n                    'csecplatform': '3',\n                    'csecversionname': '7.49.4',\n                    'csecversion': '1.4.0',\n                }\n                json_data = {\n                    'fingerprint': '',\n                }\n                r = requests.post(url=url, params=params, headers=headers, json=json_data)\n                if '成功' in r.text:\n                    response = r.json()\n                    times = response['data']['times']\n                    sign_list = response['data']['signList']\n                    award_amount_list = [item['awardAmount'] for item in sign_list if item['signed']]\n                    if isprint:\n                        print(\n                            f\"🆔账号{self.num}-{self.name} 第{times}天阅读签到成功📕，今日已获得{award_amount_list[-1]}团币\")\n                    time.sleep(random.randint(1, 3))\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 小说签到异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(2, 5))\n                    continue\n\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 小说签到异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(2, 5))\n                continue\n\n    def game_gift(self):\n        url = \"https://game.meituan.com/mgc/gamecenter/front/api/v1/mgcUser/gift/xtb/exchangeWeekCard?yodaReady=h5&csecplatform=4&csecversion=2.3.1&mtgsig={}\"\n        h = {\n            'Accept': 'application/json, text/plain, */*',\n            'x-requested-with': 'XMLHttpRequest',\n            'User-Agent': self.ua,\n            'Content-Type': 'application/json;charset=UTF-8',\n            'actoken': self.actoken,\n            'mtoken': self.ck,\n            'Cookie': f'token={self.ck}'\n        }\n        if isdl:\n            r = requests.get(url, headers=h, timeout=10, verify=False)\n            time.sleep(random.randint(1, 3))\n        else:\n            r = requests.get(url, headers=h, timeout=10, verify=False)\n            time.sleep(random.randint(1, 3))\n        if isprint:\n            print(r.text)\n\n    def get_gglactoken(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'guoyuan.meituan.com',\n                    'Connection': 'keep-alive',\n                    'Content-Length': '119',\n                    'Accept': 'application/json, text/plain, */*',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'mtoken': self.ck,\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json;charset=UTF-8',\n                    'Origin': 'https://guoyuan.meituan.com',\n                    'Sec-Fetch-Site': 'same-origin',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Encoding': 'gzip, deflate',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                    'Cookie': f'token={self.ck}'\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                data = {\n                    'uuid': self.uuid,\n                    'scratchSource': 1,\n                    'idempotent': 'pr2l4wrcn7'\n                }\n                r = requests.post('https://guoyuan.meituan.com/scratch/index', params=params, headers=headers,\n                                  json=data)\n                self.gglactoken = r.json().get('data').get('acToken', None)\n                if self.gglactoken is not None:\n                    time.sleep(random.randint(1, 3))\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 获取刮刮乐actoken异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 获取刮刮乐actoken异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def get_ggllist(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'guoyuan.meituan.com',\n                    'Connection': 'keep-alive',\n                    'Accept': 'application/json, text/plain, */*',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'acToken': self.gglactoken,\n                    'mtoken': self.ck,\n                    'User-Agent': self.ua,\n                    'Sec-Fetch-Site': 'same-origin',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Encoding': 'gzip, deflate',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                    'Cookie': f'token={self.ck}'\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'scratchSource': '1',\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                r = requests.get('https://guoyuan.meituan.com/scratch/mgcUser/taskList', params=params,\n                                 headers=headers)\n                self.ggl_list = r.json().get('data').get('taskList', None)\n                if self.ggl_list:\n                    time.sleep(random.randint(1, 3))\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 获取刮刮乐任务列表异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 获取刮刮乐任务列表异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def get_ggl(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'guoyuan.meituan.com',\n                    'Connection': 'keep-alive',\n                    'Content-Length': '34',\n                    'Accept': 'application/json, text/plain, */*',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'acToken': self.gglactoken,\n                    'mtoken': self.ck,\n                    'User-Agent': self.ua,\n                    'Origin': 'https://guoyuan.meituan.com',\n                    'Sec-Fetch-Site': 'same-origin',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Encoding': 'gzip, deflate',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                    'Cookie': f'token={self.ck}'\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                data = {\n                    'taskId': self.gglid,\n                    'scratchSource': 1\n                }\n                r = requests.post(\n                    'https://guoyuan.meituan.com/scratch/mgcUser/finishTask',\n                    params=params,\n                    headers=headers,\n                    json=data,\n                )\n                codes = r.json().get('code', None)\n                if isprint:\n                    print(f'🆔账号{self.num}-{self.name}({self.usid}) {self.gglid} 领取刮刮乐任务 {r.json()}')\n                if codes == 0 or codes == 1101:\n                    time.sleep(random.randint(1, 3))\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 领取刮刮乐任务异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 领取刮刮乐任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def post_ggl(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'guoyuan.meituan.com',\n                    'Connection': 'keep-alive',\n                    'Content-Length': '34',\n                    'Accept': 'application/json, text/plain, */*',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'acToken': self.gglactoken,\n                    'mtoken': self.ck,\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json;charset=UTF-8',\n                    'Origin': 'https://guoyuan.meituan.com',\n                    'Sec-Fetch-Site': 'same-origin',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Encoding': 'gzip, deflate',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                    'Cookie': f'token={self.ck}'\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                data = {\n                    'taskId': self.gglid,\n                    'scratchSource': 1\n                }\n                r = requests.post(\n                    'https://guoyuan.meituan.com/scratch/mgcUser/receiveTaskReward',\n                    params=params,\n                    headers=headers,\n                    json=data,\n                )\n                codes = r.json().get('code', None)\n                restCard = r.json().get('data', None).get('restCard', None)\n                if isprint:\n                    print(\n                        f'🆔账号{self.num}-{self.name}({self.usid}) {self.gglid} 完成刮刮乐任务，次数{restCard}。{r.json()}')\n                if codes == 0:\n                    time.sleep(random.randint(1, 3))\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 完成刮刮乐任务异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 完成刮刮乐任务异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def get_gglcard(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'guoyuan.meituan.com',\n                    'Connection': 'keep-alive',\n                    'Content-Length': '19',\n                    'Accept': 'application/json, text/plain, */*',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'acToken': self.gglactoken,\n                    'mtoken': self.ck,\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json;charset=UTF-8',\n                    'Origin': 'https://guoyuan.meituan.com',\n                    'Sec-Fetch-Site': 'same-origin',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Encoding': 'gzip, deflate',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                    'Cookie': f'token={self.ck}'\n                }\n                sjc = int(time.time() * 1000.0000001)\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                data = {\n                    'scratchSource': 1\n                }\n                r = requests.post(\n                    'https://guoyuan.meituan.com/scratch/mgcUser/useCard',\n                    params=params,\n                    headers=headers,\n                    json=data,\n                )\n                codes = r.json()['code']\n                if '没有刮刮卡' in r.text:\n                    return False\n                elif '正在刮的卡' in r.text:\n                    return False\n                elif codes == 0:\n                    self.cardId = r.json()['data']['scratchInProgress']['cardId']\n                    if isprint:\n                        print(f'🆔账号{self.num}-{self.name} 获取刮刮乐id成功: {self.cardId}')\n                    time.sleep(random.randint(1, 3))\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 获取刮刮乐id异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except Exception as e:\n                print(e)\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 获取刮刮乐id异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def gk_ggl(self):\n        try_count = 5\n        while try_count > 0:\n            try:\n                headers = {\n                    'Host': 'guoyuan.meituan.com',\n                    'Connection': 'keep-alive',\n                    'Content-Length': '87',\n                    'Accept': 'application/json, text/plain, */*',\n                    'x-requested-with': 'XMLHttpRequest',\n                    'acToken': self.gglactoken,\n                    'mtoken': self.ck,\n                    'User-Agent': self.ua,\n                    'Content-Type': 'application/json;charset=UTF-8',\n                    'Origin': 'https://guoyuan.meituan.com',\n                    'Sec-Fetch-Site': 'same-origin',\n                    'Sec-Fetch-Mode': 'cors',\n                    'Sec-Fetch-Dest': 'empty',\n                    'Accept-Encoding': 'gzip, deflate',\n                    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',\n                    'Cookie': f'token={self.ck}'\n                }\n                params = {\n                    'yodaReady': 'h5',\n                    'csecplatform': '4',\n                    'csecversion': '2.3.1',\n                    # 'mtgsig': get_xsmtg(),\n                }\n                data = {\n                    'cardId': self.cardId,\n                    'scratchedUnits': [1, 1, 1, 1, 1, 1, 1, 1, 1],\n                    'scratchSource': 1\n                }\n                r = requests.post(\n                    'https://guoyuan.meituan.com/scratch/mgcUser/progress',\n                    params=params,\n                    headers=headers,\n                    json=data,\n                )\n                codes = r.json().get('code', None)\n                if codes == 0:\n                    prizeList = r.json()['data']['prizeList']\n                    for i in prizeList:\n                        if isprint:\n                            print(f'🆔账号{self.num}-{self.name} 刮刮乐获得{i[\"prizeName\"]}')\n                    time.sleep(random.randint(1, 3))\n                    return True\n                else:\n                    if isprint:\n                        self.endmsg += f'🆔账号{self.num}-{self.name} 刮刮乐刮卡异常：还有{try_count - 1}次重试机会\\n'\n                    try_count -= 1\n                    time.sleep(random.randint(3, 8))\n                    continue\n            except:\n                if isprint:\n                    self.endmsg += f'🆔账号{self.num}-{self.name} 刮刮乐刮卡异常：还有{try_count - 1}次重试机会\\n'\n                try_count -= 1\n                time.sleep(random.randint(3, 8))\n                continue\n\n    def run_ggl(self):\n        if self.get_gglactoken():\n            if self.get_ggllist():\n                for i in self.ggl_list:\n                    zt = i['status']\n                    self.gglid = i['id']\n                    viewTitle = i['viewTitle']\n                    dailyFinishTimes = i['dailyFinishTimes']\n                    maxLimit = i['maxLimit']\n                    if dailyFinishTimes < maxLimit and '下单' not in viewTitle and '美团首页' not in viewTitle and zt == 2:\n                        if isprint:\n                            print(\n                                f'🆔账号{self.num}-{self.name}({self.usid}) {self.gglid}: 状态：{zt} {viewTitle}({dailyFinishTimes}/{maxLimit}) 未完成')\n                        for i in range(maxLimit - dailyFinishTimes):\n                            if self.get_ggl():\n                                self.post_ggl()\n                    elif dailyFinishTimes <= maxLimit and '下单' not in viewTitle and '美团首页' not in viewTitle and zt == 3:\n                        if isprint:\n                            print(\n                                f'🆔账号{self.num}-{self.name}({self.usid}) {self.gglid}: 状态：{zt} {viewTitle}({dailyFinishTimes}/{maxLimit}) 未领取')\n                        self.post_ggl()\n                    else:\n                        if isprint:\n                            print(\n                                f'🆔账号{self.num}-{self.name}({self.usid}) {self.gglid}: 状态：{zt} {viewTitle}({dailyFinishTimes}/{maxLimit}) 已完成或者跳过不做')\n            while True:\n                if self.get_gglcard():\n                    self.gk_ggl()\n                    continue\n                else:\n                    break\n\n    def get_new_gameid(self):\n        if self.get_ids():\n            self.ids = []\n            zt_3 = []\n            for i in self.data_list:\n                if i['status'] == 2 and i['id'] not in self.noids:\n                    self.ids.append(i['id'])\n                if i['status'] == 3 and i['id'] not in self.noids:\n                    self.ids.append(i['id'])\n                    zt_3.append(i['id'])\n                else:\n                    pass\n            if isprint:\n                print(f'🆔账号{self.num}-{self.name}({self.usid}) 获取到{len(self.ids)}个游戏任务！\\n{self.ids}')\n            if self.ids != [] and len(zt_3) < max_zt3:\n                return True\n            elif not self.ids:\n                return True\n            else:\n                self.startmsg += f'🆔账号{self.num}-{self.name}({self.usid}) ⛔️跑不动,{len(zt_3)}个任务未提交成功!尝试修改max_zt3参数为100！！！\\n'\n                return False\n        else:\n            return False\n\n    def run_game(self):\n        random.shuffle(self.data_list)\n        i_num = 0\n        for i in self.data_list:\n            zong = len(self.ids)\n            self.id = i['id']\n            zt = i['status']\n            if self.id in self.noids:\n                pass\n            else:\n                if zt == 2 and self.id in [386, 510, 511, 332]:\n                    i_num += 1\n                    a = 0\n                    while a < 5:\n                        a += 1\n                        if isprint:\n                            print(\n                                f'\\n🆔账号{self.num}-{self.name}({self.usid}) 任务{i_num}/{zong} id: {self.id} 状态: {zt} 第{a}次')\n                        if self.get_game():\n                            self.post_id()\n                            continue\n                        else:\n                            break\n                    continue\n                elif zt == 3 and self.id in [386, 510, 511, 332]:\n                    i_num += 1\n                    a = 1\n                    if isprint:\n                        print(\n                            f'\\n🆔账号{self.num}-{self.name}({self.usid}) 任务{i_num}/{zong} id: {self.id} 状态: {zt} 第{a}次')\n                    self.post_id()\n                    while a < 5:\n                        a += 1\n                        if isprint:\n                            print(\n                                f'\\n🆔账号{self.num}-{self.name}({self.usid}) 任务{i_num}/{zong} id: {self.id} 状态: {zt} 第{a}次')\n                        if self.get_game():\n                            self.post_id()\n                            continue\n                        else:\n                            break\n                    continue\n                elif zt == 2:\n                    i_num += 1\n                    if isprint:\n                        print(\n                            f'\\n🆔账号{self.num}-{self.name}({self.usid}) 任务{i_num}/{zong} id: {self.id} 状态: {zt}')\n                    if self.get_game():\n                        self.post_id()\n                        continue\n                elif zt == 3:\n                    i_num += 1\n                    if isprint:\n                        print(f'\\n🆔账号{self.num}-{self.name}({self.usid}) 任务{i_num}/{zong} id: {self.id} 状态: {zt}')\n                    self.post_id()\n                    continue\n                else:\n                    continue\n\n    def main(self):\n        if self.login():\n            if self.act():\n                if self.startcxtb():\n                    if self.coin_login():\n                        self.runq_jrtb()\n                        if self.coins > jrtb_nums:\n                            self.startmsg += f'🚀今日团币已经达到{jrtb_nums}不再运行！\\n'\n                            self.endmsg += f'🆔账号{self.num}-{self.name}({self.usid}) 🎁今天已经跑过啦\\n'\n                            if self.endcxtb():\n                                if self.tj_bchd():\n                                    if self.uid is not None:\n                                        self.wxpusher()\n                                        ts = {'序号': self.num, '用户': self.name, '今日团币': self.coins,\n                                              '总共团币': f'{int(self.wcxtb)}({int(self.wcxtb) / 1000}元)'}\n                                        ts_all.append(ts)\n                                        print(f'{self.startmsg}{self.endmsg}')\n                                    else:\n                                        ts = {'序号': self.num, '用户': self.name, '今日团币': self.coins,\n                                              '总共团币': f'{int(self.wcxtb)}({int(self.wcxtb) / 1000}元)'}\n                                        ts_all.append(ts)\n                                        print(f'{self.startmsg}{self.endmsg}')\n                        else:\n                            isgame = self.get_new_gameid()\n                            if isgame and self.ids != []:\n                                # if 717 not in self.ids:\n                                #     self.game_gift()\n                                self.startmsg += f'✅游戏中心获取任务成功！🚀即将运行所有任务\\n'\n                                print(self.startmsg)\n                                a = 0\n                                while True:\n                                    a += 1\n                                    if a > max_gamexh:\n                                        break\n                                    self.run_game()\n                                    isgame = self.get_new_gameid()\n                                    if isgame and len(self.ids) != 0:\n                                        continue\n                                    elif isgame and len(self.ids) == 0:\n                                        break\n                                    else:\n                                        self.endmsg += f'⛔️第{a}循环发现问题，停止游戏中心任务运行！'\n                                        break\n                            elif isgame and self.ids == []:\n                                self.startmsg += f'✅游戏中心已经全部完成！🚀即将运行小说和团币中心任务\\n'\n                                print(self.startmsg)\n                            else:\n                                if nzidrun:\n                                    self.ids = [15610, 15224, 15293, 15604, 15813, 15177, 15601, 15605, 15326, 15837,\n                                                15458,\n                                                15457,\n                                                15603, 15606, 15324, 15810, 15607, 15618, 16656, 15608, 16498, 15169,\n                                                15609,\n                                                15302,\n                                                15171, 15172, 15282, 15287, 15173, 323, 330, 507, 509, 672, 768]\n                                    self.startmsg += f'⛔️游戏中心获取任务失败，使用内置id！🚀即将运行游戏中心任务和团币中心任务\\n'\n                                    print(self.startmsg)\n                                    self.run_game2()\n                                else:\n                                    self.startmsg += f'⛔️游戏中心获取任务失败，未开启内置id运行!🚀即将运行团币中心任务\\n'\n                                    print(self.startmsg)\n                            if self.get_xslist():\n                                self.run_xsrw()\n                            if self.coin_login():\n                                self.run_tbrw()\n                                if run_ggl:\n                                    self.run_ggl()\n                                self.endmsg += f'🆔账号{self.num}-{self.name}({self.usid}) 🎉运行完成\\n'\n                                if self.endcxtb():\n                                    if self.tj_bchd():\n                                        if self.uid is not None:\n                                            self.wxpusher()\n                                            ts = {'序号': self.num, '用户': self.name, '今日团币': self.coins,\n                                                  '总共团币': f'{int(self.wcxtb)}({int(self.wcxtb) / 1000}元)'}\n                                            ts_all.append(ts)\n                                            print(self.endmsg)\n                                        else:\n                                            ts = {'序号': self.num, '用户': self.name, '今日团币': self.coins,\n                                                  '总共团币': f'{int(self.wcxtb)}({int(self.wcxtb) / 1000}元)'}\n                                            ts_all.append(ts)\n                                            print(self.endmsg)\n                                    else:\n                                        self.endmsg += '🆔账号{self.num}-{self.name}({self.usid})⛔️获取今日团币失败\\n'\n                                        print(self.endmsg)\n                                else:\n                                    self.endmsg += '🆔账号{self.num}-{self.name}({self.usid})⛔️获取运行后团币失败\\n'\n                                    print(self.endmsg)\n                            else:\n                                self.endmsg += '🆔账号{self.num}-{self.name}({self.usid})⛔️获取qdtoken失败\\n'\n                                print(self.endmsg)\n                else:\n                    self.startmsg += '⛔️获取运行前团币失败\\n'\n                    print(self.startmsg)\n            else:\n                self.startmsg += '⛔️获取act失败\\n'\n                print(self.startmsg)\n        else:\n            self.startmsg += '⛔️️登录失败️\\n'\n            print(self.startmsg)\n\n    def get_xslist(self):\n        self.xs_headers = {\n            # \"retrofit_exec_time\": self.timestamp_milliseconds(),\n            \"Referer\": \"https://msc.meituan.com/73a62054aadc4526/6227/service\",\n            \"User-Agent\": self.ua,\n            \"M-SHARK-TRACEID\": \"101000000000000038E9FFD887F741C5BCE0A6A3F9D849C2A16592906xdrw3528218cdd781702178856961163393\",\n            \"Accept-Encoding\": \"gzip\",\n            \"clientVersion\": \"1.2.0\",\n            \"uuid\": self.uuid,\n            \"platform\": \"4\",\n            \"yodaVersion\": \"1.18.0.179\",\n            \"appVersion\": \"12.19.209\",\n            \"token\": self.ck,\n            \"clientType\": \"android\",\n            \"yodaReady\": \"native\",\n            \"appType\": \"group\",\n            \"novelScene\": \"0199\",\n            \"adBookId\": \"2611385\",\n            \"Content-Type\": \"application/json\",\n            \"Host\": \"web.meituan.com\",\n            \"Connection\": \"Keep-Alive\",\n        }\n        r = requests.get('https://web.meituan.com/novel/marketing/task/listV2?clientAppVersion=6',\n                         headers=self.xs_headers)\n        # r = requests.get('https://web.meituan.com/novel/marketing/task/listV2',\n        #                  headers=self.xs_headers)\n        if '操作成功' in r.text:\n            if isprint:\n                print(\n                    f'🆔账号{self.num}-{self.name}({self.usid}) 获取小说任务成功！')\n            self.xslist = r.json().get('data', None)\n            time.sleep(random.randint(1, 3))\n            return True\n        else:\n            if isprint:\n                print(\n                    f'🆔账号{self.num}-{self.name}({self.usid}) ⛔️获取小说任务失败！')\n            time.sleep(random.randint(1, 3))\n            return False\n\n    def get_xsid(self):\n        headers = {\n            # \"retrofit_exec_time\": self.timestamp_milliseconds(),\n            \"Referer\": \"https://msc.meituan.com/73a62054aadc4526/6227/service\",\n            \"User-Agent\": self.ua,\n            \"M-SHARK-TRACEID\": \"101000000000000038E9FFD887F741C5BCE0A6A3F9D849C2A16592906xdrw3528218cdd781702178856961163393\",\n            \"Accept-Encoding\": \"gzip\",\n            \"clientVersion\": \"1.2.0\",\n            \"uuid\": self.uuid,\n            \"platform\": \"4\",\n            \"yodaVersion\": \"1.18.0.179\",\n            \"appVersion\": \"12.19.204\",\n            \"token\": self.ck,\n            \"clientType\": \"android\",\n            \"yodaReady\": \"native\",\n            \"appType\": \"group\",\n            \"novelScene\": \"0199\",\n            \"adBookId\": \"2611385\",\n            \"Content-Type\": \"application/json\",\n            \"Host\": \"web.meituan.com\",\n            # \"mtgsig\": \"{'a1': '1.1', 'a2': 1705210566109, 'a3': '1705207770058CCSCKCCe67dcc3e61b3db1bf3f9e3b1c7aaaa883129', 'a5': 'p/q6y/VVJya//sJFOQVZjbVFgnuAD+P4', 'a6': 'hs1.4cc8P/oEcPnEVSLCbPATiLpS/SEx2PtOn9gl+fy5ugnXN+jI26oGzQDexAB7AKBL9MLQa+3hdYp5R8FyGDs76Fv/+b3RfNGzp7WOMiJ5fH+ELoJEuxPK7r5F/RZ6ZuFZIYoBAe2hzCchU/UuxEUHIpHgO6MyqfhNJScPSO8BBhZRQXRwFJ+SqvkC2oiYtSpTCS+KojN+3plAj5fjDq8yPGj8pcC2Vv2m6Ri0Ujwa3VxhF1b5vS7KTnhmLX6kwDn8BF2OHCXcEd6j33djG3D8PoYgU/TwPq1rHNKkbX0GM3TrYc3edu3k4a0S0jbyQLr+4bhZ0SkiV5Ie03wu/lMksW7ECNwnxNJtJPIs7pJprLrc=', 'x0': 4, 'd1': '693c48f536c46dd0da9991745ff82524'}\",\n            \"Connection\": \"Keep-Alive\",\n        }\n        data = {\n            'jobId': self.jobId,\n            'property': self.property,\n            'fingerprint': self.zw,\n        }\n        # r = requests.post('https://web.meituan.com/novel/marketing/task', headers=headers, json=data)\n        data = json.dumps(data)\n        r = self.Getmtgsig_data('https://web.meituan.com/novel/marketing/task', headers, data)\n\n        if '操作成功' in r.text:\n            self.xsid = r.json()['data']['taskId']\n            if isprint:\n                print(\n                    f'🆔账号{self.num}-{self.name}({self.usid}) 获取小说id✅成功{self.jobId}({self.xsid}) {r.json()}')\n            time.sleep(random.randint(1, 3))\n            return True\n        else:\n            if isprint:\n                print(\n                    f'🆔账号{self.num}-{self.name}({self.usid}) ⛔️获取小说id失败{self.jobId} {r.json()}')\n            time.sleep(random.randint(1, 3))\n            return False\n\n    def get_xsrw(self):\n        self.xs_headers = {\n            # \"retrofit_exec_time\": self.timestamp_milliseconds(),\n            \"Referer\": \"https://msc.meituan.com/73a62054aadc4526/6227/service\",\n            \"User-Agent\": self.ua,\n            \"M-SHARK-TRACEID\": \"101000000000000038E9FFD887F741C5BCE0A6A3F9D849C2A16592906xdrw3528218cdd781702178856961163393\",\n            \"Accept-Encoding\": \"gzip\",\n            \"clientVersion\": \"1.2.0\",\n            \"uuid\": self.uuid,\n            \"platform\": \"4\",\n            \"yodaVersion\": \"1.18.0.179\",\n            \"appVersion\": \"12.19.209\",\n            \"token\": self.ck,\n            \"clientType\": \"android\",\n            \"yodaReady\": \"native\",\n            \"appType\": \"group\",\n            \"novelScene\": \"0199\",\n            \"adBookId\": \"2611385\",\n            \"Content-Type\": \"application/json\",\n            \"Host\": \"web.meituan.com\",\n            \"Connection\": \"Keep-Alive\",\n        }\n        if self.title == '听书赚美团币':\n            url = 'https://web.meituan.com/novel/marketing/task/audio/process'\n            data = {\n                'process': self.condition,\n                'fingerprint': self.zw,\n                'audioPartnerType': 1,\n                'taskProperty': 4\n            }\n        else:\n            url = 'https://web.meituan.com/novel/marketing/task/process'\n            data = {\n                'taskId': f\"{self.xsid}\",\n                'process': self.condition,\n                'fingerprint': self.zw,\n            }\n        # r = requests.post('https://web.meituan.com/novel/marketing/task/process', headers=self.xs_headers, json=data)\n\n        data = json.dumps(data)\n        r = self.Getmtgsig_data(url, self.xs_headers, data)\n\n        if '操作成功' in r.text:\n            if isprint:\n                print(\n                    f'🆔账号{self.num}-{self.name}({self.usid}) ✅领取{self.xsid}成功 {r.json()}')\n            time.sleep(random.randint(1, 3))\n            return True\n        else:\n            if isprint:\n                print(\n                    f'🆔账号{self.num}-{self.name}({self.usid}) ⛔️领取{self.xsid}失败 {r.json()}')\n            time.sleep(random.randint(1, 3))\n            return False\n\n    def post_xsrw(self):\n        data = {\n            'taskId': f\"{self.xsid}\",\n            'fingerprint': self.zw,\n        }\n        # r = requests.post('https://web.meituan.com/novel/marketing/task/coin', headers=self.xs_headers, json=data)\n        data = json.dumps(data)\n        r = self.Getmtgsig_data('https://web.meituan.com/novel/marketing/task/coin', self.xs_headers, data)\n        if '操作成功' in r.text:\n            if isprint:\n                print(\n                    f'🆔账号{self.num}-{self.name}({self.usid}) ✅完成{self.xsid}成功 {r.json()}')\n            time.sleep(random.randint(1, 3))\n            return True\n        else:\n            if isprint:\n                print(\n                    f'🆔账号{self.num}-{self.name}({self.usid}) ⛔️完成{self.xsid}失败 {r.json()}')\n            time.sleep(random.randint(1, 3))\n            return False\n\n    def run_xsrw(self):\n        for data in self.xslist:\n            zt = data['status']\n            self.title = data['title']\n            self.xsid = data.get('taskId', None)\n            self.jobId = data['jobId']\n            self.property = data['property']\n            self.condition = data['award']['steps'][-1]['condition']\n            if isprint:\n                print(\n                    f\"{self.title} 状态: {zt} taskid:{self.xsid} jobId: {self.jobId} property: {self.property} condition: {self.condition}\")\n            if zt == 1 or zt == 0:\n                if self.get_xsid():\n                    time.sleep(random.randint(10, 60))\n                    if self.get_xsrw():\n                        time.sleep(random.randint(3, 8))\n                        self.post_xsrw()\n                        time.sleep(random.randint(3, 8))\n                        pass\n            elif zt == 2:\n                if self.get_xsid():\n                    time.sleep(random.randint(10, 60))\n                    self.post_xsrw()\n                    time.sleep(random.randint(3, 8))\n            else:\n                pass\n\n\nif __name__ == '__main__':\n    requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)\n    print = partial(print, flush=True)\n    msg = \"\"\"\n🔔当前版本V4.19自备接口版\n    \"\"\"\n    print(msg)\n\n    token = os.environ.get(blname)\n\n    if token is None:\n        print(f'⛔️未获取到ck变量：请检查变量是否填写')\n        exit(0)\n    if zdyfg in token:\n        tokens = token.split(zdyfg)\n    else:\n        tokens = [token]\n\n    print(f'✅获取到{len(tokens)}个账号')\n\n    bf = os.environ.get(\"bd_xtbbf\")\n    if bf is None:\n        print(f'⛔️为设置并发变量，默认1')\n        bf = 1\n    else:\n        bf = int(bf)\n        print(f'✅设置最大并发数: {bf}')\n\n    if isprint:\n        print(f'✅开启详细日志')\n    else:\n        print(f'⛔️未开启详细日志')\n\n    if isdl:\n        if proxy_api_url != '':\n            print(f'✅开启代理api运行')\n            start_dlapi()\n        elif proxy_url != '':\n            print(f'✅开启代理池运行')\n        else:\n            print(f'⛔️未填入代理')\n            exit(0)\n    else:\n        print(f'⛔️未开启代理运行')\n\n    ts_all = []\n    with concurrent.futures.ThreadPoolExecutor(max_workers=int(bf)) as executor:\n        print(f'======================================')\n        for num in range(len(tokens)):\n            runzh = num + 1\n            if len(tokens[num].split(\"#\")) == 2 and \"UID\" in tokens[num]:\n                print(f'🆔账号{runzh} 好像没加uuid，请添加后再运行！\\n')\n            elif len(tokens[num].split(\"#\")) == 2 and \"UID\" not in tokens[num]:\n                run = Mttb(runzh, tokens[num])\n                executor.submit(run.main)\n            elif len(tokens[num].split(\"#\")) == 3:\n                run = Mttb(runzh, tokens[num])\n                executor.submit(run.main)\n            elif len(tokens[num].split(\"#\")) == 1:\n                print(f'🆔账号{runzh} 好像没加uuid，请添加后再运行！\\n')\n            time.sleep(random.randint(2, 5))\n\n    if wxpusher_alluid == '':\n        stop_event.set()\n        pass\n    else:\n        stop_event.set()\n        ts_qb(ts_all)\n"
  },
  {
    "path": "bd_yl.py",
    "content": "\"\"\"\n\ntime：2023.10.31\ncron: 1 1 1 1 1\nnew Env('安装依赖（运行脚本前运行）');\n一键安装库里面脚本需要的依赖！\n\n\"\"\"\n\nimport importlib.util\nimport os\n\nyl = ['cryptograph', 'user_agent', ]\nfor i in yl:\n    spec = importlib.util.find_spec(i)\n    if spec is None:\n        os.system(\"pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple\")\n        os.system(f\"pip install -i https://pypi.tuna.tsinghua.edu.cn/simple {i}\")\n        print(f\"{i}安装完成\")\n    else:\n        print(f\"{i}已经安装\")\n"
  }
]