feat: add xpd purchase records view

This commit is contained in:
yml2213
2026-08-08 21:41:44 +08:00
parent 948e7d7246
commit a342dddcb6
5 changed files with 300 additions and 2 deletions
+100
View File
@@ -823,6 +823,7 @@ class DouyuActivityClient:
XPD_BIND_INFO_API = "https://www.douyu.com/japi/carnivalApi/v2/tencent/bindInfo"
XPD_DAOJU_REFERER = "https://app.daoju.qq.com/"
XPD_GET_ROLE_API = "https://apps.game.qq.com/daoju/igw/live"
XPD_ORDER_API = "https://apps.game.qq.com/daoju/igw/live/"
# 2026-08 抓包(8.6-和平小店)实证:本期走 xn_live_cjm 变体(旧期为 recommend_live/common)
XPD_RECOMMEND_API = "https://apps.game.qq.com/daoju/v3/recommend_xn_live_cjm/common"
XPD_BALANCE_API = "https://apps.game.qq.com/daoju/igw/live/"
@@ -1036,6 +1037,105 @@ class DouyuActivityClient:
return {"goods": goods, "raw": {"pages": pages}}
def xpd_purchase_records(
self,
*,
embed_query: dict[str, str],
act_id: str,
page_size: int = 10,
max_pages: int = 100,
) -> dict[str, Any]:
"""查询和平小店购买记录,接口参数来自道聚城 H5 抓包。"""
page_size = max(1, min(int(page_size), 50))
records: list[dict[str, Any]] = []
pages: list[dict[str, Any]] = []
total = 0
for page in range(1, max_pages + 1):
params = {
"_service": "order.list",
"_jsvar": "info",
"acctype": "livelink",
"_app_id": "2123",
"hist": "0",
"ps": str(page_size),
"pn": str(page),
"_biz_code": "cjm",
"_act_id": str(act_id),
"authType": "delegate",
"actId": embed_query.get("actId") or "",
"appId": embed_query.get("appId") or "bp_cf",
"gameId": embed_query.get("gameId") or "cjm",
"livePlatId": embed_query.get("livePlatId") or "douyu",
"code": embed_query.get("code") or "",
"timestamp": embed_query.get("timestamp") or "",
"v": embed_query.get("v") or "",
"sig": embed_query.get("sig") or "",
"_sid": "8",
"set": "8",
}
response = self._request(
"get",
self.XPD_ORDER_API,
source=f"查询小店购买记录第 {page}",
params=params,
headers=self._xpd_daoju_headers(),
)
info = self._xpd_parse_var(response.text, "info")
if str(info.get("ret") or "0") != "0":
raise DouyuActivityError(str(info.get("msg") or "小店购买记录查询失败"))
data = info.get("data") if isinstance(info.get("data"), dict) else {}
page_records = data.get("list") if isinstance(data.get("list"), list) else []
total = self._xpd_int(data.get("cnt")) or total
pages.append(info)
for record in page_records:
if not isinstance(record, dict):
continue
goods_info = record.get("sGoodsInfo")
if isinstance(goods_info, str):
try:
goods_info = json.loads(goods_info)
except json.JSONDecodeError:
goods_info = {}
goods_list = goods_info.get("list") if isinstance(goods_info, dict) else []
goods = (
goods_list[0]
if isinstance(goods_list, list) and goods_list and isinstance(goods_list[0], dict)
else {}
)
app_ext = record.get("sAppExt")
if isinstance(app_ext, str):
try:
app_ext = json.loads(app_ext)
except json.JSONDecodeError:
app_ext = {}
records.append({
"serial": str(record.get("sSerialNum") or ""),
"goods_name": str(
goods.get("sGoodsName")
or goods.get("sPacketName")
or record.get("sActionDesc")
or ""
),
"goods_image": str(goods.get("sGoodsPic") or (app_ext or {}).get("sGoodsPic") or ""),
"buy_time": str(record.get("dtBuyTime") or ""),
"pay_time": str(record.get("dtPayTime") or ""),
"status": str(record.get("iStatus") or ""),
"price": self._xpd_int(record.get("iPrice")),
"pay_amount": self._xpd_int(record.get("iPayAmount")),
"pay_type": str(record.get("sPayType") or ""),
"role_name": str(record.get("sRoleName") or ""),
"send_status": str(goods.get("iSendStatus") or ""),
"delivery_message": str(goods.get("deliveryMsg") or ""),
"raw": record,
})
if len(page_records) < page_size or len(records) >= total:
break
return {"records": records, "total": total or len(records), "raw": {"pages": pages}}
def xpd_bind_qr(self, *, act_alias: str) -> dict[str, Any]:
"""生成和平小店绑定二维码链接(微信扫码进入 livelink 小程序绑定角色)。