从零开始的修炼 发表于 前天 13:22

[爬虫]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'}

FishC 发表于 前天 13:24

根据您提供的信息,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 小助理,如未能正确解答您的问题,请继续追问。

isdkz 发表于 前天 17:22

csrf参数都是动态生成的,你使用之前抓到的 csrf 参数肯定过不了校验

从零开始的修炼 发表于 前天 17:29

isdkz 发表于 2025-8-12 17:22
csrf参数都是动态生成的,你使用之前抓到的 csrf 参数肯定过不了校验

这个目前确认是不变的,因为这个参数是cookie里的bili_jct值,我cookie是直接硬编码到headers里的。刚才也确认了下 还是没变化

isdkz 发表于 前天 17:31

从零开始的修炼 发表于 2025-8-12 17:29
这个目前确认是不变的,因为这个参数是cookie里的bili_jct值,我cookie是直接硬编码到headers里的。刚才 ...

你b站id是多少?我加你私信测一下

从零开始的修炼 发表于 前天 17:32

isdkz 发表于 2025-8-12 17:31
你b站id是多少?我加你私信测一下

Yukio_KK

从零开始的修炼 发表于 前天 18:41

1

本帖最后由 从零开始的修炼 于 2025-8-12 18:43 编辑

1
页: [1]
查看完整版本: [爬虫]b站接口问题