Commit 1505180d by baiquan

增加doudian_request

parent d7c649a4
......@@ -27,7 +27,7 @@ celery -A celery_app worker -l info -P gevent
### 启动API服务
```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
from urllib.parse import urlencode
import execjs
import requests
from loguru import logger
from service.doudian_request import doudian_request
from utils.common import check_proxy
def generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: int=1):
"""生成加密参数"""
# 直接读取JS文件
......@@ -19,12 +20,8 @@ def generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: int=1):
raise Exception('params_type error')
# 执行加密算法
ctx = execjs.compile(js_code)
logger.info(f'params: {params}')
logger.info(f'params_type: {type(params)}')
if type(params) == dict:
params = urlencode(params)
logger.info(f'data: {data}')
logger.info(f'data_type: {type(data)}')
data = json.dumps(data)
result = ctx.call('get_ab', params, data, ua)
return result
......@@ -55,7 +52,7 @@ def get_schema(headers: dict, proxy_url: str, category_id: str):
a_bogus = generate_a_bogus(params, json_data, ua)
params['a_bogus'] = a_bogus
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
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
params['a_bogus'] = a_bogus
url_params = urlencode(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
......@@ -2,7 +2,6 @@ import asyncio
from celery import shared_task
from loguru import logger
from retrying import retry
from service.create_template import create_template
from service.doudian_service import generate_a_bogus, get_schema, create_global_promotion
......@@ -10,7 +9,7 @@ from service.hub_ import closeBrowser
from service.login import login
from service.sync_shop import syncShop, syncShopInfo
from service.upload_video import upload_video
from utils.errors import AppError, ABogusParamsError, CookiesExpiredError
from utils.errors import AppError
@shared_task(name='sync_shop')
......@@ -26,7 +25,7 @@ def execute_sync_shop(container_name: str):
'error_type': ''
}
except AppError as e:
logger.error(f'店铺同步异常:{e.msg}')
logger.error(f'店铺同步失败:{e.msg}')
return {
'code': e.code,
'msg': e.msg,
......@@ -59,7 +58,7 @@ def execute_sync_shop_info(browser_id: str, listen_url: str, open_url: str):
'error_type': ''
}
except AppError as e:
logger.error(f'同步店铺信息异常:{e.msg}')
logger.error(f'同步店铺信息失败:{e.msg}')
return {
'code': e.code,
'msg': e.msg,
......@@ -89,7 +88,7 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies:
'error_type': ''
}
except AppError as e:
logger.error(f'创建运费模板异常:{e.msg}')
logger.error(f'创建运费模板失败:{e.msg}')
return {
'code': e.code,
'msg': e.msg,
......@@ -97,10 +96,10 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies:
'error_type': type(e).__name__
}
except Exception as e:
logger.error(f'创建运费模板:{e}')
logger.error(f'创建运费模板异常:{e}')
return {
'code': 500,
'msg': f'创建运费模板:{e}',
'msg': f'创建运费模板异常:{e}',
'data': None,
'error_type': 'InternalError'
}
......@@ -117,7 +116,7 @@ def execute_doudian_login(account: str, password: str, headers: dict, proxies: d
'error_type': ''
}
except AppError as e:
logger.error(f'登录异常:{e.msg}')
logger.error(f'登录失败:{e.msg}')
return {
'code': e.code,
'msg': e.msg,
......@@ -138,6 +137,7 @@ def execute_doudian_upload_video(task: dict):
"""上传视频"""
try:
result = upload_video(task)
logger.success(f'视频上传成功-->{result}')
return {
'code': 200,
'msg': 'success',
......@@ -145,7 +145,7 @@ def execute_doudian_upload_video(task: dict):
'error_type': ''
}
except AppError as e:
logger.error(f'上传视频异常:{e.msg}')
logger.error(f'上传视频失败:{e.msg}')
return {
'code': e.code,
'msg': e.msg,
......@@ -166,6 +166,7 @@ def execute_generate_a_bogus(params:str | dict,data: dict,ua: str, params_type:
"""生成加密参数"""
try:
result = generate_a_bogus(params,data,ua, params_type)
logger.success(f'生成加密成功-->{result}')
return {
'code': 200,
'msg': 'success',
......@@ -186,21 +187,14 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str):
"""获取类目参数"""
try:
response = get_schema(headers, proxy_url, category_id)
if not response.text:
raise ABogusParamsError(data=response.text)
if response.json().get('code') == 0:
result = response.json().get('data', {})
return {
'code': 200,
'msg': 'success',
'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)
result = response.get('data', {})
logger.success(f'获取类目参数成功-->{result}')
return {
'code': 200,
'msg': 'success',
'data': result,
'error_type': ''
}
except AppError as e:
logger.error(f'获取类目参数失败-->{e.msg}')
return {
......@@ -218,19 +212,32 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str):
'error_type': 'InternalError'
}
@retry(stop_max_attempt_number=3, wait_fixed=3000)
@shared_task(name='create_global_promotion')
def execute_create_global_promotion(params:str|dict, data: dict, headers: dict, proxy_url: str):
"""创建全域推广"""
response = create_global_promotion(params, data, headers, proxy_url)
response_data = response.json()
if response_data.get('status_code', -1) != 0:
logger.error(f"创建全局推广失败 --> {response.text}")
raise Exception(f"创建全局推广失败 --> {response.text}")
result = response_data.get('data', {})
return {
'code': 200,
'msg': 'success',
'data': result,
'error_type': ''
}
try:
response = create_global_promotion(params, data, headers, proxy_url)
result = response.get('data', {})
logger.success(f'创建全域推广成功-->{result}')
return {
'code': 200,
'msg': 'success',
'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