84 lines
2.5 KiB
Python
84 lines
2.5 KiB
Python
import hashlib
|
||
import time
|
||
from typing import Dict, Any, List, Optional
|
||
|
||
import httpx
|
||
|
||
from app.log import logger
|
||
|
||
|
||
# 同步辅助函数(无 await,纯计算)
|
||
def safe_get(obj: Optional[Dict], key: str, default: str = "") -> str:
|
||
if obj is None:
|
||
return default
|
||
value = obj.get(key)
|
||
return str(value) if value is not None else default
|
||
|
||
|
||
def safe_join(data, default: str = "") -> str:
|
||
if data is None:
|
||
return default
|
||
if isinstance(data, list):
|
||
return ",".join(str(item) for item in data if item)
|
||
return str(data) if data else default
|
||
|
||
|
||
# 模块级 httpx 单例
|
||
_http_client: Optional[httpx.AsyncClient] = None
|
||
|
||
|
||
def get_http_client() -> httpx.AsyncClient:
|
||
global _http_client
|
||
if _http_client is None or _http_client.is_closed:
|
||
_http_client = httpx.AsyncClient(timeout=30.0)
|
||
return _http_client
|
||
|
||
|
||
async def close_http_client() -> None:
|
||
global _http_client
|
||
if _http_client is not None and not _http_client.is_closed:
|
||
await _http_client.aclose()
|
||
_http_client = None
|
||
|
||
|
||
def _build_auth_url() -> str:
|
||
from_id = 9910056
|
||
timestamp = int(time.time())
|
||
salt = "jWcIqJK6QlR2syb6HQgpel9iOoOkj01G5MDFNtQLaTxhddHUTEnURsMe2RxCTYC8"
|
||
token = hashlib.md5((salt + str(timestamp)).encode()).hexdigest()
|
||
return f"http://external-data.qixin.com/extend/extend_data_push?from={from_id}&token={token}&time={timestamp}"
|
||
|
||
|
||
_PUSH_HEADERS = {
|
||
"Content-Type": "application/json",
|
||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
|
||
}
|
||
|
||
|
||
async def push_to_remote(data: Dict[str, Any]) -> bool:
|
||
source_type = data.get("source_type", "未知平台")
|
||
title = data.get("title", "未知职位")
|
||
company = data.get("company_name", data.get("name", "未知公司"))
|
||
logger.info(f"上报数据: [{source_type}] {title} - {company}")
|
||
print(data)
|
||
|
||
try:
|
||
url = _build_auth_url()
|
||
client = get_http_client()
|
||
response = await client.post(url, json=data, headers=_PUSH_HEADERS)
|
||
if response.status_code == 200:
|
||
return True
|
||
logger.error(f"数据发送失败: {response.status_code} - {response.text[:100]}")
|
||
return False
|
||
except Exception as e:
|
||
logger.error(f"发送异常: {e}")
|
||
return False
|
||
|
||
|
||
async def batch_push_to_remote(data_list: List[Dict[str, Any]]) -> None:
|
||
for data in data_list:
|
||
try:
|
||
await push_to_remote(data)
|
||
except Exception as e:
|
||
logger.error(f"批量推送单条失败: {e}")
|