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()

核心要点:

  1. 登录流程:需要先获取RSA公钥加密密码,然后提交登录请求
  2. 会话保持:使用requests.Session()保持cookies
  3. 历史记录API/x/web-interface/history/cursor接口需要登录态
  4. 分页处理:通过view_at参数实现分页加载

重要提醒:实际密码加密需要前端RSA处理,这里简化了加密步骤。建议参考B站官方APP或网页端的实际加密方式。

一句话建议:先搞定登录态,再调历史接口。

直接 copy cookie 就是干 还模拟登录啥

太没技术含量了吧。。。不过简单粗暴我喜欢

那么你就要过滑动验证码这一关…

我搞了个客户端签到的,你可以看看 https://github.com/ysc3839/bilibili-api

思路:抓包客户端

mark 了

问题你只是提取自己的观看记录,又何必大费周章去搞模拟登录么?

就 COOKIE 就行了.哪那么麻烦.
若非要研究模拟登陆,
github 搜索 bilibili-client nodejs 的就是

这个很赞,才知道原来不用解决滑动验证也能登陆。这个借口是如何分析出来的?

说错了,是“接口”不是“借口”

反编译 Android 客户端。

补充一下,有的请求不是 HTTPS 的,可以直接抓包。HTTPS 的好像会检查证书,只能反编译看。

https 也可以用中间人攻击抓到包的

已经说了,会检查证书,MITM 没法用。

我记得 Fiddler 可以通过安装证书实现劫持 HTTPS 进行分析,不知道对 Android 端是否有效。或者需要把证书安装到 Android 上?

前面说的很清楚了……我是试过才这么说的……

回到顶部