mirror of
https://github.com/PaiGramTeam/MibooGram.git
synced 2024-11-16 04:45:27 +00:00
✨ Add SignAgain
Job
This commit is contained in:
parent
f5d08becec
commit
df8cc8bea2
@ -85,7 +85,7 @@ class Sign(Plugin, BasePlugin):
|
|||||||
"callback": f"geetest_{int(time.time() * 1000)}",
|
"callback": f"geetest_{int(time.time() * 1000)}",
|
||||||
},
|
},
|
||||||
headers=header,
|
headers=header,
|
||||||
timeout=20,
|
timeout=30,
|
||||||
)
|
)
|
||||||
text = req.text
|
text = req.text
|
||||||
logger.debug(f"ajax 返回:{text}")
|
logger.debug(f"ajax 返回:{text}")
|
||||||
@ -94,6 +94,7 @@ class Sign(Plugin, BasePlugin):
|
|||||||
text = re.findall(r"^.*?\((\{.*?)\)$", text)[0]
|
text = re.findall(r"^.*?\((\{.*?)\)$", text)[0]
|
||||||
data = json.loads(text)
|
data = json.loads(text)
|
||||||
if "success" in data["status"] and "success" in data["data"]["result"]:
|
if "success" in data["status"] and "success" in data["data"]["result"]:
|
||||||
|
logger.info("签到 ajax 请求成功")
|
||||||
return {
|
return {
|
||||||
"x-rpc-challenge": challenge,
|
"x-rpc-challenge": challenge,
|
||||||
"x-rpc-validate": data["data"]["validate"],
|
"x-rpc-validate": data["data"]["validate"],
|
||||||
@ -101,8 +102,10 @@ class Sign(Plugin, BasePlugin):
|
|||||||
}
|
}
|
||||||
except JSONDecodeError:
|
except JSONDecodeError:
|
||||||
logger.warning("签到 ajax 请求 JSON 解析失败")
|
logger.warning("签到 ajax 请求 JSON 解析失败")
|
||||||
except TimeoutException:
|
except TimeoutException as exc:
|
||||||
logger.warning("签到 ajax 请求超时")
|
logger.warning("签到 ajax 请求超时")
|
||||||
|
if not config.pass_challenge_api:
|
||||||
|
raise exc
|
||||||
except (KeyError, IndexError):
|
except (KeyError, IndexError):
|
||||||
logger.warning("签到 ajax 请求数据错误")
|
logger.warning("签到 ajax 请求数据错误")
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
@ -123,28 +126,30 @@ class Sign(Plugin, BasePlugin):
|
|||||||
resp = await client.post(
|
resp = await client.post(
|
||||||
config.pass_challenge_api,
|
config.pass_challenge_api,
|
||||||
params=pass_challenge_params,
|
params=pass_challenge_params,
|
||||||
timeout=45,
|
timeout=60,
|
||||||
)
|
)
|
||||||
logger.info(f"签到请求返回:{resp.text}")
|
logger.debug(f"签到 recognize 请求返回:{resp.text}")
|
||||||
data = resp.json()
|
data = resp.json()
|
||||||
status = data.get("status")
|
status = data.get("status")
|
||||||
if status is not None and status != 0:
|
if status is not None and status != 0:
|
||||||
logger.error(f"签到请求解析错误:{data.get('msg')}")
|
logger.error(f"签到 recognize 请求解析错误:{data.get('msg')}")
|
||||||
if data.get("code", 0) != 0:
|
if data.get("code", 0) != 0:
|
||||||
raise RuntimeError
|
raise RuntimeError
|
||||||
|
logger.info("签到 recognize 请求 解析成功")
|
||||||
return {
|
return {
|
||||||
"x-rpc-challenge": data["data"]["challenge"],
|
"x-rpc-challenge": data["data"]["challenge"],
|
||||||
"x-rpc-validate": data["data"]["validate"],
|
"x-rpc-validate": data["data"]["validate"],
|
||||||
"x-rpc-seccode": f'{data["data"]["validate"]}|jordan',
|
"x-rpc-seccode": f'{data["data"]["validate"]}|jordan',
|
||||||
}
|
}
|
||||||
except JSONDecodeError:
|
except JSONDecodeError:
|
||||||
logger.warning("签到请求 JSON 解析失败")
|
logger.warning("签到 recognize 请求 JSON 解析失败")
|
||||||
except TimeoutException:
|
except TimeoutException as exc:
|
||||||
logger.warning("签到请求超时")
|
logger.warning("签到 recognize 请求超时")
|
||||||
|
raise exc
|
||||||
except KeyError:
|
except KeyError:
|
||||||
logger.warning("签到请求数据错误")
|
logger.warning("签到 recognize 请求数据错误")
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
logger.warning("签到请求失败")
|
logger.warning("签到 recognize 请求失败")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -183,6 +188,8 @@ class Sign(Plugin, BasePlugin):
|
|||||||
logger.warning(f"UID {client.uid} 签到失败,触发验证码风控")
|
logger.warning(f"UID {client.uid} 签到失败,触发验证码风控")
|
||||||
return f"UID {client.uid} 签到失败,触发验证码风控,请尝试重新签到。"
|
return f"UID {client.uid} 签到失败,触发验证码风控,请尝试重新签到。"
|
||||||
logger.info(f"UID {client.uid} 签到成功")
|
logger.info(f"UID {client.uid} 签到成功")
|
||||||
|
except TimeoutException:
|
||||||
|
return "签到失败了呜呜呜 ~ 服务器连接超时 服务器熟啦 ~ "
|
||||||
except AlreadyClaimed:
|
except AlreadyClaimed:
|
||||||
logger.info(f"UID {client.uid} 已经签到")
|
logger.info(f"UID {client.uid} 已经签到")
|
||||||
result = "今天旅行者已经签到过了~"
|
result = "今天旅行者已经签到过了~"
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import datetime
|
import datetime
|
||||||
|
import secrets
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from aiohttp import ClientConnectorError
|
from aiohttp import ClientConnectorError
|
||||||
from genshin import Game, GenshinException, AlreadyClaimed, InvalidCookies
|
from genshin import Game, GenshinException, AlreadyClaimed, InvalidCookies
|
||||||
|
from httpx import TimeoutException
|
||||||
from telegram.constants import ParseMode
|
from telegram.constants import ParseMode
|
||||||
from telegram.error import BadRequest, Forbidden
|
from telegram.error import BadRequest, Forbidden
|
||||||
from telegram.ext import CallbackContext
|
from telegram.ext import CallbackContext
|
||||||
@ -32,6 +34,7 @@ class SignJob(Plugin):
|
|||||||
self.sign_service = sign_service
|
self.sign_service = sign_service
|
||||||
self.cookies_service = cookies_service
|
self.cookies_service = cookies_service
|
||||||
self.user_service = user_service
|
self.user_service = user_service
|
||||||
|
self.random = secrets.SystemRandom()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def single_sign(user_id: int) -> str:
|
async def single_sign(user_id: int) -> str:
|
||||||
@ -82,12 +85,19 @@ class SignJob(Plugin):
|
|||||||
|
|
||||||
@job.run_daily(time=datetime.time(hour=0, minute=1, second=0), name="SignJob")
|
@job.run_daily(time=datetime.time(hour=0, minute=1, second=0), name="SignJob")
|
||||||
async def sign(self, context: CallbackContext):
|
async def sign(self, context: CallbackContext):
|
||||||
logger.info("正在执行自动签到")
|
if context.job.name == "SignJob":
|
||||||
|
logger.info("正在执行自动签到")
|
||||||
|
if context.job.name == "SignAgainJob":
|
||||||
|
logger.info("正在执行自动重签")
|
||||||
sign_list = await self.sign_service.get_all()
|
sign_list = await self.sign_service.get_all()
|
||||||
for sign_db in sign_list:
|
for sign_db in sign_list:
|
||||||
if sign_db.status != SignStatusEnum.STATUS_SUCCESS:
|
|
||||||
continue
|
|
||||||
user_id = sign_db.user_id
|
user_id = sign_db.user_id
|
||||||
|
if sign_db.status != SignStatusEnum.STATUS_SUCCESS:
|
||||||
|
if sign_db.status == SignStatusEnum.TIMEOUT_ERROR:
|
||||||
|
if context.job.name == "SignAgainJob":
|
||||||
|
logger.info(f"用户 [{user_id}] 即将执行重签")
|
||||||
|
else:
|
||||||
|
continue
|
||||||
try:
|
try:
|
||||||
text = await self.single_sign(user_id)
|
text = await self.single_sign(user_id)
|
||||||
except InvalidCookies:
|
except InvalidCookies:
|
||||||
@ -99,9 +109,13 @@ class SignJob(Plugin):
|
|||||||
except GenshinException as exc:
|
except GenshinException as exc:
|
||||||
text = f"自动签到执行失败,API返回信息为 {str(exc)}"
|
text = f"自动签到执行失败,API返回信息为 {str(exc)}"
|
||||||
sign_db.status = SignStatusEnum.GENSHIN_EXCEPTION
|
sign_db.status = SignStatusEnum.GENSHIN_EXCEPTION
|
||||||
except ClientConnectorError:
|
except TimeoutException:
|
||||||
text = "签到失败了呜呜呜 ~ 服务器连接超时 服务器熟啦 ~ "
|
text = "签到失败了呜呜呜 ~ 服务器连接超时 服务器熟啦 ~ "
|
||||||
sign_db.status = SignStatusEnum.TIMEOUT_ERROR
|
sign_db.status = SignStatusEnum.TIMEOUT_ERROR
|
||||||
|
except ClientConnectorError as exc:
|
||||||
|
logger.warning(f"aiohttp 请求错误 {repr(exc)}")
|
||||||
|
text = "签到失败了呜呜呜 ~ 链接服务器发生错误 服务器熟啦 ~ "
|
||||||
|
sign_db.status = SignStatusEnum.TIMEOUT_ERROR
|
||||||
except NeedChallenge:
|
except NeedChallenge:
|
||||||
text = "签到失败,触发验证码风控,自动签到自动关闭"
|
text = "签到失败,触发验证码风控,自动签到自动关闭"
|
||||||
sign_db.status = SignStatusEnum.NEED_CHALLENGE
|
sign_db.status = SignStatusEnum.NEED_CHALLENGE
|
||||||
@ -113,7 +127,7 @@ class SignJob(Plugin):
|
|||||||
text = f'<a href="tg://user?id={sign_db.user_id}">NOTICE {sign_db.user_id}</a>\n\n{text}'
|
text = f'<a href="tg://user?id={sign_db.user_id}">NOTICE {sign_db.user_id}</a>\n\n{text}'
|
||||||
try:
|
try:
|
||||||
await context.bot.send_message(sign_db.chat_id, text, parse_mode=ParseMode.HTML)
|
await context.bot.send_message(sign_db.chat_id, text, parse_mode=ParseMode.HTML)
|
||||||
await asyncio.sleep(5) # 回复延迟5S避免触发洪水防御
|
await asyncio.sleep(10 + self.random.random() * 50) # 回复延迟 [10, 60) 避免触发洪水防御
|
||||||
except BadRequest as exc:
|
except BadRequest as exc:
|
||||||
logger.error(f"执行自动签到时发生错误 用户UID[{user_id}]")
|
logger.error(f"执行自动签到时发生错误 用户UID[{user_id}]")
|
||||||
logger.exception(exc)
|
logger.exception(exc)
|
||||||
@ -129,3 +143,5 @@ class SignJob(Plugin):
|
|||||||
sign_db.time_updated = datetime.datetime.now()
|
sign_db.time_updated = datetime.datetime.now()
|
||||||
await self.sign_service.update(sign_db)
|
await self.sign_service.update(sign_db)
|
||||||
logger.info("执行自动签到完成")
|
logger.info("执行自动签到完成")
|
||||||
|
if context.job.name == "SignJob":
|
||||||
|
context.job_queue.run_once(self.sign, when=datetime.time(hour=0, minute=1, second=0), name="SignAgainJob")
|
||||||
|
Loading…
Reference in New Issue
Block a user