事实
B站可以通过人工操作,或AI自动操作,实现指定视频的限流。
方式多种多样,大致有以下6种:
- 禁止搜索
- 禁止动态(无法被推送消息)
- 禁止排行
- 禁止天马(视频不会上推荐列表)
- 禁止游客观看(没有登录看不见)
- 禁止外链(禁止有Referer且非B站域名)
事件起因
早在2020年初,我就开始做“哔哩哔哩-API收集整理”的项目,就是逆向分析B站的各种api,研究视频信息接口当然放在第一位。
在分析web端视频基本信息api
(api.bilibili.com/x/web-interface/view)时发现了一个奇怪的字段attribute
,是串乍一看意义不明的数字,通过chrome的F12工具发现除了判断是否为互动视频外没有被任何js调用,而判断互动视频仅取这串数字的二进制29bit。
验证大量视频后发现少部分视频该字段中的值有变化,包括但不限于“兄贵”
、“军事”
、“性”
等题材,“10代英特尔装win7教程”
这样的影响商业利益的内容,在UP主“观视频工作室”的视频“BV1ta4y1i7Bu”中也存在该值的变化,为什么会限流原因不言而喻,因为该视频评论了B站的宣传片“后浪”
。
我分析该值可能与一些视频的特殊性有关系,我猜测可能是视频被盯上了,或是传闻已久的“限流”机制。
2020-10-11日在猜测的同时我找到了18年左右B站泄露的后台源码进行逆向分析,功夫不负有心人,终于在源码中发现了attribute
字段的相关的代码,现已整合进“视频基本信息”文档。
在稍后再看
与历史记录
列表等引用视频信息的接口中也存在这一字段。
后台代码内容:
位于/app/admin/main/videoup/model/archive/archive_state.go
中的52行
分别是各个视频属性信息的标志,按照二进制进行位编码,生成10进制的attribute
字段值
由此得出与视频的特殊性的确关系
验证分析
分析视频av2
的数据:
该视频被打上了多个限制标志
确实无法被搜索到:
包含评价后浪
的“睡前消息111期”被打上了禁止排行
、禁止动态
与禁止推荐
的标志:
当时那一期节目确实没给我推荐,排行榜上也找不到(同系列节目每期都会上榜)
同一UP主的同系列视频“睡前消息112期”正常:
后来研究发现21bit比较特殊,分为3种情况,限制游客
、限制跳转
以及不做任何限制,这几种情况前端不可见
程序大量验证
验证原理:
通过输入UID批量读取指定UP主的全部视频,再逐一进行查询,具有限流标志的视频显示该标志,否则显示“稿件正常”。
当时在学校利用仅有的休息时间用手机急忙写出来的。(笑😂
注:以下程序已失效,仅作为展示使用
'''
B站UP主稿件限流批量检测器
--by SocialSisterYi
ver 1.1
2020-10-27 ~ 2020-10-28
'''
import requests
import time
#限流标志位列表
attrbit_list={
0:'禁止排行',
1:'禁止动态',
4:'禁止搜索',
6:'禁止推荐',
12:'私单恰饭',
21:'限制游客'}
#up主视频avid列表
uparc_list=[]
#显示视频信息
def print_video_info(indata):
print('avid: av'+str(indata['aid'])+ \
'\nbvid: '+indata['bvid']+ \
'\n标题: '+indata['title']+ \
'\n子分区名: '+indata['tname']+ \
'\n播放量: '+str(indata['stat']['view'])+ \
'\nUP主: '+indata['owner']['name']+ \
'\n发布时间: '+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(indata['pubdate'])))
#获取视频信息
def get_video_info(avid):
url=f'https://api.bilibili.com/x/web-interface/view?aid={str(avid)}'
resp=requests.get(url)
return resp.json()['data']
#显示限流标志位
def print_attrbit(attrbit):
nobit=True
for i in attrbit_list.keys():
if attrbit&(1<<i):
print('\033[1;31;40m'+attrbit_list[i],end='\033[0;37;40m ')
nobit=False
if i==21:
if nobit:
print('\033[1;32;40m稿件正常\033[0;37;40m')
else:
print()
print('UP主视频限流批量检测器 --by SocialSisterYi')
up_uid=int(input('输入up主uid:'))
total_page=1
page=1
#获取up主所有稿件avid
while page<=total_page:
url=f'https://api.bilibili.com/x/space/arc/search?mid={str(up_uid)}&pn={str(page)}&ps=50'
resp=requests.get(url)
arclist=resp.json()
if page==1:
total_video=arclist['data']['page']['count']
total_page=total_video//50+1
print(f'up主稿件总数为:{str(total_video)}\n正在获取up主所有视频avid')
for i in range(len(arclist['data']['list']['vlist'])):
uparc_list.append(arclist['data']['list']['vlist'][i]['aid'])
print(f'进度:{page}/{total_page}')
page+=1
print('获取完毕!开始查询\n\033[1;33;40m-----------------------------\033[0;37;40m')
#查询视频情况
for avid in uparc_list:
videoinfo=get_video_info(avid)
print_video_info(videoinfo)
print_attrbit(videoinfo['attribute'])
print('\033[1;33;40m-----------------------------\033[0;37;40m')
time.sleep(0.1)
print('ALL DONE!')
部分运行结果如下:
沃玛难逃一劫
囧仙竟然也有
草!CMD动画,那没事了 一定是声音和画面的锅,屑站不喜欢的某些题材
蜂鸣器音乐?这也行
不禁让人想起那次B站客服的回答“稿件里钢琴曲的声音过于涩情”
团团竟然也逃不过,大水冲了龙王庙
在测试了不少我关注的UP主的几千个视频后,见到了很多想不到为啥会被限流的视频,作为B站的5年的老用户&UP主,看着运行记录,我的心情久久不能平复..........
我突然想起睿智的一句话“我们可能会倒闭,但绝对不会变质”
,呵呵呵😵
事件结果
由于消息公开后太多人在各个群里讨论、我在2020-10-27晚在B站动态发表了程序的运行截图、以及biliob的大量爬取数据,在2020-10-28下午,B站官方紧急删除了web端视频基本信息
接口的attribute
字段,但历史记录
和稍后再看
列表接口中的值没有被删除。
2020-10-28中午动态被删除(河蟹🦀):
删除之前的接口返回数据:
删除之后的接口返回数据:
2020-10-29日凌晨,历史记录
和稍后再看
列表接口中的值被删除
历史记录列表接口中无attribute
:
2020-10-30具体时间未知,下午时发现app端的视频信息
grpc接口attribute
字段已经恒为0
grpc接口的数据也被删除:
这次官方行动之快,是我们大家万万没有想到的!
分析总结
这次官方行动迅速充分表明了我们已经触及到了平台的要害,更能进一步证明平台限流的真实性。至此视频限流标志在前端重新变为黑箱状态。可见“限流”
这一机制与功能对于商业活动与平台”自保”
的重要性,与之相对的可能还有“引流”
,总之B站后台对天马的操作自由度非常高,并且对正常的搜索和排行榜也能做手脚
我们这样广大视频创作爱好者(小UP),被官方限流最多少了些粉丝与成名的机会;而那些全职UP主正在陷入一种“内卷”
,创作内容的展示机会可以被平台根据需求随意管控,而不单纯与创作质量正相关,平台的潜规则就是商业活动盈利致胜的法宝!
2020-11-01
社会易姐QwQ