feat: add xpd purchase records view
This commit is contained in:
@@ -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 小程序绑定角色)。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user