加入新的推送消息,加入验证码重试机制

This commit is contained in:
Womsxd 2022-08-18 16:36:48 +08:00
parent 5ee3d20195
commit 53056ad4f0
No known key found for this signature in database
GPG Key ID: 0FE76418EE689B68
5 changed files with 54 additions and 19 deletions

View File

@ -4,3 +4,11 @@ class CookieError(Exception):
def __str__(self): def __str__(self):
return repr(self.info) return repr(self.info)
class CaptchaError(Exception):
def __init__(self, info):
self.info = info
def __str__(self):
return repr(self.info)

View File

@ -3,17 +3,18 @@ import tools
import config import config
import random import random
import setting import setting
from error import *
from request import http from request import http
from loghelper import log from loghelper import log
from error import CookieError
from account import get_account_list from account import get_account_list
class Genshin: class Genshin:
def __init__(self) -> None: def __init__(self) -> None:
self.headers = setting.headers self.headers = {}
self.headers.update(setting.headers)
self.headers['DS'] = tools.get_ds(web=True) self.headers['DS'] = tools.get_ds(web=True)
self.headers['Referer'] = 'https://webstatic.mihoyo.com/bbs/event/signin-ys/index.html?bbs_auth_required=true'\ self.headers['Referer'] = 'https://webstatic.mihoyo.com/bbs/event/signin-ys/index.html?bbs_auth_required=true' \
f'&act_id={setting.genshin_Act_id}&utm_source=bbs&utm_medium=mys&utm_campaign=icon' f'&act_id={setting.genshin_Act_id}&utm_source=bbs&utm_medium=mys&utm_campaign=icon'
self.headers['Cookie'] = config.config["account"]["cookie"] self.headers['Cookie'] = config.config["account"]["cookie"]
self.headers['x-rpc-device_id'] = tools.get_device_id() self.headers['x-rpc-device_id'] = tools.get_device_id()
@ -43,6 +44,17 @@ class Genshin:
raise CookieError("BBS Cookie Errror") raise CookieError("BBS Cookie Errror")
return data["data"] return data["data"]
def check_in(self, account):
for i in range(3):
req = http.post(url=setting.genshin_Signurl, headers=self.headers,
json={'act_id': setting.genshin_Act_id, 'region': account[2], 'uid': account[1]})
data = req.json()
if data["retcode"] == 0 and data["data"]["success"] == 1:
time.sleep(random.randint(4, 10))
else:
break
return req
# 签到 # 签到
def sign_account(self) -> str: def sign_account(self) -> str:
return_data = "原神: " return_data = "原神: "
@ -57,14 +69,13 @@ class Genshin:
log.warning(f"旅行者{i[0]}是第一次绑定米游社,请先手动签到一次") log.warning(f"旅行者{i[0]}是第一次绑定米游社,请先手动签到一次")
else: else:
sign_days = is_data["total_sign_day"] - 1 sign_days = is_data["total_sign_day"] - 1
ok = True ok = True
if is_data["is_sign"]: if not is_data["is_sign"]:
log.info(f"旅行者{i[0]}今天已经签到过了~\r\n今天获得的奖励是{tools.get_item(self.checkin_rewards[sign_days])}") log.info(f"旅行者{i[0]}今天已经签到过了~\r\n今天获得的奖励是{tools.get_item(self.checkin_rewards[sign_days])}")
sign_days += 1 sign_days += 1
else: else:
time.sleep(random.randint(2, 8)) time.sleep(random.randint(2, 8))
req = http.post(url=setting.genshin_Signurl, headers=self.headers, req = self.check_in(i)
json={'act_id': setting.genshin_Act_id, 'region': i[2], 'uid': i[1]})
data = req.json() data = req.json()
if data["retcode"] == 0 and data["data"]["success"] == 0: if data["retcode"] == 0 and data["data"]["success"] == 0:
log.info(f"旅行者{i[0]}签到成功~\r\n今天获得的奖励是" log.info(f"旅行者{i[0]}签到成功~\r\n今天获得的奖励是"
@ -74,12 +85,13 @@ class Genshin:
log.info(f"旅行者{i[0]}今天已经签到过了~\r\n今天获得的奖励是{tools.get_item(self.checkin_rewards[sign_days])}") log.info(f"旅行者{i[0]}今天已经签到过了~\r\n今天获得的奖励是{tools.get_item(self.checkin_rewards[sign_days])}")
else: else:
s = "账号签到失败!" s = "账号签到失败!"
if data["data"] != "" and data.get("data").get("success",-1): if data["data"] != "" and data.get("data").get("success", -1):
s += "原因: 验证码\njson信息:" + req.text s += "原因: 验证码\njson信息:" + req.text
log.warning(s) log.warning(s)
ok = False ok = False
if ok: if ok:
return_data += f"\n{i[0]}已连续签到{sign_days}\n今天获得的奖励是{tools.get_item(self.checkin_rewards[sign_days - 1])}" return_data += f"\n{i[0]}已连续签到{sign_days}\n" \
f"今天获得的奖励是{tools.get_item(self.checkin_rewards[sign_days - 1])}"
else: else:
return_data += f"\n{i[0]},本次签到失败" return_data += f"\n{i[0]},本次签到失败"
if data["data"] != "" and data["data"]["success"] == 1: if data["data"] != "" and data["data"]["success"] == 1:

10
main.py
View File

@ -9,8 +9,8 @@ import setting
import mihoyobbs import mihoyobbs
import honkai3rd import honkai3rd
import tearsofthemis import tearsofthemis
from error import *
from loghelper import log from loghelper import log
from error import CookieError
def main(): def main():
@ -38,6 +38,7 @@ def main():
if int(i["id"]) == 5: if int(i["id"]) == 5:
setting.mihoyobbs_List_Use.append(i) setting.mihoyobbs_List_Use.append(i)
# 米游社签到 # 米游社签到
ret_code = 0
if config.config["mihoyobbs"]["enable"]: if config.config["mihoyobbs"]["enable"]:
bbs = mihoyobbs.Mihoyobbs() bbs = mihoyobbs.Mihoyobbs()
if bbs.Task_do["bbs_Sign"] and bbs.Task_do["bbs_Read_posts"] and bbs.Task_do["bbs_Like_posts"] and \ if bbs.Task_do["bbs_Sign"] and bbs.Task_do["bbs_Read_posts"] and bbs.Task_do["bbs_Like_posts"] and \
@ -88,9 +89,12 @@ def main():
if config.config["games"]["cn"]["genshin"]["auto_checkin"]: if config.config["games"]["cn"]["genshin"]["auto_checkin"]:
log.info("正在进行原神签到") log.info("正在进行原神签到")
genshin_help = genshin.Genshin() genshin_help = genshin.Genshin()
return_data += "\n\n" + genshin_help.sign_account() genshin_message = genshin_help.sign_account()
if "触发验证码" in genshin_message:
ret_code = 3
return_data += "\n\n" + genshin_message
time.sleep(random.randint(2, 8)) time.sleep(random.randint(2, 8))
return 0, return_data return ret_code, return_data
elif config.config["account"]["cookie"] == "CookieError": elif config.config["account"]["cookie"] == "CookieError":
raise CookieError('Cookie expires') raise CookieError('Cookie expires')
else: else:

View File

@ -34,7 +34,7 @@ def main_multi(autorun: bool):
input("请输入回车继续需要重新搜索配置文件请Ctrl+C退出脚本") input("请输入回车继续需要重新搜索配置文件请Ctrl+C退出脚本")
except KeyboardInterrupt: except KeyboardInterrupt:
exit(0) exit(0)
results = {"ok": [], "close": [], "error": []} results = {"ok": [], "close": [], "error": [], "captcha": []}
for i in iter(config_list): for i in iter(config_list):
log.info(f"正在执行{i}") log.info(f"正在执行{i}")
setting.mihoyobbs_List_Use = [] setting.mihoyobbs_List_Use = []
@ -46,6 +46,8 @@ def main_multi(autorun: bool):
else: else:
if run_code == 0: if run_code == 0:
results["ok"].append(i) results["ok"].append(i)
elif run_code == 3:
results["captcha"].append(i)
else: else:
results["close"].append(i) results["close"].append(i)
log.info(f"{i}执行完毕") log.info(f"{i}执行完毕")
@ -53,13 +55,16 @@ def main_multi(autorun: bool):
print("") print("")
push_message = f'脚本执行完毕,共执行{len(config_list)}个配置文件,成功{len(results["ok"])}个,' \ push_message = f'脚本执行完毕,共执行{len(config_list)}个配置文件,成功{len(results["ok"])}个,' \
f'没执行{len(results["close"])}个,失败{len(results["error"])}' \ f'没执行{len(results["close"])}个,失败{len(results["error"])}' \
f'\r\n没执行的配置文件: {results["close"]}\r\n执行失败的配置文件: {results["error"]}' f'\r\n没执行的配置文件: {results["close"]}\r\n执行失败的配置文件: {results["error"]}\r\n' \
f'触发原神验证码的配置文件: {results["captcha"]} '
log.info(push_message) log.info(push_message)
status = 0 status = 0
if len(results["error"]) == len(config_list): if len(results["error"]) == len(config_list):
status = 1 status = 1
elif len(results["error"]) != 0: elif len(results["error"]) != 0:
status = 2 status = 2
elif len(results["captcha"]) != 0:
status = 3
push.push(status, push_message) push.push(status, push_message)

16
push.py
View File

@ -27,6 +27,8 @@ def title(status):
return "「米游社脚本」执行失败!" return "「米游社脚本」执行失败!"
elif status == 2: elif status == 2:
return "「米游社脚本」部分账号执行失败!" return "「米游社脚本」部分账号执行失败!"
elif status == 3:
return "「米游社脚本」原神签到触发验证码!"
# telegram的推送 # telegram的推送
@ -83,7 +85,7 @@ def wecom(status, push_message):
except: except:
# 没有配置时赋默认值 # 没有配置时赋默认值
touser = '@all' touser = '@all'
push_token = http.post( push_token = http.post(
url=f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={secret}', url=f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={secret}',
data="" data=""
@ -112,11 +114,11 @@ def pushdeer(status, push_message):
} }
) )
# 钉钉群机器人 # 钉钉群机器人
def dingrobot(status, push_message): def dingrobot(status, push_message):
api_url = cfg.get('dingrobot', 'webhook') # https://oapi.dingtalk.com/robot/send?access_token=XXX api_url = cfg.get('dingrobot', 'webhook') # https://oapi.dingtalk.com/robot/send?access_token=XXX
secret = cfg.get('dingrobot', 'secret') # 安全设置 -> 加签 -> 密钥 -> SEC* secret = cfg.get('dingrobot', 'secret') # 安全设置 -> 加签 -> 密钥 -> SEC*
if secret: if secret:
timestamp = str(round(time.time() * 1000)) timestamp = str(round(time.time() * 1000))
sign_string = f"{timestamp}\n{secret}" sign_string = f"{timestamp}\n{secret}"
@ -127,16 +129,17 @@ def dingrobot(status, push_message):
).digest() ).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code)) sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
api_url = f"{api_url}&timestamp={timestamp}&sign={sign}" api_url = f"{api_url}&timestamp={timestamp}&sign={sign}"
rep = http.post( rep = http.post(
url=api_url, url=api_url,
headers={"Content-Type": "application/json; charset=utf-8"}, headers={"Content-Type": "application/json; charset=utf-8"},
json={ json={
"msgtype": "text", "text": { "content": title(status) + "\r\n" + push_message } "msgtype": "text", "text": {"content": title(status) + "\r\n" + push_message}
} }
).json() ).json()
log.info(f"推送结果:{rep.get('errmsg')}") log.info(f"推送结果:{rep.get('errmsg')}")
# Bark # Bark
def bark(status, push_message): def bark(status, push_message):
rep = http.get( rep = http.get(
@ -144,6 +147,7 @@ def bark(status, push_message):
).json() ).json()
log.info(f"推送结果:{rep.get('message')}") log.info(f"推送结果:{rep.get('message')}")
# gotify # gotify
def gotify(status, push_message): def gotify(status, push_message):
rep = http.post( rep = http.post(
@ -156,6 +160,7 @@ def gotify(status, push_message):
).json() ).json()
log.info(f"推送结果:{rep.get('errmsg')}") log.info(f"推送结果:{rep.get('errmsg')}")
def push(status, push_message): def push(status, push_message):
if not load_config(): if not load_config():
return 0 return 0
@ -179,5 +184,6 @@ def push(status, push_message):
log.info("推送完毕......") log.info("推送完毕......")
return 1 return 1
if __name__ == "__main__": if __name__ == "__main__":
push(0, f'推送验证{int(time.time())}') push(0, f'推送验证{int(time.time())}')