bilibili-api项目实现TV端登录功能的技术解析
背景介绍
bilibili-api是一个用于与哔哩哔哩平台交互的Python库,近期该项目实现了TV端登录功能,这一功能扩展为用户提供了更多样化的登录方式选择。本文将深入解析这一功能的实现原理和技术细节。
传统登录方式的问题
在实现TV端登录功能之前,bilibili-api主要依赖Web端的Cookie方式进行身份验证。这种方式存在几个明显问题:
- 登录状态容易失效,通常2天左右就需要重新登录
- 当用户在浏览器同时登录B站时,会导致脚本的登录状态被踢出
- 需要频繁维护登录状态,增加了使用复杂度
TV端登录的优势
TV端登录相比传统Web端登录具有以下优势:
- 登录凭证有效期长达180天(15552000秒)
- 可以与Web端登录共存,互不干扰
- 提供了更稳定的长期运行保障
技术实现细节
登录流程
TV端登录采用了二维码扫描方式,核心流程如下:
- 客户端请求生成TV端登录二维码
- 用户使用哔哩哔哩APP扫描二维码
- 服务器返回包含access_key的凭证信息
- 客户端使用这些凭证进行后续API调用
凭证处理
登录成功后,系统会返回包含以下关键信息的凭证:
- access_key:APP登录Token,用于身份验证
- cookie_info:包含SESSDATA等传统Cookie信息
- expires_in:凭证有效期,默认为180天
签名机制
对于需要使用APP端API的请求,系统实现了专门的签名机制:
- 将请求参数按字典序排序
- 添加appkey参数
- 使用MD5算法生成签名
- 将签名附加到请求参数中
签名算法核心代码如下:
def app_signature(params: dict) -> dict:
appkey = "4409e2ce8ffd12b8"
appsec = "59b43e04ad6965f34319062b478f83dd"
params["appkey"] = appkey
params = dict(sorted(params.items()))
params["sign"] = hashlib.md5(
(urllib.parse.urlencode(params) + appsec).encode("utf-8")
).hexdigest()
return params
接口兼容性考虑
在实现过程中,开发团队注意到Web端和APP端的API存在差异:
- 部分接口仅支持Cookie验证
- 部分接口仅支持access_key验证
- 部分接口两者都支持但参数不同
当前实现优先保证TV登录获取的凭证能够兼容大多数现有接口,对于仅支持APP验证的接口,系统会自动使用access_key和签名机制;对于仅支持Web验证的接口,则使用cookie_info中的信息。
使用示例
开发者可以通过以下简单代码使用TV端登录功能:
from bilibili_api import login, user
# TV端二维码登录
c = login.login_with_tv_qrcode_term()
# 获取用户信息
print(await user.get_self_info(credential=c))
未来优化方向
虽然当前实现已经解决了核心问题,但仍有一些潜在的优化空间:
- 实现APP凭证的自动刷新机制
- 完善仅支持APP验证的特殊接口
- 优化签名机制的性能和安全性
- 提供更友好的登录状态管理
总结
bilibili-api项目通过实现TV端登录功能,为用户提供了更稳定、更持久的身份验证方案。这一改进不仅解决了频繁掉线的问题,还增强了库的健壮性和易用性。随着后续的持续优化,这一功能将为开发者带来更好的使用体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



