JobData/app/services/ingest/remote_push.py
2026-03-24 01:49:31 +08:00

84 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}")