feat: stabilize multi-region runtime sync and worker orchestration

This commit is contained in:
root
2026-04-27 15:48:12 +08:00
parent 7cbde2aa78
commit 215a364891
137 changed files with 31931 additions and 1943 deletions

View File

@@ -12,7 +12,6 @@ import base64 # Base64编码模块
import hashlib # 哈希算法模块
import json # JSON处理模块
import os # 操作系统接口模块
import pickle # 序列化模块
import random # 随机数生成模块
import shutil
import subprocess # 子进程管理模块
@@ -23,6 +22,7 @@ import requests # HTTP请求库
from loguru import logger # 日志记录库
from requests.cookies import RequestsCookieJar # Cookie处理
from detect.locked_pickle import load_pickle_locked, save_pickle_atomic
# 常量定义
BASE_URL = "https://www.juming.com" # 聚名网基础URL
@@ -170,11 +170,18 @@ class JM(object): # 聚名网API封装类
def __init__(self, proxies: Optional[Dict] = None): # 初始化方法
self.session = requests.Session() # 创建会话对象
self.session.timeout = REQUEST_TIMEOUT # 设置超时时间
self.session.proxies = proxies # 设置代理
self.request_timeout = max(
0.5,
float(os.getenv("DOMAINCHECK_JUMING_TIMEOUT", str(REQUEST_TIMEOUT)) or REQUEST_TIMEOUT),
)
self.base_url = BASE_URL # 设置基础URL
logger.debug(proxies)
def _request(self, method: str, url: str, **kwargs):
kwargs.setdefault("timeout", self.request_timeout)
return getattr(self.session, method)(url, **kwargs)
def captcha_init(self) -> Tuple[bool, str]: # 初始化滑块验证码
"""
初始化滑块验证码
@@ -194,7 +201,7 @@ class JM(object): # 聚名网API封装类
# self.cookie.clear()
# self.cookie.update({'acw_sc__v2': '69d948ed49117d89433d4316a79ada6f00d68f26'})
# logger.info(self.cookie)
response = self.session.post(url, headers=self.headers, data=data, cookies=self.cookie).json() # 发送请求
response = self._request("post", url, headers=self.headers, data=data, cookies=self.cookie).json() # 发送请求
logger.info(response)
if response['code'] == 1: # 初始化成功
@@ -271,7 +278,7 @@ class JM(object): # 聚名网API封装类
url = f"{self.base_url}/captcha/verify" # 验证URL
self.headers['Content-Type'] = 'application/json' # 设置内容类型
response = self.session.post(url, headers=self.headers, data=verify_data, cookies=self.cookie).json() # 发送验证请求
response = self._request("post", url, headers=self.headers, data=verify_data, cookies=self.cookie).json() # 发送验证请求
if response['code'] == 1: # 验证成功
self.token = response['data']['token'] # 保存token
self.session_id = response['data']['session_id'] # 保存会话ID
@@ -294,7 +301,7 @@ class JM(object): # 聚名网API封装类
"""
url = f"{self.base_url}/user_zh/wxdl_ewm" # 二维码URL
try: # 异常处理
response = self.session.post(url, headers=self.headers).json() # 发送请求
response = self._request("post", url, headers=self.headers).json() # 发送请求
self.token = response['data']["token"] # 保存token
return response['code'] == 1, response['msg'], response['data']['url'] if response['code'] == 1 else None # 返回结果
except Exception as e: # 异常处理
@@ -338,7 +345,8 @@ class JM(object): # 聚名网API封装类
}
login_url = f"{self.base_url}/user_zh/p_login" # 登录URL
response = self.session.post( # 发送登录请求
response = self._request( # 发送登录请求
"post",
url=login_url,
headers=self.headers,
json=data,
@@ -384,7 +392,7 @@ class JM(object): # 聚名网API封装类
url = f"{self.base_url}/ykj/get_list" # 列表URL
try: # 异常处理
self.headers['Content-Type'] = 'application/x-www-form-urlencoded' # 设置内容类型
res = self.session.post(url, headers=self.headers, data=data, cookies=self.cookie) # 发送请求
res = self._request("post", url, headers=self.headers, data=data, cookies=self.cookie) # 发送请求
response = res.json() # 解析响应
if response['code'] == -401: # 需要验证码
@@ -427,7 +435,7 @@ class JM(object): # 聚名网API封装类
"""
url = f"{self.base_url}/newcha/del_down?scsj={date}" # 下载URL
try: # 异常处理
response = self.session.get(url, headers=self.headers, cookies=self.cookie, allow_redirects=False) # 发送请求
response = self._request("get", url, headers=self.headers, cookies=self.cookie, allow_redirects=False) # 发送请求
url = response.headers['Location'] # 获取重定向URL
response = self.session.get(url, timeout=DOWNLOAD_TIMEOUT) # 下载文件
response_text = response.content.decode('utf-8') # 解码内容
@@ -443,20 +451,12 @@ class JM(object): # 聚名网API封装类
Args:
filepath: 文件路径
"""
with open(filepath, "wb") as f: # 以二进制写入模式打开文件
pickle.dump(self.cookie, f) # 序列化保存
save_pickle_atomic(filepath, self.cookie)
# 保存到Redis
try:
import redis
from app.config import config
redis_client = redis.Redis(
host=config.REDIS_HOST,
port=config.REDIS_PORT,
password=config.REDIS_PASSWORD,
db=config.REDIS_DB,
decode_responses=True
)
from app.utils.redis_client import get_redis_client
redis_client = get_redis_client(role="standard")
# 将cookie转换为字典
cookie_dict = {}
for cookie in self.cookie:
@@ -473,8 +473,10 @@ class JM(object): # 聚名网API封装类
filepath: 文件路径
"""
try: # 异常处理
with open(filepath, "rb") as f: # 以二进制读取模式打开文件
self.cookie = pickle.load(f) # 反序列化加载
self.cookie = load_pickle_locked(
filepath,
default_factory=requests.cookies.RequestsCookieJar,
)
except: # 异常处理
self.cookie = requests.cookies.RequestsCookieJar() # 创建空Cookie