bilibili-API-collect icon indicating copy to clipboard operation
bilibili-API-collect copied to clipboard

使用/x/polymer/web-dynamic/v1/feed/space接口获取动态时返回-352错误

Open TDK1969 opened this issue 1 year ago • 54 comments

/x/polymer/web-dynamic/v1/feed/space接口用于获取指定用户的动态列表 以前该接口使用正常,自2023.5.24下午5点20左右开始,在不带cookie下访问该接口会返回错误-352,如下:

{'code': -352, 'message': '-352', 'ttl': 1}

TDK1969 avatar May 25 '23 15:05 TDK1969

经过测试,访问该接口需要在cookies中携带一个合法的bvuid3。 我的爬虫代码是先访问主站,然后携带cookie去访问该接口,但现在不可行了,可能该接口需要额外的验证环节?

TDK1969 avatar May 28 '23 06:05 TDK1969

之前都是无登录的情况下进行访问

TDK1969 avatar May 28 '23 08:05 TDK1969

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 avatar May 29 '23 13:05 HashLiver

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访问了,我懵逼了

TDK1969 avatar May 29 '23 13:05 TDK1969

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问题

现在我这里这个命令又不行了,我不懂了

TDK1969 avatar May 29 '23 17:05 TDK1969

@HashLiver 执行结果如图,还是不太懂 image

TDK1969 avatar May 29 '23 17:05 TDK1969

不行了,现在这个接口必须携带cookie才能访问了,不需要登录但是必须要cookie,否则返回-352 并且即使加上cookie 也不是一定可以成功访问 还是有一定几率返回-352,比如当你频繁访问的时候

lovetingyuan avatar May 31 '23 03:05 lovetingyuan

我测试的跟ccokie没关系。跟ua有关系,有些ua可能是被拉黑了,所以352了。换个正常的ua应该就好了。(目前我观测的结果是这样,至于有没有其他方面的影响就不知道了

Colter23 avatar Jun 02 '23 05:06 Colter23

这下真的麻了,换什么UA都没用了 :(

fuck_bilibili

HashLiver avatar Jun 02 '23 06:06 HashLiver

@lovetingyuan 不登录的cookie怎么获得呀😢

TDK1969 avatar Jun 02 '23 06:06 TDK1969

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)

LordPenguin666 avatar Jun 02 '23 06:06 LordPenguin666

@lovetingyuan 不登录的cookie怎么获得呀😢

不登录访问b站 仍然会注入一些cookie的 可以打开浏览器看看 document.cookie

lovetingyuan avatar Jun 02 '23 07:06 lovetingyuan

@lovetingyuan 不登录的cookie怎么获得呀😢

不登录访问b站 仍然会注入一些cookie的 可以打开浏览器看看 document.cookie

我以前的做法是先访问主站再访问这个接口,还是寄

TDK1969 avatar Jun 02 '23 07:06 TDK1969

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吗?有意思,回去试一下

TDK1969 avatar Jun 02 '23 07:06 TDK1969

r = requests.get("https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=2", headers=headers, cookies=cookies)

我试了一下,是可以的,但不知道能管多久

moian98 avatar Jun 02 '23 08:06 moian98

我尝试了下, 好像只需要在cookie里面的DedeUserID为动态所属用户id就行了 image

feilongproject avatar Jun 02 '23 15:06 feilongproject

我尝试了下, 好像只需要在cookie里面的DedeUserID为动态所属用户id就行了 image

太秀了哥,这是怎么发现的

TDK1969 avatar Jun 02 '23 16:06 TDK1969

太秀了哥,这是怎么发现的

把cookie里面的参数一个个删, 发现把DedeUserID删了就开始报-352

feilongproject avatar Jun 03 '23 06:06 feilongproject

没用,这个请求多了还是会-352

jinyu2022 avatar Jun 21 '23 19:06 jinyu2022

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 avatar Jul 04 '23 08:07 renmu123

@renmu123 试了下你这个,请求都对,但最后的请求还是会-352 另外今天开始好像这个接口变的更严了,只传DedeUserID没效果了。隐私模式访问动态页面会直接弹验证码,过了验证码才刷出来 @SocialSisterYi 考虑下重开issue吧

gouku avatar Jul 04 '23 08:07 gouku

@renmu123 试了下你这个,请求都对,但最后的请求还是会-352 另外今天开始好像这个接口变的更严了,只传DedeUserID没效果了。隐私模式访问动态页面会直接弹验证码,过了验证码才刷出来 @SocialSisterYi 考虑下重开issue吧

目前我还是可以使用的,payload参数注意需要自己抓一下包,应该是浏览器指纹,我就不放出来了。

浏览器测试的话 /x/internal/gaia-gateway/ExClimbWuzhi 接口会被广告屏蔽软件如ublock屏蔽,导出跳出验证码

renmu123 avatar Jul 04 '23 09:07 renmu123

之前使用已登录的cookie时是可以正常访问的,但今天收紧之后也不太好使了。蹲一个解决方法

ywstratus avatar Jul 04 '23 11:07 ywstratus

收紧+1 有时候刷好几次才刷出来 刚试了下 必须要有buvid3这个cookie,并且这个buvid3并不是随便取的,试过通过接口取或者通过代码生成但是还是不行,只有通过访问官网然后拿官网种的cookie才有效

lovetingyuan avatar Jul 04 '23 11:07 lovetingyuan

失效+1 蹲一个方法

moian98 avatar Jul 05 '23 08:07 moian98

尝试使用selenium获取cookie但好像没什么用

guanzhujiaran avatar Jul 05 '23 11:07 guanzhujiaran

没找到解决方法,登录不是必须,但是cookie是必要,很奇怪浏览器点点点可以访问,搞后端就报-352,中间浏览器应该发生了什么以至于可以访问

snowtafir avatar Jul 05 '23 17:07 snowtafir

我测试了一下,感觉只要把 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++;
	}
}

image

但是有时候却会返回空的数据(例如:13,14 ) image 坐等大佬解决空数据的问题,因为我感觉空数据很像是随机触发的

00randomize00 avatar Jul 05 '23 18:07 00randomize00

之前用的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 avatar Jul 05 '23 18:07 UnluckyNinja

@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 )

image

刷新页面之后就会不见了

image

00randomize00 avatar Jul 06 '23 15:07 00randomize00