Nemo2011 / bilibili-api

哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api
https://nemo2011.github.io/bilibili-api/
GNU General Public License v3.0
2.17k stars 205 forks source link

[提问] 直播弹幕接口只能获取第一条弹幕 #419

Closed xqe2011 closed 1 year ago

xqe2011 commented 1 year ago

**Python 版本:3.11.4

**模块版本:15.5.3

**运行环境:Windows


今天直播弹幕ws突然无法获取接下来的弹幕了,只能获取前面的第一次弹幕或者入场信息。试过多个号和ip地址都不行,现在有携带Credential初始化LiveDanmaku

Drelf2018 commented 1 year ago

测试代码放一下

MeowDWing commented 1 year ago

我也遇到这个问题了,我加了interact_word的监听器时跑下来还算正常,之后突然就开始接收不到弹幕信息了,我以为是风控机制把我ban了。 但是似乎没有收到错误信息,也有可能是我没设置返回信息的接收,不过我的cridential是没初始化的,而且初始化了似乎也没啥用。他接收的时候感觉只是很随机的接收几条,有时接收有时就不接受。 看到这个issue我突然想起来会不会是今天b站抽风了,我看别人直播的时候,有时候有的人的弹幕姬也会有这种收不到弹幕的bug。 等我回家时看看我的笔记本能不能跑的通就知道是不是b站抽风了

测试代码放一下

我的代码

self.room_event_stream = live.LiveDanmaku(self.room_id)
# room_event_stream 是LiveDanmaku类
@self.room_event_stream.on('DANMU_MSG')
async def on_danmaku(event):  # event -> dictionary
    await self.live_danmaku(event)  # 这个是处理event的函数,里面牵涉到自动回复操作,所以也是个异步的

核心就是这么一点,能直接跑的话就下面这样的

from bilibili_api import live,sync
rid = 6
res = live.LiveDanmaku(rid)
@res.on('DANMU_MSG')
async def on_danmaku(event):
    print(event)
sync(res.connect())
Drelf2018 commented 1 year ago

问题确实存在,但是暂时没找到原因。

xqe2011 commented 1 year ago

我用了不同ip,windows,macOS,不同账号都试了,应该不是风控的问题

dawan2818 commented 1 year ago

我也遇到这个问题,目前无法获取到弹幕event了

z0z0r4 commented 1 year ago

没了解直播,没法dev :(

MisakaAI commented 1 year ago

没有报错,今天开始突然抽风,无法获取弹幕。 但我这边不是只能获取第一条弹幕,挂了一段时间,发现是是随机获取几条弹幕……就很怪。 这种bug完全没思路……

xqe2011 commented 1 year ago

经过测试blivedm是正常的,他们短期没有更新,可能是本库对ws消息的接受处理有问题

Starlwr commented 1 year ago

https://github.com/Nemo2011/bilibili-api/issues/399#issuecomment-1662235447 大概半个月之前开始也遇到了这个问题,弹幕、礼物、包括开播下播在内的各种事件都会随机漏一部分,尝试了各处的几种办法都还没修好

iconFehu commented 1 year ago
def get_session() -> aiohttp.ClientSession:
    """
    获取当前模块的 aiohttp.ClientSession 对象,用于自定义请求

    Returns:
        aiohttp.ClientSession
    """
    loop = asyncio.get_event_loop()
    session = __session_pool.get(loop, None)
    if session is None:
        session = aiohttp.ClientSession(
            loop=loop, connector=aiohttp.TCPConnector(verify_ssl=False),
            headers={
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62",
            },
        )
        __session_pool[loop] = session

    return session
KeyShawe commented 1 year ago
def get_session() -> aiohttp.ClientSession:
    """
    获取当前模块的 aiohttp.ClientSession 对象,用于自定义请求

    Returns:
        aiohttp.ClientSession
    """
    loop = asyncio.get_event_loop()
    session = __session_pool.get(loop, None)
    if session is None:
        session = aiohttp.ClientSession(
            loop=loop, connector=aiohttp.TCPConnector(verify_ssl=False),
            headers={
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62",
            },
        )
        __session_pool[loop] = session

    return session

aiohttp的版本有要求吗

iconFehu commented 1 year ago

无要求,直接加上试试看

KeyShawe commented 1 year ago

直接加入会提示TypeError: ClientSession._request() got an unexpected keyword argument 'files',所以我以为是版本问题

Starlwr commented 1 year ago
def get_session() -> aiohttp.ClientSession:
    """
    获取当前模块的 aiohttp.ClientSession 对象,用于自定义请求

    Returns:
        aiohttp.ClientSession
    """
    loop = asyncio.get_event_loop()
    session = __session_pool.get(loop, None)
    if session is None:
        session = aiohttp.ClientSession(
            loop=loop, connector=aiohttp.TCPConnector(verify_ssl=False),
            headers={
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62",
            },
        )
        __session_pool[loop] = session

    return session

我这边试着还是会漏

whille commented 1 year ago

加了header头,看起来好了, 再观察一下。


--- a/bilibili_api/live.py
+++ b/bilibili_api/live.py
@@ -960,7 +960,7 @@ class LiveDanmaku(AsyncEvent):
             self.logger.info(f"正在尝试连接主机: {uri}")

             try:
-                async with session.ws_connect(uri) as ws:
+                async with session.ws_connect(uri, headers={"User-Agent": "Mozilla/5.0"}) as ws:

                     @self.on("VERIFICATION_SUCCESSFUL")
                     async def on_verification_successful(data):

(END)

dawan2818 commented 1 year ago

加了header头,看起来好了, 再观察一下。


--- a/bilibili_api/live.py
+++ b/bilibili_api/live.py
@@ -960,7 +960,7 @@ class LiveDanmaku(AsyncEvent):
             self.logger.info(f"正在尝试连接主机: {uri}")

             try:
-                async with session.ws_connect(uri) as ws:
+                async with session.ws_connect(uri, headers={"User-Agent": "Mozilla/5.0"}) as ws:

                     @self.on("VERIFICATION_SUCCESSFUL")
                     async def on_verification_successful(data):

(END)

试了有用,谢谢,我也一起观察下

MeowDWing commented 1 year ago

加了header头,看起来好了, 再观察一下。


--- a/bilibili_api/live.py
+++ b/bilibili_api/live.py
@@ -960,7 +960,7 @@ class LiveDanmaku(AsyncEvent):
             self.logger.info(f"正在尝试连接主机: {uri}")

             try:
-                async with session.ws_connect(uri) as ws:
+                async with session.ws_connect(uri, headers={"User-Agent": "Mozilla/5.0"}) as ws:

                     @self.on("VERIFICATION_SUCCESSFUL")
                     async def on_verification_successful(data):

(END)

+1 暂时没毛病了

Starlwr commented 1 year ago

连接数多了好像还是会漏

z0z0r4 commented 1 year ago

建议 PR :)

Ikaros-521 commented 1 year ago

建议 PR :)

附议

mathgirl796 commented 1 year ago

https://github.com/Nemo2011/bilibili-api/issues/419#issuecomment-1674852612

您好,我是网络编程新手。请问这里的“连接数”具体指的是什么?是同一个程序连接到直播间的个数、连接到同一个直播间的程序的个数,还是什么其他的概念?可否请您抽空指点一下,感谢!

Starlwr commented 1 year ago

同一个程序连接到直播间的个数,目前我这边连了四百多个直播间

z0z0r4 commented 1 year ago

pr~ pr~

z0z0r4 commented 1 year ago

15.5.4 更新,看看效果

xqe2011 commented 1 year ago

测试问题已解决

nailvcoronation commented 1 year ago

插一嘴,目测不只是user-agent的问题,还有短时间内同ip连接数量的问题。如果被判定成机器人,连接的websocket不会断掉,但会被限制发送信息的数量,比如十条信息只发一条。经验上来看5分钟200个会不太容易触发反爬虫。这个feature是七月底才加的,目测还在不断更新反爬策略。

z0z0r4 commented 1 year ago

插一嘴,目测不只是user-agent的问题,还有短时间内同ip连接数量的问题。如果被判定成机器人,连接的websocket不会断掉,但会被限制发送信息的数量,比如十条信息只发一条。经验上来看5分钟200个会不太容易触发反爬虫。这个feature是七月底才加的,目测还在不断更新反爬策略。

评价为需要支持代理池

MeowDWing commented 1 year ago

2023.9.1 今天貌似又不能正常接收了

z0z0r4 commented 1 year ago

开新issue吧