用java写出一个B站视频下载器

发布于 2022-03-05  1,531 次阅读


AI 摘要

通过了解B站的API,你可以使用Web API来下载分辨率大于480P的视频。首先,你需要使用登录API来扫码登录获取cookie。接着,通过密码登录或短信登录需要人机验证通过。对于密码登录,你需要获取盐值,然后进行RSA加密并返回数据以获取cookie。对于短信验证码登录,你需要获取国际地区代码,发送验证码并获取cookie。详细的API信息可以查看相关链接。

了解一些B站的API

使用的API均为WEB API

Github-Card

登录API (下载分辨率>480P的视频)

扫码登陆 (可能是最容易实现的api)

基本流程: 申请二维码URL及扫码密钥->生成二维码->轮询服务器->扫码登录后->获取cookie

申请二维码URL及扫码密钥

GET http://passport.bilibili.com/qrcode/getLoginUrl

密钥超时为180秒

json回复:

根对象:

字段 类型 内容 备注
code num 返回值 0:成功
status bool true 作用尚不明确
ts num 请求时间 时间戳
data obj 信息本体

data对象:

字段 类型 内容 备注
url str 二维码内容url 恒为87字符
oauthKey str 扫码登录秘钥 恒为32字符

二维码的url使用data.url里面的url,oauthKey请保存,并等待下一步操作

使用扫码登录

POST http://passport.bilibili.com/qrcode/getLoginInfo

密钥超时为180秒

验证登录成功后会进行设置以下cookie项:

DedeUserID DedeUserID__ckMd5 SESSDATA bili_jct

正文参数( application/x-www-form-urlencoded ):

参数名 类型 内容 必要性 备注
oauthKey str 扫码登录秘钥 必要
gourl str 跳转url 非必要 默认为http://www.bilibili.com

json回复:

根对象:

字段 类型 内容 备注
code num 返回值 0:成功
message str 错误信息 正确无
ts num 扫码时间 错误无
status bool 扫码是否成功 true:成功
false:未成功
data 正确时:obj
错误时:num 正确时:游戏分站url
错误时:错误代码 未成功时:
-1:密钥错误
-2:密钥超时
-4:未扫描
-5:未确认

data 对象:

字段 类型 内容 备注
url str 游戏分站跨域登录url

密码登录/短信登录接口注意事项

注意! 密码登陆以及短信登录需要人机验证通过!

GET https://passport.bilibili.com/x/passport-login/captcha?source=main_web

  1. 请求验证码参数,得到登录密钥 key 与极验id gt 和极验KEY challenge
  2. 进行滑动or点击验证
  3. 返回验证结果 validateseccode,进行短信或密码登录

此api详情请查看: SocialSisterYi/bilibili-API-collect/bilibili-API-collect/login/login_action

验证器开源链接:

Github-Card

密码登录

基本流程: 密码输入->人机验证通过->获取盐值->RSA加密->返回数据->获取cookie

获取盐值

GET http://passport.bilibili.com/login?act=getkey

json回复:

字段 类型 内容 备注
hash str 密码校验盐值 有效时间为20s
key str RSA公钥 公钥为固定值

加密

盐值+登录密码->然后使用RSA公钥进行加密

登录

POST http://passport.bilibili.com/web/login/v2

验证登录成功后会进行设置以下cookie项:

sidDedeUserIDDedeUserID__ckMd5SESSDATAbili_jct

请务必保存 SESSDATAbili_jct

正文参数( application/x-www-form-urlencoded ):

参数名 类型 内容 必要性 备注
captchaType num 6 必要 必须为6
username str 用户登录账号 必要 手机号或邮箱地址
password str 加密后的带盐密码 必要 base64格式
keep bool true 必要 必须为true
key str 登录秘钥 必要 从B站API获取
challenge str 极验challenge 必要 从B站API获取
validate str 极验结果 必要 从极验获取
seccode str 极验结果 必要 从极验获取

json回复:

根对象:

字段 类型 内容 备注
code num 返回值 0:成功
-400:请求错误
-629:账号或密码错误
-653:用户名或密码不能为空
-662:提交超时,请重新提交
-2001:缺少必要的的参数
-2100:需验证手机号或邮箱
2400:登录秘钥错误
2406:验证极验服务出错
86000:RSA解密失败
ts num 当前时间戳 成功时无此项
message str 错误信息 默认为0
data obj 数据本体 成功时有此项

该部分API文档

短信验证码登录

基本流程: 获取国际地区代码->人机验证通过->发送验证码->返回数据->获取cookie

   短信验证码登录  ==>  展开 / 收起

然后再加上一点点UI就可以正常运行了

演示GIF:

二维码登录

密码登陆

短信登录视频下载演示

我的开源项目:

[github author="heartalborada-del" project="bili-downloader"][/github]

间歇性发奋图强,持续性混吃等死
最后更新于 2024-05-04