mirror of
https://github.com/GuDong2003/xianyu-auto-reply-fix.git
synced 2026-08-29 01:53:09 +08:00
feat: 整体重写滑块 / 账密登录与隐身工具集
This commit is contained in:
@@ -25,7 +25,6 @@ SUPPORTED_NOTIFICATION_TEMPLATE_TYPES = (
|
||||
'face_verify',
|
||||
'password_login_success',
|
||||
'cookie_refresh_success',
|
||||
'account_paused',
|
||||
)
|
||||
|
||||
|
||||
@@ -82,17 +81,6 @@ Cookie数量: {cookie_count}
|
||||
Cookie数量: {cookie_count}
|
||||
|
||||
账号已可正常使用。''',
|
||||
'account_paused': '''🚫 账号已暂停
|
||||
|
||||
账号: {account_id}
|
||||
状态: {status_note}
|
||||
原因: {pause_reason}
|
||||
时间: {time}
|
||||
|
||||
说明: {error_message}
|
||||
验证入口: {verification_url}
|
||||
|
||||
{action_hint}''',
|
||||
}
|
||||
|
||||
|
||||
@@ -212,18 +200,8 @@ def build_face_verify_notification(
|
||||
)
|
||||
|
||||
if has_screenshot:
|
||||
if verification_type_label == '短信验证':
|
||||
verification_action = '请在自动化网站的账号管理弹窗中完成短信验证:'
|
||||
verification_target = '自动化网站账号管理弹窗中的短信验证界面'
|
||||
elif verification_type_label == '二维码验证':
|
||||
verification_action = '请在自动化网站的账号管理弹窗中扫码完成验证:'
|
||||
verification_target = '自动化网站账号管理弹窗中的验证二维码'
|
||||
elif verification_type_label == '人脸验证':
|
||||
verification_action = '请在自动化网站的账号管理弹窗中完成人脸验证:'
|
||||
verification_target = '自动化网站账号管理弹窗中的人脸验证界面'
|
||||
else:
|
||||
verification_action = '请在自动化网站的账号管理弹窗中完成验证:'
|
||||
verification_target = '自动化网站账号管理弹窗中的验证界面'
|
||||
verification_action = '请在自动化网站的账号管理弹窗中扫描二维码完成验证:'
|
||||
verification_target = '自动化网站账号管理弹窗中的验证二维码'
|
||||
else:
|
||||
verification_action = '请点击验证链接完成验证:'
|
||||
verification_target = verification_url or '无'
|
||||
@@ -244,12 +222,21 @@ async def _send_qq_notification(config_data: Dict[str, Any], message: str, *, ac
|
||||
logger.warning(f"【{account_id}】QQ通知配置为空")
|
||||
return False
|
||||
|
||||
# QQ 私信 API 地址:从系统设置读取,未配置则禁用此渠道,避免向未知第三方泄露 QQ 号
|
||||
from db_manager import db_manager
|
||||
api_url = (db_manager.get_system_setting('qq_notification_api_url') or '').strip()
|
||||
api_url = (
|
||||
(config_data.get('api_url') or '').strip()
|
||||
or str(os.getenv('QQ_NOTIFICATION_API_URL') or '').strip()
|
||||
)
|
||||
if not api_url:
|
||||
logger.warning(f"【{account_id}】未配置 qq_notification_api_url,已跳过 QQ 私信通知")
|
||||
try:
|
||||
from db_manager import db_manager
|
||||
api_url = (db_manager.get_system_setting('qq_notification_api_url') or '').strip()
|
||||
except Exception:
|
||||
api_url = ''
|
||||
|
||||
if not api_url:
|
||||
logger.warning(f"【{account_id}】未配置QQ通知API地址,已跳过发送")
|
||||
return False
|
||||
|
||||
params = {'qq': qq_number, 'msg': message}
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
|
||||
@@ -2107,6 +2107,27 @@ def patch_login_with_password_headful():
|
||||
return False
|
||||
|
||||
|
||||
def patch_check_date_validity_force_allow():
|
||||
"""追加一个干净补丁,确保日期校验永久放行。"""
|
||||
try:
|
||||
try:
|
||||
from utils.xianyu_slider_stealth import XianyuSliderStealth
|
||||
except ImportError:
|
||||
from xianyu_slider_stealth import XianyuSliderStealth
|
||||
|
||||
def always_allow(self) -> bool:
|
||||
pure_user_id = getattr(self, 'pure_user_id', getattr(self, 'user_id', 'unknown'))
|
||||
logger.info(f"【{pure_user_id}】日期校验已禁用,直接放行")
|
||||
return True
|
||||
|
||||
XianyuSliderStealth._check_date_validity = always_allow
|
||||
logger.info("✓ 追加日期校验放行补丁已生效")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"追加日期校验放行补丁失败: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def apply_patches():
|
||||
"""
|
||||
应用所有补丁
|
||||
@@ -2114,6 +2135,7 @@ def apply_patches():
|
||||
"""
|
||||
logger.info("开始应用滑块验证模块补丁...")
|
||||
patch_check_date_validity()
|
||||
patch_check_date_validity_force_allow()
|
||||
# patch_simulate_slide() 已禁用:xianyu_slider_stealth.py 中的原版 simulate_slide 已优化
|
||||
# 包含 Perlin 噪声轨迹、用户速度人格、服务端判定等待等改进,不再需要猴子补丁覆盖
|
||||
patch_login_with_password_headful() # 重写密码登录方法
|
||||
|
||||
+4807
-804
File diff suppressed because it is too large
Load Diff
+13
-7
@@ -1,7 +1,6 @@
|
||||
import base64
|
||||
import json
|
||||
import subprocess
|
||||
from functools import partial
|
||||
import time
|
||||
import hashlib
|
||||
import struct
|
||||
@@ -11,7 +10,6 @@ from typing import Any, Dict, List
|
||||
import blackboxprotobuf
|
||||
from loguru import logger
|
||||
|
||||
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
|
||||
import execjs
|
||||
|
||||
def get_js_path():
|
||||
@@ -45,7 +43,13 @@ except Exception as e:
|
||||
# 尝试检测系统中的JavaScript运行时
|
||||
import subprocess
|
||||
try:
|
||||
result = subprocess.run(['node', '--version'], capture_output=True, text=True)
|
||||
result = subprocess.run(
|
||||
['node', '--version'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
encoding='utf-8',
|
||||
errors='replace',
|
||||
)
|
||||
if result.returncode == 0:
|
||||
logger.info(f"检测到Node.js版本: {result.stdout.strip()}")
|
||||
else:
|
||||
@@ -59,12 +63,14 @@ def trans_cookies(cookies_str: str) -> dict:
|
||||
"""将cookies字符串转换为字典"""
|
||||
if not cookies_str:
|
||||
raise ValueError("cookies不能为空")
|
||||
|
||||
|
||||
cookies_str = str(cookies_str).replace("\ufeff", "").strip()
|
||||
cookies = {}
|
||||
for cookie in cookies_str.split("; "):
|
||||
for cookie in cookies_str.split(";"):
|
||||
cookie = cookie.strip()
|
||||
if "=" in cookie:
|
||||
key, value = cookie.split("=", 1)
|
||||
cookies[key] = value
|
||||
cookies[key.strip()] = value.strip()
|
||||
return cookies
|
||||
|
||||
|
||||
@@ -376,4 +382,4 @@ if __name__ == '__main__':
|
||||
msg = "ggGLAYEBsjMxNDk2MzcwNjNAZ29vZmlzaAKzNDc5ODMzODkwOTZAZ29vZmlzaAOxMzQxNjU2NTI3NDU0Mi5QTk0EAAXPAAABlbKji20GggFlA4UBoAK6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl0DoAQaBdoEKnsiY29udGVudFR5cGUiOjI2LCJkeENhcmQiOnsiaXRlbSI6eyJtYWluIjp7ImNsaWNrUGFyYW0iOnsiYXJnMSI6Ik1zZ0NhcmQiLCJhcmdzIjp7InNvdXJjZSI6ImltIiwidGFza19pZCI6IjNleFFKSE9UbVBVMSIsIm1zZ19pZCI6ImNjOGJjMmRmN2M5MzRkZjA4NmUwNTY3Y2I2OWYxNTczIn19LCJleENvbnRlbnQiOnsiYmdDb2xvciI6IiNGRkZGRkYiLCJidXR0b24iOnsiYmdDb2xvciI6IiNGRkU2MEYiLCJib3JkZXJDb2xvciI6IiNGRkU2MEYiLCJjbGlja1BhcmFtIjp7ImFyZzEiOiJNc2dDYXJkQWN0aW9uIiwiYXJncyI6eyJzb3VyY2UiOiJpbSIsInRhc2tfaWQiOiIzZXhRSkhPVG1QVTEiLCJtc2dfaWQiOiJjYzhiYzJkZjdjOTM0ZGYwODZlMDU2N2NiNjlmMTU3MyJ9fSwiZm9udENvbG9yIjoiIzMzMzMzMyIsInRhcmdldFVybCI6ImZsZWFtYXJrZXQ6Ly9hZGp1c3RfcHJpY2U/Zmx1dHRlcj10cnVlJmJpek9yZGVySWQ9MjUwMzY4ODEyNjM1NjYzNjM3MCIsInRleHQiOiLkv67mlLnku7fmoLwifSwiZGVzYyI6Iuivt+WPjOaWueayn+mAmuWPiuaXtuehruiupOS7t+agvCIsImRlc2NDb2xvciI6IiNBM0EzQTMiLCJ0aXRsZSI6IuaIkeW3suaLjeS4i++8jOW+heS7mOasviIsInVwZ3JhZGUiOnsidGFyZ2V0VXJsIjoiaHR0cHM6Ly9oNS5tLmdvb2Zpc2guY29tL2FwcC9pZGxlRmlzaC1GMmUvZm0tZG93bmxhb2QvaG9tZS5odG1sP25vUmVkcmllY3Q9dHJ1ZSZjYW5CYWNrPXRydWUmY2hlY2tWZXJzaW9uPXRydWUiLCJ2ZXJzaW9uIjoiNy43LjkwIn19LCJ0YXJnZXRVcmwiOiJmbGVhbWFya2V0Oi8vb3JkZXJfZGV0YWlsP2lkPTI1MDM2ODgxMjYzNTY2MzYzNzAmcm9sZT1zZWxsZXIifX0sInRlbXBsYXRlIjp7Im5hbWUiOiJpZGxlZmlzaF9tZXNzYWdlX3RyYWRlX2NoYXRfY2FyZCIsInVybCI6Imh0dHBzOi8vZGluYW1pY3guYWxpYmFiYXVzZXJjb250ZW50LmNvbS9wdWIvaWRsZWZpc2hfbWVzc2FnZV90cmFkZV9jaGF0X2NhcmQvMTY2NzIyMjA1Mjc2Ny9pZGxlZmlzaF9tZXNzYWdlX3RyYWRlX2NoYXRfY2FyZC56aXAiLCJ2ZXJzaW9uIjoiMTY2NzIyMjA1Mjc2NyJ9fX0HAQgBCQAK3gAQpmJpelRhZ9oAe3sic291cmNlSWQiOiJDMkM6M2V4UUpIT1RtUFUxIiwidGFza05hbWUiOiLlt7Lmi43kuItf5pyq5LuY5qy+X+WNluWutiIsIm1hdGVyaWFsSWQiOiIzZXhRSkhPVG1QVTEiLCJ0YXNrSWQiOiIzZXhRSkhPVG1QVTEifbFjbG9zZVB1c2hSZWNlaXZlcqVmYWxzZbFjbG9zZVVucmVhZE51bWJlcqVmYWxzZaxkZXRhaWxOb3RpY2W6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl2nZXh0SnNvbtoBr3sibXNnQXJncyI6eyJ0YXNrX2lkIjoiM2V4UUpIT1RtUFUxIiwic291cmNlIjoiaW0iLCJtc2dfaWQiOiJjYzhiYzJkZjdjOTM0ZGYwODZlMDU2N2NiNjlmMTU3MyJ9LCJxdWlja1JlcGx5IjoiMSIsIm1zZ0FyZzEiOiJNc2dDYXJkIiwidXBkYXRlS2V5IjoiNDc5ODMzODkwOTY6MjUwMzY4ODEyNjM1NjYzNjM3MDoxX25vdF9wYXlfc2VsbGVyIiwibWVzc2FnZUlkIjoiY2M4YmMyZGY3YzkzNGRmMDg2ZTA1NjdjYjY5ZjE1NzMiLCJtdWx0aUNoYW5uZWwiOnsiaHVhd2VpIjoiRVhQUkVTUyIsInhpYW9taSI6IjEwODAwMCIsIm9wcG8iOiJFWFBSRVNTIiwiaG9ub3IiOiJOT1JNQUwiLCJhZ29vIjoicHJvZHVjdCIsInZpdm8iOiJPUkRFUiJ9LCJjb250ZW50VHlwZSI6IjI2IiwiY29ycmVsYXRpb25Hcm91cElkIjoiM2V4UUpIT1RtUFUxX0ZGcjRHT1NuOE9RbyJ9qHJlY2VpdmVyrTIyMDI2NDA5MTgwNzmrcmVkUmVtaW5kZXKy562J5b6F5Lmw5a625LuY5qy+sHJlZFJlbWluZGVyU3R5bGWhMa9yZW1pbmRlckNvbnRlbnS6W+aIkeW3suaLjeS4i++8jOW+heS7mOasvl2ucmVtaW5kZXJOb3RpY2W75Lmw5a625bey5ouN5LiL77yM5b6F5LuY5qy+rXJlbWluZGVyVGl0bGW75Lmw5a625bey5ouN5LiL77yM5b6F5LuY5qy+q3JlbWluZGVyVXJs2gCaZmxlYW1hcmtldDovL21lc3NhZ2VfY2hhdD9pdGVtSWQ9OTAwMDUyNjQ0Mjc3JnBlZXJVc2VySWQ9MzE0OTYzNzA2MyZwZWVyVXNlck5pY2s955S3KioqeSZzaWQ9NDc5ODMzODkwOTYmbWVzc2FnZUlkPWNjOGJjMmRmN2M5MzRkZjA4NmUwNTY3Y2I2OWYxNTczJmFkdj1ub6xzZW5kZXJVc2VySWSqMzE0OTYzNzA2M65zZW5kZXJVc2VyVHlwZaEwq3Nlc3Npb25UeXBloTGqdXBkYXRlSGVhZKR0cnVlDAEDgahuZWVkUHVzaKR0cnVl"
|
||||
|
||||
res = decrypt(msg)
|
||||
print(res)
|
||||
print(res)
|
||||
|
||||
Reference in New Issue
Block a user