bilibili-API-collect
bilibili-API-collect copied to clipboard
使用/x/polymer/web-dynamic/v1/feed/space接口获取动态时返回-352错误
/x/polymer/web-dynamic/v1/feed/space
接口用于获取指定用户的动态列表
以前该接口使用正常,自2023.5.24下午5点20左右开始,在不带cookie下访问该接口会返回错误-352,如下:
{'code': -352, 'message': '-352', 'ttl': 1}
经过测试,访问该接口需要在cookies中携带一个合法的bvuid3
。
我的爬虫代码是先访问主站,然后携带cookie去访问该接口,但现在不可行了,可能该接口需要额外的验证环节?
之前都是无登录的情况下进行访问
curl -s -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" -e "https://space.bilibili.com/2/dynamic" "https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=2&offset="
我这边不带bvuid3
没有出现-352
问题
curl -s -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" -e "https://space.bilibili.com/2/dynamic" "https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=2&offset="
我这边不带
bvuid3
没有出现-352
问题
很奇怪,我换成你的UA之后也能不带bvuid3访问了,我懵逼了
curl -s -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" -e "https://space.bilibili.com/2/dynamic" "https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=2&offset="
我这边不带
bvuid3
没有出现-352
问题
现在我这里这个命令又不行了,我不懂了
@HashLiver 执行结果如图,还是不太懂
不行了,现在这个接口必须携带cookie才能访问了,不需要登录但是必须要cookie,否则返回-352 并且即使加上cookie 也不是一定可以成功访问 还是有一定几率返回-352,比如当你频繁访问的时候
我测试的跟ccokie没关系。跟ua有关系,有些ua可能是被拉黑了,所以352了。换个正常的ua应该就好了。(目前我观测的结果是这样,至于有没有其他方面的影响就不知道了
这下真的麻了,换什么UA都没用了 :(
@lovetingyuan 不登录的cookie怎么获得呀😢
import uuid
import random
import requests
headers = {
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"referer": "https://www.bilibili.com",
}
cookies = {
"buvid3": "{}{:05d}infoc".format(uuid.uuid4(), random.randint(1, 99999))
}
r = requests.get("https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=2", headers=headers, cookies=cookies)
print(r.text)
@lovetingyuan 不登录的cookie怎么获得呀😢
不登录访问b站 仍然会注入一些cookie的 可以打开浏览器看看 document.cookie
@lovetingyuan 不登录的cookie怎么获得呀😢
不登录访问b站 仍然会注入一些cookie的 可以打开浏览器看看 document.cookie
我以前的做法是先访问主站再访问这个接口,还是寄
import uuid import random import requests headers = { "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "referer": "https://www.bilibili.com", } cookies = { "buvid3": "{}{:05d}infoc".format(uuid.uuid4(), random.randint(1, 99999)) } r = requests.get("https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=2", headers=headers, cookies=cookies) print(r.text)
这个意思是可以自己生成bvuid3吗?有意思,回去试一下
r = requests.get("https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=2", headers=headers, cookies=cookies)
我试了一下,是可以的,但不知道能管多久
我尝试了下, 好像只需要在cookie里面的DedeUserID为动态所属用户id就行了
我尝试了下, 好像只需要在cookie里面的DedeUserID为动态所属用户id就行了
太秀了哥,这是怎么发现的
太秀了哥,这是怎么发现的
把cookie里面的参数一个个删, 发现把DedeUserID
删了就开始报-352
了
没用,这个请求多了还是会-352
def get_user_space(user_id: int):
r1 = httpx.get(
"https://space.bilibili.com/1133258171/dynamic",
headers={
"Host": "space.bilibili.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
},
)
print(r1.cookies)
url = "https://api.bilibili.com/x/internal/gaia-gateway/ExClimbWuzhi"
payload ='' # payload 是浏览器指纹,自己去抓一下用,浏览器无痕模式进入某个动态页面即可抓到
headers = {
"authority": "api.bilibili.com",
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"content-type": "application/json;charset=UTF-8",
"dnt": "1",
"origin": "https://space.bilibili.com",
"referer": "https://space.bilibili.com/1133258171/dynamic",
"sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Microsoft Edge";v="114"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.58",
}
response = httpx.post(url, headers=headers, data=payload, cookies=r1.cookies)
print(response.json)
params = {
"host_mid": user_id,
}
r = httpx.get(
"https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space",
params=params,
headers={
"Host": "api.bilibili.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
},
cookies=r1.cookies,
)
res = r.json()
print(res)
return res
get_user_space(1133258171)
payload参数注意需要自己抓一下包,应该是浏览器指纹,我就不放出来了。
浏览器测试的话需要打开无痕模式,第一次打开页面会带着从/dynamic
获取的cookie
去请求 /x/internal/gaia-gateway/ExClimbWuzhi
接口,但注意这个接口会被广告屏蔽软件如ublock屏蔽,导出跳出验证码。
如果你尝试在无痕模式清除cookie
后请求页面,会触发验证码
@renmu123 试了下你这个,请求都对,但最后的请求还是会-352 另外今天开始好像这个接口变的更严了,只传DedeUserID没效果了。隐私模式访问动态页面会直接弹验证码,过了验证码才刷出来 @SocialSisterYi 考虑下重开issue吧
@renmu123 试了下你这个,请求都对,但最后的请求还是会-352 另外今天开始好像这个接口变的更严了,只传DedeUserID没效果了。隐私模式访问动态页面会直接弹验证码,过了验证码才刷出来 @SocialSisterYi 考虑下重开issue吧
目前我还是可以使用的,payload
参数注意需要自己抓一下包,应该是浏览器指纹,我就不放出来了。
浏览器测试的话 /x/internal/gaia-gateway/ExClimbWuzhi
接口会被广告屏蔽软件如ublock
屏蔽,导出跳出验证码
之前使用已登录的cookie时是可以正常访问的,但今天收紧之后也不太好使了。蹲一个解决方法
收紧+1 有时候刷好几次才刷出来 刚试了下 必须要有buvid3这个cookie,并且这个buvid3并不是随便取的,试过通过接口取或者通过代码生成但是还是不行,只有通过访问官网然后拿官网种的cookie才有效
失效+1 蹲一个方法
尝试使用selenium获取cookie但好像没什么用
没找到解决方法,登录不是必须,但是cookie是必要,很奇怪浏览器点点点可以访问,搞后端就报-352,中间浏览器应该发生了什么以至于可以访问
我测试了一下,感觉只要把 SESSDATA 加在Cookie很像就可以了
const axios = require("axios");
const fs = require("fs");
const YOUR_SESSDATA = fs.readFileSync("./session_data.txt",{encoding:"utf8"});
main();
async function main() {
let channel_id = 1;
while(true) {
var options = {
method:'get',
url: `https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?offset=&host_mid=${channel_id}&timezone_offset=-480&features=itemOpusStyle`,
headers: {
'Cookie':`SESSDATA=${YOUR_SESSDATA}`,
},
};
await axios.request(options).then((result) => {
console.log(result.data);
}).catch((err) => {
console.log(err);
});
console.log(channel_id);
channel_id++;
}
}
但是有时候却会返回空的数据(例如:13,14 )
坐等大佬解决空数据的问题,因为我感觉空数据很像是随机触发的
之前用的DedeUserID,现在失效了,好像强制必须有buvid3了,或者登录状态下的SESSDATA,但用自己号的相关信息还是太不安全了,被当成机器人封号血亏
renmu123贴的是可以用的,但他正文带几个错别字,我也看了半天才看懂。 首先关掉广告屏蔽扩展,浏览器无痕打开某个动态(或者清除cookie刷新),第一次打开会有验证码,这时不继续操作,直接刷新,刷新后你会发现这次和以后就没有验证码了,从中你可以发现些端倪,就是renmu123所说的。(如果你首次打开时没关闭广告屏蔽扩展,就会一直有验证码,即使你后面中途关闭扩展也会弹验证码)
log-reporter.js里搜payload可以看到payload怎么来的,里面基本上就是浏览器指纹加个timestamp和_uuid,_uuid是本地生成的,也是在这个文件里搜infoc就能搜到,不知道是否任意生成皆可。
带dynamic返回的cookie(包含buvid3)和payload请求过一次ExClimbWuzhi后,后续对dynamic的请求用相同的buvid3+任意UA,就不会-352了,有效期好像还挺长的。相对的,如果你是用手动验证码后的buvid3,请求不需要附带UA,但只有半小时有效期(半小时后带UA是否仍有效我没测试)
@UnluckyNinja 感谢提醒,用SESSDATA的确有风险。我也测试了一下 @renmu123 的方法,的确是可以用的。
以下是我用nodejs实现的方法(感谢 @renmu123 提供的代码,我只是翻译成nodejs而已)
const axios = require("axios");
const fs = require("fs");
main();
async function test() {
var payload = fs.readFileSync("./payload.txt", {encoding:"utf8"});
var cookie_buvid3;
var options = {
"method":"post",
"url":"https://api.bilibili.com/x/internal/gaia-gateway/ExClimbWuzhi",
"headers": {
"Content-Type":"application/json",
},
"data": payload,
};
await axios.request(`https://space.bilibili.com/1/dynamic`).then((res) => {
var all_headers = res.headers["set-cookie"][0];
cookie_buvid3 = all_headers.split(" ");
cookie_buvid3 = cookie_buvid3[0];
}).catch((err) => {
console.log(err);
});
options.headers["Cookie"] = cookie_buvid3;
await axios.request(options).then((res) => {
console.log(res.data);
}).catch((err) => {
console.log(err);
});
return cookie_buvid3;
}
async function main() {
var buvid3 = await test();
console.log(buvid3);
var base_id = 1;
var options = {
"method":"get",
"url":`https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?offset=&host_mid=${base_id}&timezone_offset=-480&features=itemOpusSty`,
"headers": {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"Cookie": buvid3,
},
};
console.log(options);
while(true) {
await axios.request(options).then((res) => {
console.log(res.data);
}).catch((err) => {
console.log(err);
});
console.log(base_id);
base_id++;
};
}
然后我想补充一下抓payload的方法,https://api.bilibili.com/x/internal/gaia-gateway/ExClimbWuzhi
这个接口只有在第一次访问bilibili才会触发。(以下图片给不会抓payload的人知道怎样抓,因为我自己也是卡了很久 :D )
刷新页面之后就会不见了