识别并处理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肉