事实

  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字段值
由此得出与视频的特殊性的确关系
QQ截图20201101152940.png

验证分析

分析视频av2的数据:
该视频被打上了多个限制标志
QQ图片20201101154343.png

确实无法被搜索到:
QQ截图20201101154926.png

包含评价后浪的“睡前消息111期”被打上了禁止排行禁止动态禁止推荐的标志:
当时那一期节目确实没给我推荐,排行榜上也找不到(同系列节目每期都会上榜)
QQ图片20201101154404.png

同一UP主的同系列视频“睡前消息112期”正常:
QQ图片20201101154409.png

后来研究发现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!')

部分运行结果如下:

沃玛难逃一劫
Screenshot_2020-10-28-00-59-39-558_ru.iiec.pydroid3.jpg

囧仙竟然也有
Screenshot_2020-10-28-01-02-30-861_ru.iiec.pydroid3.jpg

草!CMD动画,那没事了 一定是声音和画面的锅,屑站不喜欢的某些题材
Screenshot_2020-10-28-01-23-30-883_ru.iiec.pydroid3.jpg

蜂鸣器音乐?这也行
不禁让人想起那次B站客服的回答“稿件里钢琴曲的声音过于涩情”
Screenshot_2020-10-28-01-23-46-117_ru.iiec.pydroid3.jpg

团团竟然也逃不过,大水冲了龙王庙
Screenshot_2020-10-28-13-14-04-306_ru.iiec.pydroid3.jpg

  在测试了不少我关注的UP主的几千个视频后,见到了很多想不到为啥会被限流的视频,作为B站的5年的老用户&UP主,看着运行记录,我的心情久久不能平复..........
  我突然想起睿智的一句话“我们可能会倒闭,但绝对不会变质”,呵呵呵😵

事件结果

  由于消息公开后太多人在各个群里讨论、我在2020-10-27晚在B站动态发表了程序的运行截图、以及biliob的大量爬取数据,在2020-10-28下午,B站官方紧急删除了web端视频基本信息接口的attribute字段,但历史记录稍后再看列表接口中的值没有被删除。

2020-10-28中午动态被删除(河蟹🦀):
1604167824402.jpg

删除之前的接口返回数据:
6c6efeee3309bd00.jpg

删除之后的接口返回数据:
IMG_20201101_022713.png

2020-10-29日凌晨,历史记录稍后再看列表接口中的值被删除

历史记录列表接口中无attribute
QQ截图20201101162954.png

2020-10-30具体时间未知,下午时发现app端的视频信息grpc接口attribute字段已经恒为0

grpc接口的数据也被删除:
QQ图片20201101162712.png

这次官方行动之快,是我们大家万万没有想到的!

分析总结

  这次官方行动迅速充分表明了我们已经触及到了平台的要害,更能进一步证明平台限流的真实性。至此视频限流标志在前端重新变为黑箱状态。可见“限流”这一机制与功能对于商业活动与平台”自保”的重要性,与之相对的可能还有“引流”,总之B站后台对天马的操作自由度非常高,并且对正常的搜索和排行榜也能做手脚
  我们这样广大视频创作爱好者(小UP),被官方限流最多少了些粉丝与成名的机会;而那些全职UP主正在陷入一种“内卷”,创作内容的展示机会可以被平台根据需求随意管控,而不单纯与创作质量正相关,平台的潜规则就是商业活动盈利致胜的法宝!

2020-11-01
社会易姐QwQ