Python中如何模拟登录哔哩哔哩并获取观看历史记录?
我发现B站历史纪录最早只能获取到今年5月的时候,所以这个想法夭折了
Python中如何模拟登录哔哩哔哩并获取观看历史记录?
18 回复
在换成滑块验证码之前写了一个,之后就不搞了(
import requests
import json
def bilibili_login(username, password):
"""
模拟登录B站并获取登录态
返回包含cookies的session对象
"""
session = requests.Session()
# 1. 获取登录页面的密钥(rsa公钥)
key_url = "https://passport.bilibili.com/x/passport-login/web/key"
key_resp = session.get(key_url)
key_data = key_resp.json()
if key_data['code'] != 0:
raise Exception(f"获取密钥失败: {key_data}")
# 2. 加密密码(实际生产环境需要前端加密,这里简化处理)
# 注意:真实环境密码需要RSA加密,这里仅演示流程
login_url = "https://passport.bilibili.com/x/passport-login/web/login"
login_data = {
"username": username,
"password": password, # 实际应该用RSA加密
"keep": True,
"key": key_data['data']['hash'],
"captcha": "" # 如果需要验证码这里要处理
}
# 3. 执行登录
login_resp = session.post(login_url, data=login_data)
login_result = login_resp.json()
if login_result['code'] != 0:
raise Exception(f"登录失败: {login_result}")
print("登录成功!")
return session
def get_watch_history(session, page=1, pagesize=20):
"""
获取观看历史记录
"""
history_url = "https://api.bilibili.com/x/web-interface/history/cursor"
params = {
"type": "archive", # 视频类型
"ps": pagesize, # 每页数量
"view_at": "" # 时间戳,第一页留空
}
if page > 1:
# 这里需要从上一页结果获取view_at参数
# 简化处理,实际需要分页逻辑
pass
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Referer": "https://www.bilibili.com/"
}
response = session.get(history_url, params=params, headers=headers)
data = response.json()
if data['code'] != 0:
raise Exception(f"获取历史记录失败: {data}")
return data['data']
def main():
# 使用示例
try:
# 替换为你的B站账号
username = "your_username"
password = "your_password"
# 1. 登录
session = bilibili_login(username, password)
# 2. 获取历史记录
history = get_watch_history(session)
# 3. 处理数据
print(f"共找到 {len(history['list'])} 条记录")
for item in history['list']:
print(f"视频: {item['title']}")
print(f"UP主: {item['author_name']}")
print(f"观看时间: {item['view_at']}")
print("-" * 50)
except Exception as e:
print(f"出错: {e}")
if __name__ == "__main__":
main()
核心要点:
- 登录流程:需要先获取RSA公钥加密密码,然后提交登录请求
- 会话保持:使用
requests.Session()保持cookies - 历史记录API:
/x/web-interface/history/cursor接口需要登录态 - 分页处理:通过
view_at参数实现分页加载
重要提醒:实际密码加密需要前端RSA处理,这里简化了加密步骤。建议参考B站官方APP或网页端的实际加密方式。
一句话建议:先搞定登录态,再调历史接口。
直接 copy cookie 就是干 还模拟登录啥
太没技术含量了吧。。。不过简单粗暴我喜欢
那么你就要过滑动验证码这一关…
我搞了个客户端签到的,你可以看看 https://github.com/ysc3839/bilibili-api
思路:抓包客户端
mark 了
问题你只是提取自己的观看记录,又何必大费周章去搞模拟登录么?
就 COOKIE 就行了.哪那么麻烦.
若非要研究模拟登陆,
github 搜索 bilibili-client nodejs 的就是
这个很赞,才知道原来不用解决滑动验证也能登陆。这个借口是如何分析出来的?
说错了,是“接口”不是“借口”
反编译 Android 客户端。
https 也可以用中间人攻击抓到包的
我记得 Fiddler 可以通过安装证书实现劫持 HTTPS 进行分析,不知道对 Android 端是否有效。或者需要把证书安装到 Android 上?
前面说的很清楚了……我是试过才这么说的……


