feat: stabilize multi-region runtime sync and worker orchestration
This commit is contained in:
@@ -10,9 +10,7 @@
|
||||
|
||||
# 导入标准库
|
||||
import os # 操作系统接口
|
||||
import pickle # 序列化反序列化
|
||||
import re
|
||||
import time # 时间处理
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Util.Padding import pad
|
||||
import base64
|
||||
@@ -22,6 +20,7 @@ from loguru import logger # 日志记录
|
||||
from requests.cookies import RequestsCookieJar # Cookie管理
|
||||
|
||||
from detect.geetest2 import Geetest2
|
||||
from detect.locked_pickle import load_pickle_locked, save_pickle_atomic
|
||||
|
||||
|
||||
|
||||
@@ -69,30 +68,29 @@ class Juziseo:
|
||||
self.gt = None
|
||||
self.session = requests.Session() # 创建会话对象
|
||||
self.session.proxies = proxies # 设置代理
|
||||
self.session.timeout = 10 # 设置超时时间10秒
|
||||
self.request_timeout = max(
|
||||
0.5,
|
||||
float(os.getenv("DOMAINCHECK_JUZISEO_TIMEOUT", "10") or 10),
|
||||
)
|
||||
self.base_url = "https://seo.juziseo.com" # 设置基础URL
|
||||
|
||||
def _request(self, method: str, url: str, **kwargs):
|
||||
kwargs.setdefault("timeout", self.request_timeout)
|
||||
return getattr(self.session, method)(url, **kwargs)
|
||||
|
||||
def save_cookies(self, filepath="juziseo_cookies.pkl"):
|
||||
"""
|
||||
保存Cookie到文件和Redis
|
||||
|
||||
:param filepath: 文件路径
|
||||
"""
|
||||
with open(filepath, "wb") as f: # 以二进制写入模式打开文件
|
||||
pickle.dump(self.cookie, f) # 序列化保存Cookie
|
||||
save_pickle_atomic(filepath, self.cookie)
|
||||
logger.info(f"已保存桔子SEO Cookie到 {filepath}")
|
||||
|
||||
# 保存到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:
|
||||
@@ -108,8 +106,10 @@ class Juziseo:
|
||||
:param filepath: 文件路径
|
||||
"""
|
||||
try: # 尝试加载
|
||||
with open(filepath, "rb") as f: # 以二进制读取模式打开文件
|
||||
self.cookie = pickle.load(f) # 反序列化加载Cookie
|
||||
self.cookie = load_pickle_locked(
|
||||
filepath,
|
||||
default_factory=requests.cookies.RequestsCookieJar,
|
||||
)
|
||||
# logger.info(f"已从 {filepath} 加载桔子SEO Cookie")
|
||||
except: # 加载失败
|
||||
self.cookie = requests.cookies.RequestsCookieJar() # 创建空的CookieJar
|
||||
@@ -117,7 +117,7 @@ class Juziseo:
|
||||
|
||||
def start_msg_captcha_servlet(self):
|
||||
url = f"{self.base_url}/class/gtcode/msg/StartMsgCaptchaServlet.php"
|
||||
response = self.session.get(url, headers=self.headers, cookies=self.cookie).json()
|
||||
response = self._request("get", url, headers=self.headers, cookies=self.cookie).json()
|
||||
logger.info(response)
|
||||
self.gt = response['gt']
|
||||
self.challenge = response['challenge']
|
||||
@@ -161,7 +161,7 @@ class Juziseo:
|
||||
logger.debug(data)
|
||||
# 发送登录请求
|
||||
url = f"{self.base_url}/account/ajax/login_process/"
|
||||
response = self.session.post(url, headers=self.headers, data=data, cookies=self.cookie)
|
||||
response = self._request("post", url, headers=self.headers, data=data, cookies=self.cookie)
|
||||
logger.info(response.text)
|
||||
# 解析响应
|
||||
result = response.json()
|
||||
@@ -190,11 +190,11 @@ class Juziseo:
|
||||
'_post_type': 'ajax',
|
||||
}
|
||||
url = f"{self.base_url}/snapshot/save/"
|
||||
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['errno'] == 1:
|
||||
url = response['rsm']['url']
|
||||
response_html = self.session.get(url, headers=self.headers, cookies=self.cookie).content.decode('utf-8')
|
||||
response_html = self._request("get", url, headers=self.headers, cookies=self.cookie).content.decode('utf-8')
|
||||
title_sensitive_words_match = re.search(r'标题敏感词\D*(\d+)', response_html, re.S)
|
||||
title_suspected_sensitive_words_match = re.search(r'标题有疑似敏感词\D*(\d+)', response_html, re.S)
|
||||
content_sensitive_words_match = re.search(r'内容敏感词\D*(\d+)', response_html, re.S)
|
||||
@@ -221,11 +221,11 @@ class Juziseo:
|
||||
'_post_type': 'ajax',
|
||||
}
|
||||
url = f"{self.base_url}/domain_rank/save_domain/"
|
||||
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['errno'] == 1:
|
||||
url = response['rsm']['url']
|
||||
response_html = self.session.get(url, headers=self.headers, cookies=self.cookie).content.decode('utf-8')
|
||||
response_html = self._request("get", url, headers=self.headers, cookies=self.cookie).content.decode('utf-8')
|
||||
subdomain_match = re.search(r'子域名:\D*(\d+)', response_html, re.S)
|
||||
if subdomain_match:
|
||||
return False, f"存在子域名: {subdomain_match.group(1)}"
|
||||
|
||||
Reference in New Issue
Block a user