Closed xqe2011 closed 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())
问题确实存在,但是暂时没找到原因。
我用了不同ip,windows,macOS,不同账号都试了,应该不是风控的问题
我也遇到这个问题,目前无法获取到弹幕event了
没了解直播,没法dev :(
没有报错,今天开始突然抽风,无法获取弹幕。 但我这边不是只能获取第一条弹幕,挂了一段时间,发现是是随机获取几条弹幕……就很怪。 这种bug完全没思路……
https://github.com/Nemo2011/bilibili-api/issues/399#issuecomment-1662235447 大概半个月之前开始也遇到了这个问题,弹幕、礼物、包括开播下播在内的各种事件都会随机漏一部分,尝试了各处的几种办法都还没修好
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
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的版本有要求吗
无要求,直接加上试试看
直接加入会提示TypeError: ClientSession._request() got an unexpected keyword argument 'files',所以我以为是版本问题
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
我这边试着还是会漏
加了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)
加了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)
试了有用,谢谢,我也一起观察下
加了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 暂时没毛病了
连接数多了好像还是会漏
建议 PR :)
建议 PR :)
附议
https://github.com/Nemo2011/bilibili-api/issues/419#issuecomment-1674852612
您好,我是网络编程新手。请问这里的“连接数”具体指的是什么?是同一个程序连接到直播间的个数、连接到同一个直播间的程序的个数,还是什么其他的概念?可否请您抽空指点一下,感谢!
同一个程序连接到直播间的个数,目前我这边连了四百多个直播间
pr~ pr~
15.5.4 更新,看看效果
测试问题已解决
插一嘴,目测不只是user-agent的问题,还有短时间内同ip连接数量的问题。如果被判定成机器人,连接的websocket不会断掉,但会被限制发送信息的数量,比如十条信息只发一条。经验上来看5分钟200个会不太容易触发反爬虫。这个feature是七月底才加的,目测还在不断更新反爬策略。
插一嘴,目测不只是user-agent的问题,还有短时间内同ip连接数量的问题。如果被判定成机器人,连接的websocket不会断掉,但会被限制发送信息的数量,比如十条信息只发一条。经验上来看5分钟200个会不太容易触发反爬虫。这个feature是七月底才加的,目测还在不断更新反爬策略。
评价为需要支持代理池
2023.9.1 今天貌似又不能正常接收了
开新issue吧
**Python 版本:3.11.4
**模块版本:15.5.3
**运行环境:Windows
今天直播弹幕ws突然无法获取接下来的弹幕了,只能获取前面的第一次弹幕或者入场信息。试过多个号和ip地址都不行,现在有携带Credential初始化LiveDanmaku