Python获取哔哩哔哩直播间弹幕

利用python获取哔哩哔哩直播间的弹幕是非常简单的,只需要通过定时调用接口,过滤历史消息就能拿到最新弹幕内容。

查找弹幕接口

在哔哩哔哩web端中,随便进入一个直播间,然后打开控制台程序(F12),选择网络一栏。在网络中查找以gethistory开头的接口地址,该地址就是我们用来获取弹幕内容的接口。

Python获取哔哩哔哩直播间弹幕

获取逻辑

接口地址

弹幕的接口地址为:

https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid={roomId}&room_type=0

其中的roomId是直播间的id编号,可以在浏览器中找到直播间的id:

Python获取哔哩哔哩直播间弹幕

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

分析返回内容

Python获取哔哩哔哩直播间弹幕

通过调用接口可以看到,该接口每次调用时都会返回十条历史记录,其中包含最新的消息内容。我们需要定时轮询去调用该接口并且对拿到的数据过滤到已经拿到过的历史数据保留最新的数据。

使用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

(2)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!