b站升级协议保姆级教学——登录、观看视频、投币、分享视频获取全部每日经验思路
通过B站获取经验的规则,登录、观看视频、投币、分享视频均可获得经验
B站每日经验上限为65
这些操作的前提均需要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)