B站升级协议实现—Python

b站升级协议保姆级教学——登录、观看视频、投币、分享视频获取全部每日经验思路

通过B站获取经验的规则,登录、观看视频、投币、分享视频均可获得经验

B站每日经验上限为65

这些操作的前提均需要b站登录协议请看点方蓝色字体

b站扫码登录协议

文章结尾附Python代码

B站获取经验任务要求 

 一、b站主页包

GET  请求b站官网主页  https://www.bilibili.com/

可以看到响应结果中有很多的视频链接url

利用正则表达式拿到前面5条视频的链接,进行经验获取。

正确匹配视频链接的正则表达式——https://www\.bilibili\.com/video/BV[0-9A-Za-z]+

为什么需要5条? 因为b站视频投币1个可以加10经验,每日上限50经验。

这个主页包,请求时,可以不登陆,也不需要带Cookie即可拿到视频链接

本次抓包测试的前面5条链接是

https://www.bilibili.com/video/BV1wSRPYtEWT
https://www.bilibili.com/video/BV1RARNYmECT
https://www.bilibili.com/video/BV1hC9BYiE8Q
https://www.bilibili.com/video/BV1UW9qY8EQz
https://www.bilibili.com/video/BV1m5RAYaEiC

二、每日登录与观看视频经验 (共10经验)

每日登录的经验获取特别简单,只需要从b站主页10获取到的视频链接里面任选一条,带上登录Cookie进行GET请求即可获得每日登录经验与观看视频经验

注:B站每日登录的经验需要进行与观看视频相关操作才可以完成,不是带着登录Cookie请求主页就可以得到

带上登录成功Cookie GET请求  https://www.bilibili.com/video/BV1wSRPYtEWT

观看视频抓包响应 

 这个时候我们便可以完成每日登录和每日观看视频的任务

三、每日分享视频(5经验) 

进行分享操作

分享包

分享包响应结果

当我们点击使用QQ分享的按钮时,可以在浏览器抓到这个包

POST 请求  https://api.bilibili.com/x/web-interface/share/add

请求参数aid=926920308&eab_x=2&ramval=15&source=web_normal&ga=1&csrf=fb41cac6eddebb8b352e43671a19a65b

aid——视频的id,可以在GET请求这个视频的响应中得到,建议在进行观看视频包相关操作时从响应中提取这个参数

csrf——登录Cookie中有这个参数

其他参数固定

响应中的aid

 这个时候我们便可以完成每日分享视频的任务

四、每日投币(投一个币10经验,每日共50经验) 

进行投币操作

 投币包

投币包响应结果

 投币时,可以抓到这个包 POST 请求 https://api.bilibili.com/x/web-interface/coin/add

请求参数aid=926920308&multiply=1&select_like=1&cross_domain=true&from_spmid=333.788.player.player_end_recommend_autoplay&spmid=333.788.0.0&statistics=%7B%22appId%22%3A100%2C%22platform%22%3A5%7D&eab_x=2&ramval=15&source=web_normal&ga=1&csrf=fb41cac6eddebb8b352e43671a19a65b

aid——视频的id,可以在GET请求这个视频的响应中得到,建议在进行观看视频包相关操作时从响应中提取这个参数
multiply——投币数量  1或者2
select_like——是否同时进行点赞  0不点赞   1点赞 
csrf——登录Cookie中的参数

其他参数固定 

只需要重复最开头从主页包获取的5个视频链接的aid,即可实现拿到所有投币经验 

五、实现代码 

5.1主页包代码(从主页获取视频链接) 

import requests
import re

url = "https://www.bilibili.com/"
# 请求头
headers = {
    "authority": "www.bilibili.com",
    "method": "GET",
    "path": "/",
    "scheme": "https",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "zh-CN,zh;q=0.9",
    "cache-control": "max-age=0",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
# 发送 GET 请求
try:
    response = requests.get(url, headers=headers)
    # 确保请求成功
    if response.status_code == 200:
        html_content = response.text
        # 正则匹配链接
        pattern = r'https://www\.bilibili\.com/video/BV[0-9A-Za-z]+'
        matches = re.findall(pattern, html_content)
        # 去重,
        unique_links = list(dict.fromkeys(matches))
        print("提取到的视频链接:")
        if unique_links:
            for idx, link in enumerate(unique_links, start=1):
                print(f"{link}")
        else:
            print("未找到匹配的视频链接。")
    else:
        print(f"请求失败,状态码: {response.status_code}")
except UnicodeEncodeError as e:
    print("请求头存在 Unicode 编码问题:", e)
except Exception as e:
    print("发生错误:", e)

运行结果

5.2观看视频与获取aid代码

def fetch_bilibili_info(url, headers):#链接,请求头
    try:
        # 发送 GET 请求
        response = requests.get(url, headers=headers)
        if response.status_code != 200:
            print(f"请求失败,状态码: {response.status_code}")
            return None

        html_content = response.text
        # 提取 aid
        aid_match = re.search(r'"aid":(\d+)', html_content)
        aid = aid_match.group(1) if aid_match else None

        return {"aid": aid} 

    except requests.RequestException as e:
        print(f"请求错误: {e}")
        return None
    except Exception as e:
        print(f"发生错误: {e}")
        return None

运行结果 

5.3投币代码

import requests
import re


def extract_csrf(cookie):
    """从 Cookie 提取 CSRF 令牌"""
    match = re.search(r"bili_jct=([^;]+)", cookie)
    return match.group(1) if match else None

def add_bilibili_coin(aid):
    url = "https://api.bilibili.com/x/web-interface/coin/add"
    headers = {
        "Host": "www.bilibili.com",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
        "Accept-Encoding": "gzip, deflate, br, zstd",
        "Connection": "keep-alive",
        "Upgrade-Insecure-Requests": "1",
        "Sec-Fetch-Dest": "document",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Site": "none",
        "Sec-Fetch-User": "?1",
        "Priority": "u=0, i",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
        "TE": "trailers",
        "Cookie":""
    }

    # 从 Cookie 中提取 CSRF 令牌
    csrf = extract_csrf(headers["Cookie"])
    if not csrf:
        print("无法从 Cookie 提取 CSRF 令牌!请检查 Cookie 是否包含 'bili_jct'")
        return None

    # 表单数据
    data = {
        "aid": aid,
        "multiply": 1,  # 投币数量
        "select_like": 1,  # 是否同时点赞(1: 点赞, 0: 不点赞)
        "cross_domain": "true",
        "from_spmid": "333.788.player.player_end_recommend_autoplay",
        "spmid": "333.788.0.0",
        "statistics": '{"appId":100,"platform":5}',
        "eab_x": 2,
        "ramval": 15,
        "source": "web_normal",
        "ga": 1,
        "csrf": csrf  # 提取的 CSRF
    }

    try:
        response = requests.post(url, headers=headers, data=data)

        if response.status_code == 200:
            return response.json()  # 返回 JSON 结果
        else:
            print(f"请求失败,状态码: {response.status_code}")
            return None
    except requests.RequestException as e:
        print(f"请求错误: {e}")
        return None


# 示例调用
aid = "926920308"  # 要投币的视频 aid

result = add_bilibili_coin(aid)
if result:
    print("投币响应结果:", result)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小咖拉眯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值