From c942a6ab631edd614883c70bc4c847d6d0ab0f41 Mon Sep 17 00:00:00 2001 From: molanp <104612722+molanp@users.noreply.github.com> Date: Thu, 13 Aug 2026 23:38:14 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(bilibili-qrlogin):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=93=94=E5=93=A9=E5=93=94=E5=93=A9=E6=89=AB=E7=A0=81=E7=99=BB?= =?UTF-8?q?=E9=99=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 QrCodeLoginChannel 和 get_client 用于二维码登录 - 重构 BilibiliParser 类中的方法以支持二维码登录流程 - 添加 check_state 方法处理二维码状态检查逻辑 --- .../parsers/bilibili/__init__.py | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/nonebot_plugin_parser/parsers/bilibili/__init__.py b/src/nonebot_plugin_parser/parsers/bilibili/__init__.py index bf5cbce5..40c69897 100644 --- a/src/nonebot_plugin_parser/parsers/bilibili/__init__.py +++ b/src/nonebot_plugin_parser/parsers/bilibili/__init__.py @@ -6,10 +6,16 @@ from msgspec import convert from nonebot import logger -from bilibili_api import HEADERS, Credential, select_client, request_settings +from bilibili_api import ( + HEADERS, + Credential, + select_client, + request_settings, + get_client, +) from bilibili_api.opus import Opus from bilibili_api.video import Video -from bilibili_api.login_v2 import QrCodeLogin, QrCodeLoginEvents +from bilibili_api.login_v2 import QrCodeLogin, QrCodeLoginEvents, QrCodeLoginChannel from ..base import ( BaseParser, @@ -353,18 +359,47 @@ def _load_credential(self): async def login_with_qrcode(self) -> bytes: """通过二维码登录获取哔哩哔哩登录凭证""" - self._qr_login = QrCodeLogin() + self._qr_login = QrCodeLogin(platform=QrCodeLoginChannel.WEB) await self._qr_login.generate_qrcode() qr_pic = self._qr_login.get_qrcode_picture() return qr_pic.content + async def check_state(self, qr: QrCodeLogin): + client = get_client() + resp = await client.request( + method="GET", + url="https://passport.bilibili.com/x/passport-login/web/qrcode/poll", + params={"qrcode_key": qr._QrCodeLogin__qr_key}, # pyright: ignore[reportAttributeAccessIssue] + ) + result: dict = resp.json()["data"] # pyright: ignore[reportIndexIssue] + code = result["code"] + if code == 86101: + return QrCodeLoginEvents.SCAN + elif code == 86090: + return QrCodeLoginEvents.CONF + elif code == 86038: + return QrCodeLoginEvents.TIMEOUT + else: + ac_time_value = result["refresh_token"] + cookies = resp.cookies + sessdata = cookies["SESSDATA"] + bili_jct = cookies["bili_jct"] + dedeuserid = cookies["DedeUserID"] + qr._QrCodeLogin__credential = Credential( # pyright: ignore[reportAttributeAccessIssue] + sessdata=sessdata, + bili_jct=bili_jct, + dedeuserid=dedeuserid, + ac_time_value=ac_time_value, + ) + return QrCodeLoginEvents.DONE + async def check_qr_state(self) -> AsyncGenerator[str]: """检查二维码登录状态""" scan_tip_pending = True for _ in range(30): - state = await self._qr_login.check_state() + state = await self.check_state(self._qr_login) match state: case QrCodeLoginEvents.DONE: yield "登录成功" From cc145670dcdd3314bf8635c551e22f4ccff1a3bb Mon Sep 17 00:00:00 2001 From: molanp <104612722+molanp@users.noreply.github.com> Date: Thu, 13 Aug 2026 23:42:48 +0800 Subject: [PATCH 2/2] Remove duplicate import of get_client --- src/nonebot_plugin_parser/parsers/bilibili/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nonebot_plugin_parser/parsers/bilibili/__init__.py b/src/nonebot_plugin_parser/parsers/bilibili/__init__.py index 40c69897..4e748b05 100644 --- a/src/nonebot_plugin_parser/parsers/bilibili/__init__.py +++ b/src/nonebot_plugin_parser/parsers/bilibili/__init__.py @@ -9,9 +9,9 @@ from bilibili_api import ( HEADERS, Credential, + get_client, select_client, request_settings, - get_client, ) from bilibili_api.opus import Opus from bilibili_api.video import Video