From 863995de65249fd2c5d83745132105c4f502cebf Mon Sep 17 00:00:00 2001 From: 3288588344 <127068117+3288588344@users.noreply.github.com> Date: Mon, 22 Jul 2024 09:34:56 +0800 Subject: [PATCH] Add files via upload --- 爱奇艺.py | 378 +++++++++++++++++++++++++++++ 腾讯视频.js | 669 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1047 insertions(+) create mode 100644 爱奇艺.py create mode 100644 腾讯视频.js diff --git a/爱奇艺.py b/爱奇艺.py new file mode 100644 index 0000000..36baa64 --- /dev/null +++ b/爱奇艺.py @@ -0,0 +1,378 @@ +# @env : iqyck +# 功能:爱奇艺签到 刷观影时长 做任务领取奖励 +# ------------------------------- +""" +cookie为爱奇艺整个cookie +export iqyck = "cookie" +""" +from datetime import datetime +from hashlib import md5 as md5Encode +from json import dumps +from time import sleep, time +from os import environ, system, path +from random import randint, choice +from re import findall +from string import digits, ascii_lowercase, ascii_uppercase +from sys import exit, stdout +from uuid import uuid4 +import requests +response = requests.get("https://raw.githubusercontent.com/3288588344/toulu/main/tl.txt") +response.encoding = 'utf-8' +txt = response.text +print(txt) + +def load_send(): + cur_path = path.abspath(path.dirname(__file__)) + if path.exists(cur_path + "/notify.py"): + try: + from notify import send + return send + except ImportError: + return False + else: + return False + +try: + from requests import Session, get, post + from fake_useragent import UserAgent +except: + print( + "你还没有安装requests库和TL库_useragent库 正在尝试自动安装 请在安装结束后重新执行此脚本\n若还是提示本条消息 请自行运行pip3 install requests和pip3 install fake-useragent或者在青龙的依赖管理里安装python的requests和fake-useragent") + system("pip3 install fake-useragent") + system("pip3 install requests") + print("安装完成 脚本退出 请重新执行") + exit(0) +iqyck = environ.get("iqyck") if environ.get("iqyck") else "" +P00001 = P00003 = dfp = qyid = "" +if iqyck == "": + print("未找到iqy_ck,请填写iqy_ck变量") + exit(0) + +check_items = ["P00001", "P00003", "QC005", "__dfp"] + +for item in check_items: + try: + found = findall(rf"{item}=(.*?)(;|$)", iqyck) + + if found: + value = found[0][0] + + if item == "P00001": + P00001 = value + elif item == "P00003": + P00003 = value + elif item == "QC005": + qyid = value + elif item == "__dfp": + dfp = value + dfp = dfp.split("@")[0] + else: + print(f"{item}未在iqyck中找到") + except IndexError: + print(f"{item}存在但无法被正确解析") + +class IQiYi: + name = "爱奇艺" + def __init__(self): + self.P00001 = P00001 + self.userId = P00003 + self.dfp = dfp + self.qyid = qyid + self.platform = str(uuid4())[:16], + self.session = Session() + self.user_agent = UserAgent().chrome + self.headers = { + "User-Agent": self.user_agent, + "Cookie": f"P00001={self.P00001}", + 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + 'sec-fetch-site': "none", + 'sec-fetch-dest': "document", + 'accept-language': "zh-CN,zh-Hans;q=0.9", + 'sec-fetch-mode': "navigate" + } + self.msg = "" + self.user_info = "" + self.task_info = "" + self.msg = "" + self.taskList = [] + self.lotteryList = [] + self.shakeLotteryList = [] + self.gift_list = [] + self.sleep_await = environ.get("sleep_await") if environ.get("sleep_await") else 1 + + """工具""" + def req(self, url, req_method="GET", body=None): + data = {} + method = req_method.upper() + if method not in ["GET", "POST", "OTHER"]: + self.print_now(f"错误:不支持的请求方法:{method}") + return + + try: + if method == "GET": + response = self.session.get(url, headers=self.headers, params=body) + elif method == "POST": + response = self.session.post(url, headers=self.headers, data=dumps(body)) + elif method == "OTHER": + response = self.session.get(url, headers=self.headers, params=dumps(body)) + + if method in ["GET", "POST"]: + data = response.json() + + except requests.exceptions.RequestException as e: + self.print_now(f"请求发送失败,可能为网络异常,异常详细信息:{str(e)}") + + return data + + def timestamp(self, short=False): + if (short): + return int(time()) + return int(time() * 1000) + + def md5(self, str): + m = md5Encode(str.encode(encoding='utf-8')) + return m.hexdigest() + + def uuid(self, num, upper=False): + str = '' + if upper: + for i in range(num): + str += choice(digits + ascii_lowercase + ascii_uppercase) + else: + for i in range(num): + str += choice(digits + ascii_lowercase) + return str + + def print_now(self, content): + print(content) + stdout.flush() + + def sign(self): + # lequ-qfe.iqiyi.com + time_stamp = self.timestamp() + data = f'agenttype=20|agentversion=15.5.5|appKey=lequ_rn|appver=15.5.5|authCookie={self.P00001}|qyid={self.qyid}|srcplatform=20|task_code=natural_month_sign|timestamp={time_stamp}|userId={self.userId}|cRcFakm9KSPSjFEufg3W' + url = f'https://community.iqiyi.com/openApi/task/execute?task_code=natural_month_sign×tamp={time_stamp}&appKey=lequ_rn&userId={self.userId}&authCookie={self.P00001}&agenttype=20&agentversion=15.5.5&srcplatform=20&appver=15.5.5&qyid={self.qyid}&sign={self.md5(data)}' + headers = { + 'Content-Type': 'application/json' + } + body = { + "natural_month_sign": { + "verticalCode": "iQIYI", + "agentVersion": "15.4.6", + "authCookie": self.P00001, + "taskCode": "iQIYI_mofhr", + "dfp": self.dfp, + "qyid": self.qyid, + "agentType": 20, + "signFrom": 1 + } + } + data = post(url, headers=headers, data=dumps(body)).json() + signDays = None + if 'code' in data and data['code'] == 'A0003': + self.print_now("iqyck已失效,请重新获取") + exit(0) + elif 'code' in data and data['code'] == 'A00000': + data_data = data.get('data', {}) + msg = data_data.get('msg') + + if data_data.get('data'): + signDays = data_data.get('data', {}).get('signDays') + if msg and '已经到达上限' in msg: + self.print_now(f"签到失败,今天已签到") + self.task_info += f"签到失败,今天已签到\n" + elif signDays is not None: + self.print_now(f"签到成功, 本月累计签到{signDays}天") + self.task_info += f"签到成功, 本月累计签到{signDays}天\n" + + if data_data['code'] != 'A0000' and data_data['code'] != 'A0014' and not (data_data.get('success')): + self.print_now(f"签到失败:{msg}") + self.task_info += f"签到失败:{msg}\n" + else: + self.print_now(f"签到失败:{data}") + self.task_info += f"签到失败:{data}\n" + + def get_watch_time(self): + url = "https://tc.vip.iqiyi.com/growthAgency/watch-film-duration" + data = self.req(url) + watch_time = data['data']['viewtime']['time'] + return watch_time + + def watchVideo(self): + totalTime = self.get_watch_time() + if totalTime >= 7200: + self.print_now(f"您的账号今日观影时长大于2小时,不执行刷观影时长") + self.task_info += f"今日观影任务已完成\n" + return + self.print_now("正在刷观影时长,为减少风控,本过程运行大概1个小时") + for i in range(1, 121): + Time = randint(70, 90) + url = f"https://msg.qy.net/b?u=f600a23f03c26507f5482e6828cfc6c5&pu={self.userId}&p1=1_10_101&v=5.2.66&ce={self.uuid(32)}&de=1616773143.1639632721.1639653680.29&c1=2&ve={self.uuid(32)}&ht=0&pt={randint(1000000000, 9999999999) / 1000000}&isdm=0&duby=0&ra=5&clt=&ps2=DIRECT&ps3=&ps4=&br=mozilla%2F5.0%20(windows%20nt%2010.0%3B%20win64%3B%20x64)%20applewebkit%2F537.36%20(khtml%2C%20like%20gecko)%20chrome%2F96.0.4664.110%20safari%2F537.36&mod=cn_s&purl=https%3A%2F%2Fwww.iqiyi.com%2Fv_1eldg8u3r08.html%3Fvfrm%3Dpcw_home%26vfrmblk%3D712211_cainizaizhui%26vfrmrst%3D712211_cainizaizhui_image1%26r_area%3Drec_you_like%26r_source%3D62%2540128%26bkt%3DMBA_PW_T3_53%26e%3Db3ec4e6c74812510c7719f7ecc8fbb0f%26stype%3D2&tmplt=2&ptid=01010031010000000000&os=window&nu=0&vfm=&coop=&ispre=0&videotp=0&drm=&plyrv=&rfr=https%3A%2F%2Fwww.iqiyi.com%2F&fatherid={randint(1000000000000000, 9999999999999999)}&stauto=1&algot=abr_v12-rl&vvfrom=&vfrmtp=1&pagev=playpage_adv_xb&engt=2&ldt=1&krv=1.1.85&wtmk=0&duration={randint(1000000, 9999999)}&bkt=&e=&stype=&r_area=&r_source=&s4={randint(100000, 999999)}_dianshiju_tbrb_image2&abtest=1707_B%2C1550_B&s3={randint(100000, 999999)}_dianshiju_tbrb&vbr={randint(100000, 999999)}&mft=0&ra1=2&wint=3&s2=pcw_home&bw=10&ntwk=18&dl={randint(10, 999)}.27999999999997&rn=0.{randint(1000000000000000, 9999999999999999)}&dfp={dfp}&stime={self.timestamp()}&r={randint(1000000000000000, 9999999999999999)}&hu=1&t=2&tm={Time}&_={self.timestamp()}" + self.req(url, 'other') + totalTime += Time + sleep(randint(30, 50)) + if i % 30 == 0: + self.print_now(f"现在已经刷到了{totalTime}秒, 数据同步有延迟, 仅供参考") + if totalTime >= 7200: + sleep(60) + self.print_now(f"今日观影任务已完成") + self.task_info += f"今日观影任务已完成\n" + break + + def dailyTask(self): + # 查询任务 + """ + status: 0 已完成,未领奖 1 已完成,已领奖 2 未完成 + """ + url = f'https://tc.vip.iqiyi.com/taskCenter/task/queryUserTask?P00001={self.P00001}' + data = self.req(url) + if data['code'] == 'A00000': + for item in data["data"].get("tasks", {}).get("daily", []): + if item["taskCode"] != "WatchVideo60mins" and item["status"] != 1: + self.taskList.append( + { + "taskTitle": item["taskTitle"], + "taskCode": item["taskCode"], + "status": item["status"] + } + ) + if self.taskList: + for item in self.taskList: + if item["status"] == 2: + # 领任务 + url = f'https://tc.vip.iqiyi.com/taskCenter/task/joinTask?P00001={self.P00001}&taskCode={item["taskCode"]}&platform={self.platform}&lang=zh_CN&app_lm=cn' + if self.req(url)['code'] == 'A00000': + sleep(10) + # 完成任务 + url = f'https://tc.vip.iqiyi.com/taskCenter/task/notify?taskCode={item["taskCode"]}&P00001={self.P00001}&platform={self.platform}&lang=cn&bizSource=component_browse_timing_tasks&_={self.timestamp()}' + if self.req(url)['code'] == 'A00000': + sleep(2) + if item["status"] == 2 or item["status"] == 0: + # 领取奖励 + url = f"https://tc.vip.iqiyi.com/taskCenter/task/getTaskRewards?P00001={self.P00001}&taskCode={item['taskCode']}&lang=zh_CN&platform={self.platform}" + data = self.req(url) + if data['code'] == 'A00000': + price = data['dataNew'][0]["value"] + self.print_now(f"{item['taskTitle']}任务已完成, 获得{int(price[1:])}点成长值") + self.task_info += f"{item['taskTitle']}任务已完成, 获得{int(price[1:])}点成长值\n" + sleep(5) + else: + self.print_now("今日日常浏览任务已全部完成") + self.task_info += "今日日常浏览任务已全部完成\n" + + def lottery(self): + url = "https://iface2.iqiyi.com/aggregate/3.0/lottery_activity" + lottery_params = { + "app_k": 0, + "app_v": 0, + "platform_id": 10, + "dev_os": 0, + "dev_ua": 0, + "net_sts": 0, + "qyid": self.qyid, + "psp_uid": self.userId, + "psp_cki": self.P00001, + "psp_status": 3, + "secure_v": 1, + "secure_p": 0, + "req_sn": self.timestamp() + } + params = lottery_params + data = self.req(url, "get", params) + if data.get("code") == 0: + daysurpluschance = int(data.get("daysurpluschance")) + if daysurpluschance == 0: + if self.lotteryList: + self.print_now(f"抽奖奖品:{'、'.join(self.lotteryList)}") + self.task_info += f"抽奖奖品:{'、'.join(self.lotteryList)}\n" + else: + self.print_now(f"抽奖次数已用完, 明日再来吧") + self.task_info += f"抽奖次数已用完, 明日再来吧\n" + else: + award_info = data.get("awardName") + self.lotteryList.append(award_info) + sleep(2) + self.lottery() + else: + self.print_now(f"抽奖接口请求失败:{data}\n") + + def shake_lottery(self): + url = f'https://act.vip.iqiyi.com/shake-api/lottery?P00001={self.P00001}&dfp={self.dfp}&qyid={self.qyid}&deviceID={self.qyid}&version=15.4.6&agentType=12&platform=bb35a104d95490f6&ptid=02030031010000000000&fv=afc0b50ed49e732d&source=afc0b50ed49e732d&_={self.timestamp()}&vipType=1&lotteryType=0&actCode=0k9GkUcjqqj4tne8&freeLotteryNum=3&extendParams={{"appIds":"iqiyi_pt_vip_iphone_video_autorenew_12m_348yuan_v2","supportSk2Identity":true,"testMode":"0","iosSystemVersion":"17.4.1","bundleId":"com.qiyi.iphone"}}' + data = self.req(url) + if data.get("code") == 'A00000': + award_info = data.get("data", {}).get("title") + self.shakeLotteryList.append(award_info) + sleep(2) + self.shake_lottery() + elif data.get("msg") == "抽奖次数用完": + if self.shakeLotteryList: + self.print_now(f"每天摇一摇奖品:{'、'.join(self.shakeLotteryList)}") + self.task_info += f"每天摇一摇奖品:{'、'.join(self.shakeLotteryList)}\n" + else: + self.print_now(f"每天摇一摇次数已用完, 明日再来吧") + self.task_info += f"每天摇一摇次数已用完, 明日再来吧\n" + else: + self.print_now(f'每天摇一摇:{data.get("msg")}\n') + + def giveTimes(self): + times_code_list = ["browseWeb", "browseWeb", "bookingMovie"] + for times_code in times_code_list: + url = f"https://pcell.iqiyi.com/lotto/giveTimes?dfp&qyid={self.qyid}&version&deviceId={self.qyid}&_cctimer={self.timestamp()}&actCode=bcf9d354bc9f677c×Code={times_code}&P00001={self.P00001}" + data = self.req(url) + + def queryTimes(self): + url = f"https://pcell.iqiyi.com/lotto/queryTimes?dfp&qyid={self.qyid}&version&deviceId={self.qyid}&_cctimer={self.timestamp()}&actCode=bcf9d354bc9f677c&P00001={self.P00001}" + data = self.req(url) + if data.get("code") == 'A00000': + times = data["data"]["times"] + return times + + def lotto_lottery(self): + self.giveTimes() + times = self.queryTimes() + if times == 0: + self.print_now(f"白金抽奖次数已用完, 明日再来吧") + self.task_info += f"白金抽奖次数已用完, 明日再来吧" + for _ in range(times): + url = f"https://pcell.iqiyi.com/lotto/lottery?dfp&qyid={self.qyid}&version&deviceId={self.qyid}&_cctimer={self.timestamp()}&actCode=bcf9d354bc9f677c&P00001={self.P00001}" + data = self.req(url) + gift_name = data["data"]["giftName"] + if gift_name and "未中奖" not in gift_name: + self.gift_list.append(gift_name) + if self.gift_list: + self.print_now(f"白金抽奖奖品:{'、'.join(self.gift_list)}") + self.task_info += f"白金抽奖奖品:{'、'.join(self.gift_list)}" + elif times != 0: + self.print_now(f"很遗憾,白金抽奖未中奖") + self.task_info += f"很遗憾,白金抽奖未中奖" + + def get_userinfo(self): + url = f"https://tc.vip.iqiyi.com/growthAgency/v2/growth-aggregation?messageId=b7d48dbba64c4fd0f9f257dc89de8e25&platform=97ae2982356f69d8&P00001={self.P00001}&responseNodes=duration,growth,upgrade,viewTime,growthAnnualCard&_={self.timestamp()}" + data = self.req(url) + growth_info = data['data']['growth'] + if data.get("code") == 'A00000': + self.user_info += f"用户昵称:{ data['data']['user']['nickname']}\nVIP等级:{growth_info['level']}\nVIP到期时间:{growth_info['deadline']}\n今日成长:{growth_info['todayGrowthValue']}\n当前成长:{growth_info['growthvalue']}\n升级还需:{growth_info['distance']}\n" + else: + self.user_info = f"查询失败,未获取到用户信息\n" + + def main(self): + self.sign() + self.watchVideo() + self.dailyTask() + self.lottery() + self.shake_lottery() + self.lotto_lottery() + self.print_now(f"任务已经执行完成,因爱奇艺观影时间同步较慢,这里等待1分钟再查询今日成长值信息\n若不需要等待直接查询,请设置环境变量名 sleep_await = 0") + if int(self.sleep_await) == 1: + sleep(60) + self.get_userinfo() + self.msg = self.user_info + self.task_info + send = load_send() + if callable(send): + send("爱奇艺", self.msg) + else: + print('\n加载通知服务失败') + +if __name__ == '__main__': + iqiyi = IQiYi() + iqiyi.main() \ No newline at end of file diff --git a/腾讯视频.js b/腾讯视频.js new file mode 100644 index 0000000..3ef29fc --- /dev/null +++ b/腾讯视频.js @@ -0,0 +1,669 @@ +/** +*@file 腾讯视频 +*@desp 本脚本仅适用于腾讯视频及体育会员每日签到,仅测试Quantumult X、青龙(只支持单账号) +*@env txspCookie、txspRefreshCookie、txspRefreshBody、dayOfGetMonthTicket、isSkipTxspCheckIn、isLottery +*@updated 2024-7-18 +*@version v1.0.3 + +🌟 环境变量说明 +txspCookie:腾讯视频app的Cookie +txspRefreshCookie、txspRefreshBody:腾讯视频网页NewRefresh接口中的数据,用来刷新Cookie中的vqq_vusession +dayOfGetMonthTicket:每月几号领取每月球票,默认为每月1号 +isSkipTxspCheckIn:值域[true, false] 默认为false表示正常进行腾讯视频会员签到,用于特殊情况下(账号需要获取短信验证码或者需要过滑块验证码)时开启 +isLottery: 值域[true, false] 默认为false表示不抽奖,抽抽乐于2024年2月29日10点下线,建议不开启,反正也抽不到 +❗ 本脚本只能给腾讯视频正常账号签到,如有验证请设置isSkipTxspCheckIn为true,直到手动签到无验证为止 +❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖❖ + +详细功能: +🔵 腾讯视频会员签到领V力值 +🔵 腾讯体育会员签到领热爱值 +🔵 腾讯体育领取每日球票 +🔵 腾讯体育领取每月球票 + +📌 获取Cookie:(重写需要获取3个值:txspCookie、txspRefreshCookie、txspRefreshBody) +- 进入腾讯视频app,点击右下角我的,点击头像下的视频VIP进入会员中心看到系统消息提示获取txspCookie成功即可 +- 浏览器进入腾讯视频网页版,登录后切换成桌面版,刷新网页看到系统消息提示获取txspRefreshCookie、txspRefreshBody成功即可 +- 获取Cookie后, 请将Cookie脚本禁用并移除主机名,以免产生不必要的MITM +*/ +const $ = new Env("腾讯视频"); + +let txspCookie = ($.isNode() ? process.env.txspCookie : $.getdata('txspCookie')) || ""; +let txspRefreshCookie = ($.isNode() ? process.env.txspRefreshCookie : $.getdata('txspRefreshCookie')) || ""; +let txspRefreshBody = ($.isNode() ? process.env.txspRefreshBody : $.getdata('txspRefreshBody')) || ""; +let dayOfGetMonthTicket = ($.isNode() ? process.env.dayOfGetMonthTicket : $.getdata('dayOfGetMonthTicket')) || 1; +let isSkipTxspCheckIn = $.isNode() ? process.env.isSkipTxspCheckIn : (($.getdata('isSkipTxspCheckIn') !== undefined && $.getdata('isSkipTxspCheckIn') !== '') ? JSON.parse($.getdata('isSkipTxspCheckIn')) : false); +let isLottery = $.isNode() ? process.env.isLottery : (($.getdata('isLottery') !== undefined && $.getdata('isLottery') !== '') ? JSON.parse($.getdata('isLottery')) : false); + +const Notify = 1; //0为关闭通知,1为打开通知,默认为1 +const notify = $.isNode() ? require("./sendNotify") : ""; + +let currentVersion = "v1.0.3", latestVersion = ""; +let nickname = ""; +let isTxspVip = false, isTxspSvip = false, isTxSportsVip = false, isTxSportsSvip = false; +let endTime = "", svipEndTime = "", txSportsEndTime = "", txSportsSvipEndTime = ""; +let level = "", txSportsLevel = ""; +let score = "", txSportsScore = ""; +let month_received_score = "", month_limit = ""; +let isTxspCheckIn = "", isTxSportsCheckIn = ""; + +let originalInfo = $.info; +let originalWarn = $.warn; +let originalError = $.error; +let message = ""; +$.desc = "", $.taskInfo = ""; +$.info=function(message){originalInfo.call($,message);$.desc+=message+"\n"};$.warn=function(message){originalWarn.call($,message);$.desc+=message+"\n"};$.error=function(message){originalError.call($,message);$.desc+=message+"\n"}; + +if ((isGetCookie = typeof $request !== `undefined`)) { + getCookie(); + $.done(); +} else if (!$.isNode() && !txspCookie){ + $.msg($.name, "您未获取腾讯视频Cookie", "点击此条跳转到腾讯视频获取Cookie", { 'open-url': 'tenvideo://', 'media-url': 'https://raw.githubusercontent.com/WowYiJiu/Personal/main/icon/videoqq.png' }); + $.done(); +} else { + !(async () => { + $.log(`TL库频道:https://pd.qq.com/s/btv4bw7av`); + await getNotice(); + await getVersion(); + //$.log(`\n当前版本:${currentVersion} 最新版本:${latestVersion}\n`); + //$.version = `\n当前版本:${currentVersion} 最新版本:${latestVersion}\n`; + if(!txspCookie){ + $.warn(`未填写txspCookie环境变量`); + return; + } + $.info("---- 开始 刷新vusession ----"); + await refresh_vusession(); + $.info(`--------- 结束 ---------\n`); + $.info(`用户昵称:${nickname}`); + await getVipInfo(); + if (isTxspVip){ + $.info(`---- 腾讯视频VIP信息 ----`); + if (isTxspSvip){ + $.info(`当前是腾讯视频SVIP`); + } else { + $.info(`当前是腾讯视频VIP`); + } + $.info(`当前等级:${level}`); + $.info(`当前成长:${score}`); + if (isTxspSvip){ + $.info(`SVIP到期时间:${svipEndTime}`); + } + $.info(`VIP到期时间:${endTime}`); + $.info(`--------- 结束 ---------\n`); + } + if (isTxSportsVip){ + $.info(`--- 腾讯体育VIP信息 ---`); + if (isTxSportsSvip){ + $.info(`当前是腾讯体育超级VIP`); + } else { + $.info(`当前是腾讯体育VIP`); + } + $.info(`当前等级:${txSportsLevel}`); + $.info(`当前成长:${txSportsScore}`); + if (isTxSportsSvip){ + $.info(`SVIP到期时间:${txSportsSvipEndTime}`); + } + $.info(`VIP到期时间:${txSportsEndTime}`); + $.info(`--------- 结束 ---------\n`); + } + if (isTxspVip){ + $.info(`---- 开始 腾讯视频签到 ----`); + if (isSkipTxspCheckIn){ + $.info(`当前设置为不进行腾讯视频签到,跳过`); + } else { + await readTxspTaskList(); + await waitRandom(1000, 2000); + if (month_received_score === month_limit){ + $.info(`本月活跃任务已满${month_limit}V力值,下个月再来哦`); + } else if (isTxspCheckIn){ + $.info(`今天已签到, 明日再来吧`); + } else { + await txspCheckIn(); + await waitRandom(1000, 2000); + } + } + $.info(`--------- 结束 ---------\n`); + } + if (isTxSportsVip){ + $.info(`---- 开始 腾讯体育签到 ----`); + await readTxSportsTaskList(); + await waitRandom(1000, 2000); + if (isTxSportsCheckIn){ + $.info(`今天已签到, 明日再来吧`); + } else { + await txSportsCheckIn(); + await waitRandom(1000, 2000); + } + $.info(`--------- 结束 ---------\n`); + $.info(`---- 开始 领取每日球票 ----`); + await getDayTicket(); + await waitRandom(1000, 2000); + $.info(`--------- 结束 ---------\n`); + $.info(`---- 开始 领取每月球票 ----`); + var today = new Date(); + var date = today.getDate(); + if (date !== dayOfGetMonthTicket){ + $.info(`目标日期:${dayOfGetMonthTicket}号`); + $.info(`今天是${date}号`); + $.info(`跳过`); + } else { + $.info(`目标日期:${dayOfGetMonthTicket}号`); + $.info(`今天是${date}号`); + await getMonthTicket(); + } + $.info(`--------- 结束 ---------\n`); + if (isLottery) { + $.info(`---- 开始 抽抽乐 ----`); + await lottery(); + await waitRandom(1000, 2000); + $.info(`--------- 结束 ---------`); + } + } + await SendMsg(); + })() + .catch((e) => $.error(e)) + .finally(() => $.done()); +} + +async function refresh_vusession() { + return new Promise((resolve) => { + let opt = { + url: `https://pbaccess.video.qq.com/trpc.video_account_login.web_login_trpc.WebLoginTrpc/NewRefresh`, + headers: { + cookie: txspRefreshCookie, + origin: 'https://v.qq.com', + referer: 'https://v.qq.com/', + 'Content-Type': 'application/json' + }, + body: txspRefreshBody + }; + $.post(opt, async (error, resp, data) => { + if (safeGet(data)) { + var obj = JSON.parse(data); + if (obj.data.errcode === 0) { + let vqq_vusession = obj.data.vusession; + nickname = decodeURIComponent(obj.data.nick); + if (txspCookie.match(/main_login=([^;]*)/)[1] === "qq"){ + txspCookie = txspCookie.replace(/(vqq_vusession=)[^;]*/, `$1${vqq_vusession}`); + } else if(txspCookie.match(/main_login=([^;]*)/)[1] === "wx"){ + txspCookie = txspCookie.replace(/(vusession=)[^;]*/, `$1${vusession}`); + } + $.info("刷新vusession成功") + } else { + $.warn("刷新vusession失败"); + } + resolve(); + } + } + ) + }) +} + +async function getVipInfo() { + return new Promise((resolve, reject) => { + let opt = { + url: `https://vip.video.qq.com/rpc/trpc.query_vipinfo.vipinfo.QueryVipInfo/GetVipUserInfoH5`, + headers: { + cookie: txspCookie, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({"geticon":1,"viptype":"svip|sports|nfl","platform":5}) + }; + $.post(opt, async (error, resp, data) => { + try { + if (safeGet(data)) { + var obj = JSON.parse(data); + if (!obj.servicetype) { + throw new Error(`Cookie已失效`); + } else { + if (obj.vip === 1){ + isTxspVip = true; + endTime = obj.endTime; + level = obj.level; + score = obj.score; + } + if (obj.svip_info.vip === 1){ + isTxspSvip = true; + svipEndTime = obj.svip_info.endTime; + } + if (obj.sports.vip.vip === 1){ + isTxSportsVip = true; + txSportsEndTime = obj.sports.vip.endTime; + txSportsLevel = obj.sports.vip.level; + txSportsScore = obj.sports.vip.score; + } + if (obj.sports.svip.vip === 1){ + isTxSportsSvip = true; + txSportsSvipEndTime = obj.sports.svip.endTime; + } + } + resolve(); + } + } catch (e) { + $.error(e); + reject(`该账号本次跳过执行\n`); + } + } + ) + }) +} + +/** + * 获取腾讯视频任务列表 + * @async + * @function readTxspTaskList + * @returns + */ +async function readTxspTaskList() { + return new Promise((resolve) => { + let opt = { + url: `https://vip.video.qq.com/rpc/trpc.new_task_system.task_system.TaskSystem/ReadTaskList?rpc_data={"business_id":"1","platform":5}`, + headers: { + Referer: "https://film.video.qq.com/x/grade/?ptag=user.apho&ovscroll=0&hidetitlebar=1&aid=V0$$1:0$2:7$3:8.11.01.25068$4:0$8:4&isDarkMode=1&uiType=REGULAR", + Cookie: txspCookie, + }, + }; + $.get(opt, async (error, resp, data) => { + try { + if (safeGet(data)) { + var obj = JSON.parse(data); + var code = obj.ret; + let task_maintitle = ""; + if (code === 0) { + month_received_score = obj.limit_info.month_received_score; + month_limit = obj.limit_info.month_limit; + let taskList = obj.task_list; + let txspCheckInTask = taskList && taskList.find(task => task.task_maintitle === "VIP会员每日签到"); + isTxspCheckIn = txspCheckInTask.task_status; + } else { + $.warn(`获取腾讯视频任务列表失败,异常详细信息如下\n${data}`); + } + resolve(); + } + } catch (e) { + $.error(e); + } + }); + }); +} + +/** + * 腾讯视频签到领取V力值 + * @async + * @function txspCheckIn + * @returns + */ +async function txspCheckIn() { + return new Promise((resolve, reject) => { + let opt = { + url: `https://vip.video.qq.com/rpc/trpc.new_task_system.task_system.TaskSystem/CheckIn?rpc_data={}`, + headers: { + Referer: "https://film.video.qq.com/x/grade/?ptag=user.apho&ovscroll=0&hidetitlebar=1&aid=V0$$1:0$2:7$3:8.11.01.25068$4:0$8:4&isDarkMode=1&uiType=REGULAR", + Cookie: txspCookie, + }, + }; + $.get(opt, async (error, resp, data) => { + var obj = JSON.parse(data); + var code = obj.ret; + if (code === 0 && obj.check_in_score != undefined) { + $.info(`签到成功:获得${obj.check_in_score}V力值`); + $.taskInfo = `签到成功:获得${obj.check_in_score}V力值\n`; + } else if (code === -2002) { + $.info(`今天已签到, 明日再来吧`); + $.taskInfo = `今天已签到, 明日再来吧\n`; + } else { + $.warn(`签到失败,异常详细信息如下\n${data}`); + $.taskInfo = `签到失败, 异常详细信息请查看日志\n`; + } + resolve(); + }); + }); +} + +/** + * 获取腾讯体育任务列表 + * @async + * @function readTxSportsTaskList + * @returns + */ +async function readTxSportsTaskList() { + return new Promise((resolve) => { + let opt = { + url: `https://vip.video.qq.com/rpc/trpc.new_task_system.task_system.TaskSystem/ReadTaskList?rpc_data={"business_id":3,"channel_id":4,"platform":5}`, + headers: { + Referer: "https://film.video.qq.com/x/sports-grade/?ovscroll=0&hidetitlebar=1&immersive=1", + Cookie: txspCookie, + }, + }; + $.get(opt, async (error, resp, data) => { + try { + if (safeGet(data)) { + var obj = JSON.parse(data); + var code = obj.ret; + let task_maintitle = ""; + if (code === 0) { + let taskList = obj.task_list; + let txSportsCheckInTasks = taskList && taskList.find(task => task.task_maintitle === "每日签到"); + isTxSportsCheckIn = txSportsCheckInTasks.task_status; + } else { + $.warn(`获取腾讯视频任务列表失败,异常详细信息如下\n${data}`); + } + resolve(); + } + } catch (e) { + $.error(e); + } + }); + }); +} + +/** + * 腾讯体育签到领取热爱值 + * @async + * @function txSportsCheckIn + * @returns + */ +async function txSportsCheckIn() { + return new Promise((resolve, reject) => { + let opt = { + url: `https://vip.video.qq.com/rpc/trpc.new_task_system.task_system.TaskSystem/CheckIn?rpc_data={"task_id":8006}`, + headers: { + Referer: + "https://film.video.qq.com/x/sports-grade/?ovscroll=0&hidetitlebar=1&immersive=1", + Cookie: txspCookie, + }, + }; + $.get(opt, async (error, resp, data) => { + var obj = JSON.parse(data); + var code = obj.ret; + if (code === 0 && obj.check_in_score != undefined) { + $.info(`签到成功:获得${obj.check_in_score}热爱值`); + $.taskInfo += `签到成功:获得${obj.check_in_score}热爱值\n`; + } else if (code === -2002) { + $.info(`今天已签到, 明日再来吧`); + $.taskInfo += `今天已签到, 明日再来吧\n`; + } else { + $.warn(`签到失败,异常详细信息如下\n${data}`); + $.taskInfo += `签到失败, 异常详细信息请查看日志\n`; + } + resolve(); + }); + }); +} + +/** + * 领取每日球票 + * @async + * @function getDayTicket + * @returns + */ +async function getDayTicket() { + return new Promise((resolve, reject) => { + let opt = { + url: "https://activity.video.qq.com/fcgi-bin/asyn_activity?otype=xjson&act_id=118561&module_id=158089&type=90&option=5", + headers: { + Origin: "https://film.video.qq.com", + Referer: "https://film.video.qq.com/x/sports-vip-channel/?from=tab", + Cookie: txspCookie, + }, + }; + $.get(opt, async (error, resp, data) => { + try { + var obj = JSON.parse(data); + var code = obj.ret; + if (code === 0) { + $.info(`领取每日球票成功`); + $.taskInfo += `领取每日球票成功\n`; + } else if (code === -2021) { + $.info(`每日球票已领取, 明日再来吧`); + $.taskInfo += `每日球票已领取, 明日再来吧\n`; + } else { + $.warn(`领取每日球票失败,异常详细信息如下\n${data}`); + $.taskInfo += `领取每日球票失败,异常详细信息请查看日志\n`; + } + } catch (e) { + $.error(e); + } finally { + resolve(); + } + }); + }); +} + +/** + * 领取每月球票 + * @async + * @function getMonthTicket + * @returns + */ +async function getMonthTicket() { + return new Promise((resolve, reject) => { + let opt = { + url: "https://activity.video.qq.com/fcgi-bin/asyn_activity?otype=xjson&act_id=118561&module_id=165163&type=100160&option=100", + headers: { + Origin: "https://film.video.qq.com", + Referer: "https://film.video.qq.com/x/sports-vip-channel/?from=tab", + Cookie: txspCookie, + }, + }; + $.get(opt, async (error, resp, data) => { + try { + var obj = JSON.parse(data); + var code = obj.ret; + if (code === 0) { + $.info(`领取每月球票成功`); + $.taskInfo += `领取每月球票成功\n`; + } else if (code === -903) { + $.info(`每月球票已领取,下个月再来哦`); + $.taskInfo += `每月球票已领取,下个月再来哦\n`; + } else { + $.warn(`领取每月球票失败,异常详细信息如下\n${data}`); + $.taskInfo += `领取每月球票失败,异常详细信息请查看日志\n`; + } + } catch (e) { + $.error(e); + } finally { + resolve(); + } + }); + }); +} + +/** + * 抽抽乐 2024年2月29日10点下线 + * @async + * @function lottery() + * @returns + */ +async function lottery() { + return new Promise((resolve, reject) => { + let opt = { + url: "https://activity.video.qq.com/fcgi-bin/asyn_activity?otype=xjson&act_id=118561&module_id=158090&type=100143&option=100", + headers: { + Origin: "https://film.video.qq.com", + Referer: "https://film.video.qq.com/x/sports-vip-channel/?from=tab", + Cookie: txspCookie, + }, + }; + $.get(opt, async (error, resp, data) => { + try { + var obj = JSON.parse(data); + var code = obj.ret; + if (code === 0) { + $.info(`抽奖成功: ${obj.lotter_ext}`); + } else if (code === -904) { + $.info(`今天已抽奖, 明日再来吧`); + } else { + $.warn(`抽奖失败,异常详细信息如下\n${data}`); + } + } catch (e) { + $.error(e); + } finally { + resolve(); + } + }); + }); +} + +function getCookie() { + if($request && $request.method !=`OPTIONS` && $request.url.match(/\/rpc\/trpc\.new_task_system\.task_system\.TaskSystem\/ReadTaskList/)){ + let txsp = $request.headers["Cookie"] || $request.headers["cookie"]; + if (txsp) { + if (typeof txspCookie === "undefined" || (txspCookie && txspCookie.length === 0)) { + $.setdata(txsp, "txspCookie"); + $.log(`Cookie: ${txsp}`); + $.msg($.name, "🎉 Cookie写入成功", "不用请自行关闭重写!"); + } else if (txsp !== txspCookie) { + $.setdata(txsp, "txspCookie"); + $.log(`Cookie: ${txsp}`); + $.msg($.name, "🎉 Cookie更新成功", "不用请自行关闭重写!"); + } else { + $.msg($.name, "⚠️ Cookie未变动 跳过更新", "不用请自行关闭重写!"); + } + } else { + $.msg($.name, "⚠️ Cookie未找到", "不用请自行关闭重写!"); + } + } + if($request && $request.method !=`OPTIONS` && $request.url.match(/\/trpc\.videosearch\.hot_rank\.HotRankServantHttp\/HotRankHttp/)){ + let refreshCookie = $request.headers["Cookie"] || $request.headers["cookie"]; + if (refreshCookie) { + if (typeof txspRefreshCookie === "undefined" || (txspRefreshCookie && txspRefreshCookie.length === 0)) { + $.setdata(refreshCookie, "txspRefreshCookie"); + $.log(`Cookie: ${refreshCookie}`); + $.msg($.name, "🎉 refreshCookie写入成功", "不用请自行关闭重写!"); + } else if (refreshCookie !== txspRefreshCookie) { + $.setdata(refreshCookie, "txspRefreshCookie"); + $.log(`Cookie: ${refreshCookie}`); + $.msg($.name, "🎉 refreshCookie更新成功", "不用请自行关闭重写!"); + } else { + $.msg($.name, "⚠️ refreshCookie未变动 跳过更新", "不用请自行关闭重写!"); + } + } else { + $.msg($.name, "⚠️ refreshCookie未找到", "不用请自行关闭重写!"); + } + } + if($request && $request.method !=`OPTIONS` && $request.url.match(/\/trpc\.video_account_login\.web_login_trpc\.WebLoginTrpc\/NewRefresh/)){ + let refreshBody = $request.body; + if (refreshBody){ + if (typeof txspRefreshBody === "undefined" || (txspRefreshBody && txspRefreshBody.length === 0)) { + $.setdata(refreshBody, "txspRefreshBody"); + $.log(`refreshBody: ${refreshBody}`); + $.msg($.name, "🎉 refreshBody写入成功", "不用请自行关闭重写!"); + } else if (refreshBody !== txspRefreshBody) { + $.setdata(refreshBody, "txspRefreshBody"); + $.log(`refreshBody: ${refreshBody}`); + $.msg($.name, "🎉 refreshBody更新成功", "不用请自行关闭重写!"); + } else { + $.msg($.name, "⚠️ refreshBody未变动 跳过更新", "不用请自行关闭重写!"); + } + } + } +} + +async function getNotice() { + return new Promise((resolve) => { + let opt = { + url: "https://raw.githubusercontent.com/3288588344/toulu/main/tl.json", + timeout: 10000, + }; + $.get(opt, async (error, resp, data) => { + try { + if (error) { + $.error("👾 获取TL库远程公告失败"); + resolve(); + } else { + if (data) { + var obj = JSON.parse(data); + $.log(obj.notice); + resolve(); + } + } + } catch (e) { + $.error(e); + resolve(); + } + }); + }); +} + +async function getVersion() { + const timeoutMs = 10000; + const opt = { + url: "https://github.wowyijiu.today/https://raw.githubusercontent.com/WowYiJiu/Personal/main/Script/tenvideo.js", + timeout: timeoutMs + }; + const data = await new Promise((resolve) => { + $.get(opt, (error, resp, data) => { + if (error) { + resolve("undefined"); + } else { + resolve(data); + } + }); + }); + + const versionInfo = data.match(/@version\s+(v\d+\.\d+\.\d+)/); + if (versionInfo) { + latestVersion = versionInfo[1]; + } else { + latestVersion = "undefined"; + } + return latestVersion; +} + +async function SendMsg() { + if (Notify > 0) { + if ($.isNode()) { + await notify.sendNotify($.name, `${$.version}\n\n${$.desc}`); + } else { + $.msg($.name, "", `${$.version}\n${$.taskInfo}`); + } + } else { + $.msg($.name, "", `${$.version}\n${$.taskInfo}`); + } +} + +async function waitRandom(min, max) { + var time = getRandomInt(min, max); + await $.wait(time); +} + +// 随机生成整数 +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +// 提取Cookie的指定字段 +function extractValues(str, keys) { + let results = keys.map((key) => + str.split("; ").find((s) => s.startsWith(key + "=")) + ); + return results.join(";"); +} + +// 判断时间戳是不是今天 +function isToday(timestamp) { + let date = new Date(timestamp); + let today = new Date(); + return ( + date.getDate() === today.getDate() && + date.getMonth() === today.getMonth() && + date.getFullYear() === today.getFullYear() + ); +} + +function safeGet(data) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } + } catch (e) { + $.error(e); + $.error(`腾讯视频访问数据为空,请检查Cookie是否有效`); + return false; + } +} + +// prettier-ignore +function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise(((e,i)=>{s.call(this,t,((t,s,o)=>{t?i(t):e(s)}))}))}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.logLevels={debug:0,info:1,warn:2,error:3},this.logLevelPrefixs={debug:" DEBUG",info:" INFO",warn:" WARN",error:" ERROR"},this.logLevel="info",this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.encoding="utf-8",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`🔔${this.name}, 开始!`)}getEnv(){return"undefined"!=typeof $environment&&$environment["surge-version"]?"Surge":"undefined"!=typeof $environment&&$environment["stash-version"]?"Stash":"undefined"!=typeof module&&module.exports?"Node.js":"undefined"!=typeof $task?"Quantumult X":"undefined"!=typeof $loon?"Loon":"undefined"!=typeof $rocket?"Shadowrocket":void 0}isNode(){return"Node.js"===this.getEnv()}isQuanX(){return"Quantumult X"===this.getEnv()}isSurge(){return"Surge"===this.getEnv()}isLoon(){return"Loon"===this.getEnv()}isShadowrocket(){return"Shadowrocket"===this.getEnv()}isStash(){return"Stash"===this.getEnv()}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null,...s){try{return JSON.stringify(t,...s)}catch{return e}}getjson(t,e){let s=e;if(this.getdata(t))try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise((e=>{this.get({url:t},((t,s,i)=>e(i)))}))}runScript(t,e){return new Promise((s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=e&&e.timeout?e.timeout:o;const[r,a]=i.split("@"),n={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":r,Accept:"*/*"},timeout:o};this.post(n,((t,e,i)=>s(i)))})).catch((t=>this.logErr(t)))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),o=JSON.stringify(this.data);s?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(e,o):this.fs.writeFileSync(t,o)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return s;return o}lodash_set(t,e,s){return Object(t)!==t||(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce(((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{}),t)[e[e.length-1]]=s),t}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),o=s?this.getval(s):"";if(o)try{const t=JSON.parse(o);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(e),r=this.getval(i),a=i?"null"===r?null:r||"{}":"{}";try{const e=JSON.parse(a);this.lodash_set(e,o,t),s=this.setval(JSON.stringify(e),i)}catch(e){const r={};this.lodash_set(r,o,t),s=this.setval(JSON.stringify(r),i)}}else s=this.setval(t,e);return s}getval(t){switch(this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":return $persistentStore.read(t);case"Quantumult X":return $prefs.valueForKey(t);case"Node.js":return this.data=this.loaddata(),this.data[t];default:return this.data&&this.data[t]||null}}setval(t,e){switch(this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":return $persistentStore.write(t,e);case"Quantumult X":return $prefs.setValueForKey(t,e);case"Node.js":return this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0;default:return this.data&&this.data[e]||null}}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.cookie&&void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar)))}get(t,e=(()=>{})){switch(t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"],delete t.headers["content-type"],delete t.headers["content-length"]),t.params&&(t.url+="?"+this.queryStr(t.params)),void 0===t.followRedirect||t.followRedirect||((this.isSurge()||this.isLoon())&&(t["auto-redirect"]=!1),this.isQuanX()&&(t.opts?t.opts.redirection=!1:t.opts={redirection:!1})),this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":default:this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,((t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status?s.status:s.statusCode,s.status=s.statusCode),e(t,s,i)}));break;case"Quantumult X":this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then((t=>{const{statusCode:s,statusCode:i,headers:o,body:r,bodyBytes:a}=t;e(null,{status:s,statusCode:i,headers:o,body:r,bodyBytes:a},r,a)}),(t=>e(t&&t.error||"UndefinedError")));break;case"Node.js":let s=require("iconv-lite");this.initGotEnv(t),this.got(t).on("redirect",((t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();s&&this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}})).then((t=>{const{statusCode:i,statusCode:o,headers:r,rawBody:a}=t,n=s.decode(a,this.encoding);e(null,{status:i,statusCode:o,headers:r,rawBody:a,body:n},n)}),(t=>{const{message:i,response:o}=t;e(i,o,o&&s.decode(o.rawBody,this.encoding))}));break}}post(t,e=(()=>{})){const s=t.method?t.method.toLocaleLowerCase():"post";switch(t.body&&t.headers&&!t.headers["Content-Type"]&&!t.headers["content-type"]&&(t.headers["content-type"]="application/x-www-form-urlencoded"),t.headers&&(delete t.headers["Content-Length"],delete t.headers["content-length"]),void 0===t.followRedirect||t.followRedirect||((this.isSurge()||this.isLoon())&&(t["auto-redirect"]=!1),this.isQuanX()&&(t.opts?t.opts.redirection=!1:t.opts={redirection:!1})),this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":default:this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient[s](t,((t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status?s.status:s.statusCode,s.status=s.statusCode),e(t,s,i)}));break;case"Quantumult X":t.method=s,this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then((t=>{const{statusCode:s,statusCode:i,headers:o,body:r,bodyBytes:a}=t;e(null,{status:s,statusCode:i,headers:o,body:r,bodyBytes:a},r,a)}),(t=>e(t&&t.error||"UndefinedError")));break;case"Node.js":let i=require("iconv-lite");this.initGotEnv(t);const{url:o,...r}=t;this.got[s](o,r).then((t=>{const{statusCode:s,statusCode:o,headers:r,rawBody:a}=t,n=i.decode(a,this.encoding);e(null,{status:s,statusCode:o,headers:r,rawBody:a,body:n},n)}),(t=>{const{message:s,response:o}=t;e(s,o,o&&i.decode(o.rawBody,this.encoding))}));break}}time(t,e=null){const s=e?new Date(e):new Date;let i={"M+":s.getMonth()+1,"d+":s.getDate(),"H+":s.getHours(),"m+":s.getMinutes(),"s+":s.getSeconds(),"q+":Math.floor((s.getMonth()+3)/3),S:s.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(s.getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in i)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?i[e]:("00"+i[e]).substr((""+i[e]).length)));return t}queryStr(t){let e="";for(const s in t){let i=t[s];null!=i&&""!==i&&("object"==typeof i&&(i=JSON.stringify(i)),e+=`${s}=${i}&`)}return e=e.substring(0,e.length-1),e}msg(e=t,s="",i="",o={}){const r=t=>{const{$open:e,$copy:s,$media:i,$mediaMime:o}=t;switch(typeof t){case void 0:return t;case"string":switch(this.getEnv()){case"Surge":case"Stash":default:return{url:t};case"Loon":case"Shadowrocket":return t;case"Quantumult X":return{"open-url":t};case"Node.js":return}case"object":switch(this.getEnv()){case"Surge":case"Stash":case"Shadowrocket":default:{const r={};let a=t.openUrl||t.url||t["open-url"]||e;a&&Object.assign(r,{action:"open-url",url:a});let n=t["update-pasteboard"]||t.updatePasteboard||s;if(n&&Object.assign(r,{action:"clipboard",text:n}),i){let t,e,s;if(i.startsWith("http"))t=i;else if(i.startsWith("data:")){const[t]=i.split(";"),[,o]=i.split(",");e=o,s=t.replace("data:","")}else{e=i,s=(t=>{const e={JVBERi0:"application/pdf",R0lGODdh:"image/gif",R0lGODlh:"image/gif",iVBORw0KGgo:"image/png","/9j/":"image/jpg"};for(var s in e)if(0===t.indexOf(s))return e[s];return null})(i)}Object.assign(r,{"media-url":t,"media-base64":e,"media-base64-mime":o??s})}return Object.assign(r,{"auto-dismiss":t["auto-dismiss"],sound:t.sound}),r}case"Loon":{const s={};let o=t.openUrl||t.url||t["open-url"]||e;o&&Object.assign(s,{openUrl:o});let r=t.mediaUrl||t["media-url"];return i?.startsWith("http")&&(r=i),r&&Object.assign(s,{mediaUrl:r}),console.log(JSON.stringify(s)),s}case"Quantumult X":{const o={};let r=t["open-url"]||t.url||t.openUrl||e;r&&Object.assign(o,{"open-url":r});let a=t["media-url"]||t.mediaUrl;i?.startsWith("http")&&(a=i),a&&Object.assign(o,{"media-url":a});let n=t["update-pasteboard"]||t.updatePasteboard||s;return n&&Object.assign(o,{"update-pasteboard":n}),console.log(JSON.stringify(o)),o}case"Node.js":return}default:return}};if(!this.isMute)switch(this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":default:$notification.post(e,s,i,r(o));break;case"Quantumult X":$notify(e,s,i,r(o));break;case"Node.js":break}if(!this.isMuteLog){let t=["","==============📣系统通知📣=============="];t.push(e),s&&t.push(s),i&&t.push(i),console.log(t.join("\n")),this.logs=this.logs.concat(t)}}debug(...t){this.logLevels[this.logLevel]<=this.logLevels.debug&&(t.length>0&&(this.logs=[...this.logs,...t]),console.log(`[${this.time('HH:mm:ss')}${this.logLevelPrefixs.debug}] ${t.map((t=>t??String(t))).join(this.logSeparator)}`))}info(...t){this.logLevels[this.logLevel]<=this.logLevels.info&&(t.length>0&&(this.logs=[...this.logs,...t]),console.log(`[${this.time('HH:mm:ss')}${this.logLevelPrefixs.info}] ${t.map((t=>t??String(t))).join(this.logSeparator)}`))}warn(...t){this.logLevels[this.logLevel]<=this.logLevels.warn&&(t.length>0&&(this.logs=[...this.logs,...t]),console.log(`[${this.time('HH:mm:ss')}${this.logLevelPrefixs.warn}] ${t.map((t=>t??String(t))).join(this.logSeparator)}`))}error(...t){this.logLevels[this.logLevel]<=this.logLevels.error&&(t.length>0&&(this.logs=[...this.logs,...t]),console.log(`[${this.time('HH:mm:ss')}${this.logLevelPrefixs.error}] ${t.map((t=>t??String(t))).join(this.logSeparator)}`))}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.map((t=>t??String(t))).join(this.logSeparator))}logErr(t,e){switch(this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":case"Quantumult X":default:this.log("",`❗️${this.name}, 错误!`,e,t);break;case"Node.js":this.log("",`❗️${this.name}, 错误!`,e,void 0!==t.message?t.message:t,t.stack);break}}wait(t){return new Promise((e=>setTimeout(e,t)))}done(t={}){const e=((new Date).getTime()-this.startTime)/1e3;switch(this.log("",`🔔${this.name}, 结束! 🕛 ${e} 秒`),this.log(),this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":case"Quantumult X":default:$done(t);break;case"Node.js":process.exit(1)}}}(t,e)} \ No newline at end of file