Commit 56d4c5df by baiquan

refactor(service): 重构抖店请求函数并优化日志配置

- 重构 doudian_request函数,增加重试逻辑并处理 cookies 过期异常
- 修改 shop.py 中的日志配置,按文件大小滚动并保留7天内的日志
parent 7dd526f7
import time
import requests import requests
from loguru import logger from loguru import logger
from retrying import retry from retrying import retry
...@@ -21,32 +23,40 @@ HEADERS = { ...@@ -21,32 +23,40 @@ HEADERS = {
} }
@retry(stop_max_attempt_number=3, wait_fixed=3000)
def doudian_request(method: str, url: str, proxies:dict, params:dict=None, data: any = None, json: dict = None,headers=None, cookies=None, match_str="") -> any: def doudian_request(method: str, url: str, proxies:dict, params:dict=None, data: any = None, json: dict = None,headers=None, cookies=None, match_str="") -> any:
if headers is None: retry_count = 0
headers = HEADERS while True:
logger.info(f'doudian_request-->{url}') retry_count += 1
method = method.upper() if retry_count > 3:
if method == 'GET': raise Exception('超过重试次数,请求失败')
response = requests.get(url, params=params, headers=headers, cookies=cookies, proxies=proxies) try:
elif method == 'POST': if headers is None:
response = requests.post(url, json=json, params=params, data=data, headers=headers, cookies=cookies, proxies=proxies) headers = HEADERS
else: logger.info(f'doudian_request-->{url}')
raise ValueError(f"Unsupported HTTP method: {method}") method = method.upper()
# 处理响应 if method == 'GET':
if (response.status_code == 403 and "Forbidden" in response.text) or "登录信息已失效" in response.text or "无权访问此接口" in response.text: response = requests.get(url, params=params, headers=headers, cookies=cookies, proxies=proxies)
raise CookiesExpiredError("请求失败-->cookies已过期!") elif method == 'POST':
if response.text: response = requests.post(url, json=json, params=params, data=data, headers=headers, cookies=cookies, proxies=proxies)
response_data = response.json() else:
if response_data.get('code') == 0 or response_data.get('status_code') == 0 or response_data.get('success') == 0: raise ValueError(f"Unsupported HTTP method: {method}")
# logger.info(f'send_request响应结果-->{response_data}') # 处理响应
return { if (response.status_code == 403 and "Forbidden" in response.text) or "登录信息已失效" in response.text or "无权访问此接口" in response.text:
'data': response_data.get('data', {}), raise CookiesExpiredError("cookies已过期!")
'response_data': response_data if response.text:
} response_data = response.json()
elif match_str and match_str in response.text: if response_data.get('code') == 0 or response_data.get('status_code') == 0 or response_data.get('success') == 0:
return { # logger.info(f'send_request响应结果-->{response_data}')
'data': response_data.get('data', {}), return {
'response_data': response_data 'data': response_data.get('data', {}),
} 'response_data': response_data
raise Exception(f"请求失败 --> {response.text}") }
\ No newline at end of file elif match_str and match_str in response.text:
return {
'data': response_data.get('data', {}),
'response_data': response_data
}
raise Exception({response.text})
except CookiesExpiredError as e:
logger.error(f'请求失败-->{e.msg}')
time.sleep(3)
\ No newline at end of file
...@@ -17,7 +17,15 @@ from utils.constant import TaskType ...@@ -17,7 +17,15 @@ from utils.constant import TaskType
os.makedirs("logs", exist_ok=True) os.makedirs("logs", exist_ok=True)
# 添加日志文件输出,按天滚动 # 添加日志文件输出,按天滚动
logger.add("logs/shop.log", rotation="1 day", level="INFO", encoding="utf-8", backtrace=True, diagnose=True) logger.add(
"logs/shop.log",
rotation="40 MB", # 关键修改:设置文件大小限制
level="INFO",
encoding="utf-8",
backtrace=True,
diagnose=True,
retention="7 days", # 可选:保留30天内的日志文件
)
async def syncShop(task: dict = None): async def syncShop(task: dict = None):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment