fix(huya): 开通商品只保留真正可购买的 spu,并清理历史死商品行

真机 2026-10-15(HAR 10.15-精英徽章两个-1 + 逐个 spu 探测):面板里的「精英徽章 hy-5872824」是积分中心「赠送指定礼物得积分」那排的礼物 spu —— getGoodsInfoV5 仍返回 200+价格,但 listPayChannelV5 返回 401「您的设备环境暂不支持购买该商品」,所以下单必报「当前支付渠道不可用」(与数量无关)。真能买的是 hy-8343549 精英徽章 ¥1 / hy-8343551 精英令 ¥10。

- 内置候选换成可购买的 4 个:hy-8328015 宝典 / hy-8327356 币 / hy-8343549 徽章 / hy-8343551 令
- 刷新商品增加「能买到」闸门:详情 200 后再校验 listPayChannelV5,非 200 或渠道为空即剔除并记录服务端原话
- 下单流程渠道失败时透出服务端消息,只有渠道真不在可用列表才说「当前支付渠道不可用(可用:…)」
- 商品列表只认「最近一次刷新」那一套:原先按账号并集返回,别的账号旧刷新留下的礼物 spu 会和最新一套叠成 7 个选项
- 刷新时清理历史死行:本账号旧行 + 全局默认行(account_id 为空)+ 其它账号里已不在候选中的 spu 行
- 测试:401 商品被剔除、渠道失败透传、列表只认最近一套、刷新清理别处死行
This commit is contained in:
yml2213
2026-10-15 21:01:23 +08:00
parent 86ca2ed021
commit 9a0d59825c
5 changed files with 315 additions and 47 deletions
+15 -5
View File
@@ -134,19 +134,29 @@ def list_recharge_goods(
):
"""查看已缓存的虎牙充值商品快照。
只返回账号级快照(account_id 非空):库里还有一批 2026-07-04 写入的全局默认行
(account_id 为空、sid=0,含旧版精英宝典/精英令/精英徽章),它们已不是当前在售
商品,未刷新过的账号显示空列表、点一次「刷新开通商品」即可。同一 spu_id 只保留
最新一行,避免下拉框出现同名重复项。
商品目录是**全局同一套**(每个账号刷出来的是同样的商品),但表里是按账号存的行,
所以这里只返回「最近一次刷新」那一整套:
- 账号级旧刷新留下的行(真机 2026-10-15:账号 65/66 的旧礼物 spu)会和最新一套
并集成 7 个选项,面板里就能选到「能看不能买」的商品;
- 2026-07-04 写入的全局默认行(account_id 为空、sid=0)已不是当前在售商品,一并忽略。
同一 spu_id 只保留最新一行,避免下拉框出现同名重复项。
"""
rows = (
db.query(HuyaRechargeGoodsSnapshot)
.filter(HuyaRechargeGoodsSnapshot.account_id.is_not(None))
.order_by(HuyaRechargeGoodsSnapshot.id.desc())
.order_by(
HuyaRechargeGoodsSnapshot.updated_at.desc(),
HuyaRechargeGoodsSnapshot.id.desc(),
)
.all()
)
if not rows:
return []
newest = rows[0].updated_at
latest: dict[str, HuyaRechargeGoodsSnapshot] = {}
for row in rows:
if row.updated_at != newest:
continue
latest.setdefault(row.spu_id, row)
return list(latest.values())