当前位置:首页 > 探索

哔哩哔哩cookie获取

打开浏览器开发者工具,哔哩哔切到 Network 面板,哔哩哔刷新任意一个 B 站页面,哔哩哔你会在请求头里看到一串名为 Cookie 的哔哩哔字符串。那里面藏着 SESSDATA、哔哩哔bili_jct、哔哩哔DedeUserID 这几个关键字段。哔哩哔没有它们,哔哩哔你连自己的哔哩哔关注列表都拉不出来。

我去年写过一个自动追番的哔哩哔小脚本,最开始图省事,哔哩哔直接拿浏览器里复制出来的哔哩哔 Cookie 硬编码进代码。结果第二天就跑不通了——B 站的哔哩哔风控会定期让部分 Cookie 失效。后来才搞明白,哔哩哔SESSDATA 是哔哩哔身份令牌,bili_jct 是 CSRF 校验用的,DedeUserID 就是你的 UID。三者缺一不可,而且 SESSDATA 的有效期并不是固定的,官方从没给过明确文档。

从浏览器里手动拿

最直接的办法:登录 B 站,按 F12,Application → Cookies → https://www.bilibili.com。你会看到一列键值对。把 SESSDATA、bili_jct、DedeUserID 三个值拼成 key=value; key=value; ... 的格式,就能塞进 HTTP 请求头里用了。

注意 SESSDATA 的值里可能包含 % 和 * 这类字符,别手贱去 URL 解码,原样保留。我见过有人用 Python 的 urllib.parse.unquote 处理了一遍,结果 403。

用代码自动登录获取

手动复制适合临时调试,真要跑长期任务,得走扫码登录流程。B 站提供了 passport.bilibili.com/x/passport-login/web/qrcode/generate 接口,返回一个二维码链接和 qrcode_key。你用手机 App 扫码确认后,再轮询 qrcode/poll 接口,就能拿到 Set-Cookie 响应头。

Python 里用 requests 的 session 对象最省事:

import requests session = requests.Session() resp = session.get('https://passport.bilibili.com/x/passport-login/web/qrcode/generate') qrcode_key = resp.json()['data']['qrcode_key'] # 把二维码链接转成图片显示,等用户扫码 # 然后轮询 poll = session.get('https://passport.bilibili.com/x/passport-login/web/qrcode/poll', params={ 'qrcode_key': qrcode_key}) # 成功时 session.cookies 里就有 SESSDATA 了 

有个坑:轮询间隔别低于 2 秒,否则会被限流。我一开始设了 0.5 秒,连续三次返回 -412,封了 IP 十分钟。

Cookie 失效了怎么办

没有任何官方途径能续期 SESSDATA。失效了就只能重新扫码。我的做法是写一个检测函数,每次请求前先调 api.bilibili.com/x/web-interface/nav,如果返回 code: -101,就触发重新登录流程。

另外,bili_jct 和 DedeUserID 一般不会单独失效,它们跟着 SESSDATA 走。但如果你在多个设备上登录,B 站可能会踢掉旧的 SESSDATA。我同时用手机和电脑登录,结果电脑上的 Cookie 第二天就没了。后来干脆专门注册了一个小号,只用来跑脚本。

别拿主账号乱搞

高频请求、异常 IP、短时间内大量操作——这些都会触发风控。轻则 Cookie 失效,重则账号被限制登录。我认识一个做弹幕爬虫的,拿自己五级号去跑,两天后收到站内信警告。现在他老老实实养了三个小号轮换。

Cookie 这东西,本质上就是你的登录凭证。拿到它的人可以完全冒充你。别往 GitHub 上传,别贴到公开论坛,别塞进前端代码里。我见过有人把 SESSDATA 写进油猴脚本然后分享出去,半小时后账号就被盗了。

真要长期用,建议把 Cookie 存在环境变量或者加密的本地文件里。权限设成 600,别让其他用户读到。

分享到: