[爬虫]b站接口问题
本帖最后由 从零开始的修炼 于 2025-8-12 20:50 编辑***** 问题已解决变量名写错了 *****
打算用python调用b站私信的接口,参数全对,但是报csrf校验错误。大佬们 怎么解决(需要其他信息请回复)
接口信息:
请求 URL
https://api.vc.bilibili.com/web_im/v1/web_im/send_msg?w_sender_uid=473690062&w_receiver_id=3546950181849575&w_dev_id=93513FA9-8E7C-40C3-8BCE-5DCD9E3CB634&w_rid=f53a90036f5dcf0b0af557155e438e14&wts=1754884846
查询字符串参数:
w_sender_uid:473690062
w_receiver_id:3546950181849575
w_dev_id:93513FA9-8E7C-40C3-8BCE-5DCD9E3CB634
w_rid:f53a90036f5dcf0b0af557155e438e14
wts:1754884846
表单数据:
msg:473690062
msg:1
msg:3546950181849575
msg:1
msg:0
msg:{"content":"1111"}
msg:0
msg
msg:93513FA9-8E7C-40C3-8BCE-5DCD9E3CB634
msg:1754884846
from_firework:0
build:0
mobi_app:web
csrf:f140a7396431c7341069640e570a8975
程序结果:
PyDev console: starting.
Python 3.12.10 (tags/v3.12.10:0cc8128, Apr8 2025, 12:21:36) on win32
{"code":-111,"message":"csrf 校验失败","ttl":1}
>>>url
'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg?w_sender_uid=473690062&w_receiver_id=3546950181849575&w_dev_id=93513FA9-8E7C-40C3-8BCE-5DCD9E3CB634&w_rid=f53a90036f5dcf0b0af557155e438e14&wts=1754884846'
>>>data
{'msg': 473690062, 'msg': 1, 'msg': 3546950181849575, 'msg': 1, 'msg': 0, 'msg': {'content': 'Python TEST'}, 'msg': 0, 'msg': None, 'msg': '93513FA9-8E7C-40C3-8BCE-5DCD9E3CB634', 'msg': 1754884846, 'from_firework': 0, 'build': 0, 'mobi_app': 'web', 'csrf': 'f140a7396431c7341069640e570a8975'} 根据您提供的信息,CSRF校验失败通常是由于以下原因造成的:
### 主要问题分析:
1. CSRF Token不匹配:表单中的 csrf 参数必须与Cookies中的 bili_jct 值完全一致
2. 请求头缺失Cookies:未在请求中携带登录后的Cookies(尤其是 bili_jct)
3. 表单数据结构错误:多个 msg 参数被覆盖,应采用元组列表格式
### 解决方案:
1. 确保从登录Cookies中获取正确的CSRF Token:
import requests
# 登录后获取的Cookies(示例)
cookies = {
"SESSDATA": "你的SESSDATA",
"bili_jct": "f140a7396431c7341069640e570a8975"# 必须与csrf参数一致
}
2. 修改表单数据结构(使用元组列表避免覆盖):
data = [
('msg', '473690062'),
('msg', '1'),
('msg', '3546950181849575'),
('msg', '1'),
('msg', '0'),
('msg', '{"content":"Python TEST"}'),# JSON需保持字符串格式
('msg', '0'),
('msg', ''),
('msg', '93513FA9-8E7C-40C3-8BCE-5DCD9E3CB634'),
('msg', '1754884846'),
('from_firework', '0'),
('build', '0'),
('mobi_app', 'web'),
('csrf', 'f140a7396431c7341069640e570a8975')# 确保与cookies中的bili_jct相同
]
3. 发送请求时携带Cookies和Headers:
headers = {
"User-Agent": "Mozilla/5.0",
"Referer": "https://www.bilibili.com"
}
response = requests.post(
url,
data=data,
cookies=cookies,# 关键!必须携带cookies
headers=headers
)
### 重点检查项:
1. 确保Cookies中的 bili_jct 值 = 表单中的 csrf 值
2. 使用 requests.Session() 保持会话(推荐)
3. 动态参数 w_rid 和 wts 可能需要实时生成
> 如果仍然失败,建议检查账号登录状态是否有效,并确保请求头包含完整的 User-Agent 和 Referer。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 csrf参数都是动态生成的,你使用之前抓到的 csrf 参数肯定过不了校验 isdkz 发表于 2025-8-12 17:22
csrf参数都是动态生成的,你使用之前抓到的 csrf 参数肯定过不了校验
这个目前确认是不变的,因为这个参数是cookie里的bili_jct值,我cookie是直接硬编码到headers里的。刚才也确认了下 还是没变化 从零开始的修炼 发表于 2025-8-12 17:29
这个目前确认是不变的,因为这个参数是cookie里的bili_jct值,我cookie是直接硬编码到headers里的。刚才 ...
你b站id是多少?我加你私信测一下 isdkz 发表于 2025-8-12 17:31
你b站id是多少?我加你私信测一下
Yukio_KK
1
本帖最后由 从零开始的修炼 于 2025-8-12 18:43 编辑1
页:
[1]