增加兑换

This commit is contained in:
yml2213
2026-07-28 18:12:11 +08:00
parent 624198bca4
commit 8de269f958
11 changed files with 618 additions and 14 deletions
+107 -4
View File
@@ -50,6 +50,8 @@ class DouyuActivityClient:
ESPORTS_AGREEMENT_API = "https://www.douyu.com/wgapi/ordnc/activity/peacematch/agreement"
ESPORTS_ACT_BIND_API = "https://www.douyu.com/wgapi/ordnc/live/memberthird/tencent/actBind"
ESPORTS_USER_INFO_API = "https://www.douyu.com/wgapi/ordnc/activity/peacematch/getUserInfo"
ESPORTS_GOODS_API = "https://www.douyu.com/wgapi/ordnc/activity/peacematch/storehome"
ESPORTS_EXCHANGE_API = "https://www.douyu.com/wgapi/ordnc/activity/peacematch/exchange"
GOLD_QR_API = "https://cz.douyu.com/m/gold/getQrCode"
GOLD_ACCOUNT_API = "https://cz.douyu.com/item/gold/account"
EXCHANGE_BALANCE_API = "https://www.douyu.com/wjapi/nc/exchange/fim"
@@ -507,6 +509,71 @@ class DouyuActivityClient:
"raw": payload,
}
@staticmethod
def _esports_shop_referer(rid: str) -> str:
return (
"https://www.douyu.com/pages/live-peace-pel/web/shop"
f"?roomId={rid or '0'}&isAnchorSide=0"
)
def list_esports_goods(self, *, manual_id: str, rid: str) -> dict[str, Any]:
"""查询电竞手册皮肤商城。"""
payload = self._request_json(
"get",
self.ESPORTS_GOODS_API,
"刷新电竞皮肤商城",
params={"manualID": manual_id, "rid": rid},
headers={
"Origin": "",
"Referer": self._esports_shop_referer(rid),
},
)
goods = (payload.get("data") or {}).get("list") or []
return {
"goods": goods,
"score": (payload.get("data") or {}).get("score"),
"raw": payload,
}
def exchange_esports_goods(
self,
*,
manual_id: str,
rid: str,
commodity_id: str,
quantity: int = 1,
ctn: str | None = None,
) -> dict[str, Any]:
"""兑换电竞手册皮肤商城商品。"""
referer = self._esports_shop_referer(rid)
ctn_value = ctn or self.esports_ctn(referer=referer)
self._set_cookie_value("acf_ccn", ctn_value)
payload = self._request_json(
"post",
self.ESPORTS_EXCHANGE_API,
"兑换电竞皮肤",
data={
"manualID": manual_id,
"commodityID": commodity_id,
"rid": rid or "0",
"num": str(max(1, quantity)),
"ctn": ctn_value,
},
headers={
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "",
"Referer": referer,
},
)
if payload.get("error") not in (0, "0"):
raise DouyuActivityError(payload.get("msg") or "兑换电竞皮肤失败")
return {
"commodity_id": commodity_id,
"quantity": max(1, quantity),
"ctn": ctn_value,
"raw": payload,
}
def create_gold_qr(self, *, amount: int, pay_type: int = 1, product_id: str = "DYTV_Product_Gold_1") -> dict[str, Any]:
"""生成鱼翅充值支付二维码。"""
payload = self._request_json(
@@ -533,19 +600,20 @@ class DouyuActivityClient:
raise DouyuActivityError(payload.get("msg") or "生成鱼翅充值码失败")
return {"pay_url": pay_url, "token": token, "raw": payload}
def donate_elite_gift(
def _donate_gift(
self,
*,
gift_count: int,
room_id: str,
gift_id: str,
skin_id: str,
source: str,
) -> dict[str, Any]:
"""赠送精英令礼物。"""
"""赠送直播间礼物。"""
payload = self._request_json(
"post",
self.DONATE_API,
"赠送精英令",
source,
data={
"giftId": gift_id,
"giftCount": str(gift_count),
@@ -559,9 +627,44 @@ class DouyuActivityClient:
},
)
if payload.get("error") not in (0, "0") and payload.get("msg") != "success":
raise DouyuActivityError(payload.get("msg") or "赠送精英令失败")
raise DouyuActivityError(payload.get("msg") or f"{source}失败")
return {"raw": payload}
def donate_elite_gift(
self,
*,
gift_count: int,
room_id: str,
gift_id: str,
skin_id: str,
) -> dict[str, Any]:
"""赠送精英令礼物。"""
return self._donate_gift(
gift_count=gift_count,
room_id=room_id,
gift_id=gift_id,
skin_id=skin_id,
source="赠送精英令",
)
def donate_esports_gift(
self,
*,
gift_name: str,
gift_count: int,
room_id: str,
gift_id: str,
skin_id: str,
) -> dict[str, Any]:
"""赠送电竞手册任务指定礼物。"""
return self._donate_gift(
gift_count=gift_count,
room_id=room_id,
gift_id=gift_id,
skin_id=skin_id,
source=f"赠送{gift_name}",
)
def query_points(self, *, uid: str, ctn: str) -> dict[str, Any]:
"""查询手册积分余额。"""
payload = self._request_json(