Commit 1505180d by baiquan

增加doudian_request

parent d7c649a4
...@@ -27,7 +27,7 @@ celery -A celery_app worker -l info -P gevent ...@@ -27,7 +27,7 @@ celery -A celery_app worker -l info -P gevent
### 启动API服务 ### 启动API服务
```bash ```bash
uvicorn api:app --host 0.0.0.0 --port 9001 --reload uvicorn api:app --host 0.0.0.0 --port 9001 --reload --timeout-keep-alive 120
``` ```
import requests
from loguru import logger
from retrying import retry
from utils.errors import CookiesExpiredError
HEADERS = {
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/json',
'origin': 'https://fxg.jinritemai.com',
'priority': 'u=1, i',
'referer': 'https://fxg.jinritemai.com',
'sec-ch-ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
}
@retry(stop_max_attempt_number=3, wait_fixed=3000)
def doudian_request(method: str, url: str, proxies:dict, params:dict=None, data: str = None, json: dict = None,headers=None, cookies=None, match_str="") -> any:
if headers is None:
headers = HEADERS
logger.info(f'doudian_request-->{url}')
method = method.upper()
if method == 'GET':
response = requests.get(url, params=params, headers=headers, cookies=cookies, proxies=proxies)
elif method == 'POST':
response = requests.post(url, json=json, params=params, data=data, headers=headers, cookies=cookies, proxies=proxies)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
# 处理响应
if (response.status_code == 403 and "Forbidden" in response.text) or "登录信息已失效" in response.text or "无权访问此接口" in response.text:
raise CookiesExpiredError("请求失败-->cookies已过期!")
if response.text:
response_data = response.json()
if response_data.get('code') == 0 or response_data.get('status_code') == 0 or response_data.get('success') == 0:
# logger.info(f'send_request响应结果-->{response_data}')
return {
'data': response_data.get('data', {}),
'response_data': response_data
}
elif match_str and match_str in response.text:
return {
'data': response_data.get('data', {}),
'response_data': response_data
}
raise Exception(f"请求失败 --> {response.text}")
\ No newline at end of file
...@@ -2,10 +2,11 @@ import json ...@@ -2,10 +2,11 @@ import json
from urllib.parse import urlencode from urllib.parse import urlencode
import execjs import execjs
import requests
from loguru import logger from service.doudian_request import doudian_request
from utils.common import check_proxy from utils.common import check_proxy
def generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: int=1): def generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: int=1):
"""生成加密参数""" """生成加密参数"""
# 直接读取JS文件 # 直接读取JS文件
...@@ -19,12 +20,8 @@ def generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: int=1): ...@@ -19,12 +20,8 @@ def generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: int=1):
raise Exception('params_type error') raise Exception('params_type error')
# 执行加密算法 # 执行加密算法
ctx = execjs.compile(js_code) ctx = execjs.compile(js_code)
logger.info(f'params: {params}')
logger.info(f'params_type: {type(params)}')
if type(params) == dict: if type(params) == dict:
params = urlencode(params) params = urlencode(params)
logger.info(f'data: {data}')
logger.info(f'data_type: {type(data)}')
data = json.dumps(data) data = json.dumps(data)
result = ctx.call('get_ab', params, data, ua) result = ctx.call('get_ab', params, data, ua)
return result return result
...@@ -55,7 +52,7 @@ def get_schema(headers: dict, proxy_url: str, category_id: str): ...@@ -55,7 +52,7 @@ def get_schema(headers: dict, proxy_url: str, category_id: str):
a_bogus = generate_a_bogus(params, json_data, ua) a_bogus = generate_a_bogus(params, json_data, ua)
params['a_bogus'] = a_bogus params['a_bogus'] = a_bogus
proxies = check_proxy(proxy_url) proxies = check_proxy(proxy_url)
response = requests.post(url, params=params, headers=headers, json=json_data, verify=False, proxies=proxies) response = doudian_request("POST", url, params=params, proxies=proxies, json=json_data, headers=headers)
return response return response
def create_global_promotion(params:str | dict,data: dict,headers: dict, proxy_url: str): def create_global_promotion(params:str | dict,data: dict,headers: dict, proxy_url: str):
...@@ -70,5 +67,5 @@ def create_global_promotion(params:str | dict,data: dict,headers: dict, proxy_ur ...@@ -70,5 +67,5 @@ def create_global_promotion(params:str | dict,data: dict,headers: dict, proxy_ur
params['a_bogus'] = a_bogus params['a_bogus'] = a_bogus
url_params = urlencode(params) url_params = urlencode(params)
url = 'https://qianchuan.jinritemai.com/ad/api/creation/v1/ad/create?' + url_params url = 'https://qianchuan.jinritemai.com/ad/api/creation/v1/ad/create?' + url_params
response = requests.post(url, json=data, headers=headers, verify=False, proxies=proxies) response = doudian_request("POST", url, proxies=proxies, json=data, headers=headers)
return response return response
...@@ -2,7 +2,6 @@ import asyncio ...@@ -2,7 +2,6 @@ import asyncio
from celery import shared_task from celery import shared_task
from loguru import logger from loguru import logger
from retrying import retry
from service.create_template import create_template from service.create_template import create_template
from service.doudian_service import generate_a_bogus, get_schema, create_global_promotion from service.doudian_service import generate_a_bogus, get_schema, create_global_promotion
...@@ -10,7 +9,7 @@ from service.hub_ import closeBrowser ...@@ -10,7 +9,7 @@ from service.hub_ import closeBrowser
from service.login import login from service.login import login
from service.sync_shop import syncShop, syncShopInfo from service.sync_shop import syncShop, syncShopInfo
from service.upload_video import upload_video from service.upload_video import upload_video
from utils.errors import AppError, ABogusParamsError, CookiesExpiredError from utils.errors import AppError
@shared_task(name='sync_shop') @shared_task(name='sync_shop')
...@@ -26,7 +25,7 @@ def execute_sync_shop(container_name: str): ...@@ -26,7 +25,7 @@ def execute_sync_shop(container_name: str):
'error_type': '' 'error_type': ''
} }
except AppError as e: except AppError as e:
logger.error(f'店铺同步异常:{e.msg}') logger.error(f'店铺同步失败:{e.msg}')
return { return {
'code': e.code, 'code': e.code,
'msg': e.msg, 'msg': e.msg,
...@@ -59,7 +58,7 @@ def execute_sync_shop_info(browser_id: str, listen_url: str, open_url: str): ...@@ -59,7 +58,7 @@ def execute_sync_shop_info(browser_id: str, listen_url: str, open_url: str):
'error_type': '' 'error_type': ''
} }
except AppError as e: except AppError as e:
logger.error(f'同步店铺信息异常:{e.msg}') logger.error(f'同步店铺信息失败:{e.msg}')
return { return {
'code': e.code, 'code': e.code,
'msg': e.msg, 'msg': e.msg,
...@@ -89,7 +88,7 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies: ...@@ -89,7 +88,7 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies:
'error_type': '' 'error_type': ''
} }
except AppError as e: except AppError as e:
logger.error(f'创建运费模板异常:{e.msg}') logger.error(f'创建运费模板失败:{e.msg}')
return { return {
'code': e.code, 'code': e.code,
'msg': e.msg, 'msg': e.msg,
...@@ -97,10 +96,10 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies: ...@@ -97,10 +96,10 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies:
'error_type': type(e).__name__ 'error_type': type(e).__name__
} }
except Exception as e: except Exception as e:
logger.error(f'创建运费模板:{e}') logger.error(f'创建运费模板异常:{e}')
return { return {
'code': 500, 'code': 500,
'msg': f'创建运费模板:{e}', 'msg': f'创建运费模板异常:{e}',
'data': None, 'data': None,
'error_type': 'InternalError' 'error_type': 'InternalError'
} }
...@@ -117,7 +116,7 @@ def execute_doudian_login(account: str, password: str, headers: dict, proxies: d ...@@ -117,7 +116,7 @@ def execute_doudian_login(account: str, password: str, headers: dict, proxies: d
'error_type': '' 'error_type': ''
} }
except AppError as e: except AppError as e:
logger.error(f'登录异常:{e.msg}') logger.error(f'登录失败:{e.msg}')
return { return {
'code': e.code, 'code': e.code,
'msg': e.msg, 'msg': e.msg,
...@@ -138,6 +137,7 @@ def execute_doudian_upload_video(task: dict): ...@@ -138,6 +137,7 @@ def execute_doudian_upload_video(task: dict):
"""上传视频""" """上传视频"""
try: try:
result = upload_video(task) result = upload_video(task)
logger.success(f'视频上传成功-->{result}')
return { return {
'code': 200, 'code': 200,
'msg': 'success', 'msg': 'success',
...@@ -145,7 +145,7 @@ def execute_doudian_upload_video(task: dict): ...@@ -145,7 +145,7 @@ def execute_doudian_upload_video(task: dict):
'error_type': '' 'error_type': ''
} }
except AppError as e: except AppError as e:
logger.error(f'上传视频异常:{e.msg}') logger.error(f'上传视频失败:{e.msg}')
return { return {
'code': e.code, 'code': e.code,
'msg': e.msg, 'msg': e.msg,
...@@ -166,6 +166,7 @@ def execute_generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: ...@@ -166,6 +166,7 @@ def execute_generate_a_bogus(params:str | dict,data: dict,ua: str, params_type:
"""生成加密参数""" """生成加密参数"""
try: try:
result = generate_a_bogus(params,data,ua, params_type) result = generate_a_bogus(params,data,ua, params_type)
logger.success(f'生成加密成功-->{result}')
return { return {
'code': 200, 'code': 200,
'msg': 'success', 'msg': 'success',
...@@ -186,21 +187,14 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str): ...@@ -186,21 +187,14 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str):
"""获取类目参数""" """获取类目参数"""
try: try:
response = get_schema(headers, proxy_url, category_id) response = get_schema(headers, proxy_url, category_id)
if not response.text: result = response.get('data', {})
raise ABogusParamsError(data=response.text) logger.success(f'获取类目参数成功-->{result}')
if response.json().get('code') == 0: return {
result = response.json().get('data', {}) 'code': 200,
return { 'msg': 'success',
'code': 200, 'data': result,
'msg': 'success', 'error_type': ''
'data': result, }
'error_type': ''
}
elif response.json().get('code') == 10004 or response.json().get('code') == 10008:
raise CookiesExpiredError(data=response.text)
logger.error(f'获取类目参数异常-->{response.text}')
raise AppError(msg=response.json().get('msg'), data=response.text)
except AppError as e: except AppError as e:
logger.error(f'获取类目参数失败-->{e.msg}') logger.error(f'获取类目参数失败-->{e.msg}')
return { return {
...@@ -218,19 +212,32 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str): ...@@ -218,19 +212,32 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str):
'error_type': 'InternalError' 'error_type': 'InternalError'
} }
@retry(stop_max_attempt_number=3, wait_fixed=3000)
@shared_task(name='create_global_promotion') @shared_task(name='create_global_promotion')
def execute_create_global_promotion(params:str|dict, data: dict, headers: dict, proxy_url: str): def execute_create_global_promotion(params:str|dict, data: dict, headers: dict, proxy_url: str):
"""创建全域推广""" """创建全域推广"""
response = create_global_promotion(params, data, headers, proxy_url) try:
response_data = response.json() response = create_global_promotion(params, data, headers, proxy_url)
if response_data.get('status_code', -1) != 0: result = response.get('data', {})
logger.error(f"创建全局推广失败 --> {response.text}") logger.success(f'创建全域推广成功-->{result}')
raise Exception(f"创建全局推广失败 --> {response.text}") return {
result = response_data.get('data', {}) 'code': 200,
return { 'msg': 'success',
'code': 200, 'data': result,
'msg': 'success', 'error_type': ''
'data': result, }
'error_type': '' except AppError as e:
} logger.error(f'创建全局推广失败-->{e.msg}')
return {
'code': e.code,
'msg': e.msg,
'data': e.data,
'error_type': type(e).__name__
}
except Exception as e:
logger.error(f'创建全局推广错误-->{e}')
return {
'code': 500,
'msg': f'创建全局推广错误:{e}',
'data': None,
'error_type': 'InternalError'
}
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