Files
kami_spider_monorepo/apps/jd/router/app_store.py
danial 95f949c79f 函数中异常处理及proxy池相关代码结构,提升容错性
- 优化XiechengCardSpider初始化调用顺序,提前获取x_token
- 修正部分日志打印格式,统一异常日志输出
- 更新代理服务器默认请求地址,移除多余参数
2025-11-04 14:24:32 +08:00

241 lines
10 KiB
Python
Raw 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.

from typing import Any
import traceback
from fastapi import APIRouter
from fastapi.concurrency import run_in_threadpool
from apps.jd.schemas.models import (
AppStoreRequest,
AppleStoreRequestCategoryEnum,
PlatPayResponseData,
QueryCardRequest,
QueryCardResponseData,
)
from apps.jd.services.app_store import AppStoreSpider
from apps.jd.services.ctrip import XiechengCardSpider
from apps.shared.proxy_pool.proxy_pool import ProxyPoolFactory
from core.config import ProxyPoolType
from core.exceptions import JDServiceException
from core.responses import ApiResponse, BusinessCode, error, success
from observability.logging import LoggerAdapter, get_logger_with_trace
router = APIRouter(tags=["苹果权益充值"])
logger: LoggerAdapter = get_logger_with_trace(__name__)
@router.post("/app/store", response_model=ApiResponse[PlatPayResponseData])
async def app_store(
request_data: AppStoreRequest,
) -> ApiResponse[PlatPayResponseData] | ApiResponse[Any]:
"""苹果权益充值"""
# 接收参数
order_num = request_data.order_num
cookies = request_data.cookies.strip()
res = {}
try:
match request_data.category:
case AppleStoreRequestCategoryEnum.Apple:
return error(code=BusinessCode.NOT_IMPLEMENTED)
# app_store_ = AppStoreSpider(
# cookies=cookies,
# face_price=request_data.face_price,
# order_num=order_num,
# )
# code, res, msg = await run_in_threadpool(app_store_.run)
# logger.info(msg=f"订单ID{order_num},最终返回日志:{res}")
# return success(data=res, message=msg)
case AppleStoreRequestCategoryEnum.CTrip:
# 10010164405229636
# 20010164405699325
# 30010164405273963
# 50010164404344795
# 20010155862962901
# 30010155867355510
# 50010155863307550
# 100010155867606890
# 100010164403489305
# 100010157256668464
# 50010157256668463
# 30010157256668462
# 20010157256668461
# 10010157256668460
skus = {
10.0: "10186761790338",
20.0: "10157199199546",
100.0: "10157256668460",
200.0: "10155862962901",
300.0: "10164405273963",
500.0: "10164404344795",
1000.0: "10155867606890",
102.0: "10157256668460",
308.0: "10155867355510",
520: "10155863307550",
1026: "10155867606890",
}
if request_data.face_price not in skus:
return error(
code=BusinessCode.JD_ORDER_FACE_PRICE_ERR,
data=PlatPayResponseData(
**{
"deeplink": "",
"order_id": "",
"pay_id": "",
"remark": "不支持的充值面额",
"face_price": 0,
}
),
message="不支持的充值金额",
)
err = None
for _ in range(2):
try:
c_trip_spider = XiechengCardSpider(
cookies=cookies,
order_num=order_num,
sku_id=skus[request_data.face_price],
)
code, res = await run_in_threadpool(c_trip_spider.run)
if code == BusinessCode.SUCCESS:
return success(data=res)
return error(code=code, data=res, message="请求完成")
except JDServiceException as e:
err = e
if e.code == BusinessCode.JD_ORDER_RISK_ERR:
proxy_pool = ProxyPoolFactory.get_proxy_pool(
ProxyPoolType.EXPIRING, expire_time=60
)
proxy = proxy_pool.get_proxy(order_id=order_num)
if proxy:
proxy_pool.remove_invalid_proxy(proxy)
continue
raise
except Exception as e:
logger.error(f"请求失败:{traceback.format_exc()}")
return error(code=BusinessCode.INTERNAL_ERROR, message=str(e))
return error(
code=BusinessCode.JD_ORDER_RISK_ERR,
message=err.message if err else "风控",
)
case AppleStoreRequestCategoryEnum.Walmart:
skus = {
100.0: "10140177420168",
200.0: "10140177579817",
300.0: "10140177668026",
500.0: "10140177784201",
1000.0: "10140177806944",
}
if request_data.face_price not in skus:
return error(
code=BusinessCode.JD_ORDER_FACE_PRICE_ERR,
data={},
message="不支持的充值金额",
)
err = None
for _ in range(2):
try:
c_trip_spider = XiechengCardSpider(
cookies=cookies,
order_num=order_num,
sku_id=skus[request_data.face_price],
)
code, res = await run_in_threadpool(c_trip_spider.run)
if code == BusinessCode.SUCCESS:
return success(data=res)
return error(code=code, data=res, message="请求完成")
except JDServiceException as e:
err = e
if e.code == BusinessCode.JD_ORDER_RISK_ERR:
proxy_pool = ProxyPoolFactory.get_proxy_pool(
ProxyPoolType.EXPIRING, expire_time=60
)
proxy = proxy_pool.get_proxy(order_id=order_num)
if proxy:
proxy_pool.remove_invalid_proxy(proxy)
continue
raise
except Exception as e:
logger.error(f"请求失败:{traceback.format_exc()}")
return error(code=BusinessCode.INTERNAL_ERROR, message=str(e))
return error(
code=BusinessCode.JD_ORDER_RISK_ERR,
message=err.message if err else "风控",
)
except JDServiceException:
raise
except Exception as e:
return error(
code=BusinessCode.INTERNAL_ERROR,
message=str(e),
)
@router.post("/query/card", response_model=ApiResponse[QueryCardResponseData])
async def query_card(request_data: QueryCardRequest):
"""查卡密"""
cookies = request_data.cookies.strip()
# 打印参数日志
logger.info(f"订单:{request_data}")
try:
match request_data.category:
case AppleStoreRequestCategoryEnum.Apple:
app_store_ = AppStoreSpider(
cookies=cookies, order_num=request_data.jd_order_id
)
code, res = await run_in_threadpool(
app_store_.query_card, request_data.jd_order_id
)
logger.info(
f"订单号:{request_data.order_id}订单ID{request_data.jd_order_id},最终返回日志:{res}"
)
if code == BusinessCode.SUCCESS:
return success(data=res)
return error(code=code, data=res, message="查询完成")
case (
AppleStoreRequestCategoryEnum.CTrip
| AppleStoreRequestCategoryEnum.Walmart
):
err = None
for _ in range(2):
try:
c_trip_spider = XiechengCardSpider(
cookies=cookies,
order_num=request_data.jd_order_id,
sku_id=request_data.order_id,
)
code, res = await run_in_threadpool(
c_trip_spider.get_locdetails, request_data.jd_order_id
)
logger.info(
f"订单号:{request_data.order_id}订单ID{request_data.jd_order_id},最终返回日志:{res}"
)
if code == BusinessCode.SUCCESS:
return success(data=res)
except JDServiceException as e:
err = e
if e.code == BusinessCode.JD_ORDER_RISK_ERR:
proxy_pool = ProxyPoolFactory.get_proxy_pool(
ProxyPoolType.EXPIRING, expire_time=60
)
proxy = proxy_pool.get_proxy(order_id=request_data.order_id)
if proxy:
proxy_pool.remove_invalid_proxy(proxy)
continue
except Exception as e:
logger.error(f"请求失败:{traceback.format_exc()}")
return error(
code=BusinessCode.INTERNAL_ERROR,
)
return error(
code=BusinessCode.JD_ORDER_RISK_ERR,
message=err.message if err else "风控",
)
except Exception as e:
logger.error(f"查询卡密失败: {traceback.format_exc()}")
return error(code=BusinessCode.INTERNAL_ERROR, data=None, message="查询异常")