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

弹幕用户名打码功能跟进 #397

Open
sparanoid opened this issue Jul 2, 2023 · 17 comments
Open

弹幕用户名打码功能跟进 #397

sparanoid opened this issue Jul 2, 2023 · 17 comments

Comments

@sparanoid
Copy link
Sponsor

sparanoid commented Jul 2, 2023

最近b站开始对弹幕用户名进行随机打码,打码后 UID 返回为 0:

preview

目前观察下来这个功能是灰度的,不是每次都会出现这个情况,有时候主播的弹幕机刷新一下就正常了,但过一会所有 DANMU_MSG 事件又会被打码。具体触发条件未知

@sparanoid sparanoid changed the title 弹幕用户名打码 弹幕用户名打码功能跟进 Jul 2, 2023
@simon300000
Copy link
Owner

simon300000 commented Jul 2, 2023

似乎是因为portover=3?

@sparanoid
Copy link
Sponsor Author

sparanoid commented Jul 2, 2023

观察了一段时间,WS 连接超过一段时间后(大概 5 分钟,但这个似乎是灰度,有时候未登录状态下很长时间也还是正常的)会出现如下事件,之后的用户名开始打码:

{
  "cmd": "LOG_IN_NOTICE",
  "data": {
    "notice_msg": "为保护用户隐私,未注册登陆用户将无法查看他人昵称",
    "image_web": "http://i0.hdslb.com/bfs/dm/75e7c16b99208df259fe0a93354fd3440cbab412.png",
    "image_app": ""
  }
}

@simon300000
Copy link
Owner

相关问题 xfgryujk/blivedm#28

@sparanoid
Copy link
Sponsor Author

sparanoid commented Jul 3, 2023

目前观测下来,完整的构建建立连接的请求可以进行规避,即:额外传入 uidbuvidkey 即可绕过限制。另外现在官方已经不传 clientver 字段了

  • buvid:可通过 https://data.bilibili.com/v/set-cookie 头获取,目前 buvid2buvid3 是一样的
  • key:可通过 https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo?id=${room_id} 获取

但是由于以上两个请求都有 CORS,因此不适用于 client-side 应用,加上最近哔哩哔哩频繁对验证进行改动,可以考虑支持传入任意对象(或者直接用 authBody?),这样可以通过第三方渠道来获取这些字段,也更方便日后扩展

@eppzrypt
Copy link

eppzrypt commented Jul 3, 2023

额外传入 uidbuvidkey

这个后续会跟进嘛

@simon300000
Copy link
Owner

似乎有效的办法
xfgryujk/blivedm#29

@simon300000
Copy link
Owner

目前来说就直接传入一个authBody罢(还好之前留了这个参数

@sparanoid
Copy link
Sponsor Author

sparanoid commented Jul 3, 2023

@simon300000 authBody 理论上也需要用 encoder 做一次编码才可以?目前是没有这么做的:

if (authBody) {
this.send(authBody)
} else {
const hi: { uid: number, roomid: number, protover: number, platform: string, clientver: string, type: number, key?: string } = { uid: 0, roomid, protover, platform: 'web', clientver: '2.0.11', type: 2 }
if (key) {
hi.key = key
}
const buf = encoder('join', inflates, hi)
this.send(buf)
}

@simon300000
Copy link
Owner

哦确实,这样不太好用

sparanoid added a commit to sparanoid/bilibili-live-ws that referenced this issue Jul 3, 2023
@sparanoid
Copy link
Sponsor Author

sparanoid commented Jul 3, 2023

@CottnCor 从代码逻辑来看是需要的,另外根据 xfgryujk/blivedm#29 的描述,目前似乎只额外传入 uid 就可以了

simon300000 added a commit that referenced this issue Jul 3, 2023
@simon300000
Copy link
Owner

simon300000 commented Jul 3, 2023

刚刚移除了 clientver,加入了 uid 和 buvid 的选项,typeof autoBody === object 的 autoBody 会被 encode 再发出去,应该不会影响开放平台🤔

[email protected]

@simon300000
Copy link
Owner

xfgryujk/blivechat#114

似乎可用的方法又增加了

@LuiScreaMed
Copy link

LuiScreaMed commented Jul 4, 2023

xfgryujk/blivechat#114

似乎可用的方法又增加了

这个 blivechat 作者试过,给我回复了似乎 key 和 ip 绑定,只能本地用,目前直接在 Auth 时填 uid 就有效

@eric2788
Copy link

问个问题,https://github.com/simon300000/bilibili-live-ws#class-livews--livetcp--keeplivews--keeplivetcp 创建实例的时候有没有可以pass cookie的地方(具体我不清楚需要哪个cookie)?我觉得有一个方式直接pass cookie会比较方便点?

@simon300000
Copy link
Owner

问个问题,https://github.com/simon300000/bilibili-live-ws#class-livews--livetcp--keeplivews--keeplivetcp 创建实例的时候有没有可以pass cookie的地方(具体我不清楚需要哪个cookie)?我觉得有一个方式直接pass cookie会比较方便点?

目前可以自己用api通过http拿token/key然后填key,uid,buvid

@simon300000
Copy link
Owner

我记得只需要这三个

@kongmingLatern
Copy link

有个uid的问题想问一下:

  1. 当我传入9位uid的时候,用户名和弹幕都可以正常获取显示
  2. 但是当我传入16位uid的时候,弹幕和用户名一个都获取不到了
    是不是uid(int类型,2^32 = 4294967296 )范围有限制?

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

6 participants