Add files via upload

This commit is contained in:
hlt1995 authored and GitHub committed 2025-09-06 18:53:31 +08:00
1 parent 97ad676337
commit ba721d28bf
5 files changed
+2046

No files matched your search

+1733
View File
File diff suppressed because it is too large. Load diff
+245
View File
@@ -0,0 +1,245 @@
# -*- coding=UTF-8 -*-
# @Project QL_TimingScript
# @fileName tclx.py
# @author Echo
# @EditTime 2025/3/14
# cron: 0 0 9 * * *
# const $ = new Env('同程旅游');
"""
开启抓包,进入app 进入‘领福利’界面,点击签到,查看https://app.17u.cn/welfarecenter/index/signIndex请求头
提取变量: apptoken、device
变量格式: phone#apptoken#device,多个账号用@隔开
"""
import asyncio
import time
from datetime import datetime
import httpx
from fn_print import fn_print
from get_env import get_env
#from sendNotify import send_notification_message_collection
tc_cookies = get_env("tc_cookie", "@")
class Tclx:
def __init__(self, cookie):
self.client = httpx.AsyncClient(base_url="https://app.17u.cn/welfarecenter",
verify=False,
timeout=60)
self.phone = cookie.split("#")[0]
self.apptoken = cookie.split("#")[1]
self.device = cookie.split("#")[2]
self.headers = {
'accept': 'application/json, text/plain, */*',
'phone': self.phone,
'channel': '1',
'apptoken': self.apptoken,
'sec-fetch-site': 'same-site',
'accept-language': 'zh-CN,zh-Hans;q=0.9',
'accept-encoding': 'gzip, deflate, br',
'sec-fetch-mode': 'cors',
'origin': 'https://m.17u.cn',
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 TcTravel/11.0.0 tctype/wk',
'referer': 'https://m.17u.cn/',
# 'content-length': str(len(payload_str.encode('utf-8'))),
'device': self.device,
'sec-fetch-dest': 'empty'
}
@staticmethod
async def get_today_date():
return datetime.now().strftime('%Y-%m-%d')
async def sign_in(self):
try:
response = await self.client.post(
url="/index/signIndex",
headers=self.headers,
json={}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - token失效了,请更新")
return None
else:
today_sign = data['data']['todaySign']
mileage = data['data']['mileageBalance']['mileage']
fn_print(f"用户【{self.phone}】 - 今日{'已' if today_sign else '未'}签到,当前剩余里程{mileage}!")
return today_sign
except Exception as e:
fn_print(f"用户【{self.phone}】 - 签到请求异常!{e}")
fn_print(response.text)
return None
async def do_sign_in(self):
today_date = await self.get_today_date()
try:
response = await self.client.post(
url="/index/sign",
headers=self.headers,
json={"type": 1, "day": today_date}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 签到失败了,尝试获取任务列表")
return False
else:
fn_print(f"用户【{self.phone}】 - 签到成功!开始获取任务列表")
return True
except Exception as e:
fn_print(f"用户【{self.phone}】 - 执行签到请求异常!{e}")
fn_print(response.text)
return False
async def get_task_list(self):
try:
response = await self.client.post(
url="/task/taskList?version=11.0.7",
headers=self.headers,
json={}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 获取任务列表失败了")
return None
else:
tasks = []
for task in data['data']:
if task['state'] == 1 and task['browserTime'] != 0:
tasks.append(
{
'taskCode': task['taskCode'],
'title': task['title'],
'browserTime': task['browserTime']
}
)
return tasks
except Exception as e:
fn_print(f"用户【{self.phone}】 - 获取任务列表请求异常!{e}")
fn_print(response.text)
return None
async def perform_tasks(self, task_code):
try:
response = await self.client.post(
url="/task/start",
headers=self.headers,
json={"taskCode": task_code}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 执行任务【{task_code}】失败了,跳过当前任务")
return None
else:
task_id = data['data']
return task_id
except Exception as e:
fn_print(f"用户【{self.phone}】 - 执行任务【{task_code}】请求异常!{e}")
fn_print(response.text)
return None
async def finsh_task(self, task_id):
max_retry = 3 # 最大重试次数
retry_delay = 2 # 重试间隔时间(秒)
for attempt in range(max_retry):
try:
response = await self.client.post(
url="/task/finish",
headers=self.headers,
json={"id": task_id}
)
data = response.json()
if data['code'] == 2200:
fn_print(f"用户【{self.phone}】 - 完成任务【{task_id}】成功!开始领取奖励")
return True
if attempt < max_retry - 1:
fn_print(f"用户【{self.phone}】 - 完成任务【{task_id}】失败了,尝试重新提交(第{attempt + 1}次重试。。)")
await asyncio.sleep(retry_delay * (attempt + 1))
continue
fn_print(f"用户【{self.phone}】 - 完成任务【{task_id}】最终失败,跳过当前任务")
return False
except Exception as e:
error_msg = f"用户【{self.phone}】 - 完成任务【{task_id}】请求异常!{e}"
if 'response' in locals():
error_msg += f"\n{response.text}"
fn_print(error_msg)
if attempt == max_retry - 1:
return False
await asyncio.sleep(retry_delay * (attempt + 1))
async def receive_reward(self, task_id):
try:
response = await self.client.post(
url="/task/receive",
headers=self.headers,
json={"id": task_id}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 领取签到奖励失败了, 请尝试手动领取")
else:
fn_print(f"用户【{self.phone}】 - 领取签到奖励成功!开始下一个任务")
except Exception as e:
fn_print(f"用户【{self.phone}】 - 领取签到奖励请求异常!{e}")
fn_print(response.text)
async def get_mileage_info(self):
try:
response = await self.client.post(
url="/index/signIndex",
headers=self.headers,
json={}
)
data = response.json()
if data['code'] != 2200:
fn_print(f"用户【{self.phone}】 - 获取积分信息失败了")
return None
else:
cycle_sign_num = data['data']['cycleSighNum']
continuous_history = data['data']['continuousHistory']
mileage = data['data']['mileageBalance']['mileage']
today_mileage = data['data']['mileageBalance']['todayMileage']
fn_print(
f"用户【{self.phone}】 - 本月签到{cycle_sign_num}天,连续签到{continuous_history}天,今日共获取{today_mileage}里程,当前剩余里程{mileage}")
except Exception as e:
fn_print(f"用户【{self.phone}】 - 获取积分信息请求异常!{e}")
fn_print(response.text)
return None
async def run(self):
today_sign = await self.sign_in()
if today_sign is None:
return
if today_sign:
fn_print(f"用户【{self.phone}】 - 今日已签到,开始获取任务列表")
else:
if await self.do_sign_in():
fn_print(f"用户【{self.phone}】 - 签到成功,开始获取任务列表")
tasks = await self.get_task_list()
if tasks:
for task in tasks:
task_code = task['taskCode']
title = task['title']
browser_time = task['browserTime']
fn_print(f"用户【{self.phone}】 - 开始做任务【{title}】,需要浏览{browser_time}秒")
task_id = await self.perform_tasks(task_code)
if task_id:
await asyncio.sleep(browser_time)
if await self.finsh_task(task_id):
await self.receive_reward(task_id)
await self.get_mileage_info()
async def main():
tasks = []
for cookie in tc_cookies:
tclx = Tclx(cookie)
tasks.append(tclx.run())
await asyncio.gather(*tasks)
if __name__ == '__main__':
asyncio.run(main())
send_notification_message_collection(f"同程旅行签到通知 - {datetime.now().strftime('%Y/%m/%d')}")
+22
View File
@@ -0,0 +1,22 @@
'''
在浏览器输入https://account.xiaomi.com/登入
然后获取cookie 找到passToken和userid即可
变量名 xmqb1
格式为"passToken=xxx;userId=xxx;"多账户新增环境变量
变量名 XMQB_KEY 卡密 关注公众号【极客快乐营】发送【小米钱包】获取KEY
'''
import os
keys = os.getenv("XMQB_KEY")
if keys == "":
str1 = '''
请填写KEY
关注公众号【极客快乐营】发送【小米钱包】获取KEY
公众号二维码:
https://free-img.400040.xyz/4/2025/06/30/686174d049215.png
'''
print(str1)
QLAPI.notify("请填写KEY", str1)
exit()
#!/usr/bin/env python3
import base64,zlib as _zlib;aukcmzjb="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 truncated
+23
View File
@@ -0,0 +1,23 @@
# -*- coding=UTF-8 -*-
# @Project QL_TimingScript
# @fileName fn_print.py
# @author Echo
# @EditTime 2024/9/24
from typing import *
all_print_list = []
def fn_print(*args, sep=' ', end='\n', **kwargs):
global all_print_list
output = ""
# 构建输出字符串
for index, arg in enumerate(args):
if index == len(args) - 1:
output += str(arg)
continue
output += str(arg) + sep
output = output + end
all_print_list.append(output)
# 调用内置的 print 函数打印字符串
print(*args, sep=sep, end=end, **kwargs)
+23
View File
@@ -0,0 +1,23 @@
# -*- coding=UTF-8 -*-
# @Project QL_TimingScript
# @fileName get_env.py
# @author Echo
# @EditTime 2024/11/26
import os
import re
from dotenv import load_dotenv, find_dotenv
from fn_print import fn_print
def get_env(env_var, separator):
if env_var in os.environ:
return re.split(separator, os.environ.get(env_var))
else:
load_dotenv(find_dotenv())
if env_var in os.environ:
return re.split(separator, os.environ.get(env_var))
else:
fn_print(f"未找到{env_var}变量.")
return []