利用python获取哔哩哔哩直播间的弹幕是非常简单的,只需要通过定时调用接口,过滤历史消息就能拿到最新弹幕内容。
查找弹幕接口
在哔哩哔哩web端中,随便进入一个直播间,然后打开控制台程序(F12),选择网络一栏。在网络中查找以gethistory
开头的接口地址,该地址就是我们用来获取弹幕内容的接口。
获取逻辑
接口地址
弹幕的接口地址为:
https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid={roomId}&room_type=0
其中的roomId
是直播间的id编号,可以在浏览器中找到直播间的id:

也就是说,拥有了直播间id和接口地址就可以获取任意直播间里面的弹幕消息。
分析返回内容

通过调用接口可以看到,该接口每次调用时都会返回十条历史记录,其中包含最新的消息内容。我们需要定时轮询去调用该接口并且对拿到的数据过滤到已经拿到过的历史数据保留最新的数据。
使用Python实现
定义房间号和接口的地址
roomId = 1549629
url = f"https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid={roomId}&room_type=0"
设置headers
headers = {
"header": "Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,Access-Control-Allow-Credentials,DNT,"
"X-CustomHeader,Keep-Alive,User-Agent,X-Cache-Webcdn,x-bilibili-key-real-ip,x-backend-bili-real-ip",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
}
获取弹幕内容
# 请求直播间弹幕API
req = requests.get(url, headers=headers)
content = req.content.decode("utf-8")
# 转为json
records = json.loads(content)
# 拿到弹幕内容
records = records['data']['room']
# 循环输出最近的十条弹幕
for item in records:
print(item)
循环获取
我们写一个死循环,在循环中持续输出最新的弹幕内容。
import time
import requests
roomId = 31587752
url = f"https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid={roomId}&room_type=0"
headers = {
"header": "Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,Access-Control-Allow-Credentials,DNT,"
"X-CustomHeader,Keep-Alive,User-Agent,X-Cache-Webcdn,x-bilibili-key-real-ip,x-backend-bili-real-ip",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
}
# 用于存放历史记录
old_records = []
while True:
req = requests.get(url, headers=headers)
records = req.json()['data']['room']
# 如果历史记录为空进入下一次请求
if not old_records:
# 将新获取的弹幕作为历史耽误用于下一次判断
old_records = records
continue
# 取出不在就记录里面的新数据
result = [item for item in records if item not in old_records]
if result:
for item in result:
print("发送人:", item["nickname"], "消息内容:", item["text"])
# 将新获取的弹幕作为历史耽误用于下一次判断
old_records = records
time.sleep(1)
原文始发于微信公众号(青檬小栈):Python获取哔哩哔哩直播间弹幕
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/213133.html