feat: bili_ticket 算法 Java 实现 及 信息补充 及 错误修正 (#1061)

* feat: 空间头图及拼写错误修正

* feat(fav/info.md): code 11010

* fix(misc/sign/wbi.md): java extra params

* feat(misc/sign/bili_ticket.md): description and java demo

* feat(video_ranking/dynamic.md): 分区视频相关接口

* fix(video_ranking/dynamic.md): 未关闭的标签

* feat(README.md): 补充链接

* feat(clientinfo/ip.md): 查询任意 IP 地址的归属地

* feat: get buvid3 buvid4 from api

* feat: new error code & format

* feat(misc/picture.md): 图片格式化更多规则
This commit is contained in:
Session小胡 2024-07-25 20:03:52 +08:00 committed by GitHub
parent 750dd6a924
commit 18c1efbc10
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 1078 additions and 56 deletions

View File

@ -67,11 +67,13 @@ B站 API 采用 C/S 结构,大多数接口为 REST API 和 gRPC少部分接
- [x] [APP API 签名](docs/misc/sign/APP.md)`appkey`与`sign` - [x] [APP API 签名](docs/misc/sign/APP.md)`appkey`与`sign`
- [x] [已知的 APPKey](docs/misc/sign/APPKey.md) - [x] [已知的 APPKey](docs/misc/sign/APPKey.md)
- [x] [Wbi 签名](docs/misc/sign/wbi.md)`wts`与`w_rid` - [x] [Wbi 签名](docs/misc/sign/wbi.md)`wts`与`w_rid`
- [ ] [bili_ticket](docs/misc/sign/bili_ticket.md)
- [x] [公共错误码](docs/misc/errcode.md) - [x] [公共错误码](docs/misc/errcode.md)
- [x] [图片格式化](docs/misc/picture.md) - [x] [图片格式化](docs/misc/picture.md)
- [x] [bvid 说明](docs/misc/bvid_desc.md) - [x] [bvid 说明](docs/misc/bvid_desc.md)
- [ ] [设备唯一标识BUVID](docs/misc/device_identity.md) - [ ] [设备唯一标识BUVID](docs/misc/device_identity.md)
- [ ] [获取 buvid3 / buvid4](docs/misc/buvid3_4.md)
- [ ] [gRPC API 接口定义](grpc_api) - [ ] [gRPC API 接口定义](grpc_api)
- [ ] [登录](docs/login) - [ ] [登录](docs/login)
- [x] [登录操作 (人机认证)](docs/login/login_action) - [x] [登录操作 (人机认证)](docs/login/login_action)
@ -207,6 +209,7 @@ B站 API 采用 C/S 结构,大多数接口为 REST API 和 gRPC少部分接
- [ ] 动态列表 - [ ] 动态列表
- [x] [特定话题动态列表](docs/dynamic/tag_dynamics.md) - [x] [特定话题动态列表](docs/dynamic/tag_dynamics.md)
- [ ] [动态内容](docs/dynamic/get_dynamic_detail.md) - [ ] [动态内容](docs/dynamic/get_dynamic_detail.md)
- [ ] [导航栏动态](docs/dynamic/nav.md)
- [ ] [相簿](docs/album) - [ ] [相簿](docs/album)
- [x] [基本信息](docs/album/info.md) - [x] [基本信息](docs/album/info.md)
- [x] [相簿列表](docs/album/list.md) - [x] [相簿列表](docs/album/list.md)
@ -357,6 +360,7 @@ OR Aifadian[https://afdian.net/@ShakaiAneE](https://afdian.net/@ShakaiAneE)
- [SocialSisterYi/bcut-asr](https://github.com/SocialSisterYi/bcut-asr): 使用必剪API的语音字幕识别 - [SocialSisterYi/bcut-asr](https://github.com/SocialSisterYi/bcut-asr): 使用必剪API的语音字幕识别
- [CzJam/Bili_Realtime_Data](https://github.com/CzJam/Bili_Realtime_Data): Bilibili粉丝与视频实时数据统计 - [CzJam/Bili_Realtime_Data](https://github.com/CzJam/Bili_Realtime_Data): Bilibili粉丝与视频实时数据统计
- [kingwingfly/fav](https://github.com/kingwingfly/fav): 自动同步bili收藏夹、合集视频到本地的CLI工具Rust实现并提供一个文档测试完善的Rust风格的用于构建有状态爬虫的核心库 - [kingwingfly/fav](https://github.com/kingwingfly/fav): 自动同步bili收藏夹、合集视频到本地的CLI工具Rust实现并提供一个文档测试完善的Rust风格的用于构建有状态爬虫的核心库
- [linyuye/Bilibili_crawler](https://github.com/linyuye/Bilibili_crawler): 基于bilibili懒加载api爬取b站动态视频等评论区
### 其他 ### 其他

View File

@ -1,6 +1,6 @@
# 通过ip确定地理位置 # 通过ip确定地理位置
## 通过ip确定位置 ## 根据请求IP确定属地
> https://api.bilibili.com/x/web-interface/zone > https://api.bilibili.com/x/web-interface/zone
@ -60,3 +60,94 @@ curl 'https://api.bilibili.com/x/web-interface/zone'
``` ```
</details> </details>
## 查询任意 IP 地址的归属地
> https://api.live.bilibili.com/ip_service/v1/ip_service/get_ip_addr
> https://api.live.bilibili.com/client/v1/Ip/getInfoNew
注: 两接口等效
*请求方式GET*
**URL参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| ip | str | IP地址 | 不必要 | IPv4或IPv6地址不限, 留空与[根据请求IP确定地理位置](#根据请求ip确定地理位置)基本相同 |
**JSON回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0: 成功 |
| message | str | 错误信息 | 默认为空 |
| msg | str | 错误信息 | 同message |
| data | obj | 信息本体 | 出错时为空数组 |
`data`对象:
与[根据请求IP确定地理位置](#根据请求ip确定地理位置)回复的`data`对象基本相同, 但无 `country_code` 字段
**示例:**
查询请求IP地址的归属地:
```shell
curl -G 'https://api.live.bilibili.com/client/v1/Ip/getInfoNew'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"addr": "104.28.156.113",
"country": "新加坡",
"province": "新加坡",
"city": "",
"isp": "cloudflare.com",
"latitude": "1.352083",
"longitude": "103.819836"
}
}
```
</details>
查询IP地址`8.8.8.8`的归属地:
```shell
curl -G 'https://api.live.bilibili.com/ip_service/v1/ip_service/get_ip_addr' \
--data-urlencode 'ip=8.8.8.8'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"addr": "8.8.8.8",
"country": "GOOGLE.COM",
"province": "GOOGLE.COM",
"city": "",
"isp": "level3.com",
"latitude": "",
"longitude": ""
}
}
```
</details>

View File

@ -22,7 +22,7 @@
| 字段 | 类型 | 内容 | 备注 | | 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | -------- | --------------------------------------------------- | | ------- | ----------------------------- | -------- | --------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-403访问权限不足 | | code | num | 返回值 | 0成功<br />-400请求错误<br />-403访问权限不足<br />11010: 内容不存在 |
| message | str | 错误信息 | 默认为0 | | message | str | 错误信息 | 默认为0 |
| data | 有效时obj<br />无效或null | 信息本体 | | | data | 有效时obj<br />无效或null | 信息本体 | |

View File

@ -161,7 +161,7 @@ curl 'https://api.live.bilibili.com/room/v1/Room/update' \
| 字段 | 类型 | 内容 | 备注 | | 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ | | ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />65530token错误登录错误<br />1错误<br />60009分区不存在<br />60013非常抱歉您所在的地区受实名认证限制无法开播<br />**(其他错误码有待补充)** | | code | num | 返回值 | 0成功<br />65530token错误登录错误<br />1错误<br />60009分区不存在<br />60024: 目标分区需要人脸认证<br />60013非常抱歉您所在的地区受实名认证限制无法开播<br />**(其他错误码有待补充)** |
| msg | str | 错误信息 | 默认为空 | | msg | str | 错误信息 | 默认为空 |
| message | str | 错误信息 | 默认为空 | | message | str | 错误信息 | 默认为空 |
| data | obj | 信息本体 | | | data | obj | 信息本体 | |

48
docs/misc/buvid3_4.md Normal file
View File

@ -0,0 +1,48 @@
# 获取 buvid3 / buvid4
## 游客获取 buvid3 / buvid4
> https://api.bilibili.com/x/frontend/finger/spi
*请求方式: GET*
**JSON回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | -------- |
| code | num | 返回值 | 0成功 |
| message | str | 信息 | ok: 成功 |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ------ | ---- |
| b_3 | str | buvid3 | 需手动存放至 cookie 中 |
| b_4 | str | buvid4 | 同上 |
**示例:**
注: 建议自行生成, 不要复制本处示例的 buvid3 / buvid4.
```shell
curl -G 'https://api.bilibili.com/x/frontend/finger/spi'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"b_3": "D9656DA8-9BEF-F464-5B72-C4849AFD336379044infoc",
"b_4": "F6E0FD4B-520C-1902-4F7B-E461D8D1F5AB79044-024072309-666onEZSnlHVPjoRp4kDYg=="
},
"message": "ok"
}
```
</details>

View File

@ -248,10 +248,9 @@ print(av2bv(avid: 111298867365120))
print(bv2av(bvid: "BV1L9Uoa9EUx")) print(bv2av(bvid: "BV1L9Uoa9EUx"))
``` ```
### Java ### Java
``` ```java
import java.math.BigInteger; import java.math.BigInteger;
/** /**
@ -266,8 +265,7 @@ public class AVBVConverter {
private static final String DATA = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf"; private static final String DATA = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf";
public static String av2bv(int aidParam) { public static String av2bv(long aidParam) {
BigInteger aid = BigInteger.valueOf(aidParam); BigInteger aid = BigInteger.valueOf(aidParam);
char[] bytes = {'B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'}; char[] bytes = {'B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'};
int bvIndex = bytes.length - 1; int bvIndex = bytes.length - 1;
@ -275,18 +273,14 @@ public class AVBVConverter {
while (tmp.compareTo(BigInteger.ZERO) > 0) { while (tmp.compareTo(BigInteger.ZERO) > 0) {
bytes[bvIndex] = DATA.charAt(tmp.mod(BigInteger.valueOf(BASE)).intValue()); bytes[bvIndex] = DATA.charAt(tmp.mod(BigInteger.valueOf(BASE)).intValue());
tmp = tmp.divide(BigInteger.valueOf(BASE)); tmp = tmp.divide(BigInteger.valueOf(BASE));
bvIndex -= 1; bvIndex--;
} }
swap(bytes, 3, 9); swap(bytes, 3, 9);
swap(bytes, 4, 7); swap(bytes, 4, 7);
StringBuilder sb = new StringBuilder(bytes.length); return new String(bytes);
for (Character ch : bytes) {
sb.append(ch);
}
return sb.toString();
} }
public static int bv2av(String bvid) { public static long bv2av(String bvid) {
char[] bvidArr = bvid.toCharArray(); char[] bvidArr = bvid.toCharArray();
swap(bvidArr, 3, 9); swap(bvidArr, 3, 9);
swap(bvidArr, 4, 7); swap(bvidArr, 4, 7);
@ -296,7 +290,7 @@ public class AVBVConverter {
tmp = tmp.multiply(BigInteger.valueOf(BASE)).add(BigInteger.valueOf(DATA.indexOf(c))); tmp = tmp.multiply(BigInteger.valueOf(BASE)).add(BigInteger.valueOf(DATA.indexOf(c)));
} }
BigInteger xor = tmp.and(MASK_CODE).xor(XOR_CODE); BigInteger xor = tmp.and(MASK_CODE).xor(XOR_CODE);
return xor.intValue(); return xor.longValue();
} }
@ -314,21 +308,17 @@ public class AVBVConverter {
final int aid2 = 305988942; final int aid2 = 305988942;
final String bv2 = "BV1aP411K7it"; final String bv2 = "BV1aP411K7it";
//av ==> bv //av ==> bv
assert av2bv(aid1).equals(bv1); assert av2bv(aid1).equals(bv1);
assert av2bv(aid2).equals(bv2); assert av2bv(aid2).equals(bv2);
//bv ==>av //bv ==>av
assert bv2av(bv1) == aid1; assert bv2av(bv1) == aid1;
assert bv2av(bv2) == aid2; assert bv2av(bv2) == aid2;
} }
} }
``` ```
### Golang ### Golang
```go ```go

View File

@ -2,7 +2,7 @@
## 设备唯一标识 BUVID ## 设备唯一标识 BUVID
注意区分于 Web 端的 buvid3, buvid4. 注意区分于 Web 端的 [buvid3, buvid4](buvid3_4.md).
BUVID 在 APP 首次安装于某设备, 且首次启动时生成. BUVID 在 APP 首次安装于某设备, 且首次启动时生成.

View File

@ -1,18 +1,33 @@
# 图片格式化 # 图片格式化
对于\*.hdslb.com/bfs下的图片文件都可以使用以下格式化参数 对于 `*.hdslb.com/bfs` 下的图片文件都可以使用以下可选格式化参数.
> \*.hdslb.com/bfs/\*/\*.\[jpg/png/gif\]@{width}w\_{high}h\_{quality}q.{format} 使用 `@` 开始参数 (无论格式如何, 无论是否有参数, 通过计算 HASH 发现, 使用 `@` 均会导致返回图片不同), 多个参数以 `_` 分隔, 图片格式无需分隔且必须放在最后
| 可选参数 | 含义 | 备注 | 参见: [#191](https://github.com/SocialSisterYi/bilibili-API-collect/issues/191)
| -------- | ---------------- | ---------------- |
| width | 图片最大限制宽度 | | 注: jpg 即 jpeg, 二者等效. 网页端常用 AVIF, WebP.
| high | 图片最大限制高度 | |
| quality | 图片质量百分比 | 仅限webp | | 参数 | 格式 | 含义 | 备注 |
| format | 图片格式 | 仅限png/jpg/webp/[avg_color](#avg_color格式说明) | | ---- | ------- | ---------------- | ---------------- |
| w | ${int}w | 图片最大限制宽度 | 范围 [1, 9223372036854775807] |
| h | ${int}h | 图片最大限制高度 | 范围 [1, 9223372036854775807] |
| s | ${int}s | 作用尚不明确 | 不影响输出结果, 范围 [1, 9223372036854775807] |
| e | ${int}e | 改变大小 | 0: 保留比例取其小, 1: 保留比例取其大, 2: 不保留原比例 |
| p | ${int}p | 缩放倍数 | 默认100, 范围 [1, 1000] |
| o | ${int}o | 作用尚不明确 | 不影响输出结果 范围 [0, 1] |
| q | ${int}q | 图片质量百分比 | 仅限webp/jpeg/avif |
| c | ${int}c | 裁切图片(如果宽高允许) | 0: 不裁切但会修改图片, 1: 上传时的预设规则(若无则右下), 2: 左上, 3: 右上 |
| f | ${int}f | 作用尚不明确 | [0, 1]: 不改变图片, 2: 会改变图片 |
| progressive | progressive | 图片编码方式 | 仅限 jpeg(无: baseline, 有: progressive)/png(无:non-interlaced, 有: interlaced) |
| ! | !${str} | 加载来源 | web-home-carousel-cover, header, web-dynamic, web-avatar-space-header, ... |
| . | .${str} | 图片格式 | 仅限 png/jpeg/webp/avif/[avg_color](#avg_color格式说明) |
**示例:** **示例:**
<details>
<summary>查看示例:</summary>
原始图片 原始图片
https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg
@ -43,6 +58,7 @@ https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@1q
![](https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@1q.webp) ![](https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@1q.webp)
</details>
## avg_color格式说明 ## avg_color格式说明

View File

@ -1,8 +1,11 @@
`bili_ticket` 目前没发现多少风控价值,但是暂且在这里提供一份示例。 # BiliTicket
## 简述
`bili_ticket` 位于请求头 Cookie 中, 非必需, 但存在可降低风控概率
由 [@aynuarance](https://github.com/aynuarance) 于 [#903](https://github.com/SocialSisterYi/bilibili-API-collect/issues/903) 提供的思路,根据时间戳使用 `hmac_sha256` 算法计算 `hexsign` 由 [@aynuarance](https://github.com/aynuarance) 于 [#903](https://github.com/SocialSisterYi/bilibili-API-collect/issues/903) 提供的思路,根据时间戳使用 `hmac_sha256` 算法计算 `hexsign`
是 [JWT 令牌](https://jwt.io/),有效时长为 259260 秒,即 3 天。 是 [JWT 令牌](https://jwt.io/),有效时长为 259260 秒,即 3 天。
例如 `eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDI3NDI3NDYsImlhdCI6MTcwMjQ4MzQ4NiwicGx0IjotMX0.xQgtTAc41NA1gzvd9yKUPgucUy_DKcQj6OG1vj8V7ZA` 例如 `eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDI3NDI3NDYsImlhdCI6MTcwMjQ4MzQ4NiwicGx0IjotMX0.xQgtTAc41NA1gzvd9yKUPgucUy_DKcQj6OG1vj8V7ZA`
@ -14,7 +17,18 @@
} }
``` ```
# Python 示例 ## 算法
1. 获取 UNIX 秒级时间戳存入变量如 `timestamp`
2. 计算变量 `hexsign` 值,使用 `hmac_sha256` 算法,密钥为 `XgwSnGZ1p`,消息为字符串 `"ts"` 与变量 `timestamp` 值拼接
3. 构造请求参数,`key_id` 为 `ec02``hexsign` 为变量 `hexsign` 值,`context[ts]` 为变量 `timestamp` 值,`csrf` 为 cookie 中的 `bili_jct` 值也可为空
4. 发送 `POST` 请求,获取 `data` 字段中的 `ticket` 字段的值即为所求
## Demo
### Python
需要 `requests` 依赖
```python ```python
import hmac import hmac
@ -59,4 +73,106 @@ if __name__ == '__main__':
'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 Edg/120.0.0.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 Edg/120.0.0.0"
} }
resp = requests.post(url, params=params,headers=headers).json() resp = requests.post(url, params=params,headers=headers).json()
``` print(resp)
```
### Java
无需第三方依赖
```java
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class BiliTicketDemo {
/**
* Convert a byte array to a hex string.
*
* @param bytes The byte array to convert.
* @return The hex string representation of the given byte array.
*/
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}
/**
* Generate a HMAC-SHA256 hash of the given message string using the given key
* string.
*
* @param key The key string to use for the HMAC-SHA256 hash.
* @param message The message string to hash.
* @throws Exception If an error occurs during the HMAC-SHA256 hash generation.
* @return The HMAC-SHA256 hash of the given message string using the given key
* string.
*/
public static String hmacSha256(String key, String message) throws Exception {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
mac.init(secretKeySpec);
byte[] hash = mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
return bytesToHex(hash);
}
/**
* Get a Bilibili web ticket for the given CSRF token.
*
* @param csrf The CSRF token to use for the web ticket, can be {@code null} or
* empty.
* @return The Bilibili web ticket raw response for the given CSRF token.
* @throws Exception If an error occurs during the web ticket generation.
* @see https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/misc/sign/bili_ticket.md
*/
public static String getBiliTicket(String csrf) throws Exception {
// params
long ts = System.currentTimeMillis() / 1000;
String hexSign = hmacSha256("XgwSnGZ1p", "ts" + ts);
StringBuilder url = new StringBuilder(
"https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket");
url.append('?');
url.append("key_id=ec02").append('&');
url.append("hexsign=").append(hexSign).append('&');
url.append("context[ts]=").append(ts).append('&');
url.append("csrf=").append(csrf == null ? "" : csrf);
// request
HttpURLConnection conn = (HttpURLConnection) new URI(url.toString()).toURL().openConnection();
conn.setRequestMethod("POST");
conn.addRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0");
InputStream in = conn.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
return new String(out.toByteArray(), StandardCharsets.UTF_8);
}
/**
* Main method to test the BiliTicketDemo class.
*
* @param args The command line arguments (not used).
*/
public static void main(String[] args) {
try {
System.out.println(getBiliTicket("")); // use empty CSRF here
} catch (Exception e) {
e.printStackTrace();
}
}
}
```

View File

@ -700,8 +700,6 @@ public class WbiTest {
map.put("bar", "五一四"); map.put("bar", "五一四");
map.put("baz", 1919810); map.put("baz", 1919810);
map.put("wts", System.currentTimeMillis() / 1000); map.put("wts", System.currentTimeMillis() / 1000);
map.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
map.put("Referer", "https://www.bilibili.com/");
StringJoiner param = new StringJoiner("&"); StringJoiner param = new StringJoiner("&");
//排序 + 拼接字符串 //排序 + 拼接字符串
map.entrySet().stream() map.entrySet().stream()

View File

@ -2,7 +2,7 @@
## 获取当前时间戳 ## 获取当前时间戳
> https://api.bilibili.com/x/report/click/now > https://api.bilibili.com/x/report/click/now
> https://api.bilibili.com/x/click-interface/click/now > https://api.bilibili.com/x/click-interface/click/now
*请求方式GET* *请求方式GET*

View File

@ -1008,6 +1008,325 @@ curl -G 'http://space.bilibili.com/ajax/settings/getSettings' \
</details> </details>
#### 查询可用头图列表 (Web端)
> https://space.bilibili.com/ajax/topphoto/getlist
*请求方式: GET*
注: 带有转义
**URL参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ----------- | ------ | -------------------------- |
| mid | num | 目标用户mid | 必要 | 非负数, 即使该用户并不存在 |
**JSON回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ------------------------- | -------------------------------------- | ---- |
| status | bool | 成功: true<br />失败: false | |
| data | 成功: array<br/>失败: str | 成功: 信息本体<br />失败: "用户id错误" | |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ----------- | ------------------------------------ |
| id | num | 空间头图 ID | |
| product_name | str | 显示名称 | |
| price | num | 价格 | |
| coin_type | num | 支付类型? | |
| vip_free | num | 大会员免费 | |
| s_img | str | 小图 URI | 需要自行与 `i0.hdslb.com` 拼接成 URL |
| l_img | str | 大图 URI | 同 s_img |
| thumbnail_img | str | 空 | 并不存在的缩略图? |
| sort_num | num | 排序编号 | |
| is_disable | num | 已禁用 | 0: 未禁用 |
| expire | num | 过期时间? | UNIX 时间戳, 或 0 为永不过期 |
| had | num | 是否拥有? | 当 expire 不为 0 时 为 1, 否则为 0 |
**示例:**
查询`mid=1145141919810000000`的可用空间头图
```shell
curl -G "https://space.bilibili.com/ajax/topphoto/getlist" \
--data-urlencode "mid=1145141919810000000"
```
<details>
<summary>查看响应示例:</summary>
```json
{
"status": true,
"data": [
{
"id": 1,
"product_name": "bilibili春",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/768cc4fd97618cf589d23c2711a1d1a729f42235.png",
"l_img": "bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png",
"thumbnail_img": "",
"sort_num": 19,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 2,
"product_name": "两人单车",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/d60a4be11f1bca6168a60a53c64bca18eddd6443.jpg",
"l_img": "bfs/space/44873d3568bdcb3d850d234e02a19602972450f1.png",
"thumbnail_img": "",
"sort_num": 16,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 5,
"product_name": "成为偶像",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/5fe2632486a5a91a234f0e7cb368ab6397477da4.jpg",
"l_img": "bfs/space/87277d30cd19edcec9db466a9a3e556aeb0bc0ed.png",
"thumbnail_img": "",
"sort_num": 15,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 11,
"product_name": "星际勘探",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/6849abc6e67000ad807b35a970aba31dd1e400dd.jpg",
"l_img": "bfs/space/c919a9818172a8297f8b0597722f96504a1e1d88.png",
"thumbnail_img": "",
"sort_num": 14,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 10,
"product_name": "星O大战",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/ff3b0882e55c1099738e59616e5956ad357d9948.jpg",
"l_img": "bfs/space/e22f5b8e06ea3ee4de9e4da702ce8ef9a2958f5a.png",
"thumbnail_img": "",
"sort_num": 13,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 12,
"product_name": "王牌特工",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/f5d38e2af44fd12fa65423aff55933fcf9071419.jpg",
"l_img": "bfs/space/8cd85a382756ab938df23a856017abccd187188e.png",
"thumbnail_img": "",
"sort_num": 12,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 3,
"product_name": "仰望星空",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/c9dae917e24b4fc17c4d544caf6b6c0b17f8692b.jpg",
"l_img": "bfs/space/9ccc0447aebf0656809b339b41aa5b3705f27c47.png",
"thumbnail_img": "",
"sort_num": 11,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 14,
"product_name": "雨过天晴",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/1115b2fdabd128337f892feada4ce32e51f3a5ad.jpg",
"l_img": "bfs/space/6a1198e25f8764bd30d53411dac9fdf840bc3265.png",
"thumbnail_img": "",
"sort_num": 10,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 6,
"product_name": "绿荫秘境",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/dc02d22a718c1c436f1a355b3cd726b04098ef7d.jpg",
"l_img": "bfs/space/265ecddc52d74e624dc38cf0cff13317085aedf7.png",
"thumbnail_img": "",
"sort_num": 9,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 13,
"product_name": "漫游仙境",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/184abe52a5ea9390b506c064cfba4f8f20ae9cca.jpg",
"l_img": "bfs/space/24d0815514951bb108fbb360b04a969441079315.png",
"thumbnail_img": "",
"sort_num": 7,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 15,
"product_name": "放课后time",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/aea2dd7b8894ce31d578d4fad6a7188c7b49cb2f.jpg",
"l_img": "bfs/space/6e799ff2de2de55d27796707a283068d66cdf3f4.png",
"thumbnail_img": "",
"sort_num": 6,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 4,
"product_name": "昴宿星团",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/1f4eaf70d1bb981f6057b3e440249d7a1f65774f.jpg",
"l_img": "bfs/space/3ab888c1d149e864ab44802dea8c1443e940fa0d.png",
"thumbnail_img": "",
"sort_num": 5,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 7,
"product_name": "蔷薇洛丽塔",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/718eac8c71e29b8a80431c46110805c3a40e30a6.jpg",
"l_img": "bfs/space/70ce28bcbcb4b7d0b4f644b6f082d63a702653c1.png",
"thumbnail_img": "",
"sort_num": 4,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 9,
"product_name": "黑暗之门",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/ef1b08e62fdc35b06e39795bc6de8e510935bf97.jpg",
"l_img": "bfs/space/cd52d4ac1d336c940cc4958120170f7928d9e606.png",
"thumbnail_img": "",
"sort_num": 3,
"is_disable": 0,
"expire": 0,
"had": 0
},
{
"id": 19,
"product_name": "你的名字",
"price": 0,
"coin_type": 0,
"vip_free": 0,
"s_img": "bfs/space/373e127e8784d3e4c1b5e6db0c27702ba077643f.jpg",
"l_img": "bfs/space/f49642b3683a08e3190f29d5a095386451f8952c.jpg",
"thumbnail_img": "",
"sort_num": 2,
"is_disable": 0,
"expire": 0,
"had": 0
}
]
}
```
</details>
### 设置空间头图 (Web端)
> https://space.bilibili.com/ajax/settings/setToutu
*请求方式: POST*
认证方式: Cookie (SESSDATA)
鉴权方式: referer为 `.bilibili.com` 域名下
**正文参数(application/x-www-form-urlencoded):**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------------------------------- | ------ | ---- |
| id | num | 头图 ID | 必要 | |
| csrf | str | CSRF Token (即 Cookie bili_jct 值) | 不必要 | |
**JSON回复:**
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | --------------------------- |
| status | bool | 状态 | true: 成功<br />false: 失败 |
| data | str | 错误信息 | 正确时无此项 (带有转义) |
**示例:**
设置空间头图为为`王牌特工(id=12)`
```shell
curl -X POST "https://space.bilibili.com/ajax/settings/setToutu" \
--referer "https://space.bilibili.com/" \
--data-urlencode "id=12" \
--data-urlencode "csrf=xxx" \
-b "SESSDATA=xxx; bili_jct=xxx"
```
<details>
<summary>查看响应示例:</summary>
```json
{
"status": true
}
```
</details>
#### 调整空间板块布局 #### 调整空间板块布局
> http://space.bilibili.com/ajax/settings/setIndexOrder > http://space.bilibili.com/ajax/settings/setIndexOrder
@ -1034,7 +1353,7 @@ curl -G 'http://space.bilibili.com/ajax/settings/getSettings' \
| 3 | (左侧)订阅番剧 | | 3 | (左侧)订阅番剧 |
| 4 | (左侧)订阅标签 | | 4 | (左侧)订阅标签 |
| 5 | (左侧)最近投币的视频 | | 5 | (左侧)最近投币的视频 |
| 6 | (左侧)我的圈子**(此板块被隐藏)** | | 6 | (左侧)我的圈子 **(此板块被隐藏)** |
| 7 | (左侧)我的频道 | | 7 | (左侧)我的频道 |
| 8 | (左侧)我的专栏 | | 8 | (左侧)我的专栏 |
| 9 | (左侧)我的相簿 | | 9 | (左侧)我的相簿 |
@ -1050,24 +1369,26 @@ curl -G 'http://space.bilibili.com/ajax/settings/getSettings' \
| 字段 | 类型 | 内容 | 备注 | | 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | ----------------------------------- | | ------ | ---- | -------- | ----------------------------------- |
| ststus | bool | 操作结果 | true操作成功<br />false操作失败 | | status | bool | 操作结果 | true操作成功<br />false操作失败 |
| data | str | 错误信息 | 正确时无此项 | | data | str | 错误信息 | 正确时无此项 |
**示例:** **示例:**
调整空间布局为: 调整空间布局为:
>我的稿件 直播间 ```text
>我的专栏 个人资料 我的稿件 直播间
>订阅番剧 公告 我的专栏 个人资料
>我的收藏夹 官方活动 订阅番剧 公告
>我的相簿 最近玩的游戏 我的收藏夹 官方活动
>最近投币的视频 我的相簿 最近玩的游戏
>订阅标签 最近投币的视频
>我的频道 订阅标签
我的频道
```
```shell ```shell
curl 'http://space.bilibili.com/ajax/settings/setIndexOrder' \ curl 'https://space.bilibili.com/ajax/settings/setIndexOrder' \
--data-urlencode 'index_order=1,8,3,2,9,5,4,7,22,23,21,24,25,6' \ --data-urlencode 'index_order=1,8,3,2,9,5,4,7,22,23,21,24,25,6' \
--data-urlencode 'csrf=xxx' \ --data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' \ -b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' \
@ -1113,7 +1434,7 @@ curl 'http://space.bilibili.com/ajax/settings/setIndexOrder' \
| 字段 | 类型 | 内容 | 备注 | | 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | ----------------------------------- | | ------ | ---- | -------- | ----------------------------------- |
| ststus | bool | 操作结果 | true操作成功<br />false操作失败 | | status | bool | 操作结果 | true操作成功<br />false操作失败 |
| data | str | 错误信息 | 正确时无此项 | | data | str | 错误信息 | 正确时无此项 |
**示例:** **示例:**
@ -1121,7 +1442,7 @@ curl 'http://space.bilibili.com/ajax/settings/setIndexOrder' \
设置`关注的TAG`为隐藏 设置`关注的TAG`为隐藏
```shell ```shell
curl 'http://space.bilibili.com/ajax/settings/setPrivacy' \ curl 'https://space.bilibili.com/ajax/settings/setPrivacy' \
--data-urlencode 'tags=0' \ --data-urlencode 'tags=0' \
--data-urlencode 'csrf=xxx' \ --data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' \ -b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' \
@ -4298,7 +4619,7 @@ curl -G 'https://api.bilibili.com/x/space/bangumi/follow/list' \
| 字段 | 类型 | 内容 | 备注 | | 字段 | 类型 | 内容 | 备注 |
| ------ | ---------------------------- | -------------------------------------- | --------------------------- | | ------ | ---------------------------- | -------------------------------------- | --------------------------- |
| ststus | bool | 返回值 | false错误<br />true正确 | | status | bool | 返回值 | false错误<br />true正确 |
| data | 错误时str<br />正确时obj | 错误时:错误信息<br />正确时:数据本体 | 正确时不返回错误信息 | | data | 错误时str<br />正确时obj | 错误时:错误信息<br />正确时:数据本体 | 正确时不返回错误信息 |
`data`对象: `data`对象:

View File

@ -460,7 +460,7 @@ curl -G 'https://api.bilibili.com/x/web-interface/archive/coins' \
> https://api.bilibili.com/medialist/gateway/coll/resource/deal > https://api.bilibili.com/medialist/gateway/coll/resource/deal
> >
> https://api.bilibili.com/x/v3/fav/resource/deal > https://api.bilibili.com/x/v3/fav/resource/deal
*请求方式POST* *请求方式POST*
@ -485,7 +485,7 @@ curl -G 'https://api.bilibili.com/x/web-interface/archive/coins' \
| 字段 | 类型 | 内容 | 备注 | | 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />-403访问权限不足<br />10003不存在该稿件<br />11201已经收藏过了<br />11202已经取消收藏了<br />11203达到收藏上限<br />72010017参数错误 | | code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />-403访问权限不足<br />10003不存在该稿件<br />11010: 您访问的内容不存在<br />11201已经收藏过了<br />11202已经取消收藏了<br />11203达到收藏上限<br />72010017参数错误 |
| message | str | 错误信息 | 正确为success | | message | str | 错误信息 | 正确为success |
| data | obj | 信息本体 | | | data | obj | 信息本体 | |

View File

@ -1,9 +1,5 @@
# 分区最新视频 # 分区最新视频
- [获取分区最新视频列表](#获取分区最新视频列表)
---
## 获取分区最新视频列表 ## 获取分区最新视频列表
> https://api.bilibili.com/x/web-interface/dynamic/region > https://api.bilibili.com/x/web-interface/dynamic/region
@ -15,7 +11,7 @@
| 参数名 | 类型 | 内容 | 必要性 | 备注 | | 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ----------- | ------ | ------- | | ------ | ---- | ----------- | ------ | ------- |
| pn | num | 页码 | 非必要 | 默认为1 | | pn | num | 页码 | 非必要 | 默认为1 |
| ps | num | 每页项数 | 非必要 | 默认为5 | | ps | num | 每页项数 | 非必要 | 默认为14, 留空为5 |
| rid | num | 目标分区tid | 必要 | | | rid | num | 目标分区tid | 必要 | |
**json回复** **json回复**
@ -197,3 +193,445 @@ curl -G 'https://api.bilibili.com/x/web-interface/dynamic/region' \
``` ```
</details> </details>
### 获取分区标签近期互动列表
> https://api.bilibili.com/x/web-interface/dynamic/tag
*请求方式: GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------- | ------ | ----------------- |
| ps | num | 视频数 | 非必要 | 默认为14, 留空为5 |
| pn | num | 列数 | 非必要 | 留空为1 |
| rid | num | 目标分区id | 必要 | 参见[视频分区一览](../video/video_zone.md) |
| tag_id | num | 目标标签id | 必要 | |
**json回复:**
与[获取分区最新视频列表](#获取分区最新视频列表)相同, 略
**示例:**
获取`tid=136(游戏->音游)`分区中`tag_id=10026108(Phigros)`标签近期互动列表的2条视频信息
```shell
curl -G 'https://api.bilibili.com/x/web-interface/dynamic/tag' \
--data-urlencode 'rid=136' \
--data-urlencode 'tag_id=10026108' \
--data-urlencode 'ps=2' \
--data-urlencode 'pn=1'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"page": {
"num": 1,
"size": 2,
"count": 152
},
"archives": [
{
"aid": 1452657587,
"videos": 1,
"tid": 136,
"tname": "音游",
"copyright": 1,
"pic": "http://i1.hdslb.com/bfs/archive/4cb13f97e0d4b43645728432468e44b40ad343de.jpg",
"title": "【MuseDash x Phigros/逆天愚人节谱面】Retribution ~Cycle of Redemption~ Lv.? AP",
"pubdate": 1712310000,
"ctime": 1712302810,
"desc": "谱师Mayflycmd@命令提示符 ",
"state": 0,
"duration": 189,
"rights": {
"bp": 0,
"elec": 0,
"download": 0,
"movie": 0,
"pay": 0,
"hd5": 0,
"no_reprint": 1,
"autoplay": 1,
"ugc_pay": 0,
"is_cooperation": 0,
"ugc_pay_preview": 0,
"no_background": 0,
"arc_pay": 0,
"pay_free_watch": 0
},
"owner": {
"mid": 3493136175204754,
"name": "TempoTiger",
"face": "https://i1.hdslb.com/bfs/face/0cf2722f9aaa0db94f9166a8084e347bca3580f4.jpg"
},
"stat": {
"aid": 1452657587,
"view": 27021,
"danmaku": 141,
"reply": 113,
"favorite": 306,
"coin": 144,
"share": 95,
"now_rank": 0,
"his_rank": 0,
"like": 1050,
"dislike": 0,
"vt": 0,
"vv": 27021
},
"dynamic": "",
"cid": 1494650111,
"dimension": {
"width": 1920,
"height": 1080,
"rotate": 0
},
"short_link_v2": "https://b23.tv/BV1Eq421w7T4",
"first_frame": "http://i0.hdslb.com/bfs/storyff/n240405sa2zsrp9x2i3erx1ln8icirs6_firsti.jpg",
"pub_location": "广东",
"cover43": "",
"bvid": "BV1Eq421w7T4",
"season_type": 0,
"is_ogv": false,
"ogv_info": null,
"rcmd_reason": "",
"enable_vt": 0,
"ai_rcmd": null
},
{
"aid": 1155789590,
"videos": 1,
"tid": 136,
"tname": "音游",
"copyright": 1,
"pic": "http://i1.hdslb.com/bfs/archive/c75674c8d104421d1794e69926d42ffa90e7d73d.jpg",
"title": "[Phigros 自制谱] 把一切都倾注进去吧!/ 雑踏、僕らの街 - TOGENASHI TOGEARI",
"pubdate": 1719687153,
"ctime": 1719687153,
"desc": "不是,你们怎么忍住把这键盘歌写这么简单的?\n不是你们怎么忍住把这键盘歌写这么简单的\n不是你们怎么忍住把这键盘歌写这么简单的\n\n应该是 Phigros 第一个写满三分钟的,虽然后面抄了很多重复配置,但无伤大雅(\n个人定数 16.6,其实就两段 5k 键盘难,看时间长多给了 0.1\n所以啊\n\n愤怒也好喜悦也好悲伤也好把一切都倾注进去\n怒りも喜びも哀しさも、全部ぶちこめ。\n\n-- 6.30 更新,修了一个特效的问题,改了一个很蹭的配置和一个很丑的排键",
"state": 0,
"duration": 201,
"mission_id": 1726375,
"rights": {
"bp": 0,
"elec": 0,
"download": 0,
"movie": 0,
"pay": 0,
"hd5": 0,
"no_reprint": 1,
"autoplay": 1,
"ugc_pay": 0,
"is_cooperation": 0,
"ugc_pay_preview": 0,
"no_background": 0,
"arc_pay": 0,
"pay_free_watch": 0
},
"owner": {
"mid": 341532844,
"name": "西宮缄",
"face": "https://i1.hdslb.com/bfs/face/1387108d9337c04c27ce2d8d75679e40540d4c14.jpg"
},
"stat": {
"aid": 1155789590,
"view": 39479,
"danmaku": 303,
"reply": 169,
"favorite": 1650,
"coin": 473,
"share": 653,
"now_rank": 0,
"his_rank": 0,
"like": 5843,
"dislike": 0,
"vt": 0,
"vv": 39479
},
"dynamic": "打这个比溜冰还爽",
"cid": 1600971084,
"dimension": {
"width": 2000,
"height": 1500,
"rotate": 0
},
"season_id": 3395535,
"short_link_v2": "https://b23.tv/BV1iZ421g7E8",
"first_frame": "http://i1.hdslb.com/bfs/storyff/n240630sa3chl8idnpz8d31t6yaczagn_firsti.jpg",
"pub_location": "天津",
"cover43": "",
"bvid": "BV1iZ421g7E8",
"season_type": 0,
"is_ogv": false,
"ogv_info": null,
"rcmd_reason": "",
"enable_vt": 0,
"ai_rcmd": null
}
]
}
}
```
</details>
### 获取分区近期投稿列表
> https://api.bilibili.com/x/web-interface/newlist
*请求方式: GET*
注: 该接口在 Web 端实际情况中被请求, 但似乎未在页面中显示, 作用尚不清楚
**URL参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------- | ------ | ----------------- |
| ps | num | 视频数 | 非必要 | 默认为14, 留空为5 |
| pn | num | 页码 | 非必要 | 默认为1 |
| rid | num | 目标分区id | 非必要 | 参见[视频分区一览](../video/video_zone.md) |
| type | num | 类型? | 非必要 | 默认为0 |
**JSON回复:**
与[获取分区最新视频列表](#获取分区最新视频列表)相同, 略
**示例:**
与[获取分区最新视频列表](#获取分区最新视频列表)相似, 略
### 获取分区近期投稿列表 (带排序)
> https://api.bilibili.com/x/web-interface/newlist_rank
*请求方式: GET*
**URL参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------- | ---- | --------- | ------ | ------- |
| main_ver | str | 主页版本 | 非必要 | 默认为 `v3` |
| search_type | str | 搜索类型 | 必要 | 默认为 `video` |
| view_type | str | 查看类型? | 必要 | 默认为 `hot_rank` |
| copy_right | num | 版权? | 非必要 | 默认为 `-1` |
| new_web_tag | num | 标签? | 非必要 | 默认为 `1` |
| order | str | 排序方式 | 非必要 | click: 按播放排序(默认)<br />scores: 按评论数排序<br />stow: 按收藏排序<br />coin: 按硬币数排序<br />dm: 按弹幕数排序|
| cate_id | num | 分区id | 必要 | 留空会导致响应中`data`中`result`为`null`, 参见[视频分区一览](../video/video_zone.md) |
| page | num | 页码 | 非必要 | 默认以 `1` 开始 |
| pagesize | num | 视频数 | 必要 | 默认为 `30`, 留空会导致 -500 |
| time_from | num | 起始时间 | 必要 | yyyyMMdd, 默认为 `time_to` - 7 |
| time_to | num | 结束时间 | 必要 | yyyyMMdd, 默认为当前时间(大于起始时间) |
**JSON回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----- |
| code | num | 返回值 | 0成功<br />-500: 未传pagesize<br />-10: 未传其余必要参数 |
| message | str | 错误信息 | 无为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | 错误为null |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------------- | ----- | ------------------ | ----- |
| exp_list | null | | 作用尚不明确 |
| show_module_list | array | 显示模块列表? | |
| result | array | 结果本体 | 失败时为null |
| show_column | num | 0 | 作用尚不明确 |
| rqt_type | str | search | 作用尚不明确 |
| numPages | num | 页码 | 失败时为0 |
| numResults | num | 视频数 | 失败时为0 |
| crr_query | str | 空 | 作用尚不明确 |
| pagesize | num | 视频数 | |
| suggest_keyword | num | 空 | 作用尚不明确 |
| egg_info | null | | 作用尚不明确 |
| cache | num | 0 | 作用尚不明确 |
| exp_bits | num | 1 | 作用尚不明确 |
| exp_str | str | 空 | 作用尚不明确 |
| seid | str | 一串字符串中的数字 | 作用尚不明确 |
| msg | str | 结果信息 | 成功时为`success`, 反之为`as error.` |
| egg_hit | num | 0 | 作用尚不明确 |
| page | num | 页码 | |
`data`中的`show_module_list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | str | tips | |
| 1 | str | brand_ad | |
| 2 | str | esports | |
| 3 | str | activity | |
| 4 | str | web_game | |
| 5 | str | card | |
| 6 | str | media_bangumi | |
| 7 | str | media_ft | |
| 8 | str | bili_user | |
| 9 | str | user | |
| 10 | str | star | |
| 11 | str | video | |
`data`中的`result`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | -------------- | ----- |
| pubdate | str | 发布时间 | 格式为 `yyyy-MM-dd HH:mm:ss` |
| pic | str | 封面图 | |
| tag | str | 标签 | 用 `,` 分隔 |
| duration | num | 时长 | 单位为秒 |
| id | num | aid | |
| rank_score | num | 排序分数? | |
| badgepay | bool | 是否有角标? | |
| senddate | num | 发送时间? | UNIX 秒级时间戳 |
| author | str | UP主名 | |
| review | num | 评论数 | |
| mid | num | UP主mid | |
| is_union_video | num | 是否为联合投稿 | |
| rank_index | num | 排序索引号 | |
| type | str | 类型 | video: 视频 |
| arcrank | str | 0 | 作用尚不明确 |
| play | str | 播放数 | |
| rank_offset | num | 排序偏移? | 与 `rank_index` 相同 |
| description | str | 简介 | |
| video_review | num | 弹幕数? | |
| is_pay | num | 是否付费? | 0: 免费<br />1: 付费 |
| favorites | num | 收藏数 | |
| arcurl | str | 视频播放页URL | |
| bvid | str | bvid | |
| title | str | 标题 | |
| vt | num | 0 | 作用尚不明确 |
| enable_vt | num | 0 | 作用尚不明确 |
| vt_display | str | 空 | 作用尚不明确 |
**示例:**
获取`tid=231(科技->计算机技术)`分区近期投稿列表, 按播放数排序, 页码为1, 视频数为2, 时间一周
```shell
curl -G 'https://api.bilibili.com/x/web-interface/newlist_rank' \
--data-urlencode 'search_type=video' \
--data-urlencode 'view_type=hot_rank' \
--data-urlencode 'order=click' \
--data-urlencode 'cate_id=231' \
--data-urlencode 'page=1' \
--data-urlencode 'pagesize=2' \
--data-urlencode 'time_from=20240716' \
--data-urlencode 'time_to=20240723'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"exp_list": null,
"show_module_list": [
"tips",
"brand_ad",
"esports",
"activity",
"web_game",
"card",
"media_bangumi",
"media_ft",
"bili_user",
"user",
"star",
"video"
],
"result": [
{
"pubdate": "2024-07-19 15:27:23",
"pic": "//i0.hdslb.com/bfs/archive/a6c2a8669e623333eee4bd8316b4e7b01716b7f2.jpg",
"tag": "微软,Microsoft",
"duration": 14,
"id": 1406270001,
"rank_score": 237205,
"badgepay": false,
"senddate": 1721410429,
"author": "柚子木字幕组",
"review": 928,
"mid": 221648,
"is_union_video": 0,
"rank_index": 1,
"type": "video",
"arcrank": "0",
"play": "237205",
"rank_offset": 1,
"description": "X",
"video_review": 42,
"is_pay": 0,
"favorites": 618,
"arcurl": "http://www.bilibili.com/video/av1406270001",
"bvid": "BV1gr421M7rE",
"title": "突发:微软服务中断正在影响全球用户",
"vt": 0,
"enable_vt": 0,
"vt_display": ""
},
{
"pubdate": "2024-07-17 22:12:47",
"pic": "//i0.hdslb.com/bfs/archive/1b02bc3806369f8c051a84e1ffef11b22695e659.jpg",
"tag": "演讲,大学,编程,英伟达,人工智能,TED,AI,黄仁勋",
"duration": 1908,
"id": 1556206286,
"rank_score": 52653,
"badgepay": false,
"senddate": 1721225567,
"author": "YouTube精选字幕组",
"review": 147,
"mid": 487511093,
"is_union_video": 0,
"rank_index": 2,
"type": "video",
"arcrank": "0",
"play": "52648",
"rank_offset": 2,
"description": "New SciTech\n上月加州理工学院毕业典礼上刚刚带领英伟达达成世界第一市值的CEO黄仁勋到场分享对当下AI革命趋势的见解、带领英伟达转型成AI公司的历程、以及自己在职场这么多年的人生感悟。\n\n全程没有上位者那种空洞无意义的说教都是真实的发展故事和对未来世界的看法。如果你的工作生活中有涉及到AI技术的可能那么这期演讲将会非常有意义。",
"video_review": 16,
"is_pay": 0,
"favorites": 2152,
"arcurl": "http://www.bilibili.com/video/av1556206286",
"bvid": "BV1C1421b7dD",
"title": "“这个时代要跑,不要走”黄仁勋加州理工毕业演讲完整版",
"vt": 0,
"enable_vt": 0,
"vt_display": ""
}
],
"show_column": 0,
"rqt_type": "search",
"numPages": 404,
"numResults": 808,
"crr_query": "",
"pagesize": 2,
"suggest_keyword": "",
"egg_info": null,
"cache": 0,
"exp_bits": 1,
"exp_str": "",
"seid": "6717218533109517809",
"msg": "success",
"egg_hit": 0,
"page": 1
}
}
```
</details>