Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

新策略影响下无法获取用户名,对策讨论 #111

Closed
no1xsyzy opened this issue Jul 2, 2023 · 30 comments
Closed

新策略影响下无法获取用户名,对策讨论 #111

no1xsyzy opened this issue Jul 2, 2023 · 30 comments

Comments

@no1xsyzy
Copy link

no1xsyzy commented Jul 2, 2023

B站新策略影响下,未登录无法获取用户名,比如张三显示为『张****』,是否考虑追加登录功能。

这是我的 Sentry 的提示了未知 cmd:
图片

更新: 存在这种情况:Blivechat 被星号。

更新: 存在这种情况:Blivechat 被星号,但弹幕姬被星号。

更新: 经过研读数据,在连上弹幕服务器之后经过约5分30秒之后,服务器发出上述 LOG_IN_NOTICE,随后半分钟左右,所有昵称变为星号覆盖。

更新: 确认了一下官方工具,区别似乎只有 SEND_AUTH 中 uid 为主播的 uid,也符合 @Xeler-ync 所说。在我的纯命令行项目中已运行10分钟无 LOG_IN_NOTICE。到晚上还正常的话就弄个 PR。

@yanjisheng
Copy link

我也是,很多主播都遇到了同样的问题,但我看有的直播间又是好的,不知道他们是怎么做到的

@yanjisheng
Copy link

感觉也不是登录的问题,我手机跟电脑网页都试了,退出登录之后依然能看到完整的用户名

@c-basalt
Copy link

c-basalt commented Jul 2, 2023

目前是部分房间会开启(疑似集中在虚拟区),并且要5分钟以后
触发灰度风控的具体条件不清楚

@yanjisheng
Copy link

尝试加了cookies配置项,有没有人来测试下 https://github.com/c-basalt/blivechat/tree/74de094600af5eb3e81946a5bafd82ba2af781f9

你这个该不会是把你自己的cookie写到程序里了吧

@c-basalt
Copy link

c-basalt commented Jul 2, 2023

尝试加了cookies配置项,有没有人来测试下 https://github.com/c-basalt/blivechat/tree/74de094600af5eb3e81946a5bafd82ba2af781f9

你这个该不会是把你自己的cookie写到程序里了吧

应该没有吧,我再检查下

@yanjisheng
Copy link

目前是部分房间会开启(疑似集中在虚拟区),并且要5分钟以后 触发灰度风控的具体条件不清楚

其他区好像也没有在直播画面中显示弹幕的习惯吧

@Xeler-ync
Copy link

Xeler-ync commented Jul 2, 2023

找了几个直播间测试,发现对同一个直播间,会出现主播受影响但是我用blivechat看弹幕却是正常的情况

猜测可能是有什么新的机制只让部分人(或者部分IP?)在未登录的情况下(如果确定是未登录的原因)无法获取用户名

或许可以在 /frontend/src/api/chat/ChatClientDirect/index.jsChatClientDirect 类的 sendAuth()uid 字段加上主播uid,根据 bilibili-live-ws进房 JSON 内容,实际上只有uid有识别登陆的作用,cookie 只在请求头像和请求房间信息(下文中的 ROOM_INIT_URL )时起作用,加上uid之后或许可以避免或者一定程度上缓解这个问题

主播uid在同个类的 initRoom() 向后端 /api/room_info 发送请求的时候会一起收到,后端的处理在 main.py 内,调用了 /api/chat.py 和 '/blivedm/blivedm/client.py' 的 ROOM_INIT_URL 变量,后端向api发送请求之后的接收到的结果中,有用的部分如下

// https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=3461478
// res.data.room_info.uid
{
    "code": 0,
    "message": "0",
    "ttl": 1,
    "data": {
        "room_info": {
            "uid": 25687441,
            "room_id": 3461478,
            "short_id": 0,
            "title": "yuan",
            "cover": "http://i0.hdslb.com/bfs/live/new_room_cover/886ec0bb4c2829f19dd19f5cdbf850933a8a4b54.jpg",
            "tags": "",
            "background": "https://i0.hdslb.com/bfs/live/2836bb7b84c792e2c6aadfd4d1cce13484775fa3.jpg",
            "description": "",
            "live_status": 0,
            "live_start_time": 0,
            "live_screen_type": 0,
            "lock_status": 0,
            "lock_time": 0,
            "hidden_status": 0,
            "hidden_time": 0,
            "area_id": 321,
            "area_name": "原神",
            "parent_area_id": 3,
            "parent_area_name": "手游",
            "keyframe": "http://i0.hdslb.com/bfs/live-key-frame/keyframe11090010000003461478p40avj.jpg",
            "special_type": 0,
            "up_session": "0",
            "pk_status": 0,
            "is_studio": false,
            "pendants": {
                "frame": {
                    "name": "",
                    "value": "",
                    "desc": ""
                }
            },
            "on_voice_join": 0,
            "online": 0,
            "room_type": {
                "3-21": 0
            },
            "sub_session_key": "",
            "live_id": 0,
            "live_id_str": "0",
            "official_room_id": 0,
            "official_room_info": null,
            "voice_background": ""
        }
}

需要修改的部分主要是 /frontend/src/api/chat/ChatClientDirect/index.jsChatClientDirect 类的 sendAuth()initRoom()

不知道各位大佬对这个思路有什么看法,我本来想照着这个思路改一下,但是一方面我自己没有遇到这个问题,没法对照测试,另一方面我明天考试还在复习o╥﹏╥...,实在没时间改这个,如果有大佬觉得这个思路可行可以试试嘛o((>ω< ))

@no1xsyzy
Copy link
Author

no1xsyzy commented Jul 3, 2023

确认了一下,官方的这个工具似乎还可以无登录显示用户名,今天回家看看它如何连弹幕服务器
https://link.bilibili.com/ctool/vtuber/index.html?roomid={roomid}

我自己也是 blivechat 看还是正常的,无法作判断。

@yanjisheng
Copy link

刚测试了一下,只要5分钟一到,用户名开始显示星号了,然后“刷新”浏览器源,就又有5分钟可以显示完整用户名。
所以可以尝试加一个定时5分钟自动刷新的代码,不知是否可行呢

@Xeler-ync
Copy link

刚测试了一下,只要5分钟一到,用户名开始显示星号了,然后“刷新”浏览器源,就又有5分钟可以显示完整用户名。 所以可以尝试加一个定时5分钟自动刷新的代码,不知是否可行呢

主动断线重连感觉是可行的,可以在收到 LOG_IN_NOTICE 之后做,依据 @no1xsyzy 的测试,收到这个之后还有半分钟左右的时间,只要在半分钟内主动断开ws然后重新走一遍连接的流程就可以正常获取用户名

在这个过程中可能会有一小段时间收不到弹幕(少于一秒?),作为主要手段可能有一点点影响体验,作为备份方案应该是可行的;毕竟也不好说B站下次会不会又要求在send_auth的时候带上cookie或者什么别的信息,从而导致我们的修复失效;但是我猜B站较大概率是不会修改重连的前五分钟能正常看见用户名的这一特性

@xfgryujk
Copy link
Owner

xfgryujk commented Jul 3, 2023

我也想过5分钟重连一次,不过感觉我这么做了B站会改成前5分钟也不给看用户名了(

@xfgryujk
Copy link
Owner

xfgryujk commented Jul 3, 2023

要支持登录的话我大概会做成通过Selenium调个浏览器,登录后抓cookie。不过前端直连的不能用这个方案
目前这个策略还在灰度中,要不你们多向B站客服吐槽,说不定会放弃这个策略

@no1xsyzy no1xsyzy changed the title 新策略影响下无法获取用户名,是否考虑追加登录功能? 新策略影响下无法获取用户名,对策讨论 Jul 3, 2023
@yanjisheng
Copy link

经过测试,大概过几个小时吧,blivechat会完全获取不到弹幕

@sakurayun
Copy link

用开平的接口试试?

@FangCunWuChang
Copy link

好家伙我说弹幕咋过一会儿就变星号了

@LuiScreaMed
Copy link

我根据 弹幕姬 的认证数据单纯把 platform 改为 'danmuji' 后直播依然会发生,现在尝试根据 弹幕姬 的认证添加 keyhost

@LuiScreaMed
Copy link

我根据 弹幕姬 的认证数据单纯把 platform 改为 'danmuji' 后直播依然会发生,现在尝试根据 弹幕姬 的认证添加 keyhost

尝试了一下 弹幕姬 的做法,在每次连接前获取 key 和 host_list,建立连接后把 key 放进 Auth 一起发送:

    let authParams = {
      uid: 0,
      roomid: this.roomId,
      key: this.token,
      protover: 3,
      platform: 'danmuji',
      type: 2
    }

就是完全按照 弹幕姬 的来发送,现在测试了10分钟暂时没发现问题。

@Gravitationyw
Copy link

您好,请问本地脱机版如何修复这个问题?我看发布的1.6.1版还是之前的版本?怎样才能解决啊?

@LuiScreaMed
Copy link

您好,请问本地脱机版如何修复这个问题?我看发布的1.6.1版还是之前的版本?怎样才能解决啊?

只熊大大版本的修复后打了新包,可以临时用一下他的: v1.6.2-beta-230704

@xfgryujk
Copy link
Owner

xfgryujk commented Jul 5, 2023

您好,请问本地脱机版如何修复这个问题?我看发布的1.6.1版还是之前的版本?怎样才能解决啊?

等我测试没问题后会发新版

@skyatgit
Copy link

skyatgit commented Jul 5, 2023

加了buvid之后貌似也会出现*的问题,我写的python的脚本,然后我现在根据直播间ws抓包看了一下,header里面的version设置为1且auth的body里的platform改为android之后目前还没出现的情况,如下body = {"uid": 0, "roomid": self.room_id, "buvid": self.get_buvid(), "protover": 3, "platform": "android", "type": 2, "key": self.ws_token}

@Gravitationyw
Copy link

您好,请问本地脱机版如何修复这个问题?我看发布的1.6.1版还是之前的版本?怎样才能解决啊?

只熊大大版本的修复后打了新包,可以临时用一下他的: v1.6.2-beta-230704

万分感谢!被这个问题困扰了几天了,终于看到了解决的希望之光!感谢您的指点,祝福你!

@Gravitationyw
Copy link

您好,请问本地脱机版如何修复这个问题?我看发布的1.6.1版还是之前的版本?怎样才能解决啊?

等我测试没问题后会发新版

大佬辛苦了!也祝福大佬一切顺利!

@Marxel-cn
Copy link

您好,请问本地脱机版如何修复这个问题?我看发布的1.6.1版还是之前的版本?怎样才能解决啊?

等我测试没问题后会发新版

问下,新版本周会发么

@xfgryujk
Copy link
Owner

xfgryujk commented Jul 7, 2023

问下,新版本周会发么

已经在服务器跑了,观察一天还能用的话周末就发

@z0z0r4
Copy link

z0z0r4 commented Aug 15, 2023

要支持登录的话我大概会做成通过Selenium调个浏览器,登录后抓cookie。不过前端直连的不能用这个方案 目前这个策略还在灰度中,要不你们多向B站客服吐槽,说不定会放弃这个策略

完全不用这么麻烦...开个终端显示下二维码,扫码登录就行了

image

@xfgryujk
Copy link
Owner

要支持登录的话我大概会做成通过Selenium调个浏览器,登录后抓cookie。不过前端直连的不能用这个方案 目前这个策略还在灰度中,要不你们多向B站客服吐槽,说不定会放弃这个策略

完全不用这么麻烦...开个终端显示下二维码,扫码登录就行了

image

这么做会有协议随时被修改的风险,我以前搞百度的时候已经被恶心过很多次了,直接开浏览器才是一劳永逸的办法

@z0z0r4
Copy link

z0z0r4 commented Aug 15, 2023

要支持登录的话我大概会做成通过Selenium调个浏览器,登录后抓cookie。不过前端直连的不能用这个方案 目前这个策略还在灰度中,要不你们多向B站客服吐槽,说不定会放弃这个策略

完全不用这么麻烦...开个终端显示下二维码,扫码登录就行了
image

这么做会有协议随时被修改的风险,我以前搞百度的时候已经被恶心过很多次了,直接开浏览器才是一劳永逸的办法

这么做相对而言几乎没风险,你看看这边修改记录,一年变过一次...相比它的好处,坏处忽略不计,总比一堆限制拼命规避好

当然你这边已经有浏览器模拟的操作了...无所谓了

https://github.com/Nemo2011/bilibili-api/blame/main/bilibili_api/data/api/login.json

@no1xsyzy
Copy link
Author

终端扫码会有无法扫码的问题(小号、无移动客户端、不愿意给权限)。浏览器也会有服务器端部署的时候登录不方便的问题。
说实话,各种意义上都不如去逆向/抓包官方那个工具。这个所谓『隐私』决定太虚空了,OBS都不太能支持登录操作,不会加很困难的限制的。而只要还想要日V的B限,就不太可能完全拒绝OBS。

@xfgryujk
Copy link
Owner

看来B站暂时没有更激进的策略,先关了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests