feat: 整体重写滑块 / 账密登录与隐身工具集

This commit is contained in:
GuDong
2026-05-06 21:54:34 +08:00
parent 2507cd4927
commit aa7200538b
4 changed files with 4857 additions and 839 deletions
+15 -28
View File
@@ -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:
+22
View File
@@ -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() # 重写密码登录方法
File diff suppressed because it is too large Load Diff
+13 -7
View File
@@ -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)