bilibili-API-collect
bilibili-API-collect copied to clipboard
WBI 签名相关问题
由于 Bilibili 在网页端引入的 WBI 风控鉴权目前并未彻底成熟, 特开此 Issue 追踪最新进展, 有最新发现还请各位发在评论区及时补充~
Since the WBI signing for risk control introduced by Bilibili is not yet fully deployed, this Issue is specially opened to track the latest progress. If you have the latest findings, please post them in the comment area in time~
算法实现 | Sign Algorithm
[!CAUTION] 文档内示例不能及时更新, 勿盲目照搬. Examples may be out of date. DO NOT JUST COPY THEM
https://github.com/SocialSisterYi/bilibili-API-collect/blob/547f07e765c0b92c3e61ad698d36c25032ad63e8/docs/misc/sign/wbi.md?plain=1#L17-L120
Rust EXAMPLE: Rust Playground
已经或等待确认的常见问题 | FAQ
- [x] 大部分业务接口均将采用 WBI 风控鉴权, 表现在请求 Path 内包含
wbi字样 - [x] WBI 签名错误, 不同接口返回的内容不一样, 不能根据错误码判断
- [x] 部分接口存在故意的脏数据污染(JSON Response 错误码为 0 但是
data只包含v_voucher之类的内容)
- [x] 部分接口存在故意的脏数据污染(JSON Response 错误码为 0 但是
- [ ] 部分接口使用各自特定的
img_key,sub_key(可能被硬编码在 js 文件内), 而不是 nav 接口拿到的- [x] 使用公共的抑或各自特定的
img_key,sub_key获得的w_rid均有效 - [ ] 用于风控鉴别(硬编码在 js 文件内的难以及时更新)
- [x] 使用公共的抑或各自特定的
- [ ] 出现新参数
w_ks(未实装)
Last Updated: 2023/12/26 12:43
部分接口使用各自特定的 img_key, sub_key(可能被硬编码在 js 文件内), 而不是 nav 接口拿到的
这个能贴一下列出个列表吗?没发现
部分接口使用各自特定的 img_key, sub_key(可能被硬编码在 js 文件内), 而不是 nav 接口拿到的
这个能贴一下列出个列表吗?没发现
例如 api.bilibili.com/x/web-interface/wbi/search/all/v2, 参考 #885, 但是今天看了眼又改回去用公共的了. 估计还在测试吧. 有待观察.
想问一下得出的wts和w_rid在使用的时候都是返回403,权限不足,想问一下这大概是什么问题
img_key, sub_key(可能被硬编码在 js 文件内)
想问一下这里硬编码的img_key要如何获取呢?
我试了一下直接抓包搜索全部JS文件,是没有img_key或者sub_key字样的。
想问一下得出的wts和w_rid在使用的时候都是返回403,权限不足,想问一下这大概是什么问题
NO CODE NO FIX
img_key, sub_key(可能被
硬编码在 js 文件内)想问一下这里硬编码的img_key要如何获取呢?
我试了一下直接抓包搜索全部JS文件,是没有img_key或者sub_key字样的。
不叫这两字样. 获取方法只能手动操作吧或许. 等后面看看, 应该会改成动态获取的, 反正现在都能用.
img_key, sub_key(可能被
硬编码在 js 文件内)想问一下这里硬编码的img_key要如何获取呢?
我试了一下直接抓包搜索全部JS文件,是没有img_key或者sub_key字样的。
不叫这两字样. 获取方法只能手动操作吧或许. 等后面看看, 应该会改成动态获取的, 反正现在都能用.
是硬编码和 nav 的都能过风控吗?
img_key, sub_key(可能被
硬编码在 js 文件内)想问一下这里硬编码的img_key要如何获取呢?
我试了一下直接抓包搜索全部JS文件,是没有img_key或者sub_key字样的。
不叫这两字样. 获取方法只能手动操作吧或许. 等后面看看, 应该会改成动态获取的, 反正现在都能用.
是硬编码和 nav 的都能过风控吗?
不清楚, 看官方用的哪个, 不排除就是区分拿来识别爬虫增大爬虫成本的. 我测试请求量不大也没有时间规律, 没遇到被风控.
推荐阅读: 爬虫与反爬-接口安全的风控介绍 by 哔哩哔哩技术
总之, 你的请求和官方越相像, 被风控的几率越低, 如何权衡逆向成本和被风控, 自己考虑.
网页端收集设备指纹算少的, APP 端搜集设备信息更猛, 而且 bili_ticket 这个风控用的 jwt 获取逻辑是 APP 通过各种方法搜集设备信息后加密发送到服务端, 服务器返回该 jwt. 而加密操作是在 native 层实现的, ~~我没有逆向 native 层的能力, 故无能为力.~~
贡献一个 Dart 语言 Demo,若有写的不好的地方希望各位前辈指教。
https://gist.github.com/intzaaa/84410e7a6f470889017c8885d1a12a7a
dart run lib/wbi.dart "https://api.bilibili.com/x/web-interface/wbi/search/default?w_rid=43e90d4b8069036c02776f4fadec98a6&wts=1703843266"
wts=1703843266&w_rid=43e90d4b8069036c02776f4fadec98a6
贡献一个 Dart 语言 Demo,若有写的不好的地方希望各位前辈指教。
gist.github.com/intzaaa/84410e7a6f470889017c8885d1a12a7a_ (too large to embed)_
dart run lib/wbi.dart "https://api.bilibili.com/x/web-interface/wbi/search/default?w_rid=43e90d4b8069036c02776f4fadec98a6&wts=1703843266" wts=1703843266&w_rid=43e90d4b8069036c02776f4fadec98a6
pr 一份加进去吧?
贡献一个 Dart 语言 Demo,若有写的不好的地方希望各位前辈指教。
https://gist.github.com/intzaaa/84410e7a6f470889017c8885d1a12a7a
dart run lib/wbi.dart "https://api.bilibili.com/x/web-interface/wbi/search/default?w_rid=43e90d4b8069036c02776f4fadec98a6&wts=1703843266" wts=1703843266&w_rid=43e90d4b8069036c02776f4fadec98a6
虽然但是, 我个人认为这 demo 如果没人维护加进 docs 里没什么意义, 我的建议是 demo 发在 discussions 里面, 供初学者参考而已.
贡献一个 Dart 语言 Demo,若有写的不好的地方希望各位前辈指教。 gist.github.com/intzaaa/84410e7a6f470889017c8885d1a12a7a_ (too large to embed)_
dart run lib/wbi.dart "https://api.bilibili.com/x/web-interface/wbi/search/default?w_rid=43e90d4b8069036c02776f4fadec98a6&wts=1703843266" wts=1703843266&w_rid=43e90d4b8069036c02776f4fadec98a6虽然但是, 我个人认为这 demo 如果没人维护加进 docs 里没什么意义, 我的建议是 demo 发在 discussions 里面, 供初学者参考而已.
emmm,已经加进去的都有人维护吗,呆
贡献一个 Dart 语言 Demo,若有写的不好的地方希望各位前辈指教。 gist.github.com/intzaaa/84410e7a6f470889017c8885d1a12a7a_ (too large to embed)_
dart run lib/wbi.dart "https://api.bilibili.com/x/web-interface/wbi/search/default?w_rid=43e90d4b8069036c02776f4fadec98a6&wts=1703843266" wts=1703843266&w_rid=43e90d4b8069036c02776f4fadec98a6虽然但是, 我个人认为这 demo 如果没人维护加进 docs 里没什么意义, 我的建议是 demo 发在 discussions 里面, 供初学者参考而已.
emmm,已经加进去的都有人维护吗,呆
没有啊, 得看贡献那个 demo 的有没有空 update. Rust 的我可以持续更新, 毕竟我天天用.
贡献一个 Dart 语言 Demo,若有写的不好的地方希望各位前辈指教。 gist.github.com/intzaaa/84410e7a6f470889017c8885d1a12a7a_ (too large to embed)gist.github.com/intzaaa/84410e7a6f470889017c8885d1a12a7a(太大而无法嵌入)_
dart run lib/wbi.dart "https://api.bilibili.com/x/web-interface/wbi/search/default?w_rid=43e90d4b8069036c02776f4fadec98a6&wts=1703843266" wts=1703843266&w_rid=43e90d4b8069036c02776f4fadec98a6虽然但是, 我个人认为这 demo 如果没人维护加进 docs 里没什么意义, 我的建议是 demo 发在 discussions 里面, 供初学者参考而已.
emmm,已经加进去的都有人维护吗,呆
没有啊, 得看贡献那个 demo 的有没有空 update. Rust 的我可以持续更新, 毕竟我天天用.
那还不如加进去...加了还看得到不会埋了,有人看到可能还有别人更
#920 @cxw620 你把rust示例链接加进去吧😄
那个wbi的python实例要不要把ua加进去
那个wbi的python实例要不要把ua加进去
ua 又不在 params,和 wbi 没关系吧
那个wbi的python实例要不要把ua加进去
ua 又不在 params,和 wbi 没关系吧
但是示例不能直接用有点怪(划掉)
刚才测试了一下,python已经无法获取到了 https://github.com/SocialSisterYi/bilibili-API-collect/issues/934
刚才测试了一下,python已经无法获取到了 #934
js的还能用 按理说这个算法跟语言应该无关的
想问一下得出的wts和w_rid在使用的时候都是返回403,权限不足,想问一下这大概是什么问题
我也遇到了。Java RestTemplate+cookie返回403,不加cookie返回352,curl+user-agent正常返回。
https://api.bilibili.com/x/player/wbi/playurl 这个接口也是硬编码的吗?我自己拿 nav 的返回数据只有 v_voucher
样例链接:https://api.bilibili.com/x/space/wbi/arc/search?mid=544291240&pn=1&ps=25&index=1&order=pubdate&order_avoided=true&platform=web&web_location=1550101&dm_img_list=[%7B%22x%22:3767,%22y%22:1266,%22z%22:0,%22timestamp%22:45,%22type%22:0%7D,%7B%22x%22:3775,%22y%22:1364,%22z%22:37,%22timestamp%22:271,%22type%22:0%7D]&dm_img_str=V2ViR0wgMS4wIChPcGVuR0wgRVMgMi4wIENocm9taXVtKQ&dm_cover_img_str=QU5HTEUgKEFUSSBUZWNobm9sb2dpZXMgSW5jLiwgQU1EIFJhZGVvbiBQcm8gNTUwME0gT3BlbkdMIEVuZ2luZSwgT3BlbkdMIDQuMSlHb29nbGUgSW5jLiAoQVRJIFRlY2hub2xvZ2llcyBJbmMuKQ&w_rid=d2d2fac1f0352f7bc79b8287dcc91010&wts=1705304656
java签名函数有问题?
StringJoiner param = new StringJoiner("&");
//排序 + 拼接字符串
map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(entry -> param.add(entry.getKey() + "=" + URLUtil.encode(entry.getValue().toString())));
String s = param + mixinKey;
String wbiSign = SecureUtil.md5(s);
本地计算wbi签名:554a526ec8343507a6fe89e3887bb623
java签名函数有问题?
StringJoiner param = new StringJoiner("&"); //排序 + 拼接字符串 map.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .forEach(entry -> param.add(entry.getKey() + "=" + URLUtil.encode(entry.getValue().toString()))); String s = param + mixinKey; String wbiSign = SecureUtil.md5(s);本地计算wbi签名:554a526ec8343507a6fe89e3887bb623
WBI 签名算法以我发的 Rust example 为准, 文档内的可能过时.
应该是是文档内示例问题, 我测试没问题.
https://api.bilibili.com/x/player/wbi/playurl这个接口也是硬编码的吗?我自己拿 nav 的返回数据只有v_voucher
等我有空看看, 或者你自己逆向一下 js. 我知道的都写出来了.
https://api.bilibili.com/x/player/wbi/playurl这个接口也是硬编码的吗?我自己拿 nav 的返回数据只有v_voucher
Show your code example
Show your code example
https://github.com/BTMuli/TeyvatGuide/blob/master/src/pages/common/Test.vue
Show your code example
https://github.com/BTMuli/TeyvatGuide/blob/master/src/pages/common/Test.vue
我建议你好好看看我的说明 WBI 签名是咋弄的, ~~写的什么玩意~~
你都用 tauri 了, 业务代码为什么不全扔 Rust 里面, 又不是热点路径.
你都用 tauri 了, 业务代码为什么不全扔 Rust 里面, 又不是热点路径.
~~我要是会写rust全梭哈rust了~~
mixin_key 的获取我测过样例的数据,是没问题的,在之后的按着流程可能有理解上的差异,我明天再研究研究😣
你都用 tauri 了, 业务代码为什么不全扔 Rust 里面, 又不是热点路径.
~~我要是会写rust全梭哈rust了~~
mixin_key 的获取我测过样例的数据,是没问题的,在之后的按着流程可能有理解上的差异,我明天再研究研究😣
可以试着参考下我那个例子?Dart 和 JavaScript 很相似,你应该可以看懂?
#920
可以试着参考下我那个例子?Dart 和 JavaScript 很相似,你应该可以看懂?
#920
~~草了,我刚刚写了个纯ts的测试,才发现那个 url 没有鉴权 文档的问题属于是~~
~~是我开心的太早了,旧链接这是,还是慢慢写测试吧T_T~~
我会了( ̄▽ ̄)" https://github.com/BTMuli/TGAssistant/commit/f989d71498aba09bce986fba9783c3ea0c71e756
