Skip to content

Commit f85232e

Browse files
chore: 添加签到重试,仅每日签到获取token (#229)
* fix: 修复无法构建docker镜像的问题 * Update Dockerfile * 🔧 自动更新requirements * chore: 添加自动每日运行时间提示 * chore: 将时间类型从str改成int * Add files via upload * chore: 更新日志收集方法 * chore: 遵守代码规范 * chore: update issue templates * chore: 删除测试代码 * chore: 更改日志输出样式 * chore: docker生成配置时随机生成自动运行时间 * chore: trailing-whitespace * chore: 日志添加换行 * chore: 未配置验证码解决方案时直接跳过 * chore: 使用遍历方法找到键值,提升泛用性 * chore: 使用cron执行自动任务 * chore: snake_case * chore: 修改运行时间 * Update config.py * chore: 添加签到重试,仅每日签到获取token * 🔧 自动更新requirements * chore: 更新版本号 * Update config.py --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 6f5bc44 commit f85232e

7 files changed

Lines changed: 94 additions & 74 deletions

File tree

miuitask.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
'''
22
Date: 2023-11-13 20:29:19
33
LastEditors: Night-stars-1 nujj1042633805@gmail.com
4-
LastEditTime: 2023-11-24 16:23:43
4+
LastEditTime: 2023-12-03 01:53:48
55
'''
66
# new Env("MIUI-Auto-Task") # pylint: disable=missing-module-docstring
77
# cron 30 8 * * * miuitask.py
88

99
import asyncio
1010

1111
from utils.api.login import Login
12-
from utils.api.sign import BaseSign
12+
from utils.api.sign import BaseSign, CheckIn
1313
from utils.config import ConfigManager
1414
from utils.logger import InterceptHandler, log
1515
from utils.request import notify_me
@@ -25,7 +25,6 @@ async def main():
2525
for account in _conf.accounts:
2626
login_obj = Login(account)
2727
if cookies := await login_obj.login():
28-
token = await get_token(cookies["cUserId"])
2928
sign_obj = BaseSign(cookies)
3029
daily_tasks = await sign_obj.check_daily_tasks()
3130
sign_task_obj = sign_obj.AVAILABLE_SIGNS # 签到任务对象合集
@@ -34,6 +33,7 @@ async def main():
3433
log.info(f"开始执行{task.name}任务")
3534
if task_obj := sign_task_obj.get(task.name): # 签到任务对象
3635
if getattr(account, task_obj.__name__):
36+
token = await get_token(cookies["cUserId"]) if task_obj == CheckIn else None
3737
await task_obj(cookies, token).sign()
3838
else:
3939
log.info(f"任务{task.name}被禁用")

pdm.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ version = ""
44
description = ""
55
authors = []
66
dependencies = [
7-
"onepush",
87
"orjson>=3.9.10",
98
"loguru>=0.7.2",
109
"pydantic>=2.4.2",
@@ -13,6 +12,7 @@ dependencies = [
1312
"pyyaml>=6.0.1",
1413
"tenacity>=8.2.3",
1514
"tzdata>=2023.3",
15+
"onepush @ git+https://github.com/y1ndan/onepush.git@main",
1616
]
1717
requires-python = ">=3.11"
1818
license = {text = "MIT"}

requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
cryptography==41.0.6
2-
httpx==0.25.1
1+
cryptography==41.0.7
2+
httpx==0.25.2
33
loguru==0.7.2
44
onepush==1.3.0
55
orjson==3.9.10

utils/api/sign.py

Lines changed: 62 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import time
44

55
from typing import Dict, List, Optional, Type, Union, Any
6+
from tenacity import RetryError, Retrying, stop_after_attempt
67

78
from ..data_model import ApiResultHandler, DailyTasksResult, SignResultHandler
89
from ..request import get, post
910
from ..logger import log
11+
from ..utils import is_incorrect_return
1012

1113

1214
class BaseSign:
@@ -37,28 +39,32 @@ def __init__(self, cookie: Dict, token: Optional[str] = None):
3739
async def check_daily_tasks(self, nolog: bool = False) -> Union[List[DailyTasksResult], List[None]]:
3840
"""获取每日任务状态"""
3941
try:
40-
response = await get('https://api.vip.miui.com/mtop/planet/vip/member/getCheckinPageCakeList',
41-
cookies=self.cookie)
42-
log.debug(response.text)
43-
result = response.json()
44-
api_data = ApiResultHandler(result)
45-
if api_data.success:
46-
task_status = []
47-
tasks: List[Dict[str, List[Dict[str, Any]]]] = list(filter(
48-
lambda x: x['head']['title'] in ["每日任务", "其他任务"], api_data.data))
49-
for task in tasks:
50-
for daily_task in task['data']:
51-
task_name = daily_task['title']
52-
task_desc = daily_task.get('desc', '')
53-
show_type = True if daily_task['showType'] == 0 else False # pylint: disable=simplifiable-if-expression
54-
task_status.append(DailyTasksResult(name=task_name, showType=show_type, desc=task_desc))
55-
return task_status
42+
for attempt in Retrying(stop=stop_after_attempt(3)):
43+
with attempt:
44+
response = await get('https://api.vip.miui.com/mtop/planet/vip/member/getCheckinPageCakeList',
45+
cookies=self.cookie)
46+
log.debug(response.text)
47+
result = response.json()
48+
api_data = ApiResultHandler(result)
49+
if api_data.success:
50+
task_status = []
51+
tasks: List[Dict[str, List[Dict[str, Any]]]] = list(filter(
52+
lambda x: x['head']['title'] in ["每日任务", "其他任务"], api_data.data))
53+
for task in tasks:
54+
for daily_task in task['data']:
55+
task_name = daily_task['title']
56+
task_desc = daily_task.get('desc', '')
57+
show_type = True if daily_task['showType'] == 0 else False # pylint: disable=simplifiable-if-expression
58+
task_status.append(DailyTasksResult(name=task_name, showType=show_type, desc=task_desc))
59+
return task_status
60+
else:
61+
if not nolog:
62+
log.error(f"获取每日任务状态失败:{api_data.message}")
63+
return []
64+
except RetryError as error:
65+
if is_incorrect_return(error):
66+
log.exception(f"每日任务 - 服务器没有正确返回 {response.text}")
5667
else:
57-
if not nolog:
58-
log.error(f"获取每日任务状态失败:{api_data.message}")
59-
return []
60-
except Exception: # pylint: disable=broad-exception-caught
61-
if not nolog:
6268
log.exception("获取每日任务异常")
6369
return []
6470

@@ -67,40 +73,44 @@ async def sign(self) -> bool:
6773
每日任务处理器
6874
"""
6975
try:
70-
params = self.PARAMS.copy()
71-
params['miui_vip_ph'] = self.cookie['miui_vip_ph'] if 'miui_vip_ph' in self.cookie else params
72-
params['token'] = self.token if 'token' in params else params
73-
data = self.DATA.copy()
74-
data['miui_vip_ph'] = self.cookie['miui_vip_ph'] if 'miui_vip_ph' in self.cookie else data
75-
if 'token' in data:
76-
if self.token:
77-
data['token'] = self.token
78-
else:
79-
log.info(f"未获取到token, 跳过{self.NAME}")
80-
return False
81-
response = await post(self.URL_SIGN,
82-
params=params, data=data,
83-
cookies=self.cookie, headers=self.headers)
84-
log.debug(response.text)
85-
result = response.json()
86-
api_data = SignResultHandler(result)
87-
if api_data:
88-
if api_data.growth:
89-
log.success(f"{self.NAME}结果: 成长值+{api_data.growth}")
90-
else:
91-
log.success(f"{self.NAME}结果: {api_data.message}")
92-
return True
93-
elif api_data.ck_invalid:
94-
log.error(f"{self.NAME}失败: Cookie无效")
95-
return False
76+
for attempt in Retrying(stop=stop_after_attempt(3)):
77+
with attempt:
78+
params = self.PARAMS.copy()
79+
params['miui_vip_ph'] = self.cookie['miui_vip_ph'] if 'miui_vip_ph' in self.cookie else params
80+
params['token'] = self.token if 'token' in params else params
81+
data = self.DATA.copy()
82+
data['miui_vip_ph'] = self.cookie['miui_vip_ph'] if 'miui_vip_ph' in self.cookie else data
83+
if 'token' in data:
84+
if self.token:
85+
data['token'] = self.token
86+
else:
87+
log.info(f"未获取到token, 跳过{self.NAME}")
88+
return False
89+
response = await post(self.URL_SIGN,
90+
params=params, data=data,
91+
cookies=self.cookie, headers=self.headers)
92+
log.debug(response.text)
93+
result = response.json()
94+
api_data = SignResultHandler(result)
95+
if api_data:
96+
if api_data.growth:
97+
log.success(f"{self.NAME}结果: 成长值+{api_data.growth}")
98+
else:
99+
log.success(f"{self.NAME}结果: {api_data.message}")
100+
return True
101+
elif api_data.ck_invalid:
102+
log.error(f"{self.NAME}失败: Cookie无效")
103+
return False
104+
else:
105+
log.error(f"{self.NAME}失败:{api_data.message}")
106+
return False
107+
except RetryError as error:
108+
if is_incorrect_return(error):
109+
log.exception(f"{self.NAME} - 服务器没有正确返回 {response.text}")
96110
else:
97-
log.error(f"{self.NAME}失败:{api_data.message}")
98-
return False
99-
except Exception: # pylint: disable=broad-exception-caught
100-
log.exception(f"{self.NAME}出错")
111+
log.exception("{self.NAME}出错")
101112
return False
102113

103-
104114
class CheckIn(BaseSign):
105115
"""
106116
每日签到

utils/config.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
from pathlib import Path
77
from typing import Dict, List, Optional, Union
88

9-
import yaml
10-
from pydantic import BaseModel
11-
from pydantic import ValidationError, field_validator
9+
import orjson
10+
import yaml # pylint: disable=wrong-import-order
11+
from pydantic import BaseModel, ValidationError, field_validator
1212

1313
from .logger import log
1414

@@ -17,7 +17,10 @@
1717
DATA_PATH = ROOT_PATH / "data"
1818
"""数据保存目录"""
1919

20-
CONFIG_PATH = DATA_PATH / "config.yaml" if os.getenv("MIUITASK_CONFIG_PATH") is None else Path(os.getenv("MIUITASK_CONFIG_PATH"))
20+
CONFIG_TYPE = "json" if os.path.isfile(DATA_PATH / "config.json") else "yaml"
21+
"""数据文件类型"""
22+
23+
CONFIG_PATH = DATA_PATH / f"config.{CONFIG_TYPE}" if os.getenv("MIUITASK_CONFIG_PATH") is None else Path(os.getenv("MIUITASK_CONFIG_PATH"))
2124
"""数据文件默认路径"""
2225

2326
os.makedirs(DATA_PATH, exist_ok=True)
@@ -128,14 +131,18 @@ def write_plugin_data(data: Config = None):
128131
if data is None:
129132
data = ConfigManager.data_obj
130133
try:
131-
# str_data = orjson.dumps(data.dict(), option=orjson.OPT_PASSTHROUGH_DATETIME | orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_INDENT_2)
132-
str_data = yaml.dump(data.model_dump(), indent=4, allow_unicode=True, sort_keys=False)
134+
if CONFIG_TYPE == "json":
135+
str_data = orjson.dumps(data.model_dump(), option=orjson.OPT_PASSTHROUGH_DATETIME | orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_INDENT_2)
136+
with open(CONFIG_PATH, "wb") as file:
137+
file.write(str_data)
138+
else:
139+
str_data = yaml.dump(data.model_dump(), indent=4, allow_unicode=True, sort_keys=False)
140+
with open(CONFIG_PATH, "w", encoding="utf-8") as file:
141+
file.write(str_data)
142+
return True
133143
except (AttributeError, TypeError, ValueError):
134144
log.exception("数据对象序列化失败,可能是数据类型错误")
135145
return False
136-
with open(CONFIG_PATH, "w", encoding="utf-8") as file:
137-
file.write(str_data)
138-
return True
139146
except OSError:
140147
return False
141148

@@ -155,7 +162,10 @@ def load_config(cls):
155162
if os.path.exists(DATA_PATH) and os.path.isfile(CONFIG_PATH):
156163
try:
157164
with open(CONFIG_PATH, 'r', encoding="utf-8") as file:
158-
data = yaml.safe_load(file)
165+
if CONFIG_TYPE == "json":
166+
data = orjson.loads(file.read())
167+
else:
168+
data = yaml.safe_load(file)
159169
new_model = Config.model_validate(data)
160170
for attr in new_model.model_fields:
161171
# ConfigManager.data_obj.__setattr__(attr, new_model.__getattribute__(attr))

utils/system_info.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
def print_info():
1212
"""打印系统信息"""
13-
log.info("MIUI-AUTO-TASK v1.7.2")
13+
log.info("MIUI-AUTO-TASK v1.7.3")
1414
log.info('---------- 系统信息 -------------')
1515
system_info()
1616
log.info('---------- 项目信息 -------------')

0 commit comments

Comments
 (0)