纯标准库实现华为云成长中心抢券脚本:CSRF 与登录态续期实践
华为云成长中心的积分可以兑换代金券,但 100 元、200 元档位的券每天放量很少,手点基本抢不到。我用 Python 标准库写了一个轮询脚本,跑在服务器上,这里记录几个关键点。
一、接口结构
成长中心的接口都在同一个前缀下:
https://devdata.huaweicloud.com/rest/developer/fwdu/rest/developer/user/hdcommunitysoservice/v1/growth
奖品列表用 POST /prize,兑换用 POST /prize-exchange,请求体只需要三个字段:
{"prize_id": "...", "version": 6, "prize_count": 1}
version 是奖品配置的版本号,必须用列表接口返回的最新值,否则会报版本冲突。
二、CSRF 不是从 Cookie 里拿
一开始我以为 csrf-eco 这个 Cookie 就能直接用,结果请求一直返回 403 CSRF unequal。正确做法是先请求:
GET https://devdata.huaweicloud.com/api/get-ainfo
从响应头里读 csrf 字段,再放到后续请求的 csrf 请求头里。这个 token 有时效,我设了 5 分钟主动刷新。
三、登录态会自动过期
Cookie 里最关键的几个是 SessionID、cbc-sid、vk。它们会在几小时后失效,表现为接口返回 not login。
处理方式是静默续期:带着现有 Cookie 请求
https://auth.huaweicloud.com/authui/login?service=<回跳地址>
如果 Cookie 还有效,服务端会直接 302 回业务域名并下发新的会话 Cookie,不需要重新输密码。我把这一步做成启动时执行一次、之后每 6 小时一次、以及遇到 401/403 时立即触发。
四、Cookie 文件要原子写
多进程同时读写 Cookie 文件很容易读到半截 JSON。我的做法是写临时文件、os.replace() 原子替换、chmod 600:
tmp = COOKIE_FILE.with_suffix(".tmp")
tmp.write_text(json.dumps(cookies))
os.chmod(tmp, 0o600)
os.replace(tmp, COOKIE_FILE)
五、轮询间隔要带抖动
固定 30 秒轮询在放券瞬间容易和其他脚本撞在一起。我改成 20~40 秒随机,既降低被风控的概率,也避免同一秒的请求高峰。
六、兑换结果要区分
接口成功时返回 {"error_msg": "SUCCESS"};没库存是 HD.67510029;当天已兑过是 HD.67510034。这三种要分开处理,否则脚本会一直重试已经成功的奖品。
整个脚本不依赖任何第三方库,urllib.request 加 json 就够了,丢到任何一台有 Python 3 的机器上都能跑。
- 点赞
- 收藏
- 关注作者
评论(0)