SocialSisterYi / bilibili-API-collect

哔哩哔哩-API收集整理【不断更新中....】
https://socialsisteryi.github.io/bilibili-API-collect/
Other
14.79k stars 1.68k forks source link

关于获取ai字幕和遍历用户投稿视频的访问限制 #796

Open Alien1007 opened 1 year ago

Alien1007 commented 1 year ago

经过这几天的实验,我得到的结论为:

  1. AI 字幕需要使用登录账号的cookie进行请求,请求url为:https://api.bilibili.com/x/player/v2?cid=1007315530&bvid=BV1vG4y1K7nH;但是请求频繁或是量多会被ban,我尝试过从并发到单进程sleep 5s,无一幸免最终都被封,封禁时间貌似是12h?还挺长的。体现为接口返回正常返回内容,但是subtitle列表为空(即使实际上有ai字幕),无法获取subtitle_url。

    image
  2. 使用接口 https://api.bilibili.com/x/space/wbi/arc/search? 来遍历用户投稿视频信息时,即使使用wbi权鉴,也是运行个几分钟就出现下图的错误,停一小短时间重试又恢复正常。 image

问题为:

  1. AI 字幕请求与用户投稿遍历的风控的机制大概是怎样的,如何能实现稳定请求?多cookie轮换?

提前感谢各位大佬不吝赐教!!!

188102836 commented 1 year ago

这两个 api 是文档里的吗,为啥我搜不到啊,能给个链接吗。

image image


  1. AI 字幕需要使用登录账号的cookie进行请求,请求url为:https://api.bilibili.com/x/player/v2?cid=1007315530&bvid=BV1vG4y1K7nH

这个 AI 字幕的 api 是按什么返回的?时长,字数,还是其它东西?


3. 使用接口 https://api.bilibili.com/x/space/wbi/arc/search? 来遍历用户投稿视频信息时,即使使用wbi权鉴,也是运行个几分钟就出现下图的错误,停一小短时间重试又恢复正常。

是不是请求频率太高了?正常用户操作应该没那么高。

顺便说一句,这应该是第二项吧

BaiCha2007 commented 1 year ago

image 模糊搜索,有些文档可能改过了 而且这个第二个接口'x/space/wbi/arc/search'都还没更新进去,当然搜不到了

这两个 api 是文档里的吗,为啥我搜不到啊,能给个链接吗。

image image

  1. AI 字幕需要使用登录账号的cookie进行请求,请求url为:https://api.bilibili.com/x/player/v2?cid=1007315530&bvid=BV1vG4y1K7nH

这个 AI 字幕的 api 是按什么返回的?时长,字数,还是其它东西?

  1. 使用接口 https://api.bilibili.com/x/space/wbi/arc/search? 来遍历用户投稿视频信息时,即使使用wbi权鉴,也是运行个几分钟就出现下图的错误,停一小短时间重试又恢复正常。

是不是请求频率太高了?正常用户操作应该没那么高。

顺便说一句,这应该是第二项吧

188102836 commented 1 year ago

好的,谢谢

BaiCha2007 commented 1 year ago

我也遇到了code:-401 非法访问,期待一个解决方法,也许和buvid有关?

Alien1007 commented 1 year ago

这两个 api 是文档里的吗,为啥我搜不到啊,能给个链接吗。

image image

  1. AI 字幕需要使用登录账号的cookie进行请求,请求url为:https://api.bilibili.com/x/player/v2?cid=1007315530&bvid=BV1vG4y1K7nH

这个 AI 字幕的 api 是按什么返回的?时长,字数,还是其它东西?

  1. 使用接口 https://api.bilibili.com/x/space/wbi/arc/search? 来遍历用户投稿视频信息时,即使使用wbi权鉴,也是运行个几分钟就出现下图的错误,停一小短时间重试又恢复正常。

是不是请求频率太高了?正常用户操作应该没那么高。

顺便说一句,这应该是第二项吧

  1. 接口链接就在原问题里
  2. 字幕数据主要是subtitles列表中的元素,除了语言之外,重要的其实是那个subtitle_url,访问可得到json格式的字幕文件,但是这个url中的auth_key跟cookie貌似是绑定的。(不一定是ai字母,只要是外挂字幕都会在subtitles字段里,但是ai字幕会受到比较大的风控限制,用户上传字幕目前看来随便拿;即,如果账号被风控,对于同一个既有ai字幕又有上传字幕的视频,subtitles列表中的上传字幕会正常返回,ai字幕会消失不见)
188102836 commented 1 year ago
  1. 接口链接就在原问题里

没说清楚,当时想说的是文档链接,不然我不清楚参数和返回值

  1. 访问可得到json格式的字幕文件

意思是这个字幕是整个视频的吗?5 秒的频率可能也太快了吧,正常一个视频也不止 5 秒。不过用户上传字幕正常返回,可能和 B 站的 AI 字幕生成有关吧,会用比较多资源,而用户上传的只要返回文件就行了

BaiCha2007 commented 1 year ago

意思是这个字幕是整个视频的吗?5 秒的频率可能也太快了吧,正常一个视频也不止 5 秒。不过用户上传字幕正常返回,可能和 B 站的 AI 字幕生成有关吧,会用比较多资源,而用户上传的只要返回文件就行了

可能是需要登录才能获取字幕吧

image

这个5s指的是这个吗?原视频内的是一首歌的歌词,5s一切我看了一下,没什么问题 image

188102836 commented 1 year ago

可能是需要登录才能获取字幕吧

确实,不过作者不是已经说了 “使用登录账号的cookie进行请求” 吗?

这个5s指的是这个吗?

不是,指的是作者说 “我尝试过从并发到单进程 sleep 5s,无一幸免最终都被封”。就是作者每隔 5s 请求一次

00randomize00 commented 1 year ago

https://api.bilibili.com/x/space/wbi/arc/search? 这个接口只要在访问时在Cookie里加 buvid3 (关于buvid3的方法可以参考这个->https://github.com/SocialSisterYi/bilibili-API-collect/issues/686#issuecomment-1619755760) , ~然后给一个正常user-agent就可以了。我自己测试了一下,还蛮稳定的。如果出现-401, 那么就抓过buvid3就可以了。~

至于AI字幕我觉得不太可能有比较稳定的方法,因为他是跟SESSDATA绑在一起的。我尝试在无痕模式下打开视频,可是连“字幕”的选项都没有跳出来,所以我觉得不太可能。(当然这个只是基于我技术不好的看法,也许其他大佬能够有方法稳定抓AI字幕)

Edit 1 : https://api.bilibili.com/x/space/wbi/arc/search?这个接口的buvid3似乎没有那么严格,直接访问 https://www.bilibili.com/ 然后抓取cookie里面的buvid3就可以了,不需要特别的访问https://api.bilibili.com/x/internal/gaia-gateway/ExClimbWuzhi这个接口来验证buvid3

Edit 2 : https://api.bilibili.com/x/space/wbi/arc/search?这个接口测试了几个小时后发现重点应该是在user-agent,但这个user-agent其实是可以乱写的( 例如: js随机的Math.random也是可以的)。如果出现-401, 换一个user-agent就可以了,不需要重新抓过buvid3 。 然后在研究这个接口的时候,意外发现现在的wbi的接口不需要w_rid和wts也能正常访问

Alien1007 commented 1 year ago

意思是这个字幕是整个视频的吗?5 秒的频率可能也太快了吧,正常一个视频也不止 5 秒。不过用户上传字幕正常返回,可能和 B 站的 AI 字幕生成有关吧,会用比较多资源,而用户上传的只要返回文件就行了

是的,可以拿到整个视频的字幕;按说ai字幕大概率也不能是实时生成的吧,只能说这些字幕数据b站看得比较宝贝。我在尝试用多个cookie轮换实验,一个挂了下一个顶上,但是需要较多cookie才能完全覆盖被封的那段时间而保证获取不间断;目前看来正常切换了几轮了,不过有点担心这么搞会被永封...

Alien1007 commented 1 year ago

如果出现-401, 换一个user-agent就可以了,不需要重新抓过buvid3

@00randomize00 试了一下这个思路,-401的时候就获取随机字符串赋值给header["User-Agent],可还是-401。并且我是在脚本中批量跑的(准备了1000个up主)。单独跑确实随便一个ua都可以。 image

00randomize00 commented 1 year ago

想问一下,你的批量跑是指同时进行多个请求吗?如果是的话,那么我确实没有考虑+测试到这个问题

00randomize00 commented 1 year ago

@Alien1007 我测试了同时进行多个请求。我的做法是每一次做50request, 每一个request的user-agent都是随机的,然后访问 https://www.bilibili.com/抓cookie(这次我是把全部cookie加在headers,然后cookie可以一样一直到出现-401 例子:innersign=0;buvid3=8C55DD22-BFF4-4EB5-EF89-413A8441D83386933infoc;b_nut=1693230986;i-wanna-go-back=-1;b_ut=7)。如果出现-401,就抓过全部的cookie。我用for loop 从mid 0 抓到 2090 都还蛮稳定的。

如果同时请求过多或一次抓太多,那么我觉得只有rotate proxy了。这是我第一轮写的代码因为逻辑错误,导致同时进行太多个request而发现的。我自己只测试最高用200同时请求,抓到mid 4000+就开始-401了。

Alien1007 commented 1 year ago

@00randomize00 没有,我是单进程请求跑的投稿视频遍历实验,只是准备了较多的mid输入,不过我的cookie是从浏览器复制然后写死在headers里的,可能cookie也要动态变化?我也发现即使不使用cookie,同样是我遇到的这种跑一会儿,-401一会儿的情况;离谱的是,提示-401后,我kill当前进程然后马上重跑命令,居然可以继续获取...

00randomize00 commented 1 year ago

@Alien1007 在我测试多个同时请求后才发现cookie也是要改的。我总结一下我目前观察到的结论:user-agent -> cookie -> ip。user-agent 我觉得每一次的请求都让它随机,cookie 出现-401才换过。如果cookies换了还是-401,那么我觉得只有用proxy来改ip了

Alien1007 commented 1 year ago
  1. 字幕数据主要是subtitles列表中的元素,除了语言之外,重要的其实是那个subtitle_url,访问可得到json格式的字幕文件,但是这个url中的auth_key跟cookie貌似是绑定的。(不一定是ai字母,只要是外挂字幕都会在subtitles字段里,但是ai字幕会受到比较大的风控限制,用户上传字幕目前看来随便拿;即,如果账号被风控,对于同一个既有ai字幕又有上传字幕的视频,subtitles列表中的上传字幕会正常返回,ai字幕会消失不见)

可恶啊,现在用户上传字幕(非AI生成)也需要登陆才能获取了,可能是最近更新的?

00randomize00 commented 1 year ago

更新一下,https://api.bilibili.com/x/space/wbi/arc/search? 这个接口似乎恢复了w_rid和wts的需求。如果第一次访问b站没有带wbi那么都会-401,之后访问不带wbi似乎也可以(不确定有没有时间限制,我没有测试)。但如果把user-agent只放mozilla/5.0,这个wbi可以不放。所以现在有稳定需求的话,还是放wts和w_rid吧

zhandao commented 1 year ago

感谢上面朋友们的踩坑