Commit d2108791 by baiquan

init

parent 21a0795d
import execjs
from loguru import logger from loguru import logger
from celery.result import AsyncResult from celery.result import AsyncResult
from fastapi import FastAPI, APIRouter from fastapi import FastAPI, APIRouter
from fastapi import status from fastapi import status
from pydantic import BaseModel from pydantic import BaseModel
from celery_app import celery_app from celery_app import celery_app
from errors import * from errors import *
import os
# 创建 logs 目录(如果不存在)
os.makedirs("logs", exist_ok=True)
# 添加日志文件输出,按7天滚动
logger.add("logs/api.log", rotation="7 day", level="INFO", encoding="utf-8", backtrace=True, diagnose=True)
app = FastAPI(title="doudian数据同步平台") app = FastAPI(title="doudian数据同步平台")
sync_router = APIRouter(prefix="/sync", tags=["同步接口"]) sync_router = APIRouter(prefix="/sync", tags=["同步接口"])
...@@ -19,7 +22,8 @@ class SyncShopRequest(BaseModel): ...@@ -19,7 +22,8 @@ class SyncShopRequest(BaseModel):
class SyncShopInfoRequest(BaseModel): class SyncShopInfoRequest(BaseModel):
browser_id: str browser_id: str
listen_data: dict listen_url: str
open_url: str
class CreateTemplateRequest(BaseModel): class CreateTemplateRequest(BaseModel):
cookies: dict cookies: dict
......
...@@ -83,13 +83,15 @@ def search_category(cookies, key): ...@@ -83,13 +83,15 @@ def search_category(cookies, key):
print(response.text) print(response.text)
return response.json()['data'] return response.json()['data']
def get_a_bogus(a_bogus_js_path, params,data, userAgent):
def get_a_bogus(a_bogus_js_path, params, data, userAgent):
with open(a_bogus_js_path, 'r', encoding='gbk') as f: with open(a_bogus_js_path, 'r', encoding='gbk') as f:
a_bogus_js = f.read() a_bogus_js = f.read()
a_bogus = execjs.compile(a_bogus_js).call('get_ab', params,data, userAgent) a_bogus = execjs.compile(a_bogus_js).call('get_ab', params, data, userAgent)
# print(f'a_bogus: {a_bogus}') # print(f'a_bogus: {a_bogus}')
return a_bogus return a_bogus
def get_schema(cookies, category_id): def get_schema(cookies, category_id):
params = { params = {
'appid': '1', 'appid': '1',
...@@ -107,9 +109,9 @@ def get_schema(cookies, category_id): ...@@ -107,9 +109,9 @@ def get_schema(cookies, category_id):
'_bid': 'ffa_goods', '_bid': 'ffa_goods',
} }
url = 'https://fxg.jinritemai.com/product/tproduct/getSchema' url = 'https://fxg.jinritemai.com/product/tproduct/getSchema'
a_bogus = get_a_bogus('./js/a_bogus.js', urlencode(params), json_data, headers['User-Agent']) a_bogus = get_a_bogus('a_bogus.js', urlencode(params), json_data, headers['User-Agent'])
params['a_bogus'] = a_bogus params['a_bogus'] = a_bogus
response = requests.post(url,params=params,cookies=cookies,headers=headers,json=json_data,impersonate="chrome131") response = requests.post(url, params=params, cookies=cookies, headers=headers, json=json_data, impersonate="chrome131")
print(response.text) print(response.text)
return response.json()['data'] return response.json()['data']
...@@ -128,8 +130,8 @@ def upload_image_by_bytes(cookies, image_bytes): ...@@ -128,8 +130,8 @@ def upload_image_by_bytes(cookies, image_bytes):
url = 'https://fxg.jinritemai.com/product/img/batchupload?_bid=ffa_goods' url = 'https://fxg.jinritemai.com/product/img/batchupload?_bid=ffa_goods'
mp = CurlMime() mp = CurlMime()
for i, byte_data in enumerate(image_bytes): for i, byte_data in enumerate(image_bytes):
mp.addpart(name=f"image[{i}]", content_type="image/jpeg",filename=f"image_{i}.jpg", data=byte_data) mp.addpart(name=f"image[{i}]", content_type="image/jpeg", filename=f"image_{i}.jpg", data=byte_data)
response = requests.post(url,cookies=cookies,headers=headers,data={"foo":"bar"},multipart=mp,impersonate="chrome131") response = requests.post(url, cookies=cookies, headers=headers, data={"foo": "bar"}, multipart=mp, impersonate="chrome131")
print(response.text) print(response.text)
mp.close() mp.close()
return response.json()['data'] return response.json()['data']
...@@ -156,6 +158,7 @@ def get_prettify_info(cookies, category_id, url_list): ...@@ -156,6 +158,7 @@ def get_prettify_info(cookies, category_id, url_list):
print(response.text) print(response.text)
return response.json()['data'] return response.json()['data']
def generate_id(length=18): def generate_id(length=18):
"""生成18位随机数字ID""" """生成18位随机数字ID"""
return str(random.randint(10 ** (length - 1), 10 ** length - 1)) return str(random.randint(10 ** (length - 1), 10 ** length - 1))
...@@ -199,7 +202,7 @@ def build_spec_structure(spec_params): ...@@ -199,7 +202,7 @@ def build_spec_structure(spec_params):
{'id': value_id, 'name': value, {'id': value_id, 'name': value,
'image_url': spec_params.get('specs_images')['specs_images_values'][value]}) 'image_url': spec_params.get('specs_images')['specs_images_values'][value]})
else: else:
spec_values.append({'id': value_id, 'name': value }) spec_values.append({'id': value_id, 'name': value})
value_mapping[value] = value_id value_mapping[value] = value_id
spec_mapping[spec_name] = value_mapping spec_mapping[spec_name] = value_mapping
result['spec_detail']['value'].append({ result['spec_detail']['value'].append({
...@@ -228,6 +231,7 @@ def build_spec_structure(spec_params): ...@@ -228,6 +231,7 @@ def build_spec_structure(spec_params):
return result return result
def search_brand_prefix(cookies, category_id, brand_name): def search_brand_prefix(cookies, category_id, brand_name):
params = { params = {
'cid': str(category_id), 'cid': str(category_id),
...@@ -235,13 +239,14 @@ def search_brand_prefix(cookies, category_id, brand_name): ...@@ -235,13 +239,14 @@ def search_brand_prefix(cookies, category_id, brand_name):
'appid': '1', 'appid': '1',
} }
url = 'https://fxg.jinritemai.com/product/tproduct/brandPrefix' url = 'https://fxg.jinritemai.com/product/tproduct/brandPrefix'
response = requests.get(url,params=params,cookies=cookies,headers=headers) response = requests.get(url, params=params, cookies=cookies, headers=headers)
search_result = response.json()['data'] search_result = response.json()['data']
print(search_result) print(search_result)
if not search_result: if not search_result:
return None return None
return search_result[0] return search_result[0]
def add_with_schema(cookies, schema, goods_params): def add_with_schema(cookies, schema, goods_params):
if goods_params.get('detail_prettify_image', None): if goods_params.get('detail_prettify_image', None):
prettify_info = get_prettify_info(cookies, schema['context']['category_id'], goods_params['detail_prettify_image']) prettify_info = get_prettify_info(cookies, schema['context']['category_id'], goods_params['detail_prettify_image'])
...@@ -796,7 +801,6 @@ def add_with_schema(cookies, schema, goods_params): ...@@ -796,7 +801,6 @@ def add_with_schema(cookies, schema, goods_params):
print(response.text) print(response.text)
if __name__ == '__main__': if __name__ == '__main__':
account = 'dybaihuo58@163.com' account = 'dybaihuo58@163.com'
password = 'Cc123123' password = 'Cc123123'
...@@ -806,7 +810,6 @@ if __name__ == '__main__': ...@@ -806,7 +810,6 @@ if __name__ == '__main__':
'PHPSESSID_SS': '232b5651dcd01b596b830d540362643d', 'PHPSESSID_SS': '232b5651dcd01b596b830d540362643d',
} }
pic_image_path_list = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg', 'image5.jpg'] pic_image_path_list = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg', 'image5.jpg']
image_bytes = [] image_bytes = []
for image_path in pic_image_path_list: for image_path in pic_image_path_list:
......
...@@ -31,6 +31,8 @@ async def sendRequest(method: HttpMethod, url: str, json_data: dict = None, **kw ...@@ -31,6 +31,8 @@ async def sendRequest(method: HttpMethod, url: str, json_data: dict = None, **kw
# 判断是否有code字段 # 判断是否有code字段
if 'code' in response: if 'code' in response:
if response['code'] != 0: if response['code'] != 0:
logger.error(f'hub接口异常返回值:{response}')
logger.error(json_data)
raise HubAPIError(msg=response['msg']) raise HubAPIError(msg=response['msg'])
if response['code'] != 0: if response['code'] != 0:
...@@ -102,8 +104,11 @@ async def closeBrowser(browser_id: str = ""): ...@@ -102,8 +104,11 @@ async def closeBrowser(browser_id: str = ""):
if browser_status_data: if browser_status_data:
containers = browser_status_data.get('containers', {}) containers = browser_status_data.get('containers', {})
if containers: if containers:
try:
if (containers[0]['status'] == 1 or containers[0]['status'] == 0) and containers[0]['containerCode'] == browser_id: if (containers[0]['status'] == 1 or containers[0]['status'] == 0) and containers[0]['containerCode'] == browser_id:
return await sendRequest("POST", url=url, json_data=data) return await sendRequest("POST", url=url, json_data=data)
except Exception as e:
logger.error(f"关闭浏览器异常-->{e}")
async def checkBrowserStatus(browser_id: str = ""): async def checkBrowserStatus(browser_id: str = ""):
""" """
......
...@@ -11193,8 +11193,6 @@ window.bdms || function () { ...@@ -11193,8 +11193,6 @@ window.bdms || function () {
function get_ab(params,data,ua) { function get_ab(params,data,ua) {
if (typeof data == "object")
data = JSON.stringify(data)
return window.bdms.init._v[2].p[48].apply(null, [0, 1, 14, params, data, ua]) return window.bdms.init._v[2].p[48].apply(null, [0, 1, 14, params, data, ua])
} }
......
...@@ -3,8 +3,8 @@ from asyncio.log import logger ...@@ -3,8 +3,8 @@ from asyncio.log import logger
from DrissionPage import Chromium from DrissionPage import Chromium
from DrissionPage.common import Settings from DrissionPage.common import Settings
from common import setup_proxy from common import setup_proxy
from config import settings
from errors import * from errors import *
from hub_ import * from hub_ import *
...@@ -30,6 +30,7 @@ HEADERS = { ...@@ -30,6 +30,7 @@ HEADERS = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0',
} }
async def syncShop(container_name: str): async def syncShop(container_name: str):
""" """
同步店铺 同步店铺
...@@ -134,6 +135,7 @@ async def syncShopInfo(parameter: dict = None): ...@@ -134,6 +135,7 @@ async def syncShopInfo(parameter: dict = None):
except: except:
raise NotFoundError('获取数据失败') raise NotFoundError('获取数据失败')
def getRegionNodeList(): def getRegionNodeList():
params = { params = {
'level': '4', 'level': '4',
...@@ -142,8 +144,10 @@ def getRegionNodeList(): ...@@ -142,8 +144,10 @@ def getRegionNodeList():
response = requests.get('https://ecomuser.snssdk.com/area/getdivision', params=params, headers=HEADERS) response = requests.get('https://ecomuser.snssdk.com/area/getdivision', params=params, headers=HEADERS)
return response.json()['data']['region_node_list'] return response.json()['data']['region_node_list']
REGION_NODE_LIST = getRegionNodeList() REGION_NODE_LIST = getRegionNodeList()
def getProductName(product_type, product_name): def getProductName(product_type, product_name):
if product_type == 'province': if product_type == 'province':
for region_node in REGION_NODE_LIST: for region_node in REGION_NODE_LIST:
...@@ -159,6 +163,7 @@ def getProductName(product_type, product_name): ...@@ -159,6 +163,7 @@ def getProductName(product_type, product_name):
else: else:
raise NotFoundError("未找到城市") raise NotFoundError("未找到城市")
async def createTemplate(cookies, template_params, proxies): async def createTemplate(cookies, template_params, proxies):
addr = proxies['addr'] addr = proxies['addr']
port = proxies['port'] port = proxies['port']
...@@ -564,7 +569,7 @@ async def createTemplate(cookies, template_params, proxies): ...@@ -564,7 +569,7 @@ async def createTemplate(cookies, template_params, proxies):
} }
logger.info(rule_list) logger.info(rule_list)
url = 'https://fxg.jinritemai.com/freight/template/createTemplate' url = 'https://fxg.jinritemai.com/freight/template/createTemplate'
response = session.post(url,params=params,cookies=cookies,headers=HEADERS,json=json_data).json() response = session.post(url, params=params, cookies=cookies, headers=HEADERS, json=json_data).json()
logger.info(response) logger.info(response)
if response['code'] != 0: if response['code'] != 0:
msg = response.get('msg', '') msg = response.get('msg', '')
......
...@@ -40,12 +40,13 @@ def execute_sync_shop(container_name: str): ...@@ -40,12 +40,13 @@ def execute_sync_shop(container_name: str):
} }
@shared_task(name='sync_shop_info') @shared_task(name='sync_shop_info')
def execute_sync_shop_info(browser_id: str, listen_data: list): def execute_sync_shop_info(browser_id: str, listen_url: str, open_url: str):
"""执行店铺信息同步任务""" """执行店铺信息同步任务"""
try: try:
parameter = { parameter = {
'browser_id': browser_id, 'browser_id': browser_id,
'listen_data': listen_data 'listen_url': listen_url,
'open_url': open_url,
} }
result = asyncio.run(syncShopInfo(parameter)) result = asyncio.run(syncShopInfo(parameter))
return { return {
...@@ -168,6 +169,7 @@ def execute_generate_a_bogus(params:str | dict,data: dict,ua: str): ...@@ -168,6 +169,7 @@ def execute_generate_a_bogus(params:str | dict,data: dict,ua: str):
ctx = execjs.compile(js_code) ctx = execjs.compile(js_code)
if type(params) == dict: if type(params) == dict:
params = urlencode(params) params = urlencode(params)
data = json.dumps(data)
result = ctx.call('get_ab', params, data, ua) result = ctx.call('get_ab', params, data, ua)
return { return {
'code': 200, 'code': 200,
......
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