Skip to content

FHChen0420/bili_live_shield_words

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

B站直播弹幕反屏蔽处理(随缘更新中)

识别并处理B站直播弹幕中的全局屏蔽字,目前主要用于提高直播时的同传/歌词弹幕的存留率。

屏蔽机制简介

目前B站直播间弹幕的屏蔽机制主要有两类:

  • 传统的正则表达式检测,由人工管理,有简单和复杂之分。简单的屏蔽词有匕首 咖啡因等,处理方法很简单,在中间任意加一个非空格字符(填充符)隔开就行,如匕i首 咖啡|因等都不会触发屏蔽。注意该机制会无视半角空格,匕 首 咖 啡 因均会被屏蔽。复杂的屏蔽规则会要求在两个字之间添加多个填充符(一般不超过6个),例如网恋两字之间至少需要两个填充符、倒车两字之间至少需要4个填充符,否则会被屏蔽。我在代码中会使用网#2恋 倒#4车这样的格式来表示这类屏蔽规则。如果遇到更复杂的情况,例如原文是删除了评论,屏蔽规则是删#4评#1论,则只需满足任意一处填充即可,删除了··评论 删除了评·论均是可行的处理结果。
  • 疑似中文分词语义检测,可能由系统自动识别,识别结果不稳定,于2021年8月底开始执行。该机制对以下几类汉字十分敏感(每类仅列出几个代表汉字):带贬义的动词/形容词(数量众多)死丑笨矮透病日、代词你您他这、语气词啊吧呢、拼音为ma的汉字妈马吗嘛、器官脸嘴眼脑、部分动物狗猪猴、个别汉字个样很没。如果上述几类汉字相互组合,则大概率会触发屏蔽。在处理方法上,之前毫无作用的空格反而成了最有效果的填充符,加到敏感词语中间(或周围)能应付80%以上的情况,其次是非敏感汉字与数字,能起到正常的填充作用,而英文字母、标点符号、日文假名等几乎无法发挥填充效果。此外,该机制会对敏感词语进行一定的边界检测(也有可能是对整条弹幕的正常字符数进行统计),如果敏感词周边有正常的汉字或数字,则有可能不触发屏蔽。

也有一些其他的情况:

  • 2022年3月下旬开始,B站会时不时屏蔽一些正常弹幕(返回码"f",与触发全局屏蔽时的返回码相同),一般来说重发一次就可以了。当你发送了一条真正含屏蔽词的弹幕并被B站拦截后,在之后极短时间内发送的任意内容弹幕都有一定概率被拦截。
  • 偶尔B站会临时添加一些很迷的屏蔽规则(疑似在测试),个别常用词语以及汉字单字也会被屏蔽,这种情况一般来说最多会持续一周。例如2022年初的一周内,B站实行了新的屏蔽机制,个别英文字母单独发送会被屏蔽,部分屏蔽词还需要两端加英文方括号[]才不容易被屏蔽。
  • 部分直播间(例如活动期间的BW/BML直播间)的屏蔽规则比普通直播间要刁钻很多,再加上直播间有弹幕密度限制,在房间弹幕流量较高的时候,你能成功发送半数的弹幕就算不错了。

注意事项

  • 收集的屏蔽词绝大部分来自于歌词和同传内容。部分涉党政黄赌毒的屏蔽词没列出来,也没必要处理。
  • 这里只列出简体字,对应的繁体字同样会被屏蔽。
  • B站屏蔽词是在变化的,例如"爬", "小学生"有段时间曾经是屏蔽字,现在不是了,但以后仍可能再次被屏蔽。
  • 代码不规范/冗余/处理方法差,望见谅。

代码使用示例

使用本项目的屏蔽词库:

from BiliLiveAntiShield import BiliLiveAntiShield # 导入反屏蔽类
from BiliLiveShieldWords import rules,words # 导入屏蔽词数据
shield=BiliLiveAntiShield(rules,words,"·") # 创建对象(这里使用"·"作为填充符便于展示)
result=shield.deal("初心 baidu 白菜比猪肉便宜") # 执行反屏蔽处理
print(result) # 打印处理结果

输出结果:初·心 B·aidu 白菜 比猪肉·便宜

使用自定义的屏蔽词库:

# 导入反屏蔽类
from BiliLiveAntiShield import BiliLiveAntiShield
# 自定义屏蔽词库
words=[
    "abc","E#3G","G#2[HI]#1J",
]
rules={
    "(?<!用)爱发电": lambda x: x.group()[0]+"|"+x.group()[1:],
    "(?<![花牡虾海车香])蛤(?![蜊蚧子蜃])":"Ha", "蛤": "Ge",
}
# 创建对象
shield=BiliLiveAntiShield(rules,words,"|")
# 执行反屏蔽处理
result=shield.deal(
    "AB CDE FGHIJ\n"
    "用爱发电是一种行为,爱发电是一个应用\n"
    "癞蛤蟆想吃花蛤肉"
) 
print(result) # 打印处理结果

输出结果:

A|B CDE F||GH|IJ
用爱发电是一种行为,爱|发电是一个应用
癞Ha蟆想吃花Ge肉

About

B站直播间弹幕屏蔽字处理

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages