🚀调整项目结构

This commit is contained in:
SocialSisterYi
2023-02-22 01:00:06 +08:00
parent b85e835ce7
commit 7d89ece2ac
201 changed files with 84964 additions and 0 deletions

572
docs/APP_widget/splash.md Normal file
View File

@@ -0,0 +1,572 @@
# APP端开屏图片
- [获取APP端开屏图片列表](#获取APP端开屏图片列表)
- [获取APP端开屏幕广告信息](#获取APP端开屏幕广告信息)
---
## 获取APP端开屏图片列表
> https://app.bilibili.com/x/v2/splash/brand/list
*请求方式GET*
鉴权方式APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|--------|-----|-------|---------|-----|
| appkey | str | APP密钥 | APP方式必要 | |
| ts | num | 当前时间戳 | APP方式必要 | |
| sign | str | APP签名 | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|---------------------------------------|
| code | num | 返回值 | 0成功<br />-3API校验密匙错误<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|---------------|-------|--------|--------|
| pull_interval | num | 1800 | 作用尚不明确 |
| forcibly | bool | false | 作用尚不明确 |
| rule | str | order | 作用尚不明确 |
| list | array | 开屏图片列表 | |
| show | array | 默认显示项 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|-----------|-----|
| 0 | obj | 开屏图片1 | |
| n | obj | 开屏图片(n+1) | |
| …… | obj | …… | …… |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
|----------|-----|---------------------|-----|
| id | num | 开屏图片id | |
| thumb | str | 开屏图片url | |
| logo_url | str | “bilibili”logo图片url | |
`data`中的`show`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|-------|-----|
| 0 | obj | 套了个娃? | |
`show`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
|-------------|-----|--------|--------|
| id | num | 开屏图片id | |
| begin_time | num | 起始时间? | 时间戳 |
| end_time | num | 结束时间? | 时间戳 |
| probability | num | 0 | 作用尚不明确 |
| duration | num | 显示时间? | 单位为毫秒 |
**示例:**
```shell
curl -G 'https://app.bilibili.com/x/v2/splash/brand/list' \
--data-urlencode 'appkey=1d8b6e7d45233436' \
--data-urlencode 'ts=0' \
--data-urlencode 'sign=78a89e153cd6231a4a4d55013aa063ce'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"pull_interval": 1800,
"forcibly": false,
"rule": "order",
"list": [
{
"id": 10,
"thumb": "http://i0.hdslb.com/bfs/archive/e2d2f57e08b511d1a47203859f7bddb4ef9d4e16.png",
"logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png"
},
{
"id": 11,
"thumb": "http://i0.hdslb.com/bfs/archive/fe737da5cdedf9dad038e5fd30e957be8a063bc2.png",
"logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png"
},
{
"id": 12,
"thumb": "http://i0.hdslb.com/bfs/archive/574469a4a20f41ba4dc9ecd41d15f94eea875ed9.png",
"logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png"
},
{
"id": 13,
"thumb": "http://i0.hdslb.com/bfs/archive/af0f4f611faa34340bd4f91def1973ccbfb8fbb3.png",
"logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png"
},
{
"id": 14,
"thumb": "http://i0.hdslb.com/bfs/archive/1d40e975b09d5c87b11b3ae0c9ce6c6b82f63d9e.png",
"logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png"
}
],
"show": [
{
"id": 12,
"begin_time": 1597564800,
"end_time": 1630753108,
"probability": 0,
"duration": 700
}
]
}
}
```
</details>
如id=11的图片为
![]( https://i0.hdslb.com/bfs/archive/fe737da5cdedf9dad038e5fd30e957be8a063bc2.png )
## 获取APP端开屏幕广告信息
> https://app.bilibili.com/x/v2/splash/list
*请求方式: GET*
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|----------|-----|-----------------------|-----|-----|
| build | int | 客户端内部版本号 | 必要 | |
| mobi_app | str | android, iphone, ipad | 必要 | |
| platform | str | android, ios | 必要 | |
| height | int | 屏幕高度 | 必要 | |
| width | int | 屏幕宽度 | 必要 | |
| birth | str | 生日日期(四位数,例 0101) | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|---------------------------------------|
| code | num | 返回值 | 0成功<br />-3API校验密匙错误<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|-------------------|--------|---------------------|---------|
| splash_request_id | 当前请求id | 长度为33, 前13位是当前秒级时间戳 | |
| max_time | int | 最长显示时间? | |
| min_interval | int | 最少显示时间? | 千分之一秒单位 |
| pull_interval | int | 显示时间? | |
| keep_ids | int | 显示时间? | |
| list | list | 广告 list | |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
|----------------------------|-------|---------------|--------|
| id | int | 广告id | |
| type | int | 1 | |
| card_type | int | 39 | |
| duration | int | 持续时间? | |
| begin_time | int | 开始展示时间 | 秒级时间戳 |
| end_time | int | 停止展示时间 | 毫秒级时间戳 |
| thumb | url | 广告图片 | |
| hash | str | 作用尚不明确 | |
| logo_url | str | 空值 | |
| logo_hash | str | 空值 | |
| skip | int | 是否跳转? | |
| uri | str | 跳转的url | |
| video_url | str | 视频url | |
| video_hash | str | 视频hash | |
| video_width | num | 视频宽度 | |
| video_height | num | 视频高度 | |
| uri_title | str | 空值 | |
| source | int | 929 | |
| cm_mark | int | 1 | |
| ad_cb | str | 作用尚不明确 | |
| resource_id | int | 926 | |
| request_id | str | 作用尚不明确 | |
| client_ip | str | 客户端IP | |
| is_ad | bool | 作用尚不明确 | |
| is_ad_loc | bool | 作用尚不明确 | |
| schema_title | str | 滑动进入第三方应用 | |
| schema_callup_white_list | array | 跳转的 APP 的白名单 | |
| extra | obj | 显示信息? | |
| enable_pre_download | bool | 是否可以当场下载 APP? | |
| enable_background_download | bool | 是否可以静默下载 APP? | |
| interact_type | int | 是否可以跳转(互动) | |
| interact_url | str | 跳转(互动) url | |
| interact_distance | int | 作用尚不明确 | |
| guide_button_list | array | 所有的按钮 | |
| mark_with_skip_style | num | 作用尚不明确 | |
| skip_button_height | num | 作用尚不明确 | |
`extra`对象:
| 字段 | 类型 | 内容 | 备注 |
|----------------------------|-------|-----|-----|
| use_ad_web_v2 | bool | | |
| show_urls | array | | |
| click_urls | array | | |
| show_1s_urls | array | | |
| download_whitelist | array | | |
| open_whitelist | array | | |
| card | obj | | |
| report_time | num | | |
| sales_type | num | | |
| special_industry | bool | | |
| preload_landingpage | num | | |
| share_info | obj | | |
| upzone_entrance_type | num | | |
| upzone_entrance_report_id | num | | |
| topview_pic_url | str | | |
| topview_video_url | str | | |
| click_area | num | | |
| shop_id | num | | |
| up_mid | num | | |
| track_id | str | | |
| enable_store_direct_launch | int | | |
| enable_double_jump | bool | | |
| store_callup_card | bool | | |
| enable_h5_alert | bool | | |
| special_industry_style | num | | |
| macro_replace_priority | num | | |
| feedback_panel_style | num | | |
| ad_content_type | num | | |
| enable_h5_pre_load | num | | |
| hot_activity_id | num | | |
| product_id | num | | |
| landingpage_download_style | num | | |
`guide_button_list` 中的对象:
| 字段 | 类型 | 内容 | 备注 |
|------------------------------|-------|-----|-------|
| id | int | | |
| x | int | | |
| y | int | | |
| bg_color | str | | |
| bg_color_night | str | | |
| text_color | str | | |
| text_color_night | str | | |
| guide_instructions | str | | |
| guide_instructions_new | str | 空值 | |
| width | str | | |
| jump_url | str | | |
| schema_package_name | str | | |
| schema_title | str | | |
| schema_title_new | str | 空值 | |
| height | str | | |
| slide_threshold_value | str | | |
| slide_border_color | str | | |
| guide_image_url | str | | |
| guide_image_md5 | str | | |
| interact_style | str | | |
| jump_image_url | str | | |
| jump_image_md5 | str | | |
| schema_image_url | str | | |
| schema_image_md5 | str | | |
| click_expand_ratio | str | | |
| logo_image_url | str | | |
| logo_image_md5 | str | | |
| related_ids | array | 空 | |
| schema_list | array | 空 | |
| font_ratio | num | | |
| seq | num | | |
| degrade_type | num | | |
| twist_angle | num | | |
| twist_speed | num | | |
| secondary_guide_instructions | str | | |
| secondary_font_ratio | num | | |
| secondary_text_color | str | | |
| secondary_text_color_night | str | | |
| activity_time | num | | 秒级时间戳 |
| time_show_type | num | | |
**示例:**
```shell
curl -X GET 'https://app.bilibili.com/x/v2/splash/list' \
--data-urlencode 'build=999999999' \
--data-urlencode 'mobi_app=android' \
--data-urlencode 'platform=android' \
--data-urlencode 'height=1920' \
--data-urlencode 'width=1080' \
--data-urlencode 'birth=0101'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"max_time": 4,
"min_interval": 14400,
"pull_interval": 900,
"keep_ids": null,
"list": [
{
"id": 9460,
"type": 1,
"card_type": 39,
"duration": 5,
"begin_time": 1663689600,
"end_time": 1663775999,
"thumb": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/cb001c291c6011940e29531dcce6b1e8.webp",
"hash": "712d3df973f99fdcd30c2419d19630dc",
"logo_url": "",
"logo_hash": "",
"skip": 1,
"uri": "https://market.m.taobao.com/app/mwdk-industry/mwdk-shopping-base/pages/peppa.html?disableNav=YES&merchantCode=HM&pageId=105240&path=%2Fact%2Frax%2Fmanual1455861656935693595&renderChannelCode=HM&siteCode=HM_8_7dd8299642994fa196f9a9aae4fd4391_3&spma=a225z&usePayment=alipayMiniApp&utm_campaign=dwlx&utm_source=1234&targetShopId=199273419",
"video_url": "http://upos-sz-static.bilivideo.com/ssaxcode/89/jl/n220831a21uql976d44zun4y0ykmjl89-1-SPLASH.mp4",
"video_hash": "ae10333c160452cc2755d079db10b597",
"video_width": 1080,
"video_height": 1920,
"uri_title": "",
"source": 929,
"cm_mark": 1,
"ad_cb": "COfrARC7jxUY9EkgADDWwCE4oQdCIDE2NjM2NDY2MzY1ODhxMTcyYTI2YTE5MmE5NnE1NDE0SKy0xMi1MFIG5aSp5rSlaP///////////wFw////////////AYABS4gB5+sBsgEg8mQFw0bBxGOGYE8OBhMOd3DE8OGFZXhookrFX4s3UrrwAruPFdgD9Ek=",
"resource_id": 926,
"request_id": "1663646636588q172a26a192a96q5414",
"client_ip": "117.14.146.37",
"is_ad": true,
"is_ad_loc": true,
"schema_title": "滑动进入第三方应用",
"schema_callup_white_list": [
"tmall",
"taobao",
"openapp.jdmobile",
"weixin",
"alipays",
"tbopen",
"eleme",
"qqmusic",
"pddopen",
"upwallet",
"yocial://plaza/?tab=0",
"hiapplink",
"meiju",
"midea-meiju",
"uclink",
"qklink",
"taobaolite",
"lazyaudio",
"meituanwaimai",
"baiduboxapp://",
"baiduboxapp",
"fleamarket",
"dewuapp",
"duappmoblink",
"cmblife",
"imeituan",
"vmall",
"music",
"pinduoduo"
],
"extra": {
"use_ad_web_v2": true,
"show_urls": [
"https://g.cn.miaozhen.com/x/k=2315612&p=8EUuC&dx=__IPDX__&rt=2&pro=s&ns=__IP__&ni=__IESID__&v=__LOC__&xa=__ADPLATFORM__&tr=__REQUESTID__&vg=__AUTOPLAY__&nh=__AUTOREFRESH__&mo=__OS__&m0=__OPENUDID__&m0a=__DUID__&m1=__ANDROIDID1__&m1a=__ANDROIDID__&m2=__IMEI__&m4=__AAID__&m5=__IDFA__&m6=__MAC1__&m6a=__MAC__&m11=__OAID__&m14=__CAID__&m5a=__IDFV__&mn=__ANAME__&m5b=__IDFA1__&m11a=__OAID1__&m14a=__CAID1__&o="
],
"click_urls": [
"https://e.cn.miaozhen.com/r/k=2315612&p=8EUuC&dx=__IPDX__&rt=2&pro=s&ns=__IP__&ni=__IESID__&v=__LOC__&xa=__ADPLATFORM__&tr=__REQUESTID__&mo=__OS__&m0=__OPENUDID__&m0a=__DUID__&m1=__ANDROIDID1__&m1a=__ANDROIDID__&m2=__IMEI__&m4=__AAID__&m5=__IDFA__&m6=__MAC1__&m6a=__MAC__&m11=__OAID__&m14=__CAID__&m5a=__IDFV__&mn=__ANAME__&m5b=__IDFA1__&m11a=__OAID1__&m14a=__CAID1__&o="
],
"show_1s_urls": [],
"download_whitelist": [],
"open_whitelist": [
"tmall",
"taobao",
"openapp.jdmobile",
"weixin",
"alipays",
"tbopen",
"eleme",
"qqmusic",
"pddopen",
"upwallet",
"yocial://plaza/?tab=0",
"hiapplink",
"meiju",
"midea-meiju",
"uclink",
"qklink",
"taobaolite",
"lazyaudio",
"meituanwaimai",
"baiduboxapp://",
"baiduboxapp",
"fleamarket",
"dewuapp",
"duappmoblink",
"cmblife",
"imeituan",
"vmall",
"music",
"pinduoduo"
],
"card": {
"card_type": 0,
"extreme_team_status": false,
"support_transition": false,
"under_player_interaction_style": 0,
"grade_denominator": 0,
"star_level": 0,
"live_booking_population_threshold": 0,
"ori_mark_hidden": 0,
"use_multi_cover": false,
"fold_time": 0,
"live_room_popularity": 0,
"live_tag_show": false,
"grade_level": 0
},
"report_time": 0,
"sales_type": 75,
"special_industry": false,
"preload_landingpage": 0,
"share_info": {},
"upzone_entrance_type": 0,
"upzone_entrance_report_id": 0,
"topview_pic_url": "",
"topview_video_url": "",
"click_area": 0,
"shop_id": 0,
"up_mid": 0,
"track_id": "pbaes.Y5ATuPVlG6ysPF6cvl6W8B-BYexhSJzrKH3NYfC3KIHDb9W5cxPA4_FTEPWYDED5DjfRwb3tcrLppYAqQ87SSg==",
"enable_store_direct_launch": 0,
"enable_double_jump": false,
"store_callup_card": false,
"enable_h5_alert": false,
"special_industry_style": 0,
"macro_replace_priority": 1,
"feedback_panel_style": 0,
"ad_content_type": 0,
"enable_h5_pre_load": 0,
"hot_activity_id": 0,
"product_id": 0,
"landingpage_download_style": 2
},
"enable_pre_download": true,
"enable_background_download": true,
"interact_type": 1,
"interact_url": "https://market.m.taobao.com/app/mwdk-industry/mwdk-shopping-base/pages/peppa.html?disableNav=YES&merchantCode=HM&pageId=105240&path=%2Fact%2Frax%2Fmanual1455861656935693595&renderChannelCode=HM&siteCode=HM_8_7dd8299642994fa196f9a9aae4fd4391_3&spma=a225z&usePayment=alipayMiniApp&utm_campaign=dwlx&utm_source=1234&targetShopId=199273419",
"interact_distance": 60,
"guide_button_list": [
{
"id": 49037,
"x": 50,
"y": 78,
"bg_color": "#80000000",
"bg_color_night": "#80000000",
"text_color": "#FFFFFFFF",
"text_color_night": "#FFFFFFFF",
"guide_instructions": "点击进入活动页",
"guide_instructions_new": "",
"width": 70,
"jump_url": "https://market.m.taobao.com/app/mwdk-industry/mwdk-shopping-base/pages/peppa.html?disableNav=YES&merchantCode=HM&pageId=105240&path=%2Fact%2Frax%2Fmanual1455861656935693595&renderChannelCode=HM&siteCode=HM_8_7dd8299642994fa196f9a9aae4fd4391_3&spma=a225z&usePayment=alipayMiniApp&utm_campaign=dwlx&utm_source=1234&targetShopId=199273419",
"schema_package_name": "",
"schema_title": "",
"schema_title_new": "",
"height": 7,
"slide_threshold_value": 5,
"slide_border_color": "#40FFFFFF",
"guide_image_url": "",
"guide_image_md5": "",
"interact_style": 6,
"jump_image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/f61a66cf54bc71d9bd1b81bde79c0140.json",
"jump_image_md5": "26d8b4b516f83a3f9b15fef643464cc6",
"schema_image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/f61a66cf54bc71d9bd1b81bde79c0140.json",
"schema_image_md5": "26d8b4b516f83a3f9b15fef643464cc6",
"click_expand_ratio": 100,
"logo_image_url": "https://i0.hdslb.com/bfs/sycp/mgk/img/202106/17006d50ec506813727b1cb5c6fc58b1.png",
"logo_image_md5": "86bc1b68ce4708d918cd4e01a975ca17",
"related_ids": [],
"schema_list": [],
"font_ratio": 0.23,
"seq": 0,
"degrade_type": 1,
"twist_angle": 0,
"twist_speed": -1,
"secondary_guide_instructions": "",
"secondary_font_ratio": 0,
"secondary_text_color": "",
"secondary_text_color_night": "",
"activity_time": 1662532059,
"time_show_type": 0
},
{
"id": 49040,
"x": 50,
"y": 83,
"bg_color": "#80000000",
"bg_color_night": "#80000000",
"text_color": "#FFFFFFFF",
"text_color_night": "#FFFFFFFF",
"guide_instructions": "即可前往 开吃新品",
"guide_instructions_new": "",
"width": 64,
"jump_url": "https://market.m.taobao.com/app/mwdk-industry/mwdk-shopping-base/pages/peppa.html?disableNav=YES&merchantCode=HM&pageId=105240&path=%2Fact%2Frax%2Fmanual1455861656935693595&renderChannelCode=HM&siteCode=HM_8_7dd8299642994fa196f9a9aae4fd4391_3&spma=a225z&usePayment=alipayMiniApp&utm_campaign=dwlx&utm_source=1234&targetShopId=199273419",
"schema_package_name": "",
"schema_title": "滑动进入第三方应用",
"schema_title_new": "",
"height": 3,
"slide_threshold_value": 5,
"slide_border_color": "#40FFFFFF",
"guide_image_url": "",
"guide_image_md5": "",
"interact_style": 3,
"jump_image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/f61a66cf54bc71d9bd1b81bde79c0140.json",
"jump_image_md5": "26d8b4b516f83a3f9b15fef643464cc6",
"schema_image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/f61a66cf54bc71d9bd1b81bde79c0140.json",
"schema_image_md5": "26d8b4b516f83a3f9b15fef643464cc6",
"click_expand_ratio": 100,
"logo_image_url": "https://i0.hdslb.com/bfs/sycp/mgk/img/202106/17006d50ec506813727b1cb5c6fc58b1.png",
"logo_image_md5": "86bc1b68ce4708d918cd4e01a975ca17",
"related_ids": [
49037
],
"schema_list": [],
"font_ratio": 0.23,
"seq": 99,
"degrade_type": 0,
"twist_angle": 0,
"twist_speed": -1,
"secondary_guide_instructions": "",
"secondary_font_ratio": 0,
"secondary_text_color": "",
"secondary_text_color_night": "",
"activity_time": 1662532059,
"time_show_type": 0
}
],
"mark_with_skip_style": 0,
"skip_button_height": 0.0557
}
],
"splash_request_id": "1663646636605q172a24a57a232q5796"
}
}
```
</details>

176
docs/album/action.md Normal file
View File

@@ -0,0 +1,176 @@
# 相簿操作
- [~~点赞相簿~~](#~~点赞相簿~~)
- [~~收藏相簿~~](#~~收藏相簿~~)
- [取消收藏相簿](#取消收藏相簿)
---
## ~~点赞相簿~~
> https://api.vc.bilibili.com/link_draw/v2/Vote/operate
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | ------ | ---------------------- |
| doc_id | num | 相簿id | 必要 | |
| type | num | 操作方式 | 必要 | 1点赞<br />2取消赞 |
| csrf_token | str | CSRF Token位于cookie | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />1参数错误<br />3未登录<br />110022已经操作过了 |
| msg | str | 错误信息 | 默认为success |
| message | str | 错误信息 | 默认为success |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---------------------- |
| type | num | 操作方式 | 1点赞<br />2取消赞 |
**示例:**
点赞相簿`id=99184721`
```shell
curl 'https://api.vc.bilibili.com/link_draw/v2/Vote/operate' \
--data-urlencode 'doc_id=99184721' \
--data-urlencode 'type=1' \
--data-urlencode 'csrf_token=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"message": "success",
"data": {
"type": 1
}
}
```
</details>
## ~~收藏相簿~~
> https://api.vc.bilibili.com/user_plus/v1/Fav/add
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | ------ | ------------ |
| fav_id | num | 相簿id | 必要 | |
| biz_type | num | 2 | 必要 | 作用尚不明确 |
| csrf_token | str | CSRF Token位于cookie | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-400参数错误<br />-500未登录<br />-507已收藏 |
| msg | str | 错误信息 | 默认为OK |
| message | str | 错误信息 | 默认为OK |
| data | array | 空 | |
**示例:**
收藏相簿`id=99184721`
```shell
curl 'https:///api.vc.bilibili.com/user_plus/v1/Fav/add' \
--data-urlencode 'fav_id=99184721' \
--data-urlencode 'biz_type=2' \
--data-urlencode 'csrf_token=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "OK",
"message": "OK",
"data": []
}
```
</details>
## 取消收藏相簿
> https://api.vc.bilibili.com/user_plus/v1/Fav/delete
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | ------ | ------------ |
| fav_id | num | 相簿id | 必要 | |
| biz_type | num | 2 | 必要 | 作用尚不明确 |
| csrf_token | str | CSRF Token位于cookie | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | --------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400参数错误<br />-500未登录 |
| msg | str | 错误信息 | 默认为OK |
| message | str | 错误信息 | 默认为OK |
| data | array | 空 | |
**示例:**
取消收藏相簿`id=99184721`
```shell
curl 'https://api.vc.bilibili.com/user_plus/v1/Fav/delete' \
--data-urlencode 'fav_id=99184721' \
--data-urlencode 'biz_type=2' \
--data-urlencode 'csrf_token=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "OK",
"message": "OK",
"data": []
}
```
</details>

152
docs/album/activity_list.md Normal file
View File

@@ -0,0 +1,152 @@
# 相簿活动列表
- [获取相簿热门活动列表](#获取相簿热门活动列表)
---
## 获取相簿热门活动列表
> https://api.vc.bilibili.com/photo_activity/v2/Activity/list
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | -------- | ------ | --------------------------------------------- |
| type | num | 活动类型 | 非必要 | 0全部<br/>1展示类<br/>2比赛类 |
| biz | num | 分区 | 非必要 | 0全部<br />1画友<br/>2摄影<br />默认为0 |
| page_num | num | 页码 | 非必要 | 默认为4 |
| page_size | num | 每页项数 | 非必要 | 默认为0 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------ |
| code | num | 返回值 | 0成功<br />1参数错误 |
| msg | str | 错误信息 | 默认为success |
| message | str | 错误信息 | 默认为success |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ----- | ---------- | ---- |
| total_count | str | 总计活动数 | |
| items | array | 活动列表 | |
`data`中的`items`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------- | ---- |
| 0 | obj | 活动 1 | |
| n | obj | 活动 (n+1) | |
| …… | obj | …… | …… |
`data`中的`items`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------- | ------------------------ |
| cover | str | 活动图片url | |
| title | str | 活动标题 | |
| link | str | 活动页面url | |
| type | num | 活动类型 | 1展示类<br/>2比赛类 |
| biz | num | 所属分区 | 1画友<br/>2摄影 |
| tag | str | 活动关联的TAG | |
| start_time | num | 开始时间 | 时间戳 |
| end_time | num | 结束时间 | 时间戳 |
| desc | str | 备注 | |
| desc_type | num | 活动状态 | 1已结束<br />2进行中 |
**示例:**
获取`画友`分区全部类型的5条活动
```shell
curl -G 'https://api.vc.bilibili.com/photo_activity/v2/Activity/list' \
--data-urlencode 'type=0' \
--data-urlencode 'biz=1' \
--data-urlencode 'page_num=0' \
--data-urlencode 'page_size=5'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"message": "success",
"data": {
"total_count": 21,
"items": [
{
"cover": "http://i0.hdslb.com/bfs/vc/344d175cf88f217ce8bd0f004a2c5e770eff2e03.png",
"title": "#月饼拟人#创作大赛!丰厚奖励等你来拿!",
"link": "https://www.bilibili.com/read/cv1102416",
"type": 1,
"biz": 1,
"tag": "",
"start_time": 1535817600,
"end_time": 1540915200,
"desc": "已结束",
"desc_type": 1
},
{
"cover": "http://i0.hdslb.com/bfs/vc/63d48fbc37f0142a9c72e06ebc950d4089f881d6.png",
"title": "「ISLAND」同人绘画大赛",
"link": "https://www.bilibili.com/blackboard/activity-rkOlNomMQ.html",
"type": 2,
"biz": 1,
"tag": "ISLAND同人绘画",
"start_time": 1530720000,
"end_time": 1534435200,
"desc": "已结束",
"desc_type": 1
},
{
"cover": "http://i0.hdslb.com/bfs/vc/08d20bc6c10e1e310946ebaaf56c2c90c921644d.jpg",
"title": "我家大师兄脑子有坑同人绘画大赛",
"link": "https://www.bilibili.com/blackboard/activity-S1lV0Ot6M.html",
"type": 2,
"biz": 1,
"tag": "兄坑同人绘画大赛",
"start_time": 1525449600,
"end_time": 1528473600,
"desc": "已结束",
"desc_type": 1
},
{
"cover": "http://i0.hdslb.com/bfs/vc/4eb48398ec0824e96fc878235536f2e0b4a8aef5.jpg",
"title": "国宝复“活”计划",
"link": "https://www.bilibili.com/blackboard/activity-SJ4hL_UFz.html",
"type": 2,
"biz": 1,
"tag": "国宝复“活”计划",
"start_time": 1521388800,
"end_time": 1525017600,
"desc": "已结束",
"desc_type": 1
},
{
"cover": "http://i0.hdslb.com/bfs/vc/9068f91f62ea5a36cbafff263d7e47af99cc9836.jpg",
"title": "画师专访——管郁生",
"link": "https://www.bilibili.com/blackboard/interview-guanyusheng.html",
"type": 1,
"biz": 1,
"tag": "",
"start_time": 1517414400,
"end_time": 0,
"desc": "进行中",
"desc_type": 2
}
]
}
}
```
</details>

249
docs/album/info.md Normal file
View File

@@ -0,0 +1,249 @@
# 相簿基本信息
- [获取相簿详细信息](#获取相簿详细信息)
---
## 获取相簿详细信息
>https://api.vc.bilibili.com/link_draw/v1/doc/detail
*请求方式GET*
认证方式CookieSESSDSTA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------- | ------ | ---- |
| doc_id | num | 目标相簿id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------------- |
| code | num | 返回值 | 0成功<br />110001找不到目标相簿 |
| msg | str | 错误信息 | 默认为success |
| message | str | 错误信息 | 默认为success |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| user | obj | 作者信息 | |
| item | obj | 相簿信息 | |
`data`中的`user`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ---------- | ---- |
| uid | num | 作者mid | |
| head_url | str | 头像url | |
| name | str | 昵称 | |
| vip | obj | 会员信息 | |
| upload_count | str | 相簿投稿数 | |
`user`中的`vip`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ------------ | ------------------------------------------------- |
| vipType | num | 会员类型 | 0<br />1月度大会员<br />2年度及以上大会员 |
| vipDueDate | num | 会员到期时间 | 毫秒 时间戳 |
| dueRemark | str | 空 | 作用尚不明确 |
| accessStatus | num | 0 | 作用尚不明确 |
| vipStatus | num | 会员开通状态 | 0<br />1有 |
| vipStatusWarn | str | 空 | 作用尚不明确 |
| themeType | num | 0 | 作用尚不明确 |
| label | obj | | 作用尚不明确 |
`vip`中的`label`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ---- | ------------ |
| path | str | 空 | 作用尚不明确 |
`data`中的`item`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ----- | ------------------ | ------------------------------------------------------------ |
| biz | num | 相簿分区 | 1画友<br />2摄影<br />3日常 |
| doc_id | num | 相簿id | |
| poster_uid | num | 作者mid | |
| category | str | 子分区标识 | coscosplay<br />daily日常<br />illustration插画<br />comic漫画<br />draw其他<br />sifu私服 |
| type | num | 相簿类型 | 0原创<br />1同人 |
| title | str | 标题 | |
| tags | array | 相簿TAG | |
| pictures | array | 相簿图片 | |
| source | null | | 作用尚不明确 |
| upload_time | str | 投稿时间(时间码) | YYYY-MM-DD hh:mm:ss |
| upload_timestamp | num | 投稿时间(时间戳) | |
| upload_time_text | str | 投稿时间(文本) | |
| description | str | 简介 | |
| role | null | | 作用尚不明确 |
| settings | obj | 权限配置 | |
| already_collected | num | 是否已收藏 | 需要登录Cookie<br />否则恒为0 |
| already_liked | num | 0 | 作用尚不明确 |
| user_status | num | 0 | 作用尚不明确 |
| at_control | str | 空 | 作用尚不明确 |
| view_count | num | 观看数 | |
| like_count | num | 0 | 作用尚不明确 |
| collect_count | num | 收藏数 | |
| verify_status | num | 1 | 作用尚不明确 |
| already_voted | num | 是否已点赞 | 需要登录Cookie<br />否则恒为0 |
| vote_count | num | 点赞数 | |
| comment_count | num | 评论数 | |
`item`中的`tags`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ---- |
| 0 | obj | TAG 1 | |
| n | obj | TAG (n+1) | |
| …… | obj | …… | …… |
`item`中的`tags`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | --------------- | --------------- |
| tag | str | TAG名 | |
| type | num | 类型? | |
| category | str | TAG所属子分区名 | |
| link | str | 活动页面url | 是活动TAG有此项 |
| text | str | TAG名 | |
| name | str | TAG名 | |
`item`中的`pictures`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------- | ---- |
| 0 | obj | 图片 1 | |
| n | obj | 图片 (n+1) | |
| …… | obj | …… | …… |
`item`中的`pictures`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | -------- | ----------- |
| img_src | str | 图片url | |
| img_width | num | 图片宽度 | |
| img_height | num | 图片高度 | |
| img_size | num | 图片大小 | 单位为KByte |
`item`中的`settings`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | ------------ | ------------------------------------------------------------ |
| copy_forbidden | num | 禁止转载标志 | 0不设置转载权限<br />1开放授权-署名-非商用转载<br />2作者授权-署名-非商用转载<br />3禁止转载 |
**示例:**
查询相簿`id=99184721`的详细信息
```shell
curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/detail' \
--data-urlencode 'doc_id=99184721' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"message": "success",
"data": {
"user": {
"uid": 813818,
"head_url": "https://i2.hdslb.com/bfs/face/26b12390399f3e82fb913922938f8a6662d28665.jpg",
"name": "QYS3",
"vip": {
"vipType": 2,
"vipDueDate": 1613750400000,
"dueRemark": "",
"accessStatus": 0,
"vipStatus": 1,
"vipStatusWarn": "",
"themeType": 0,
"label": {
"path": ""
}
},
"upload_count": "171"
},
"item": {
"biz": 1,
"doc_id": 99184721,
"poster_uid": 813818,
"category": "illustration",
"type": 1,
"title": "旅行",
"tags": [
{
"tag": "魔女之旅",
"type": 4,
"category": "illustration",
"text": "魔女之旅",
"name": "魔女之旅"
},
{
"tag": "伊蕾娜",
"type": 3,
"category": "illustration",
"text": "伊蕾娜",
"name": "伊蕾娜"
},
{
"tag": "旅行",
"type": 3,
"category": "illustration",
"text": "旅行",
"name": "旅行"
},
{
"tag": "魔女",
"type": 3,
"category": "illustration",
"text": "魔女",
"name": "魔女"
}
],
"pictures": [
{
"img_src": "https://i0.hdslb.com/bfs/album/d531e3dae34ef65b44ecdb2914d4cc4f5a4da998.jpg",
"img_width": 1236,
"img_height": 1600,
"img_size": 508
}
],
"source": null,
"upload_time": "2020-11-23 23:03:12",
"upload_timestamp": 1606143792,
"upload_time_text": "3天前",
"description": "伊蕾娜世界第一~",
"role": null,
"settings": {
"copy_forbidden": 0
},
"already_collected": 0,
"already_liked": 0,
"user_status": 0,
"at_control": "",
"view_count": 143699,
"like_count": 0,
"collect_count": 54,
"verify_status": 1,
"already_voted": 0,
"vote_count": 2258,
"comment_count": 98
}
}
}
```
</details>

2442
docs/album/list.md Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,171 @@
# 相簿推荐作者
- [获取摄影推荐作者](#获取摄影推荐作者)
- [获取画友推荐作者](#获取画友推荐作者)
---
## 获取摄影推荐作者
> https://api.vc.bilibili.com/link_draw/v2/Photo/uper
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ------- |
| num | num | 请求数量 | 非必要 | 默认为6 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | ------------- |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | 默认为success |
| message | str | 错误信息 | 默认为success |
| data | array | 信息本体 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------- | ---- |
| 0 | obj | 作者 1 | |
| n | obj | 作者 (n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------- | ------------ |
| uid | num | 作者mid | |
| head_url | str | 头像url | |
| name | str | 昵称 | |
| is_followed | num | 0 | 作用尚不明确 |
**示例:**
请求获取摄影推荐作者数量为5
```shell
curl -G 'https://api.vc.bilibili.com/link_draw/v2/Photo/uper' \
--data-urlencode 'num=5'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"message": "success",
"data": [
{
"uid": 36974706,
"head_url": "https://i2.hdslb.com/bfs/face/fa7ef3a5124e2ebfd2094e0bc2f42c752c1abd21.jpg",
"name": "幹物小幺",
"is_followed": 0
},
{
"uid": 3223860,
"head_url": "https://i0.hdslb.com/bfs/face/c5400d25eb7700cd41d88dff5b800bd55ec27cfe.jpg",
"name": "您算哪根葱",
"is_followed": 0
},
{
"uid": 941228,
"head_url": "https://i2.hdslb.com/bfs/face/f38f000d4df21e9bea96d3573efdf81ae02f4ddf.jpg",
"name": "碳酸熊卡",
"is_followed": 0
},
{
"uid": 2624541,
"head_url": "https://i0.hdslb.com/bfs/face/86ccd746af8b1e8bfcdd432de7f0ce1e2b2cb8b0.jpg",
"name": "_一之濑光",
"is_followed": 0
},
{
"uid": 29963706,
"head_url": "https://i1.hdslb.com/bfs/face/c054f097f1b882fc6ad8a67d0f0f88e3acd3bc88.jpg",
"name": "公子温温温如",
"is_followed": 0
}
]
}
```
</details>
## 获取画友推荐作者
> https://api.vc.bilibili.com/link_draw/v2/Doc/drawer
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ------- |
| num | num | 请求数量 | 非必要 | 默认为6 |
**json回复**
见[获取摄影推荐作者](#获取摄影推荐作者)中的响应内容
**示例:**
请求获取画友推荐作者数量为5
```shell
curl -G 'https://api.vc.bilibili.com/link_draw/v2/Doc/drawer' \
--data-urlencode 'num=5'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"message": "success",
"data": [
{
"uid": 7905675,
"head_url": "http://i1.hdslb.com/bfs/face/d4765fd020e8b96e331861cb4d6a3afde4e70d1d.jpg",
"name": "我真的是离城",
"is_followed": 0
},
{
"uid": 20356494,
"head_url": "http://i0.hdslb.com/bfs/face/0686141506894df969832d7dda91f2a0c4cdc24b.jpg",
"name": "ZM-PANDA",
"is_followed": 0
},
{
"uid": 4836885,
"head_url": "http://i1.hdslb.com/bfs/face/48822c5aa7aeae9d3dd2010388baa2b0e1c5cc0a.jpg",
"name": "六六子w",
"is_followed": 0
},
{
"uid": 2575079,
"head_url": "http://i1.hdslb.com/bfs/face/cb3d6f4fb2fbe5aa85ab8773a1a19cec6d8ff1e1.jpg",
"name": "念萦墨葵",
"is_followed": 0
},
{
"uid": 1904878,
"head_url": "http://i0.hdslb.com/bfs/face/f6de926b3905ec7bb9e36202d80eb931d12f70ac.jpg",
"name": "fedsnk",
"is_followed": 0
}
]
}
```
</details>

315
docs/article/articles.md Normal file
View File

@@ -0,0 +1,315 @@
# 文集基本信息
- [获取文集基本信息](#获取文集基本信息)
---
## 获取文集基本信息
> https://api.bilibili.com/x/article/list/web/articles
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| id | num | 文集rlid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-404无此信息 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ---------------- | ------------------------------------------------------------ |
| list | obj | 文集概览 | |
| articles | array | 文集内的文章列表 | |
| author | obj | 文集作者信息 | |
| last | obj | - | 作用尚不明确<br />结构与data.articles[]中相似 |
| attention | bool | 是否关注文集作者 | false未关注<br />true已关注<br />需要登录(Cookie) <br />未登录为false |
`data`中的`list`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | --------------- | ------------ |
| id | num | 文集rlid | |
| mid | num | 文集作者mid | |
| name | str | 文集名称 | |
| image_url | str | 文集封面图片url | |
| update_time | num | 文集更新时间 | 时间戳 |
| ctime | num | 文集创建时间 | 时间戳 |
| publish_time | num | 文集发布时间 | 时间戳 |
| summary | str | 文集简介 | |
| words | num | 文集字数 | |
| read | num | 文集阅读量 | |
| articles_count | num | 文集内文章数量 | |
| state | num | 1或3 | 作用尚不明确 |
| reason | str | 空 | 作用尚不明确 |
| apply_time | str | 空 | 作用尚不明确 |
| check_time | str | 空 | 作用尚不明确 |
`data`中的`articles`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------- | ---- |
| 0 | obj | 文集中第1篇文章 | |
| n | obj | 文集中第(n+1)篇文章 | |
`data`中的`articles`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ----- | -------------- | ------------------------------------------------------------ |
| id | num | 专栏cvid | |
| title | str | 文章标题 | |
| state | num | 0 | 作用尚不明确 |
| publish_time | num | 发布时间 | 秒时间戳 |
| words | num | 文章字数 | |
| image_urls | array | 文章封面 | |
| category | obj | 文章标签 | |
| categories | array | 文章标签列表 | |
| summary | str | 文章摘要 | |
| stats | obj | 文章状态数信息 | |
| like_state | num | 是否点赞 | 0未点赞<br />1已点赞<br />需要登录(Cookie) <br />未登录为0 |
`articles`数组中的对象中的`stats`
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------- | ---- |
| view | num | 阅读数 | |
| favorite | num | 收藏数 | |
| like | num | 点赞数 | |
| dislike | num | 点踩数 | |
| reply | num | 评论数 | |
| share | num | 分享数 | |
| coin | num | 投币数 | |
| dynamic | num | 动态转发数 | |
`articles`数组中的对象中的`author`
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ---- | -------------- | ---- |
| mid | num | 作者mid | |
| name | str | 作者昵称 | |
| face | str | 作者头像url | |
| official_verify | obj | 作者认证信息 | |
| nameplate | obj | 作者勋章 | |
| vip | obj | 作者大会员状态 | |
**示例:**
查询文集`rl207146`的基本信息
```shell
curl -G 'https://api.bilibili.com/x/article/list/web/articles' \
--data-urlencode 'id=207146' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"list": {
"id": 207146,
"mid": 293793435,
"name": "B站api研究笔记",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1585036952,
"ctime": 1582718126,
"publish_time": 1585045493,
"summary": "",
"words": 8697,
"read": 1654,
"articles_count": 3,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
"articles": [
{
"id": 4815593,
"title": "【B站API】api研究笔记ep1-视频基本信息",
"state": 0,
"publish_time": 1582643908,
"words": 2906,
"image_urls": [
"https://i0.hdslb.com/bfs/article/00497c8df7130f22e5b953694b8931a22d32f133.jpg"
],
"category": {
"id": 26,
"parent_id": 17,
"name": "数码"
},
"categories": [
{
"id": 17,
"parent_id": 0,
"name": "科技"
},
{
"id": 26,
"parent_id": 17,
"name": "数码"
}
],
"summary": "各位小可爱们大家好啊,终于可以结束我长达一年的咕咕了.........在这蝠想联翩的日子里也闲的没事除了上课就是睡觉还不如搞点事情哪个猿不想拥有自己的B站爬虫呢当然自制一个B站的综合信息台也是可以的比如显示粉丝数 获赞数掉粉警告于是就萌生了这个研究B站api的想法以后也会继续不定期分享我的主体思路是利用Chrome中的F12工具进行分析再用curl进行验证先从视频下手吧qwq我们以av2075941为例network检测下有各种图片、视频、网页、js。。。。。的传输记录",
"stats": {
"view": 578,
"favorite": 19,
"like": 26,
"dislike": 0,
"reply": 19,
"share": 6,
"coin": 10,
"dynamic": 0
},
"like_state": 0
},
{
"id": 4820548,
"title": "【B站API】api研究笔记ep2-视频其他信息",
"state": 0,
"publish_time": 1582688189,
"words": 4319,
"image_urls": [
"https://i0.hdslb.com/bfs/article/2416ee72759a5c2c8bba0f10d42e789fc0c0ae2b.jpg"
],
"category": {
"id": 26,
"parent_id": 17,
"name": "数码"
},
"categories": [
{
"id": 17,
"parent_id": 0,
"name": "科技"
},
{
"id": 26,
"parent_id": 17,
"name": "数码"
}
],
"summary": "大家中午好鸭昨天我们研究了B站api的获取方法和使用方法 这一期我们继续分享另一个从网页中寻找api的方法以及研究视频的其他api接口以av170001为例首先打开视频在F12的network下的监控中加载页面筛选XHR对象用搜索法的效率较低不如我们直接进行筛选&观察通过对资源路径的观察可以猜到某些有关的项比如playurl有可能是播放的地址pagelist可能是分P列表view不就是昨天研究的『视频基本信息』吗通过继续分析我总结出了以下api这个可以在只想获取简介时应用而不用处理多余",
"stats": {
"view": 737,
"favorite": 14,
"like": 18,
"dislike": 0,
"reply": 14,
"share": 1,
"coin": 1,
"dynamic": 0
},
"like_state": 0
},
{
"id": 5263184,
"title": "【B站API】api研究笔记Special-AV与BV互转",
"state": 0,
"publish_time": 1585045493,
"words": 1472,
"image_urls": [
"https://i0.hdslb.com/bfs/article/b520939046899303cfcac1511308eb87ede760d7.jpg"
],
"category": {
"id": 26,
"parent_id": 17,
"name": "数码"
},
"categories": [
{
"id": 17,
"parent_id": 0,
"name": "科技"
},
{
"id": 26,
"parent_id": 17,
"name": "数码"
}
],
"summary": "昨天视频新编号BV上线了所有视频的编号默认都变成了BVxxx不再是avxxx兼容在链接和搜索中输入av号评论区和动态av和bv都可以一键传送显然日益增长的投稿量对于编号是个问题int是有上限的但一串“乱码”缺少了灵魂还会让我们想到磁力链接或者熊掌盘的链接手动狗头看到av170001我会想到“法克儿~~”但看到BV17x411w7KC其实av号并没有消失只不过它已经隐藏于大众的视野里了av和bv本质上是可以双向转换的方法一电脑版推荐打开一个视频会发现",
"stats": {
"view": 343,
"favorite": 9,
"like": 13,
"dislike": 0,
"reply": 9,
"share": 0,
"coin": 2,
"dynamic": 0
},
"like_state": 0
}
],
"author": {
"mid": 293793435,
"name": "社会易姐QwQ",
"face": "http://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg",
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0
},
"official_verify": {
"type": -1,
"desc": ""
},
"nameplate": {
"nid": 4,
"name": "青铜殿堂",
"image": "http://i1.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png",
"image_small": "http://i1.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png",
"level": "普通勋章",
"condition": "单个自制视频总播放数>=1万"
},
"vip": {
"type": 2,
"status": 1,
"due_date": 0,
"vip_pay_type": 0,
"theme_type": 0,
"label": null
}
},
"last": {
"id": 0,
"title": "",
"state": 0,
"publish_time": 0,
"words": 0,
"image_urls": [ ],
"category": {
"id": 0,
"parent_id": 0,
"name": ""
},
"categories": [ ],
"summary": ""
},
"attention": true
}
}
```
</details>

81
docs/article/category.md Normal file
View File

@@ -0,0 +1,81 @@
# 专栏分类
## 游戏
| id | parent_id | name |
|-----|-----------|------|
| 1 | 0 | 游戏 |
| 6 | 1 | 单机游戏 |
| 7 | 1 | 电子竞技 |
| 8 | 1 | 手机游戏 |
| 9 | 1 | 网络游戏 |
| 10 | 1 | 桌游棋牌 |
## 动画
| id | parent_id | name |
|-----|-----------|------|
| 2 | 0 | 动画 |
| 4 | 2 | 动漫杂谈 |
| 5 | 2 | 动漫资讯 |
| 31 | 2 | 动画技术 |
## 生活
| id | parent_id | name |
|-----|-----------|------|
| 3 | 0 | 生活 |
| 13 | 3 | 美食 |
| 14 | 3 | 时尚 |
| 15 | 3 | 日常 |
| 21 | 3 | 萌宠 |
| 22 | 3 | 运动 |
## 轻小说
| id | parent_id | name |
|-----|-----------|------|
| 16 | 0 | 轻小说 |
| 18 | 16 | 原创连载 |
| 19 | 16 | 同人连载 |
| 20 | 16 | 小说杂谈 |
| 32 | 16 | 短篇小说 |
## 科技
| id | parent_id | name |
|-----|-----------|------|
| 17 | 0 | 科技 |
| 25 | 17 | 人文历史 |
| 26 | 17 | 数码 |
| 27 | 17 | 汽车 |
| 33 | 17 | 自然 |
| 34 | 17 | 学习 |
## 影视
| id | parent_id | name |
|-----|-----------|------|
| 28 | 0 | 影视 |
| 12 | 28 | 电影 |
| 35 | 28 | 电视剧 |
| 36 | 28 | 纪录片 |
| 37 | 28 | 综艺 |
## 兴趣
| id | parent_id | name |
|-----|-----------|------|
| 29 | 0 | 兴趣 |
| 11 | 29 | 模型手办 |
| 23 | 29 | 绘画 |
| 24 | 29 | 手工 |
| 38 | 29 | 摄影 |
| 39 | 29 | 音乐舞蹈 |
## 笔记
| id | parent_id | name |
|-----|-----------|------|
| 41 | 0 | 笔记 |
| 42 | 41 | 全部笔记 |

186
docs/article/info.md Normal file
View File

@@ -0,0 +1,186 @@
# 专栏基本信息
- [获取专栏文章基本信息](#获取专栏文章基本信息)
---
## 获取专栏文章基本信息
> https://api.bilibili.com/x/article/viewinfo
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| id | num | 专栏cvid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-404无此信息 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ------ | ---------------- | ------------------------------------------------------------ |
| like | num | 是否点赞 | 0未点赞<br />1已点赞<br />需要登录(Cookie) <br />未登录为0 |
| attention | bool | 是否关注文章作者 | false未关注<br />true已关注<br />需要登录(Cookie) <br />未登录为false |
| favorite | bool | 是否收藏 | false未收藏<br />true已收藏<br />需要登录(Cookie) <br />未登录为false |
| coin | num | 为文章投币数 | |
| stats | obj | 状态数信息 | |
| title | str | 文章标题 | |
| banner_url | str | 文章头图url | |
| mid | num | 文章作者mid | |
| author_name | str | 文章作者昵称 | |
| is_author | bool | true | 作用尚不明确 |
| image_urls | array | 动态封面 | |
| origin_image_urls | array | 封面图片 | |
| shareable | bool | true | 作用尚不明确 |
| show_later_watch | bool | true | 作用尚不明确 |
| show_small_window | bool | true | 作用尚不明确 |
| in_list | bool | 是否收于文集 | false<br />true是 |
| pre | num | 上一篇文章cvid | 无为0 |
| next | num | 下一篇文章cvid | 无为0 |
| share_channels | array | 分享方式列表 | |
| type | num | 文章类别 | 0文章<br />2笔记 |
`stats`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------- | ---- |
| view | num | 阅读数 | |
| favorite | num | 收藏数 | |
| like | num | 点赞数 | |
| dislike | num | 点踩数 | |
| reply | num | 评论数 | |
| share | num | 分享数 | |
| coin | num | 投币数 | |
| dynamic | num | 动态转发数 | |
`data`中的`image_urls`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | str | 动态封面图片url | |
`data`中的`origin_image_urls`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | str | 文章封面图片url | |
`data`中的`share_channels`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------- | ---- |
| 0 | obj | 分享项qq | |
| 1 | obj | 分享项qq空间 | |
| 2 | obj | 分享项:微信 | |
| 3 | obj | 分享项:朋友圈 | |
| 4 | obj | 分享项:微博 | |
`data`中的`share_channels`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ----------- | ---- |
| name | str | 分享名称 | |
| picture | str | 分享图片url | |
| share_channel | str | 分享代号 | |
**示例:**
查询文章`cv2`的基本信息
```shell
curl -G 'https://api.bilibili.com/x/article/viewinfo' \
--data-urlencode 'id=2' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"like": 0,
"attention": false,
"favorite": false,
"coin": 0,
"stats": {
"view": 1072619,
"favorite": 5481,
"like": 16465,
"dislike": 0,
"reply": 1865,
"share": 351,
"coin": 3436,
"dynamic": 37
},
"title": "专栏行为准则 ",
"banner_url": "https://i0.hdslb.com/bfs/article/131b1d41b857d5308f5bff36591d117bddc48d96.jpg@90p.webp",
"mid": 144900660,
"author_name": "专栏小天使",
"is_author": true,
"image_urls": [
"https://i0.hdslb.com/bfs/article/0a72422ce8e77d8512f010d93b1b7f9bc4e64e52.jpg"
],
"origin_image_urls": [
"https://i0.hdslb.com/bfs/article/131b1d41b857d5308f5bff36591d117bddc48d96.jpg"
],
"shareable": true,
"show_later_watch": true,
"show_small_window": true,
"in_list": false,
"pre": 115914,
"next": 38575,
"share_channels": [
{
"name": "QQ",
"picture": "https://i0.hdslb.com/bfs/album/114ccfb3a999df9c4d11f274c8c61a804c8f8803.png",
"share_channel": "QQ"
},
{
"name": "QQ空间",
"picture": "https://i0.hdslb.com/bfs/album/30e9608bbce725bca45b5910866f60ab4d5e18b3.png",
"share_channel": "QZONE"
},
{
"name": "微信",
"picture": "https://i0.hdslb.com/bfs/album/658af3c22431cd78bb7c50be3394f7c032eba12c.png",
"share_channel": "WEIXIN"
},
{
"name": "朋友圈",
"picture": "https://i0.hdslb.com/bfs/album/c1ebcec8c5302f29f792d15f04e0d6dcef53ec27.png",
"share_channel": "WEIXIN_MONMENT"
},
{
"name": "微博",
"picture": "https://i0.hdslb.com/bfs/album/3707fc23f7d3e24022712320284b0de9aa78c87d.png",
"share_channel": "SINA"
}
],
"type": 0,
"video_url": "",
"location": "",
"disable_share": false
}
}
```
</details>

View File

@@ -0,0 +1,178 @@
# 专栏投币&点赞&收藏
- [点赞文章](#点赞文章)
- [投币文章](#投币文章)
- [收藏文章](#收藏文章)
---
## 点赞文章
<img src="../../assets/img/like.svg" width="100" height="100"/>
> https://api.bilibili.com/x/article/like
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------- | ------ | ---------------------- |
| id | num | 文章cvid | 必要 | |
| type | num | 操作方式 | 必要 | 1点赞<br />2取消赞 |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功 <br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />10003不存在该稿件<br />65006已赞过<br />65004取消点赞失败 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
为文章`cv5806746`点赞
```shell
curl 'https://api.bilibili.com/x/article/like' \
--data-urlencode 'id=5806746' \
--data-urlencode 'type=1' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 投币文章
<img src="../../assets/img/coin.svg" width="100" height="100"/>
> https://api.bilibili.com/x/web-interface/coin/add
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------- | ------ | ------- |
| aid | num | 文章cvid | 必要 | |
| upid | num | 文章作者mid | 必要 | |
| multiply | num | 投币数量 | 必要 | 上限为2 |
| avtype | num | 2 | 必要 | 必须为2 |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-104硬币不足<br />-111csrf校验失败<br />-400请求错误<br />10003不存在该稿件<br />34002不能给自己投币<br />34003非法的投币数量<br />34005超过投币上限 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
data 对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------ | ----------------------------------------------------- |
| like | bool | 是否点赞成功 | true成功<br />false失败<br />已赞过则附加点赞失败 |
**示例:**
为文章`cv5806746`投币1枚
```shell
curl 'https://api.bilibili.com/x/web-interface/coin/add' \
--data-urlencode 'aid=5806746' \
--data-urlencode 'upid=486980924' \
--data-urlencode 'multiply=1' \
--data-urlencode 'avtype=2' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"like": false
}
}
```
</details>
## 收藏文章
<img src="../../assets/img/fav.svg" width="100" height="100"/>
>https://api.bilibili.com/x/article/favorites/add
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------- | ------ | ---- |
| id | num | 文章cvid | 必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />-404无此项 |
| message | str | 错误信息 | 正确为success |
| data | obj | 信息本体 | |
**示例:**
收藏文章`cv5806746`
```shell
curl 'https://api.bilibili.com/x/article/favorites/add' \
--data-urlencode 'id=5806746' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>

677
docs/article/list.md Normal file
View File

@@ -0,0 +1,677 @@
# 获取用户专栏信息
- [获取用户专栏文章列表](#获取用户专栏文章列表)
- [获取用户专栏文集列表](#获取用户专栏文集列表)
---
## 获取用户专栏文章列表
> https://api.bilibili.com/x/space/article
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|------|-----|-------|--------------------------------------------------------------------------|-----|
| mid | num | 用户uid | | √ |
| pn | num | | 默认1 | |
| ps | num | | 默认30<br/>范围:[1,30] | |
| sort | str | | `publish_time`:最新发布<br/>`view`:最多阅读<br/>`fav`:最多收藏<br/>默认:`publish_time` | |
**json回复**
根对象
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|--------------------|
| code | num | 返回值 | 0成功<br/>-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象
| 字段名 | 类型 | 内容 | 备注 |
|----------|-------|----------|-----|
| articles | array | 专栏文章信息列表 | |
| pn | num | 本次请求分页页数 | |
| ps | num | 本次请求分页大小 | |
| count | num | 专栏文章总数 | |
`data`对象 -> `articles`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|-------------------|-------|----------|------|
| id | num | 专栏文章id | |
| category | obj | 分类 | |
| categories | array | 分类 | |
| title | str | 标题 | |
| summary | str | 摘要 | |
| banner_url | str | 封面图 | |
| template_id | num | | |
| state | num | | |
| author | obj | UP主信息 | |
| reprint | num | | |
| image_urls | array | | |
| publish_time | num | 发布时间戳 | 单位:秒 |
| ctime | num | 提交时间戳 | 单位:秒 |
| stats | obj | 专栏文章数据统计 | |
| tags | array | 标签 | |
| words | num | | |
| dynamic | str | 粉丝动态文案 | |
| origin_image_urls | array | | |
| list | | `null` | |
| is_like | bool | | |
| media | obj | | |
| apply_time | str | `空串` | |
| check_time | str | `空串` | |
| original | num | | |
| act_id | num | | |
| dispute | | `null` | |
| authenMark | | `null` | |
| cover_avid | num | | |
| top_video_info | | `null` | |
| type | num | | |
`data`对象 -> `articles`数组中的对象 -> `category`对象
| 字段名 | 类型 | 内容 | 备注 |
|-----------|-----|--------|-----|
| id | num | 分类id | |
| parent_id | num | 父级分类id | |
| name | str | 分类名称 | |
`data`对象 -> `articles`数组中的对象 -> `categories`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|-----------|-----|--------|-----|
| id | num | 分类id | |
| parent_id | num | 父级分类id | |
| name | str | 分类名称 | |
`data`对象 -> `articles`数组中的对象 -> `author`对象
| 字段名 | 类型 | 内容 | 备注 |
|-----------------|-----|--------|-----|
| mid | num | 用户uid | |
| name | str | 用户名 | |
| face | str | 头像 | |
| pendant | obj | 头像框信息 | |
| official_verify | obj | 账号认证信息 | |
| nameplate | obj | 成就勋章信息 | |
| vip | obj | 大会员信息 | |
`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `pendant`对象
| 字段名 | 类型 | 内容 | 备注 |
|--------|-----|----------|-----|
| pid | num | 头像框id | |
| name | str | 头像框名称 | |
| image | str | 头像框图片url | |
| expire | num | 过期时间 | |
`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `official_verify`对象
| 字段名 | 类型 | 内容 | 备注 |
|------|-----|------|------------------------------|
| type | num | 是否认证 | -1<br />0个人认证<br />1机构认证 |
| desc | str | 认证备注 | |
`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `nameplate`对象
| 字段名 | 类型 | 内容 | 备注 |
|-------------|-----|---------|-----|
| nid | num | 勋章id | |
| name | str | 勋章名称 | |
| image | str | 勋章图标 | |
| image_small | str | 勋章图标(小) | |
| level | str | 勋章等级 | |
| condition | str | 获取条件 | |
`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `vip`对象
| 字段名 | 类型 | 内容 | 备注 |
|------------------|-----|------------|---------------------------------|
| type | num | 大会员类型 | 0<br />1月大会员<br />2年度及以上大会员 |
| status | num | 大会员状态 | 0<br />1有 |
| due_date | num | 大会员过期时间时间戳 | 单位:毫秒 |
| vip_pay_type | num | 支付类型 | |
| theme_type | num | `0` | |
| label | obj | 大会员标签 | |
| avatar_subscript | num | 是否显示大会员图标 | 0不显示<br />1显示 |
| nickname_color | str | 大会员昵称颜色 | |
`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `vip`对象 -> `label`对象
| 字段名 | 类型 | 内容 | 备注 |
|-------------|-----|--------|------------------------------------------------------------------------------------------------------------------------------|
| path | str | `空串` | |
| text | str | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` |
| label_theme | str | 会员标签 | vip大会员<br />annual_vip年度大会员<br />ten_annual_vip十年大会员<br />hundred_annual_vip百年大会员<br/>fools_day_hundred_annual_vip最强绿鲤鱼 |
`data`对象 -> `articles`数组中的对象 -> `stats`对象
| 字段名 | 类型 | 内容 | 备注 |
|----------|-----|-----|-------|
| view | num | 浏览数 | |
| favorite | num | 收藏数 | |
| like | num | 点赞数 | |
| dislike | num | 点踩数 | 恒为`0` |
| reply | num | 回复数 | |
| share | num | 转发数 | |
| coin | num | 投币数 | |
| dynamic | num | | |
`data`对象 -> `articles`数组中的对象 -> `tags`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|------|-----|------|-----|
| tid | num | 标签id | |
| name | str | 标签名称 | |
`data`对象 -> `articles`数组中的对象 -> `media`对象
| 字段名 | 类型 | 内容 | 备注 |
|-----------|-----|------|-----|
| score | num | `0` | |
| media_id | num | `0` | |
| title | str | `空串` | |
| cover | str | `空串` | |
| area | str | `空串` | |
| type_id | num | `0` | |
| type_name | str | `空串` | |
| spoiler | num | `0` | |
**示例:**
```shell
curl -L -X GET 'https://api.bilibili.com/x/space/article?mid=300021061&pn=1&ps=2&sort=publish_time'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"articles": [
{
"id": 18989884,
"category": {
"id": 15,
"parent_id": 3,
"name": "日常"
},
"categories": [
{
"id": 3,
"parent_id": 0,
"name": "生活"
},
{
"id": 15,
"parent_id": 3,
"name": "日常"
}
],
"title": "B站UP主日报2022年10月08日23点v1.1",
"summary": "冠:罗翔说刑法(2485.45万粉,+7204) 涨:肯德基(+18.37万粉) 掉Overidea_China(-186850粉) 播:开心锤锤(+927.56万) 赞:荒草音乐(+31.02万) 赞:飞翔的丘丘人(+22.08万) 充冰糖IO(+210)",
"banner_url": "https://i0.hdslb.com/bfs/article/5e53260f58f77fff0b8ba6b20179db85b8741b76.jpg",
"template_id": 4,
"state": 0,
"author": {
"mid": 300021061,
"name": "狸工智能",
"face": "https://i1.hdslb.com/bfs/face/4cba9bc9d6cf6935a37ec156dedb8f8d26c1df95.jpg",
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0
},
"official_verify": {
"type": -1,
"desc": ""
},
"nameplate": {
"nid": 3,
"name": "白银殿堂",
"image": "https://i2.hdslb.com/bfs/face/f6a31275029365ae5dc710006585ddcf1139bde1.png",
"image_small": "https://i2.hdslb.com/bfs/face/b09cdb4c119c467cf2d15db5263b4f539fa6e30b.png",
"level": "高级勋章",
"condition": "单个自制视频总播放数>=10万"
},
"vip": {
"type": 0,
"status": 0,
"due_date": 0,
"vip_pay_type": 0,
"theme_type": 0,
"label": {
"path": "",
"text": "",
"label_theme": ""
},
"avatar_subscript": 0,
"nickname_color": ""
}
},
"reprint": 0,
"image_urls": [
"https://i0.hdslb.com/bfs/article/8e5497f7854e7df3468fbc29b0dd10fcf17d1223.png"
],
"publish_time": 1665278884,
"ctime": 1665278884,
"stats": {
"view": 689,
"favorite": 2,
"like": 61,
"dislike": 0,
"reply": 18,
"share": 0,
"coin": 1,
"dynamic": 0
},
"words": 0,
"dynamic": "狸子的UP主日报📰v1.1,每天稳定更新如果咕咕咕了请艾特狸子LePtC检查狐务器 [tv_微笑] #排行榜##大数据##狸工智能#",
"origin_image_urls": [
"https://i0.hdslb.com/bfs/article/5e53260f58f77fff0b8ba6b20179db85b8741b76.jpg"
],
"list": null,
"is_like": false,
"media": {
"score": 0,
"media_id": 0,
"title": "",
"cover": "",
"area": "",
"type_id": 0,
"type_name": "",
"spoiler": 0
},
"apply_time": "",
"check_time": "",
"original": 1,
"act_id": 0,
"dispute": null,
"authenMark": null,
"cover_avid": 0,
"top_video_info": null,
"type": 0
},
{
"id": 18972446,
"category": {
"id": 15,
"parent_id": 3,
"name": "日常"
},
"categories": [
{
"id": 3,
"parent_id": 0,
"name": "生活"
},
{
"id": 15,
"parent_id": 3,
"name": "日常"
}
],
"title": "B站UP主日报2022年10月07日23点v1.1",
"summary": "冠:罗翔说刑法(2484.73万粉,+8020) 涨:靖菌命(+3.61万粉) 掉Overidea_China(-8593粉) 播:开心锤锤(+971.44万) 赞:荒草音乐(+53.14万) 赞:南方都市报(+18.05万) 充:内德维德(+190)",
"banner_url": "https://i0.hdslb.com/bfs/article/5e53260f58f77fff0b8ba6b20179db85b8741b76.jpg",
"template_id": 4,
"state": 0,
"author": {
"mid": 300021061,
"name": "狸工智能",
"face": "https://i1.hdslb.com/bfs/face/4cba9bc9d6cf6935a37ec156dedb8f8d26c1df95.jpg",
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0
},
"official_verify": {
"type": -1,
"desc": ""
},
"nameplate": {
"nid": 3,
"name": "白银殿堂",
"image": "https://i2.hdslb.com/bfs/face/f6a31275029365ae5dc710006585ddcf1139bde1.png",
"image_small": "https://i2.hdslb.com/bfs/face/b09cdb4c119c467cf2d15db5263b4f539fa6e30b.png",
"level": "高级勋章",
"condition": "单个自制视频总播放数>=10万"
},
"vip": {
"type": 0,
"status": 0,
"due_date": 0,
"vip_pay_type": 0,
"theme_type": 0,
"label": {
"path": "",
"text": "",
"label_theme": ""
},
"avatar_subscript": 0,
"nickname_color": ""
}
},
"reprint": 0,
"image_urls": [
"https://i0.hdslb.com/bfs/article/8e5497f7854e7df3468fbc29b0dd10fcf17d1223.png"
],
"publish_time": 1665189149,
"ctime": 1665189149,
"stats": {
"view": 1021,
"favorite": 1,
"like": 66,
"dislike": 0,
"reply": 21,
"share": 2,
"coin": 2,
"dynamic": 0
},
"tags": [
{
"tid": 1598,
"name": "粉丝"
},
{
"tid": 422982,
"name": "狸子"
},
{
"tid": 526616,
"name": "大数据"
},
{
"tid": 14082112,
"name": "狸工智能"
},
{
"tid": 438,
"name": "排行榜"
}
],
"words": 0,
"dynamic": "狸子的UP主日报📰v1.1,每天稳定更新如果咕咕咕了请艾特狸子LePtC检查狐务器 [tv_微笑] #排行榜##大数据##狸工智能#",
"origin_image_urls": [
"https://i0.hdslb.com/bfs/article/5e53260f58f77fff0b8ba6b20179db85b8741b76.jpg"
],
"list": null,
"is_like": false,
"media": {
"score": 0,
"media_id": 0,
"title": "",
"cover": "",
"area": "",
"type_id": 0,
"type_name": "",
"spoiler": 0
},
"apply_time": "",
"check_time": "",
"original": 1,
"act_id": 0,
"dispute": null,
"authenMark": null,
"cover_avid": 0,
"top_video_info": null,
"type": 0
}
],
"pn": 1,
"ps": 2,
"count": 1563
}
}
```
</details>
## 获取用户专栏文集列表
> https://api.bilibili.com/x/article/up/lists
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|----------|-----|-------|-----|-------------------|
| mid | num | 用户uid | √ | |
| sort | num | 排序方式 | | 0最近更新<br/>1最多阅读 |
| jsonp | str | | | |
| callback | str | | | |
**json回复**
根对象
| 字段名 | 类型 | 内容 | 备注 |
|---------|-----|------|--------------------|
| code | num | 响应码 | 0成功<br/>-400请求错误 |
| message | str | 0 | |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象
| 字段名 | 类型 | 内容 | 备注 |
|-------|-------|--------|-----|
| lists | array | 文集信息列表 | |
| total | num | 文集总数 | |
`data`对象 -> `lists`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|----------------|-----|---------|------|
| id | num | 文集id | |
| mid | num | 作者uid | |
| name | str | 文集名称 | |
| image_url | str | 封面 | |
| update_time | num | 最后更新时间戳 | 单位:秒 |
| ctime | num | 创建时间戳 | 单位:秒 |
| publish_time | num | | 单位:秒 |
| summary | str | `空串` | |
| words | num | 总字数 | |
| read | num | 阅读量 | |
| articles_count | num | 包含文章数 | |
| state | num | `1` | |
| reason | str | `空串` | |
| apply_time | str | `空串` | |
| check_time | str | `空串` | |
**示例:**
```shell
curl -X GET 'https://api.bilibili.com/x/article/up/lists' \
--data-urlencode 'mid=2859372' \
--data-urlencode 'sort=0'
```
<details>
<summary>点击查看</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"lists": [
{
"id": 77163,
"mid": 2859372,
"name": "碟报",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1664854854,
"ctime": 1554785697,
"publish_time": 1664863200,
"summary": "",
"words": 71532,
"read": 478726,
"articles_count": 113,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
{
"id": 26407,
"mid": 2859372,
"name": "周榜",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1664721205,
"ctime": 1537942450,
"publish_time": 1664721307,
"summary": "",
"words": 102099,
"read": 1366280,
"articles_count": 206,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
{
"id": 107952,
"mid": 2859372,
"name": "制作委员会",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1646663919,
"ctime": 1563107348,
"publish_time": 1646910000,
"summary": "",
"words": 47564,
"read": 72911,
"articles_count": 10,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
{
"id": 26457,
"mid": 2859372,
"name": "实时榜",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1603115712,
"ctime": 1537955117,
"publish_time": 1603115719,
"summary": "",
"words": 206741,
"read": 1136352,
"articles_count": 76,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
{
"id": 49769,
"mid": 2859372,
"name": "预测",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1593933314,
"ctime": 1546153226,
"publish_time": 1593933314,
"summary": "",
"words": 2518,
"read": 55123,
"articles_count": 6,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
{
"id": 96916,
"mid": 2859372,
"name": "书籍周榜",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1559815260,
"ctime": 1559815159,
"publish_time": 1559815577,
"summary": "",
"words": 272,
"read": 2955,
"articles_count": 1,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
{
"id": 96610,
"mid": 2859372,
"name": "原始周榜存档",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1559721231,
"ctime": 1559720762,
"publish_time": 1559721271,
"summary": "",
"words": 290,
"read": 1498,
"articles_count": 1,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
{
"id": 26453,
"mid": 2859372,
"name": "杂谈",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1557303117,
"ctime": 1537954625,
"publish_time": 1557303168,
"summary": "",
"words": 10673,
"read": 38363,
"articles_count": 4,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
},
{
"id": 59028,
"mid": 2859372,
"name": "新春访谈",
"image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png",
"update_time": 1549878596,
"ctime": 1549343048,
"publish_time": 1549884125,
"summary": "",
"words": 33472,
"read": 34597,
"articles_count": 13,
"state": 1,
"reason": "",
"apply_time": "",
"check_time": ""
}
],
"total": 9
}
}
```
</details>

154
docs/audio/action.md Normal file
View File

@@ -0,0 +1,154 @@
# 音频投币&收藏
- [查询音频收藏状态](#查询音频收藏状态)
- [查询音频投币数](#查询音频投币数)
- [投币音频](#投币音频)
---
## 查询音频收藏状态
> https://www.bilibili.com/audio/music-service-c/web/collections/songs-coll
*请求方式GET*
认证方式CookieSESSDATA
鉴权方式Cookie中`DedeUserID`存在且不为0
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| sid | num | 音频auid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />72000000参数错误<br />72010002账号未登陆<br />7201006该音频不存在或已被下架 |
| msg | str | 错误信息 | 默认为success |
| data | bool | 是否收藏 | false未收藏<br />true已收藏 |
**示例:**
查询音频`au13598`的收藏状态
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/collections/songs-coll' \
--data-urlencode 'sid=13598' \
-b 'SESSDATA=xxx;DedeUserID=1;'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": true
}
```
</details>
## 查询音频投币数
> https://www.bilibili.com/audio/music-service-c/web/coin/audio
*请求方式GET*
认证方式CookieSESSDATA
鉴权方式Cookie中`DedeUserID`存在且不为0
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| sid | num | 音频auid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />72000000参数错误<br />72010002账号未登陆<br />7201006该音频不存在或已被下架 |
| msg | str | 错误信息 | 默认为success |
| data | num | 投币数量 | 0为未投币上限为2 |
**示例:**
查询音频`au13598`的投币数
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/coin/audio' \
--data-urlencode 'sid=15664' \
-b 'SESSDATA=xxx;DedeUserID=1;'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": 1
}
```
</details>
## 投币音频
> https://www.bilibili.com/audio/music-service-c/web/coin/add
*请求方式POST*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------- | ------ | ---- |
| sid | num | 音频 auid | 必要 | |
| multiply | num | 投币数量(最大为 2 | 必要 | |
| csrf | str | CSRF Token位于 cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />72000000参数错误<br />72010002账号未登陆<br />7201006该音频不存在或已被下架 |
| msg | str | 错误信息 | 默认为 0 |
| data | str | 当前投币数量 | 0 为未投币,上限为 2 |
**示例:**
为音频`au13598`投币
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/coin/add' \
--data-urlencode 'sid=15664' \
-b 'SESSDATA=xxx;DedeUserID=1;'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"data": "1"
}
```
</details>

432
docs/audio/info.md Normal file
View File

@@ -0,0 +1,432 @@
# 歌曲基本信息
- [查询歌曲基本信息](#查询歌曲基本信息)
- [查询歌曲TAG](#查询歌曲TAG)
- [查询歌曲创作成员列表](#查询歌曲创作成员列表)
- [获取歌曲歌词](#获取歌曲歌词)
---
## 查询歌曲基本信息
> https://www.bilibili.com/audio/music-service-c/web/song/info
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| sid | num | 音频auid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ----------------------------- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />72000000参数错误<br />7201006该音频不存在或已被下架<br />72010027版权音乐重定向 |
| msg | str | 错误信息 | 默认为success |
| data | 正确时obj<br />错误时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ------ | ------------------ | ------------------ |
| id | num | 音频auid | |
| uid | num | UP主mid | |
| uname | str | UP主昵称 | |
| author | str | 作者名 | |
| title | str | 歌曲标题 | |
| cover | str | 封面图片url | |
| intro | str | 歌曲简介 | |
| lyric | str | lrc歌词url | |
| crtype | num | 1 | **作用尚不明确** |
| duration | num | 歌曲时间长度 | 单位为秒 |
| passtime | num | 歌曲发布时间 | 时间戳 |
| curtime | num | 当前请求时间 | 时间戳 |
| aid | num | 关联稿件avid | 无为0 |
| bvid | str | 关联稿件bvid | 无为空 |
| cid | num | 关联视频cid | 无为0 |
| msid | num | 0 | **作用尚不明确** |
| attr | num | 0 | **作用尚不明确** |
| limit | num | 0 | **作用尚不明确** |
| activityId | num | 0 | **作用尚不明确** |
| limitdesc | str | 空 | **作用尚不明确** |
| ctime | null | - | **作用尚不明确** |
| statistic | obj | 状态数 | |
| vipInfo | obj | UP主会员状态 | |
| collectIds | array | 歌曲所在的收藏夹mlid | 需要登录(SESSDATA) |
| coin_num | num | 投币数 | |
`data`中的`statistic`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---- |
| sid | num | 音频auid | |
| play | num | 播放次数 | |
| collect | num | 收藏数 | |
| comment | num | 评论数 | |
| share | num | 分享数 | |
`data`中的`vipInfo`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ------------ | ----------------------------------- |
| type | num | 会员类型 | 0<br />1月会员<br />2年会员 |
| status | num | 会员状态 | 0<br />1有 |
| due_date | num | 会员到期时间 | 时间戳 毫秒 |
| vip_pay_type | num | 会员开通状态 | 0<br />1有 |
`data`中的`collectIds`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------------- | ---- |
| 0 | num | 第1个所在的收藏夹mlid | |
| n | num | 第n+1个所在的收藏夹mlid | |
| …… | num | …… | …… |
**示例:**
查询音频`au13598`的基本信息
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/song/info' \
--data-urlencode 'sid=13598' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": {
"id": 13598,
"uid": 486183,
"uname": "排骨教主",
"author": "排骨教主",
"title": "牵丝戏",
"cover": "http://i0.hdslb.com/bfs/music/cf50d93b4dc08bfc6d3112041d6de0e56045ac5b.jpg",
"intro": "自制 这次要特别感谢山东省京剧院的各位年轻的老师们对我戏腔发声的悉心指导\n关注排骨的微博@排骨节操收割机\n排骨QQ群456237456\n感谢@妄北没睡够(新浪微博) 画的视频图,太美了!!!!!\n",
"lyric": "http://i0.hdslb.com/bfs/music/150587810313598.lrc",
"crtype": 1,
"duration": 239,
"passtime": 1501640683,
"curtime": 1590154258,
"aid": 2554020,
"bvid": "BV1us411S7E6",
"cid": 3990196,
"msid": 0,
"attr": 0,
"limit": 0,
"activityId": 0,
"limitdesc": "",
"ctime": null,
"statistic": {
"sid": 13598,
"play": 1028516,
"collect": 30914,
"comment": 523,
"share": 384
},
"vipInfo": {
"type": 2,
"status": 1,
"due_date": 1620316800000,
"vip_pay_type": 0
},
"collectIds": [
15967839
],
"coin_num": 1777
}
}
```
</details>
## 查询歌曲TAG
> https://www.bilibili.com/audio/music-service-c/web/tag/song
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| sid | num | 音频auid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ------ | -------- | ------------- |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | 默认为success |
| data | array | TAG列表 | 无为空 |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| 0 | str | TAG1 | |
| n | str | TAG(n+1) | |
| …… | str | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ---------- | ---------------- |
| type | str | song | **作用尚不明确** |
| subtype | num | | **作用尚不明确** |
| key | num | TAG id | **作用尚不明确** |
| info | str | TAG名 | |
**示例:**
查询音频`au15664`的TAG
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/tag/song' \
--data-urlencode 'sid=15664'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": [
{
"type": "song",
"subtype": 0,
"key": 1,
"info": "音乐"
},
{
"type": "song",
"subtype": 1,
"key": 3,
"info": "人声"
},
{
"type": "song",
"subtype": 2,
"key": 2,
"info": "翻唱"
},
{
"type": "song",
"subtype": 3,
"key": 33,
"info": "日语"
},
{
"type": "song",
"subtype": 5,
"key": 41,
"info": "网络歌曲"
},
{
"type": "song",
"subtype": 4,
"key": 7,
"info": "流行"
}
]
}
```
</details>
## 查询歌曲创作成员列表
> https://www.bilibili.com/audio/music-service-c/web/member/song
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| sid | num | 音频auid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ------ | ------------ | ------------- |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | 默认为success |
| data | array | 成员类型列表 | 无为空 |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | str | 成员类型1 | |
| n | str | 成员类型(n+1) | |
| …… | str | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ------ | ------------ | ------------------------------------------------------------ |
| list | array | 成员列表 | |
| type | num | 成员类型代码 | 1歌手<br />2作词<br />3作曲<br />4编曲<br />5后期/混音<br />7封面制作<br />8音源<br />9调音<br />10演奏<br />11乐器<br />127UP主 |
`data`数组中的对象中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ---- |
| 0 | str | 成员1 | |
| n | str | 成员(n+1) | |
| …… | str | …… | …… |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | ---------- | ---------------- |
| mid | num | 0 | **作用尚不明确** |
| name | str | 成员名 | |
| member_id | num | 成员id | **作用尚不明确** |
**示例:**
查询音频`au815861`的创作成员信息
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/member/song' \
--data-urlencode 'sid=815861'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": [
{
"list": [
{
"mid": 0,
"name": "匀子Cyrena",
"member_id": 164341
}
],
"type": 1
},
{
"list": [
{
"mid": 0,
"name": "圣月樱泪 ",
"member_id": 12349
}
],
"type": 2
},
{
"list": [
{
"mid": 0,
"name": "Days的Wing翼",
"member_id": 13777
}
],
"type": 3
},
{
"list": [
{
"mid": 0,
"name": "Days的Wing翼",
"member_id": 13777
}
],
"type": 4
},
{
"list": [
{
"mid": 0,
"name": "嘟比Dubi",
"member_id": 40902
}
],
"type": 5
},
{
"list": [
{
"mid": 0,
"name": "匀子Cyrena",
"member_id": 164222
}
],
"type": 127
}
]
}
```
</details>
## 获取歌曲歌词
> https://www.bilibili.com/audio/music-service-c/web/song/lyric
*请求方式GET*
同[查询歌曲基本信息](#查询歌曲基本信息)中的lrc歌词
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| sid | num | 音频auid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ----------------------------- | --------------- | ------------- |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | 默认为success |
| data | 正确时str<br />错误时null | lrc格式歌词信息 | 无为空 |
**示例:**
获取音频`au15664`的歌词信息
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/song/lyric' \
--data-urlencode 'sid=15664' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": "[ar:萧忆情]\n\n[ti:威风堂堂]\n\n[00:26.64]引诱谁去摘下禁果\n\n[00:28.11]甜美滋味偷咬一口\n\n[00:30.03]触及到了最深处果核\n\n[00:31.82]身体开始颤抖\n\n[00:33.85]舌尖已濡湿双腿内侧\n\n[00:35.55]神经末梢警报响彻\n\n[00:37.39]自内而外逐渐变得火热\n\n[00:39.14]现在无须再遵守规则\n\n[00:42.14]还故作矜持说违心的话\n\n[00:45.84]为何动作不停下\n\n[00:47.85]停下来\n\n[00:48.39]已经快停不下来\n\n[00:49.42]还想索取更多\n\n[00:50.46]踩碎那PRIDE\n\n[00:51.41]忘记毫无意义的理智存在\n\n[00:53.27]让暧昧因子在四处的徘徊\n\n[00:55.19]给我收起你那\n\n[00:56.21]太虚伪的STYLE\n\n[00:57.01]直白赤裸的爱\n\n[00:58.00]最原始的DIVE\n\n[00:58.86]喘息中断续的声音叫期待\n\n[01:00.65]别掩饰此刻\n\n[01:01.50]那让人意乱情迷的SMILE\n\n[01:10.90]缓慢吐息迷惑双眼的雾\n\n[01:12.49]强制禁锢身下轻舔锁骨\n\n[01:14.23]就让封锁的心渐渐领悟\n\n[01:15.97]别继续装无辜\n\n[01:17.54]开始脱下的衬衫\n\n[01:19.08]最后的纽扣解开它\n\n[01:20.98]快感get\n\n[01:21.85]从此不顾一切\n\n[01:23.32]还在犹豫什么\n\n[01:24.78]Darling\n\n[01:26.54]站在自由世界的正中央\n\n[01:30.09]窥探你幻想的是否太过浪荡\n\n[01:33.99]太难耐\n\n[01:34.41]分分秒秒太难耐\n\n[01:35.61]床笫间的狩猎\n\n[01:36.63]充满野心的TRY\n\n[01:37.66]不承认口头上无理的摊牌\n\n[01:39.58]只想要在身体里深埋\n\n[01:41.34]现在由我掌控\n\n[01:42.36]随心所欲的LIFE\n\n[01:43.40]给你要的未来\n\n[01:44.41]永远不腐坏\n\n[01:45.32]所有的阴暗面统统藏起来\n\n[01:46.70]仅为你一人展现那能骄傲夸耀的MIND\n\n[01:49.90]将不安的情绪碾至粉末\n\n[01:53.14]抹在你胸口印上最鲜艳的红\n\n[02:21.06]别打算缩起来置身之外\n\n[02:22.64]无论何时\n\n[02:23.27]NO TIME\n\n[02:23.58]ALL RIGHT\n\n[02:24.21]打破一切的羞耻值\n\n[02:25.43]哪里奇怪\n\n[02:26.06]哪里奇怪\n\n[02:26.68]哪里奇怪\n\n[02:27.30]BURN BURN BURN\n\n[02:28.22]想要的就是那\n\n[02:29.17]啊 没错\n\n[02:29.87]再给我更多的触摸\n\n[02:31.62]顺位交换贴近肌肤的DANCE\n\n[02:33.34]好吧 肆无忌惮\n\n[02:34.98]停下来\n\n[02:35.35]已经快停不下来\n\n[02:36.50]还想索取更多\n\n[02:37.68]踩碎那PRIDE\n\n[02:38.38]忘记毫无意义的理智存在\n\n[02:40.27]让暧昧因子在四处的徘徊\n\n[02:42.11]给我收起你那\n\n[02:43.16]太虚伪的STYLE\n\n[02:44.00]直白赤裸的爱\n\n[02:45.06]最原始的DIVE\n\n[02:45.90]喘息中断续的声音叫期待\n\n[02:47.76]别掩饰此刻那让人意乱情迷的SMILE\n\n[02:50.64]将不安的情绪碾至粉末\n\n[02:54.09]抹在你胸口印上最鲜艳的红\n\n[02:58.35]抛弃所有只想拥有此刻\n\n"
}
```
</details>

790
docs/audio/music_list.md Normal file
View File

@@ -0,0 +1,790 @@
# 歌单&音频收藏夹详细信息
- [歌单&音频收藏夹详细信息](#歌单音频收藏夹详细信息)
- [查询自己创建的歌单](#查询自己创建的歌单)
- [查询音频收藏夹(默认歌单)信息](#查询音频收藏夹默认歌单信息)
- [查询热门歌单](#查询热门歌单)
- [查询热门榜单](#查询热门榜单)
---
## 查询自己创建的歌单
> https://www.bilibili.com/audio/music-service-c/web/collections/list
*请求方式GET*
认证方式CookieSESSDATA
鉴权方式Cookie中`DedeUserID`存在且不为0
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| pn | num | 页码 | 必要 | |
| ps | num | 每页项数 | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ----------------------------- | -------- | ----------------------------------------------------- |
| code | num | 返回值 | 0成功<br />72000000参数错误<br />72010002未登录 |
| msg | str | 错误信息 | 默认为success |
| data | 正确时obj<br />错误时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ------ | ------------ | ---- |
| curPage | num | 当前页码 | |
| pageCount | num | 总计页数 | |
| totalSize | num | 总计收藏夹数 | |
| pageSize | num | 当前页面项数 | |
| data | array | 歌单列表 | |
`data`中的`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | ---- |
| 0 | obj | 音频收藏夹mlid1 | |
| n | obj | 音频收藏夹mlid(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ------ | ------------------------ | -------------------------------- |
| id | num | 音频收藏夹mlid | |
| uid | num | 创建用户mid | |
| uname | str | 创建用户昵称 | |
| title | str | 歌单标题 | |
| type | num | 收藏夹属性 | 0普通收藏夹<br />1默认收藏夹 |
| published | num | 是否公开 | 0不公开<br />1公开 |
| cover | str | 歌单封面图片url | |
| ctime | num | 歌单创建时间 | 时间戳 |
| song | num | 歌单中的音乐数量 | |
| desc | str | 歌单备注信息 | |
| sids | array | 歌单中的音乐 | |
| menuId | num | 音频收藏夹对应的歌单amid | |
| statistic | obj | 歌单状态数信息 | |
`data`中的`sids`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------- | ---------------- |
| 0 | num | 收藏的音频auid1 | |
| n | num | 收藏的音频auid(n+1) | 按照歌单顺序排列 |
| …… | num | …… | …… |
`data`中的`statistic`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------------------------ | ---- |
| sid | num | 音频收藏夹对应的歌单amid | |
| play | num | 播放数 | |
| collect | num | 收藏数 | |
| comment | null | 评论数 | |
| share | num | 分享数 | |
**示例:**
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/collections/list' \
--data-urlencode 'ps=2' \
--data-urlencode 'pn=1' \
-b 'SESSDATA=xxx;DedeUserID=1;'
```
共计创建了两个歌单,如下
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": {
"curPage": 1,
"pageCount": 1,
"totalSize": 2,
"pageSize": 2,
"data": [
{
"id": 15967839,
"uid": 293793435,
"uname": "社会易姐QwQ",
"title": "默认歌单",
"type": 1,
"published": 1,
"cover": "http://i0.hdslb.com/bfs/music/1e079693701d2f525850c288fcc48fa4259a73f6.jpg",
"ctime": 1519295502,
"song": 13,
"desc": "",
"sids": [
11673,
276404,
15664,
737904,
108588,
1286999,
658085,
682118,
736952,
48716,
15711,
13598,
57744
],
"menuId": 15958713,
"statistic": {
"sid": 15958713,
"play": 0,
"collect": 0,
"comment": null,
"share": 0
}
},
{
"id": 30894022,
"uid": 293793435,
"uname": "社会易姐QwQ",
"title": "test",
"type": 0,
"published": 1,
"cover": "",
"ctime": 1590154346,
"song": 0,
"desc": "test1",
"sids": [],
"menuId": 30866686,
"statistic": {
"sid": 30866686,
"play": 0,
"collect": 0,
"comment": 0,
"share": 0
}
}
]
}
}
```
</details>
## 查询音频收藏夹(默认歌单)信息
> https://www.bilibili.com/audio/music-service-c/web/collections/info
*请求方式GET*
认证方式CookieSESSDATA
鉴权方式Cookie中`DedeUserID`存在且不为0
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------ | ------------------ |
| sid | num | 音频收藏夹mlid | 必要 | 必须为默认收藏夹mlid |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ----------------------------- | -------- | ----------------------------------------------------- |
| code | num | 返回值 | 0成功<br />72000000参数错误<br />72010002未登录 |
| msg | str | 错误信息 | 默认为success |
| data | 正确时obj<br />错误时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ------ | ------------------------ | ---------------------- |
| id | num | 音频收藏夹mlid | |
| uid | num | 创建用户mid | |
| uname | str | 创建用户昵称 | |
| title | str | 默认歌单 | 恒为`默认歌单` |
| type | num | 1 | 恒为`1` |
| published | num | 是否公开 | 0不公开<br />1公开 |
| cover | str | 歌单封面图片url | |
| ctime | num | 歌单创建时间 | 时间戳 |
| song | num | 歌单中的音乐数量 | |
| desc | str | 空 | 恒为空 |
| sids | array | 歌单中的音乐 | |
| menuId | num | 音频收藏夹对应的歌单amid | 与普通歌单不同通用 |
| statistic | obj | 歌单状态数信息 | |
`data`中的`sids`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------- | ---------------- |
| 0 | num | 收藏的音频auid1 | |
| n | num | 收藏的音频auid(n+1) | 按照歌单顺序排列 |
| …… | num | …… | …… |
`data`中的`statistic`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------------------------ | ---- |
| sid | num | 音频收藏夹对应的歌单amid | |
| play | num | 0 | |
| collect | num | 0 | |
| comment | null | - | |
| share | num | 0 | |
**示例:**
查询我的默认歌单id为` 15967839 `
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/collections/info' \
--data-urlencode 'sid=15967839 ' \
-b 'SESSDATA=xxx;DedeUserID=1;'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": {
"id": 15967839,
"uid": 293793435,
"uname": "社会易姐QwQ",
"title": "默认歌单",
"type": 1,
"published": 1,
"cover": "http://i0.hdslb.com/bfs/music/1e079693701d2f525850c288fcc48fa4259a73f6.jpg",
"ctime": 1519295502,
"song": 13,
"desc": "",
"sids": [
11673,
276404,
15664,
737904,
108588,
1286999,
658085,
682118,
736952,
48716,
15711,
13598,
57744
],
"menuId": 15958713,
"statistic": {
"sid": 15958713,
"play": 0,
"collect": 0,
"comment": null,
"share": 0
}
}
}
```
</details>
## 查询热门歌单
> https://www.bilibili.com/audio/music-service-c/web/menu/hit
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --- | --- | ---- | --- | --- |
| pn | num | 页码 | 必要 | |
| ps | num | 每页项数 | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | --------------------- | ---- | ----------------------------------------- |
| code | num | 返回值 | 0成功<br />72000000参数错误<br />72010002未登录 |
| msg | str | 错误信息 | 默认为success |
| data | 正确时obj<br />错误时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ------ | --- |
| curPage | num | 当前页码 | |
| pageCount | num | 总计页数 | |
| totalSize | num | 总计收藏夹数 | |
| pageSize | num | 当前页面项数 | |
| data | array | 歌单列表 | |
`data`中的`data`数组:
| 项 | 类型 | 内容 | 备注 |
| --- | --- | -------------- | --- |
| 0 | obj | 音频收藏夹mlid1 | |
| n | obj | 音频收藏夹mlid(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | --- | -------------- | ----------------------------- |
| menuId | num | 音频收藏夹对应的歌单amid | |
| uid | num | 创建用户mid | |
| uname | str | 创建用户昵称 | |
| title | str | 歌单标题 | |
| cover | str | 歌单封面图片url | |
| intro | str | 歌单介绍 | |
| type | num | 歌单属性 | 1普通歌单<br/>2置顶歌单<br/>5PGC歌单 |
| off | num | 歌单是否公开 | 0公开<br/>1私密 |
| ctime | num | 歌单创建时间 | 时间戳 |
| curtime | num | 当前时间 | 时间戳 |
| statistic | obj | 歌单状态数信息 | |
| snum | num | 歌单包含歌曲个数 | |
`data`中的`statistic`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | --- | -------------- | --- |
| sid | num | 音频收藏夹对应的歌单amid | |
| play | num | 播放数 | |
| collect | num | 收藏数 | |
| comment | num | 评论数 | |
| share | num | 分享数 | |
**示例:**
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/menu/hit' \
--data-urlencode 'ps=1' \
--data-urlencode 'pn=6'
```
使用参数:`ps=1&qn=2`
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": {
"curPage": 1,
"pageCount": 1,
"totalSize": 11,
"pageSize": 3,
"data": [{
"menuId": 10624,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "新曲推荐",
"cover": "http://i0.hdslb.com/bfs/music/a32c1ed4f6ec3f74f8240f4486a750dda3a509e5.jpg",
"intro": "每天11:00更新为你推送最新音乐",
"type": 2,
"off": 0,
"ctime": 1501209433,
"curtime": 1655712354,
"statistic": {
"sid": 10624,
"play": 2366255,
"collect": 20565,
"comment": 1104,
"share": 622
},
"snum": 16,
"attr": 0,
"isDefault": 0,
"collectionId": 0
}, {
"menuId": 125312,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "丧甜可口?你意想不到的软萌电音",
"cover": "http://i0.hdslb.com/bfs/music/04f6c29ed094368253bc05fecb7bf990cee2d3a3.jpg",
"intro": "这个化学反应是怦然心动?",
"type": 1,
"off": 0,
"ctime": 1533298738,
"curtime": 1655712354,
"statistic": {
"sid": 125312,
"play": 298018,
"collect": 9928,
"comment": 89,
"share": 239
},
"snum": 19,
"attr": 0,
"isDefault": 0,
"collectionId": 0
}, {
"menuId": 26241,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "那些听了会泪目的动漫歌曲",
"cover": "http://i0.hdslb.com/bfs/music/006832318fc85fdf287667d51d83dba3b78be808.jpg",
"intro": "那些年陪伴我们的动漫歌曲,你还记得吗?\n",
"type": 1,
"off": 0,
"ctime": 1509608572,
"curtime": 1655712354,
"statistic": {
"sid": 26241,
"play": 370120,
"collect": 8390,
"comment": 110,
"share": 131
},
"snum": 12,
"attr": 0,
"isDefault": 0,
"collectionId": 0
}]
}
}
```
</details>
## 查询热门榜单
> https://www.bilibili.com/audio/music-service-c/web/menu/rank
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --- | --- | ---- | --- | --- |
| pn | num | 页码 | 必要 | |
| ps | num | 每页项数 | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | --------------------- | ---- | ----------------------------------------- |
| code | num | 返回值 | 0成功<br />72000000参数错误<br />72010002未登录 |
| msg | str | 错误信息 | 默认为success |
| data | 正确时obj<br />错误时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ------ | --- |
| curPage | num | 当前页码 | |
| pageCount | num | 总计页数 | |
| totalSize | num | 总计收藏夹数 | |
| pageSize | num | 当前页面项数 | |
| data | array | 歌单列表 | |
`data`中的`data`数组:
| 项 | 类型 | 内容 | 备注 |
| --- | --- | -------------- | --- |
| 0 | obj | 音频收藏夹mlid1 | |
| n | obj | 音频收藏夹mlid(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | -------------- | ----------------------------- |
| menuId | num | 音频收藏夹对应的歌单amid | |
| uid | num | 创建用户mid | |
| uname | str | 创建用户昵称 | |
| title | str | 歌单标题 | |
| cover | str | 歌单封面图片url | |
| intro | str | 歌单介绍 | |
| type | num | 歌单属性 | 1普通歌单<br/>2置顶歌单<br/>5PGC歌单 |
| off | num | 歌单是否公开 | 0公开<br/>1私密 |
| ctime | num | 歌单创建时间 | 时间戳 |
| curtime | num | 当前时间 | 时间戳 |
| statistic | obj | 歌单状态数信息 | |
| snum | num | 歌单包含歌曲个数 | |
| audios | array | 歌单中的音乐信息(部分) | |
`data`数组中的`statistic`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | --- | -------------- | --- |
| sid | num | 音频收藏夹对应的歌单amid | |
| play | num | 收藏数 | |
| collect | num | 点赞数 | |
| comment | num | 评论数 | |
| share | num | 分享数 | |
`data`数组中的`audios`数组:
| 项 | 类型 | 内容 | 备注 |
| --- | --- | ------- | --- |
| 0 | obj | 音频1 | |
| n | obj | 音频(n+1) | |
| …… | obj | …… | …… |
`audios`数组中的`audios`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | --- | ---- | ------- |
| id | num | 音频id | |
| title | str | 音频标题 | |
| duration | num | 音频时长 | 单位:秒(s) |
**示例:**
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/menu/rank' \
--data-urlencode 'ps=1' \
--data-urlencode 'pn=6'
```
使用参数:`ps=1&qn=6`
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": {
"curPage": 1,
"pageCount": 2,
"totalSize": 12,
"pageSize": 6,
"data": [{
"menuId": 10624,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "新曲推荐",
"cover": "http://i0.hdslb.com/bfs/music/a32c1ed4f6ec3f74f8240f4486a750dda3a509e5.jpg",
"intro": "每天11:00更新为你推送最新音乐",
"type": 2,
"off": 0,
"ctime": 1501209433,
"curtime": 1655713346,
"statistic": {
"sid": 10624,
"play": 2366255,
"collect": 20565,
"comment": 1104,
"share": 622
},
"snum": 16,
"attr": 0,
"isDefault": 0,
"collectionId": 0,
"audios": [{
"id": 1572281,
"title": "【Mitchie M】Nechusho No!No! (feat. 初音未来 & MEIKO)",
"duration": 112
}, {
"id": 1551077,
"title": "【洛天依原创】双星伴生",
"duration": 197
}, {
"id": 1544428,
"title": "【小柔】寄り酔いcover",
"duration": 216
}]
}, {
"menuId": 10627,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "热歌榜每日11:00更新",
"cover": "http://i0.hdslb.com/bfs/music/bc735b32ab123f7ddc602b9194defae2cd66062f.jpg",
"intro": "每日上午11:00更新精选三日内热门投稿作品。",
"type": 2,
"off": 0,
"ctime": 1501211353,
"curtime": 1655713346,
"statistic": {
"sid": 10627,
"play": 2289612,
"collect": 11437,
"comment": 434,
"share": 223
},
"snum": 20,
"attr": 0,
"isDefault": 0,
"collectionId": 0,
"audios": [{
"id": 1955567,
"title": "山海(原唱:草东没有派对)",
"duration": 215
}, {
"id": 923884,
"title": "platiunm",
"duration": 181
}, {
"id": 1954370,
"title": "Dark Dawn v1",
"duration": 200
}]
}, {
"menuId": 10628,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "原创榜每日11:00更新",
"cover": "http://i0.hdslb.com/bfs/music/58782504cefb307878d12422fd365ed7f971fad1.jpg",
"intro": "每日上午11:00更新精选三日内原创投稿音乐。",
"type": 2,
"off": 0,
"ctime": 1501211627,
"curtime": 1655713346,
"statistic": {
"sid": 10628,
"play": 395817,
"collect": 2583,
"comment": 314,
"share": 88
},
"snum": 20,
"attr": 0,
"isDefault": 0,
"collectionId": 0,
"audios": [{
"id": 923884,
"title": "platiunm",
"duration": 181
}, {
"id": 1954370,
"title": "Dark Dawn v1",
"duration": 200
}, {
"id": 1954654,
"title": "张真源 - 你要快乐 (Live)",
"duration": 235
}]
}, {
"menuId": 10629,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "中文人声三日榜",
"cover": "http://i0.hdslb.com/bfs/music/f547e3b96d3f283eaa6a3a071de22092fb5101f8.jpg",
"intro": "每日上午11:00更新精选三日内中文人声投稿音乐。",
"type": 2,
"off": 0,
"ctime": 1501211818,
"curtime": 1655713346,
"statistic": {
"sid": 10629,
"play": 842507,
"collect": 5102,
"comment": 362,
"share": 137
},
"snum": 20,
"attr": 0,
"isDefault": 0,
"collectionId": 0,
"audios": [{
"id": 1955567,
"title": "山海(原唱:草东没有派对)",
"duration": 215
}, {
"id": 1955546,
"title": "爱你",
"duration": 86
}, {
"id": 1954654,
"title": "张真源 - 你要快乐 (Live)",
"duration": 235
}]
}, {
"menuId": 10630,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "日文人声三日榜",
"cover": "http://i0.hdslb.com/bfs/music/7dd5d629f50481e22e2f5eced510f5fbd89f5233.jpg",
"intro": "每日上午11:00更新精选三日内日文人声投稿音乐。",
"type": 2,
"off": 0,
"ctime": 1501211959,
"curtime": 1655713346,
"statistic": {
"sid": 10630,
"play": 891268,
"collect": 8671,
"comment": 601,
"share": 169
},
"snum": 20,
"attr": 0,
"isDefault": 0,
"collectionId": 0,
"audios": [{
"id": 1954053,
"title": "派对浪客诸葛孔明 插入歌『ChocoPate』久远七海 starring Lezel",
"duration": 117
}, {
"id": 1956316,
"title": "ただ君に晴れ(只给予你的晴天)",
"duration": 196
}, {
"id": 1956321,
"title": "うまぴょい伝説(马儿蹦跳传说)",
"duration": 262
}]
}, {
"menuId": 10631,
"uid": 32708543,
"uname": "大家的音乐姬",
"title": "VOCALOID三日榜",
"cover": "http://i0.hdslb.com/bfs/music/ce8b1646cbbd5513de7976ba81d0fd9c340c1899.jpg",
"intro": "每日上午11:00更新精选三日内VOCALOID投稿音乐。",
"type": 2,
"off": 0,
"ctime": 1501212166,
"curtime": 1655713346,
"statistic": {
"sid": 10631,
"play": 170112,
"collect": 2900,
"comment": 528,
"share": 60
},
"snum": 10,
"attr": 0,
"isDefault": 0,
"collectionId": 0,
"audios": [{
"id": 1954717,
"title": "弦歌引-翻调",
"duration": 230
}, {
"id": 1956148,
"title": "告RADIO - 春色リップ",
"duration": 253
}, {
"id": 1954302,
"title": "susan说",
"duration": 195
}]
}]
}
}
```
</details>

View File

@@ -0,0 +1,282 @@
# 音频流URL
<img src="../../assets/img/download.svg" width="100" height="100"/>
- [获取音频流URL无法获取付费音频web端](#获取音频流url无法获取付费音频web端)
- [获取音频流URL可获取付费音频双端](#获取音频流url可获取付费音频双端)
- [音频流的获取](#音频流的获取)
---
音质`qn`参数:
| 代码 | 含义 |
| ---- | -------------------- |
| 0 | 流畅 128K |
| 1 | 标准 192K |
| 2 | 高品质 320K |
| 3 | 无损 FLAC (大会员) |
## 获取音频流URL无法获取付费音频web端
> https://www.bilibili.com/audio/music-service-c/web/url
*请求方式GET*
**注web端无法播放完整付费歌曲付费歌曲为30s试听片段**
本接口仅能获取192K音质的音频
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| sid | num | 音频auid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ----------------------------------------------------------- |
| code | num | 返回值 | 0:成功<br />7201006未找到或已下架<br />72000000请求错误 |
| msg | str | 错误信息 | 默认为success |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | --------- | --------------------------------------- |
| sid | num | 音频auid | |
| type | num | 音质标识 | -1试听片段192K<br />1192K |
| info | str | 空 | **作用尚不明确** |
| timeout | num | 有效时长 | 单位为秒<br />一般为3h |
| size | num | 文件大小 | 单位为字节<br />`type`为-1时`size`为0 |
| cdns | array | 音频流url | |
| qualities | null | - | |
| title | null | - | |
| cover | null | - | |
`data`对象的`cdns`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | str | 音频流url | |
| 1 | str | 备用音频流url | |
**示例:**
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/url' \
--data-urlencode 'sid=sid=15664'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": {
"sid": 15664,
"type": 1,
"info": "",
"timeout": 10800,
"size": 4853263,
"cdns": [
"https://upos-sz-mirrorkodo.bilivideo.com/ugaxcode/7bf6a3a3e94421ccc653f005457b1e8c-192k.m4a?deadline=1595331310&gen=uga&os=kodobv&uparams=deadline,gen,os&upsig=0ecd3c7a8d9539f260239d8fa4c093db",
"https://upos-sz-mirrorks3.bilivideo.com/ugaxcode/7bf6a3a3e94421ccc653f005457b1e8c-192k.m4a?deadline=1595331310&gen=uga&os=ks3bv&uparams=deadline,gen,os&upsig=f3fe53aff56655b1b7264ae4ab65872e"
],
"qualities": null,
"title": null,
"cover": null
}
}
```
</details>
## 获取音频流URL可获取付费音频双端
> https://api.bilibili.com/audio/music-service-c/url
*请求方式GET*
认证方式APP或CookieSESSDATA
**注付费音乐需要有带大会员或音乐包的账号登录Cookie或APP否则为试听片段**
无损音质需要登录的用户为会员
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | -------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| songid | num | 音频auid | 必要 | |
| quality | num | 音质代码 | 必要 | **详情见上表** |
| privilege | num | 必须为`2` | 必要 | |
| mid | num | 当前用户mid | 必要 | 可为任意值 |
| platform | str | 平台标识 | 必要 | 可为任意值 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ----------------------------------------------------------- |
| code | num | 返回值 | 0:成功<br />7201006未找到或已下架<br />72000000请求错误 |
| msg | str | 错误信息 | 默认为success |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ----------- | ------------------------------------------------------------ |
| sid | num | 音频auid | |
| type | num | 音质标识 | -1试听片段192K<br />0128K<br />1192K<br />2320K<br />3FLAC |
| info | str | 空 | **作用尚不明确** |
| timeout | num | 有效时长 | 单位为秒<br />一般为3h |
| size | num | 文件大小 | 单位为字节<br />`type`为-1时`size`为0 |
| cdns | array | 音频流url | |
| qualities | array | 音质列表 | |
| title | str | 音频标题 | |
| cover | str | 音频封面url | |
`data`对象的`cdns`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | str | 音频流url | |
| 1 | str | 备用音频流url | |
`data`对象的`qualities`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---------------- |
| 0 | obj | 音质1 | 音质由高向低顺序 |
| n | obj | 音质n+1 | |
`qualities`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ---------------- | ---------------------- |
| type | num | 音质代码 | **详情见上表** |
| desc | str | 音质名称 | |
| size | num | 该音质的文件大小 | 单位为字节 |
| bps | str | 比特率标签 | |
| tag | str | 音质标签 | |
| require | num | 是否需要会员权限 | 0不需要<br />1需要 |
| requiredesc | str | 会员权限标签 | |
**示例:**
获取音频`au682118`的音频流url音质为`3无损`
Cookie方式
```shell
curl -G 'https://api.bilibili.com/audio/music-service-c/url
--data-urlencode 'songid=682118' \
--data-urlencode 'quality=3' \
--data-urlencode 'privilege=2' \
--data-urlencode 'platform=android' \
--data-urlencode 'mid=293793435' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl -G 'https://api.bilibili.com/audio/music-service-c/url
--data-urlencode 'access_key=xxx' \
--data-urlencode 'songid=682118' \
--data-urlencode 'quality=3' \
--data-urlencode 'privilege=2' \
--data-urlencode 'platform=android' \
--data-urlencode 'mid=293793435'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": {
"sid": 682118,
"type": 3,
"info": "",
"timeout": 10800,
"size": 34456494,
"cdns": [
"https://upos-sz-mirrorkodo.bilivideo.com/ugaxcode/m190102ws2pzf6jitbem841vq2x0du5x-flac.flac?deadline=1595332269&gen=uga&os=kodobv&uparams=deadline,gen,os&upsig=ac2284d97a61ef8758681eccf621c56d",
"https://upos-sz-mirrorks3.bilivideo.com/ugaxcode/m190102ws2pzf6jitbem841vq2x0du5x-flac.flac?deadline=1595332269&gen=uga&os=ks3bv&uparams=deadline,gen,os&upsig=3ac7d94dda5664f6f95dbfffeb289744"
],
"qualities": [
{
"type": 3,
"desc": "无损音质",
"size": 34456494,
"bps": "",
"tag": "SQ",
"require": 1,
"requiredesc": "付费享受"
},
{
"type": 2,
"desc": "高品质",
"size": 10788682,
"bps": "320kbit/s",
"tag": "HQ",
"require": 0,
"requiredesc": ""
},
{
"type": 1,
"desc": "标准",
"size": 6491973,
"bps": "192kbit/s",
"tag": "",
"require": 0,
"requiredesc": ""
},
{
"type": 0,
"desc": "流畅",
"size": 4343667,
"bps": "128kbit/s",
"tag": "",
"require": 0,
"requiredesc": ""
}
],
"title": "aLIEz",
"cover": "http://i0.hdslb.com/bfs/music/61d3f8cfdce14d2d1b006af59559c9bd22a2d21b.jpg"
}
}
```
</details>
## 音频流的获取
`data`.`cdns`.`[0]``data`.`cdns`.`[1]`中的内容作为url进行GET操作
需要验证请求`user-agent` 不为空
**user-agent错误并且referer不在`*.bilibili.com`域名下的情况下会导致403 Forbidden故无法获取**
**以上述音频url为例**
```shell
wget 'https://upos-sz-mirrorkodo.bilivideo.com/ugaxcode/m190102ws2pzf6jitbem841vq2x0du5x-flac.flac?deadline=1595332269&gen=uga&os=kodobv&uparams=deadline,gen,os&upsig=ac2284d97a61ef8758681eccf621c56d' \
-O 'Download_music.flac'
```
响应正文将返回一个flac文件

View File

@@ -0,0 +1,67 @@
# 音频状态数
- [歌曲状态数](#歌曲状态数)
---
## 歌曲状态数
>https://www.bilibili.com/audio/music-service-c/web/stat/song
*请求方式GET*
唯缺投币数2333333
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---- |
| sid | num | 音频auid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ------------------------------- |
| code | num | 返回值 | 0成功<br />72000000参数错误 |
| msg | str | 错误信息 | 默认为success |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---- |
| sid | num | 音频auid | |
| play | num | 播放次数 | |
| collect | num | 收藏数 | |
| comment | num | 评论数 | |
| share | num | 分享数 | |
**示例:**
查询歌曲`au15664`的状态数
```shell
curl -G 'https://www.bilibili.com/audio/music-service-c/web/stat/song' \
--data-urlencode 'sid=15664'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"data": {
"sid": 15664,
"play": 1377390,
"collect": 44340,
"comment": 2756,
"share": 4114
}
}
```
</details>

129
docs/bangumi/follow.md Normal file
View File

@@ -0,0 +1,129 @@
# 追番相关
- [追番](#追番)
- [取消追番](#取消追番)
---
## 追番
> https://api.bilibili.com/pgc/web/follow/add
*请求方式POST*
鉴权方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|----------|-----|--------|-----|-----|
| season_id | str | 剧集ssid | 必要 | |
| csrf | str | csrf token(位于cookies中的bili_jct) | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------ | ------------------------------- |
| code | num | 返回值 | 0成功<br />-111csrf校验失败 |
| message | str | 信息 | 成功时success |
| result | obj |见下表| |
根对象中的`result`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------- | ---- |
| fmid | num | 0 | |
| relation | bool | false | |
| status | num | 2 | |
| toast | str | 自己追的番就要好好看完哟^o^ | |
**示例:**
追番`ssid=41410`的番剧
```shell
curl -G 'https://api.bilibili.com/pgc/web/follow/add' \
--data-urlencode 'season_id=41410' \
--data-urlencode 'csrf=xxx' \
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "success",
"result": {
"fmid": 0,
"relation": false,
"status": 2,
"toast": "自己追的番就要好好看完哟^o^"
}
}
```
</details>
## 取消追番
> https://api.bilibili.com/pgc/web/follow/del
*请求方式POST*
鉴权方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | ----------------------------------- | ------ | ---- |
| season_id | str | 剧集ssid | 必要 | |
| csrf | str | csrf token(位于cookies中的bili_jct) | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------ | ------------------------------- |
| code | num | 返回值 | 0成功<br />-111csrf校验失败 |
| message | str | 信息 | 成功时success |
| result | obj | 见下表 | |
根对象中的`result`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------- | ---- |
| fmid | num | 0 | |
| relation | bool | true | |
| status | num | 0 | |
| toast | str | 已取消追番 | |
**示例:**
取消`ssid=41410`的追番
```shell
curl -G 'https://api.bilibili.com/pgc/web/follow/del' \
--data-urlencode 'season_id=41410' \
--data-urlencode 'csrf=xxx' \
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "success",
"result": {
"fmid": 0,
"relation": false,
"status": 0,
"toast": "已取消追番"
}
}
```
</details>

1029
docs/bangumi/info.md Normal file

File diff suppressed because it is too large Load Diff

804
docs/bangumi/timeline.md Normal file
View File

@@ -0,0 +1,804 @@
# 番剧或影视时间线
- [获取番剧或影视时间线](#获取番剧或影视时间线)
---
## 获取番剧或影视时间线
> https://api.bilibili.com/pgc/web/timeline
*请求方式GET*
鉴权方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------ | ------ | ----------------------------- |
| types | str | 类别 | 必要 | 1`番剧`<br />3`电影`<br />4`国创` |
| before | num | 开始于前几日 | 必要 | ∈N∩[0,7] |
| after | num | 结束于后几日 | 必要 | ∈N∩[0,7] |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | ------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-404错误 |
| message | str | 错误信息 | 默认为success |
| result | array | 信息本体 | |
`result`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------------------- | ---- |
| 0 | obj | `before`天前信息 | |
| n | obj | 从`before`天前开始第n天信息 | |
| …… | obj | …… | |
`result`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ----- | -------------- | ----------------- |
| date | str | 当日日期 | |
| date_ts | num | 当日日期时间戳 | |
| day_of_week | num | 一周中第几天 | ∈N∩[1,7] |
| episodes | array | 剧集列表 | |
| is_today | num | 是否今日 | |
`result`数组中的对象中的`episodes`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 剧集1 | |
| n | obj | 剧集n+1 | |
| …… | obj | …… | |
`episodes`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------------- | --------------- |
| cover | str | 封面图url | |
| delay | num | 是否推迟 | |
| delay_id | num | 推迟一话epid | |
| delay_index | str | 推迟一话名称 | |
| delay_reason | str | 推迟原因 | |
| ep_cover | str | 最新一话图url | |
| episode_id | num | 最新一话的epid | |
| pub_index | str | 最新一话名称 | |
| pub_time | str | 发布时间 | |
| pub_ts | num | 发布时间戳 | |
| published | num | 是否已发布 | |
| follows | str | - | |
| plays | str | - | |
| season_id | num | 剧集ssid | |
| square_cover | str | 缩略图url | |
| title | str | 剧集标题 | |
**示例:**
查询从`3`天前到`7`天后的`番剧`时间轴
```shell
curl -G 'https://api.bilibili.com/pgc/web/timeline' \
--data-urlencode 'types=1' \
--data-urlencode 'before=3' \
--data-urlencode 'after=7' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "success",
"result": [
{
"date": "5-15",
"date_ts": 1652544000,
"day_of_week": 7,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/9918f6e67c26d6bd1ddad8dab70bcc7af3bfae9b.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/archive/0067a09911e2fa252a3ef5126d8dc5392189dd8a.jpg",
"episode_id": 508403,
"follows": "-",
"plays": "-",
"pub_index": "第3话",
"pub_time": "01:30",
"pub_ts": 1652549400,
"published": 1,
"season_id": 41416,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/926fd09277605204c2f7c94b322de3156ef9da52.png",
"title": "式守同学不只可爱而已"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/3a9815ca239735c51fc7daf2399c3721bbe00160.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/archive/56e8d4b13dac855c51060dcda286be049fde4a46.png",
"episode_id": 466766,
"follows": "-",
"plays": "-",
"pub_index": "第6话",
"pub_time": "11:00",
"pub_ts": 1652583600,
"published": 1,
"season_id": 41005,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/b3dd92da1ca35758f329fa5aa649991b118a98ca.png",
"title": "鬼灭之刃 无限列车篇 中配版"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/71d54cae830d32a5af776dcc46632146fbdba868.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/archive/00c1dff8457183671f0402e0a2826313a1994a9b.jpg",
"episode_id": 480434,
"follows": "-",
"plays": "-",
"pub_index": "第240话",
"pub_time": "17:30",
"pub_ts": 1652607000,
"published": 1,
"season_id": 5978,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/3121473d5dd03a9bcccb8490034207e724e731b3.jpg",
"title": "博人传 火影忍者新时代"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/91e75030be41d67b9f19b96bb512b0c98ae781bd.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/archive/e701f39cef52e6b0737e3463faf7cb0cee61e935.jpg",
"episode_id": 510647,
"follows": "-",
"plays": "-",
"pub_index": "第4话",
"pub_time": "20:00",
"pub_ts": 1652616000,
"published": 1,
"season_id": 41557,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/4329384cba4ab0390eae1a84a719e4649bf61cfb.png",
"title": "这个治疗有点烦"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/c9723d8c77d881a8debba2852d580e97826b43d0.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/archive/2a01ab590fd8b1331096b94cc6fc09dbdad1bbec.png",
"episode_id": 478918,
"follows": "-",
"plays": "-",
"pub_index": "第7话",
"pub_time": "21:00",
"pub_ts": 1652619600,
"published": 1,
"season_id": 41591,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/1ffa24e100583c3aa96812dea680943291c5c384.jpg",
"title": "恋爱游戏世界对路人角色很不友好"
}
],
"is_today": 0
},
{
"date": "5-16",
"date_ts": 1652630400,
"day_of_week": 1,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/e468c854628b97b5373baaf4c43e1346a9806baa.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/archive/219161297558531d2475da73e863dc237e83baa1.png",
"episode_id": 511342,
"follows": "-",
"plays": "-",
"pub_index": "第1话",
"pub_time": "20:00",
"pub_ts": 1652702400,
"published": 1,
"season_id": 41419,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/75a291010c128ce2de17267fd2a4842d19898236.png",
"title": "魔法使黎明期"
}
],
"is_today": 0
},
{
"date": "5-17",
"date_ts": 1652716800,
"day_of_week": 2,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/4e6c505b1b1631c542ea76c3da1ce08bb43faad6.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/archive/bf37e15c52889a7a9dca16346354bb7c6663c899.png",
"episode_id": 510132,
"follows": "-",
"plays": "-",
"pub_index": "第146话",
"pub_time": "18:00",
"pub_ts": 1652781600,
"published": 1,
"season_id": 23841,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/5c2f289eac0ec49bc5e6b9483f4191c42ffa2254.jpg",
"title": "美妙☆频道"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/9eef1df9ab157be52d2c4d70d3500442f00cafc3.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/archive/d9831c3170bcbba38edc2204ee5059f583823913.png",
"episode_id": 509043,
"follows": "-",
"plays": "-",
"pub_index": "第11话",
"pub_time": "18:00",
"pub_ts": 1652781600,
"published": 1,
"season_id": 38950,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/13fd7c96659a20c61409e155a2a913a59348d122.png",
"title": "魔法纪录 魔法少女小圆外传 第二季"
}
],
"is_today": 0
},
{
"date": "5-18",
"date_ts": 1652803200,
"day_of_week": 3,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/fba0229f1a6eec6ed692b7ae91c634d5cbde0727.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/0ebefe529449ff98d544395d1576402bb0d0ae5b.png",
"episode_id": 510498,
"follows": "-",
"plays": "-",
"pub_index": "第7话",
"pub_time": "21:00",
"pub_ts": 1652878800,
"published": 0,
"season_id": 41413,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/247f8326019e035338529306e94baea3336c43b4.png",
"title": "盾之勇者成名录 第二季"
}
],
"is_today": 1
},
{
"date": "5-19",
"date_ts": 1652889600,
"day_of_week": 4,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/99277ce3f41d1cb4dcda9f6010ebe9c9e6d345e5.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/c989d496e3a075e8bc134b0d4d53d6ca5c2ae634.jpg",
"episode_id": 510760,
"follows": "-",
"plays": "-",
"pub_index": "第2话",
"pub_time": "12:00",
"pub_ts": 1652932800,
"published": 0,
"season_id": 41417,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/ef45828cb99309169e95d1bf54ec833d7968bf22.png",
"title": "夏日重现"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/1cd26af47cf9d9ca045ec36f56ce14a66867438d.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/3dc8d348937528779b7ad9a3070d37276518080f.png",
"episode_id": 399655,
"follows": "-",
"plays": "-",
"pub_index": "第50话",
"pub_time": "18:00",
"pub_ts": 1652954400,
"published": 0,
"season_id": 38353,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/4bd7b0a4c270ce62ca2adf3e18487a96e4fde92e.png",
"title": "通灵王"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/5f5b16bc8edd1310fbf0ac8bce04a11144dc858e.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/aed167a32445ed294ea75ed674442c766d56cb2a.png",
"episode_id": 511494,
"follows": "-",
"plays": "-",
"pub_index": "第4话",
"pub_time": "23:00",
"pub_ts": 1652972400,
"published": 0,
"season_id": 41422,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/924c550415ccdd142145dbf102bd81fcbb018ffd.png",
"title": "骸骨骑士大人奇幻世界冒险中"
}
],
"is_today": 0
},
{
"date": "5-20",
"date_ts": 1652976000,
"day_of_week": 5,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/a29f3b00a94d1b4a029054f72963cc10d98bae99.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/4b9b98677b039b9126614f5a5259aa1484cea227.jpg",
"episode_id": 510757,
"follows": "-",
"plays": "-",
"pub_index": "第2话",
"pub_time": "01:28",
"pub_ts": 1652981280,
"published": 0,
"season_id": 41520,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/2a0ca7be587039eef380f802f8ae71bd21d2ea2c.png",
"title": "街角魔族 第二季"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/ecb52c79def9f5a6099c5a0770f56e20479fb008.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/36d3079e1b24395b07f9f95128adc9568459c3e5.png",
"episode_id": 478238,
"follows": "-",
"plays": "-",
"pub_index": "第17话",
"pub_time": "02:25",
"pub_ts": 1652984700,
"published": 0,
"season_id": 40873,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/13f437706d3f27dee7566a5e489928605663e40f.png",
"title": "川尻小玉的懒散生活"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/a7517ca25c5c7a132a16f589e3a3c4d9f49af196.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/17f34f6c51b8b9371af1998f0612d51f0ba03df2.png",
"episode_id": 508842,
"follows": "-",
"plays": "-",
"pub_index": "第6话",
"pub_time": "07:00",
"pub_ts": 1653001200,
"published": 0,
"season_id": 41534,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/3267da68f7f832ccfc7eaa77c6ab3fb806d2de98.png",
"title": "银河英雄传说:全新命题 激战"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/fecb68763f24d371167389abedf05742b0bf024f.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/f4116e5dcc44d6104cd72d9e0e833cde3959a835.png",
"episode_id": 476164,
"follows": "-",
"plays": "-",
"pub_index": "第32话",
"pub_time": "18:25",
"pub_ts": 1653042300,
"published": 0,
"season_id": 38366,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/56b8e4369871fc0c55bfa9df3f3f8002d40f0691.png",
"title": "妖怪手表"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/81c9dc929e6071a2d42f1b5a207bbcef4a1aead7.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/7c62ad9f559ee6b0fafc1c08d990636c21c4fa8d.png",
"episode_id": 510653,
"follows": "-",
"plays": "-",
"pub_index": "第7话",
"pub_time": "21:30",
"pub_ts": 1653053400,
"published": 0,
"season_id": 41432,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/930ae7ff644dc31ada9abcb3ea30fee5fbc6f397.png",
"title": "约会大作战 第四季"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/d464543dd6720efd43e5487acee74b646423b4d1.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/ca7a19d51feb54162d8f286af416aa5a804e72c4.png",
"episode_id": 511497,
"follows": "-",
"plays": "-",
"pub_index": "第7话",
"pub_time": "22:00",
"pub_ts": 1653055200,
"published": 0,
"season_id": 41418,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/ab50117450baffba62c71c80052ecbad1842a1f3.png",
"title": "恋爱要在世界征服后"
}
],
"is_today": 0
},
{
"date": "5-21",
"date_ts": 1653062400,
"day_of_week": 6,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/68aee547fc85b1eab8be3d5c7e946276e4252b79.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/75583ce830522c6fd391cd6ffac31e3ab96db50e.png",
"episode_id": 510568,
"follows": "-",
"plays": "-",
"pub_index": "第8话",
"pub_time": "00:30",
"pub_ts": 1653064200,
"published": 0,
"season_id": 39725,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/a4fa3f4ecaa4efc883aa1ef2ca7ed736edb38b8c.png",
"title": "理科生坠入情网,故尝试证明。 第二季"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/f711a34e0f18293ba5068fd85d8de891bb01c2be.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/aa3e0fc7ecb422c7c8ed107267befaa18f6dcf89.png",
"episode_id": 510935,
"follows": "-",
"plays": "-",
"pub_index": "第8话",
"pub_time": "00:30",
"pub_ts": 1653064200,
"published": 0,
"season_id": 41506,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/d2dea82606b8dd0ee7934c62dbc7016b0a17255f.png",
"title": "处刑少女的生存之道"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/91ec1f4bc4af307dbfbd68c9ba6d838b27adee0f.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/6d9499e4e5453e5e353939980524102c3b707edb.png",
"episode_id": 477129,
"follows": "-",
"plays": "-",
"pub_index": "第8话",
"pub_time": "01:25",
"pub_ts": 1653067500,
"published": 0,
"season_id": 39180,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/f23cf19d1d6068e83edfd6b3d207ce692ef58ef3.png",
"title": "测不准的阿波连同学"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/bad807ac5a8d4094ead26c08ec2d9b97dbb8c4a1.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/8e563a29a9fb6b91df791a12eb5f869d038fc1e9.png",
"episode_id": 510677,
"follows": "-",
"plays": "-",
"pub_index": "第2话",
"pub_time": "02:00",
"pub_ts": 1653069600,
"published": 0,
"season_id": 41533,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/4ef341fa95646a7c2549e08ba00358b411fba0ee.png",
"title": "舞动不止"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/4ab5cf1efbd1c5883b8f0580cb0304f5452c4665.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/8ea1f90444d04a0b989584df9f18e59a824b0e90.png",
"episode_id": 341403,
"follows": "-",
"plays": "-",
"pub_index": "第71话",
"pub_time": "09:30",
"pub_ts": 1653096600,
"published": 0,
"season_id": 34425,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/ae36d43ebe7ea7176d18bab794de3d8930284feb.png",
"title": "勇者斗恶龙 达伊的大冒险"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/23f393513ab8fdfbb351aa80e8b7423e7361ad98.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/d470a1bf53c96210f2238024dc1947f52cb58f3a.png",
"episode_id": 510681,
"follows": "-",
"plays": "-",
"pub_index": "第2话",
"pub_time": "18:00",
"pub_ts": 1653127200,
"published": 0,
"season_id": 41535,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/f3f69f8747e8464ba46b9bbe24678966809c8021.png",
"title": "Love All Play热血羽毛球"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/38e2a273f528fd01c34f1fc4df0f69c64487efad.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/6c108526eade13d04882b803f1d1e0dfe2a1886e.png",
"episode_id": 459329,
"follows": "-",
"plays": "-",
"pub_index": "第1101话",
"pub_time": "19:30",
"pub_ts": 1653132600,
"published": 0,
"season_id": 33378,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/ecc9a64f3f43eb00ee2bf1549b6ab76182cf5f8b.png",
"title": "名侦探柯南"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/f641f81aa1933d73c91d5ef76b525acbcdbcf3e7.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/c7ccf71fcf65b4e5655403b01a7af3529d2891e8.png",
"episode_id": 510754,
"follows": "-",
"plays": "-",
"pub_index": "第10话",
"pub_time": "20:00",
"pub_ts": 1653134400,
"published": 0,
"season_id": 39433,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/1b4cc42a3909ad2d03563d3163b105c6cad80d20.png",
"title": "鬼灭之刃 游郭篇"
}
],
"is_today": 0
},
{
"date": "5-22",
"date_ts": 1653148800,
"day_of_week": 7,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/3a9815ca239735c51fc7daf2399c3721bbe00160.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/30908825b7c8076b9d7b58d8cd949a87f48866e6.png",
"episode_id": 466767,
"follows": "-",
"plays": "-",
"pub_index": "第7话",
"pub_time": "11:00",
"pub_ts": 1653188400,
"published": 0,
"season_id": 41005,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/b3dd92da1ca35758f329fa5aa649991b118a98ca.png",
"title": "鬼灭之刃 无限列车篇 中配版"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/71d54cae830d32a5af776dcc46632146fbdba868.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/3baf5335e3f1df882b54d69c0c6c9ffa76069eef.png",
"episode_id": 480435,
"follows": "-",
"plays": "-",
"pub_index": "第241话",
"pub_time": "17:30",
"pub_ts": 1653211800,
"published": 0,
"season_id": 5978,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/3121473d5dd03a9bcccb8490034207e724e731b3.jpg",
"title": "博人传 火影忍者新时代"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/91e75030be41d67b9f19b96bb512b0c98ae781bd.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/cff6617c1c7e28f8cd9db3d33d5366a5029e3aa9.png",
"episode_id": 510648,
"follows": "-",
"plays": "-",
"pub_index": "第5话",
"pub_time": "20:00",
"pub_ts": 1653220800,
"published": 0,
"season_id": 41557,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/4329384cba4ab0390eae1a84a719e4649bf61cfb.png",
"title": "这个治疗有点烦"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/c9723d8c77d881a8debba2852d580e97826b43d0.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/c91b2b96c272eb28aa3dd74aa58fc272fc62d577.png",
"episode_id": 478919,
"follows": "-",
"plays": "-",
"pub_index": "第8话",
"pub_time": "21:00",
"pub_ts": 1653224400,
"published": 0,
"season_id": 41591,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/1ffa24e100583c3aa96812dea680943291c5c384.jpg",
"title": "恋爱游戏世界对路人角色很不友好"
}
],
"is_today": 0
},
{
"date": "5-23",
"date_ts": 1653235200,
"day_of_week": 1,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/e468c854628b97b5373baaf4c43e1346a9806baa.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/26f87214a2481680a93bfda294ac080c0b336a40.png",
"episode_id": 511343,
"follows": "-",
"plays": "-",
"pub_index": "第2话",
"pub_time": "20:00",
"pub_ts": 1653307200,
"published": 0,
"season_id": 41419,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/75a291010c128ce2de17267fd2a4842d19898236.png",
"title": "魔法使黎明期"
}
],
"is_today": 0
},
{
"date": "5-24",
"date_ts": 1653321600,
"day_of_week": 2,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/4e6c505b1b1631c542ea76c3da1ce08bb43faad6.jpg",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/4e6c505b1b1631c542ea76c3da1ce08bb43faad6.jpg",
"episode_id": 510133,
"follows": "-",
"plays": "-",
"pub_index": "第147话",
"pub_time": "18:00",
"pub_ts": 1653386400,
"published": 0,
"season_id": 23841,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/5c2f289eac0ec49bc5e6b9483f4191c42ffa2254.jpg",
"title": "美妙☆频道"
},
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/9eef1df9ab157be52d2c4d70d3500442f00cafc3.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/a651c55bb430cdea19d5f4253969d1f7b83567c7.png",
"episode_id": 509044,
"follows": "-",
"plays": "-",
"pub_index": "第12话",
"pub_time": "18:00",
"pub_ts": 1653386400,
"published": 0,
"season_id": 38950,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/13fd7c96659a20c61409e155a2a913a59348d122.png",
"title": "魔法纪录 魔法少女小圆外传 第二季"
}
],
"is_today": 0
},
{
"date": "5-25",
"date_ts": 1653408000,
"day_of_week": 3,
"episodes": [
{
"cover": "http://i0.hdslb.com/bfs/bangumi/image/fba0229f1a6eec6ed692b7ae91c634d5cbde0727.png",
"delay": 0,
"delay_id": 0,
"delay_index": "",
"delay_reason": "",
"ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/0ebefe529449ff98d544395d1576402bb0d0ae5b.png",
"episode_id": 510499,
"follows": "-",
"plays": "-",
"pub_index": "第8话",
"pub_time": "21:00",
"pub_ts": 1653483600,
"published": 0,
"season_id": 41413,
"square_cover": "http://i0.hdslb.com/bfs/bangumi/image/247f8326019e035338529306e94baea3336c43b4.png",
"title": "盾之勇者成名录 第二季"
}
],
"is_today": 0
}
]
}
```
</details>

View File

@@ -0,0 +1,366 @@
# 视频流URL
<img src="../../assets/img/download.svg" width="100" height="100"/>
B站的番剧视频为http流媒体需要对应的api以视频id获取取流url并进行取流
- [qn视频清晰度标识](#qn视频清晰度标识)
- [fnver视频流版本标识](#fnver视频流版本标识)
- [fnval视频流格式标识](#fnval视频流格式标识)
- [视频伴音音质代码](#视频伴音音质代码)
- [获取番剧视频流URL](#获取番剧视频流URL)
- [视频的取流web端及APP端](#视频的取流web端及APP端)
---
## qn视频清晰度标识
**注该值在dash模式且非下载模式时无效**
| 值 | 含义 | 备注 |
|-----|-------------|-----------------------------------------------------------------------------|
| 6 | 240P 极速 | 仅mp4方式支持 |
| 16 | 360P 流畅 | |
| 32 | 480P 清晰 | |
| 64 | 720P 高清 | web端默认值<br />B站前端需要登录才能选择但是直接发送请求可以不登录就拿到720P的取流地址<br />**无720P时则为720P60** |
| 74 | 720P60 高帧率 | 需要认证登录账号 |
| 80 | 1080P 高清 | TV端与APP端默认值<br />需要认证登录账号 |
| 112 | 1080P+ 高码率 | 大多情况需求认证大会员账号 |
| 116 | 1080P60 高帧率 | 大多情况需求认证大会员账号 |
| 120 | 4K 超清 | 需要`fnval&128=128``fourk=1`<br />大多情况需求认证大会员账号 |
| 125 | HDR 真彩色 | 仅支持dash方式<br />需要`fnval&64=64`<br />大多情况需求认证大会员账号 |
| 126 | 杜比视界 | 仅支持dash方式<br />需要`fnval&512=512`<br />大多情况需求认证大会员账号 |
| 127 | 8K 超高清 | 仅支持dash方式<br />需要`fnval&1024=1024`<br />大多情况需求认证大会员账号 |
例如请求1080P+的视频,则`qn=112`
## fnver视频流版本标识
目前该值恒为0`fnver=0`
## fnval视频流格式标识
该代码为二进制属性位,如需组合功能需要使用`OR`运算结合一下数值
| 值 | 含义 | 备注 |
|------|-------------|-------------------------------------------------------------|
| 0 | flv格式 | 仅H.264编码<br />部分老视频存在分段现象<br />与mp4格式及dash格式互斥 |
| 1 | mp4格式 | 仅H.264编码<br />不存在视频分段<br />与flv格式及dash格式互斥 |
| 16 | dash格式 | H.264编码或H.265编码<br />部分老视频的清晰度上限低于flv格式<br />与mp4格式及flv格式互斥 |
| 64 | 是否需求 HDR 视频 | 必须为dash格式<br />需要`qn=125`<br />大多情况需求认证大会员账号 |
| 128 | 是否需求 4K 分辨率 | 该值与`fourk`字段协同作用<br />需要`qn=120`<br />大多情况需求认证大会员账号 |
| 256 | 是否需求杜比音频 | 必须为dash格式<br />大多情况需求认证大会员账号 |
| 512 | 是否需求杜比视界 | 必须为dash格式<br />大多情况需求认证大会员账号 |
| 1024 | 是否需求 8K 分辨率 | 必须为dash格式<br />需要`qn=127`<br />大多情况需求认证大会员账号 |
| 2048 | 是否需求 av1 编码 | 必须为dash格式 |
例如请求dash格式且需要HDR的视频流`fnval=16|64=80`
## 视频编码代码
| 值 | 含义 | 备注 |
|-----|--------|----------|
| 7 | AVC编码 | 8K视频无此格式 |
| 12 | HEVC编码 | |
| 13 | AV1编码 | |
## 视频伴音音质代码
| 值 | 含义 |
|-------|------|
| 30216 | 64K |
| 30232 | 132K |
| 30280 | 192K |
## 获取番剧视频流URL
> https://api.bilibili.com/pgc/player/web/playurl
*请求方式GET*
认证方式CookieSESSDATA
---
关于视频流会员鉴权:
- 获取480P及以上清晰度视频时需要登录Cookie
- 获取高帧率1080P60/高码率1080P+视频时需要有大会员的账号登录Cookie
- 获取会员专属番剧视频时需要登录Cookie
---
获取的url有效时间为120min超时失效需要重新获取
**部分视频**会有**分段**,需要特别注意
若视频有分P仅为单P的视频的url换P则需更换cid重新获取
需要设置Referer为`https://www.bilibili.com`否则无法获取1080清晰度以上的流信息。
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|---------------|-----|----------|--------|--------------------------------------------------------------------------------------------------|
| avid | num | 稿件avid | 非必要 | |
| bvid | str | 稿件bvid | 非必要 | |
| ep_id | num | 稿件epid | 必要(可选) | ep_id与cid任选一个 |
| cid | num | 视频cid | 必要(可选) | ep_id与cid任选一个 |
| qn | num | 视频清晰度选择 | 非必要 | 未登录默认32480P<br />登录默认64720P<br />**值含义见上表**<br />dash方式无效 |
| fnval | num | 视频获取方式选择 | 非必要 | 默认为0<br />0 2flv方式可能会有分段<br />1低清mp4方式仅240P与360P且限速65K/s<br />16 80dash方式音视频分流支持H.265 |
| fnver | num | 0 | 非必要 | 固定为0 |
| fourk | num | 是否允许4K视频 | 非必要 | 默认为0<br />画质最高1080P0<br />画质最高4K1 |
| session | str | | 非必要 | 从视频播放页的网页源码中获取 |
| from_client | str | BROWSER | 非必要 | |
| drm_tech_type | num | 2 | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----------------------|------|------------------------------------|
| code | num | 返回值 | 0成功 <br />-400请求错误<br />-404无视频 |
| message | str | 错误信息 | 成功为success |
| result | 有效时obj<br />无效时null | 数据本体 | |
`result`对象:
| 字段 | 类型 | 内容 | 备注 |
|--------------------|-------|-----------------------------------|----------------------------|
| code | num | 0 | 作用尚不明确 |
| is_preview | num | 0 | 作用尚不明确 |
| fnver | num | 请求时提供的fnver | |
| fnval | num | 请求时提供的fnval | |
| video_project | bool | true | |
| type | str | 视频流类型DASH、FLV、MP4 | DASH |
| bp | num | 是否可以承包 | 0 |
| vip_type | num | 当前用户大会员类型 | |
| vip_status | num | 当前用户大会员状态 | |
| is_drm | bool | false | |
| no_rexcode | num | 0 | |
| has_paid | bool | false | |
| status | num | 2 | |
| from | str | local | 作用尚不明确 |
| result | str | suee | 作用尚不明确 |
| message | str | 空 | 作用尚不明确 |
| quality | num | 当前的视频分辨率代码 | **值含义见上表** |
| format | str | 视频格式 | |
| timelength | num | 视频长度 | 单位为毫秒<br />不同分辨率/格式可能有略微差异 |
| accept_format | str | 视频支持的全部格式 | 每项用`,`分隔 |
| accept_description | array | 视频支持的分辨率列表 | |
| accept_quality | array | 视频支持的分辨率代码列表 | **值含义见上表** |
| video_codecid | num | 默认选择视频流的编码id | 见**视频编码代码** |
| seek_param | str | 固定值start | 作用尚不明确 |
| seek_type | str | offsetdash、flv<br/> secondmp4 | 作用尚不明确 |
| durl | array | 视频分段 | **注仅flv/mp4存在此项** |
| dash | obj | dash音视频流信息 | **注仅dash存在此项** |
| support_formats | array | 支持格式的详细信息 | |
| clip_info_list | array | | 空,待补充 |
| record_info | obj | 备案登记信息 | |
`result`中的`accept_description`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|------------|-----|
| 0 | str | 分辨率名称1 | |
| n | str | 分辨率名称(n+1) | |
| …… | str | …… | |
`result`中的`accept_quality`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|------------|-----|
| 0 | str | 分辨率代码1 | |
| n | str | 分辨率代码(n+1) | |
| …… | str | …… | |
`result`中的`support_formats`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|---------------|-----|
| 0 | obj | 播放格式详细信息1 | |
| n | obj | 播放格式详细信息(n+1) | |
| …… | obj | …… | |
`support_formats`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
|-----------------|-------|---------|-----|
| quality | num | 视频清晰度代码 | |
| format | str | 视频格式 | |
| new_description | str | 格式描述 | |
| description | str | 格式描述 | |
| display_desc | str | 格式描述 | |
| superscript | str | (?) | |
| codecs | array | 编码格式列表 | |
| need_login | bool | 需要登录 | |
| need_vip | bool | 需要大会员 | |
`support_formats`中的`codecs`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|------|-----------------------------|
| 0 | str | 编码格式 | 如avc1.640032意为AVC编码 |
| 1 | str | 编码格式 | 如hev1.1.6.L153.90意为HEVC编码 |
`result`中的`record_info`对象:
| 项 | 类型 | 内容 | 备注 |
|-------------|-----|------|-----------------------|
| record_icon | str | 空串 | |
| record | str | 显示文案 | 登记号10417060172092207 |
---
**flv/mp4方式**
`result`中的`durl`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|-------------|------------------|
| 0 | obj | 视频分段1信息 | **注仅flv方式具有分段** |
| n | obj | 视频分段(n+1)信息 | |
| …… | obj | …… | |
`durl`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
|------------|-------|--------|-----------------------------------|
| order | num | 视频分段序号 | 某些视频会分为多个片段从1顺序增长 |
| length | num | 视频长度 | 单位为毫秒 |
| size | num | 视频大小 | 单位为Byte |
| vhead | str | 空 | 作用尚不明确 |
| url | str | 视频流url | **注url内容存在转义符**<br />有效时间为120min |
| backup_url | array | 备用视频流 | |
`durl`数组中的对象中的`backup_url`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|----------------|-----------------------------------|
| 0 | str | 备用视频流url 1 | **注url内容存在转义符**<br />有效时间为120min |
| n | str | 备用视频流url (n+1) | |
| …… | str | …… | |
**示例:**
**视频无分段时:**
获取视频`ep85046`/`av2325306`中的1Pcid=`3629601`的视频流url清晰度为480p使用flv方式获取
avid/epid方式
```shell
curl -G 'https://api.bilibili.com/pgc/player/web/playurl' \
--data-urlencode 'avid=2325306' \
--data-urlencode 'cid=3629601' \
--data-urlencode 'ep_id=85046' \
-b 'SESSDATA=xxx'
```
https://api.bilibili.com/pgc/player/web/playurl?avid=2325306&cid=3629601&ep_id=85046
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "success",
"result": {
"accept_format": "flv480,mp4",
"code": 0,
"seek_param": "start",
"is_preview": 0,
"fnval": 0,
"video_project": true,
"fnver": 0,
"type": "FLV",
"bp": 0,
"result": "suee",
"seek_type": "offset",
"from": "local",
"video_codecid": 7,
"record_info": {
"record_icon": "",
"record": ""
},
"durl": [
{
"size": 111138876,
"ahead": "",
"length": 1394090,
"vhead": "",
"backup_url": [
"https://upos-sz-mirrorcoso1.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=coso1bv&oi=2946990771&trid=a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=878be08cc0e6bdea705952529e7e6785&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&agrr=1&bw=79726&logo=40000000",
"https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=cosbv&oi=2946990771&trid=a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=8c31064c84d8e981704815992cfe315c&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=2,3&agrr=1&bw=79726&logo=40000000"
],
"url": "https://cn-lnsy-cu-v-02.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=bcache&oi=2946990771&trid=0000a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=7a5c4f25b9056359127191390a73bedc&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&cdnid=3281&bvc=vod&nettype=0&orderid=0,3&agrr=1&bw=79726&logo=80000000",
"order": 1,
"md5": ""
}
],
"no_rexcode": 0,
"format": "flv480",
"support_formats": [
{
"display_desc": "480P",
"superscript": "",
"codecs": [ ],
"format": "flv480",
"description": "清晰 480P",
"quality": 32,
"new_description": "480P 清晰"
},
{
"display_desc": "360P",
"superscript": "",
"codecs": [ ],
"format": "mp4",
"description": "流畅 360P",
"quality": 16,
"new_description": "360P 流畅"
}
],
"message": "",
"accept_quality": [
32,
16
],
"quality": 32,
"timelength": 1394090,
"has_paid": false,
"clip_info_list": [ ],
"accept_description": [
"清晰 480P",
"流畅 360P"
],
"status": 2
}
}
```
</details>
## 视频的取流web端及APP端
**注意:**
1. 如flv模式则可能产生分段情况`$.data.durl[1-n].url``$.data.durl[1-n].backup_url[0]`中的内容作为url进行GET操作, 如果有多个视频, 需要手动合并处理
2. 如mp4模式则需要获取对应的视频流方法同上
3. 如dash模式则需要同时获取对应的视频流和伴音流方法同上
4. web端取流需要验证防盗链`referer``.bilibili.com`域名下且UA不能为空app端也需要验证防盗链即UA需要含有`Mozilla/5.0 BiliDroid/*.*.* (bbcallen@gmail.com)`*为版本);如`referer`或UA错误的情况会被判定为盗链返回403 Forbidden故无法取流
5. **注意unicode转义符**
以上述视频流url为例
```shell
wget 'https://upos-sz-mirrorhwo1.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098026&gen=playurlv2&os=hwo1bv&oi=0&trid=f0a1d2d854264369803462f3dd524154p&mid=0&platform=pc&upsig=76c1438153942fda51fbf4eb07e6e5a1&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=0,2&agrr=1&bw=79726&logo=80000000' \
--referer 'https://www.bilibili.com' \
-O 'Download_video.flv'
```
响应正文将返回一个flv文件

304
docs/blackroom/banlist.md Normal file
View File

@@ -0,0 +1,304 @@
# 封禁公示
- [获取封禁用户公示列表](#获取封禁用户公示列表)
- [封禁处理公示详情](#封禁处理公示详情)
---
###### 表1已知的封禁原因类型代码总览
| 代码 | 含义 |
| ---- | -------------------- |
| 1 | 刷屏 |
| 2 | 抢楼 |
| 3 | 发布色情低俗信息 |
| 4 | 发布赌博诈骗信息 |
| 5 | 发布违禁相关信息 |
| 6 | 发布垃圾广告信息 |
| 7 | 发布人身攻击言论 |
| 8 | 发布侵犯他人隐私信息 |
| 9 | 发布引战言论 |
| 10 | 发布剧透信息 |
| 11 | 恶意添加无关标签 |
| 12 | 恶意删除他人标签 |
| 13 | 发布色情信息 |
| 14 | 发布低俗信息 |
| 15 | 发布暴力血腥信息 |
| 16 | 涉及恶意投稿行为 |
| 17 | 发布非法网站信息 |
| 18 | 发布传播不实信息 |
| 19 | 发布怂恿教唆信息 |
| 20 | 恶意刷屏 |
| 21 | 账号违规 |
| 22 | 恶意抄袭 |
| 23 | 冒充自制原创 |
| 24 | 发布青少年不良内容 |
| 25 | 破坏网络安全 |
| 26 | 发布虚假误导信息 |
| 27 | 仿冒官方认证账号 |
| 28 | 发布不适宜内容 |
| 29 | 违反运营规则 |
| 30 | 恶意创建话题 |
| 31 | 发布违规抽奖 |
| 32 | 恶意冒充他人 |
###### 表2已知的违规类型代码
| 代码 | 含义 |
| ---- | -------- |
| 0 | 全部类型 |
| 1 | 评论 |
| 2 | 弹幕 |
| 3 | 私信 |
| 4 | 标签 |
| 5 | 个人资料 |
| 6 | 投稿 |
| 8 | 专栏 |
| 10 | 动态 |
| 11 | 相簿 |
## 获取封禁用户公示列表
> https://api.bilibili.com/x/credit/blocked/list
*请求方式GET*
每页最多10项
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ------------------------------------------------------------ |
| btype | num | 来源筛选 | 非必要 | 空:全部类型<br />`0`:系统封禁<br />`1`:风纪仲裁(仲裁系统升级后此类型已不再更新) |
| otype | num | 类型筛选 | 非必要 | **见[表2](#表2已知的违规类型代码)**<br />默认为`0`:全部类型 |
| pn | num | 页码 | 非必要 | 默认为`1` |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------ |
| code | num | 返回值 | `0`:成功 |
| message | str | 错误信息 | 默认为`0` |
| ttl | num | `1` | |
| data | array | 公示列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ------ | --------------- | ---- |
| 0 | object | 封禁公示1 | |
| n | object | 封禁公示n+1 | |
| …… | object | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------- | ---- | ---------------- | ------------------------------------------- |
| id | num | 封禁公示id | |
| uname | str | 对象用户名 | |
| face | str | 对象用户头像url | |
| uid | num | 对象用户mid | |
| originTitle | str | 来源标题 | |
| blockedRemark | str | | |
| originUrl | str | 来源url | |
| originContentModify | str | 裁决正文 | |
| originType | num | 来源类型 | **见[表2](#表2已知的违规类型代码)** |
| originTypeName | str | 来源名 | |
| punishTitle | str | 公示标题 | |
| punishTime | num | 处罚时间 | 时间戳 |
| punishType | num | 处理手段类型 | `2`:封禁<br />`3`:永久封禁 |
| punishTypeName | str | 处理手段名 | |
| moralNum | num | `0`节操值 | 被封禁用户节操值均为`0` |
| blockedDays | num | 封禁天数 | 永封为`0` |
| publishStatus | num | `1` | 作用尚不明确 |
| blockedType | num | 处理来源 | `0`:系统封禁<br />1风纪仲裁 |
| blockedForever | num | 是否永封 | `0`:非永封<br />`1`:永封 |
| reasonType | num | 封禁原因类型 | **见[表1](#表1已知的封禁原因类型代码总览)** |
| reasonTypeName | str | 封禁原因类型名称 | |
| operatorName | str | 空 | 作用尚不明确 |
| caseId | num | 仲裁信息id | 系统封禁时固定为0 |
| ctime | num | 创建时间 | 时间戳 |
| commentSum | num | 该条目评论数 | |
**示例:**
查询所有类型所有来源的第1页的封禁公示列表
```shell
curl -G 'https://api.bilibili.com/x/credit/blocked/list' \
--data-urlencode 'btype=' \
--data-urlencode 'otype=0' \
--data-urlencode 'pn=1'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [{
"id": 1118220,
"uname": "漫城林语",
"face": "http://i2.hdslb.com/bfs/face/970f2da4a58f83879e69e259f4a9d3587cba03f0.jpg",
"uid": 135913,
"originTitle": "【罗翔】聊聊网络喷子与键盘侠",
"blockedRemark": "内容涉及人身攻击",
"originUrl": "https://www.bilibili.com/video/av752825895",
"originContentModify": "<p>案情:</p><p>1、大量刷屏/引战</p><p>我看新闻了竹鼠全部被ZF无害化处理了看的爽死我了亏死你们啊哈哈哈x10</p><p>【BV16g4y187he2020-4-21 104623104647】</p><p>2、大量人身攻击</p><p>N * * L</p><p>Deine Mu**er ist tot. x10</p><p>【BV1rk4y1R7id2020-4-21 203108203223】</p><p>3、引战</p><p>每次看他厨房乱七八糟的可能有数不清的小强你们还看美食看的有味也是奇PA</p><p>【BV1Kg4y1z7mA2020-4-22&nbsp; 005237】<br/></p><p>批注:</p><p>满地狼藉招摇过,人皆愤懑怒拳握。</p><p>余恶不堪漏夜扫,正气于心涤龌龊。</p><p><br/></p><p>(发现违规引战、人身攻击、刷屏评论,请按照相应分类进行举报。若发现反复进行上述行为,可联系工作人员反馈相关违规账号信息,我们会予以排查。)</p><p>(案例感想请发布在小黑屋评论区讨论,请勿骚扰被封禁的用户)</p><p>【本次判罚为管理员判定,请注意案件右上无蓝色标记(风纪委员众裁)】</p><p><br/></p>",
"originType": 1,
"originTypeName": "评论",
"punishTitle": "在评论中发布人身攻击言论",
"punishTime": 1587494264,
"punishType": 3,
"punishTypeName": "永久封禁",
"moralNum": 0,
"blockedDays": 0,
"publishStatus": 1,
"blockedType": 0,
"blockedForever": 1,
"reasonType": 7,
"reasonTypeName": "发布人身攻击言论",
"operatorName": "",
"caseId": 0,
"ctime": 1587494264,
"commentSum": 606
}, {
"id": 1091621,
"uname": "风纪委员会会长零八",
"face": "http://i1.hdslb.com/bfs/face/6ea4296f7591b9a724f540a41d48df728a0881b0.jpg",
"uid": 305542374,
"originTitle": "巅峰赛大乔游走辅助,队友说自家法师湖南卫视都不敢像法师这么演哈哈!",
"blockedRemark": "内容涉及传播不实信息",
"originUrl": "https://www.bilibili.com/video/av882552073",
"originContentModify": "<p>具体违规情况说明:</p><ol class=\" list-paddingleft-2\" style=\"list-style-type: decimal;\"><li><p>经查实确认,该账号<span style=\"text-decoration: underline;\">从未申请</span>亦<span style=\"text-decoration: underline;\">从未担任</span>过风纪委员职务。</p></li><li><p>发布多条 “您的稿件/评论涉及违规,即将下架/删除”的恐吓性言论。</p></li><li><p>谎称曾经封禁了某个up主事实上风纪委员<span style=\"text-decoration: underline;\">无法封禁up主投稿</span>且该up也从未被封禁。</p></li><li><p>威胁他人“要不要到小黑屋坐坐”,事实上风纪委员无法直接封禁用户。通过管理员封禁或风纪委员投票封禁的账号亦有据实申诉的机会。</p></li><li><p>故意挑衅他人“那你可以试着骂我,我们试试(举报)有没有用”。</p></li><li><p>误导他人“此评论区和弹幕无需保持礼仪”。</p></li></ol><p>批注:</p><p>如您发现假冒风纪委员身份招摇撞骗、炫耀风纪委员身份、借风纪委员职务之便威胁恐吓他人、在风纪观点中发布违规内容等违规行为请及时联系我们进行举报。您可直接将举报材料发送至judgement@bilibili.com。</p><p>(案例感想请发布在小黑屋评论区讨论,请勿骚扰被封禁的用户)</p><p>【本次判罚为管理员判定,请注意案件右上无蓝色标记(风纪委员众裁)】</p>",
"originType": 1,
"originTypeName": "评论",
"punishTitle": "在评论中发布传播不实信息",
"punishTime": 1585560309,
"punishType": 2,
"punishTypeName": "封禁",
"moralNum": 0,
"blockedDays": 15,
"publishStatus": 1,
"blockedType": 0,
"blockedForever": 0,
"reasonType": 18,
"reasonTypeName": "发布传播不实信息",
"operatorName": "",
"caseId": 0,
"ctime": 1585560309,
"commentSum": 2379
},
…………
]
}
```
</details>
## 封禁处理公示详情
> https://api.bilibili.com/x/credit/blocked/info
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------- | ------ | ---- |
| id | num | 封禁公示id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-404无此信息 |
| message | str | 错误信息 | 默认为`0` |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------- | ---- | ---------------- | ------------------------------------------- |
| id | num | 封禁公示id | |
| uname | str | 对象用户名 | |
| face | str | 对象用户头像url | |
| uid | num | 对象用户mid | |
| originTitle | str | 来源标题 | |
| blockedRemark | str | | |
| originUrl | str | 来源url | |
| originContentModify | str | 裁决正文 | |
| originType | num | 来源类型 | **见[表2](#表2已知的违规类型代码)** |
| originTypeName | str | 来源名 | |
| punishTitle | str | 公示标题 | |
| punishTime | num | 处罚时间 | 时间戳 |
| punishType | num | 处理手段类型 | `2`:封禁<br />`3`:永久封禁 |
| punishTypeName | str | 处理手段名 | |
| moralNum | num | `0`节操值 | 被封禁用户节操值均为`0` |
| blockedDays | num | 封禁天数 | 永封为`0` |
| publishStatus | num | `1` | 作用尚不明确 |
| blockedType | num | 处理来源 | `0`:系统封禁<br />`1`:风纪仲裁 |
| blockedForever | num | 是否永封 | `0`:非永封<br />`1`:永封 |
| reasonType | num | 封禁原因类型 | **见[表1](#表1已知的封禁原因类型代码总览)** |
| reasonTypeName | str | 封禁原因类型名称 | |
| operatorName | str | 空 | 作用尚不明确 |
| caseId | num | 仲裁信息id | 系统封禁时固定为0 |
| ctime | num | 创建时间 | 时间戳 |
| commentSum | num | 该条目评论数 | |
**示例:**
查询公示id为`1091621`的公示详情
```shell
curl -G 'https://api.bilibili.com/x/credit/blocked/info' \
--data-urlencode 'id=1091621'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 1091621,
"uname": "风纪委员会会长零八",
"face": "http://i1.hdslb.com/bfs/face/6ea4296f7591b9a724f540a41d48df728a0881b0.jpg",
"uid": 305542374,
"originTitle": "巅峰赛大乔游走辅助,队友说自家法师湖南卫视都不敢像法师这么演哈哈!",
"blockedRemark": "内容涉及传播不实信息",
"originUrl": "https://www.bilibili.com/video/BV1qK4y1C7dd",
"originContentModify": "<p>具体违规情况说明:</p><ol class=\" list-paddingleft-2\" style=\"list-style-type: decimal;\"><li><p>经查实确认,该账号<span style=\"text-decoration: underline;\">从未申请</span>亦<span style=\"text-decoration: underline;\">从未担任</span>过风纪委员职务。</p></li><li><p>发布多条 “您的稿件/评论涉及违规,即将下架/删除”的恐吓性言论。</p></li><li><p>谎称曾经封禁了某个up主事实上风纪委员<span style=\"text-decoration: underline;\">无法封禁up主投稿</span>且该up也从未被封禁。</p></li><li><p>威胁他人“要不要到小黑屋坐坐”,事实上风纪委员无法直接封禁用户。通过管理员封禁或风纪委员投票封禁的账号亦有据实申诉的机会。</p></li><li><p>故意挑衅他人“那你可以试着骂我,我们试试(举报)有没有用”。</p></li><li><p>误导他人“此评论区和弹幕无需保持礼仪”。</p></li></ol><p>批注:</p><p>如您发现假冒风纪委员身份招摇撞骗、炫耀风纪委员身份、借风纪委员职务之便威胁恐吓他人、在风纪观点中发布违规内容等违规行为请及时联系我们进行举报。您可直接将举报材料发送至judgement@bilibili.com。</p><p>(案例感想请发布在小黑屋评论区讨论,请勿骚扰被封禁的用户)</p><p>【本次判罚为管理员判定,请注意案件右上无蓝色标记(风纪委员众裁)】</p>",
"originType": 1,
"originTypeName": "评论",
"punishTitle": "在评论中发布传播不实信息",
"punishTime": 1585560309,
"punishType": 2,
"punishTypeName": "封禁",
"moralNum": 0,
"blockedDays": 15,
"publishStatus": 1,
"blockedType": 0,
"blockedForever": 0,
"reasonType": 18,
"reasonTypeName": "发布传播不实信息",
"operatorName": "",
"caseId": 0,
"ctime": 1585560309,
"commentSum": 2379
}
}
```
</details>

View File

@@ -0,0 +1,367 @@
# 仲裁操作
- [申请加入风纪委员会](#申请加入风纪委员会)
- [拉取新案件](#拉取新案件)
- [进行仲裁投票](#进行仲裁投票)
---
## 申请加入风纪委员会
> https://api.bilibili.com/x/credit/v2/jury/apply
*请求方式POST*
认证方式Cookie
只有用户会员90天内无违规、实名认证且非封禁状态才可以申请加入风纪委员会
申请成功后可获得30天资格
**正文参数( application/x-www-form-urlencoded**
| 参数名 | 类型 | 内容 | 必要性 |
| ------ | ---- | ---------------------- | ------ |
| csrf | str | cookie中`bili_jct`的值 | 必要 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------ | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf 校验失败<br />25001申请等级限制(会员等级<3)<br />25002没有实名认证<br />2500390天内有封禁记录<br />25013不能重复申请风纪委资格<br />25016当日风纪委员名额已发完 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
#### 旧API
<details>
<summary>查看旧版API</summary>
> https://api.bilibili.com/x/credit/jury/apply
*请求方式POST*
认证方式CookieSESSDATA或APP
只有用户会员等级≥Lv4、90天内无违规、实名认证且非封禁状态才可以申请加入风纪委员会
每日10:00开放新名额
申请成功后可获得30天资格
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------ | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf 校验失败<br />25001申请等级限制(会员等级<3)<br />25002没有实名认证<br />2500390天内有封禁记录<br />25013不能重复申请风纪委资格<br />25016当日风纪委员名额已发完 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
Cookie方式
```shell
curl 'https://api.bilibili.com/x/credit/jury/apply' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl 'https://api.bilibili.com/x/credit/jury/apply' \
--data-urlencode 'access_key=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
</details>
## 拉取新案件
> https://api.bilibili.com/x/credit/v2/jury/case/next
*请求方式GET*
认证方式Cookie
**标头参数Headers**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------ | ------ | ---- |
| Cookie | str | Cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br/>25006风纪委员资格已过期<br />25008没有案件<br/>25014已审满 |
| message | str | 信息 | 默认为0当code不为0时显示错误信息 |
| ttl | num | 1 | 作用尚不明确 |
| data | object | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ---------- | ---- |
| case_id | str | 仲裁案件id | |
**示例:**
Cookie方式
```shell
curl -G 'https://api.bilibili.com/x/credit/v2/jury/case/next' \
--header 'cookie: XXXXX'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"case_id": "AC2m4HlrIrHv"
}
}
```
</details>
#### 旧API
<details>
<summary>查看旧版API</summary>
> https://api.bilibili.com/x/credit/jury/caseObtain
*请求方式POST*
认证方式CookieSESSDATA或APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br/>25005不是风纪委员<br />25008没有案件<br/>25014已审满 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | object | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------- | ---- |
| id | num | 仲裁案件id | |
**示例:**
Cookie方式
```shell
curl 'https://api.bilibili.com/x/credit/jury/caseObtain' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl 'https://api.bilibili.com/x/credit/jury/caseObtain' \
--data-urlencode 'access_key=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 1239790
}
}
```
</details>
</details>
## 进行仲裁投票
> https://api.bilibili.com/x/credit/v2/jury/vote
*请求方式POST*
认证方式Cookie
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | ---------------------- | ------ | ----------------------------------------------------- |
| case_id | str | 案件id | 必要 | |
| vote | num | 投票类型 | 必要 | 见「[众裁信息](judgement_info.md)」中表 |
| insiders | num | 是否观看此类视频 | 非必要 | 默认值为0<br/>见「[众裁信息](judgement_info.md)」中表 |
| content | str | 理由 | 非必要 | |
| anonymous | num | 是否匿名 | 非必要 | 默认值为0<br/>0不匿名<br />1匿名 |
| csrf | str | cookie中`bili_jct`的值 | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------ | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br/>-101未登录<br />-111csrf 错误<br />-400请求错误投票类型错误<br />25005不是风纪委员<br />25011投票类型错误<br />25018不能进行此操作<br/><br/>*注:新版本对于一个不存在的`case_id`,不会报错。* |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
#### 旧API
<details>
<summary>查看旧版API</summary>
> https://api.bilibili.com/x/credit/jury/vote
*请求方式POST*
认证方式CookieSESSDATA或APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------- | ---- | ------------------------ | -------------- | --------------------------------------- |
| cid | num | 案件id | 必要 | |
| vote | num | 投票类型 | 必要 | 见「[众裁信息](judgement_info.md)」中表 |
| content | str | 理由 | 非必要 | 见「[众裁信息](judgement_info.md)」中表 |
| likes | nums | 支持的观点 | 非必要 | |
| hates | nums | 反对的观点 | 非必要 | |
| attr | num | 是否匿名 | 非必要 | 0匿名<br />1不匿名 |
| apply_type | num | 是否更改原因 | 非必要 | 0保持原来原因<br />1投票给新原因 |
| origin_reason | num | 原始原因 | 非必要 | 见「封禁公示」中表 |
| apply_reason | num | 新原因 | 非必要 | 见「封禁公示」中表 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------ | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br/>-101未登录<br />-111csrf 错误<br />-400请求错误投票类型错误<br />25005不是风纪委员<br />25009 案件不存在<br/>25011投票类型错误<br />25012重复投票 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
**示例:**
为案件`2333`投票,建议封禁,无理由,不匿名,无支持/反对观点,不修改投票原因
Cookie方式
```shell
curl 'https://api.bilibili.com/x/credit/jury/vote' \
--data-urlencode 'cid=2333' \
--data-urlencode 'vote=1' \
--data-urlencode 'content=' \
--data-urlencode 'likes=' \
--data-urlencode 'hates=' \
--data-urlencode 'attr=1' \
--data-urlencode 'apply_type=0' \
--data-urlencode 'origin_reason=' \
--data-urlencode 'apply_reason=' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl 'https://api.bilibili.com/x/credit/jury/vote' \
--data-urlencode 'access_key=xxx' \
--data-urlencode 'cid=2333' \
--data-urlencode 'vote=1' \
--data-urlencode 'content=' \
--data-urlencode 'likes=' \
--data-urlencode 'hates=' \
--data-urlencode 'attr=1' \
--data-urlencode 'apply_type=0' \
--data-urlencode 'origin_reason=' \
--data-urlencode 'apply_reason='
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
</details>

View File

@@ -0,0 +1,338 @@
# 风纪委员会用户基本信息
- [基本数据](#基本数据)
- [统计信息](#统计信息)
- [新API2021年10月任期之后](#新api2021年10月任期之后)
- [旧API](#旧api)
- [检查申请风纪委员会资格](#检查申请风纪委员会资格)
---
## 基本数据
> https://api.bilibili.com/x/credit/v2/jury/jury
_请求方式GET_
认证方式CookieSESSDATA或 APP
**url 参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | -------------- | ------------ | ---- |
| access_key | str | APP 登录 Token | APP 方式必要 | |
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 信息 | 默认为 0 |
| ttl | num | 1 | |
| data | object | 数据本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ------------ | -------------------------------------------------------------------------------------------------- |
| allow_apply | bool | true | 尚不明确(用户从未担任风纪委员时也为 true |
| apply_status | num | 任期审核状态 | -1 资格失效,且未申请<br />0 刚申请连任时<br />5 申请后,等待审核<br />3 申请连任成功status 为 1 |
| case_total | num | 总众裁数 | |
| err_msg | str | 空 | 尚不明确 |
| face | str | 用户头像 url | |
| status | num | 当前资格状态 | 0 未曾拥有资格<br />1 任期内<br />2 资格失效 |
| term_end | num | 任期结束时间 | 时间戳(秒级),无任期时为 0 |
| uname | str | 用户昵称 | |
**旧API**
部分字段信息停留在 2021 年 10 月。
<details>
<summary>查看旧 api</summary>
> https://api.bilibili.com/x/credit/jury/jury (旧)
根数据与新 API 一致,`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | -------------------- | ---------------------------- |
| caseTotal | num | 总众裁数 | |
| face | str | 用户头像 url | |
| restDays | num | 当前资格剩余天数 | 自 2021 年 10 月起,固定为 0 |
| rightRadio | num | 当前裁决正确率百分比 | 裁决数小于 3 时固定为 50 |
| status | num | 当前状态 | 1具有资格<br />2资格失效 |
| uname | str | 用户昵称 | |
</details>
## 统计信息
#### 新API2021年10月任期之后
>https://api.bilibili.com/x/credit/v2/jury/kpi
*方式GET*
认证方式Cookie
***备注**该api只收录2021年10月开始风纪委员改版之后的数据且每次只返回一次任期的数据。*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------- | ---- | ------- | ------------ | -------------------------------------- |
| term_id | num | 任期 id | 可不传此参数或将值留空或设为`0` | 未传参或留空时,**只**返回最近一次已结束的任期的数据 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />25018不能进行此操作还没有成为新风纪委员或传入了不属于你的`term_id` |
| message | str | 信息 | 默认为 0 |
| ttl | num | 1 | |
| data | object | 数据本体 | |
`data` 对象:
| 项 | 类型 | 内容 | 备注 |
| --------------- | ------ | ------------------ | ------------------------------------------------------------ |
| mid | num | 用户 UID | |
| uname | str | 留空 | |
| face | str | 留空 | |
| term_id | num | 任期 ID | 未传入`term_id`返回的是最近一次已结束的任期的id |
| term_start | num | 任期开始时间 | 时间戳,精确到秒 |
| term_end | num | 任期结束时间 | 时间戳,精确到秒 |
| case_total | num | 任内总投票数 | |
| active_days | num | 活跃天数 | |
| like_num | num | 发表观点,被点赞数 | |
| accuracy_rate | num | 投中率 | 所选观点与大多数风纪委员一致,记为一次“投中” |
| pass | num | 任期是否合格 | 0 不合格<br />1 合格 |
| status | num | 当前资格状态 | 0 未曾拥有资格<br />1 任期内<br />2 资格失效 |
| apply_status | num | 当前资格申请状态 | -1 资格失效,且未申请<br />0 刚申请连任时<br />5 申请后,等待审核<br />3 申请连任成功status 为 1 |
| prev_term_id | num | 上一任期的任期 ID | 新版风纪委员启用后的第一个任期,此项的值为 0 |
| next_term_id | num | 下一任期的任期 ID | 若当前任期尚未结束,此项的值为 0 |
| rewards | object | 任期奖励 | 有`pendant``coin`两个子项 |
| rewards.pendant | num | 头像挂件礼包 ID | 合格后一般为 1不合格为 0 |
| rewards.coin | num | 硬币礼包 ID | 合格后一般为 3不合格为 0 |
<details>
<summary>查看响应示例:</summary>
注:本示例未传入`term_id`,返回的是最近一次已结束任期的统计结果
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"mid": 10001,
"uname": "",
"face": "",
"term_id": 300009,
"term_start": 1669100000,
"term_end": 1671690000,
"case_total": 591,
"active_days": 30,
"like_num": 0,
"accuracy_rate": 74,
"pass": 1,
"status": 1,
"apply_status": 3,
"prev_term_id": 300007,
"next_term_id": 0,
"rewards": {
"pendant": 1,
"coin": 3
}
}
}
```
</details>
#### 旧API
<details>
<summary>查看旧 api</summary>
> https://api.bilibili.com/x/credit/jury/kpi (旧)
*方式GET*
认证方式CookieSESSDATA或APP
***备注**该api只统计到2021年9月任期风纪委员改版之前。风纪委员改版之后的数据未收录*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
| data | array | 数据本体 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | ---- |
| 0 | obj | 第1个月统计 | |
| n | obj | 第n+1个月统计 | |
| …… | obj | …… | …… |
`data` 数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | -------------------------------- | --------------------- |
| id | num | 0 | |
| mid | num | 用户id | |
| number | num | 风纪委员编号 | |
| day | num | 数据生成时间(也是任期结束时间) | 时间戳,精确到秒 |
| rate | num | 任期完成度 | 1=A2=S3=S+4=S++ |
| rank | num | 尚不明确 | |
| rankper | num | 尚不明确 | |
| rankTotal | num | 尚不明确 | |
| point | num | 32767 | |
| activeDays | num | 活跃天数 | |
| voteTotal | num | 投票总数 | |
| voteRadio | num | 投中率 | |
| blockedTotal | num | 尚不明确 | |
| termStart | num | 任期开始时间 | 时间戳,精确到秒 |
| termEnd | num | 任期结束时间(数据生成时间一致) | 时间戳,精确到秒 |
| opinion_likes | num | 观点获赞 | |
**示例:**
Cookie方式
```shell
curl 'https://api.bilibili.com/x/credit/jury/kpi' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl -G 'https://api.bilibili.com/x/credit/jury/kpi' \
--data-urlencode 'access_key=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"id": 0,
"mid": 114343368,
"number": 199046,
"day": 1539792000,
"rate": 1,
"rank": 0,
"rankper": 1,
"rankTotal": 39584,
"point": 32767,
"activeDays": 23,
"voteTotal": 422,
"voteRadio": 0,
"blockedTotal": 0,
"termStart": 1537200000,
"termEnd": 1539792000,
"opinion_likes": 18
}
]
}
```
</details>
</details>
## 检查申请风纪委员会资格
> ~~https://api.bilibili.com/x/credit/jury/requirement~~ (旧版)
> https://api.bilibili.com/x/credit/v2/jury/requirement (新版)
*请求方式GET*
认证方式CookieSESSDATA或APP
新版 api 与旧版的区别仅在新版没有 `level` 字段(新版风纪委员没有等级限制)。
只有用户~~会员等级≥Lv4、~~ 90 天内无违规、实名认证且非封禁状态才可以申请加入风纪委员会。
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
| data | object | 数据本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ---------------- | ------------------------------------- |
| blocked | bool | 是否被封禁 | true<br />false<br />**下同** |
| cert | bool | 是否实名认证 | |
| level | bool | 等级是否>=4 | 新版无该字段 |
| rule | bool | 是否90天内无违规 | |
**示例:**
Cookie方式
```shell
curl 'https://api.bilibili.com/x/credit/v2/jury/requirement' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl -G 'https://api.bilibili.com/x/credit/v2/jury/requirement' \
--data-urlencode 'access_key=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"blocked": false,
"cert": true,
"rule": true
}
}
```
</details>

View File

@@ -0,0 +1,998 @@
# 众裁信息
- [查询投票过的单个案件](#查询投票过的单个案件)
- [查询案件众裁信息](#查询案件众裁信息)
- [查询我的众裁记录](#查询我的众裁记录)
- [获取众议观点](#获取众议观点)
---
<table>
<tr>
<th colspan="3">投票类型码总览</th>
</tr >
<tr>
<td>代码</td>
<td>含义</td>
</tr>
<tr>
<td >0</td>
<td>未投票</td>
</tr>
<tr>
<td >1</td>
<td>封禁</td>
</tr>
<tr>
<td>2</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>弃权</td>
</tr>
<tr>
<td>4</td>
<td>删除</td>
</tr>
</table>
<table>
<tr>
<th colspan="3">投票选项码总览</th>
</tr >
<tr>
<td >任务类型</td>
<td>代码</td>
<td>含义</td>
</tr>
<tr >
<td rowspan="4">单条评论(弹幕)</td>
<td >1</td>
<td>合适</td>
</tr>
<tr>
<td>2</td>
<td>一般</td>
</tr>
<tr>
<td>3</td>
<td>不合适</td>
</tr>
<tr>
<td>4</td>
<td>无法判断</td>
</tr>
<tr>
<td rowspan="4">评论(弹幕)氛围</td>
<td>11</td>
<td></td>
</tr>
<tr>
<td>12</td>
<td>一般</td>
</tr>
<tr>
<td>13</td>
<td></td>
</tr>
<tr>
<td>14</td>
<td>无法判断</td>
</tr>
</table>
## 查询投票过的单个案件
> https://api.bilibili.com/x/credit/v2/jury/case/info
*请求方式GET*
认证方式CookieSESSDATA或APP
可查询任意案件,无论自己是否参与投票。
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ------------ | ------ | ------------- | ------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| case_id | str | 案件id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
| data | object | 数据本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ------ | -------- | ------------ |
| case_id | str | 案件id | |
| case_type | num | 任务类型 | 1单条评论<br />2评论氛围<br />3单条弹幕<br />4弹幕氛围 |
| jury_state | num | `1` | 改版后未见过其它值 |
| participate | num | 是否投票 | 0未投票<br />1已投票 |
| vote_items | object | 投票选项 | 见开头「投票选项码总览」 |
| default_vote | num | 默认投票选项 | `4``14``无法判断` |
| status | num | 裁决状态(新版) | 0进行中<br />1已结束 |
| origin_start | num | 案件关联视频,播放进度条起始坐标 | 单位:`秒` |
| avid | num | 视频av号 | |
| cid | num | 弹幕池id | 弹幕相关参见「[xml弹幕](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/danmaku/danmaku_xml.md)」 |
| vote_cd | num | `-1` | 暂不明确 |
| result | num | 众议结论 | 见开头「投票选项码总览」 |
| result_text | str | 众议结论文本 | |
| title | str | 视频标题 | |
| case_info | object | 案件信息 | 见「[附表1](#附表1data-对象下的case_info对象)」 |
| my_point | object | 我的观点 | 见「[附表4](#附表4data-对象下的my_point对象)」 |
| vote_info | object | 投票信息 | 见「[附表5](#附表5data-对象下的vote_info对象)」 |
###### 附表1`data` 对象下的`case_info`对象
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ------ | ------------ | ------------------------------------------------------------ |
| comment | object | 单条评论信息 | 仅当`case_type``1`有值。见「[附表2](#附表2评论信息)」 |
| danmu_img | str | 弹幕截图 | 仅当`case_type``4`有值截图URL |
| comments | object | 若干条评论 | 仅当`case_type``2`有值。见「[附表2](#附表2评论信息)」 |
| single_danmu | str | 单条弹幕信息 | 仅当`case_type``3`有值。见「[附表3](#附表3弹幕信息)」 |
###### 附表2评论信息
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ---- | ---- |
| mid | num | 用户uid | |
| uname | str | 用户名 | |
| face | str | 用户头像 | 头像URL |
| content | str | 评论内容 | |
| child_comments | object | 子评论(对该评论的回复) | 见「[附表2](#附表2评论信息)」,单条评论和子评论下无`child_comments`字段 |
###### 附表3弹幕信息
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ------------------------------------------------------------ |
| id_str | str | 弹幕dmid | 见「[xml弹幕](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/danmaku/danmaku_xml.md#%E5%B1%9E%E6%80%A7-p)」 |
| content | str | 弹幕内容 | |
| progress | num | | 尚不明确 |
###### 附表4`data` 对象下的`my_point`对象
记录了某个风纪委员的某个投票(观点)信息
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ---------------- | ------------------------------------------------------------ |
| opid | num | 观点编号 | 每当某个一个风纪委员给某个仲裁案件发表观点,就+1 |
| mid | num | 风纪委员用户ID | |
| uname | str | 风纪委员用户名 | 风纪委勾选匿名投票则显示“匿名用户” |
| face | str | 头像URL | 头像 |
| vote | num | 投票选项 | “合适题”分别为 `1` 或者 `2` 或者 `3` 或者 `4`<br/>对应:“合适”、“一般”、“不合适”、“无法判断”<br/><br/>“氛围题”分别为 `11` 或者 `12` 或者 `13` 或者 `14`<br/>对应:“好”、“一般”、“差”、“无法判断”<br/><br/>注释<br/>合适题:“单条弹幕(评论)是否合适?”<br/>氛围题:“弹幕(评论区)氛围如何” |
| vote_text | | 内容为空 | *现在系统已不再展示其他风纪委所投的票* |
| content | str | 观点内容 | 该风纪委员所发表的观点内容 |
| anonymous | num | 0 | 尚不明确 |
| like | num | 被点赞数量 | |
| hate | num | 被点踩数量 | |
| like_status | num | 点赞(踩)状态 | 本账号是否给该条评论点赞:<br/>0没做操作1给评论点赞2给评论点踩 |
| vote_time | num | 投票时间 | 时间戳,精确到秒 |
| insiders | num | 是否观看此类视频 | 1平时观看此类视频0平时不观看此类视频 |
###### 附表5`data` 对象下的`vote_info`对象
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ----- | -------- | -------------------------------------------- |
| all_count | num | 总投票数 | |
| counts | array | 观点分布 | 格式:`[合适, 一般, 不合适, 无法判断]` |
| insiders_counts | array | 行为分布 | 格式:`[平时会看此类视频, 平时不看此类视频]` |
**示例:**
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"case_id": "AC2SiaD8jlrL",
"case_type": 3,
"jury_state": 1,
"participate": 1,
"vote_items": [
{
"vote": 1,
"vote_text": "合适"
},
{
"vote": 2,
"vote_text": "一般"
},
{
"vote": 3,
"vote_text": "不合适"
},
{
"vote": 4,
"vote_text": "无法判断"
}
],
"default_vote": 4,
"status": 1,
"origin_start": 0,
"avid": 727792866,
"cid": 756815216,
"vote_cd": -1,
"result": 3,
"result_text": "不合适",
"title": "“国家队”守门员和朋友打赌,谁能在湿滑的地面踢进足球就送美刀",
"case_info": {
"comment": null,
"danmu_img": "",
"comments": null,
"single_danmu": {
"id_str": "1086612690354524160",
"content": "这守门员干啥呢?给块骨头我家狗都比他防的好",
"progress": 27859
}
},
"my_point": {
"opid": 10001,
"mid": 10001,
"uname": "风纪委员用户名",
"face": "http://i0.hdslb.com/bfs/face/e48952d599dbf011c2235239fafa2bf0deccef5a.jpg",
"vote": 3,
"vote_text": "不合适",
"content": "",
"anonymous": 0,
"like": 0,
"hate": 0,
"like_status": 0,
"vote_time": 1663655000,
"insiders": 1
},
"vote_info": {
"all_count": 306,
"counts": [90, 33, 177, 6],
"insiders_counts": [245, 61]
}
}
}
```
</details>
#### 旧 api
<details>
<summary>查看旧 api</summary>
> https://api.bilibili.com/x/credit/jury/juryCase
*请求方式GET*
认证方式CookieSESSDATA或APP
只能查询自己参与众裁的
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ------------ | ------ | ------------- | ------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| cid | num | 案件id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />25010没有权限查看案件 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
| data | object | 数据本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ------ | -------- | ------------ |
| id | num | 案件id | |
| mid | num | 被举报用户mid | |
| status | num | 裁决状态 | 1投票中<br />2停止发放<br />3复核中结案中<br />4已裁决<br />5待重启<br />6未裁决<br />7冻结中<br />8队列中 |
| statusTitle | str | 封禁时间文字 | `judgeType`=1时有效 |
| originType | num | 来源类型 | 见「封禁公示」中表 |
| reasonType | num | 原因类型 | 见「封禁公示」中表 |
| originContent | str | 被举报的原文 | |
| punishResult | num | 处理结果 | 0<br />1封禁3天<br />2封禁7天<br />3永封<br />4其他封禁天数<br />5封禁15天<br />6仅删除不封禁 |
| punishTitle | str | 处罚原因 | |
| judgeType | num | 裁决类型 | `status`=4时有效<br />0未裁决<br/>1违规<br/>2不违规 |
| originUrl | str | 来源url | |
| blockedDays | num | 封禁时间 | `judgeType`=1时有效 |
| putTotal | num | | 作用尚不明确 |
| voteRule | num | 投票不违规人数 | |
| voteBreak | num | 投票建议封禁人数 | |
| voteDelete | num | 投票建议删除人数 | |
| startTime | num | 裁决起始时间 | 时间戳 |
| endTime | num | 裁决截止时间 | 时间戳<br />未结案固定为24小时 |
| ctime | num | 举报创建时间 | 时间戳 |
| mtime | num | 开始拉取时间 | 时间戳 |
| originTitle | str | 来源标题 | |
| relationId | str | 违规关系标识字 | {评论rpid}-{违规类型id}-{来源对象id} |
| face | str | 被举报用户头像url | |
| uname | str | 被举报用户昵称 | |
| vote | num | 我的投票 | **见上表** |
| case_type | num | 众裁类型 | 0小众众裁<br />1大众众裁 |
**示例:**
查询案件`1239790`的信息
Cookie方式
```shell
curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \
--data-urlencode 'cid=1239790' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \
--data-urlencode 'access_key=xxx' \
--data-urlencode 'cid=1239790' \
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 1239790,
"mid": 351783425,
"status": 4,
"statusTitle": "封禁7天",
"originType": 1,
"reasonType": 9,
"originContent": "up主在和平精英里的喷子是霰xian弹枪不是散san弹枪。",
"punishResult": 0,
"punishTitle": "在评论中发布引战言论",
"judgeType": 2,
"originUrl": "https://www.bilibili.com/video/BV15x411X7eV/#reply1728344012",
"blockedDays": 7,
"putTotal": 272,
"voteRule": 409,
"voteBreak": 17,
"voteDelete": 89,
"startTime": 1594467941,
"endTime": 1594471525,
"ctime": 1594464499,
"mtime": 1594471678,
"originTitle": "和平精英揭秘真相68氪金试水最新抽奖活动到底是亏了还是赚了",
"relationId": "1728344012-1-57465308",
"face": "http://i2.hdslb.com/bfs/face/e1018566c615059b664dc6eae3a5235c31cd92fe.jpg",
"uname": "零酱a",
"vote": 4,
"case_type": 0
}
}
```
</details>
</details>
## 查询案件众裁信息
这是一个旧版的API暂未找到对应的新版API。
<details>
<summary>展开:</summary>
> https://api.bilibili.com/x/credit/jury/caseInfo
*请求方式GET*
注:该接口无需登录
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------ | ------ | ---- |
| cid | num | 案件id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | -------------------------------- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
| data | 有效时object<br />无效时null | 数据本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ----------------- | ------------------------------------------------------------ |
| id | num | 案件id | |
| mid | num | 被举报用户mid | |
| status | num | 裁决状态 | 1投票中<br />2停止发放<br />3复核中结案中<br />4已裁决<br />5待重启<br />6未裁决<br />7冻结中<br />8队列中 |
| originType | num | 来源类型 | 见「封禁公示」中表 |
| reasonType | num | 原因类型 | 见「封禁公示」中表 |
| originContent | str | 被举报的原文 | |
| punishResult | num | 处理结果 | 0<br />1封禁3天<br />2封禁7天<br />3永封<br />4其他封禁天数<br />5封禁15天<br />6仅删除不封禁 |
| judgeType | num | 裁决类型 | `status`=4时有效<br />0未裁决<br/>1违规<br/>2不违规 |
| originUrl | str | 来源url | |
| blockedDays | num | 封禁时间 | `judgeType`=1时有效 |
| putTotal | num | | 作用尚不明确 |
| voteRule | num | 投票不违规人数 | |
| voteBreak | num | 投票建议封禁人数 | |
| voteDelete | num | 投票建议删除人数 | |
| startTime | num | 裁决起始时间 | 时间戳 |
| endTime | num | 裁决截止时间 | 时间戳<br />未结案固定为24小时 |
| ctime | num | 举报创建时间 | 时间戳 |
| mtime | num | 开始拉取时间 | 时间戳 |
| originTitle | str | 来源标题 | |
| relationId | str | 违规关系标识字 | {评论rpid}-{违规类型id}-{来源对象id} |
| face | str | 被举报用户头像url | |
| uname | str | 被举报用户昵称 | |
| vote | num | 0 | 固定为0 |
| case_type | num | 众裁类型 | 0小众众裁<br />1大众众裁 |
**示例:**
查询案件`1239790`的信息
```shell
curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \
--data-urlencode 'cid=1239790'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 1239790,
"mid": 351783425,
"status": 4,
"originType": 1,
"reasonType": 9,
"originContent": "up主在和平精英里的喷子是霰xian弹枪不是散san弹枪。",
"punishResult": 0,
"judgeType": 2,
"originUrl": "https://www.bilibili.com/video/BV15x411X7eV/#reply1728344012",
"blockedDays": 7,
"putTotal": 272,
"voteRule": 409,
"voteBreak": 17,
"voteDelete": 89,
"startTime": 1594467941,
"endTime": 1594471525,
"ctime": 1594464499,
"mtime": 1594471678,
"originTitle": "和平精英揭秘真相68氪金试水最新抽奖活动到底是亏了还是赚了",
"relationId": "1728344012-1-57465308",
"face": "http://i2.hdslb.com/bfs/face/e1018566c615059b664dc6eae3a5235c31cd92fe.jpg",
"uname": "零酱a",
"vote": 0,
"case_type": 0
}
}
```
</details>
</details>
## 查询我的众裁记录
> https://api.bilibili.com/x/credit/v2/jury/case/list
*请求方式GET*
认证方式Cookie
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | -------------------- |
| pn | num | 页码 | 非必要 | 默认为1 |
| ps | num | 每页显示数量 | 非必要 | 默认为30<br />最大30 |
**Headers参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---- | ------ | ---- |
| cookie | str | | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ------ | ------------ | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
| data | object | 数据本体 | |
| data.total | num | 仲裁案例数 | |
| data.list | array | 仲裁记录列表 | |
`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ------ | --------------- | ------------ |
| 0 | object | 仲裁记录1 | |
| n | object | 仲裁记录n+1 | 按照时间顺序 |
| …… | object | …… | …… |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | ------------ | ------------------------------------------------------------ |
| case_id | str | 案件id | |
| case_type | num | 案件类型 | 1单条评论<br/>2评论氛围<br/>3单条弹幕<br/>4弹幕氛围 |
| status | num | 裁决状态 | 0投票中<br />1已结束 |
| vote | num | 投票选项 | “单条评论(弹幕)”分别为 `1` 或者 `2` 或者 `3` 或者 `4`<br/>对应:“合适”、“一般”、“不合适”、“无法判断”<br/><br/>“评论(弹幕)氛围”分别为 `11` 或者 `12` 或者 `13` 或者 `14`<br/>对应:“好”、“一般”、“差”、“无法判断” |
| vote_text | str | 投票选项文本 | *参考上条* |
| vote_time | num | 投票时间 | 时间戳,精确到秒 |
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"total": 5428,
"list": [
{
"case_id": "AC2sOiNenwj1",
"case_type": 4,
"status": 1,
"vote": 11,
"vote_text": "好",
"vote_time": 1662700609
}
]
}
}
```
</details>
#### 旧 api
<details>
<summary>查看旧版API</summary>
> https://api.bilibili.com/x/credit/jury/caseList
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ------------ | ------ | ------------- | ------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| pn | num | 页码 | 非必要 | 默认为1 |
| ps | num | 每页显示数量 | 非必要 | 默认为30<br />最大30 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
| data | array | 仲裁记录列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ------ | --------------- | ------------ |
| 0 | object | 仲裁记录1 | |
| n | object | 仲裁记录n+1 | 按照时间顺序 |
| …… | object | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ----------------- | ------------------------------------------------------------ |
| id | num | 案件id | |
| mid | num | 被举报用户mid | |
| status | num | 裁决状态 | 1投票中<br />2停止发放<br />3复核中结案中<br />4已裁决<br />5待重启<br />6未裁决<br />7冻结中<br />8队列中 |
| originType | num | 来源类型 | 见「封禁公示」中表 |
| reasonType | num | 原因类型 | 见「封禁公示」中表 |
| originContent | str | 被举报的原文 | |
| punishResult | num | 处理结果 | 0<br />1封禁3天<br />2封禁7天<br />3永封<br />4其他封禁天数<br />5封禁15天<br />6仅删除不封禁 |
| punishTitle | str | 处罚原因 | |
| judgeType | num | 裁决类型 | `status`=4时有效<br />0未裁决<br/>1违规<br/>2不违规 |
| originUrl | str | 来源url | |
| blockedDays | num | 封禁时间 | `judgeType`=1时有效 |
| putTotal | num | | 作用尚不明确 |
| voteRule | num | 投票不违规人数 | |
| voteBreak | num | 投票建议封禁人数 | |
| voteDelete | num | 投票建议删除人数 | |
| startTime | num | 裁决起始时间 | 时间戳 |
| endTime | num | 裁决截止时间 | 时间戳<br />未结案固定为24小时 |
| ctime | num | 举报创建时间 | 时间戳 |
| mtime | num | 开始拉取时间 | 时间戳 |
| originTitle | str | 来源标题 | |
| relationId | str | 违规关系标识字 | {评论rpid}-{违规类型id}-{来源对象id} |
| face | str | 被举报用户头像url | |
| uname | str | 被举报用户昵称 | |
| vote | num | 我的投票 | **见上表** |
| voteTime | num | 我的裁决时间 | 毫秒 时间戳 |
| case_type | num | 众裁类型 | 0小众众裁<br />1大众众裁 |
**示例:**
查询我的历史众裁第1页每页显示1个案件
Cookie方式
```shell
curl -G 'https://api.bilibili.com/x/credit/jury/caseList' \
--data-urlencode 'ps=1' \
--data-urlencode 'pn=1' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl -G 'https://api.bilibili.com/x/credit/jury/caseList' \
--data-urlencode 'access_key=xxx' \
--data-urlencode 'ps=1' \
--data-urlencode 'pn=1'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"id": 1241808,
"mid": 298264370,
"status": 4,
"originType": 1,
"reasonType": 9,
"originContent": "别在发这种傻逼视频了好吗?真要搞到禁摩才甘心。",
"punishResult": 6,
"punishTitle": "在评论中发布引战言论",
"judgeType": 1,
"originUrl": "https://www.bilibili.com/video/av328669697/#reply3165369965",
"blockedDays": 7,
"putTotal": 251,
"voteRule": 14,
"voteBreak": 140,
"voteDelete": 373,
"startTime": 1594528662,
"endTime": 1594530687,
"ctime": 1594528108,
"mtime": 1594530802,
"originTitle": "我这里有记录仪!略略略略略略哈哈哈,干得漂亮!",
"relationId": "3165369965-1-328669697",
"face": "http://i1.hdslb.com/bfs/face/d69912bb2a51f08176bcdbf4ba15e4c2b0962ad9.jpg",
"uname": "MyLSTicKnight",
"vote": 4,
"voteTime": 1594528700000,
"case_type": 0
}
]
}
```
</details>
</details>
## 获取众议观点
> https://api.bilibili.com/x/credit/v2/jury/case/opinion
*请求方式GET*
认证方式Cookie
**标头参数Headers**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------ | ------ | ---- |
| Cookie | str | Cookie | 必要 | |
**URL参数Query Params**
| 参数名 | 类型 | 内容 | 备注 |
| ------- | ---- | ---------- | ------------------------------------------- |
| case_id | str | 仲裁案件id | **必填** |
| pn | num | | 显示第x页default = 1 |
| ps | num | | 每页显示y条观点Max = 20default = 10 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br>-400`ps`参数大于可允许的最大值`20` |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | object | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ----- | -------------------------- | ---- |
| total | num | 当前案件众议观点总数 | |
| list | array | 无数据时是一个空数组:“[]” | |
`data.list`对象是一个数组,里面包含`ps`个object参数`ps`见上文object结构见「[附表4](#附表4data-对象下的my_point对象)」)
**示例:**
查看案件`AC1xx411c7ac`的众议观点,每页`2`项,查看第`1`
```shell
curl -G 'https://api.bilibili.com/x/credit/v2/jury/case/opinion' \
--data-urlencode 'case_id=AC1xx411c7ac' \
--data-urlencode 'pn=1' \
--data-urlencode 'ps=2' \
--header 'cookie: xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"total": 48,
"list": [
{
"opid": 46087379,
"mid": 22006415,
"uname": "匿名用户",
"face": "http://i0.hdslb.com/bfs/face/e48952d599dbf011c2235239fafa2bf0deccef5a.jpg",
"vote": 11,
"vote_text": "",
"content": "正常评论",
"anonymous": 1,
"like": 0,
"hate": 0,
"like_status": 0,
"vote_time": 1661430391,
"insiders": 1
},
{
"opid": 46087280,
"mid": 19243907,
"uname": "匿名用户",
"face": "http://i0.hdslb.com/bfs/face/e85d7ab3425d3dd0f0796bd7f945b47ac27ca82a.jpg",
"vote": 11,
"vote_text": "",
"content": "并未发现明显问题。",
"anonymous": 1,
"like": 0,
"hate": 0,
"like_status": 0,
"vote_time": 1661430337,
"insiders": 0
}
]
}
}
```
</details>
#### 旧 api
<details>
<summary>查看旧版API</summary>
> https://api.bilibili.com/x/credit/jury/case/opinion
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ------------ | ------ | ------------- | ------------- |
| cid | num | 案件id | 必要 | |
| ps | num | 每页项数 | 非必要 | 默认为10 |
| pn | num | 页码 | 非必要 | 默认为1 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------ |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 信息 | 默认为0 |
| ttl | num | 1 | |
| data | object | 数据本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ------ | -------- | ------------ |
| count | num | 观点总数 | |
| opinion | 有效时array<br />无效时null | 观点列表 | |
`data` 中的`opinion` 数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ------ | ----------- | ------------ |
| 0 | object | 观点1 | |
| n | object | 观点n+1 | 按照时间顺序 |
| …… | object | …… | …… |
`opinion` 数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ------ | -------- | ------------ |
| mid | num | 用户mid | 仅非匿名有此项 |
| face | str | 用户头像 | 仅非匿名有此项 |
| name | str | 用户昵称 | 仅非匿名有此项 |
| opid | num | 观点id | |
| vote | num | 投票选择 | **见上表** |
| content | str | 观点内容 | |
| attr | num | 是否匿名 | 0匿名<br />1不匿名 |
| hate | num | 喜欢人数 | |
| like | num | 不喜欢人数 | |
**示例:**
查看案件`1239790`的众议观点每页10项查看第一页
```shell
curl -G 'https://api.bilibili.com/x/credit/jury/case/opinion' \
--data-urlencode 'cid=1239790' \
--data-urlencode 'ps=10' \
--data-urlencode 'pn=1' \
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"count": 23,
"opinion": [
{
"opid": 250943982,
"vote": 2,
"content": "不懂,正常的科普也有人杠吗?没文化真可怕",
"attr": 0,
"hate": 0,
"like": 0
},
{
"mid": 59894,
"face": "http://i2.hdslb.com/bfs/face/0cc48fc40867537d5a09a125e90f76183efbfdfa.gif",
"name": "雷歐諾斯",
"opid": 250956267,
"vote": 2,
"content": "这个虽然不是正确的说法,但本身是一种观点。而且已经成为一种梗了。不属于引战。",
"attr": 1,
"hate": 0,
"like": 0
},
{
"opid": 250956259,
"vote": 2,
"content": "正常科普,不构成引战。",
"attr": 0,
"hate": 0,
"like": 0
},
{
"mid": 215020429,
"face": "http://i1.hdslb.com/bfs/face/1d43c302e67db4d21b9c5c0f0dc0b8786e8086d5.jpg",
"name": "瞎子广_广告歌41",
"opid": 250955160,
"vote": 2,
"content": "这个其实也没啥事真的",
"attr": 1,
"hate": 0,
"like": 0
},
{
"mid": 108194360,
"face": "http://i0.hdslb.com/bfs/face/b78c92a69ff9977b7d08d4f7edc0a051a3d6ea3e.jpg",
"name": "籽云奕",
"opid": 250953998,
"vote": 2,
"content": "仅仅是科普评论,无过激言论",
"attr": 1,
"hate": 0,
"like": 0
},
{
"mid": 34503714,
"face": "http://i2.hdslb.com/bfs/face/eb2d0853235a56d035303f4f3614dcb6e0cf66fa.jpg",
"name": "十六夜紅月丶",
"opid": 250950982,
"vote": 2,
"content": "无过激言论,正常科普罢了",
"attr": 1,
"hate": 0,
"like": 0
},
{
"opid": 250950973,
"vote": 2,
"content": "其实两种读法都是正确的,虽然想要纠正别人的错误。不过自己本身就错了。还是保留吧,没什么引战的",
"attr": 0,
"hate": 0,
"like": 0
},
{
"mid": 436136443,
"face": "http://i1.hdslb.com/bfs/face/6b4151d8e030eddd073add6ef18ccbb00aa48d0f.jpg",
"name": "兄弟好牛啤",
"opid": 250950417,
"vote": 2,
"content": "有点经典的争议,但可能还会有人不知道",
"attr": 1,
"hate": 0,
"like": 0
},
{
"mid": 87385400,
"face": "http://i2.hdslb.com/bfs/face/0f567e7fa49bcef22010f3ff78e90553d8fffb09.jpg",
"name": "小学生de王者荣耀",
"opid": 250950402,
"vote": 2,
"content": "合理纠正up主的错误建议追究恶意举报者的责任",
"attr": 1,
"hate": 0,
"like": 0
},
{
"opid": 250949840,
"vote": 2,
"content": "正常科普,没有过激言论,建议保留",
"attr": 0,
"hate": 0,
"like": 0
}
]
}
}
```
</details>
</details>

184
docs/broadcast/readme.md Normal file
View File

@@ -0,0 +1,184 @@
# 全站广播
可用的广播服务:
- [视频实时信息](video_room.md)√
## 获取广播服务器地址
> https://api.bilibili.com/x/web-interface/broadcast/servers
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | --------------------------------- |
| platform | str | 平台选择 | 必要 | 为web时输出域名<br />其他时输出ip |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ------ | ------------------ | ---- |
| domain | str | 广播服务器url | |
| tcp_port | num | tcp端口 | |
| ws_port | num | websocket端口 | |
| wss_port | num | websocket ssl端口 | |
| heartbeat | num | 最大心跳包间隔时间 | |
| nodes | array | 服务节点地址列表 | |
| backoff | obj | | |
| heartbeat_max | num | | |
`data`中的`nodes`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | str | 服务节点1 | |
| n | str | 服务节点(n+1) | |
| …… | str | …… | |
`data`中的`backoff`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------ | ---- |
| max_delay | num | | |
| base_delay | num | | |
| factor | num | | |
| jitter | num | | |
示例:
`platform`=`web`不显示节点ip
```shell
curl -G 'https://api.bilibili.com/x/web-interface/broadcast/servers' \
--data-urlencode 'platform=web'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"domain": "broadcast.chat.bilibili.com",
"tcp_port": 7821,
"ws_port": 7822,
"wss_port": 7823,
"heartbeat": 30,
"nodes": ["broadcast.chat.bilibili.com"],
"backoff": {
"max_delay": 300,
"base_delay": 3,
"factor": 1.8,
"jitter": 0.3
},
"heartbeat_max": 3
}
}
```
</details>
`platform`=其他时显示节点ip
```shell
curl -G 'https://api.bilibili.com/x/web-interface/broadcast/servers' \
--data-urlencode 'platform=1'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"domain": "broadcast.chat.bilibili.com",
"tcp_port": 7821,
"ws_port": 7822,
"wss_port": 7823,
"heartbeat": 30,
"nodes": ["134.175.207.130", "120.92.150.90", "120.92.150.212", "192.144.173.136", "154.8.217.108"],
"backoff": {
"max_delay": 300,
"base_delay": 3,
"factor": 1.8,
"jitter": 0.3
},
"heartbeat_max": 3
}
}
```
</details>
## 服务器数据包
连接服务器分为三种方式分别是ws wss tcp数据包分为上行和下行
单个数据包分为头部和正文
其中上行的有认证包 心跳包,下行的有认证包回复 心跳包回复 普通包
建立连接后超过30s内未发送认证包或握手后30s内未发送心跳包或发送了错误的认证包都会被强制断开连接
操作流程:
1.发送认证包,等待接收认证回复
2.确认握手成功后每30s内发送心跳包并立即接收心跳包回复
3.空闲时间接收普通包
### 数据包结构
头部通用于上行和下行数据包
头部格式:
| 偏移量 | 长度(字节) | 类型 | 含义 |
| ------ | ------------ | ------ | ---------------------------------------------------- |
| 0x00 | 4 | uint32 | 封包总大小(头部大小+正文大小) |
| 0x04 | 2 | uint16 | 头部大小一般为0x001218字节 |
| 0x06 | 2 | uint16 | 协议版本可取常数1 |
| 0x08 | 4 | uint32 | 操作码(包类型)<br />**见下表** |
| 0x0C | 4 | uint32 | sequence请求次数可取常数1<br />对于普通包恒为0 |
| 0x10 | 2 | uint16 | 保留一般为0 |
操作码:
| 代码 | 含义 |
| ---- | -------- |
| 2 | 心跳 |
| 3 | 心跳回复 |
| 7 | 认证 |
| 8 | 认证回复 |
| 1000 | 实时弹幕 |
**示例:**
以下为一个认证包示例,正文为文本`test`
```
00000000 00 00 00 16 00 12 00 01 00 00 00 07 00 00 00 01 |................|
00000010 00 00 74 65 73 74 |..test|
```

View File

@@ -0,0 +1,152 @@
# 视频实时信息
- [认证包(上行)](#认证包上行)
- [认证包回复(下行)](#认证包回复下行)
- [心跳包(上行)](#心跳包上行)
- [心跳包回复(实时观看数)(下行)](#心跳包回复实时观看数下行)
- [普通包(实时弹幕)(下行)](#普通包实时弹幕下行)
---
## 认证包(上行)
**正文内容json**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ------ | -------- | ------------------------------ |
| room_id | str | 目标视频 | `video://{稿件avid}/{视频cid}` |
| platform | str | 平台标识 | 默认为`web` |
| accepts | array | 操作标识 | |
`array`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ---- | ------------ |
| 0 | num | 1000 | 作用尚不明确 |
| 1 | num | 1015 | 作用尚不明确 |
**示例:**
发送视频`av706`1P的cid为` 3724723 `)的认证包
```
00000000 00 00 00 55 00 12 00 01 00 00 00 07 00 00 00 01 |...U............|
00000010 00 00 7b 22 72 6f 6f 6d 5f 69 64 22 3a 22 76 69 |..{"room_id":"vi|
00000020 64 65 6f 3a 2f 2f 37 30 36 2f 33 37 32 34 37 32 |deo://706/372472|
00000030 33 22 2c 22 70 6c 61 74 66 72 6f 6d 22 3a 22 77 |3","platfrom":"w|
00000040 65 62 22 2c 22 61 63 63 65 70 74 73 22 3a 5b 31 |eb","accepts":[1|
00000050 30 30 30 2c 31 30 31 35 5d 7d |000,1015]}|
```
## 认证包回复(下行)
**正文内容json**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | -------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 默认为OK |
| version | num | 版本号 | |
示例:
```
00000000 00 00 00 37 00 12 00 01 00 00 00 08 00 00 00 01 |...7............|
00000010 00 00 7b 22 63 6f 64 65 22 3a 30 2c 22 6d 65 73 |..{"code":0,"mes|
00000020 73 61 67 65 22 3a 22 4f 4b 22 2c 22 76 65 72 73 |sage":"OK","vers|
00000030 69 6f 6e 22 3a 31 7d |ion":1}|
```
## 心跳包(上行)
正文可为任意内容或为空
**示例:**
正文为空的示例
```
00000000 00 00 00 12 00 12 00 01 00 00 00 02 00 00 00 01 |................|
00000010 00 00 |..|
```
正文为`[object Object]`的示例
```
00000000 00 00 00 21 00 12 00 01 00 00 00 02 00 00 00 01 |...!............|
00000010 00 00 5b 6f 62 6a 65 63 74 20 4f 62 6a 65 63 74 |..[object Object|
00000020 5d |]|
```
## 心跳包回复(实时观看数)(下行)
**正文内容json**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | -------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 默认为OK |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------------- | ---- |
| room | obj | 视频实时观看信息 | |
`data`中的`room`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------------ | ------------------------------ |
| online | num | 实时观看人数 | |
| room_id | str | 目标视频 | `video://{稿件avid}/{视频cid}` |
**示例:**
当前视频`av706`实时观看人数为13
```
00000000 00 00 00 68 00 12 00 01 00 00 00 03 00 00 00 01 |...h............|
00000010 00 00 7b 22 63 6f 64 65 22 3a 30 2c 22 6d 65 73 |..{"code":0,"mes|
00000020 73 61 67 65 22 3a 22 30 22 2c 22 64 61 74 61 22 |sage":"0","data"|
00000030 3a 7b 22 72 6f 6f 6d 22 3a 7b 22 6f 6e 6c 69 6e |:{"room":{"onlin|
00000040 65 22 3a 31 33 2c 22 72 6f 6f 6d 5f 69 64 22 3a |e":13,"room_id":|
00000050 22 76 69 64 65 6f 3a 2f 2f 37 30 36 2f 33 37 32 |"video://706/372|
00000060 34 37 32 33 22 7d 7d 7d |4723"}}}|
```
## 普通包(实时弹幕)(下行)
**正文内容json**
根数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------ | ------------------------------------------------------------ |
| 0 | str | 弹幕属性信息 | 详见[「弹幕」中的属性 p](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/danmaku/danmaku_xml.md) |
| 1 | str | 弹幕内容 | |
**示例:**
弹幕属性为`0.25,1,25,16777215,1588433046,1588431486568150,0,33ad5d91,32134068443807747`
弹幕内容为`此生无悔入东方,来世愿生幻想乡`
```
00000000 00 00 00 91 00 12 00 01 00 00 03 e8 00 00 00 00 |................|
00000010 00 00 5b 22 30 2e 32 35 2c 31 2c 32 35 2c 31 36 |..["0.25,1,25,16|
00000020 37 37 37 32 31 35 2c 31 35 38 38 34 33 33 30 34 |777215,158843304|
00000030 36 2c 31 35 38 38 34 33 31 34 38 36 35 36 38 31 |6,15884314865681|
00000040 35 30 2c 30 2c 33 33 61 64 35 64 39 31 2c 33 32 |50,0,33ad5d91,32|
00000050 31 33 34 30 36 38 34 34 33 38 30 37 37 34 37 22 |134068443807747"|
00000060 2c 22 e6 ad a4 e7 94 9f e6 97 a0 e6 82 94 e5 85 |,"此 生 无 悔|
00000070 a5 e4 b8 9c e6 96 b9 ef bc 8c e6 9d a5 e4 b8 96 |入 东 方 ,来 世 |
00000080 e6 84 bf e7 94 9f e5 b9 bb e6 83 b3 e4 b9 a1 22 |愿 生 幻 想 乡"|
00000090 5d |]|
```

645
docs/cheese/info.md Normal file
View File

@@ -0,0 +1,645 @@
# 课程基本信息
- [获取课程基本信息](#获取课程基本信息)
- [获取课程分集列表](#获取课程分集列表)
---
课程ssid与epid和番剧不互通
课程avid与普通视频绝大部分api接口不能互通少部分互通接口如下
1. 获取视频简介
2. 查询视频状态数
3. 查询分P列表
4. 视频快照
5. 获取弹幕使用cid
6. 发送弹幕
7. 高能进度条使用cid
## 获取课程基本信息
> https://api.bilibili.com/pugv/view/web/season
*请求方式GET*
认证方式CookieSESSDATA
鉴权方式referer为 `.bilibili.com`域名下
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | -------- | ------------ | -------------------------------------------------- |
| season_id | num | 课程ssid | 必要(可选) | season_id与ep_id任选其一<br />**与番剧ssid不互通** |
| ep_id | num | 课程epid | 必要(可选) | season_id与ep_id任选其一<br />**与番剧epid不互通** |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------- |
| code | num | 返回值 | 0成功<br />-404错误 |
| message | str | 错误信息 | 默认为success |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------- | ------ | ----------------------------- | ------------------------------------------------------------ |
| brief | obj | 课程概述信息 | |
| coupon | obj | 优惠信息 | 若无优惠则无此项 |
| cover | str | 课程封面url | |
| episode_page | obj | 课程分集信息 | |
| episode_sort | num | 1 | **作用尚不明确** |
| episodes | array | 课程分集列表 | |
| faq | obj | 常见问题信息1 | 合并格式 |
| faq1 | obj | 常见问题信息2 | 分离格式 |
| payment | obj | 付费信息 | |
| purchase_note | obj | 购买须知信息 | |
| purchase_protocol | obj | 付费内容协议信息 | |
| release_bottom_info | str | 底部更新状态文字 | |
| release_info | str | 更新状态文字+更新连载状态文字 | |
| release_info2 | str | 更新连载状态文字 | |
| release_status | str | 更新状态文字 | |
| season_id | num | 课程ssid | **与番剧ssid不互通** |
| share_url | str | 页面url | |
| short_link | str | bilibili uri链接 | |
| stat | obj | 播放数信息 | |
| status | num | 10 | **作用尚不明确** |
| subtitle | str | 课程简介信息 | |
| title | str | 课程标题 | |
| up_info | obj | UP主信息 | |
| user_status | obj | 用户状态信息 | **需要登录SESSDATA且referer为`https://www.bilibili.com`** |
`data`中的`brief`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ---- |
| content | str | 空 | |
| img | array | 简介图片 | |
| title | str | 课程概述 | |
| type | num | 2 | |
`brief`中的`img`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 简介图片1 | |
| n | obj | 简介图片n+1 | |
| …… | obj | …… | …… |
`img`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ----------- | ---------------- |
| aspect_ratio | num | | **作用尚不明确** |
| url | str | 简介图片url | |
`data`中的`coupon`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | --------- | ------------------- |
| amount | num | 折扣乘数 | |
| expire_time | str | 结束时间 | YYYY-MM-DD HH:MM:SS |
| start_time | str | 起始时间 | YYYY-MM-DD HH:MM:SS |
| status | num | | **作用尚不明确** |
| title | str | 优惠标题 | |
| token | str | 领取token | |
`data`中的`episode_page`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------- | ---- |
| next | bool | false | |
| num | num | 1 | |
| size | num | 总计集数 | |
| total | num | 总计集数 | |
`data`中的`episodes`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 课程分集1 | |
| n | obj | 课程分集n+1 | |
| …… | obj | …… | …… |
`episodes`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | ---------------- | ------------------------------------------------------------ |
| aid | num | 课程分集avid | **与普通稿件avid部分不互通** |
| cid | num | 课程分集cid | **与普通视频cid部分不互通** |
| duration | num | 课程分集时间长度 | 单位为秒 |
| from | str | pugv | |
| id | num | 课程分集epid | **与番剧epid不互通** |
| index | num | 课程分集数 | |
| page | num | 1 | |
| play | num | 课程分集播放量 | |
| release_date | num | 课程分集发布时间 | 时间戳 |
| status | num | 分集权限属性 | 1可观看<br />2不可观看 |
| title | str | 课程分集标题 | |
| watched | bool | 是否观看该集 | **需要登录SESSDATA且referer为`https://www.bilibili.com`**<br />false未观看<br />true已观看 |
| watchedHistory | num | 该集观看历史 | **需要登录SESSDATA且referer为`https://www.bilibili.com`** |
`data`中的`faq`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | --------------- | ---- |
| content | str | 常见问题信息 | |
| link | str | 常见问题页面url | |
| title | str | 常见问题 | |
`data`中的`faq1`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ------ | ------------ | ---- |
| items | array | 常见问题列表 | |
| title | str | 常见问题 | |
`faq1`中的`items`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 常见问题1 | |
| n | obj | 常见问题n+1 | |
| …… | obj | …… | …… |
`items`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ---- |
| answer | str | 回答信息 | |
| question | str | 问题信息 | |
`data`中的`payment`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ---- | -------------------- | ----------------------- |
| desc | str | 付费价格说明 | |
| discount_desc | str | 折扣说明信息 | 若无优惠则无此项 |
| discount_prefix | str | 折扣类型前缀 | 若无优惠则无此项 |
| pay_shade | str | 观看所有视频付费说明 | |
| price | num | 课程价格 | 单位为B币折扣后价格 |
| price_format | str | 课程价格 | 单位为B币折扣后价格 |
`data`中的`purchase_note`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------------------- | ---- |
| content | str | 购买须知信息文字内容 | |
| link | str | 购买须知页面url | |
| title | str | 购买须知 | |
`data`中的`purchase_protocol`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ------------------- | ---- |
| link | str | 付费内容协议页面url | |
| title | str | 付费内容协议 | |
`data`中的`stat`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | -------------- | ---- |
| play | num | 播放量 | |
| play_desc | str | 播放量文字信息 | |
`data`中的`up_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | ------------ | ------------------------------------------------------------ |
| avatar | str | UP主头像url | |
| brief | str | UP主备注 | 非个人签名 |
| follower | num | UP主粉丝数 | |
| is_follow | num | 是否关注UP主 | **需要登录SESSDATA且referer为`https://www.bilibili.com`**<br />0未关注<br />1已关注 |
| link | str | UP主空间url | |
| mid | num | UP主uid | |
| pendant | obj | ??? | **作用尚不明确** |
| uname | str | UP主昵称 | |
`up_info`中的`pendant`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---- | ---------------- |
| image | str | 空 | **作用尚不明确** |
| name | str | 空 | **作用尚不明确** |
| follower | num | 0 | **作用尚不明确** |
`data`中的`user_status`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | -------- | ------------------------ |
| favored | num | 是否收藏 | 0未收藏<br />1已收藏 |
| favored_count | num | 1 | **作用尚不明确** |
| payed | num | 是否购买 | 0未购买<br />1已购买 |
| progress | obj | 课程进度 | 未登录无此项 |
`user_status`中的`progress`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ------------------ | -------- |
| last_ep_id | num | 最后观看的epid | |
| last_ep_index | str | 最后观看的标题 | |
| last_time | num | 最后观看的时间进度 | 单位为秒 |
**示例:**
查询课程`ss61`或分集`ep790`的信息
ssid方式
```shell
curl -G 'https://api.bilibili.com/pugv/view/web/season' \
--data-urlencode 'season_id=61' \
-b 'SESSDATA=xxx' \
-e 'https://www.bilibili.com'
```
epid方式
```shell
curl -G 'https://api.bilibili.com/pugv/view/web/season' \
--data-urlencode 'ep_id=790' \
-b 'SESSDATA=xxx' \
-e 'https://www.bilibili.com'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"brief": {
"content": "",
"img": [
{
"aspect_ratio": 0.9375,
"url": "http://i0.hdslb.com/bfs/archive/29942f338ee570632838403a09871bad130cfe9a.jpg"
},
{
"aspect_ratio": 0.9375,
"url": "http://i0.hdslb.com/bfs/archive/913e5c37d836d7954ae9ca19da62a43ba5b34219.jpg"
},
{
"aspect_ratio": 1.3359375,
"url": "http://i0.hdslb.com/bfs/archive/a974555bd4a52f0aa865bd192c1e3401ed4cb0ad.jpg"
},
{
"aspect_ratio": 1.3359375,
"url": "http://i0.hdslb.com/bfs/archive/73cd7669b251db9d2b62b921bee49a137c3d65dc.jpg"
},
{
"aspect_ratio": 1.0625,
"url": "http://i0.hdslb.com/bfs/archive/b084ac8f6710c8eddbc58770a4254508de75eb02.jpg"
},
{
"aspect_ratio": 1.2890625,
"url": "http://i0.hdslb.com/bfs/archive/44e32c2cf64b894563829ce65bbef199220f4121.jpg"
},
{
"aspect_ratio": 1.3203125,
"url": "http://i0.hdslb.com/bfs/archive/90764fd095810565713b92606dc9cd0cfb25adae.jpg"
},
{
"aspect_ratio": 1.15234375,
"url": "http://i0.hdslb.com/bfs/archive/c35ca0ced0ad075a2c13b8fdc1e47b88573bce45.jpg"
}
],
"title": "课程概述",
"type": 2
},
"coupon": {
"amount": 0.66,
"expire_time": "2020-06-30 00:00:00",
"start_time": "2020-05-21 00:00:00",
"status": 1,
"title": "【上新限时6.6折】《唐盾0-N4日语精讲》",
"token": "B20200521135929161905873"
},
"cover": "http://i0.hdslb.com/bfs/archive/95d4de9e6691ccc2b18f087f5f654652dee3c01b.jpg",
"episode_page": {
"next": false,
"num": 1,
"size": 66,
"total": 66
},
"episode_sort": 1,
"episodes": [
{
"aid": 76973173,
"cid": 132105993,
"duration": 2223,
"from": "pugv",
"id": 790,
"index": 1,
"page": 1,
"play": 2406406,
"release_date": 1574762407,
"status": 1,
"title": "唐盾一起从0基础学日语吧含50音 词汇试听)",
"watched": false,
"watchedHistory": 0
},
{
"aid": 77114885,
"cid": 132110244,
"duration": 3003,
"from": "pugv",
"id": 795,
"index": 2,
"page": 1,
"play": 49100,
"release_date": 1574766759,
"status": 2,
"title": "50音あ行假名/音调/送气与不送气音",
"watched": false,
"watchedHistory": 0
},
{
"aid": 77120689,
"cid": 131913553,
"duration": 3253,
"from": "pugv",
"id": 797,
"index": 3,
"page": 1,
"play": 49518,
"release_date": 1574770029,
"status": 2,
"title": "50音图的か行、さ行、た行假名",
"watched": false,
"watchedHistory": 0
},
…………
],
"faq": {
"content": "Q课程在什么时间更新\nA课程更新频次以页面前端展示为准。购买成功后课程更新将通过账号动态提示方便及时观看。\n\nQ课程购买后有收看时间限制吗\nA购买后除不可抗力因素外课程均可永久收看请您放心购买。\n\nQ原价购买课程后如遇到优惠折扣是否可以退还差价或重新购买\nA虚拟商品付款后无法返还请您随时留意各类课程折扣信息按需购买。\n\nQ购买课程后是否可以加入老师的粉丝群或者用户群\nA如老师设置用户群我们将邀您加入但我们无法承诺所有老师均提供用户群服务感谢理解。",
"link": "http://m.bilibili.com",
"title": "常见问题"
},
"faq1": {
"items": [
{
"answer": "课程更新频次以页面前端展示为准。购买成功后,课程更新将通过账号动态提示,方便及时观看。",
"question": "课程在什么时间更新?"
},
{
"answer": "购买后除不可抗力因素外,课程均可永久收看,请您放心购买。",
"question": "课程购买后有收看时间限制吗?"
},
{
"answer": "虚拟商品付款后无法返还,请您随时留意各类课程折扣信息,按需购买。",
"question": "原价购买课程后,如遇到优惠折扣,是否可以退还差价或重新购买?"
},
{
"answer": "如老师设置用户群,我们将邀您加入,但我们无法承诺所有老师均提供用户群服务,感谢理解。",
"question": "购买课程后是否可以加入老师的粉丝群或者用户群?"
}
],
"title": "常见问题"
},
"payment": {
"desc": "券后262.68B币起/53期",
"discount_desc": "262.68B币",
"discount_prefix": "券后",
"pay_shade": "券后支付262.68B币即可观看所有视频",
"price": 398.0,
"price_format": "398"
},
"purchase_note": {
"content": "1. 本内容为付费内容,购买成功后方可观看。<br/>2. 本内容为虚拟服务,已购买内容不支持退款,敬请谅解。<br/>3. 实际购买价格以页面展示的价格及订单结算页显示价格为准。<br/>4. 如您在购买付费内容时有任何疑问,可随时咨询在线客服。<br/>完整的购买协议,请点击阅读<a href=\"https://www.bilibili.com/blackboard/activity-y-SJTTYBp.html\" color=\"#0ba395\" target=\"_blank\">《bilibili付费内容购买协议》</a>",
"link": "https://www.bilibili.com/blackboard/activity-y-SJTTYBp.html",
"title": "购买须知"
},
"purchase_protocol": {
"link": "https://www.bilibili.com/blackboard/activity-y-SJTTYBp.html",
"title": "bilibili付费内容购买协议"
},
"release_bottom_info": "没有更多啦~",
"release_info": "已完结共53期",
"release_info2": "共53期",
"release_status": "已完结",
"season_id": 61,
"share_url": "https://m.bilibili.com/cheese/play/ss61",
"short_link": "bilibili://cheese/season/61",
"stat": {
"play": 2878146,
"play_desc": "287.8万播放"
},
"status": 10,
"subtitle": "新东方名师唐盾的精品日语课包含50音/N5/N4的词汇/语法/课文/练习精讲,让我们一起轻松学日语~",
"title": "唐盾0-N4日语精讲",
"up_info": {
"avatar": "http://i1.hdslb.com/bfs/face/564421428d1f74314ed50e16a8f570ad968828b0.jpg",
"brief": "唐盾前新东方日语名师倾注日语教学、翻译14年。曾任新东方欧亚教育长沙中心总监。",
"follower": 21333,
"is_follow": 0,
"link": "https://space.bilibili.com/19452605",
"mid": 19452605,
"pendant": {
"image": "",
"name": "",
"pid": 0
},
"uname": "盾盾桑教你学日语"
},
"user_status": {
"favored": 1,
"favored_count": 1,
"payed": 0,
"progress": {
"last_ep_id": 790,
"last_ep_index": "唐盾一起从0基础学日语吧含50音 词汇试听)",
"last_time": 1
}
}
},
"message": "success"
}
```
</details>
## 获取课程分集列表
> https://api.bilibili.com/pugv/view/web/ep/list
*请求方式GET*
认证方式CookieSESSDATA
鉴权方式referer为 `.bilibili.com`域名下
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | -------- | ------ | -------------------- |
| season_id | num | 课程ssid | 必要 | **与番剧ssid不互通** |
| ps | num | 每页项数 | 非必要 | 默认为50 |
| pn | num | 页码 | 非必要 | 默认为1 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------- |
| code | num | 返回值 | 0成功<br />-404错误 |
| message | str | 错误信息 | 默认为success |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ------ | ------------ | ---- |
| items | array | 课程分集列表 | |
| page | obj | 列表分页信息 | |
`data`中的`items`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 课程分集1 | |
| n | obj | 课程分集n+1 | |
| …… | obj | …… | …… |
`items`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | ---------------- | ------------------------------------------------------------ |
| aid | num | 课程分集avid | **与普通稿件avid部分不互通** |
| cid | num | 课程分集cid | **与普通视频cid部分不互通** |
| duration | num | 课程分集时间长度 | 单位为秒 |
| from | str | pugv | |
| id | num | 课程分集epid | **与番剧epid不互通** |
| index | num | 课程分集数 | |
| page | num | 1 | |
| play | num | 课程分集播放量 | |
| release_date | num | 课程分集发布时间 | 时间戳 |
| status | num | 分集权限属性 | 1可观看<br />2不可观看 |
| title | str | 课程分集标题 | |
| watched | bool | 是否观看该集 | **需要登录SESSDATA且referer为`https://www.bilibili.com`**<br />false未观看<br />true已观看 |
| watchedHistory | num | 该集观看历史 | **需要登录SESSDATA且referer为`https://www.bilibili.com`** |
`data`中的`page`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------------- | ----------------------------------------- |
| next | bool | 是否存在下一页 | false不存在下一页<br />true存在下一页 |
| num | num | 当前页码 | |
| size | num | 每页项数 | |
| total | num | 总价项数 | |
**示例:**
按照每页5项查询课程`ss61`的分集列表第1页
```shell
curl -G 'https://api.bilibili.com/pugv/view/web/ep/list' \
--data-urlencode 'season_id=61' \
--data-urlencode 'ps=5 ' \
--data-urlencode 'pn=1' \
-b 'SESSDATA=xxx' \
-e 'https://www.bilibili.com'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"items": [
{
"aid": 76973173,
"cid": 132105993,
"duration": 2223,
"from": "pugv",
"id": 790,
"index": 1,
"page": 1,
"play": 2406951,
"release_date": 1574762407,
"status": 1,
"title": "唐盾一起从0基础学日语吧含50音 词汇试听)",
"watched": false,
"watchedHistory": 0
},
{
"aid": 77114885,
"cid": 132110244,
"duration": 3003,
"from": "pugv",
"id": 795,
"index": 2,
"page": 1,
"play": 49106,
"release_date": 1574766759,
"status": 2,
"title": "50音あ行假名/音调/送气与不送气音",
"watched": false,
"watchedHistory": 0
},
{
"aid": 77120689,
"cid": 131913553,
"duration": 3253,
"from": "pugv",
"id": 797,
"index": 3,
"page": 1,
"play": 49522,
"release_date": 1574770029,
"status": 2,
"title": "50音图的か行、さ行、た行假名",
"watched": false,
"watchedHistory": 0
},
{
"aid": 77606110,
"cid": 132897199,
"duration": 2823,
"from": "pugv",
"id": 806,
"index": 4,
"page": 1,
"play": 35800,
"release_date": 1575128696,
"status": 2,
"title": "50音图的な行、は行、ま行假名",
"watched": false,
"watchedHistory": 0
},
{
"aid": 78015255,
"cid": 133651764,
"duration": 2165,
"from": "pugv",
"id": 812,
"index": 5,
"page": 1,
"play": 25842,
"release_date": 1575446218,
"status": 2,
"title": "や行、ら行、わ行假名、拨音",
"watched": false,
"watchedHistory": 0
}
],
"page": {
"next": true,
"num": 1,
"size": 5,
"total": 66
}
},
"message": "success"
}
```
</details>

View File

@@ -0,0 +1,226 @@
# 课程视频流URL
- [获取课程视频流URLweb端](#获取课程视频流URLweb端)
---
<img src="../../assets/img/download.svg" width="100" height="100"/>
## 获取课程视频流URLweb端
> https://api.bilibili.com/pugv/player/web/playurl
*请求方式GET*
认证方式CookieSESSDATA
**注:**
1. 本接口为课程视频专用,故与普通视频不互通
2. 大部分使用方法及视频的取流方法继承[视频流url文档](../video/videostream_url.md)
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------------- | ------ | ------------------------------------------------------------ |
| avid | num | 课程avid | 必要 | |
| ep_id | num | 课程epid | 必要 | |
| cid | num | 视频cid | 必要 | |
| qn | num | 视频清晰度选择 | 非必要 | 参考[qn定义](../video/videostream_url.md#qn视频清晰度标识) |
| fnver | num | 视频流版本 | 非必要 | 参考[fnver定义](../video/videostream_url.md#fnver视频流版本标识) |
| fnval | num | 视频流类型 | 非必要 | 参考[fnval定义](../video/videostream_url.md#fnval视频流格式标识) |
| fourk | num | 是否允许4K视频 | 非必要 | 默认为0<br />画质最高1080P0<br />画质最高4K1 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功 <br />-400请求错误<br />-404无视频<br />-403权限不足未购买 |
| message | str | 错误信息 | 默认为success |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------ | ------ | ---------------------- | ---------------------------------------- |
| accept_format | str | 视频支持的分辨率的格式 | |
| code | num | 0 | |
| durl | array | 视频分段 | |
| seek_param | str | start | |
| no_rexcode | num | 0 | |
| format | str | 视频格式 | |
| fnval | num | 0 | |
| video_project | bool | true | |
| fnver | num | 0 | |
| message | str | 空 | |
| type | str | 视频格式 | |
| accept_quality | array | 视频支持的分辨率列表 | |
| quality | num | 视频分辨率代码 | **值含义见上表** |
| timelength | num | 视频长度 | 单位为毫秒<br />不同分辨率可能有略微差异 |
| result | str | suee | **作用尚不明确** |
| seek_type | str | offset | **作用尚不明确** |
| has_paid | bool | false | **作用尚不明确** |
| supportFormats | array | 视频分辨率详细列表 | |
| from | str | local | **作用尚不明确** |
| video_codecid | num | | **作用尚不明确** |
| accept_description | array | 视频支持的分辨率列表 | |
| status | num | 0 | **作用尚不明确** |
`data`中的`durl`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | ---- |
| 0 | obj | 视频分段1信息 | |
| n | obj | 视频分段(n+1)信息 | |
| …… | obj | …… | |
`durl`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ------ | ------------ | ---------------------------------- |
| size | num | 视频大小 | 单位为Byte |
| ahead | str | 空 | 作用尚不明确 |
| length | num | 视频长度 | 单位为毫秒 |
| vhead | str | 空 | 作用尚不明确 |
| backup_url | array | 备用视频流 | |
| url | str | 视频流url | 链接有效时间为120min |
| order | num | 视频分段序号 | 某些视频会分为多个片段 |
`durl`数组中的对象中的`backup_url`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---------------- |
| 0 | str | 备用视频流url | 有效时间为120min |
`data`中的`supportFormats`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------- | ---- |
| 0 | obj | 分辨率详细信息1 | |
| n | obj | 分辨率详细信息(n+1) | |
| …… | obj | …… | …… |
`supportFormats`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ---------- | ---- |
| format | str | 分辨率名称 | |
| description | atr | 分辨率备注 | |
| quality | num | 分辨率代码 | |
`data`中的`accept_description`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | str | 分辨率名称1 | |
| n | str | 分辨率名称(n+1) | |
| …… | str | …… | …… |
**示例:**
获取课程`ep790`cid=`132105993`avid=`76973173`的视频流url清晰度为1080P60
```shell
curl -G 'https://api.bilibili.com/pugv/player/web/playurl' \
--data-urlencode 'ep_id=790' \
--data-urlencode 'avid=76973173' \
--data-urlencode 'cid=132105993' \
--data-urlencode 'qn=116' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"accept_format": "flv_p60,flv720_p60,flv,flv720,flv480,flv360",
"code": 0,
"durl": [
{
"size": 1105854161,
"ahead": "",
"length": 2222204,
"vhead": "",
"backup_url": [
"https://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/93/59/132105993/132105993_da2-1-116.flv?e=ig8euxZM2rNcNbNghzTBhwdlhbNz7bUVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1591596728&gen=playurl&os=ks3cbv&oi=606633803&trid=76bea9a9e56f4cb89a9aff2f8213c9acu&platform=pc&upsig=b271bf493bff32ffe62969582c8d18b4&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=0&orderid=1,2&logo=40000000"
],
"url": "https://upos-sz-mirrorks3.bilivideo.com/upgcxcode/93/59/132105993/132105993_da2-1-116.flv?e=ig8euxZM2rNcNbNghzTBhwdlhbNz7bUVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1591596728&gen=playurl&os=ks3bv&oi=606633803&trid=76bea9a9e56f4cb89a9aff2f8213c9acu&platform=pc&upsig=6a8ae3711bd0bb2a484ec2427d659b14&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=0&orderid=0,2&logo=80000000",
"order": 1,
"md5": ""
}
],
"seek_param": "start",
"no_rexcode": 0,
"format": "flv_p60",
"fnval": 0,
"video_project": true,
"fnver": 0,
"message": "",
"type": "FLV",
"accept_quality": [
116,
74,
80,
64,
32,
16
],
"quality": 116,
"timelength": 2222204,
"result": "suee",
"seek_type": "offset",
"has_paid": false,
"supportFormats": [
{
"format": "flv_p60",
"description": "高清 1080P60",
"quality": 116
},
{
"format": "flv720_p60",
"description": "高清 720P60",
"quality": 74
},
{
"format": "flv",
"description": "高清 1080P",
"quality": 80
},
{
"format": "flv720",
"description": "高清 720P",
"quality": 64
},
{
"format": "flv480",
"description": "清晰 480P",
"quality": 32
},
{
"format": "flv360",
"description": "流畅 360P",
"quality": 16
}
],
"from": "local",
"video_codecid": 7,
"accept_description": [
"高清 1080P60",
"高清 720P60",
"高清 1080P",
"高清 720P",
"清晰 480P",
"流畅 360P"
],
"status": 0
},
"message": "success"
}
```
</details>

View File

@@ -0,0 +1,95 @@
# 终端信息查询
- [终端信息查询](#终端信息查询)
---
## 终端信息查询
> https://api.bilibili.com/client_info
*请求方式:任意*
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | -------- | ------------------- | ------------ |
| country | str | 国家/地区名 | |
| ip | str | 公网IP地址 | |
| province | str | 省/州 | 非必须存在项 |
| city | str | 城市 | 非必须存在项 |
| district | district | | |
| isp | str | 运营商名 | |
| dns | str | dns服务器ip | |
| dns_isp | str | dns服务器ip运营商名 | |
| headers | obj | 头部字段 | |
`data`中的`headers`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------------------------- | ---- | ----------------- | ---- |
| HTTP_ACCEPT_ENCODING | str | | |
| HTTP_X_CACHE_SERVER | str | CDN服务器名 | |
| HTTP_X_CACHE_SERVER_ADDR | str | CDN服务器ip | |
| HTTP_X_BACKEND_BILI_REAL_IP | str | 真实服务器ip | |
| HTTP_X_BACKEND_BILI_REAL_IPPORT | str | 真实服务器端口 | |
| HTTP_X_BACKEND_BILI_REAL_IP_CHAIN | str | 真实服务器ip+端口 | |
| HTTP_X_SCHEME | str | 访问协议 | |
| HTTP_HOST | str | 访问域名 | |
| HTTP_USER_AGENT | str | 客户端UA | |
| HTTP_ACCEPT | str | | |
| HTTP_CACHE_CONTROL | str | | |
**示例:**
```shell
curl 'https://api.bilibili.com/client_info'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "ok",
"data": {
"country": "中国",
"ip": "36.40.120.140",
"province": "陕西",
"city": "渭南",
"district": null,
"isp": "电信",
"dns": null,
"dns_isp": null,
"headers": {
"HTTP_ACCEPT_ENCODING": "gzip",
"HTTP_X_CACHE_SERVER": "ks-bj-webcdn-07",
"HTTP_X_CACHE_SERVER_ADDR": "10.33.2.170",
"HTTP_X_BACKEND_BILI_REAL_IP": "36.40.120.140",
"HTTP_X_BACKEND_BILI_REAL_IPPORT": "22058",
"HTTP_X_BACKEND_BILI_REAL_IP_CHAIN": "36.40.120.140:22058",
"HTTP_X_SCHEME": "https",
"HTTP_HOST": "api.bilibili.com",
"HTTP_USER_AGENT": "PostmanRuntime/7.26.8",
"HTTP_ACCEPT": "*/*",
"HTTP_CACHE_CONTROL": "no-cache"
}
}
}
```
</details>

66
docs/clientinfo/ip.md Normal file
View File

@@ -0,0 +1,66 @@
# 通过ip确定地理位置
- [通过ip确定位置](#通过ip确定位置)
---
## 通过ip确定位置
> https://api.bilibili.com/x/web-interface/zone
*请求方式GET*
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ------------- | ------------ |
| addr | str | 公网IP地址 | |
| country | str | 国家/地区名 | |
| province | str | 省/州 | 非必须存在项 |
| city | str | 城市 | 非必须存在项 |
| isp | str | 运营商名 | |
| latitude | num | 纬度 | |
| longitude | num | 经度 | |
| zone_id | num | ip数据库id | |
| country_code | num | 国家/地区代码 | |
**示例:**
```shell
curl 'https://api.bilibili.com/x/web-interface/zone'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"addr":"36.40.120.145",
"country":"中国",
"province":"陕西",
"city":"渭南",
"isp":"电信",
"latitude":34.4995,
"longitude":109.492821,
"zone_id":4472912,
"country_code":86
}
}
```
</details>

544
docs/comment/action.md Normal file
View File

@@ -0,0 +1,544 @@
# 评论区操作
- [发表评论](#发表评论)
- [点赞评论](#点赞评论)
- [点踩评论](#点踩评论)
- [删除评论](#删除评论)
- [置顶评论](#置顶评论)
- [举报评论](#举报评论)
---
## 发表评论
> https://api.bilibili.com/x/v2/reply/add
*请求方式POST*
认证方式CookieSESSDATA或APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** |
| oid | num | 目标评论区id | 必要 | |
| root | num | 根评论rpid | 非必要 | 二级评论以上使用 |
| parent | num | 父评论rpid | 非必要 | 二级评论同根评论id<br />大于二级评论为要回复的评论id |
| message | str | 发送评论内容 | 必要 | 最大1000字符<br />表情使用表情转义符 |
| plat | num | 发送平台标识 | 非必要 | 1web端<br />2安卓客户端<br />3ios客户端<br />4wp客户端<br />默认为1 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-404无此项<br />-509请求过于频繁<br />12001已经存在评论主题<br />12002评论区已关闭<br />12003禁止回复<br />12006没有该评论<br />12009评论主体的type不合法<br />12015需要评论验证码<br />12016评论内容包含敏感信息<br />12025评论字数过多<br />12035该账号被UP主列入评论黑名单<br />12051重复评论请勿刷屏<br />12052评论区已关闭<br />**(其他错误码有待补充)** |
| message | str | 错误信息 | <br /> |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ----------------------------- | -------------- | ------------------------------------------------------------ |
| success_action | num | 0 | **作用尚不明确** |
| success_toast | str | 状态文字 | |
| need_captcha | bool | false | 评论需要验证码(未证实) |
| url | str | 空 | **作用尚不明确** |
| rpid | num | 评论rpid | |
| rpid_str | str | 评论rpid | 字串格式 |
| dialog | num | 回复对方rpid | 若为一级评论则为0<br />若为二级评论则为该评论id<br />大于二级评论为上一级评论id |
| dialog_str | str | 回复对方rpid | 字串格式 |
| root | num | 根评论rpid | 若为一级评论则为0<br />大于一级评论则为根评论id |
| root_str | str | 根评论rpid | 字串格式 |
| parent | num | 回复父评论rpid | 若为一级评论则为0<br />若为二级评论则为根评论id<br />大于二级评论为上一级评论id |
| parent_str | str | 回复父评论rpid | 字串格式 |
| emote | obj | 表情转义符信息 | [对象定义见表](readme.md#评论条目对象) |
| reply | 有效时obj<br />无效时null | | [对象定义见表](readme.md#评论条目对象) |
**示例:**
给视频`av243322853`发送内容为`测试test[泠鸢yousa_awsl]`的评论带有表情转义符平台标识为1web端
```shell
curl 'https://api.bilibili.com/x/v2/reply/add' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=243322853' \
--data-urlencode 'message=测试test[泠鸢yousa_awsl]' \
--data-urlencode 'plat=1' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"success_action": 0,
"success_toast": "发送成功",
"need_captcha": false,
"url": "",
"rpid": 3043212039,
"rpid_str": "3043212039",
"dialog": 0,
"dialog_str": "0",
"root": 0,
"root_str": "0",
"parent": 0,
"parent_str": "0",
"emote": {
"[泠鸢yousa_awsl]": {
"id": 2086,
"package_id": 93,
"state": 0,
"type": 3,
"attr": 0,
"text": "[泠鸢yousa_awsl]",
"url": "http://i0.hdslb.com/bfs/emote/7663b729161bd4556c2ec318c07791000743eb56.png",
"meta": {
"size": 2
},
"mtime": 1589776042
}
},
"reply": {
"rpid": 3043212039,
"oid": 243322853,
"type": 1,
"mid": 293793435,
"root": 0,
"parent": 0,
"dialog": 0,
"count": 0,
"rcount": 0,
"state": 0,
"fansgrade": 0,
"attr": 0,
"ctime": 1592233764,
"rpid_str": "3043212039",
"root_str": "0",
"parent_str": "0",
"like": 0,
"action": 0,
"member": {
"mid": "293793435",
"uname": "社会易姐QwQ",
"sex": "男",
"sign": "高中技术宅一枚爱好MC&电子&8-bit音乐&数码&编程,资深猿厨",
"avatar": "http://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg",
"rank": "10000",
"DisplayRank": "0",
"level_info": {
"current_level": 5,
"current_min": 0,
"current_exp": 0,
"next_exp": 0
},
"pendant": {
"pid": 1888,
"name": "泠鸢yousa",
"image": "http://i0.hdslb.com/bfs/garb/item/3e66e712b8e70c6b02393c54ad5fd8d993eb39f9.png",
"expire": 0,
"image_enhance": "http://i0.hdslb.com/bfs/garb/item/3e66e712b8e70c6b02393c54ad5fd8d993eb39f9.png"
},
"nameplate": {
"nid": 0,
"name": "",
"image": "",
"image_small": "",
"level": "",
"condition": ""
},
"official_verify": {
"type": -1,
"desc": ""
},
"vip": {
"vipType": 2,
"vipDueDate": 1612454400000,
"dueRemark": "",
"accessStatus": 0,
"vipStatus": 1,
"vipStatusWarn": "",
"themeType": 0,
"label": {
"path": "",
"text": "年度大会员",
"label_theme": "annual_vip"
}
},
"fans_detail": null,
"following": 0,
"is_followed": 0,
"user_sailing": {
"pendant": {
"id": 1888,
"name": "泠鸢yousa",
"image": "http://i0.hdslb.com/bfs/garb/item/3e66e712b8e70c6b02393c54ad5fd8d993eb39f9.png",
"jump_url": "",
"type": "suit"
},
"cardbg": null,
"cardbg_with_focus": null
}
},
"content": {
"message": "测试test[泠鸢yousa_awsl]",
"plat": 1,
"device": "",
"members": [],
"emote": {
"[泠鸢yousa_awsl]": {
"id": 2086,
"package_id": 93,
"state": 0,
"type": 3,
"attr": 0,
"text": "[泠鸢yousa_awsl]",
"url": "http://i0.hdslb.com/bfs/emote/7663b729161bd4556c2ec318c07791000743eb56.png",
"meta": {
"size": 2
},
"mtime": 1589776042
}
},
"jump_url": {},
"max_line": 0
},
"replies": null,
"assist": 0,
"folder": {
"has_folded": false,
"is_folded": false,
"rule": "https://www.bilibili.com/blackboard/foldingreply.html"
},
"up_action": {
"like": false,
"reply": false
},
"show_follow": false
}
}
}
```
</details>
## 点赞评论
> https://api.bilibili.com/x/v2/reply/action
*请求方式POST*
认证方式CookieSESSDATA或APP
点赞成功后会同时消去该评论的点踩
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** |
| oid | num | 目标评论区id | 必要 | |
| rpid | num | 目标评论rpid | 必要 | |
| action | num | 操作代码 | 非必要 | 默认为0<br />0取消赞<br />1点赞 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-404无此项<br />-509请求过于频繁<br />12002评论区已关闭<br />12004禁止操作 赞或踩<br />12006没有该评论<br />12009评论主体的type不合法<br />12011不合法的赞或踩<br />**(其他错误码有待补充)** |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
点赞视频`av243322853`下评论`rpid=3039053308`
```shell
curl 'https://api.bilibili.com/x/v2/reply/action' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=243322853' \
--data-urlencode 'rpid=3039053308' \
--data-urlencode 'action=1' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 点踩评论
> https://api.bilibili.com/x/v2/reply/hate
*请求方式POST*
认证方式CookieSESSDATA或APP
点踩成功后会同时消去该评论的点赞
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** |
| oid | num | 目标评论区id | 必要 | |
| rpid | num | 目标评论rpid | 必要 | |
| action | num | 操作代码 | 非必要 | 默认为0<br />0取消踩<br />1点踩 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-404无此项<br />-509请求过于频繁<br />12002评论区已关闭<br />12004禁止操作 赞或踩<br />12006没有该评论<br />12009评论主体的type不合法<br />12011不合法的赞或踩<br />**(其他错误码有待补充)** |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
点踩视频`av243322853`下评论`rpid=3039053308`
```shell
curl 'https://api.bilibili.com/x/v2/reply/hate' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=243322853' \
--data-urlencode 'rpid=3039053308' \
--data-urlencode 'action=1' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 删除评论
> https://api.bilibili.com/x/v2/reply/del
*请求方式POST*
认证方式CookieSESSDATA或APP
只能删除自己的评论,或自己管理的评论区下的评论
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** |
| oid | num | 目标评论区id | 必要 | |
| rpid | num | 目标评论rpid | 必要 | |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-403权限不足<br />-404无此项<br />-509请求过于频繁<br />12002评论区已关闭<br />12009评论主体的type不合法<br />12022已经被删除了<br />**(其他错误码有待补充)** |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | **作用尚不明确** |
**示例:**
删除`av243322853`下评论`rpid=3039053308`
```shell
curl 'https://api.bilibili.com/x/v2/reply/del' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=243322853' \
--data-urlencode 'rpid=3039053308' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 置顶评论
> https://api.bilibili.com/x/v2/reply/top
*请求方式POST*
认证方式CookieSESSDATA或APP
只能置顶自己管理的评论区中的一级评论
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** |
| oid | num | 目标评论区id | 必要 | |
| rpid | num | 目标评论rpid | 必要 | |
| action | num | 操作代码 | 非必要 | 默认为0<br />0取消置顶<br />1设为置顶 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-403权限不足<br />-404无此项<br />-509请求过于频繁<br />12002评论区已关闭<br />12006没有该评论<br />12009评论主体的type不合法<br />12029已经有置顶评论<br />12030不能置顶非一级评论<br />**(其他错误码有待补充)** |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
置顶视频`av243322853`下评论`rpid=2940645593`
```shell
curl 'https://api.bilibili.com/x/v2/reply/top' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=243322853' \
--data-urlencode 'rpid=2940645593' \
--data-urlencode 'action=1' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 举报评论
> https://api.bilibili.com/x/v2/reply/report
*请求方式POST*
认证方式CookieSESSDATA或APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** |
| oid | num | 目标评论区id | 必要 | |
| rpid | num | 目标评论rpid | 必要 | |
| reason | num | 举报类型 | 必要 | **类型代码见下表** |
| content | str | 其他举报备注 | 非必要 | `reason=0`时有效 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
举报类型`reason`
| 代码 | 含义 |
| ---- | -------------- |
| 0 | 其他 |
| 1 | 垃圾广告 |
| 2 | 色情 |
| 3 | 刷屏 |
| 4 | 引战 |
| 5 | 剧透 |
| 6 | 政治 |
| 7 | 人身攻击 |
| 8 | 内容不相关 |
| 9 | 违法违规 |
| 10 | 低俗 |
| 11 | 非法网站 |
| 12 | 赌博诈骗 |
| 13 | 传播不实信息 |
| 14 | 怂恿教唆信息 |
| 15 | 侵犯隐私 |
| 16 | 抢楼 |
| 17 | 青少年不良信息 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-403权限不足<br />-404无此项<br />-500服务器错误<br />-509请求过于频繁<br />12002评论区已关闭<br />12006没有该评论<br />12008已经举报过了<br />12009评论主体的type不合法<br />12019举报过于频繁<br />**(其他错误码有待补充)** |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
举报视频` av752881391 `下评论`rpid=3062537442`,理由是`引战`
```shell
curl 'https://api.bilibili.com/x/v2/reply/report' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=752881391' \
--data-urlencode 'rpid=3062537442' \
--data-urlencode 'reason=4' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>

5853
docs/comment/list.md Normal file

File diff suppressed because it is too large Load Diff

336
docs/comment/readme.md Normal file
View File

@@ -0,0 +1,336 @@
# 评论区
<img src="../../assets/img/comment.svg" width="100" height="100"/>
评论系统为全站通用且APP与web端接口共用以type标明对象类型以oid指向响应的对象id
---
**继续查看:**
- [查询类](list.md)
- [操作类](action.md)
## 评论区类型代码
PS以下部分内容来源不明有待验证
| 代码 | 评论区类型 | oid 的意义 |
| ---- | ----------------------- | ----------- |
| 1 | 视频稿件 | 稿件 avid |
| 2 | 话题 | 话题 id |
| 4 | 活动 | 活动 id |
| 5 | 小视频 | 小视频 id |
| 6 | 小黑屋封禁信息 | 封禁公示 id |
| 7 | 公告信息 | 公告 id |
| 8 | 直播活动 | 直播间 id |
| 9 | 活动稿件 | (?) |
| 10 | 直播公告 | (?) |
| 11 | 相簿(图片动态) | 相簿 id |
| 12 | 专栏 | 专栏 cvid |
| 13 | 票务 | (?) |
| 14 | 音频 | 音频 auid |
| 15 | 风纪委员会 | 众裁项目 id |
| 16 | 点评 | (?) |
| 17 | 动态(纯文字动态&分享) | 动态 id |
| 18 | 播单 | (?) |
| 19 | 音乐播单 | (?) |
| 20 | 漫画 | (?) |
| 21 | 漫画 | (?) |
| 22 | 漫画 | 漫画 mcid |
| 33 | 课程 | 课程 epid |
## 评论条目对象
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ------------------------------- | ------------------ | ------------------------------------------------------------ |
| rpid | num | 评论 rpid | |
| oid | num | 评论区对象 id | |
| type | num | 评论区类型代码 | **类型代码见上表** |
| mid | num | 发送者 mid | |
| root | num | 根评论 rpid | 若为一级评论则为 0<br />大于一级评论则为根评论 id |
| parent | num | 回复父评论 rpid | 若为一级评论则为 0<br />若为二级评论则为根评论 rpid<br />大于二级评论为上一级评 论 rpid |
| dialog | num | 回复对方 rpid | 若为一级评论则为 0<br />若为二级评论则为该评论 rpid<br />大于二级评论为上一级评论 rpid |
| count | num | 二级评论条数 | |
| rcount | num | 回复评论条数 | |
| floor | num | 评论楼层号 | **注:若不支持楼层则无此项** |
| state | num | (?) | |
| fansgrade | num | 是否具有粉丝标签 | 0<br />1有 |
| attr | num | 某属性位? | |
| ctime | num | 评论发送时间 | 时间戳 |
| rpid_str | str | 评论rpid | 字串格式 |
| root_str | str | 根评论rpid | 字串格式 |
| parent_str | str | 回复父评论rpid | 字串格式 |
| like | num | 评论获赞数 | |
| action | num | 当前用户操作状态 | 需要登录(Cookie 或 APP) <br />否则恒为 0<br />0<br />1已点赞<br />2已点踩 |
| member | obj | 评论发送者信息 | |
| content | obj | 评论信息 | |
| replies | 无效时null<br />有效时array | 评论回复条目预览 | **仅嵌套一层**<br />否则为 null |
| assist | num | (?) | |
| folder | obj | 折叠信息 | |
| up_action | obj | 评论 UP 主操作信息 | |
| show_follow | bool | (?) | |
| invisible | bool | | |
| card_label | obj | 右上角卡片标签信息 | |
| reply_control | obj | 评论提示文案信息 | |
`评论条目`中的`member`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ----------------------------- | ---------------------- | ------------------------------------------------------------ |
| mid | str | 发送者 mid | |
| uname | str | 发送者昵称 | |
| sex | str | 发送者性别 | 男 女 保密 |
| sign | str | 发送者签名 | |
| avatar | str | 发送者头像 url | |
| rank | str | (?) | |
| DisplayRank | str | (?) | |
| level_info | obj | 发送者等级 | |
| pendant | obj | 发送者头像框信息 | |
| nameplate | obj | 发送者勋章信息 | |
| official_verify | obj | 发送者认证信息 | |
| vip | obj | 发送者会员信息 | |
| fans_detail | 无效时null<br />有效时obj | 发送者粉丝标签 | |
| following | num | 是否关注该用户 | 需要登录(Cookie或APP) <br />否则恒为0<br />0未关注<br />1已关注 |
| is_followed | num | 是否被该用户关注 | 需要登录(Cookie或APP) <br />否则恒为0<br />0未关注<br />1已关注 |
| user_sailing | obj | 发送者评论条目装扮信息 | |
| is_contractor | bool | 是否为合作用户? | |
| contract_desc | str | 合作用户说明? | |
`member`中的`level_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | -------- | ---- |
| current_level | num | 用户等级 | |
| current_min | num | 0 | |
| current_exp | num | 0 | |
| next_exp | num | 0 | |
`member`中的`pendant`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------- | ---- | -------------- | ---- |
| pid | num | 头像框 id | |
| name | str | 头像框名称 | |
| image | str | 头像框图片 url | |
| expire | num | 0 | |
| image_enhance | str | 头像框图片 url | |
| image_enhance_frame | str | (?) | |
`member`中的`nameplate`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ----------------- | ---- |
| nid | num | 勋章 id | |
| name | str | 勋章名称 | |
| image | str | 挂件图片 url 正常 | |
| image_small | str | 勋章图片 url 小 | |
| level | str | 勋章等级 | |
| condition | str | 勋章条件 | |
`member`中的`official_verify`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---------------------------------------- |
| type | num | 是否认证 | -1<br />0个人认证<br />1机构认证 |
| desc | str | 认证信息 | 无为空 |
`member`中的`vip`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------------- | ---- | -------------- | --------------------------------------- |
| vipType | num | 大会员类型 | 0<br />1月会员<br />2年以上会员 |
| vipDueDate | num | 大会员到期时间 | 毫秒 时间戳 |
| dueRemark | str | (?) | |
| accessStatus | num | (?) | |
| vipStatus | num | 大会员状态 | 0<br />1有 |
| vipStatusWarn | str | (?) | |
| theme_type | num | 会员样式 id | |
| label | obj | 会员铭牌样式 | |
| avatar_subscript | num | (?) | |
| avatar_subscript_url | str | (?) | |
| nickname_color | str | 昵称颜色 | |
`vip`中的`label`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ------------ | ------------------------------------------------------------ |
| path | str | (?) | |
| text | str | 会员类型文案 | |
| label_theme | str | 会员类型 | vip大会员<br />annual_vip年度大会员<br />ten_annual_vip十年大会员<br />hundred_annual_vip百年大会员 |
| text_color | str | 文字颜色? | |
| bg_style | num | (?) | |
| bg_color | str | 背景颜色? | |
| border_color | str | 描边颜色? | |
`member`中的`fans_detail`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ------------ | ---- |
| uid | num | 用户 mid | |
| medal_id | num | 粉丝标签 id | |
| medal_name | str | 粉丝标签名 | |
| score | num | (?) | |
| level | num | 当前标签等级 | |
| intimacy | num | (?) | |
| master_status | num | (?) | |
| is_receive | num | (?) | |
`member`中的`user_sailing`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ----------------------------- | ------------ | ---- |
| pendant | 无效时null<br />有效时obj | 头像框信息 | |
| cardbg | 无效时null<br />有效时obj | 评论卡片装扮 | |
| cardbg_with_focus | null | (?) | |
`user_sailing`中的`pendant`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------- | ---- | -------------- | -------------------------------------- |
| id | num | 头像框 id | |
| name | str | 头像框名称 | |
| image | str | 头像框图片 url | |
| jump_url | str | 空 | |
| type | str | 装扮类型 | suit一般装扮<br />vip_suitvip 装扮 |
| image_enhance | str | (?) | |
| image_enhance_frame | str | (?) | |
`user_sailing`中的`cardbg`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------------------------ | -------------------------------------- |
| id | num | 评论条目装扮 id | |
| name | str | 评论条目装扮名称 | |
| image | str | 评论条目装扮图片 url | |
| jump_url | str | 评论条目装扮商城页面 url | |
| fan | obj | 粉丝专属信息 | |
| type | str | 装扮类型 | suit一般装扮<br />vip_suitvip 装扮 |
`cardbg`中的`fan`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------------------ | ---------------- |
| is_fan | num | 是否为粉丝专属装扮 | 0<br />1是 |
| number | num | 粉丝专属编号 | |
| color | str | 数字颜色 | 颜色码 |
| name | str | 装扮名称 | |
| num_desc | str | 粉丝专属编号 | 字串格式 |
`评论条目`中的`content`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------------------ | ------------------------------------------------------------ |
| message | str | 评论内容 | **重要** |
| plat | num | 评论发送端 | 1web端<br />2安卓客户端<br />3ios 客户端<br />4wp 客户端 |
| device | str | 评论发送平台设备 | |
| members | array | at 到的用户信息 | |
| emote | obj | 需要渲染的表情转义 | 评论内容无表情则无此项 |
| jump_url | obj | 需要高亮的超链转义 | |
| max_line | num | 6 | 收起最大行数 |
`content`中的`members`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------------- | -------------------------------- |
| 0 | obj | at到的用户 1 | 基本同`评论条目`中的`member`对象 |
| n | obj | at到的用户 (n+1) | 项数为at到的不同的用户数 |
| …… | obj | …… | …… |
`content`中的`emote`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ---------------- | -------- |
| {表情转义符} | obj | 表情转义符信息 1 | |
| …… | obj | 表情转义符信息 n | 向下扩展 |
`emote`中的`{表情转义符}`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------ | -------------------------------------------------------- |
| id | num | 表情 id | |
| package_id | num | 表情包 id | |
| state | num | 0 | |
| type | num | 表情类型 | 1免费<br />2会员专属<br />3购买所得<br />4颜文字 |
| attr | num | (?) | |
| text | str | 表情转义符 | |
| url | str | 表情图片 url | |
| meta | obj | 属性信息 | |
| mtime | num | 表情创建时间 | 时间戳 |
| jump_title | str | 表情名称 | |
`{表情转义符}`中的`meta`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ------------ | ---------------- |
| size | num | 表情尺寸信息 | 1<br />2大 |
| alias | str | 简写名 | 无则无此项 |
`content`中的`jump_url`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | -------------- | -------- |
| {超链转义} | obj | 超链转义信息 1 | |
| …… | obj | 超链转义信息 n | 向下扩展 |
`jump_url`中的`{超链转义}`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | -------- | ---- |
| title | str | 标题 | |
| state | num | 图标 url | |
| prefixIcon | str | (?) | |
| appUrlSchema | str | (?) | |
| appName | str | (?) | |
| appPackageName | str | (?) | |
| clickReport | str | 上报 id | |
`评论条目`中的`replies`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ------------------------------------------------------------ |
| 0 | obj | 回复条目1 | **为本对象的递归嵌套**<br />**仅可嵌套一层**<br />按照热度顺序排列 |
| 1 | obj | 回复条目2 | |
| 2 | obj | 回复条目3 | 最后一项 |
`评论条目`中的`folder`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ---------------------- | ---- |
| has_folded | bool | 是否有被折叠的二级评论 | |
| is_folded | bool | 评论是否被折叠 | |
| rule | str | 相关规则页面 url | |
`评论条目`中的`up_action`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ---------------- | ----------------------- |
| like | bool | 是否UP主觉得很赞 | false<br />true是 |
| reply | bool | 是否被UP主回复 | false<br />true是 |
`评论条目`中的`card_label`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------------- | ---- | ------------ | ----------------------------- |
| rpid | num | 评论 rpid | |
| text_content | str | 标签文本 | 已知有`妙评` |
| text_color_day | str | 日间文本颜色 | 十六进制颜色值,下同 |
| text_color_night | str | 夜间文本颜色 | |
| label_color_day | str | 日间标签颜色 | |
| label_color_night | str | 夜间标签颜色 | |
| image | str | | 作用不明 |
| type | str | 1 | 作用不明 |
| background | str | 背景图片 url | |
| background_width | num | 背景图片宽度 | |
| background_height | num | 背景图片高度 | |
| jump_url | str | 跳转链接 | |
| effect | num | 0 | 作用不明,可能用于控制动画,下同 |
| effect_start_time | num | 0 | |
`评论条目`中的`reply_control`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------------- | ---- | -------- | -------------------- |
| sub_reply_entry_text | str | 回复提示 | `共 xx 条回复` |
| sub_reply_title_text | str | 回复提示 | `相关回复共有 xx 条` |
| time_desc | str | 时间提示 | `xx 天/小时 前发布` |

View File

@@ -0,0 +1,275 @@
# 电磁力相关
- [获取电磁力等级web端](#获取电磁力等级web端)
- [获取电磁力详细数值(双端)](#获取电磁力详细数值双端)
- [获取电磁力数值历史变化(双端)](#获取电磁力数值历史变化双端)
---
电磁力每周日下午刷新
## 获取电磁力等级web端
> https://member.bilibili.com/x/web/elec/user
*请求方式GET*
认证方式仅可CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ----------- | ---------------- |
| mid | num | 当前用户mid | |
| state | num | 电磁力等级 | |
| reason | str | 空 | **作用尚不明确** |
**示例:**
```shell
curl 'https://member.bilibili.com/x/web/elec/user' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"mid": 293793435,
"state": 2,
"reason": ""
}
}
```
</details>
## 获取电磁力详细数值(双端)
> https://api.bilibili.com/studio/up-rating/rating/summary
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ---- | -------------- | ---- |
| date | str | 数据刷新时间 | YYYY-MM-DD |
| level | obj | 电磁力等级 | |
| creative | obj | 创作力 | |
| influence | obj | 影响力 | |
| credit | obj | 信用分 | |
`data`中的`level` `creative` `influence` `credit`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ---- |
| data | num | 数值 | |
| prev | num | | **作用尚不明确** |
| desc | str | 描述 | |
| date | num | 刷新时间 | 时间戳 |
**示例:**
Cookie方式
```shell
curl 'https://api.bilibili.com/studio/up-rating/rating/summary' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl -G 'https://api.bilibili.com/studio/up-rating/rating/summary' \
--data-urlencode 'access_key=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"date": "2020-07-05",
"level": {
"data": 1,
"prev": 0,
"desc": "正式开启创作之路,希望未来的路上我们携手相伴,创作更多优质内容~",
"date": 1593878400
},
"creative": {
"data": 39,
"prev": 39,
"desc": "考察近一年来的创作行为,良好的原创投稿行为和互动数据有助于提升创作力。",
"date": 1593878400
},
"influence": {
"data": 54,
"prev": 54,
"desc": "根据近一年活跃粉丝数据进行评估,良好的粉丝活跃度是影响力的基础。",
"date": 1593878400
},
"credit": {
"data": 100,
"prev": 100,
"desc": "良好的投稿记录将维持较高的信用分,违反投稿公约的行为将扣除信用分。",
"date": 1594106147
}
}
}
```
</details>
## 获取电磁力数值历史变化(双端)
> https://api.bilibili.com/studio/up-rating/rating/history
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | -------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 目标数据类型 | 必要 | 类型代码见下表 |
类型代码`type`
| 代码 | 含义 |
| ---- | ------ |
| 1 | 创作力 |
| 2 | 影响力 |
| 3 | 信用分 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ----- | ------------ | -------- |
| date | array | 数据记录时间 | 每周更新 |
| score | array | 电磁力等级 | 每周更新 |
`data`中的`date`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | -------------- |
| 0 | str | 1周前的日期 | MM-DD |
| n | str | n+1周前的日期 | 与数值一一对应 |
| …… | str | …… | …… |
| 7 | str | 8周前的日期 | 最后一条 |
`data`中的`score`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | -------------- |
| 0 | num | 1周前的数值 | |
| n | num | n+1周前的数值 | 与日期一一对应 |
| …… | num | …… | …… |
| 7 | num | 8周前的数值 | 最后一条 |
**示例:**
查询创作力的历史变化
Cookie方式
```shell
curl -G 'https://api.bilibili.com/studio/up-rating/rating/history' \
--data-urlencode 'type=1' \
-b 'SESSDATA=xxx'
```
APP方式
```shell
curl -G 'https://api.bilibili.com/studio/up-rating/rating/history' \
--data-urlencode 'type=1' \
--data-urlencode 'access_key=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"date": [
"05-17",
"05-24",
"05-31",
"06-07",
"06-14",
"06-21",
"06-28",
"07-05"
],
"score": [
48,
48,
49,
49,
49,
49,
49,
49
]
}
}
```
</details>

View File

@@ -0,0 +1,811 @@
# 统计与数据
- [UP主视频状态数据](#UP主视频状态数据)
- [UP主专栏状态数据](#UP主专栏状态数据)
- [视频数据增量趋势](#视频数据增量趋势)
- [专栏数据增量趋势](#专栏数据增量趋势)
- [稿件操作来源占比情况](#稿件操作来源占比情况)
- [播放来源占比情况(平台及方式)](#播放来源占比情况平台及方式)
- [播放分布情况(粉丝与路人)](#播放分布情况粉丝与路人)
---
统计与数据次日中午12刷新
## UP主视频状态数据
> https://member.bilibili.com/x/web/index/stat
*请求方式GET*
认证方式仅可CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ---- | -------------- | ---- |
| inc_coin | num | 新增投币数 | |
| inc_elec | num | 新增充电数 | |
| inc_fav | num | 新增收藏数 | |
| inc_like | num | 新增点赞数 | |
| inc_share | num | 新增分享数 | |
| incr_click | num | 新增播放数 | |
| incr_dm | num | 新增弹幕数 | |
| incr_fans | num | 新增粉丝数 | |
| incr_reply | num | 新增评论数 | |
| total_click | num | 总计播放数 | |
| total_coin | num | 总计投币数 | |
| total_dm | num | 总计弹幕数 | |
| total_elec | num | 总计充电数 | |
| total_fans | num | 总计粉丝数 | |
| total_fav | num | 总计收藏数 | |
| total_like | num | 总计点赞数 | |
| total_reply | num | 总计评论数 | |
| total_share | num | 总计分享数 | |
**示例:**
```shell
curl 'https://member.bilibili.com/x/web/index/stat' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"inc_coin": 0,
"inc_elec": 0,
"inc_fav": 0,
"inc_like": 0,
"inc_share": 0,
"incr_click": 0,
"incr_dm": 0,
"incr_fans": 1,
"incr_reply": 0,
"total_click": 9,
"total_coin": 1,
"total_dm": 0,
"total_elec": 0,
"total_fans": 29,
"total_fav": 1,
"total_like": 1,
"total_reply": 0,
"total_share": 0
}
}
```
</details>
## UP主专栏状态数据
> https://member.bilibili.com/x/web/data/article
*请求方式GET*
认证方式仅可CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ---------- | ---- |
| view | num | 总计阅读数 | |
| reply | num | 总计评论数 | |
| like | num | 总计点赞数 | |
| coin | num | 总计投币数 | |
| fav | num | 总计收藏数 | |
| share | num | 总计分享数 | |
| incr_view | num | 新增阅读数 | |
| incr_reply | num | 新增评论数 | |
| incr_like | num | 新增点赞数 | |
| incr_coin | num | 新增投币数 | |
| incr_fav | num | 新增收藏数 | |
| incr_share | num | 新增分享数 | |
**示例:**
```shell
curl 'https://member.bilibili.com/x/web/data/article' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"view": 290,
"reply": 17,
"like": 34,
"coin": 9,
"fav": 15,
"share": 7,
"incr_view": 6,
"incr_reply": 0,
"incr_like": 0,
"incr_coin": 0,
"incr_fav": 0,
"incr_share": 0
}
}
```
</details>
## 视频数据增量趋势
> https://member.bilibili.com/x/web/data/article/thirty
*请求方式GET*
认证方式仅可CookieSESSDATA
数据为前30天
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------ | -------------- |
| type | num | 目标数据类型 | 必要 | 类型代码见下表 |
类型代码`type`
| 代码 | 含义 |
| ---- | ---- |
| 1 | 播放 |
| 2 | 弹幕 |
| 3 | 评论 |
| 4 | 分享 |
| 5 | 投币 |
| 6 | 收藏 |
| 7 | 充电 |
| 8 | 点赞 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | array | 趋势列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | -------- |
| 0 | obj | 1天前的数据 | |
| n | obj | n+1天前的数据 | |
| …… | obj | …… | …… |
| 29 | obj | 30天前的数据 | 最后一条 |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | -------- | -------------------- |
| date_key | num | 对应时间 | 时间戳 前一天的8:00 |
| total_inc | num | 增加数量 | 意义为数据类型决定 |
**示例:**
查询30天前的视频播放增量趋势可知`2020-04-05`的播放增量为`46``2020-04-04`的播放增量为`58`
```shell
curl -G 'https://member.bilibili.com/x/web/data/pandect' \
--data-urlencode 'type=1' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [{
"date_key": 1586044800,
"total_inc": 46
}, {
"date_key": 1585958400,
"total_inc": 58
}, {
"date_key": 1585872000,
"total_inc": 81
}, {
"date_key": 1585785600,
"total_inc": 90
}, {
"date_key": 1585699200,
"total_inc": 62
}, {
"date_key": 1585612800,
"total_inc": 70
},
…………
]
}
```
</details>
## 专栏数据增量趋势
> https://member.bilibili.com/x/web/data/article/thirty
*请求方式GET*
认证方式仅可CookieSESSDATA
数据为前30天
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------ | -------------- |
| type | num | 目标数据类型 | 必要 | 类型代码见下表 |
类型代码`type`
| 代码 | 含义 |
| ---- | ---- |
| 1 | 阅读 |
| 2 | 评论 |
| 3 | 分享 |
| 4 | 投币 |
| 5 | 收藏 |
| 6 | 点赞 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | array | 趋势列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------ | -------- |
| 0 | obj | 30天前的数据 | |
| n | obj | 30-n天前的数据 | |
| …… | obj | …… | …… |
| 29 | obj | 1天前的数据 | 最后一条 |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | -------- | -------------------- |
| date_key | num | 对应时间 | 时间戳 前一天的8:00 |
| total_inc | num | 增加数量 | 意义为数据类型决定 |
**示例:**
查询30天前的文章阅读增量趋势可知`2020-04-05`的阅读增量为`6``2020-04-04`的阅读增量为`6`
```shell
curl -G 'https://member.bilibili.com/x/web/data/article/thirty' \
--data-urlencode 'type=1' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
…………
{
"date_key": 1585699200,
"total_inc": 6
}, {
"date_key": 1585785600,
"total_inc": 6
}, {
"date_key": 1585872000,
"total_inc": 4
}, {
"date_key": 1585958400,
"total_inc": 6
}, {
"date_key": 1586044800,
"total_inc": 6
}]
}
```
</details>
## 稿件操作来源占比情况
> https://member.bilibili.com/x/web/data/survey
*请求方式GET*
认证方式仅可CookieSESSDATA
数据为上一天的
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------ | -------------- |
| type | num | 目标数据类型 | 必要 | 类型代码见下表 |
类型代码`type`
| 代码 | 含义 |
| ---- | ---- |
| 1 | 播放 |
| 2 | 弹幕 |
| 3 | 评论 |
| 4 | 分享 |
| 5 | 投币 |
| 6 | 收藏 |
| 7 | 充电 |
| 8 | 点赞 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ------------ | ------------ |
| YYYYMMDD | obj | 上一天的情况 | 字段名为日期 |
`data`中的`YYYYMMDD`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ------ | ------------ | ---- |
| arc_inc | array | 稿件情况 | |
| total_inc | num | 总计增长情况 | |
| type_rank | obj | 分区排名情况 | |
`YYYYMMDD`中的`arc_inc`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 稿件1 | |
| n | obj | 稿件n+1 | |
| …… | obj | …… | …… |
`YYYYMMDD`中的`arc_inc`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------------- | ------------ |
| aid | num | 稿件avid | |
| bvid | str | 稿件bvid | |
| daytime | num | 统计时间 | 时间戳 |
| incr | num | 稿件增长情况数 | |
| interactive | num | 0 | 作用尚不明确 |
| ptime | num | 稿件发布时间 | 时间戳 |
| title | str | 稿件标题 | |
`YYYYMMDD`中的`type_rank`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ---- |
| {分区名} | num | 该排名数 | |
| …… | num | …… | …… |
**示例:**
查询我的稿件来源占比情况
```shell
curl -G 'https://member.bilibili.com/x/web/data/survey' \
--data-urlencode 'type=1' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"20200418": {
"arc_inc": [{
"aid": 94916552,
"bvid": "BV1ZE411K7ux",
"incr": 18,
"title": "【8-bit】影 流 之 主(爱河)",
"daytime": 1587155030,
"ptime": 1583760165,
"interactive": 0
}, {
"aid": 98948772,
"bvid": "BV1n741127LD",
"incr": 14,
"title": "【特斯拉线圈】组装迷你SSTC",
"daytime": 1587155030,
"ptime": 1585054436,
"interactive": 0
}, {
"aid": 37294890,
"bvid": "BV1kt411D7yW",
"incr": 9,
"title": "【病毒】彩虹猫可以调速还带有计时器 MEMZ重构升级版",
"daytime": 1587155030,
"ptime": 1543775696,
"interactive": 0
},
…………
],
"total_inc": 55,
"type_rank": {
"生活": 1392,
"科技": 1597,
"音乐": 1058
}
}
}
}
```
</details>
## 播放来源占比情况(平台及方式)
> https://member.bilibili.com/x/web/data/playsource
*请求方式GET*
认证方式仅可CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ---- | ------------ | ---- |
| page_source | obj | 播放方式情况 | |
| play_proportion | obj | 播放平台情况 | |
`data`中的`page_source`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ------------------------- | ---- |
| dynamic | num | 通过动态 | |
| other | num | 其他方式 | |
| related_video | num | 通过推荐列表 | |
| search | num | 通过搜索 | |
| space | num | 空间列表播放 | |
| tenma | num | 天马APP推荐信息流来源 | |
`data`中的`play_proportion`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------------ | ---- |
| android | num | 安卓端 | |
| h5 | num | 移动端h5页面 | |
| ios | num | ios端 | |
| out | num | 站外 | |
| pc | num | 电脑版网页 | |
**示例:**
```shell
curl 'https://member.bilibili.com/x/web/data/playsource' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"play_proportion": {
"android": 6060,
"h5": 410,
"ios": 1325,
"out": 0,
"pc": 2137
},
"page_source": {
"dynamic": 173,
"other": 1440,
"related_video": 1813,
"search": 1980,
"space": 501,
"tenma": 4087
}
}
}
```
</details>
## 播放分布情况(粉丝与路人)
> https://member.bilibili.com/x/web/data/base
*请求方式GET*
认证方式仅可CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------------ | ---- |
| period | obj | 提示信息 | |
| viewer_area | obj | 播放地区情况 | |
| viewer_base | obj | 播放数据情况 | |
`data`中的`period`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ---- | ---- |
| module_one | str | ??? | |
| module_two | str | ??? | |
| module_three | str | ??? | |
| module_four | str | ??? | |
`data`中的`viewer_area`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ---------------- | ---- |
| fan | obj | 粉丝播放地区情况 | |
| not_fan | obj | 路人播放地区情况 | |
`viewer_area`中的`fan`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------------ | ---------------- |
| {行政区名} | num | 该地区的粉丝播放量 | 字段名为行政区名 |
| …… | num | …… | …… |
`viewer_area`中的`not_fan`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------------ | ---------------- |
| {行政区名} | num | 该地区的路人播放量 | 字段名为行政区名 |
| …… | num | …… | …… |
`data`中的`viewer_base`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ---------------- | ---- |
| fan | obj | 粉丝播放数据情况 | |
| not_fan | obj | 路人播放数据情况 | |
`viewer_base`中的`fan`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | ------------------ | ---- |
| male | num | 男性粉丝播放数 | |
| female | num | 女性粉丝播放数 | |
| age_one | num | 0-16岁粉丝播放数 | |
| age_two | num | 16-25岁粉丝播放数 | |
| age_three | num | 25-40岁粉丝播放数 | |
| age_four | num | 40+岁粉丝播放数 | |
| plat_pc | num | pc网页端粉丝播放数 | |
| plat_h5 | num | 移动h5端粉丝播放数 | |
| plat_out | num | 站外端粉丝播放数 | |
| plat_ios | num | ios端粉丝播放数 | |
| plat_android | num | 安卓端粉丝播放数 | |
| plat_other_app | num | 其他粉丝播放数 | |
`viewer_base`中的`not_fan`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | ------------------ | ---- |
| male | num | 男性路人播放数 | |
| female | num | 女性路人播放数 | |
| age_one | num | 0-16岁路人播放数 | |
| age_two | num | 16-25岁路人播放数 | |
| age_three | num | 25-40岁路人播放数 | |
| age_four | num | 40+岁路人播放数 | |
| plat_pc | num | pc网页端路人播放数 | |
| plat_h5 | num | 移动h5端路人播放数 | |
| plat_out | num | 站外端路人播放数 | |
| plat_ios | num | ios端路人播放数 | |
| plat_android | num | 安卓端路人播放数 | |
| plat_other_app | num | 其他路人播放数 | |
**示例:**
```shell
curl 'https://member.bilibili.com/x/web/data/base' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"period": {
"module_one": "各维度每日12:00 a.m. 更新前一日数据",
"module_two": "每日12:00 a.m. 更新前一日数据",
"module_three": "每周二12:00 a.m. 更新前一周数据",
"module_four": "各维度每日12:00 a.m. 更新前一日数据"
},
"viewer_area": {
"fan": {
"上海": 7,
"中国台湾": 2,
"云南": 6,
"内蒙古": 8,
"北京": 14,
"吉林": 4,
"四川": 4,
"天津": 11,
"宁夏": 1,
"安徽": 8,
"山东": 18,
"山西": 10,
"广东": 50,
"广西": 7,
"新疆": 2,
"江苏": 17,
"江西": 6,
"河北": 13,
"河南": 13,
"浙江": 20,
"海南": 1,
"湖北": 13,
"湖南": 13,
"甘肃": 4,
"福建": 10,
"贵州": 4,
"辽宁": 9,
"重庆": 5,
"陕西": 93,
"香港特别行政区": 1,
"黑龙江": 12
},
"not_fan": {
"上海": 28,
"中国台湾": 3,
"云南": 22,
"内蒙古": 15,
"北京": 53,
"吉林": 20,
"四川": 60,
"天津": 18,
"宁夏": 7,
"安徽": 43,
"山东": 81,
"山西": 31,
"广东": 176,
"广西": 81,
"新疆": 11,
"江苏": 93,
"江西": 26,
"河北": 50,
"河南": 84,
"浙江": 97,
"海南": 10,
"湖北": 43,
"湖南": 43,
"甘肃": 14,
"福建": 54,
"西藏": 1,
"贵州": 16,
"辽宁": 47,
"重庆": 31,
"陕西": 102,
"青海": 2,
"香港特别行政区": 4,
"黑龙江": 25
}
},
"viewer_base": {
"fan": {
"male": 153,
"female": 24,
"age_one": 91,
"age_two": 174,
"age_three": 77,
"age_four": 53,
"plat_pc": 12072,
"plat_h5": 186,
"plat_out": 0,
"plat_ios": 23453,
"plat_android": 87387,
"plat_other_app": 1631
},
"not_fan": {
"male": 462,
"female": 72,
"age_one": 425,
"age_two": 445,
"age_three": 360,
"age_four": 188,
"plat_pc": 64760,
"plat_h5": 660,
"plat_out": 1,
"plat_ios": 111259,
"plat_android": 467767,
"plat_other_app": 3408
}
}
}
}
```
</details>

822
docs/danmaku/action.md Normal file
View File

@@ -0,0 +1,822 @@
# 弹幕操作
- [发送视频弹幕](#发送视频弹幕)
- [发送互动弹幕](#发送互动弹幕)
- [撤回弹幕](#撤回弹幕)
- [购买高级弹幕发送权限](#购买高级弹幕发送权限)
- [检测高级弹幕发送权限](#检测高级弹幕发送权限)
- [查询弹幕点赞数](#查询弹幕点赞数)
- [点赞弹幕](#点赞弹幕)
- [举报弹幕](#举报弹幕)
- [保护&删除弹幕](#保护&删除弹幕)
- [修改字幕池](#修改字幕池)
---
## 发送视频弹幕
> https://api.bilibili.com/x/v2/dm/post
*请求方式POST*
认证方式CookieSESSDATA或APP
此接口与漫画弹幕相同
`mode=6`的逆向弹幕与`mode=8`的代码弹幕不可发送
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 弹幕类选择 | 必要 | 1视频弹幕 |
| oid | num | 视频cid | 必要 | |
| msg | str | 弹幕内容 | 必要 | 长度小于100字符 |
| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 |
| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 |
| progress | num | 弹幕出现在视频内的时间 | 非必要 | 单位为毫秒<br />默认为0 |
| color | num | 弹幕颜色设置 | 非必要 | 十进制RGB888值<br />默认为16777215#FFFFFF)白色 |
| fontsize | num | 弹幕字号设置 | 非必要 | 默认为25<br />极小12<br />超小16<br />18<br />标准25<br />36<br />超大45<br />极大64 |
| pool | num | 弹幕池选择 | 非必要 | 0普通池<br />1字幕池<br />2特殊池代码/BAS弹幕<br />默认为0 |
| mode | num | 弹幕类型选择 | 必要 | 1普通弹幕<br />4底部弹幕<br />5顶部弹幕<br />7高级弹幕<br />9BAS弹幕`pool`必须为2 |
| rnd | num | 当前时间戳*1000000 | 非必要 | **若无此项则发送弹幕冷却时间限制为90s**<br />若有此项则发送弹幕冷却时间限制为5s |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-404无此项<br />36700系统升级中<br />36701弹幕包含被禁止的内容<br />36702弹幕长度大于100<br />36703发送频率过快<br />36704禁止向未审核的视频发送弹幕<br />36705您的等级不足不能发送弹幕<br />36706您的等级不足不能发送顶端弹幕<br />36707您的等级不足不能发送底端弹幕<br />36708您的等级不足不能发送彩色弹幕<br />36709您的等级不足不能发送高级弹幕<br />36710您的权限不足不能发送这种样式的弹幕<br />36711该视频禁止发送弹幕<br />36712level 1用户发送弹幕的最大长度为20<br />36713稿件未付费<br />36714弹幕发送时间不合法<br />36715当日操作数量超过上限 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ------------ |
| action | str | 空 | 作用尚不明确 |
| dmid | num | 弹幕dmid | |
| dmid_str | str | 弹幕dmid | 字串形式 |
| visible | bool | true | 作用尚不明确 |
**示例:**
为视频`av2`/`BV1xx411c7mD`cid为`62131`的5000ms位置发送一条弹幕`前来考古`(颜色为#FFFFFF字号25普通弹幕游动弹幕
```shell
curl 'https://api.bilibili.com/x/v2/dm/post' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=62131' \
--data-urlencode 'msg=前来考古' \
--data-urlencode 'aid=2' \
--data-urlencode 'progress=5000' \
--data-urlencode 'color=16777215' \
--data-urlencode 'fontsize=25' \
--data-urlencode 'pool=0' \
--data-urlencode 'mode=1' \
--data-urlencode 'rnd=3456789987654321' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"action":"",
"dmid":32161968826613767,
"dmid_str":"32161968826613767",
"visible":true
}
}
```
</details>
## 发送互动弹幕
> https://api.bilibili.com/x/v2/dm/command/post
*请求方式POST*
认证方式CookieSESSDATA或APP
2020-09-25 B站更新了互动弹幕功能包括UP主头像弹幕、关联视频弹幕、视频内嵌引导关注按钮三大功能
详情见:
[【客户端更新】6.10版本更新UP主支持发布关联视频弹幕]( https://www.bilibili.com/read/cv7728299 )
[引导关注卡片]( https://www.bilibili.com/blackboard/activity-c8a0iDRQy.html )
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 互动弹幕类型 | 必要 | 1UP主头像弹幕<br />2关联视频弹幕<br />5视频内嵌引导关注按钮 |
| aid | num | 稿件avid | 必要 | |
| cid | num | 视频cid | 必要 | |
| progress | num | 弹幕出现在视频内的时间 | 非必要 | 单位为毫秒<br />默认为0 |
| plat | num | 平台标识 | 必要 | 1web端<br />2安卓端<br />8视频管理页面 |
| data | str | json序列 | 必要 | |
| dmid | num | 修改互动弹幕的弹幕id | 非必要 | 注:修改弹幕`plat`必须为8 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
`data`参数json序列
类型为【UP主头像弹幕】时
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| msg | str | 弹幕内容 | |
类型为【关联视频弹幕】时:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------- | ---- |
| msg | str | 弹幕内容 | |
| bvid | str | 关联视频的bvid | |
类型为【视频内嵌引导关注按钮】时:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | --------------- |
| duration | num | 持续时间 | 单位为毫秒 |
| posX | num | X坐标 | 区间:[118-549] |
| posY | num | Y坐标 | 区间:[82-293] |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-404无此项<br />-500服务器错误<br />36711该视频禁止发送弹幕<br />79026发送失败请勿填写当前稿件bvid<br />79024发送失败请输入正确的bvid<br />79036该指令弹幕超出限制<br />79037关注弹幕坐标溢出 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | 正确时obj<br />错误时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------------------- | ------------------------------------------------------------ |
| command | str | 指令? | UP主头像弹幕#UP#<br />关联视频弹幕:#LINK#<br />视频内嵌引导关注按钮:#ATTENTION# |
| content | str | 弹幕内容 | |
| extra | str | 弹幕数据 | json序列 |
| id | num | 弹幕dmid | |
| idStr | str | 弹幕dmid | 字串形式 |
| mid | num | 用户mid | |
| oid | num | 视频cid | |
| progress | num | 弹幕出现在视频内的时间 | |
| type | num | 互动弹幕类型 | 1UP主头像弹幕<br />2关联视频弹幕<br />5视频内嵌引导关注按钮 |
`extra`序列数据:
类型为【UP主头像弹幕】时
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| icon | str | UP主头像url | |
类型为【关联视频弹幕】时:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------------- | ---- |
| aid | num | 关联视频的avid | |
| title | str | 关联视频的标题 | |
| bvid | str | 关联视频的bvid | |
类型为【视频内嵌引导关注按钮】时:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------------ | ------------------------------------------ |
| duration | num | 持续时间 | 单位为毫秒 |
| posX | num | X坐标 | 区间:[118-549] |
| posY | num | Y坐标 | 区间:[82-293] |
| icon | str | 按钮图片url | 不应该是关注按钮吗,但这个是圆形的 |
| type | num | 关注按钮类型 | 0仅关注<br />1仅三联<br />2关注+三联 |
**示例:**
为视频`av201947622`cid为`230709860`的5000ms位置发送一条UP主头像弹幕`test`
```shell
curl 'https://api.bilibili.com/x/v2/dm/command/post' \
--data-urlencode 'type=1' \
--data-urlencode 'aid=201947622' \
--data-urlencode 'cid=230709860' \
--data-urlencode 'progress=5000' \
--data-urlencode 'plat=1' \
--data-urlencode 'data={"msg":"test"}' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 39053842117558279,
"oid": 230709860,
"mid": 293793435,
"type": 1,
"command": "#UP#",
"content": "test",
"extra": "{\"icon\":\"http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg\"}",
"idStr": "39053842117558279"
}
}
```
</details>
为视频`av201947622`cid为`230709860`的5000ms位置发送一条发送关联视频弹幕`测试1234`关联视频为`BV1kz4y1X7XP`
```shell
curl 'https://api.bilibili.com/x/v2/dm/command/post' \
--data-urlencode 'type=2' \
--data-urlencode 'aid=201947622' \
--data-urlencode 'cid=230709860' \
--data-urlencode 'progress=5000' \
--data-urlencode 'plat=1' \
--data-urlencode 'data={"bvid":"BV1kz4y1X7XP","msg":"测试1234"}' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 39054383689236483,
"oid": 230709860,
"mid": 293793435,
"type": 2,
"command": "#LINK#",
"content": "测试1234",
"progress": 11925,
"extra": "{\"aid\":583785685,\"title\":\"【cmd】访问api 命令行也能上B站\",\"bvid\":\"BV1kz4y1X7XP\"}",
"idStr": "39054383689236483"
}
}
```
</details>
为视频`av201947622`cid为`230709860`的5000ms位置发送视频内嵌引导关注按钮X坐标为118Y坐标为82持续时间为5000ms
```shell
curl 'https://api.bilibili.com/x/v2/dm/command/post' \
--data-urlencode 'type=5' \
--data-urlencode 'aid=201947622' \
--data-urlencode 'cid=230709860' \
--data-urlencode 'progress=5000' \
--data-urlencode 'plat=1' \
--data-urlencode 'data={"duration":5000,"posX":118,"posY":82}' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 39055158405496839,
"oid": 230709860,
"mid": 293793435,
"type": 5,
"command": "#ATTENTION#",
"progress": 5000,
"extra": "{\"duration\":5000,\"posX\":118,\"posY\":82}",
"idStr": "39055158405496839"
}
}
```
</details>
## 撤回弹幕
> https://api.bilibili.com/x/dm/recall
*请求方式POST*
认证方式CookieSESSDATA或APP
仅能撤回自己两分钟内的弹幕且每天只有3次机会
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
| dmid | num | 弹幕dmid | 必要 | |
| cid | num | 视频cid | 必要 | |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-400请求错误<br />-404无此项<br />36301撤回失败弹幕发送已过2分钟<br />36302撤回失败弹幕已经被删除或撤回<br />36303撤回失败今天撤回的机会已经用完<br />36304撤回失败服务器出错 |
| message | str | 错误信息 | 成功后显示剩余次数 |
| ttl | num | 1 | |
**示例:**
撤回`cid=168901231`下的弹幕`32310301474947077`的弹幕
```shell
curl 'https://api.bilibili.com/x/dm/recall' \
--data-urlencode 'cid=168901231' \
--data-urlencode 'dmid=32310301474947077' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "撤回成功你还有3次撤回机会"
}
```
</details>
## 购买高级弹幕发送权限
> https://api.bilibili.com/x/dm/adv/buy
*请求方式POST*
认证方式CookieSESSDATA或APP
购买一次需要2硬币同时向up主发送请求
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
| mode | str | sp | 必要 | |
| cid | num | 视频cid | 必要 | |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-102账号被封停<br />-111csrf校验失败<br />-107硬币不足<br />-400请求错误<br />36007不允许购买<br />36009正在确认中<br />36010已购买 |
| message | str | 返回信息 | |
| ttl | num | 1 | |
示例:
购买视频cid为`168901231`的高级弹幕发送权限
```shell
curl 'https://api.bilibili.com/x/dm/adv/buy' \
--data-urlencode 'cid=168901231' \
--data-urlencode 'mode=sp' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"已成功购买"
}
```
</details>
## 检测高级弹幕发送权限
> https://api.bilibili.com/x/dm/adv/state
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
| mode | str | sp | 必要 | |
| cid | num | 视频cid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | ---------------- | -------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />--400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | 有效时obj<br />无效时null | 有效时:信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ---------------- | ------------------------------------------ |
| coins | num | 需要支付的硬币数 | |
| confirm | num | 是否同意 | 1同意<br />2未同意<br />未购买时无此项 |
| accept | bool | 是否允许申请 | true允许<br />false不允许 |
| hasBuy | bool | 是否已购买 | true已购买<br />未购买时无此项 |
**示例:**
查询视频cid为`168901231`的视频高级弹幕权限购买状态
当前状态为已购买且同意
```shell
curl -G 'https://api.bilibili.com/x/dm/adv/state' \
--data-urlencode 'cid=168901231' \
--data-urlencode 'mode=sp' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"coins": 2,
"confirm": 1,
"accept": true,
"hasBuy": true
}
}
```
</details>
## 查询弹幕点赞数
> https://api.bilibili.com/x/v2/dm/thumbup/stats
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| oid | num | 视频cid | 必要 | |
| ids | nums | 弹幕dmid列表 | 必要 | 多个id之间用`,`分隔 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------------- | --------------------------------- |
| {弹幕id} | obj | 弹幕id对应的信息 | id分别对应请求参数中的`ids`,下同 |
| …… | obj | 弹幕id对应的信息 | |
`{弹幕id}`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | -------- | ------------------------------------------------------------ |
| likes | num | 点赞数 | |
| user_like | num | 是否点赞 | 0未点赞<br />1已点赞<br />需要登录(Cookie或APP) <br />未登录恒为0 |
| id_str | str | 弹幕dmid | |
**示例**
查询`cid=236871317`下的弹幕`35600074482384899``38880975220375559``39052528418553863`点赞数
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/thumbup/stats' \
--data-urlencode 'oid=236871317' \
--data-urlencode 'ids=39019145405661191,38880975220375559,39052528418553863' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"38880975220375559": {
"likes": 1,
"user_like": 1,
"id_str": "38880975220375559"
},
"39019145405661191": {
"likes": 3,
"user_like": 1,
"id_str": "39019145405661191"
},
"39052528418553863": {
"likes": 2,
"user_like": 0,
"id_str": "39052528418553863"
}
}
}
```
</details>
## 点赞弹幕
> https://api.bilibili.com/x/v2/dm/thumbup/add
*请求方式POST*
认证方式CookieSESSDATA或APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------------ |
| access_key | str | APP登录Token | APP方式必要 | |
| dmid | num | 弹幕dmid | 必要 | |
| oid | num | 视频cid | 必要 | |
| op | num | 操作 | 必要 | 1点赞<br />2取消点赞 |
| platform | str | 平台 | 非必要 | |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|------------------------------------------------------------------------------------------------------------------------------------|
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf 校验失败<br />-400请求错误<br />36106该弹幕已被删除<br/>36805该视频禁止点赞弹幕<br/>65004取消赞失败 未点赞过<br />65006已赞过 |
| message | str | 错误信息 | 默认为0 |
| tll | num | 1 | |
**示例**
`cid=145928946`下的弹幕`35600074482384899`点赞
```shell
curl 'https://api.bilibili.com/x/v2/dm/thumbup/add' \
--data-urlencode 'dmid=35600074482384899' \
--data-urlencode 'oid=145928946' \
--data-urlencode 'op=1' \
--data-urlencode 'platform=web_player' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1
}
```
</details>
## 举报弹幕
> https://api.bilibili.com/x/dm/report/add
*请求方式POST*
认证方式CookieSESSDATA或APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------ |
| access_key | str | APP登录Token | APP方式必要 | |
| cid | num | 视频cid | 必要 | |
| dmid | num | 弹幕dmid | 必要 | |
| reason | num | 举报类型 | 必要 | **类型代码见下表** |
| content | str | 其他举报备注 | 非必要 | `reason=11`时有效 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
举报类型`reason`
| 代码 | 含义 |
| ---- | ---------- |
| 1 | 违法违禁 |
| 2 | 色情低俗 |
| 3 | 赌博诈骗 |
| 4 | 人身攻击 |
| 5 | 侵犯隐私 |
| 6 | 垃圾广告 |
| 7 | 引战 |
| 8 | 剧透 |
| 9 | 恶意刷屏 |
| 10 | 视频无关 |
| 11 | 其他 |
| 12 | 青少年不良 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf 校验失败<br />-400请求错误<br />36201举报弹幕不存在<br />36203举报原因类型错误<br />36204已举报 |
| message | str | 错误信息 | 默认为空 |
| tll | num | 1 | 举报失败时 |
**示例**
举报`cid=145928946`下的弹幕`35600074482384899`,理由是`引战`
```shell
curl 'https://api.bilibili.com/x/dm/report/add' \
--data-urlencode 'cid=145928946' \
--data-urlencode 'dmid=35600074482384899' \
--data-urlencode 'reason=7' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":""
}
```
</details>
## 保护&删除弹幕
> https://api.bilibili.com/x/v2/dm/edit/state
*请求方式POST*
认证方式CookieSESSDATA 或APP
注:只能操作自己的稿件或有骑士权限的稿件
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | --------------------------------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 弹幕类选择 | 必要 | 1视频弹幕 |
| oid | num | 视频cid | 必要 | |
| dmids | nums | 弹幕dmid | 必要 | 多个id之间用`,`分隔 |
| state | num | 操作代码 | 必要 | 1删除弹幕<br />2弹幕保护<br />3取消保护 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf 校验失败<br />-400请求错误<br />-403访问权限不足 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例**
删除`cid=145928946`下的弹幕`35600074482384899``39067304918515717``39082777041174531`
```shell
curl 'https://api.bilibili.com/x/v2/dm/edit/state' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=145928946' \
--data-urlencode 'dmids=35600074482384899,39067304918515717,39082777041174531' \
--data-urlencode 'state=1' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1
}
```
</details>
## 修改字幕池
> https://api.bilibili.com/x/v2/dm/edit/pool
*请求方式POST*
认证方式CookieSESSDATA 或APP
注:只能操作自己的稿件或有骑士权限的稿件
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | -------------------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| type | num | 弹幕类选择 | 必要 | 1视频弹幕 |
| oid | num | 视频cid | 必要 | |
| dmids | nums | 弹幕dmid | 必要 | 多个id之间用`,`分隔 |
| pool | num | 操作代码 | 必要 | 0移出字幕池<br />1移入字幕池 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf 校验失败<br />-400请求错误<br />-403访问权限不足 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例**
`cid=145928946`下的弹幕`35600074482384899``39067304918515717``39082777041174531`移入字幕池
```shell
curl 'https://api.bilibili.com/x/v2/dm/edit/state' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=145928946' \
--data-urlencode 'pool=1' \
--data-urlencode 'dmids=35600074482384899,39067304918515717,39082777041174531' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1
}
```
</details>

513
docs/danmaku/buzzword.md Normal file
View File

@@ -0,0 +1,513 @@
# 名词解释
该功能用于解释和科普 B 站弹幕、评论等的专有名词及梗,展示其出处,并推荐相关站内内容
可使用页面 https://www.bilibili.com/blackboard/activity-joFQ0txEQd.html?type_id=4 查看名词列表
可使用页面 https://www.bilibili.com/blackboard/activity-WroMZNunfa.html?id=1 查看名词解释详情
- [拉取名词解释列表](#拉取名词解释列表)
- [查询名词解释详情](#查询名词解释详情)
---
## 拉取名词解释列表
> https://api.bilibili.com/x/v2/dm/buzzword/list
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------- | ---- | -------- | ------ | ---------------------------------------------- |
| type_id | num | 名词类型 | 必要 | 如4代表“哔哩哔哩热词图鉴”<br />5代表“语言类” |
| pn | num | 页码 | 非必要 | 默认为1 |
| ps | num | 每页项数 | 非必要 | 默认为20 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | -------- | ---- |
| type | obj | 类型信息 | |
| buzzwords | array | 词语列表 | |
| page | obj | 页面信息 | |
`data`中的`type`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------- | ------ |
| id | num | 类型 id | |
| name | str | 类型名称 | |
| name_pinyin | obj | 拼音信息 | 见副表 |
`data`中的`buzzwords`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 名词条目 1 | |
| n | obj | 名词条目n+1 | |
| …… | obj | …… | …… |
`buzzwords`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------------ | ----------------------------------------- |
| id | num | 名词 id | 用于[查询名词解释详情](#查询名词解释详情) |
| name | str | 名词 | |
| name_pinyin | obj | 拼音信息 | 见副表 |
| picture | str | 名词图片 url | |
`data`中的`page`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------- | ---- |
| num | num | 当前页码 | |
| size | num | 每页项数 | |
| total | num | 总计项数 | |
| cnt | num | (?) | |
副表:拼音`name_pinyin`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | -------- | ---- |
| 对应单个汉字 1 | str | 拼音字串 | |
| 对应单个汉字 n | str | 拼音字串 | |
| …… | str | …… | …… |
**示例:**
拉取对应`哔哩哔哩热词图鉴`的名词列表以20项为一页拉取第1页
```bash
curl -G 'https://api.bilibili.com/x/v2/dm/buzzword/list' \
--data-urlencode 'type_id=4' \
--data-urlencode 'ps=10' \
--data-urlencode 'pn=1'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"type": {
"id": 4,
"name": "哔哩哔哩热词图鉴",
"name_pinyin": {
"哔": "bì",
"哩": "lī",
"图": "tú",
"热": "rè",
"词": "cí",
"鉴": "jiàn"
},
"level": 0
},
"buzzwords": [
{
"id": 145,
"name": "麦乐鸡侠",
"name_pinyin": {
"乐": "lè",
"侠": "xiá",
"鸡": "jī",
"麦": "mài"
},
"picture": "https://i0.hdslb.com/bfs/archive/1cdec1ff86733a38c1a9ff824dde6d4121955aee.png"
},
{
"id": 146,
"name": "金钱豹",
"name_pinyin": {
"豹": "bào",
"金": "jīn",
"钱": "qián"
},
"picture": "https://i0.hdslb.com/bfs/archive/3d492f4c01da7d15073d3175871e14ed56f0f78a.png"
},
{
"id": 11,
"name": "通辽可汗",
"name_pinyin": {
"可": "kě",
"汗": "hàn",
"辽": "liáo",
"通": "tōng"
},
"picture": "https://i0.hdslb.com/bfs/archive/ca332fb5f9da48497298cf26fe07b1f061e53a0b.jpg"
},
{
"id": 123,
"name": "资本马桶搋",
"name_pinyin": {
"搋": "chuāi",
"本": "běn",
"桶": "tǒng",
"资": "zī",
"马": "mǎ"
},
"picture": "https://i0.hdslb.com/bfs/archive/aaf33dced1941af0946f37c62f4b48fcaba9c9a2.jpg"
},
{
"id": 133,
"name": "马了顶大",
"name_pinyin": {
"了": "le",
"大": "dà",
"顶": "dǐng",
"马": "mǎ"
},
"picture": "https://i0.hdslb.com/bfs/archive/9653bd7f8d2c804aceb8043ebd5c8360a93e26c0.png"
},
{
"id": 9,
"name": "退钱",
"name_pinyin": {
"退": "tuì",
"钱": "qián"
},
"picture": "https://i0.hdslb.com/bfs/archive/2540db0bc94792b1f5be75e19aa05d33666e3036.jpg"
},
{
"id": 141,
"name": "森林冰火人",
"name_pinyin": {
"人": "rén",
"冰": "bīng",
"林": "lín",
"森": "sēn",
"火": "huǒ"
},
"picture": "https://i0.hdslb.com/bfs/archive/bc5ca101313d4db223c395d64779e76eb3482d60.jpg"
},
{
"id": 22,
"name": "学霸题",
"name_pinyin": {
"学": "xué",
"霸": "bà",
"题": "tí"
},
"picture": "https://i0.hdslb.com/bfs/archive/a67a0a57ec48beb8c8dcc9f26c7bb66cd0ed5da7.jpg"
},
{
"id": 10,
"name": "张三",
"name_pinyin": {
"三": "sān",
"张": "zhāng"
},
"picture": "https://i0.hdslb.com/bfs/archive/f4dac6fdc5c58639b79ae87385e9b9f7eae3b263.png"
},
{
"id": 5,
"name": "饮茶先啦",
"name_pinyin": {
"先": "xiān",
"啦": "la",
"茶": "chá",
"饮": "yǐn"
},
"picture": "https://i0.hdslb.com/bfs/archive/4c90ad207f0041e2dccd586827028aea50c2dc7d.jpg"
}
],
"page": {
"num": 1,
"size": 10,
"total": 143,
"cnt": 0
}
}
}
```
</details>
## 查询名词解释详情
> https://api.bilibili.com/x/v2/dm/buzzword/detail
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------ | ------ | -------------------------------- |
| id | num | 名词id | 必要 | 如1代表“kksk”<br />2代表“打脸” |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | --------------------------------- | -------- | --------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-404不存在该名词 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | 有数据时obj<br />无数据时null | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ------------------------------- | -------------------- | ----------------------------- |
| id | num | 名词id | |
| name | str | 名词 | |
| description | str | 名词解释 | |
| picture | str | 名词图片 url | |
| types | array | 父分类列表 | 该名词可能隶属多个父分类 |
| related_words | array | 近义词/相关词 | |
| uppers | 有数据array<br />无数据null | 相关 UP 列表 | 该名词(梗)出处 |
| related_ugc | 有数据array<br />无数据null | 相关 ucg 视频列表 | 该名词(梗)出处 |
| related_ogv | 有数据array<br />无数据null | 相关 pgc 视频列表 | 该名词(梗)出处 |
| guides | obj | 推荐创作信息 | |
| related_buzzwords | array | 推荐名词列表 | |
| topic | obj | 关联话题信息 | |
| show_dynamic | bool | 是否展示话题动态聚合 | `true`展示<br />`false`不展示 |
`data`中的`types`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | obj | 父分类 1 | |
| n | obj | 父分类n+1 | |
| …… | obj | …… | …… |
`types`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------- | ---- |
| id | num | 类型 id | |
| name | str | 类型名称 | |
| name_pinyin | null | | |
| level | num | 权重? | |
`data`中的`related_words`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------------- | ---- |
| 0 | str | 近义词/相关词1 | |
| n | str | 近义词/相关词n+1 | |
| …… | str | …… | …… |
`data`中的`uppers`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------- | ---- |
| 0 | obj | 相关 UP 1 | |
| n | obj | 相关 UPn+1 | |
| …… | obj | …… | …… |
`uppers`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------- | ------------------------------------------------------------ |
| id | num | UP 主 mid | |
| recommend | str | | |
| name | str | UP 主昵称 | |
| face | str | UP 主头像 url | |
| official | obj | UP 主认证信息 | |
| followed | bool | 是否关注 | 需要登录(Cookie 或 APP)<br />`true`已关注<br />`false`未关注 |
| fans_count | num | 粉丝数 | |
`data`中的`related_ugc`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------------- | ---- |
| 0 | obj | 相关 ucg 视频 1 | |
| n | obj | 相关 ucg 视频n+1 | |
| …… | obj | …… | …… |
`related_ugc`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------------ | -------- |
| aid | num | 稿件 avid | |
| cid | num | 视频 cid | |
| name | str | 视频标题 | |
| link | str | 空 | |
| play | num | 播放数 | |
| danmaku | num | 弹幕数 | |
| duration | num | 视频时长 | 单位为秒 |
| cover | str | 视频封面 url | |
`data`中的`related_ogv`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------------- | ---- |
| 0 | obj | 相关 pgc 视频 1 | |
| n | obj | 相关 pgc 视频n+1 | |
| …… | obj | …… | …… |
`related_ogv`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------------ | ------------------------------------- |
| season_id | num | 剧集 ssid | |
| name | str | 剧集标题 | |
| play | num | 播放数 | |
| followed | num | 追剧/番数 | |
| is_followed | bool | 是否追剧/番 | `true`已追剧/番<br />`false`未追剧/番 |
| new_ep | str | 最新一集信息 | |
| cover | str | 剧集封面 url | |
| episodes | null | | |
| follow_info | obj | | |
`data`中的`guides`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ----- | ---------------- | ---- |
| description | str | 创作推介文案 | |
| contribute_tags | array | 创作跳转按钮信息 | |
`guides`中的`contribute_tags`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------- | ---- |
| 0 | obj | 创作跳转按钮 1 | |
| n | obj | 创作跳转按钮n+1 | |
| …… | obj | …… | …… |
`contribute_tags`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------- | -------------------------- |
| title | str | 按钮文案 | |
| link | str | 跳转 uri | 跳转至必剪或客户端创作入口 |
`data`中的`related_buzzwords`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 推荐名词 1 | |
| n | obj | 推荐名词n+1 | |
| …… | obj | …… | …… |
`related_buzzwords`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------- | ----------------------------------------- |
| id | num | 名词 id | 用于[查询名词解释详情](#查询名词解释详情) |
| name | str | 名词 | |
| name_pinyin | null | | |
| picture | str | 空 | |
`data`中的`topic`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------ | ---- |
| topic_id | num | 关联话题id | |
| topic_name | str | 关联话题名称 | |
**示例:**
查询名词`kksk`的详情
```bash
curl -G 'https://api.bilibili.com/x/v2/dm/buzzword/detail' \
--data-urlencode 'id=1'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 1,
"name": "kksk",
"description": "该梗是日语“ここすき”罗马音的字母缩写翻译为喜欢这里。一般作为赞扬认可的弹幕出现在视频画面中。由于在2017年随着以《恶魔人》为BGM和语音剪辑素材的《美洲豹人》系列作品的传播让这个梗快速的通过弹幕流行开并频繁出现在各类稿件经典画面中。",
"picture": "https://i0.hdslb.com/bfs/archive/c269c9ca1b5eb730ee1d77aadd28e3165eaa4d6d.png",
"types": [
{
"id": 4,
"name": "哔哩哔哩热词图鉴",
"name_pinyin": null,
"level": 0
},
{
"id": 5,
"name": "语言类",
"name_pinyin": null,
"level": 0
},
{
"id": 9,
"name": "空耳",
"name_pinyin": null,
"level": 0
}
],
"related_words": [
"恶魔人",
"美洲豹人",
"喜欢这里"
],
"uppers": [
{
"id": 488450,
"recommend": "",
"name": "PXN1",
"face": "http://i2.hdslb.com/bfs/face/96dd8cc4f2922bd81e5a938f6ad02b3e3041debe.jpg",
"official": {
"role": 0,
"title": "",
"desc": "",
"type": -1
},
"followed": false,
"fans_count": 1416
}
],
"related_ugc": [
{
"aid": 30056798,
"cid": 52388183,
"name": "恶 魔 人",
"link": "",
"play": 3434500,
"danmaku": 8292,
"duration": 188,
"cover": "http://i0.hdslb.com/bfs/archive/f0433d2dacf4b3397a9390ab982cefd138dbf8c8.jpg"
}
],
"related_ogv": null,
"guides": {
"description": "使用同款热梗素材创作你的专属作品吧!添加热梗主题#kksk是什么梗#参与投稿,优质稿件会优先展示在哔哩哔哩热词图鉴相关推荐中哦!",
"contribute_tags": [
{
"title": "拍同款",
"link": "bilibili://uper/appTraffic?appScheme=bcut%3A%2F%2Fstudio%2Fmaterial_editor%2F%3Ftab_id%3D1%26sub_id%3D90160%26third_id%3D150281&appName=com.bilibili.studio&appID=1299589486"
}
]
},
"related_buzzwords": null,
"topic": {
"topic_id": 7642,
"topic_name": "kksk是什么梗"
},
"show_dynamic": false
}
}
```
</details>

75
docs/danmaku/config.md Normal file
View File

@@ -0,0 +1,75 @@
# 弹幕个人配置修改
- [修改弹幕个人配置web端](#修改弹幕个人配置web端)
---
## 修改弹幕个人配置web端
> https://api.bilibili.com/x/v2/dm/web/config
*请求方式POST*
认证方式CookieSESSDATA或APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ------ | ------------------------ | -------------- | ------------------------------------------------------------ |
| access_key | str | APP登录Token | APP方式必要 | |
| dm_switch | bool | 弹幕开关 | 非必要 | true开启<br />false关闭 |
| blockscroll | bool | 屏蔽类型-滚动 | 非必要 | true不屏蔽<br />false屏蔽 |
| blocktop | bool | 屏蔽类型-顶部 | 非必要 | 同上 |
| blockbottom | bool | 屏蔽类型-底部 | 非必要 | 同上 |
| blockcolor | bool | 屏蔽类型-彩色 | 非必要 | 同上 |
| blockspecial | bool | 屏蔽类型-特殊 | 非必要 | 同上 |
| ai_switch | bool | 是否打开智能云屏蔽 | 非必要 | true开启<br />false关闭 |
| ai_level | num | 智能云屏蔽等级 | 非必要 | 区间:[0-10]<br />0为默认等级3级 |
| preventshade | bool | 防挡弹幕底部15% | 非必要 | true开启<br />false关闭 |
| dmask | bool | 智能防挡弹幕(人像蒙版) | 非必要 | 同上 |
| opacity | num | 弹幕不透明度 | 非必要 | 区间:[0-1] |
| dmarea | num | 弹幕显示区域 | 非必要 | 100不重叠<br />753/4屏<br />50半瓶<br />251/4屏<br />0不限 |
| speedplus | num | 弹幕速度 | 非必要 | 区间:[0.4-1.6] |
| fontsize | num | 字体大小 | 非必要 | 区间:[0.4-1.6] |
| screensync | bool | 跟随屏幕缩放比例 | 非必要 | true开启<br />false关闭 |
| speedsync | bool | 根据播放倍速调整速度 | 非必要 | 同上 |
| fontfamily | str | 字体类型 | 非必要 | 未启用 |
| bold | bool | 粗体 | 非必要 | 未启用 |
| fontborder | num | 描边类型 | 非必要 | 0重墨<br />1描边<br />245°投影 |
| drawType | string | 渲染类型 | 非必要 | 未启用 |
| ts | num | 当前时间戳 | 非必要 | |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />23004数据没有修改 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
关闭弹幕
```shell
curl 'https://api.bilibili.com/x/v2/dm/web/config' \
--data-urlencode 'dm_switch=false' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1
}
```
</details>

View File

@@ -0,0 +1,111 @@
# protobuf弹幕
2020年5月23日哔哩哔哩网页端及移动端启用了新的默认弹幕api网页端弹幕显示的上限变为原弹幕池上限的两倍。
新的api是以6分钟为一个单位加载即每次加载6分钟内的弹幕
- [获取实时弹幕](#获取实时弹幕)
---
## 获取实时弹幕
> https://api.bilibili.com/x/v2/dm/web/seg.so web端
>
> https://api.bilibili.com/x/v2/dm/list/seg.so APP端
>
> https://i0.hdslb.com/bfs/dm/{data}.bin BAS/代码弹幕专包)
*请求方式GET*
此接口与漫画弹幕相同
只能返回普通弹幕(`pool=1` `mode=1-7`)和代码弹幕(`pool=2` `mode=8`BAS弹幕`pool=2` `mode=9`)请从[弹幕元数据](danmaku_view_proto.md)中获取
互动弹幕UP主头像弹幕、关联视频、内嵌关注按钮也不存在这个接口请从[弹幕元数据](danmaku_view_proto.md)中获取
**注仅获取6min的整数倍时间内的弹幕6min内最多弹幕数为6000条如第一包中弹幕`progress`值域为0-360000**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------- | ---- | -------- | ------ | ----------- |
| type | num | 弹幕类 | 必要 | 1视频弹幕 |
| oid | num | 视频cid | 必要 | |
| pid | num | 稿件avid | 非必要 | |
| segment_index | num | 分包 | 必要 | 6分钟一包 |
**proto回复**
proto定义见[bilibili.community.service.dm.v1.DmSegMobileReply](../grpc_api/bilibili/community/service/dm/v1/dm.proto)
- [protogen.marcgravell](https://protogen.marcgravell.com/): 在线编译protogen工具, 无需再安装本地编译器(生成文件需加后缀_pb2.py才可使用)
- [protobuf pip](https://pypi.org/project/protobuf/): 可一键安装的python的protogen解析库
消息`DmSegMobileReply`
| 名称 | 类型 | 含义 | 备注 |
| ----- | -------------------- | -------- | ---- |
| elems | repeated DanmakuElem | 弹幕条目 | |
消息`DanmakuElem`
| 名称 | 类型 | 含义 | 备注 |
| -------- | ------ | ------------------ | ------------------------------------------------------------ |
| id | int64 | 弹幕dmid | 唯一 可用于操作参数 |
| progress | int32 | 视频内弹幕出现时间 | 毫秒 |
| mode | int32 | 弹幕类型 | 1 2 3普通弹幕<br />4底部弹幕<br />5顶部弹幕<br />6逆向弹幕<br />7高级弹幕<br />8代码弹幕<br />9BAS弹幕仅限于特殊弹幕专包 |
| fontsize | int32 | 弹幕字号 | 18<br />25标准<br />36大 |
| color | uint32 | 弹幕颜色 | 十进制RGB888值 |
| midHash | string | 发送者mid的HASH | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户id |
| content | string | 弹幕内容 | utf-8编码 |
| ctime | int64 | 弹幕发送时间 | 时间戳 |
| weight | int32 | 权重 | 用于智能屏蔽根据弹幕语义及长度通过AI识别得出<br />范围:[0-10]<br />值越大权重越高 |
| action | string | 动作? | 作用尚不明确 |
| pool | int32 | 弹幕池 | 0普通池<br />1字幕池<br />2特殊池代码/BAS弹幕 |
| idStr | string | 弹幕dmid | 字串形式<br />唯一 可用于操作参数 |
**示例:**
获取视频`av810872(cid=1176840)`炮姐的实时弹幕分包1
**注:[proto定义](../grpc_api/bilibili/community/service/dm/v1/dm.proto)需要编译,`bilibili.community.service.dm.v1.dm_pb2`并非通过pypi安装**
```python
import requests
import google.protobuf.text_format as text_format
import bilibili.community.service.dm.v1.dm_pb2 as Danmaku
url = 'https://api.bilibili.com/x/v2/dm/web/seg.so'
params = {
'type': 1, # 弹幕类型
'oid': 1176840, # cid
'pid': 810872, # avid
'segment_index': 1 # 弹幕分段
}
resp = requests.get(url, params)
data = resp.content
danmaku_seg = Danmaku.DmSegMobileReply()
danmaku_seg.ParseFromString(data)
print(text_format.MessageToString(danmaku_seg.elems[0], as_utf8=True))
```
输出:
```
id: 711923911
progress: 47880
mode: 1
fontsize: 18
color: 10092288
midHash: "59417e95"
content: "世界第一电击公主殿下,遇到你是我一生最美好的风景!吾炮赛高,永生不离!唯我超电磁炮永世长存! "
ctime: 1418799826
weight: 6
idStr: "711923911"
attr: 1
```

View File

@@ -0,0 +1,298 @@
# 弹幕元数据
2020-09-25 B站更新了互动弹幕功能包括UP主头像弹幕、关联视频弹幕、视频内嵌引导关注按钮三大功能
详情见:
[【客户端更新】6.10版本更新UP主支持发布关联视频弹幕]( https://www.bilibili.com/read/cv7728299 )
[引导关注卡片](https://www.bilibili.com/blackboard/activity-c8a0iDRQy.html )
---
- [获取弹幕个人配置与互动弹幕及BAS代码弹幕专包web端](#获取弹幕个人配置与互动弹幕及BAS代码弹幕专包web端)
- [实例](#实例)
- [获取互动弹幕](#获取互动弹幕)
- [获取BAS代码弹幕专包](#获取BAS代码弹幕专包)
---
## 获取弹幕个人配置与互动弹幕及BAS代码弹幕专包web端
> https://api.bilibili.com/x/v2/dm/web/view
*请求方式GET*
认证方式仅可CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ----------- |
| type | num | 弹幕类 | 必要 | 1视频弹幕 |
| oid | num | 视频cid | 必要 | |
| pid | num | 稿件avid | 非必要 | |
**proto回复**
消息`DmWebViewReply`
| 名称 | 类型 | 含义 | 备注 |
| ---------- | -------------------- | ---------------------- | ---------------------------- |
| state | int32 | 弹幕开放状态 | 0开放弹幕<br />1禁止弹幕 |
| text | string | | |
| textSide | string | | |
| dmSge | DmSegConfig | 分段弹幕包信息? | |
| flag | DanmakuFlagConfig | | |
| specialDms | repeated string | BAS代码弹幕专包url | |
| checkBox | bool | | |
| count | int64 | 实际弹幕总数 | 具有1500-6000不等的上限 |
| commandDms | repeated CommandDm | 互动弹幕条目 | |
| dmSetting | DanmuWebPlayerConfig | 弹幕个人配置 | 仅登录后存在 |
消息`dmSge`
| 名称 | 类型 | 含义 | 备注 |
| -------- | ----- | ------------ | ---------- |
| pageSize | int64 | 分段时间? | 单位为毫秒 |
| total | int64 | 最大分页数? | |
消息`flag`
| 名称 | 类型 | 含义 | 备注 |
| --------- | ------ | ---- | ---- |
| recFlag | int32 | | |
| recText | string | | |
| recSwitch | int32 | | |
消息`commandDms`
| 名称 | 类型 | 含义 | 备注 |
| -------- | ------ | ------------ | ------------------------------------------------------------ |
| id | int64 | 弹幕dmid | |
| oid | int64 | 视频cid | |
| mid | int64 | 发送者mid | |
| command | string | 弹幕指令 | `#UP#`UP主头像弹幕<br />`#LINK#`:关联视频弹幕<br />`#ATTENTION#`:视频内嵌引导关注按钮 |
| content | string | 弹幕文字 | |
| progress | int32 | 弹幕出现时间 | 单位为毫秒 |
| ctime | string | 创建时间? | 此项为空 |
| mtime | string | 修改时间? | 此项为空 |
| extra | string | 弹幕负载数据 | json序列字串 |
| idStr | string | 弹幕dmid | 字串形式 |
`extra`json序列
类型为【UP主头像弹幕】时
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| icon | str | UP主头像url | |
类型为【关联视频弹幕】时:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ------------------- | ---- |
| aid | num | 关联视频的avid | |
| title | str | 关联视频的标题 | |
| icon | str | 关联视频按钮图片url | |
| bvid | str | 关联视频的bvid | |
类型为【视频内嵌引导关注按钮】时:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------------ | ------------------------------------------ |
| duration | num | 持续时间 | 单位为毫秒 |
| posX | num | X坐标 | 区间:[118-549] |
| posY | num | Y坐标 | 区间:[82-293] |
| icon | str | 按钮图片url | 不应该是关注按钮吗,但这个是圆形的 |
| type | num | 关注按钮类型 | 0仅关注<br />1仅三联<br />2关注+三联 |
消息`dmSetting`
| 名称 | 类型 | 含义 | 备注 |
| ------------ | ------ | ------------------------ | ------------------------------------------------------------ |
| dmSwitch | bool | 弹幕开关 | true开启<br />false关闭 |
| aiSwitch | bool | 智能云屏蔽 | 同上 |
| aiLevel | int32 | 智能云屏蔽级别 | 区间:[1-10] |
| blocktop | bool | 屏蔽类型-顶部 | true不屏蔽<br />false屏蔽 |
| blockscroll | bool | 屏蔽类型-滚动 | 同上 |
| blockbottom | bool | 屏蔽类型-底部 | 同上 |
| blockcolor | bool | 屏蔽类型-彩色 | 同上 |
| blockspecial | bool | 屏蔽类型-特殊 | 同上 |
| preventshade | bool | 防挡弹幕底部15% | true开启<br />false关闭 |
| dmask | bool | 智能防挡弹幕(人像蒙版) | 同上 |
| opacity | float | 弹幕不透明度 | 区间:[0-1] |
| dmarea | int32 | 弹幕显示区域 | 100不重叠<br />753/4屏<br />50半瓶<br />251/4屏<br />0不限 |
| speedplus | float | 弹幕速度 | 区间:[0.4-1.6] |
| fontsize | float | 字体大小 | 区间:[0.4-1.6] |
| screensync | bool | 跟随屏幕缩放比例 | |
| speedsync | bool | 根据播放倍速调整速度 | |
| fontfamily | string | 字体类型? | 未启用 |
| bold | bool | 粗体? | 未启用 |
| fontborder | int32 | 描边类型 | 0重墨<br />1描边<br />245°投影 |
| drawType | string | 渲染类型? | 未启用 |
protobuf结构体
**web_dmview.proto**
```protobuf
syntax = "proto3";
//分段弹幕包信息?
message DmSegConfig {
int64 pageSize = 1; //分段时间?
int64 total = 2; //最大分页数?
}
//
message DanmakuFlagConfig {
int32 recFlag = 1; //
string recText = 2; //
int32 recSwitch = 3; //
}
// 互动弹幕条目
message CommandDm {
int64 id = 1; //弹幕dmid
int64 oid = 2; //视频cid
int64 mid = 3; //发送者mid
string command = 4; //弹幕指令
string content = 5; //弹幕文字
int32 progress = 6; //弹幕出现时间
string ctime = 7; //
string mtime = 8; //
string extra = 9; //弹幕负载数据
string idStr = 10; //弹幕dmid字串形式
}
//弹幕个人配置
message DanmuWebPlayerConfig{
bool dmSwitch=1; //弹幕开关
bool aiSwitch=2; //智能云屏蔽
int32 aiLevel=3; //智能云屏蔽级别
bool blocktop=4; //屏蔽类型-顶部
bool blockscroll=5; //屏蔽类型-滚动
bool blockbottom=6; //屏蔽类型-底部
bool blockcolor=7; //屏蔽类型-彩色
bool blockspecial=8; //屏蔽类型-特殊
bool preventshade=9; //防挡弹幕底部15%
bool dmask=10; //智能防挡弹幕(人像蒙版)
float opacity=11; //弹幕不透明度
int32 dmarea=12; //弹幕显示区域
float speedplus=13; //弹幕速度
float fontsize=14; //字体大小
bool screensync=15; //跟随屏幕缩放比例
bool speedsync=16; //根据播放倍速调整速度
string fontfamily=17; //字体类型?
bool bold=18; //粗体?
int32 fontborder=19; //描边类型
string drawType=20; //渲染类型?
}
message DmWebViewReply {
int32 state = 1; //弹幕开放状态
string text = 2; //
string textSide = 3; //
DmSegConfig dmSge = 4; //分段弹幕包信息?
DanmakuFlagConfig flag = 5; //
repeated string specialDms = 6; //BAS代码弹幕专包url
bool checkBox = 7; //
int64 count = 8; //实际弹幕总数
repeated CommandDm commandDms = 9; //互动弹幕条目
DanmuWebPlayerConfig dmSetting = 10; //弹幕个人配置
}
```
**示例:**
获取视频`av797164471(cid=236871317)`的弹幕元数据
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/web/view' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=236871317' \
--data-urlencode 'pid=797164471' \
-b 'SESSDATA=xxx' \
-o 'danmaku_view.bin'
```
响应正文为protubuf二进制数据
## 实例
### 获取互动弹幕
获取并显示视频`av797164471(cid=236871317)`的所有互动弹幕
```python
import web_dmview_pb2
import requests
AVID = 797164471
CID = 236871317
url = f'https://api.bilibili.com/x/v2/dm/web/view?type=1&oid={CID}&pid={AVID}'
data = requests.get(url)
target = web_dmview_pb2.DmWebViewReply()
target.ParseFromString(data.content)
print(f'互动弹幕数={len(target.commandDms)}')
for i in target.commandDms:
print(f'''\
---弹幕ID={i.id}
---视频cid={i.oid}
---发送者mid={i.mid}
---弹幕指令={i.command}
---弹幕文字={i.content}
---弹幕出现时间={i.progress}
---弹幕负载数据={i.extra}
---弹幕ID字串={i.idStr}'''
)
```
输出为:
```
互动弹幕数=1
---弹幕ID=38469676112019463
---视频cid=236871317
---发送者mid=501183549
---弹幕指令=#UP#
---弹幕文字=这个视频没有恰饭!别紧张!
---弹幕出现时间=157818
---弹幕负载数据={"icon":"https://i1.hdslb.com/bfs/face/559abe31f561f71f3106d8ee7b2065cac50c1235.jpg"}
---弹幕ID字串=38469676112019463
```
### 获取BAS代码弹幕专包
BAS弹幕`pool=2` `mode=9`)只能从此包获取,代码弹幕(`pool=2` `mode=8`)也能从此包获取
获取并显示视频`av2(cid=62131)`的所有BAS代码弹幕专包
```python
import web_dmview_pb2
import requests
AVID = 2
CID = 62131
url = f'https://api.bilibili.com/x/v2/dm/web/view?type=1&oid={CID}&pid={AVID}'
data = requests.get(url)
target = web_dmview_pb2.DmWebViewReply()
target.ParseFromString(data.content)
print(f'特殊弹幕包数={len(target.specialDms)}')
for i in target.specialDms:
print(f'特殊弹幕包url={i}')
```
输出为:
```
特殊弹幕包数=1
特殊弹幕包url=https://i0.hdslb.com/bfs/dm/b0d5f08c12be59292aa0d4e09b6dd8e54c2ba886.bin
```
使用[普通分段包弹幕](danmaku_proto.md#获取实时弹幕)的proto结构体反序列化此bin数据

153
docs/danmaku/danmaku_xml.md Normal file
View File

@@ -0,0 +1,153 @@
# xml弹幕
实时弹幕池容量有限根据视频类型500-8000条不等占满后再发送会使实时弹幕池底部的弹幕压入历史弹幕池类似于堆栈
---
- [获取实时弹幕1](#获取实时弹幕1)
- [获取实时弹幕2](#获取实时弹幕2)
- [弹幕格式](#弹幕格式)
---
## 获取实时弹幕1
> https://api.bilibili.com/x/v1/dm/list.so
*请求方式GET*
**使用deflate压缩注意解码**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------- | ------ | ---- |
| oid | num | 视频cid | 必要 | |
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/v1/dm/list.so' \
--data-urlencode 'oid=144541892' \
--compressed -o 'danmaku.xml'
```
## 获取实时弹幕2
> https://comment.bilibili.com/{cid}.xml
*请求方式GET*
效果与前者相同
**使用deflate压缩注意解码**
**url路径**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------- | ------ | ---- |
| cid | num | 视频cid | 必要 | |
**示例:**
```shell
curl 'https://comment.bilibili.com/144541892.xml'
--compressed -o 'danmaku.xml'
```
**xml回复**
<details>
<summary>查看响应示例:</summary>
```xml
<?xml version="1.0" encoding="UTF-8"?>
<i>
<chatserver>chat.bilibili.com</chatserver>
<chatid>144541892</chatid>
<mission>0</mission>
<maxlimit>1500</maxlimit>
<state>0</state>
<real_name>0</real_name>
<source>e-r</source>
<d p="490.19100,1,25,16777215,1584268892,0,a16fe0dd,29950852386521095">从结尾回来看这里,更感动了!</d>
<d p="18.77300,1,25,16777215,1584268920,0,4fe08d3,29950867226492933">咦三体居然还有动画</d>
<d p="52.88400,1,25,16777215,1584268954,0,4fe08d3,29950885214289927">哈哈哈哈开心</d>
<d p="25.51600,1,25,16777215,1584268957,0,e4b18b37,29950886612566021">红岸么</d>
<d p="144.45200,1,25,16777215,1584269076,0,e4b18b37,29950948716576775">我就是想看我的世界里水滴长啥样</d>
<d p="112.64100,1,25,16777215,1584269109,0,96606007,29950966302244871">有手指?</d>
<d p="222.84000,1,25,16777215,1584269154,0,e4b18b37,29950989809745923">侦测到在途的聚变打击</d>
<d p="284.77800,1,25,16777215,1584269216,0,e4b18b37,29951022237483011">都是虫子</d>
<d p="398.00500,1,25,16777215,1584269329,0,e4b18b37,29951081615196163">ocean</d>
<d p="432.17900,1,25,16777215,1584269363,0,e4b18b37,29951099571535943">村民,哼~</d>
<d p="467.41900,1,25,16777215,1584269399,0,e4b18b37,29951118364639237">黄河之水天上来</d>
<d p="6.71900,1,25,16777215,1584269422,0,70ba16f4,29951130398621699">镇站之宝</d>
<d p="313.08600,1,25,16777215,1584269425,0,e531c9dc,29951131798994947">这水</d>
<d p="587.87900,1,25,16777215,1584269519,0,e4b18b37,29951181142360071">海的那边是什么</d>
<d p="618.05000,1,25,16777215,1584269549,0,e4b18b37,29951196901933061">折跃门准备完毕</d>
…………
<i>
```
</details>
## 弹幕格式
### xml格式结构
- 标签 i
- 标签 chatserverchat.bilibili.com
- 标签 chatid视频cid
- 标签 mission0
- 标签 maxlimit实时弹幕池最大容量
- 标签 state弹幕状态0正常 1弹幕已关闭
- 标签 real_name0
- 标签 sourcee-r
- 标签 d (带有属性 p弹幕内容
### 属性 p
字符串内每项用逗号`,`分隔
| 项 | 含义 | 类型 | 备注 |
| ---- | ------------------ | ------ | ------------------------------------------------------------ |
| 0 | 视频内弹幕出现时间 | float | 秒 |
| 1 | 弹幕类型 | int32 | 1 2 3普通弹幕<br />4底部弹幕<br />5顶部弹幕<br />6逆向弹幕<br />7高级弹幕<br />8代码弹幕<br />9BAS弹幕`pool`必须为2 |
| 2 | 弹幕字号 | int32 | 18<br />25标准<br />36大 |
| 3 | 弹幕颜色 | int32 | 十进制RGB888值 |
| 4 | 弹幕发送时间 | int32 | 时间戳 |
| 5 | 弹幕池类型 | int32 | 0普通池<br />1字幕池<br />2特殊池代码/BAS弹幕 |
| 6 | 发送者mid的HASH | string | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户id |
| 7 | 弹幕dmid | int64 | 唯一 可用于操作参数 |
| 8 | 弹幕的屏蔽等级 | int32 | 0-10低于用户设定等级的弹幕将被屏蔽<br />(新增,下方样例未包含) |
```xml
<d p="490.19100,1,25,16777215,1584268892,0,a16fe0dd,29950852386521095">从结尾回来看这里,更感动了!</d>
```
弹幕内容为:“从结尾回来看这里,更感动了!”
参数为视频内出现的时间是490.19100秒,类型是普通弹幕,字号为标准,颜色为白色(#FFFFFF发送时间是2020/3/15 18:41:32.........
### web版标准颜色
弹幕的颜色属性使用**十进制RGB888**值
| 颜色 | HEXRGB888 | DECRGB888 |
| --------------------------------- | ----------------------------------- | ------------------------------------- |
| <font color="#FE0302">红色</font> | <font color="#FE0302">FE0302</font> | <font color="#FE0302">16646914</font> |
| <font color="#FF7204">橘红</font> | <font color="#FF7204">FF7204</font> | <font color="#FF7204">16740868</font> |
| <font color="#FFAA02">橘黄</font> | <font color="#FFAA02">FFAA02</font> | <font color="#FFAA02">16755202</font> |
| <font color="#FFD302">淡黄</font> | <font color="#FFD302">FFD302</font> | <font color="#FFD302">16765698</font> |
| <font color="#FFFF00">黄色</font> | <font color="#FFFF00">FFFF00</font> | <font color="#FFFF00">16776960</font> |
| <font color="#A0EE00">草绿</font> | <font color="#A0EE00">A0EE00</font> | <font color="#A0EE00">10546688</font> |
| <font color="#00CD00">绿色</font> | <font color="#00CD00">00CD00</font> | <font color="#00CD00">52480</font> |
| <font color="#019899">墨绿</font> | <font color="#019899">019899</font> | <font color="#019899">104601</font> |
| <font color="#4266BE">紫色</font> | <font color="#4266BE">4266BE</font> | <font color="#4266BE">4351678</font> |
| <font color="#89D5FF">青色</font> | <font color="#89D5FF">89D5FF</font> | <font color="#89D5FF">9022215</font> |
| <font color="#CC0273">品红</font> | <font color="#CC0273">CC0273</font> | <font color="#CC0273">13369971</font> |
| <font color="#222222">黑色</font> | <font color="#222222">222222</font> | <font color="#222222">2236962</font> |
| <font color="#9B9B9B">灰色</font> | <font color="#9B9B9B">9B9B9B</font> | <font color="#9B9B9B">10197915</font> |
| <font color="#FFFFFF">白色</font> | <font color="#FFFFFF">FFFFFF</font> | <font color="#FFFFFF">16777215</font> |

246
docs/danmaku/history.md Normal file
View File

@@ -0,0 +1,246 @@
# 历史弹幕
**注历史弹幕的xml接口已经失效现已改为protobuf接口**
- [查询历史弹幕日期](#查询历史弹幕日期)
- [获取历史弹幕protobuf接口](#获取历史弹幕protobuf接口)
- [~~获取历史弹幕xml接口~~](#获取历史弹幕xml接口)
---
## 查询历史弹幕日期
> https://api.bilibili.com/x/v2/dm/history/index
*请求方式GET*
认证方式CookieSESSDATA
**注:查询历史弹幕需要登录**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------ | ------- |
| type | num | 1 | 必要 | |
| oid | num | 视频cid | 必要 | |
| month | str | 查询目标年月 | 必要 | YYYY-MM |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------------------------------- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | 有弹幕array<br />无弹幕null | 日期列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------- | ---------- |
| 0 | str | 存在弹幕的日期1 | YYYY-MM-DD |
| n | str | 存在弹幕的日期(n+1) | YYYY-MM-DD |
| …… | str | …… | …… |
**示例:**
查询了cid为144541892的视频位于2020年1月中有历史弹幕记录的日期
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/history/index' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
--data-urlencode 'month=2020-01' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
"2020-01-21",
"2020-01-22",
"2020-01-23",
"2020-01-24",
"2020-01-25",
"2020-01-26",
"2020-01-27",
"2020-01-28",
"2020-01-29",
"2020-01-30",
"2020-01-31"
]
}
```
</details>
返回结果的 `data` 项说明这些日期有弹幕发送。若查询的月份中视频无弹幕,则 `data` 项为 `null`
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/history/index' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
--data-urlencode 'month=2019-12' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": null
}
```
</details>
## 获取历史弹幕protobuf接口
> https://api.bilibili.com/x/v2/dm/web/history/seg.so
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ----------- |
| type | num | 弹幕类 | 必要 | 1视频弹幕 |
| oid | num | 视频cid | 必要 | |
| date | str | 弹幕日期 | 必要 | YYYY-MM-DD |
**proto回复**
porto定义见[bilibili.community.service.dm.v1.DmSegMobileReply](../grpc_api/bilibili/community/service/dm/v1.proto)
详细说明见[protobuf弹幕](danmaku_proto.md)
获取视频`av84271171(cid=144541892)`2020-01-21的历史弹幕
**注proto定义需要编译**
```python
import requests
import google.protobuf.text_format as text_format
import bilibili.community.service.dm.v1_pb2 as Danmaku
url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so'
params = {
'type':1, #弹幕类型
'oid':144541892, #cid
'date':'2020-01-21' #弹幕日期
}
cookies = {
'SESSDATA':'xxx'
}
resp = requests.get(url,params,cookies=cookies)
data = resp.content
danmaku_seg = Danmaku.DmSegMobileReply()
danmaku_seg.ParseFromString(data)
print(text_format.MessageToString(danmaku_seg.elems[0],as_utf8=True))
```
输出:
```
id: 27532611677585408
progress: 300507
mode: 1
fontsize: 25
color: 16777215
midHash: "2a28d4a6"
content: "章北海的老爹"
ctime: 1579621359
idStr: "27532611677585408"
```
## 获取历史弹幕xml接口
<details>
<summary>查看折叠内容:</summary>
> https://api.bilibili.com/x/v2/dm/history
*请求方式GET*
认证方式CookieSESSDATA
**注:查询历史弹幕需要登录**
结果为[标准xml格式弹幕](danmaku_xml.md#弹幕格式)
**使用deflate压缩注意解码**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---------- |
| type | num | 1 | 必要 | |
| oid | num | 视频cid | 必要 | |
| date | str | 弹幕日期 | 必要 | YYYY-MM-DD |
**示例:**
获取视频`av84271171(cid=144541892)`2020-01-21的历史弹幕
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/history' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
--data-urlencode 'date=2020-01-21' \
-b 'SESSDATA=xxx' \
--compressed -o 'danmaku.xml'
```
<details>
<summary>查看响应示例:</summary>
```xml
<?xml version="1.0" encoding="UTF-8"?>
<i>
<chatserver>chat.bilibili.com</chatserver>
<chatid>144541892</chatid>
<mission>0</mission>
<maxlimit>1500</maxlimit>
<state>0</state>
<real_name>0</real_name>
<d p="473.43400,1,25,15138834,1579622380,0,ec16f2d,27532609919123456">敬礼</d>
<d p="3.10200,1,25,16777215,1579622362,0,a2bd7474,27532609920696320">悄默声的更新啊怎么</d>
<d p="17.52300,1,25,16777215,1579622357,0,972c932b,27532609906016258">久等了</d>
<d p="40.81800,1,25,16777215,1579622343,0,bbca6701,27532609906540546">不都是乱纪元才浸泡</d>
<d p="243.39800,1,25,15138834,1579622336,0,77b00ed9,27532609924890624">已阅,狗屁不通。大字报在地上搞搞就行,别弄到天上去</d>
<d p="559.80000,1,25,16777215,1579622334,0,9affc7f5,27532609909686274">CSSC。。。</d>
<d p="398.29700,1,25,16777215,1579622331,0,18d4707,27532609926463488">看到了个寂寞</d>
<d p="34.81000,1,25,38979,1579622327,0,319d7700,27532609926987776">有耳朵了!</d>
<d p="18.65700,1,25,16777215,1579622321,0,bbca6701,27532609912307714">雪天不用浸泡吧</d>
<d p="305.99800,1,25,16777215,1579622316,0,878c315b,27532609928560640">未来史学派</d>
<d p="7.86200,1,25,16777215,1579622309,0,c5136613,27532609913880578">浸泡!!!!!!!</d>
<d p="368.95600,1,25,16777215,1579622302,0,18d4707,27532609914404866">章召忠</d>
<d p="25.19800,1,25,16777215,1579622286,0,4dab6898,27532609931706368">mi24av</d>
<d p="41.10100,1,25,16777215,1579622274,0,33d31036,27532609932230656">泪奔</d>
<d p="627.69800,1,25,16777215,1579622264,0,d79a826a,27532609933279232">组建太空军</d>
<d p="310.58900,1,25,16777215,1579622243,0,18d4707,27532609918074882">是未来史学派?</d>
<d p="723.34800,1,25,16777215,1579622239,0,844fa9e7,27532609919123458">刘培强还行</d>
…………
<i>
```
</details>
</details>

92
docs/danmaku/snapshot.md Normal file
View File

@@ -0,0 +1,92 @@
# 弹幕快照
- [获取弹幕快照](#获取弹幕快照)
---
## 获取弹幕快照
> https://api.bilibili.com/x/v2/dm/ajax
*请求方式:GET*
最近产生的几条弹幕内容,**最多20条**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | -------- | ------------------ | ------ | ---- |
| aid | num或str | 稿件avid或稿件bvid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | --------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-404无视频 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | array | 预览列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | -------- |
| 0 | str | 预览内容1 | |
| n | str | 预览内容n+1 | |
| …… | str | …… | …… |
| 19 | str | 预览内容20 | 最后一条 |
**示例:**
获取视频`av43337021`/`BV1rb411m7gE`的弹幕快照总计20条
avid方式
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/ajax' \
--data-urlencode 'aid=43337021'
```
bvid方式
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/ajax' \
--data-urlencode 'aid=BV1rb411m7gE'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
"漫画比动漫好看而且血腥",
"666",
"金木小天使",
"太喜欢了",
"每天一遍防止抑郁",
"我还记得土豆那时候还有的看",
"把在给我摸摸~",
"突然泪目",
"感谢野生字幕君",
"993-7",
"刚刚出的时候小学看,现在高二了",
"原版op有这么长吗搞笑肯定做了剪辑op会给你放全歌",
"让你看个op 3 : 5 4 秒?",
"说原版不原版的都是弱智",
"樱花",
"请打开洗脑循环食用,请打开洗脑循环食用,请打开洗脑循环食用,请打开洗脑循环食用,请打开洗脑循环食用,",
"再来亿遍",
"错的不是我,而是这个世界。",
"吃货的第一季的最后一季足以让他封神!",
"+"
]
}
```
</details>

109
docs/dynamic/action.md Normal file
View File

@@ -0,0 +1,109 @@
# 动态操作
- [删除动态](#删除动态)
- [删除定时发送动态](#删除草稿)
## 删除动态
> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic
*请求方式POST*
认证方式CookieSESSDATA
**正文参数multipart/form-data**
| 参数名 | 类型 | 内容 |
| ---------- | ---- | ------ |
| dynamic_id | num | 动态id |
| csrf_token | str | csrf |
**json回复**
根对象:
| 字段 | 类型 | 内容 |
| ------- | ---- | ----------------- |
| code | num | 0:成功 |
| | | 500404:已经删除过 |
| | | 500406:不是自己的 |
| msg | str | 错误信息 |
| message | str | 和msg一样 |
| data | obj | 未知 |
<details>
<summary>查看示例</summary>
```bash
curl 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0' \
-H 'Referer: https://t.bilibili.com/' \
-H 'Cookie: SESSDATA=********; bili_jct=de2731532b4ab96bc8536da948932668;' \
--data-raw 'dynamic_id=588320531406678918&csrf_token=de2731532b4ab96bc8536da948932668&csrf=de2731532b4ab96bc8536da948932668'
```
```json
{
"code":0,
"msg":"",
"message":"",
"data": {
"_gt_":0
}
}
```
</details>
## 删除草稿
> https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/rm_draft
*请求方式POST*
认证方式CookieSESSDATA
**正文参数application/x-www-form-urlencoded**
| 参数名 | 类型 | 内容 |
| ---------- | ---- | -------------- |
| draft_id | num | 定时发送草稿id |
| csrf_token | str | csrf |
**json回复**
根对象:
| 字段 | 类型 | 内容 |
| ------- | ---- | ---------------------------- |
| code | num | 0:成功<br/>4120015: 系统异常 |
| message | str | 错误信息 |
| ttl | num | 1 |
| data | obj | 空对象 |
<details>
<summary>查看示例</summary>
```bash
curl -X POST 'https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/rm_draft' \
--data-urlencode 'draft_id=755409289278914611' \
--data-urlencode 'csrf=xxxx'
-b 'SESSDATA=xxxx;' \
```
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {}
}
```
</details>

146
docs/dynamic/atlist.md Normal file
View File

@@ -0,0 +1,146 @@
# 根据关键字搜索用户(at别人时的填充列表)
**注意关键字不一定顺序匹配,如最后示例**
> https://api.vc.bilibili.com/dynamic_mix/v1/dynamic_mix/at_search
*请求方式GET*
认证方式CookieSESSDATA
**正文参数multipart/form-data**
| 参数名 | 类型 | 内容 |
| --- | --- | --- |
| uid | num | 自己的uid |
| keyword | str | 搜索关键字 |
**json回复**
根对象:
| 字段 | 类型 | 内容 |
| --- | --- | --- |
| code | num | 0成功 |
| msg | str | 成功为空文本 |
| message | str | 同msg |
| data | obj | 数据本体 |
data对象:
| 字段 | 类型 | 内容 |
| --- | --- | --- |
| groups | obj[] | 内容分组(好像是根据关注列表分) |
| \_gt_ | num | 0 |
group对象:
| 字段 | 类型 | 内容 |
| --- | --- | --- |
| group_type | num | 2:我的关注<br>4:其他 |
| group_name | str | 分组名字 |
| items | obj[] | 用户信息 |
item对象:
| 字段 | 类型 | 内容 |
| --- | --- | --- |
| uid | num | 用户id |
| uname | str | 用户昵称 |
| face | str | 用户头像url |
| fans | num | 用户粉丝数 |
| official_verify_type | num | 认证信息? |
<details>
<summary>查看示例</summary>
```shell
# 搜索关键字:社会易
curl 'https://api.vc.bilibili.com/dynamic_mix/v1/dynamic_mix/at_search?uid=15858903&keyword=%e7%a4%be%e4%bc%9a%e6%98%93' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0' -H 'Accept: application/json, text/plain, */*' \
-H 'Referer: https://t.bilibili.com/' \
-H 'Cookie: SESSDATA=******'
```
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"groups": [
{
"group_type": 2,
"group_name": "我的关注",
"items": [
{
"uid": 293793435,
"uname": "社会易姐QwQ",
"face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg",
"fans": 1179,
"official_verify_type": -1
}
]
},
{
"group_type": 4,
"group_name": "其他",
"items": [
{
"uid": 250129011,
"uname": "社会小伙肖子易",
"face": "https://i0.hdslb.com/bfs/face/2ae12d7f71173baa8e00c4cfe97acb5a3de31566.jpg",
"fans": 7,
"official_verify_type": -1
},
{
"uid": 394873001,
"uname": "社会你易叔",
"face": "https://i2.hdslb.com/bfs/face/bde2811aa895e349036aba9ece5630bcd1341ff0.jpg",
"fans": 5,
"official_verify_type": -1
},
{
"uid": 486568790,
"uname": "社会主义接班人小易",
"face": "https://i2.hdslb.com/bfs/face/1ebb0d4aa8e2c4b532f82983503ec38b62a1820f.jpg",
"fans": 3,
"official_verify_type": -1
},
{
"uid": 497214639,
"uname": "社会你易易",
"face": "https://i0.hdslb.com/bfs/face/dccb52f3c15ba1bb99aac3c86e9825842cc95295.jpg",
"fans": 2,
"official_verify_type": -1
},
{
"uid": 496622388,
"uname": "社会你易哥",
"face": "https://i0.hdslb.com/bfs/face/daac5514a7622741f767c68b1cbc6b91e60b4798.jpg",
"fans": 1,
"official_verify_type": -1
},
{
"uid": 457675287,
"uname": "易社会",
"face": "https://i0.hdslb.com/bfs/face/632bf9dd17f4e9f2f12be2c0ad00cdacd2d825fa.jpg",
"fans": 1,
"official_verify_type": -1
},
{
"uid": 123270058,
"uname": "周易社会",
"face": "https://i1.hdslb.com/bfs/face/c6100396729112230deb3b0972db1504e9ce21bf.jpg",
"fans": 1,
"official_verify_type": -1
}
]
}
],
"_gt_": 0
}
}
```
</details>

1586
docs/dynamic/basicInfo.md Normal file

File diff suppressed because it is too large Load Diff

487
docs/dynamic/card_info.md Normal file
View File

@@ -0,0 +1,487 @@
# 动态详细信息字段
不同动态内容卡片的具体信息。包含在***获取特定动态卡片信息,话题下特定动态信息***等API的Json回复中。
以card字段的形式出现内容为一个可被解析为Json对象的字符串。
不同类型的动态内容拥有不同的字段。
****
## 在转发类动态中type=1
需注意账号转发视频投稿其他用户的动态以及分享收藏夹等均为转发类内容并不属于type=4300的收藏类动态等。
在type=1的转发类动态中解析出的对象包含以下内容
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| user | obj | 转发者用户信息 | 包含用户名用户id和头像 |
| item | obj | 转发相关信息 | `content`字段为转发附言 | |
| origin | str | 被转发动态信息 | 即本文档所描述的动态详细信息字段。</br>动态类型为`item`对象的`orig_type`字段 |
| origin_extend_json | str | 被转发动态补充信息 | |
| origin_user | obj | 被转发用户信息 | |
| activity_infos | obj | 被转发动态参与的活动 | |
<details>
<summary>查看字段内容示例:</summary>
```json
{
"user": {
"uid": 1704629193,
"uname": "钢板狗的狐",
"face": "https://i0.hdslb.com/bfs/face/443bfd128429f84c0d81c20c4354ea5007f7480c.jpg"
},
"item": {
"rp_id": 587236631985408400,
"uid": 1704629193,
"content": "#阅机无数#这是什么本子",
"ctrl": "",
"orig_dy_id": 587058081595689300,
"pre_dy_id": 587058081595689300,
"timestamp": 1635565083,
"reply": 0,
"orig_type": 8
},
"origin": "{\"aid\":933765713,\"attribute\":0,\"cid\":433047365,\"copyright\":1,\"ctime\":1635523511,\"desc\":\"-\",\"dimension\":{\"height\":1920,\"rotate\":0,\"width\":1080},\"duration\":200,\"dynamic\":\"\",\"first_frame\":\"https:\\/\\/i2.hdslb.com\\/bfs\\/storyff\\/n211029a2nf13h6fhybt231isumtaj9x_firsti.jpg\",\"jump_url\":\"bilibili:\\/\\/video\\/933765713\\/?page=1&player_preload=null&player_width=1080&player_height=1920&player_rotate=0\",\"owner\":{\"face\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/face\\/e4c06054bc9d6c564637f70a7565a6a2d24ee521.jpg\",\"mid\":492755628,\"name\":\"Leojdj\"},\"pic\":\"https:\\/\\/i2.hdslb.com\\/bfs\\/archive\\/8b3bd4387d4041389ba7f02ce813b17f96a7f1e2.jpg\",\"player_info\":null,\"pubdate\":1635523511,\"rights\":{\"autoplay\":1,\"bp\":0,\"download\":0,\"elec\":0,\"hd5\":0,\"is_cooperation\":0,\"movie\":0,\"no_background\":0,\"no_reprint\":1,\"pay\":0,\"ugc_pay\":0,\"ugc_pay_preview\":0},\"short_link\":\"https:\\/\\/b23.tv\\/BV16T4y1R7H9\",\"short_link_v2\":\"https:\\/\\/b23.tv\\/BV16T4y1R7H9\",\"stat\":{\"aid\":933765713,\"coin\":0,\"danmaku\":0,\"dislike\":0,\"favorite\":1,\"his_rank\":0,\"like\":2,\"now_rank\":0,\"reply\":2,\"share\":1,\"view\":70},\"state\":0,\"tid\":95,\"title\":\"试图安装Windows10\",\"tname\":\"数码\",\"up_from_v2\":9,\"videos\":1}",
"origin_extend_json": "{\"\":{\"ogv\":{\"ogv_id\":0}},\"dispute\":{\"content\":\"\"},\"from\":{\"from\":\"\"},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"},\"topic\":{\"is_attach_topic\":1}}",
"origin_user": {
"info": {
"uid": 492755628,
"uname": "Leojdj",
"face": "https://i0.hdslb.com/bfs/face/e4c06054bc9d6c564637f70a7565a6a2d24ee521.jpg"
},
"card": {
"official_verify": {
"type": -1,
"desc": ""
}
},
"vip": {
"vipType": 0,
"vipDueDate": 0,
"vipStatus": 0,
"themeType": 0,
"label": {
"path": "",
"text": "",
"label_theme": "",
"text_color": "",
"bg_style": 0,
"bg_color": "",
"border_color": ""
},
"avatar_subscript": 0,
"nickname_color": "",
"role": 0,
"avatar_subscript_url": ""
},
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0,
"image_enhance": "",
"image_enhance_frame": ""
},
"rank": "10000",
"sign": "",
"level_info": {
"current_level": 3
}
},
"activity_infos": {
"details": [
{
"type": 1,
"detail": "{\"is_show\":1,\"topic_id\":10511051,\"topic_link\":\"https:\\/\\/member.bilibili.com\\/york\\/punch-card?navhide=1\",\"topic_name\":\"打卡挑战\"}"
}
]
}
}
```
</details>
## 在图片动态中type=2
在type=2的图片动态中解析出的对象包含以下内容
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| item | obj | 图片动态内容 | `description`字段为文字内容</br>`pictures`字段图片 | |
| user | obj | 发布者用户信息 | 包含用户名用户id和头像 |
<details>
<summary>查看字段内容示例:</summary>
```json
{
"item": {
"at_control": "",
"category": "daily",
"description": "#阅机无数#已知这个笔记本的品牌为Dell隶属于灵越系列主打外观的设计目测应该是4代酷睿之前的型号CPU应该是低压i5/i3不知道能否找出具体型号",
"id": 172408258,
"is_fav": 0,
"pictures": [
{
"img_height": 2400,
"img_size": 1425.97998046875,
"img_src": "https://i0.hdslb.com/bfs/album/3716f26eeede4d77874f3eeacd49b0e2e597fcc3.jpg",
"img_tags": null,
"img_width": 1080
}
],
"pictures_count": 1,
"reply": 2,
"role": [],
"settings": {
"copy_forbidden": "0"
},
"source": [],
"title": "",
"upload_time": 1635433727
},
"user": {
"head_url": "https://i1.hdslb.com/bfs/face/98f88e00306ac92d30bae013f8295d26bd018093.jpg",
"name": "LostCity失落之城",
"uid": 169216498,
"vip": {
"avatar_subscript": 0,
"due_date": 0,
"label": {
"label_theme": "",
"path": "",
"text": ""
},
"nickname_color": "",
"status": 0,
"theme_type": 0,
"type": 0,
"vip_pay_type": 0
}
}
}
```
</details>
## 在文字动态中type=4
在type=4的文字动态中解析出的对象包含以下内容
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| item | obj | 文字动态内容 | `description`字段为文字内容 | |
| user | obj | 发布者用户信息 | 包含用户名用户id和头像 |
<details>
<summary>查看字段内容示例:</summary>
```json
{
"user": {
"uid": 403417570,
"uname": "杯子人一君羊",
"face": "https://i1.hdslb.com/bfs/face/cf0772f2e4d76f75ca4c230d9ab1b50012a8bbfa.jpg"
},
"item": {
"rp_id": 586612173803463700,
"uid": 403417570,
"content": "#阅机无数# 文字题\nthinkpad 09-15年\n触控笔\nenergy star\ncore i5\n[藏狐]",
"ctrl": "",
"orig_dy_id": 0,
"pre_dy_id": 0,
"timestamp": 1635419690,
"reply": 2
}
}
```
</details>
## 在视频投稿动态中type=8
在type=8的视频投稿动态中解析出的对象包含以下内容
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| aid | num | 视频avid | |
| attribute | num | `0` | [可能已弃用](https://shakaianee.top/archives/9/) |
| cid | num | 视频cid | |
| copyright | num | 原创信息 | 1为原创2为转载 |
| desc | str | 视频简介 | |
| dimension | obj |视频1p分辨率| |
| duration | num | 视频时长 | 单位秒 |
| dynamic | str | 动态文字内容 | |
| first_frame | str | 视频第一帧图片 | 图片链接 |
| jump_url | str | 视频跳转链接 | |
| mission_id | num | 稿件参与的活动id | |
| owner | obj | 动态作者信息 | 即up主 |
| pic | str | 视频封面 | |
| player_info | ? | 可能是播放器信息 | |
| pubdate | num | 发布时间 | 时间戳 |
| rights | obj | 联合投稿,是否付费等信息 | 可能用来代替原`attribute`字段 |
| stat | obj | 视频数据 | 点赞投币等 |
| state | num | 视频状态 | 详情见**属性数据文档** |
| tid | num | 视频分区编号 | |
| title | str | 视频标题 | |
| tname | str | 视频分区名称 | |
| video | num | 视频数| |
<details>
<summary>查看字段内容示例:</summary>
```json
{
"aid": 506318410,
"attribute": 0,
"cid": 432711595,
"copyright": 1,
"ctime": 1635403080,
"desc": "我看谁敢欺负天依依?都别动啊,放那儿让我来!\n好久不写萌歌歌了耐心心看到结尾有天依依激萌嚎叫不\n\n作曲曲/编曲曲/混音音iKz @Signal-E | 作词词:叫叫与壶壶\n唱歌歌洛天依 | 调校校Creuzer\n曲绘绘pelokio & 贝贝web & 壶芬奇\nPVVAYWC八毛 @Signal-E\n制作人iKz\n\n蛀牙牙版BV1FR4y1n7rt",
"dimension": {
"height": 1080,
"rotate": 0,
"width": 1920
},
"duration": 265,
"dynamic": "我看谁敢欺负天依依?都别动啊,放那儿让我来!\n好久不写萌歌歌了耐心心看到结尾有洛天依激萌嚎叫不",
"first_frame": "https://i1.hdslb.com/bfs/storyff/n211029a21oldgobzh2ob1uf3tqav4yy_firsti.jpg",
"jump_url": "bilibili://video/506318410/?page=1&player_preload=null&player_width=1920&player_height=1080&player_rotate=0",
"mission_id": 122069,
"owner": {
"face": "https://i1.hdslb.com/bfs/face/4935c75aecf986c3c129400882ee9c5ceeeec4b5.jpg",
"mid": 25681,
"name": "iKz_茶壶"
},
"pic": "https://i0.hdslb.com/bfs/archive/06749bfe8b9505b00bd572950615912fecadb513.jpg",
"player_info": null,
"pubdate": 1635501604,
"rights": {
"autoplay": 1,
"bp": 0,
"download": 0,
"elec": 0,
"hd5": 1,
"is_cooperation": 1,
"movie": 0,
"no_background": 0,
"no_reprint": 1,
"pay": 0,
"ugc_pay": 0,
"ugc_pay_preview": 0
},
"short_link": "https://b23.tv/BV13u411o7Ht",
"short_link_v2": "https://b23.tv/BV13u411o7Ht",
"stat": {
"aid": 506318410,
"coin": 5490,
"danmaku": 486,
"dislike": 0,
"favorite": 6017,
"his_rank": 0,
"like": 8526,
"now_rank": 0,
"reply": 597,
"share": 568,
"view": 44737
},
"state": 0,
"tid": 30,
"title": "【超萌萌洛天依万圣节原创】嘤嘤大作战【iKz-茶壶壶】",
"tname": "VOCALOID·UTAU",
"videos": 1
}
```
</details>
## 在专栏投稿动态中type=64
在type=64的专栏投稿动态中解析出的对象包含以下内容
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| id | num | 专栏的id即cv号 | |
| category | obj | 分类号和分类名称 | |
| categories | obj | 分类信息 | |
| title | str | 专栏标题 | |
| summary | str | 专栏简介 | |
| banner_url | str | 头图链接 | |
| template_id | num | 模板信息 | |
| state | num | 专栏状态 | |
| author | obj | 作者信息 | 包含了头像挂件和勋章等 |
| reprint | num | 可能是转载 | |
| image_urls | obj | 图片链接 | |
| publish_time | num | 发布时间 | 时间戳,应该指专栏 |
| ctime | num | 发布时间 | 时间戳,应该指动态 |
| stats | obj | 专栏数据,点赞之类 | 有点踩字段,但并未实装此功能 |
| words | num | 字数 | |
| origin_image_urls | obj | 源图片地址 | |
| list | ? | 可能为文集 | |
| is_like | bool | 是否点赞 | |
| media | obj | 番剧电影相关内容 | 影评的分数,是否有剧透等 |
| apply_time | ? | ? | |
| check_time | ? | ? | |
| original | num | 是否原创 | |
| act_id | num | ? | |
| dispute | ? | 可能为是否争议内容 | |
| authenMark | ? | ? | |
| cover_avid | num | 相关视频id | 例如笔记专栏的原视频 |
| top_video_info | ? | ? | |
| type | num | 可能是专栏类别 | |
<details>
<summary>查看字段内容示例:</summary>
```json
{
"id": 12457797,
"category": {
"id": 42,
"parent_id": 41,
"name": "全部笔记"
},
"categories": [
{
"id": 41,
"parent_id": 0,
"name": "笔记"
},
{
"id": 42,
"parent_id": 41,
"name": "全部笔记"
}
],
"title": "【编曲教程】弦乐如何编写?二十分钟学会弦乐基础写法~",
"summary": "点击进入查看全文",
"banner_url": "https://i0.hdslb.com/bfs/archive/9c0f743f0d79bf3f73ea196eced55a9211ef363f.jpg",
"template_id": 4,
"state": 0,
"author": {
"mid": 310236726,
"name": "珞林ltyxh",
"face": "https://i0.hdslb.com/bfs/face/8c4aebb01b3cc34154168be51241b0345f110aeb.webp",
"pendant": {
"pid": 2155,
"name": "洛天依8th生日纪念",
"image": "https://i0.hdslb.com/bfs/garb/item/e98718ae0d09e48bc85df969820b88241bc06883.png",
"expire": 0
},
"official_verify": {
"type": -1,
"desc": ""
},
"nameplate": {
"nid": 4,
"name": "青铜殿堂",
"image": "https://i0.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png",
"image_small": "https://i2.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png",
"level": "普通勋章",
"condition": "单个自制视频总播放数>=1万"
},
"vip": {
"type": 2,
"status": 1,
"due_date": 0,
"vip_pay_type": 0,
"theme_type": 0,
"label": {
"path": "",
"text": "年度大会员",
"label_theme": "annual_vip"
},
"avatar_subscript": 1,
"nickname_color": "#FB7299"
}
},
"reprint": 0,
"image_urls": [
"https://i0.hdslb.com/bfs/article/banner/6daa4ac60ddec2456bb720dbb4979b07dd705e8a.png"
],
"publish_time": 1627921161,
"ctime": 1627921161,
"stats": {
"view": 107,
"favorite": 5,
"like": 11,
"dislike": 0,
"reply": 1,
"share": 0,
"coin": 1,
"dynamic": 0
},
"words": 225,
"origin_image_urls": [
"https://i0.hdslb.com/bfs/article/banner/6daa4ac60ddec2456bb720dbb4979b07dd705e8a.png"
],
"list": null,
"is_like": false,
"media": {
"score": 0,
"media_id": 0,
"title": "",
"cover": "",
"area": "",
"type_id": 0,
"type_name": "",
"spoiler": 0,
"season_id": 0
},
"apply_time": "",
"check_time": "",
"original": 1,
"act_id": 0,
"dispute": null,
"authenMark": null,
"cover_avid": 57337301,
"top_video_info": null,
"type": 2
}
```
</details>
## 在音频投稿动态中type=256
在type=256的音频投稿动态中解析出的对象包含以下内容
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| id | num | 投稿编号 | 即au号 |
| upId | num | 音乐人id | 与用户uid不同 |
| title | str | 音频标题 | |
| upper | str | 上传者名称 | |
| cover | str | 封面图链接 | |
| author | str | 作者名称 | |
| ctime | num | 上传时间 | 时间戳的后面加了三个0 |
| playCnt | num | 播放量 | |
| intro | str | 音频介绍 | |
| schema | str | 跳转链接 | 似乎并不只是url |
| typeInfo | str | 分区信息 | |
| upperAvatar | str | 上传者的头像链接 | |
<details>
<summary>查看字段内容示例:</summary>
```json
{
"id": 2562895,
"upId": 482834,
"title": "[蓝猫原创伴奏]无衣",
"upper": "NBluecat",
"cover": "https://i0.hdslb.com/bfs/music/1e7c4d04bd405159b66893d4cb68977ddf784b42.jpg",
"author": "NBluecat",
"ctime": 1632115270000,
"replyCnt": 1,
"playCnt": 252,
"intro": "_(:з」∠)_这是无衣的伴奏非常简单",
"schema": "bilibili://music/detail/2562895?name=%5B%E8%93%9D%E7%8C%AB%E5%8E%9F%E5%88%9B%E4%BC%B4%E5%A5%8F%5D%E6%97%A0%E8%A1%A3&uperName=&cover_url=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Fmusic%2F1e7c4d04bd405159b66893d4cb68977ddf784b42.jpg&upperId=&author=NBluecat",
"typeInfo": "音乐 · 纯音乐/演奏",
"upperAvatar": "https://i2.hdslb.com/bfs/face/d5bf3c9f179803134172ff1c6090ba6b999651c6.jpg"
}
```
</details>

1039
docs/dynamic/content.md Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,601 @@
# 获取特定动态卡片信息
> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ---- | ---------- | ------ | -------- |
| dynamic_id | id | 动态id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| data | obj | 信息本体 | |
| message | str | 错误信息 | 默认为空 |
| msg | num | 空 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ----- | ---------- | ------------ |
| card | obj | 动态卡片内容 | 当动态不存在/删除时不返回此项 |
| result | num | 0 | 作用尚不明确(当动态不存在/删除时不返回此项) |
| \_gt\_ | num | 0 | 作用尚不明确 |
`data`中的`card`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| activity_infos | obj | 该条动态参与的活动 |当此条动态没有参与任何活动时不显示此项 |
| card | str | 动态详细信息 | 会跟随此动态类型不同发生一定的变化,评论数、点赞数等相关信息参考`desc`字段 |
| desc | obj | 动态相关信息 | 会跟随此动态类型不同发生一定的变化,详细信息(例如动态描述等)参考`card`字段 |
| display | obj | 动态部分的可操作项 | 会随着动态类型发生变化,主要用于显示动态 |
| extend_json | str | 动态扩展项 | 会随着动态类型发生变化 |
**此处的大部分字段的内容都会根据`desc`中的`type`值发生一定变化具体的数值对照参考下表仅作参考部分内容的解释未知同时有些内容仅为在部分页面出现无法通过此API调出**
| 值 | 含义 |
| ---- | ---- |
| 268435455 | 具体定义未知 |
| 1 | 转发 |
| 2 | 图片动态 |
| 4 | 文字动态 |
| 8 | 视频动态 |
| 16 | 小视频 |
| 32 | 具体定义未知(可能为戏剧) |
| 64 | 专栏 |
| 256 | 音频 |
| 512 | 番剧 |
| 1024 | 具体定义未知 |
| 2048 | H5活动动态 |
| 2049 | 漫画分享 |
| 4097 | PGC番剧 |
| 4098 | 电影 |
| 4099 | 电视剧 |
| 4100 | 国创动漫 |
| 4101 | 纪录片 |
| 4200 | 直播 |
| 4201 | 直播 |
| 4300 | 收藏夹 |
| 4302 | 付费课程 |
| 4303 | 付费课程 |
| 4308 | 直播 |
| 4310 | 合集 |
| 4311 | 具体定义未知 |
| 1e3 | 具体定义未知 |
| 1001 | 具体定义未知 |
**示例:**
获取`哔哩哔哩弹幕网`的动态id为`507420325550127049`动态
```shell
curl -G 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail' \
--data-urlencode 'dynamic_id=507420325550127049'
```
<details>
<summary>查看响应示例</summary>
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"card": {
"desc": {
"uid": 8047632,
"type": 8,
"rid": 204774719,
"acl": 0,
"view": 1182282,
"repost": 405,
"like": 31940,
"is_liked": 0,
"dynamic_id": 507420325550127049,
"timestamp": 1616981401,
"pre_dy_id": 0,
"orig_dy_id": 0,
"orig_type": 0,
"user_profile": {
"info": {
"uid": 8047632,
"uname": "哔哩哔哩弹幕网",
"face": "https://i0.hdslb.com/bfs/face/f2cb8d9854156e3f26d4c6751d6eeb9c30e21847.jpg"
},
"card": {
"official_verify": {
"type": 1,
"desc": "哔哩哔哩弹幕网官方账号 "
}
},
"vip": {
"vipType": 2,
"vipDueDate": 1924531200000,
"vipStatus": 1,
"themeType": 0,
"label": {
"path": "",
"text": "十年大会员",
"label_theme": "ten_annual_vip",
"text_color": "#FFFFFF",
"bg_style": 1,
"bg_color": "#FB7299",
"border_color": ""
},
"avatar_subscript": 1,
"nickname_color": "#FB7299",
"role": 7,
"avatar_subscript_url": "https://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png"
},
"pendant": {
"pid": 3860,
"name": "2021拜年纪",
"image": "https://i0.hdslb.com/bfs/garb/item/7f8aa8ef1eed8c2dce0796801ddc82552a4164f9.png",
"expire": 0,
"image_enhance": "https://i0.hdslb.com/bfs/garb/item/7f8aa8ef1eed8c2dce0796801ddc82552a4164f9.png",
"image_enhance_frame": ""
},
"rank": "10000",
"sign": "哔哩哔哩 干杯 - ( ゜- ゜)つロ",
"level_info": {
"current_level": 6
}
},
"uid_type": 1,
"stype": 0,
"r_type": 1,
"inner_id": 0,
"status": 1,
"dynamic_id_str": "507420325550127049",
"pre_dy_id_str": "0",
"orig_dy_id_str": "0",
"rid_str": "204774719",
"bvid": "BV1Dh411S7sS"
},
"card": "{\"aid\":204774719,\"attribute\":0,\"cid\":316514988,\"copyright\":1,\"ctime\":1616939233,\"desc\":\"2021年3月29日9:30北京时间B站在中国香港港交所成功挂牌二次上市。欢迎来到bilibili这座乐园和超过2亿中国年轻人一起表达自我、拥抱世界。\",\"dimension\":{\"height\":1080,\"rotate\":0,\"width\":1920},\"duration\":290,\"dynamic\":\"\",\"item\":{\"at_control\":\"\"},\"jump_url\":\"bilibili:\\/\\/video\\/204774719\\/?page=1&player_preload=null&player_width=1920&player_height=1080&player_rotate=0\",\"owner\":{\"face\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/face\\/f2cb8d9854156e3f26d4c6751d6eeb9c30e21847.jpg\",\"mid\":8047632,\"name\":\"哔哩哔哩弹幕网\"},\"pic\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/archive\\/bcbcac6560268ef9cbe59fbf759ac28adf5e0432.jpg\",\"player_info\":null,\"pubdate\":1616981400,\"rights\":{\"autoplay\":1,\"bp\":0,\"download\":0,\"elec\":0,\"hd5\":1,\"is_cooperation\":0,\"movie\":0,\"no_background\":0,\"no_reprint\":1,\"pay\":0,\"ugc_pay\":0,\"ugc_pay_preview\":0},\"share_subtitle\":\"已观看24.0万次\",\"short_link\":\"https:\\/\\/b23.tv\\/BV1Dh411S7sS\",\"short_link_v2\":\"https:\\/\\/b23.tv\\/BV1Dh411S7sS\",\"stat\":{\"aid\":204774719,\"coin\":8661,\"danmaku\":744,\"dislike\":0,\"favorite\":6025,\"his_rank\":0,\"like\":31940,\"now_rank\":0,\"reply\":1619,\"share\":2134,\"view\":246956},\"state\":0,\"tid\":207,\"title\":\"欢迎来到2亿年轻人的乐园——bilibili 回香港上市啦!\",\"tname\":\"财经\",\"videos\":1}",
"extend_json": "{\"\":{\"ogv\":{\"ogv_id\":0}},\"dispute\":{\"content\":\"\"},\"from\":{\"from\":\"\"},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"},\"topic\":{\"is_attach_topic\":1}}",
"display": {
"topic_info": {
"topic_details": [
{
"topic_id": 12895437,
"topic_name": "二次上市",
"is_activity": 0,
"topic_link": ""
},
{
"topic_id": 10967402,
"topic_name": "香港上市",
"is_activity": 1,
"topic_link": "https://www.bilibili.com/blackboard/dynamic/102930"
},
{
"topic_id": 114859,
"topic_name": "B站",
"is_activity": 0,
"topic_link": ""
},
{
"topic_id": 8312,
"topic_name": "宣传片",
"is_activity": 1,
"topic_link": "https://www.bilibili.com/blackboard/dynamic/8795"
},
{
"topic_id": 679,
"topic_name": "BILIBILI",
"is_activity": 0,
"topic_link": ""
}
]
},
"usr_action_txt": "投稿了视频",
"relation": {
"status": 1,
"is_follow": 0,
"is_followed": 0
},
"show_tip": {
"del_tip": "要删除动态吗?"
},
"cover_play_icon_url": "https://i0.hdslb.com/bfs/album/2269afa7897830b397797ebe5f032b899b405c67.png"
}
},
"result": 0,
"_gt_": 0
}
}
```
</details>
## 最近更新UP主列表
> https://api.bilibili.com/x/polymer/web-dynamic/v1/portal
*请求方式GET*
*认证方式Cookie(SESSDATA) 和 Access_Token*
**json回复**
*根对象*
| 字段 | 类型 | 内容 | 备注 |
| ------- | --- | ---- | ---- |
| code | num | 返回值 | 0成功 |
| data | obj | 信息本体 | |
| message | str | 错误信息 | 默认为0 |
| ttl | int | 1 | 默认为1 |
`data`对象
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ----- | ---------- | --- |
| live_users | null | 不明 | |
| my_info | obj | 个人关注的一些信息 | |
| up_list | array | 最近更新的up主列表 | |
`my_info`对象
| 字段 | 类型 | 内容 | 备注 |
| ---------- | --- | ----------- | ---- |
| dyns | int | 个人动态 | |
| face | str | 头像 | 图像地址 |
| face_nft | int | 不明 | |
| follower | int | 粉丝数量 | |
| following | int | 我的关注 | |
| level_info | obj | 本人等级内容 | |
| mid | int | 账户mid | |
| name | str | 账户名称 | |
| offcial | obj | 认证信息 | |
| space_bg | str | 账户个人中心的背景横幅 | 图像地址 |
| vip | obj | vip信息 | |
`my_info`中的`level_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | --- | ---- | ---------- |
| current_level | num | 当前等级 | 0-6级 |
| current_min | num | 0 | |
| current_exp | num | 0 | |
| next_exp | num | 0 | |
`my_info`中的`Official`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | --- | ---- | ------------------------------------- |
| role | num | 认证类型 | 0<br />1 2 7个人认证<br />3 4 5 6机构认证 |
| title | str | 认证信息 | 无为空 |
| desc | str | 认证备注 | 无为空 |
| type | num | 是否认证 | -1<br />0认证 |
`my_info`中的`vip`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------------- | --- | --------- | -------------------------------------------- |
| type | num | 会员类型 | 0<br />1月大会员<br />2年度及以上大会员 |
| status | num | 会员状态 | 0<br />1有 |
| due_date | num | 会员过期时间 | Unix时间戳(毫秒) |
| vip_pay_type | num | 支付类型 | 0未支付常见于官方账号<br />1已支付以正常渠道获取的大会员均为此值 |
| theme_type | num | 0 | 作用尚不明确 |
| label | obj | 会员标签 | |
| avatar_subscript | num | 是否显示会员图标 | 0不显示<br />1显示 |
| nickname_color | str | 会员昵称颜色 | 颜色码,一般为`#FB7299`,曾用于愚人节改变大会员配色 |
| role | num | 大角色类型 | 1月度大会员<br/>3年度大会员<br/>7十年大会员<br/>15百年大会员 |
| avatar_subscript_url | str | 大会员角标地址 | |
| tv_vip_status | num | 电视大会员状态 | 0未开通 |
| tv_vip_pay_type | num | 电视大会员支付类型 | |
`vip`中的`label`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------------- | ---- | -------- | ---------------------------------------------------------------------------------------------------------------------------- |
| path | str | 空 | 作用尚不明确 |
| text | str | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` |
| label_theme | str | 会员标签 | vip大会员<br />annual_vip年度大会员<br />ten_annual_vip十年大会员<br />hundred_annual_vip百年大会员<br/>fools_day_hundred_annual_vip最强绿鲤鱼 |
| text_color | str | 会员标签 | |
| bg_style | num | 1 | |
| bg_color | str | 会员标签背景颜色 | 颜色码,一般为`#FB7299`,曾用于愚人节改变大会员配色 |
| border_color | str | 会员标签边框颜色 | 未使用 |
| use_img_label | bool | `true` | |
| img_label_uri_hans | str | `空串` | |
| img_label_uri_hant | str | `空串` | |
| img_label_uri_hans_static | str | 大会员牌子图片 | 简体版 |
| img_label_uri_hant_static | str | 大会员牌子图片 | 繁体版 |
`data`中的`up_list`数组对象
| 字段 | 属性 | 内容 | 备注 |
| ----------------- | ---- | --------- | --- |
| face | str | UP主头像 | |
| has_update | bool | 最近更新是否更新? | |
| is_reserve_recall | bool | 不明 | |
| mid | int | UP主mid | |
| uname | str | up主昵称 | |
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"live_users": null,
"my_info": {
"dyns": 67,
"face": "http://i0.hdslb.com/bfs/face/44253f4e588d72d4c10dde495752142b588455af.jpg",
"face_nft": 0,
"follower": 15,
"following": 77,
"level_info": {
"current_exp": 23846,
"current_level": 5,
"current_min": 10800,
"level_up": -62135596800,
"next_exp": 28800
},
"mid": 108534711,
"name": "CiaoMyTime",
"official": {
"desc": "",
"role": 0,
"title": "",
"type": -1
},
"space_bg": "http://i1.hdslb.com/bfs/space/aea2dd7b8894ce31d578d4fad6a7188c7b49cb2f.jpg",
"vip": {
"avatar_subscript": 1,
"avatar_subscript_url": "",
"due_date": 1670256000000,
"label": {
"bg_color": "#FB7299",
"bg_style": 1,
"border_color": "",
"img_label_uri_hans": "",
"img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/3788b674c69072f1ee252b79a31ecc8c43af3039.png",
"img_label_uri_hant": "",
"img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/jwXBWRVwa5.png",
"label_theme": "vip",
"path": "",
"text": "大会员",
"text_color": "#FFFFFF",
"use_img_label": true
},
"nickname_color": "",
"role": 1,
"status": 1,
"theme_type": 0,
"tv_vip_pay_type": 0,
"tv_vip_status": 0,
"type": 1,
"vip_pay_type": 0
}
},
"up_list": [
{
"face": "https://i2.hdslb.com/bfs/face/09a47992c9cb08f81effede594ddf014f83047fe.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 15135791,
"uname": "东北大学张引"
},
{
"face": "https://i1.hdslb.com/bfs/face/a83b296101bb36a6f1dacb8fdfa74a57a2c29445.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 1856528671,
"uname": "陆鳐LuLu"
},
{
"face": "https://i0.hdslb.com/bfs/face/60ec600cc9d84c74c8220ab41ce49bacfdc0895c.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 39180492,
"uname": "蒸気火鸡"
},
{
"face": "https://i0.hdslb.com/bfs/face/986a9f29848d17b39a99e41557d56dcd1091a3a9.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 2142762,
"uname": "老戴在此"
},
{
"face": "https://i1.hdslb.com/bfs/face/475f3c05ea494a26f5dd91b277f48b136ae63021.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 431313625,
"uname": "小蓝和他的朋友日常号"
},
{
"face": "https://i1.hdslb.com/bfs/face/bafb36d5726f8062e578474095abb0e906fec163.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 233114659,
"uname": "碧蓝航线"
},
{
"face": "https://i0.hdslb.com/bfs/face/39d23f3c5dd2c96fc35db5c2a98f4a8ff73a2d46.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 27534330,
"uname": "崩坏3第一偶像爱酱"
},
{
"face": "http://i2.hdslb.com/bfs/face/f119348814f30c6bbbcc60bd63c12b8215d19d2f.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 524704055,
"uname": "大庆赶海"
},
{
"face": "https://i0.hdslb.com/bfs/face/c4340d477356ba108098ba9a566e7ce4a54e0936.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 194326389,
"uname": "兮子cc"
},
{
"face": "https://i2.hdslb.com/bfs/face/0455b74f73d6a83eef2d6dfbdb4ae2beda42a3ce.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 476833439,
"uname": "盾之勇者成名录"
},
{
"face": "https://i0.hdslb.com/bfs/face/7c6cdd77937d4bbd2171241fe530e18c0c5bc58e.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 492840942,
"uname": "云视听小电视-TV"
},
{
"face": "https://i0.hdslb.com/bfs/face/b14881845b777d925876f24cb46b1dc1ad5a0e27.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 1636034895,
"uname": "绝区零"
},
{
"face": "http://i1.hdslb.com/bfs/face/3b933fe3c47976dd29f30e3a4f7f2bdfd99e8b08.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 603028270,
"uname": "乃木坂46官方"
},
{
"face": "https://i2.hdslb.com/bfs/face/76ec72b2a530f2f24209c98b5690ef7b536040cf.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 5992670,
"uname": "云之幻"
},
{
"face": "https://i1.hdslb.com/bfs/face/9ca9ea42fa75d9a651b354a95e8e39f48d8c30d2.jpg",
"has_update": true,
"is_reserve_recall": false,
"mid": 299359111,
"uname": "月圆之夜"
},
{
"face": "https://i1.hdslb.com/bfs/face/c8c0adce728125167fe44371d451b3dc19a84506.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 79983517,
"uname": "一唐老狮一"
},
{
"face": "https://i0.hdslb.com/bfs/face/68b4b212d9738c40d8a6a77beb65a6dd4415f81b.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 1861940979,
"uname": "保卫萝卜"
},
{
"face": "https://i2.hdslb.com/bfs/face/85bab2a17646ccf442d28549e7216fd65c6adeb7.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 2162,
"uname": "GPBeta"
},
{
"face": "https://i1.hdslb.com/bfs/face/7a41310afc08381ad0451bee8ea07f15fcc411bd.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 508963009,
"uname": "HiiroVTuber"
},
{
"face": "https://i1.hdslb.com/bfs/face/b085d34fd9d2cd44641ab648cc96e7a3068eb811.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 396848107,
"uname": "不愧是姐姐大人"
},
{
"face": "https://i0.hdslb.com/bfs/face/3f1496f48a5eb840a974fef0fd7db7a3f225fbe7.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 80304,
"uname": "亚食人"
},
{
"face": "https://i2.hdslb.com/bfs/face/a7716fec14658ef7365b538fdce0d86eb6123ed4.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 401742377,
"uname": "原神"
},
{
"face": "https://i0.hdslb.com/bfs/face/81d5201d6095e3802f14094a6906d1a114bc74c7.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 11131476,
"uname": "绫人太太啊"
},
{
"face": "https://i0.hdslb.com/bfs/face/7d72e58d0ad1b401e4c59960c4b1795efbc57c3a.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 409524162,
"uname": "一线码农聊技术"
},
{
"face": "https://i0.hdslb.com/bfs/face/5634900a3167310fcd0c6b1102ffc308c68aedd1.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 260054391,
"uname": "CHeems的日常"
},
{
"face": "https://i2.hdslb.com/bfs/face/81a4c852925b873f42c4971c836a67ea9dd2ef41.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 361469957,
"uname": "软件工艺师"
},
{
"face": "https://i2.hdslb.com/bfs/face/99e9eb37657f67f547b546b72592d70ab8ce1a4b.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 41059757,
"uname": "刻刻帝TokisakiKuru"
},
{
"face": "https://i1.hdslb.com/bfs/face/affbd5780e44ec1340f60c5283e81cbee2d9a21a.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 156785512,
"uname": "Swety_Core"
},
{
"face": "http://i0.hdslb.com/bfs/face/f576c8bd9eb4ec7f7776880581bea2d6c53d1b65.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 298683153,
"uname": "猫和老鼠官方手游"
},
{
"face": "https://i1.hdslb.com/bfs/face/5161d6bd003c24065c0d0ab2ae2ce7f37f0f607b.jpg",
"has_update": false,
"is_reserve_recall": false,
"mid": 159440647,
"uname": "Uki----"
}
]
}
}
```
</details>

881
docs/dynamic/publish.md Normal file
View File

@@ -0,0 +1,881 @@
# 发布动态
- [发布动态](#发布动态)
- [为图片动态上传图片](#为图片动态上传图片)
- [创建投票](#创建投票)
- [发表纯文本动态](#发表纯文本动态)
- [发表复杂动态](#发表复杂动态)
- [立即发布定时动态](#立即发布定时动态)
---
## 为图片动态上传图片
> https://api.bilibili.com/x/dynamic/feed/draw/upload_bfs
*请求方式POST*
认证方式CookieSESSDATA
注意非日常类型像素宽高必须大于420
**正文参数 (multipart/form-data)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ |
| file_up | file | 需要上传的图片文件 | 必要 | 格式仅支持jpg png gif |
| category | str | 图片类型 | 必要 | daily日常动态<br />draw绘画画友<br />cos摄影COSPLAY |
| biz | str | | | |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功 <br />-1未添加图片<br />-2参数错误<br />-3图片尺寸过小<br />-4账号未登录<br />-7图片信息错误 |
| message | str | 错误信息 | 默认为success |
| data | obj | 信息本体 | 仅在正确时既`code=0`时为有效信息 |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | -------------- | ---- |
| image_url | str | 已上传图片url | |
| image_width | num | 已上传图片宽度 | 像素 |
| image_height | num | 已上传图片高度 | 像素 |
**示例:**
上传了一张图片`test.png`类型为`日常`
```shell
curl 'https://api.bilibili.com/x/dynamic/feed/draw/upload_bfs' \
-F 'file_up=@test.png' \
-F 'category=daily'
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"success",
"data":{
"image_url":"http:\/\/i0.hdslb.com\/bfs\/album\/13f9523efe186a8066b2d72e80283cea2437eb62.png",
"image_width":1225,
"image_height":850
}
}
```
</details>
## 创建投票
> https://api.vc.bilibili.com/vote_svr/v1/vote_svr/create_vote
*请求方式POST*
认证方式CookieSESSDATA
注意: options最少两个,下标n从0开始
**正文参数 (multipart/form-data)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------------------------- | ---- | ------------------------ | ------ | -------------------------------------------------------- |
| info[title] | str | 投票标题 | 必要 | |
| info[desc] | str | 投票描述 | 非必要 | 可为空 |
| info[type] | num | 投票类型 | 必要 | 0:文字投票 1:图片投票 |
| info[choice_cnt] | num | 最多选几项 | 必要 | |
| info[duration] | num | 投票持续秒数 | 必要 | 常用:<br/>三天:259200<br/>七天:604800<br/>三十天:2592000 |
| info[options]\[ n ][desc] | str | 第n项选项文字内容 | 必要 | |
| info[options]\[ n ][img_url] | str | 第n项选项投票图片 | 非必要 | |
| csrf | str | CSRF Token位于cookie | 非必要 | 头次见非必要的csrf |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | -------------------------------- |
| code | num | 返回值 | 0成功 <br />5100001: 参数错误 |
| msg | str | 错误信息 | 成功为空 |
| message | str | 错误信息 | 跟上面那个一模一样 |
| data | obj | 信息本体 | 仅在正确时既`code=0`时为有效信息 |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | -------------- | ---- |
| vote_id | num | 投票id | |
| \_gt\_ | num | 0 | |
**示例:**
创建一个标题为`是否自愿开学`持续七天的纯文本投票
```shell
curl -X POST 'https://api.vc.bilibili.com/vote_svr/v1/vote_svr/create_vote' \
--data-urlencode 'info[title]=是否自愿开学' \
--data-urlencode 'info[desc]=问卷调查:自愿开学' \
--data-urlencode 'info[type]=0' \
--data-urlencode 'info[choice_cnt]=1' \
--data-urlencode 'info[duration]=604800' \
--data-urlencode 'info[options][0][desc]=自愿' \
--data-urlencode 'info[options][1][desc]=不自愿' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"vote_id": 4947171,
"_gt_": 0
}
}
```
</details>
## 发表纯文本动态
> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/create
*请求方式POST*
认证方式Cookie (SESSDATA)
**正文参数multipart/form-data**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --- | --- | --- | --- | --- |
| dynamic_id | num | 0 | 必要 | |
| type | num | 4 | 必要 | |
| rid | num | 0 | 必要 | |
| content | str | 动态内容 | 必要 | |
| up_choose_comment | num | 0 | 非必要 | |
| up_close_comment | num | 0 | 非必要 | |
| extension | json | 位置信息 | 非必要 | |
| at_uids | str | 动态中 at 到的用户的 uid | 非必要 | 使用逗号`,`分隔 |
| ctrl | array | 特殊格式控制 (如 at 别人时的蓝字体和链接) | 非必要 | |
| csrf_token | str | CSRF Token (位于 cookie) | 非必要 | |
| csrf | str | CSRF Token (位于 cookie) | 非必要 | |
extension参数值:
```json
{
"emoji_type": 1,
"lbs_cfg": {
"title": "**市",
"poi": "156330200",
"show_title": "**市",
"type": 1,
"address": "**市",
"location": {
"lng":显示的经度数值,
"lat":显示的纬度数值
},
"distance": 0
},
"flag_cfg": {},
"from_cfg": {
"location": {
"lat":用户实际纬度数值,
"lng":用户实际经度数值
}
}
}
```
ctrl单个对象(注意用的时候是数组出现):
| 参数名 | 类型 | 内容 |
| --- | --- | --- |
| location | num | 从全文第几个字开始变蓝 |
| type | num | 1 (可能1代表链接到用户uid) |
| length | num | 这一段变蓝多少字 |
| data | str | 链接目标(被at人的uid) |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 成功为空 |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| result | num | 0 | |
| errmsg | str | 像是服务器日志一样的东西 | |
| dynamic_id | num | 动态 id | |
| create_result | num | 1 | |
| dynamic_id_str | str | 动态 id | 字符串格式 |
| \_gt_ | num | 0 | |
<details>
<summary>查看示例(纯文本)</summary>
```bash
curl 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/create' \
--data-urlencode 'dynamic_id=0' \
--data-urlencode 'type=4' \
--data-urlencode 'rid=0' \
--data-urlencode 'content=Hello Bug~' \
--data-urlencode 'up_choose_comment=0' \
--data-urlencode 'up_close_comment=0' \
--data-urlencode 'extension={"emoji_type":1,"from":{"emoji_type":1},"flag_cfg":{}}' \
--data-urlencode 'at_uids=' \
--data-urlencode 'ctrl=[]' \
--data-urlencode 'csrf_token=de2731532b4ab96bc8536da948932668' \
--data-urlencode 'csrf=de2731532b4ab96bc8536da948932668' \
-b 'SESSDATA=******'
```
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"result": 0,
"errmsg": "; Create dynamic:588320531406678918, res:0, result:1; Push create kafka:0; Push create databus:0; Register comment result:0; Add outbox result:1",
"dynamic_id": 588320531406678918,
"create_result": 1,
"dynamic_id_str": "588320531406678918",
"_gt_": 0
}
}
```
</details>
<details>
<summary>查看示例(at两个人)</summary>
动态正文
```
[热词系列_神仙UP]@暮光小猿wzt @社会易姐QwQ
```
at_uids
```
15858903,293793435
```
ctrl
```json
[
{ "location": 11, "type": 1, "length": 9, "data": "15858903" },
{ "location": 20, "type": 1, "length": 9, "data": "293793435" }
]
```
命令
```bash
curl 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/create' \
--data-urlencode 'dynamic_id': '0' \
--data-urlencode 'type': '4' \
--data-urlencode 'rid': '0' \
--data-urlencode 'content': '[热词系列_神仙UP]@暮光小猿wzt @社会易姐QwQ ' \
--data-urlencode 'up_choose_comment': '0' \
--data-urlencode 'up_close_comment': '0' \
--data-urlencode 'extension': '{"emoji_type":1,"from":{"emoji_type":1},"flag_cfg":{}}' \
--data-urlencode 'at_uids': '15858903,293793435' \
--data-urlencode 'ctrl': '[{"location":11,"type":1,"length":9,"data":"15858903"},{"location":20,"type":1,"length":9,"data":"293793435"}]' \
--data-urlencode 'csrf_token': 'de2731532b4ab96bc8536da948932668' \
--data-urlencode 'csrf': 'de2731532b4ab96bc8536da948932668' \
-b 'SESSDATA=******'
```
</details>
## 发表复杂动态
> https://api.bilibili.com/x/dynamic/feed/create/dyn
*请求方式POST*
认证方式Cookie (SESSDATA)
**URL参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------------ | ------ | ---- |
| csrf | str | CSRF Token位于cookie | 必要 | |
**正文参数application/json**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --- | --- | --- | --- | --- |
| dyn_req | obj | 请求本体 | 必要 | |
`dyn_req`对象:
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --- | --- | --- | --- | --- |
| attach_card | obj | 特殊卡片 | 非必要 | 如直播预约等 |
| content | obj | 动态内容 | 必要 | |
| meta | obj | 元信息 | 非必要 | 大概是来源信息 |
| scene | num | 动态类型? | 必要 | 纯文本: 1<br/>带图: 2 |
| pics | array | 携带图片 | 非必要 | 最多九个 |
| topic | obj | 话题 | 非必要 | |
| option | obj | 互动设置 | 非必要 | 没有此项时默认开启评论区 |
| upload_id | str | 客户端生成的 | 非必要 | 内容为`发送人mid`+`当前秒级时间戳`+`四位随机整数`,中间用`_`隔开 |
`dyn_req`对象的`meta`对象,大概是来源信息,很简单就不详细列表了:
```json
{
"app_meta": {
"from": "create.dynamic.web",
"mobi_app": "web"
}
}
```
`dyn_req`对象的`content`对象:
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ----- | -------------------- | ------ | ---- |
| contents | array | 动态组件对象有序数组 | 必要 | |
`contents`数组内每一个动态组件对象:
```json
{
"raw_text": "ui上直接显示的字符串",
"type": 组件类型id,
"biz_id": "动态组件的内容id转字符串,比如投票id"
}
```
动态组件类型:
| 组件名 | type | `biz_id`含义 |
| ------ | ---- | ------------ |
| 纯文本 | 1 | 空 |
| AT人 | 2 | AT人的mid |
| 表情 | 9 | 空 |
| 投票 | 4 | 投票id |
`dyn_req`对象的`topic`对象
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------- | ---- | ------- | ------ | -------------------------- |
| from_source | str | 来源id? | 必要 | 网页版直接选为dyn.web.list |
| from_topic_id | num | 0 | 必要 | |
| id | num | 话题id | 必要 | |
| name | str | 话题名 | 必要 | |
`dyn_req`对象的`pics`数组的每一项对象:
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ----- | ---------------- | ------ | ------------------------------------------------------------ |
| img_height | num | 图片高 | 非必要 | 这个东西会直接原封不动传到前端,比如你都写0在网页上就看不见了,但是还会加载 |
| img_width | num | 图片宽 | 非必要 | 同上 |
| img_size | float | 图片文件大小(KB) | 非必要 | |
| img_src | str | 图片bfs链接 | 必要 | |
`dyn_req`对象的`option`对象:
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------------- | ---- | ------------ | ------ | --------------- |
| up_choose_comment | num | 精选评论flag | 非必要 | 1: 开启 |
| close_comment | num | 关闭评论flag | 非必要 | 同上,与上二选一 |
`dyn_req`对象的`topic`对象:
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------- | ---- | ------------ | ------ | -------- |
| from_source | str | dyn.web.list | 非必要 | 作用不明 |
| from_topic_id | num | 0 | 非必要 | 作用不明 |
| id | num | 话题id | 必要 | |
| name | str | 话题名 | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 成功为空 |
| data | obj | 数据本体 | |
`data`对象:
当Cookie中含有任意的`buvid3`时,比较干净简洁:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| result | num | 0 | |
| message | str | 错误信息 | |
| dyn_id | num | 动态 id | |
| dyn_id_str | str | 动态 id | 字符串格式 |
| dyn_type | num | 动态类型 | 不带图片: 4<br/>带图片: 2<br/>其他请参考 get_dynamic_detail.md |
| \_gt_ | num | 0 | |
**警告:下面的内容又乱又杂,而且绝大多数情况用不到,我建议大家用这个接口的时候随便带一个buvid3的cookie屏蔽掉它们算了.**
当Cookie中不含有`buvid3`时,较上述字段多出一个`fake_card`对象,大概是移动端用的卡片:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | ---- | ------------ |
| fake_card | obj | 0 | 又多又乱又杂 |
`fake_card`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ------------ | ------------------------------------------------------------ |
| card_type | num | 卡片类型 | 不带图片: 4<br/>带图片: 2<br/>其他请参考 [获取特定动态卡片信息](get_dynamic_detail.md) |
| modules | array | 卡片组件列表 | |
| extend | obj | 其他杂项信息 | |
`fake_card`对象的`modules`数组中每一项对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------- | -------------------------------------------- |
| module_type | num | 组件类型 | 1: 作者信息<br/>3: 动态内容<br/>其他有待发现 |
| ModuleItem | obj | 卡片组件 | |
`ModuleItem`对象与`module_type`对应关系:
| module_type | `ModuleItem`含有的唯一一个key | 备注 |
| ----------- | ----------------------------- | ----------------------- |
| 1 | module_author | 作者信息 |
| 3 | module_desc | 动态内容 |
| 4 | module_dynamic | 携带图片等 |
| 9 | module_stat | 不明,貌似一直都是空对象 |
`ModuleItem``module_author`:
| 字段 | 类型 | 内容 | 备注 |
| ---------------- | ---- | -------------------------------- | ------------------------------------------------ |
| mid | num | 发送者mid | |
| ptime_label_text | str | 发送时间(人类可读形式)肯定是刚刚 | |
| author | obj | 作者详细信息 | 请参考[用户基本信息](../user/info.md),不再赘述.. |
`ModuleItem``module_desc`:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ----- | -------------- | ---- |
| desc | array | 动态组件列表 | |
| text | str | 动态纯文本形式 | |
`module_desc``desc`数组:
| 项 | 类型 | 备注 |
| ---- | ---- | ------------------- |
| 0 | obj | 第0个动态组件 |
| n | obj | 第n+1个动态组件组件 |
| ... | obj | ... |
`desc`数组的每一项:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------------------------------------ | ----------------------------- |
| text | str | 该组件对外显示的纯文本 | 对应请求时该组件的`raw_text` |
| type | num | 组件类型 | 对应请求时该组件的`type` |
| rid | str | 组件内容的id,例如@人的mid | 根据需要出现,比如纯文本就没有 |
| uri | str | b站自定义`bilibili://`协议链接,用于@人点击跳转等 | 根据需要出现,比如纯文本就没有 |
`ModuleItem``module_dynamic`:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------------ | -------------------- |
| type | num | 不知道是什么的类型 | 5: 图片<br/>其他未知 |
| ModuleItem | obj | 组件? | 怎么还有套娃的? |
`module_dynamic``type`字段为`5`时:
`module_dynamic``ModuleItem`有唯一key`dyn_draw`:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ----- | -------------------------------- | ------------------------------------------------ |
| items | array | 图片数组 | 与请求部分`dyn_req.pics`一致 |
| id | num | 这条图片动态所对应的相簿`doc_id` | 可以参考本文档的[相簿基本信息](../album/info.md) |
`fake_card``extend`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ----- | ---------------------------------------------- | ---------------------------------------- |
| dyn_id_str | str | 动态id字符串形式 | |
| business_id | str | 未知 | 根据情况出现 |
| orif_img_url | str | 封面图url(如果有) | |
| share_type | str | 一般为3 | 未知 |
| share_scene | str | 一般为dynamic | 未知 |
| is_fast_share | bool | 一般为true | 未知 |
| dyn_type | num | 动态类型 | 不带图片: 4<br/>带图片: 2<br/>其他待探索 |
| uid | num | 发送者mid | |
| card_url | str | b站自定义`bilibili://`协议链接,指向该条动态 | |
| desc | array | 动态组件列表,重复了一遍`module_desc`的desc数组 | |
| reply | obj | 评论区相关 | |
`extend``reply`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ----- | ------------------------------------------------- | ---- |
| uri | str | b站自定义`bilibili://`协议链接,指向该条动态评论区 | |
| params | array | 未知 | |
<details>
<summary>查看示例(不带`buvid3`)</summary>
```bash
curl -X POST 'https://api.bilibili.com/x/dynamic/feed/create/dyn?csrf=xxxxx' \
-b 'buvid3=114514;SESSDATA=xxxxx;' \
--header 'Content-Type: application/json' \
--data-raw '{
"dyn_req": {
"content": {
"contents": [
{
"raw_text": "Test",
"type": 1,
"biz_id": ""
},
{
"raw_text": "礼堂丁真,鉴定为一眼丁真",
"type": 2,
"biz_id": "1463028352"
}
]
},
"pics": [
{
"img_src": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png",
"img_width": 1368,
"img_height": 1500,
"img_size": 662.6005859375
},
{
"img_src": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png",
"img_width": 1368,
"img_height": 1500,
"img_size": 662.6005859375
}
],
"option": {
"close_comment": 1
},
"scene": 2
}
}'
```
响应:
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"dyn_id": 755402937023332386,
"dyn_id_str": "755402937023332386",
"dyn_type": 2,
"dyn_rid": 221621929,
"fake_card": {
"card_type": 7,
"modules": [
{
"module_type": 1,
"ModuleItem": {
"module_author": {
"mid": 470310172,
"ptime_label_text": "刚刚",
"author": {
"mid": 470310172,
"name": "I_Min",
"face": "https://i1.hdslb.com/bfs/face/d36e9dc2d14b545a055980a2f3c1f2d5621646c6.png",
"official": {
"type": -1
},
"vip": {
"Type": 1,
"due_date": 1673366400000,
"label": {}
},
"uri": "bilibili://space/470310172?defaultTab=dynamic",
"pendant": {},
"nameplate": {
"nid": 3,
"name": "白银殿堂",
"image": "https://i1.hdslb.com/bfs/face/f6a31275029365ae5dc710006585ddcf1139bde1.png",
"image_small": "https://i0.hdslb.com/bfs/face/b09cdb4c119c467cf2d15db5263b4f539fa6e30b.png",
"level": "高级勋章",
"condition": "单个自制视频总播放数>=10万"
}
},
"decorate_card": {
"id": 984,
"card_url": "https://i0.hdslb.com/bfs/vip/e42569d2f91a17346cdb991c7c34d3bbc677d4ef.png",
"jump_url": "https://www.bilibili.com/h5/mall/equity-link/home?navhide=1&item_id=984&part=card&f_source=garb&from=post&isdiy=0",
"fan": {
"number_str": "000000"
}
},
"tp_list": [
{
"type": 3,
"Item": {
"share": {
"icon": "http://i0.hdslb.com/bfs/feed-admin/ee5902a63bbe4a0d78646d11036b062ea60573f6.png",
"title": "分享"
}
}
},
{
"type": 7,
"Item": {
"default": {
"icon": "http://i0.hdslb.com/bfs/feed-admin/9163a7b29964cb84cb5fc35e4f7b899151cf2afc.png",
"title": "删除"
}
}
}
]
}
}
},
{
"module_type": 3,
"ModuleItem": {
"module_desc": {
"desc": [
{
"text": "Test",
"type": 1
},
{
"text": "礼堂丁真,鉴定为一眼丁真",
"type": 2,
"uri": "bilibili://space/1463028352?defaultTab=dynamic",
"rid": "1463028352"
}
],
"text": "Test礼堂丁真,鉴定为一眼丁真"
}
}
},
{
"module_type": 4,
"ModuleItem": {
"module_dynamic": {
"type": 5,
"ModuleItem": {
"dyn_draw": {
"items": [
{
"src": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png",
"width": 1368,
"height": 1500,
"size": 662.6006
},
{
"src": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png",
"width": 1368,
"height": 1500,
"size": 662.6006
}
],
"id": 221621929
}
}
}
}
},
{
"module_type": 9,
"ModuleItem": {
"module_stat": {}
}
}
],
"extend": {
"dyn_id_str": "755402937023332386",
"business_id": "221621929",
"orig_img_url": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png",
"desc": [
{
"text": "Test",
"type": 1
},
{
"text": "礼堂丁真,鉴定为一眼丁真",
"type": 2,
"uri": "bilibili://space/1463028352?defaultTab=dynamic",
"rid": "1463028352"
}
],
"share_type": "3",
"share_scene": "dynamic",
"is_fast_share": true,
"dyn_type": 2,
"uid": 470310172,
"card_url": "bilibili://following/detail/755402937023332386?cardType=2&rid=221621929",
"reply": {
"uri": "bilibili://following/detail/755402937023332386?cardType=2&rid=221621929",
"params": [
{
"key": "comment_on",
"value": "1"
}
]
}
}
}
}
}
```
</details>
<details>
<summary>查看示例(带`buvid3`)</summary>
动态正文
```
Test礼堂丁真,鉴定为一眼丁真
```
带两张一样的图:
http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png
然后关闭评论区
命令
```bash
curl -X POST 'https://api.bilibili.com/x/dynamic/feed/create/dyn?csrf=xxxxx' \
-b 'buvid3=114514;SESSDATA=xxxxx;' \
--header 'Content-Type: application/json' \
--data-raw '{
"dyn_req": {
"content": {
"contents": [
{
"raw_text": "Test",
"type": 1,
"biz_id": ""
},
{
"raw_text": "礼堂丁真,鉴定为一眼丁真",
"type": 2,
"biz_id": "1463028352"
}
]
},
"pics": [
{
"img_src": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png",
"img_width": 1368,
"img_height": 1500,
"img_size": 662.6005859375
},
{
"img_src": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png",
"img_width": 1368,
"img_height": 1500,
"img_size": 662.6005859375
}
],
"option": {
"close_comment": 1
},
"scene": 2
}
}'
```
响应:
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"dyn_id": 755402172521250838,
"dyn_id_str": "755402172521250838",
"dyn_type": 2,
"dyn_rid": 221621773
}
}
```
</details>
## 立即发布定时动态
> https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/publish_now
*请求方式POST*
认证方式CookieSESSDATA
**正文参数 (application/x-www-form-urlencoded)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ---- |
| draft_id | file | 定时动态(草稿)id | 必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------ |
| code | num | 返回值 | 0成功 |
| data | obj | 信息本体 | 正常为空对象 |
| message | str | 错误消息 | 正常为"0" |
| ttl | num | 1 | 不明 |
<details>
<summary>查看示例</summary>
```bash
curl -X POST 'https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/publish_now' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'draft_id=755409289278914611' \
--data-urlencode 'csrf=xxx'
-b 'SESSDATA=xxxx;'
```
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{}
}
```
</details>

7934
docs/dynamic/tag_dynamics.md Normal file

File diff suppressed because one or more lines are too long

331
docs/electric/Bcoin.md Normal file
View File

@@ -0,0 +1,331 @@
# B币方式充电
<img src="../../assets/img/battery-100.png" width="100" height="100"/>
**注以前充电是电池的概念1B币折合10电池一般地充电10电池可获得1经验**
**目前2020/12/02后则是贝壳的概念1B币折合1贝壳、1经验如果存在小数点则经验值向下取整即2.5B币获得2经验**
---
- [B币方式充电](#b币方式充电)
- [新版本B币充电](#新版本b币充电)
- [老版本B币充电](#老版本b币充电)
---
## 新版本B币充电
> https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- |
| bp_num | num | 贝壳数量 | 必要 | 必须在2-9999之间 |
| is_bp_remains_prior | bool | 是否优先扣除B币余额 | 必要 | [true,false]B币充电请选择true |
| up_mid | num | 充电对象用户mid | 必要 | |
| otype | str | 充电来源 | 必要 | up空间充电<br />archive视频充电 |
| oid | num | 充电来源代码 | 必要 | 空间充电充电对象用户mid<br />视频充电稿件avid |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功并不代表充电成功 <br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ----------- | ------------------------------------------------ |
| mid | num | 本用户mid | |
| up_mid | num | 目标用户mid | |
| order_no | str | 留言token | 用于添加充电留言 |
| bp_num | str | 充电贝壳数 | |
| exp | num | 获得经验数 | |
| status | num | 返回结果 | 4成功<br />-2低于20电池下限<br />-4B币不足 |
| msg | str | 错误信息 | 默认为空 |
**示例:**
以空间的方式向用户`mid=293793435`充了2贝壳得到2经验留言token为`BPRG5CEC3VUPOOANA540`
此时`data`.`status`=`4`
~~自己给自己冲QAQ~~
```shell
curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \
--data-urlencode 'bp_num=2' \
--data-urlencode 'is_bp_remains_prior=true' \
--data-urlencode 'up_mid=293793435' \
--data-urlencode 'otype=up' \
--data-urlencode 'oid=293793435' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"mid":293793435,
"up_mid":293793435,
"order_no":"BPRG5CEC3VUPOOANA540",
"bp_num":2,
"exp":"2",
"status":4,
"msg":""
}
}
```
</details>
当所充电贝壳数小于2时充电不会成功
此时`data`.`status`=`-2`
```shell
curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \
--data-urlencode 'bp_num=1' \
--data-urlencode 'is_bp_remains_prior=true' \
--data-urlencode 'otype=up' \
--data-urlencode 'oid=293793435' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"mid":0,
"up_mid":0,
"order_no":"",
"bp_num":"0",
"exp":0,
"status":-2,
"msg":"elec raw order create failed: 88201"
}
}
```
</details>
当所充贝壳数折合的B币数不足时充电也不会成功
此时`data`.`status`=`-4`
```shell
curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \
--data-urlencode 'bp_num=99' \
--data-urlencode 'is_bp_remains_prior=true' \
--data-urlencode 'up_mid=293793435' \
--data-urlencode 'otype=up' \
--data-urlencode 'oid=293793435' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"mid":0,
"up_mid":0,
"order_no":"",
"bp_num":"0",
"exp":0,
"status":-4,
"msg":"bp.to.battery http failed, invalid args, errNo=800409904: B 币余额不足"
}
}
```
</details>
## 老版本B币充电
老版本目前已过期调用接口成功后code返回0data.status会返回0且B币不会消耗贝壳也不会增加。以下是历史信息
<details>
<summary>查看折叠内容</summary>
> https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- |
| elec_num | num | 充电电池数量 | 必要 | 必须在2-9999之间 |
| up_mid | num | 充电对象用户mid | 必要 | |
| otype | str | 充电来源 | 必要 | up空间充电<br />archive视频充电 |
| oid | num | 充电来源代码 | 必要 | 空间充电充电对象用户mid<br />视频充电稿件avid |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功并不代表充电成功 <br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ----------- | ------------------------------------------------ |
| mid | num | 本用户mid | |
| up_mid | num | 目标用户mid | |
| order_no | str | 留言token | 用于添加充电留言 |
| elec_num | num | 充电电池数 | |
| exp | num | 获得经验数 | |
| status | num | 返回结果 | 4成功<br />-2低于20电池下限<br />-4B币不足 |
| msg | str | 错误信息 | 默认为空 |
**示例:**
以空间的方式向用户`mid=293793435`充了20电池得到2经验留言token为`BPRG5CEC3VUPOOANA540`
此时`data`.`status`=`4`
~~再次自己冲自己QAQ~~
```shell
curl 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \
--data-urlencode 'elec_num=20' \
--data-urlencode 'up_mid=293793435' \
--data-urlencode 'otype=up' \
--data-urlencode 'oid=293793435' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"mid":293793435,
"up_mid":293793435,
"order_no":"BPRG5CEC3VUPOOANA540",
"elec_num":20,
"exp":2,
"status":4,
"msg":""
}
}
```
</details>
当所充电池数小于2时充电不会成功
此时`data`.`status`=`-2`
```shell
curl 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \
--data-urlencode 'elec_num=1' \
--data-urlencode 'up_mid=293793435' \
--data-urlencode 'otype=up' \
--data-urlencode 'oid=293793435' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"mid":0,
"up_mid":0,
"order_no":"",
"elec_num":0,
"exp":0,
"status":-2,
"msg":"elec raw order create failed: 88201"
}
}
```
</details>
当所充电池数折合的B币数不足时充电也不会成功
此时`data`.`status`=`-4`
```shell
curl 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \
--data-urlencode 'elec_num=999' \
--data-urlencode 'up_mid=293793435' \
--data-urlencode 'otype=up' \
--data-urlencode 'oid=293793435' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"mid":0,
"up_mid":0,
"order_no":"",
"elec_num":0,
"exp":0,
"status":-4,
"msg":"bp.to.battery http failed, invalid args, errNo=800409904: B 币余额不足"
}
}
```
</details>
</details>

View File

@@ -0,0 +1,207 @@
# 微信&支付宝方式充电
<img src="../../assets/img/battery-100.png" width="100" height="100"/>
- [申请充电二维码及扫码秘钥](#申请充电二维码及扫码秘钥)
- [检查扫码支付结果](#检查扫码支付结果)
---
操作流程:
1.申请充电二维码及扫码秘钥,秘钥临时保存备用
2.使用`qr_code_url`中的值生成二维码
3.用支付宝或微信扫描
4.以扫码秘钥作为参数轮询检查扫码支付结果
## 申请充电二维码及扫码秘钥
> https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/qr_code/create
*请求方式POST*
认证方式CookieSESSDATA
秘钥有效时间为10分钟
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ |
| bp_num | num | 充电B币数量 | 必要 | 必须在2-9999之间 |
| up_mid | num | 充电对象用户mid | 必要 | |
| is_bp_remains_prior | bool | 是否优先扣除B币 | 必要 | true<br />false<br />在B币不足时剩余的部分利用支付平台支付 |
| otype | str | 充电来源 | 必要 | up空间充电<br />archive视频充电 |
| oid | num | 充电来源代码 | 必要 | 空间充电充电对象用户mid<br />视频充电稿件avid |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />-500服务器错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------------------ | -------- |
| qr_code_url | str | 支付二维码生成内容 | 存在转义 |
| qr_token | str | 扫码秘钥 | |
| exp | num | 获得经验数 | |
**示例:**
申请空间的方式向用户23215368充电10电池且不使用B币的支付二维码
```shell
curl 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/create' \
--data-urlencode 'elec_num=10' \
--data-urlencode 'up_mid=23215368' \
--data-urlencode 'is_bp_remains_prior=false' \
--data-urlencode 'otype=up' \
--data-urlencode 'oid=23215368' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"qr_code_url": "http://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/gateway?mid=293793435&token=c1cb1d95d2194ba58df6bb0f24ae1aaa",
"qr_token": "c1cb1d95d2194ba58df6bb0f24ae1aaa",
"exp": 1
}
}
```
</details>
## 检查扫码支付结果
> https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | ---- |
| qr_token | str | 扫码秘钥 | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ----------- | ------------------------------------------------------------ |
| qr_token | str | 扫码秘钥 | |
| order_no | str | 留言token | 未成功则无此项<br />用于添加充电留言 |
| mid | num | 当前用户mid | |
| status | num | 状态值 | 若秘钥错误则无此项<br />1已支付<br />2未扫描<br />3未确认 |
**示例:**
当申请到的支付二维码未被扫描时,`data`.`ststus`的值为`2`
```shell
curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \
--data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"qr_token":"c7cbdc47fc424cd18f2146db653597b8",
"mid":293793435,
"status":2
}
}
```
</details>
当申请到的支付二维码已扫描但未确认时,`data`.`ststus`的值为`3`
```shell
curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \
--data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"qr_token":"c7cbdc47fc424cd18f2146db653597b8",
"mid":293793435,
"status":3
}
}
```
</details>
成功支付后,`data`.`ststus`的值为`1`,且`data`.`order_no`存在留言token
```shell
curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \
--data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"qr_token":"bd649c836c524550bfe22a369334fc05",
"order_no":"BPTD36U3KP82I31RSSLG",
"mid":293793435,
"status":1
}
}
```
</details>

View File

@@ -0,0 +1,530 @@
# 充电列表
- [获取空间充电公示列表](#获取空间充电公示列表)
- [获取视频充电鸣谢名单](#获取视频充电鸣谢名单)
- [查询我收到的充电列表](#查询我收到的充电列表)
- [查询历史充电数据](#查询历史充电数据)
---
## 获取空间充电公示列表
> https://elec.bilibili.com/api/query.rank.do
*请求方式:GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ----------- | ------ | ---- |
| mid | num | 目标用户mid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功 <br />500011mid错误 |
| msg | str | 错误信息 | 正确时无此项 |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ------ | ---------------- | ------------ |
| display_num | num | 0 | 作用尚不明确 |
| count | num | 本月充电人数 | |
| total_count | num | 总计充电人数 | |
| list | array | 本月充电用户列表 | |
| user | null | | 作用尚不明确 |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---------------- |
| 0 | obj | 充电用户1 | |
| n | obj | 充电用户(n+1) | 按照充电排名排列 |
| …… | obj | …… | …… |
| 29 | obj | 充电用户30 | 最后一项 |
`data`中的`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ---------------- | ---------------- |
| mid | num | 充电对象mid | |
| pay_mid | num | 充电用户mid | |
| rank | num | 充电用户排名 | 取决于充电的多少 |
| uname | str | 充电用户昵称 | |
| avatar | str | 充电用户头像url | |
| message | str | 充电留言 | 无为空 |
| msg_deleted | num | 0 | 作用尚不明确 |
| vip_info | obj | 充电用户会员信息 | |
| trend_type | num | 0 | 作用尚不明确 |
`data`中的`list`数组中的对象中的`vip_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ---------- | ----------------------------------- |
| vipType | num | 大会员类型 | 0<br />1月会员<br />2年会员 |
| vipDueMsec | num | 0 | 作用尚不明确 |
| vipStatus | num | 大会员状态 | 0<br />1有 |
**示例:**
查询用户`mid=53456`的充电公示列表
```shell
curl -G 'https://elec.bilibili.com/api/query.rank.do' \
--data-urlencode 'mid=53456'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"display_num": 0,
"count": 226,
"total_count": 11528,
"list": [
{
"mid": 53456,
"pay_mid": 346545025,
"rank": 1,
"uname": "还有什么名字没人用",
"avatar": "http://i1.hdslb.com/bfs/face/76d4b1ecd13e992a6c7303d77bf716dd922ab234.jpg",
"message": "早日康复,五月快乐",
"msg_deleted": 0,
"vip_info": {
"vipType": 2,
"vipDueMsec": 0,
"vipStatus": 1
},
"trend_type": 0
},
{
"mid": 53456,
"pay_mid": 8826056,
"rank": 2,
"uname": "煋痕",
"avatar": "http://i2.hdslb.com/bfs/face/35b7c752d0eb1bb7a924804f240b9bfd9199625f.jpg",
"message": "",
"msg_deleted": 0,
"vip_info": {
"vipType": 2,
"vipDueMsec": 0,
"vipStatus": 1
},
"trend_type": 0
},
{
"mid": 53456,
"pay_mid": 356668487,
"rank": 3,
"uname": "舞象祥",
"avatar": "http://i1.hdslb.com/bfs/face/574f6203ef5bd0d56b95ded6a2736676d9cc5307.jpg",
"message": "warma hayo",
"msg_deleted": 0,
"vip_info": {
"vipType": 1,
"vipDueMsec": 0,
"vipStatus": 1
},
"trend_type": 0
},
…………
],
"user": null
}
}
```
</details>
## 获取视频充电鸣谢名单
> https://api.bilibili.com/x/web-interface/elec/show
*请求方式:GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------------ | ------------------ |
| mid | num | 目标用户mid | 必要 | |
| aid | num | 目标稿件avid | 必要(可选) | avid与bvid任选一个 |
| bvid | str | 目标稿件bvid | 必要(可选) | avid与bvid任选一个 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-404无视频<br />62001不需要展示充电信息 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ------ | ---------------- | ------------ |
| show_info | obj | 展示选项 | |
| av_count | num | 目标视频充电人数 | |
| count | num | 本月充电人数 | |
| total_count | num | 总计充电人数 | |
| special_day | num | 0 | 作用尚不明确 |
| display_num | num | 0 | 作用尚不明确 |
| list | array | 本月充电用户列表 | |
`data`中的`show_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ------------------------ | ----------------------------- |
| show | bool | 是否展示视频充电鸣谢名单 | false不展示<br />true展示 |
| state | num | 0 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---------------- |
| 0 | obj | 充电用户1 | |
| n | obj | 充电用户(n+1) | 按照充电排名排列 |
| …… | obj | …… | …… |
| 29 | obj | 充电用户30 | 最后一项 |
`data`中的`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ---------------- | ---------------- |
| mid | num | 充电对象mid | |
| pay_mid | num | 充电用户mid | |
| rank | num | 充电用户排名 | 取决于充电的多少 |
| uname | str | 充电用户昵称 | |
| avatar | str | 充电用户头像url | |
| message | str | 充电留言 | 无为空 |
| msg_deleted | num | 0 | 作用尚不明确 |
| vip_info | obj | 充电用户会员信息 | |
| trend_type | num | 0 | 作用尚不明确 |
`data`中的`list`数组中的`vip_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ---------- | ----------------------------------- |
| vipType | num | 大会员类型 | 0<br />1月会员<br />2年会员 |
| vipDueMsec | num | 0 | 作用尚不明确 |
| vipStatus | num | 大会员状态 | 0<br />1有 |
**示例:**
获取视频`av967773538`/` BV1up4y1y77i `,用户`mid=53456`的视频充电鸣谢名单
avid方式
```shell
curl -G 'https://api.bilibili.com/x/web-interface/elec/show' \
--data-urlencode 'mid=53456' \
--data-urlencode 'aid=967773538'
```
bvid方式
```shell
curl -G 'https://api.bilibili.com/x/web-interface/elec/show' \
--data-urlencode 'mid=53456' \
--data-urlencode 'bvid=BV1up4y1y77i '
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"show_info": {
"show": true,
"state": 0
},
"av_count": 0,
"count": 0,
"total_count": 19422,
"special_day": 0,
"display_num": 0,
"list": [
{
"mid": 53456,
"pay_mid": 1216085164,
"rank": 1,
"uname": "JZ72",
"avatar": "http://i1.hdslb.com/bfs/face/3d741682fafc286999b5e8089a844ae4f46651fe.jpg",
"message": "Warma YYDS ",
"msg_deleted": 0,
"vip_info": {
"vipType": 2,
"vipDueMsec": 0,
"vipStatus": 1
},
"trend_type": 0
},
{
"mid": 53456,
"pay_mid": 305858373,
"rank": 2,
"uname": "适应性神经系统",
"avatar": "http://i0.hdslb.com/bfs/face/2ad38dec879f66c32b5e5cb1750cb3f3e446bf91.jpg",
"message": "",
"msg_deleted": 0,
"vip_info": {
"vipType": 1,
"vipDueMsec": 0,
"vipStatus": 0
},
"trend_type": 0
},
......
]
}
}
```
</details>
## 查询我收到的充电列表
> https://pay.bilibili.com/bk/brokerage/listForCustomerRechargeRecord
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | -------------------------------- |
| currentPage | num | 页数 | 必要 | |
| pageSize | num | 分页大小 | 必要 | 取值范围[1,50] |
| customerId | num | (?) | 必要 | 目前为固定值10026 |
| beginTime | str | 开始日期 | | yyyy-MM-dd |
| endTime | str | 结束日期 | | yyyy-MM-dd |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />800501007user not login<br />800501008内部错误<br /> 800501011请求参数有误|
| errno | num | | |
| msg | str | | |
| showMsg | str | | |
| success | bool | | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| page | obj | 分页信息 | |
| result | array | 充电信息本体 | |
| config | array | (?) | |
`page`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| currentPage | num | 当前页数 | |
| pageSize | num | 当前分页大小 | |
| totalCount | num | 记录总数 | |
| totalPage | num | 总页数 | |
`config`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| mid | num | | 总是为null |
| name | str | | 总是为null |
| avatar | str | | 总是为null |
| originalThirdCoin | num | | 总是为null |
| brokerage | num | | 总是为null |
| remark | str | | 总是为null |
| ctime | str | | 总是为null |
`result`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| mid | num | 充电人mid | |
| name | str | 充电人昵称 | |
| avatar | str | 充电人头像 | |
| originalThirdCoin | num | 原始B币数 | |
| brokerage | num | 实际收到的贝壳数 | |
| remark | str | 充电渠道 | Web/安卓/iOS |
| ctime | str | 充电时间 | yyyy-MM-dd HH:mm:ss |
**示例:**
```shell
curl -L -X GET 'https://pay.bilibili.com/bk/brokerage/listForCustomerRechargeRecord?currentPage=1&pageSize=2&customerId=10026' \
-H 'Cookie: SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"errno": 0,
"msg": "SUCCESS",
"showMsg": "交易成功",
"data": {
"page": {
"currentPage": 1,
"pageSize": 2,
"totalCount": 311,
"totalPage": 156
},
"result": [
{
"mid": 2233,
"name": "2233",
"avatar": "http://i2.hdslb.com/bfs/face/f42b7f47c80648d2ee1231f2435b527c60302289.jpg",
"originalThirdCoin": 2,
"brokerage": 1.34,
"remark": "Web",
"ctime": "2022-04-12 17:34:47"
},
{
"mid": 2233,
"name": "2233",
"avatar": "http://i0.hdslb.com/bfs/face/member/noface.jpg",
"originalThirdCoin": 2,
"brokerage": 0.68,
"remark": "iOS",
"ctime": "2022-04-10 03:41:10"
}
],
"config": [
{
"mid": null,
"name": null,
"avatar": null,
"originalThirdCoin": null,
"brokerage": null,
"remark": null,
"ctime": null
}
]
},
"success": true
}
```
</details>
## 查询历史充电数据
> https://member.bilibili.com/x/h5/elec/rank/recent
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | -------------------------------- |
| pn | num | 页数 | 必要 | |
| ps | num | 分页大小 | 必要 | 取值范围[1,20] |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ----- | ------------ | ---- |
| list | array | 充电信息本体 | |
| pager | obj | 分页信息 | |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------- | ------------------- |
| aid | num | 0 | |
| bvid | str | 空 | |
| elec_num | num | 充电电池数 | |
| title | str | 空 | |
| uname | str | 空 | |
| avatar | str | 空 | |
| ctime | str | 充电时间 | yyyy-MM-dd HH:mm:ss |
`pager`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------------ | ---- |
| current | num | 当前页数 | |
| size | num | 当前分页大小 | |
| total | num | 记录总数 | |
**示例:**
```shell
curl -L -X GET 'https://member.bilibili.com/x/h5/elec/rank/recent' \
-H 'Cookie: SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"list": [
{
"aid": 0,
"bvid": "",
"elec_num": 50,
"title": "",
"uname": "",
"avatar": "",
"ctime": "2020-04-02 03:12:22"
},
{
"aid": 0,
"bvid": "",
"elec_num": 20,
"title": "",
"uname": "",
"avatar": "",
"ctime": "2020-04-02 03:12:00"
}
],
"pager": {
"current": 1,
"size": 20,
"total": 38
}
}
}
```
</details>

303
docs/electric/charge_msg.md Normal file
View File

@@ -0,0 +1,303 @@
# 充电留言
- [发送充电留言](#发送充电留言)
- [查询我收到的充电留言](#查询我收到的充电留言)
- [查询充电留言详情](#查询充电留言详情)
- [回复充电留言](#回复充电留言)
---
## 发送充电留言
> https://api.bilibili.com/x/ugcpay/trade/elec/message
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ---- |
| order_id | str | 留言token | 必要 | |
| message | str | 留言内容 | 必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功 <br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />88203不能重复留言 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
为留言token为`BPRG5CEC3VUPOOANA540`的充电操作,添加了内容为`支持一下大佬`的留言
```shell
curl 'https://api.bilibili.com/x/ugcpay/trade/elec/message' \
--data-urlencode 'order_id=BPRG5CEC3VUPOOANA540' \
--data-urlencode 'message=支持一下大佬' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1
}
```
</details>
## 查询我收到的充电留言
> https://member.bilibili.com/x/web/elec/remark/list
*请求方式:GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------------ | ------------------ |
| begin | str | 起始日期 | | 默认2016-01-01 |
| end | str | 结束日期 | | 默认2050-01-01 |
| pn | str | 页数 | | |
| ps | str | 分页大小 | | 取值范围[1,12] |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录|
| msg | str | 0 | |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| page | obj | 分页信息 | |
| list | array | 信息本体 | |
`page`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| current | num | 当前页数 | |
| size | num | 当前分页大小 | |
| total | num | 记录总数 | |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| aid | num | | |
| bvid | str | | |
| id | num | 留言记录id | |
| mid | num | | |
| reply_mid | num | 0| |
| elec_num | num | 0 | |
| state | num | UP是否已经回复这条留言 | 0未回复<br />1已回复 |
| msg | str | 留言信息 | |
| aname | str | 空 | |
| uname | str |空 | |
| avator | str | 空 | |
| reply_name | str | 空 | |
| reply_avator | str | 空 | |
| reply_msg | str | 空 | |
| ctime | num | 留言时间 | 毫秒级时间戳 |
| reply_time | num | 0 | |
**示例:**
```shell
curl -L -X GET 'https://member.bilibili.com/x/web/elec/remark/list?begin=2016-01-01&end=2050-01-01&pn=1&ps=10' \
-H 'Cookie: SESSDATA=xxx;'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"list": [
{
"aid": 0,
"bvid": "",
"id": 6715018,
"mid": 0,
"reply_mid": 0,
"elec_num": 0,
"state": 0,
"msg": "加油",
"aname": "",
"uname": "",
"avator": "",
"reply_name": "",
"reply_avator": "",
"reply_msg": "",
"ctime": 1650665119000,
"reply_time": 0
}
],
"pager": {
"current": 1,
"size": 10,
"total": 448
}
}
}
```
</details>
## 查询充电留言详情
> https://member.bilibili.com/x/web/elec/remark/detail?id=6662619
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | -------------------------------- |
| id | num | 留言id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误|
| message | str | 0 | |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| aid | num | | |
| bvid | str | | |
| id | num | 留言id | |
| mid | num | 留言者uid充电用户 | |
| reply_mid | num | UP主uid | |
| elec_num | num | 0 | |
| state | num | UP是否已经回复这条留言 | 0未回复<br />1已回复 |
| msg | str | 留言内容 | |
| aname | str | 空 | |
| uname | str | 留言者用户名 | |
| avator | str | 留言者头像 | |
| reply_name | str | UP主用户名 | |
| reply_avator | str | UP主头像 | |
| reply_msg | str | 回复内容 | |
| ctime | num | 留言时间 | 毫秒级时间戳 |
| reply_time | num | 回复时间 | 毫秒级时间戳 |
**示例:**
```shell
curl -L -X GET 'https://member.bilibili.com/x/web/elec/remark/detail?id=6507563' \
-H 'cookie: SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"aid": 0,
"bvid": "",
"id": 6507563,
"mid": 19978396,
"reply_mid": 2062760,
"elec_num": 0,
"state": 1,
"msg": "感谢搬运",
"aname": "",
"uname": "HANSOOOOOL",
"avator": "http://i1.hdslb.com/bfs/face/5c22af0261b8b3f9a54b6e0038e35430e9ed9cfd.jpg",
"reply_name": "一把近战都不给六花",
"reply_avator": "http://i2.hdslb.com/bfs/face/1804b716084908d4992bdd35827d0c2d7222fe97.jpg",
"reply_msg": "( ̄3 ̄)",
"ctime": 1646726966000,
"reply_time": 1646811946000
}
}
```
</details>
## 回复充电留言
> https://member.bilibili.com/x/web/elec/remark/reply
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ------ | ------------------------ | -------------- | ------------------------------------------------------------ |
| csrf | str | csrf | 必要 | |
| id | num | 留言id | 必要 | |
| msg | str | 回复信息 | | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf 校验失败<br />-400请求错误20004充电服务异常<br /> |
| message | str | 错误信息 | |
| ttl | num | 1 | |
**示例:**
```shell
curl -L -X POST 'https://member.bilibili.com/x/web/elec/remark/reply' \
-H 'cookie: SESSDATA=xxx' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'csrf=xxx' \
--data-urlencode 'id=6258929' \
--data-urlencode 'msg=( ̄3 ̄)'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": 1
}
```
</details>

110
docs/emoji/action.md Normal file
View File

@@ -0,0 +1,110 @@
# 表情操作
- [添加表情包](#添加表情包)
- [移除表情包](#移除表情包)
---
## 添加表情包
> https://api.bilibili.com/x/emote/package/add
*请求方式POST*
认证方式CookieSESSDATA
只能添加有会员权限或已购买的表情包
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | ------ | -------------------------------- |
| package_id | num | 表情包id | 必要 | |
| business | str | 使用场景 | 必要 | reply评论区<br />dynamic动态 |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />-403访问权限不足 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
添加id为`25`的表情包,使用场景为评论区
```shell
curl 'https://api.bilibili.com/x/emote/package/add' \
--data-urlencode 'package_id=25' \
--data-urlencode 'business=reply' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 移除表情包
> https://api.bilibili.com/x/emote/package/remove
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | ------ | -------------------------------- |
| package_id | num | 表情包id | 必要 | |
| business | str | 使用场景 | 必要 | reply评论区<br />dynamic动态 |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />-403访问权限不足 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
移除id为`25`的表情包,使用场景为评论区
```shell
curl 'https://api.bilibili.com/x/emote/package/remove' \
--data-urlencode 'package_id=25' \
--data-urlencode 'business=reply' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>

646
docs/emoji/list.md Normal file
View File

@@ -0,0 +1,646 @@
# 表情列表
- [获取我的表情列表](#获取我的表情列表)
- [取指定的表情包明细](#取指定的表情包明细)
- [获取所有表情包列表](#获取所有表情包列表)
- [附表-表情包对象](#附表-表情包对象)
---
## 获取我的表情列表
> https://api.bilibili.com/x/emote/user/panel/web
*请求方式GET*
认证方式CookieSESSDATA
使用登录Cookie进行会员专属及已购买表情包的分发否则全为免费表情包
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | -------------------------------- |
| business | str | 使用场景 | 必要 | reply评论区<br />dynamic动态 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| packages | array | 表情包 | |
`data`中的`packages`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | -------------- |
| 0 | obj | 表情包1 | **详情见附表** |
| n | obj | 表情包(n+1) | **详情见附表** |
| …… | obj | …… | …… |
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/emote/user/panel/web' \
--data-urlencode 'business=reply' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"packages": [
{
"id": 1,
"text": "小黄脸",
"url": "http://i0.hdslb.com/bfs/emote/81edf17314cea3b48674312b4364df44d5c01f17.png",
"mtime": 1591604235,
"type": 1,
"attr": 66,
"meta": {
"size": 1,
"item_id": 958
},
"emote": [
{
"id": 2126,
"package_id": 1,
"text": "[视频卫星]",
"url": "http://i0.hdslb.com/bfs/emote/dce6fc7d6dfeafff01241924db60f8251cca5307.png",
"mtime": 1590986882,
"type": 1,
"attr": 0,
"meta": {
"size": 1
},
"flags": {}
},
{
"id": 1901,
"package_id": 1,
"text": "[加油武汉]",
"url": "http://i0.hdslb.com/bfs/emote/eb966aaa5b690d3f9308a9f936f5b5a72a7f956b.png",
"mtime": 1580024058,
"type": 1,
"attr": 0,
"meta": {
"size": 1
},
"flags": {}
},
{
"id": 1906,
"package_id": 1,
"text": "[口罩]",
"url": "http://i0.hdslb.com/bfs/emote/3ad2f66b151496d2a5fb0a8ea75f32265d778dd3.png",
"mtime": 1581309529,
"type": 1,
"attr": 0,
"meta": {
"size": 1
},
"flags": {}
},
{
"id": 1,
"package_id": 1,
"text": "[微笑]",
"url": "http://i0.hdslb.com/bfs/emote/685612eadc33f6bc233776c6241813385844f182.png",
"mtime": 1582182040,
"type": 1,
"attr": 0,
"meta": {
"size": 1
},
"flags": {}
},
{
"id": 1958,
"package_id": 1,
"text": "[笑]",
"url": "http://i0.hdslb.com/bfs/emote/81edf17314cea3b48674312b4364df44d5c01f17.png",
"mtime": 1582184940,
"type": 1,
"attr": 0,
"meta": {
"size": 1
},
"flags": {}
},
…………
},
{
"id": 53,
"text": "热词系列一",
"url": "http://i0.hdslb.com/bfs/emote/bacd6e17997348873ef89e5f1bcbbda877a1606a.png",
"mtime": 1592205524,
"type": 1,
"attr": 2,
"meta": {
"size": 2,
"item_id": 1039
},
"emote": [
{
"id": 1937,
"package_id": 53,
"text": "[热词系列_知识增加]",
"url": "http://i0.hdslb.com/bfs/emote/142409b595982b8210b2958f3d340f3b47942645.png",
"mtime": 1585202919,
"type": 1,
"attr": 2,
"meta": {
"size": 2,
"alias": "知识增加"
},
"flags": {}
},
{
"id": 2147,
"package_id": 53,
"text": "[热词系列_希望没事]",
"url": "http://i0.hdslb.com/bfs/emote/6c0d2e6c486d1ba5afd6204a96e102652464a01d.png",
"mtime": 1591689594,
"type": 1,
"attr": 2,
"meta": {
"size": 2,
"alias": "希望没事"
},
"flags": {}
},
{
"id": 2083,
"package_id": 53,
"text": "[热词系列_泪目]",
"url": "http://i0.hdslb.com/bfs/emote/bba3703ab90b7d16fe9dbcb85ed949db687f8331.png",
"mtime": 1588910215,
"type": 1,
"attr": 2,
"meta": {
"size": 2,
"alias": "泪目"
},
"flags": {}
},
{
"id": 2082,
"package_id": 53,
"text": "[热词系列_保护]",
"url": "http://i0.hdslb.com/bfs/emote/55f8f6445ca7c3170cdfc5b16036abf639ce9b57.png",
"mtime": 1588910215,
"type": 1,
"attr": 2,
"meta": {
"size": 2,
"alias": "保护"
},
"flags": {}
},
…………
},
…………
]
}
}
```
</details>
## 获取指定的表情包明细
> https://api.bilibili.com/x/emote/package
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | -------------------------------- |
| business | str | 使用场景 | 必要 | reply评论区<br />dynamic动态 |
| ids | nums | 表情包id | 必要 | id之间以`,`隔开 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | 有效时obj<br />无效时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | ---- |
| packages | array | 表情包 | |
`data`中的`packages`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | -------------- |
| 0 | obj | 表情包1 | **详情见附表** |
| n | obj | 表情包(n+1) | **详情见附表** |
| …… | obj | …… | …… |
**示例:**
获取表情包id为`93`的表情包明细
```shell
curl -G 'https://api.bilibili.com/x/emote/package' \
--data-urlencode 'ids=93' \
--data-urlencode 'business=reply'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"packages": [
{
"id": 93,
"text": "泠鸢yousa",
"url": "http://i0.hdslb.com/bfs/emote/5fa6082e098402d16d58c68e441ae76e40befd2c.png",
"mtime": 1592213522,
"type": 3,
"attr": 28,
"meta": {
"size": 2,
"item_id": 1907,
"item_url": "https://www.bilibili.com/h5/mall/suit/detail?navhide=1&stahide=0&id=1911"
},
"emote": [
{
"id": 2086,
"package_id": 93,
"text": "[泠鸢yousa_awsl]",
"url": "http://i0.hdslb.com/bfs/emote/7663b729161bd4556c2ec318c07791000743eb56.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "awsl"
},
"flags": {}
},
{
"id": 2087,
"package_id": 93,
"text": "[泠鸢yousa_打call]",
"url": "http://i0.hdslb.com/bfs/emote/718e9495846db4172eb87d2f7f02015a34d35ea2.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "打call"
},
"flags": {}
},
{
"id": 2088,
"package_id": 93,
"text": "[泠鸢yousa_沉默]",
"url": "http://i0.hdslb.com/bfs/emote/5e967cf1669743ed92e9a8ff3e5de6d90ca63d3d.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "沉默"
},
"flags": {}
},
{
"id": 2089,
"package_id": 93,
"text": "[泠鸢yousa_大哭]",
"url": "http://i0.hdslb.com/bfs/emote/3f757b147b9b1e201470eae7dac9cc0360172569.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "大哭"
},
"flags": {}
},
{
"id": 2090,
"package_id": 93,
"text": "[泠鸢yousa_干杯]",
"url": "http://i0.hdslb.com/bfs/emote/5cf5e14101be845233a222ab1bbdc21c63af04c3.png",
"mtime": 1590401422,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "干杯"
},
"flags": {}
},
{
"id": 2091,
"package_id": 93,
"text": "[泠鸢yousa_好人卡]",
"url": "http://i0.hdslb.com/bfs/emote/e3907b3bb20b18e7ecb11cd86829c9a4ce5b1b2f.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "好人卡"
},
"flags": {}
},
{
"id": 2092,
"package_id": 93,
"text": "[泠鸢yousa_加大力度]",
"url": "http://i0.hdslb.com/bfs/emote/a0393a2d4b522f07a319dfd2e91754a3cdff2c48.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "加大力度"
},
"flags": {}
},
{
"id": 2093,
"package_id": 93,
"text": "[泠鸢yousa_滑稽]",
"url": "http://i0.hdslb.com/bfs/emote/a8057c0e0579b93c16010a270e261fd0a64034af.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "滑稽"
},
"flags": {}
},
{
"id": 2094,
"package_id": 93,
"text": "[泠鸢yousa_请吃桃]",
"url": "http://i0.hdslb.com/bfs/emote/e92276d9d8c28f85f7dbcc0fbbb6ecb3345ce33e.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "请吃桃"
},
"flags": {}
},
{
"id": 2095,
"package_id": 93,
"text": "[泠鸢yousa_惊讶]",
"url": "http://i0.hdslb.com/bfs/emote/9fdc2c5b4b970aded56fe2f326bd4d00e849339d.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "惊讶"
},
"flags": {}
},
{
"id": 2096,
"package_id": 93,
"text": "[泠鸢yousa_生气]",
"url": "http://i0.hdslb.com/bfs/emote/9e6ba9ff34101e04d3e321cad486f845f892050e.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "生气"
},
"flags": {}
},
{
"id": 2097,
"package_id": 93,
"text": "[泠鸢yousa_贴贴]",
"url": "http://i0.hdslb.com/bfs/emote/dbc177d314231add509501ffc6bc7655fca2c10f.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "贴贴"
},
"flags": {}
},
{
"id": 2098,
"package_id": 93,
"text": "[泠鸢yousa_头晕]",
"url": "http://i0.hdslb.com/bfs/emote/49830c1c8a1652f7ee9cb854ac7dbf8e378cdcd6.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "头晕"
},
"flags": {}
},
{
"id": 2099,
"package_id": 93,
"text": "[泠鸢yousa_问号]",
"url": "http://i0.hdslb.com/bfs/emote/ab7a543233eff83138c3221c86a762ab36bab7bc.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "问号"
},
"flags": {}
},
{
"id": 2100,
"package_id": 93,
"text": "[泠鸢yousa_真棒]",
"url": "http://i0.hdslb.com/bfs/emote/02ea49543a3ac52feee185c156ab08fb2bfdd89e.png",
"mtime": 1589776042,
"type": 3,
"attr": 0,
"meta": {
"size": 2,
"alias": "真棒"
},
"flags": {}
}
],
"flags": {
"added": true
}
}
]
}
}
```
</details>
## 获取所有表情包列表
> https://api.bilibili.com/x/emote/setting/panel
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | -------------------------------- |
| business | str | 使用场景 | 必要 | reply评论区<br />dynamic动态 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------- | ----- | ---------------- | ---- |
| user_panel_packages | array | 用户拥有的表情包 | |
| all_packages | array | 所有表情包 | |
| mall | obj | 商城页面 | |
`data`对象中的`user_panel_packages`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------------- | -------------- |
| 0 | obj | 用户拥有的表情包1 | **详情见附表** |
| n | obj | 用户拥有的表情包(n+1) | **详情见附表** |
| …… | obj | …… | …… |
`data`对象中的`all_packages`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | -------------- |
| 0 | obj | 所有表情包1 | **详情见附表** |
| n | obj | 所有表情包(n+1) | **详情见附表** |
| …… | obj | …… | …… |
`data`对象中的`mall`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ----------- | ---- |
| title | str | 商城名称 | |
| url | str | 商城页面url | |
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/emote/setting/panel' \
--data-urlencode 'business=reply' \
-b 'SESSDATA=xxx'
```
**限于篇幅,代码块示例略**
## 附表-表情包对象
| 字段 | 类型 | 内容 | 备注 |
| ----- | ----- | ----------------- | -------------------------------------------------------- |
| id | num | 表情包id | |
| text | str | 表情包名称 | |
| url | str | 表情包标志图片url | |
| mtime | num | 创建时间 | 时间戳 |
| type | num | 表情包类型 | 1普通<br />2会员专属<br />3购买所得<br />4颜文字 |
| attr | num | | **作用尚不明确** |
| meta | obj | 属性信息 | |
| emote | array | 表情列表 | |
| flags | obj | 是否添加标志 | |
`表情包对象`中的`flags`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ---------- | ------------------------------------------------------------ |
| added | bool | 是否已添加 | true已添加<br />false未添加<br />需要登录SESSDATA<br />否则恒为false |
`表情包对象`中的`meta`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | --------------- | ---------------- |
| size | num | 表情尺寸信息 | 1<br />2大 |
| item_id | num | 购买物品id | |
| item_url | num | 购买物品页面url | 无则无此项 |
`表情包对象`中的`emote`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ---- |
| 0 | obj | 表情1 | |
| n | obj | 表情(n+1) | |
| …… | obj | …… | …… |
`emote`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ----------- | -------------------------------------------------------- |
| id | num | 表情id | |
| package_id | num | 表情包id | |
| text | str | 表情转义符 | 颜文字时为该字串 |
| url | str | 表情图片url | 颜文字时为该字串 |
| mtime | num | 创建时间 | 时间戳 |
| type | num | 表情类型 | 1普通<br />2会员专属<br />3购买所得<br />4颜文字 |
| attr | num | | **作用尚不明确** |
| meta | obj | 属性信息 | |
| flags | obj | 禁用标志 | 无则为空 |
`emote`数组中的对象中的`flags`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | ---------- | ------------------------------------------------------ |
| no_access | bool | 是否为禁用 | true禁用<br />需要登录SESSDATA<br />否则恒为true |
`emote`数组中的对象中的`meta`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ------------ | ---------------- |
| size | num | 表情尺寸信息 | 1<br />2大 |
| alias | str | 简写名 | 无则无此项 |

482
docs/fav/action.md Normal file
View File

@@ -0,0 +1,482 @@
# 收藏夹操作
- [管理收藏夹](#管理收藏夹)
- [新建收藏夹](#新建收藏夹)
- [修改收藏夹](#修改收藏夹)
- [删除收藏夹](#删除收藏夹)
- [管理收藏内容](#管理收藏内容)
- [批量复制内容](#批量复制内容)
- [清空所有失效内容](#清空所有失效内容)
---
## 管理收藏夹
### 新建收藏夹
> https://api.bilibili.com/x/v3/fav/folder/add
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------- | ---- | ------------------------ | -------------- | ------------------------------------ |
| title | str | 收藏夹标题 | 必要 | |
| intro | str | 收藏夹简介 | 非必要 | 默认为空 |
| privacy | num | 是否公开 | 非必要 | 默认为公开<br />0公开<br />1私密 |
| cover | str | 封面图url | 非必要 | 封面会被审核 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功<br />-102账号被封停 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
略....
详见[获取收藏夹元数据](info.md#获取收藏夹元数据)中的`data`对象
**示例:**
创建一个叫`test`,简介是`2333`,封面`https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png`,的公开收藏夹:
```shell
curl 'https://api.bilibili.com/x/v3/fav/folder/add' \
--data-urlencode 'title=test' \
--data-urlencode 'intro=2333' \
--data-urlencode 'privacy=0' \
--data-urlencode 'cover=https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png' \
--data-urlencode 'csrf=xxxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 1182306172,
"fid": 11823061,
"mid": 470310172,
"attr": 6,
"title": "test",
"cover": "https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png",
"upper": {
"mid": 0,
"name": "",
"face": "",
"followed": false,
"vip_type": 0,
"vip_statue": 0
},
"cover_type": 0,
"cnt_info": {
"collect": 0,
"play": 0,
"thumb_up": 0,
"share": 0
},
"type": 0,
"intro": "2333",
"ctime": 0,
"mtime": 0,
"state": 0,
"fav_state": 0,
"like_state": 0,
"media_count": 0
}
}
```
</details>
### 修改收藏夹
> https://api.bilibili.com/x/v3/fav/folder/edit
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | -------------- | ------------------------------------------ |
| media_id | num | 目标收藏夹mdid | 必要 | |
| title | str | 修改收藏夹标题 | 必要 | |
| intro | str | 修改收藏夹简介 | 非必要 | |
| privacy | num | 是否公开 | 非必要 | 默认为公开<br /><br />0公开<br />1私密 |
| cover | str | 封面图url | 非必要 | 封面会被审核 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功<br />-102账号被封停 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
略....
详见[获取收藏夹元数据](info.md#获取收藏夹元数据)中的`data`对象
**示例:**
修改id为`1182306172`的名字为`test`,简介为`2333`,封面为`https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png`,公开收藏夹:
```shell
curl 'https://api.bilibili.com/x/v3/fav/folder/edit' \
--data-urlencode 'media_id=1182306172' \
--data-urlencode 'title=test' \
--data-urlencode 'intro=2333' \
--data-urlencode 'privacy=0' \
--data-urlencode 'cover=https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png' \
--data-urlencode 'csrf=xxxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 1182306172,
"fid": 11823061,
"mid": 470310172,
"attr": 6,
"title": "test",
"cover": "https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png",
"upper": {
"mid": 0,
"name": "",
"face": "",
"followed": false,
"vip_type": 0,
"vip_statue": 0
},
"cover_type": 0,
"cnt_info": {
"collect": 0,
"play": 0,
"thumb_up": 0,
"share": 0
},
"type": 0,
"intro": "2333",
"ctime": 0,
"mtime": 0,
"state": 0,
"fav_state": 0,
"like_state": 0,
"media_count": 0
}
}
```
</details>
### 删除收藏夹
> https://api.bilibili.com/x/v3/fav/folder/del
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | ------------------------ | -------------- | ------------------- |
| media_ids | nums | 目标收藏夹mdid列表 | 必要 | 每个成员间用`,`分隔 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 成功为0 |
| ttl | num | 1 | |
| data | num | 信息本体 | 成功为0 |
**示例:**
删除id为`1182306172`的收藏夹:
```shell
curl 'https://api.bilibili.com/x/v3/fav/folder/del' \
--data-urlencode 'media_ids=1182306172' \
--data-urlencode 'csrf=xxxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":0
}
```
</details>
## 管理收藏内容
### 批量复制内容
> https://api.bilibili.com/x/v3/fav/resource/copy
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| src_media_id | num | 源收藏夹id | 必要 | |
| tar_media_id | num | 目标收藏夹id | 必要 | |
| mid | num | 当前用户mid | 必要 | |
| resources | strs | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2视频稿件<br />12音频<br />21视频合集<br />内容id<br />视频稿件视频稿件avid<br />音频音频auid<br />视频合集视频合集id |
| platform | str | 平台标识 | 非必要 | 可为web |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />11010您访问的内容不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | 成功为0 |
**示例:**
将id为`1288061499`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`复制到id为`1178751999`的收藏夹中
```shell
curl 'https://api.bilibili.com/x/v3/fav/resource/copy' \
--data-urlencode 'src_media_id=1288061499' \
--data-urlencode 'tar_media_id=1178751999' \
--data-urlencode 'mid=233333' \
--data-urlencode 'resources=21822819:2,21918689:2,22288065:2' \
--data-urlencode 'platform=web' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":0
}
```
</details>
### 批量移动内容
> https://api.bilibili.com/x/v3/fav/resource/move
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| src_media_id | num | 源收藏夹id | 必要 | |
| tar_media_id | num | 目标收藏夹id | 必要 | |
| mid | num | 当前用户mid | 必要 | |
| resources | strs | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2视频稿件<br />12音频<br />21视频合集<br />内容id<br />视频稿件视频稿件avid<br />音频音频auid<br />视频合集视频合集id |
| platform | str | 平台标识 | 非必要 | 可为web |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />11010您访问的内容不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | 成功为0 |
**示例:**
将id为`1288061499`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`移动到id为`1178751999`的收藏夹中
```shell
curl 'https://api.bilibili.com/x/v3/fav/resource/move' \
--data-urlencode 'src_media_id=1288061499' \
--data-urlencode 'tar_media_id=1178751999' \
--data-urlencode 'mid=233333' \
--data-urlencode 'resources=21822819:2,21918689:2,22288065:2' \
--data-urlencode 'platform=web' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":0
}
```
</details>
### 批量删除内容
> https://api.bilibili.com/x/v3/fav/resource/batch-del
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | -------------- | ------------------------ | ------------------------------------------------------------ | ------- |
| resources | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2视频稿件<br />12音频<br />21视频合集<br />内容id<br />视频稿件视频稿件avid<br />音频音频auid<br />视频合集视频合集id | |
| media_id | num | 目标收藏夹id | 必要 | |
| platform | str | 平台标识 | 非必要 | 可为web |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />11010您访问的内容不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | 成功为0 |
**示例:**
将id为`1178751999`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`取消收藏
```shell
curl 'https://api.bilibili.com/x/v3/fav/resource/batch-del' \
--data-urlencode 'resources=21822819:2,21918689:2,22288065:2' \
--data-urlencode 'media_id=1178751999' \
--data-urlencode 'platform=web' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":0
}
```
</details>
### 清空所有失效内容
> https://api.bilibili.com/x/v3/fav/resource/clean
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | -------------- | ---- |
| media_id | num | 目标收藏夹id | 必要 | |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | 成功为0 |
**示例:**
清理id为`1161340172`的收藏夹
```shell
curl 'https://api.bilibili.com/x/v3/fav/resource/clean' \
--data-urlencode 'media_id=1161340172' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":0
}
```
</details>

415
docs/fav/info.md Normal file
View File

@@ -0,0 +1,415 @@
# 收藏夹基本信息
- [获取收藏夹元数据](#获取收藏夹元数据)
- [获取指定用户创建的所有收藏夹信息](#获取指定用户创建的所有收藏夹信息)
- [批量获取指定收藏id的内容](#批量获取指定收藏id的内容)
---
## 获取收藏夹元数据
> https://api.bilibili.com/x/v3/fav/folder/info
*请求方式GET*
认证方式Cookie或APP
**注:查询权限收藏夹时需要相应用户登录**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ---------------------- | ------ | ---- |
| media_id | num | 目标收藏夹id完整id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | -------- | --------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-403访问权限不足 |
| message | str | 错误信息 | 默认为0 |
| data | 有效时obj<br />无效或null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------------------- | -------------------------------------------------- |
| id | num | 收藏夹mlid完整id | 收藏夹原始id+创建者mid尾号2位 |
| fid | num | 收藏夹原始id | |
| mid | num | 创建者mid | |
| attr | num | 属性位(?) | |
| title | str | 收藏夹标题 | |
| cover | str | 收藏夹封面图片url | |
| upper | obj | 创建者信息 | |
| cover_type | num | 封面图类别(?) | |
| cnt_info | obj | 收藏夹状态数 | |
| type | num | 类型(?) | 一般是11 |
| intro | str | 备注 | |
| ctime | num | 创建时间 | 时间戳 |
| mtime | num | 收藏时间 | 时间戳 |
| state | num | 状态(?) | 一般为0 |
| fav_state | num | 收藏夹收藏状态 | 已收藏收藏夹1<br />未收藏收藏夹0<br />需要登录 |
| like_state | num | 点赞状态 | 已点赞1<br />未点赞0<br />需要登录 |
| media_count | num | 收藏夹内容数量 | |
`info`中的`upper`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ---------------- | ----------------------------------------------- |
| mid | num | 创建者mid | |
| name | str | 创建者昵称 | |
| face | str | 创建者头像url | |
| followed | bool | 是否已关注创建者 | |
| vip_type | num | 会员类别 | 0<br />1月大会员<br />2年度及以上大会员 |
| vip_statue | num | 会员开通状态 | 0<br />1有 |
`info`中的`cnt_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------ | ---- |
| collect | num | 收藏数 | |
| play | num | 播放数 | |
| thumb_up | num | 点赞数 | |
| share | num | 分享数 | |
**示例:**
查询收藏夹`id=1052622027`的元数据
```shell
curl -G 'https://api.bilibili.com/x/v3/fav/folder/info' \
--data-urlencode 'media_id=1052622027' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"id": 1052622027,
"fid": 10526220,
"mid": 686127,
"attr": 54,
"title": "猛 男 生 存",
"cover": "http://i2.hdslb.com/bfs/archive/bb51ee8a5fc5e03996138155f0f682d30ee16484.jpg",
"upper": {
"mid": 686127,
"name": "籽岷",
"face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp",
"followed": true,
"vip_type": 2,
"vip_statue": 1
},
"cover_type": 2,
"cnt_info": {
"collect": 3393,
"play": 184822,
"thumb_up": 3918,
"share": 44
},
"type": 11,
"intro": "猛 男 生 存",
"ctime": 1598884758,
"mtime": 1598884758,
"state": 0,
"fav_state": 0,
"like_state": 0,
"media_count": 28
}
}
```
</details>
## 获取指定用户创建的所有收藏夹信息
> https://api.bilibili.com/x/v3/fav/folder/created/list-all
*请求方式GET*
认证方式Cookie或APP
**注:查询权限收藏夹时需要相应用户登录**
该接口也能查询目标内容id存在于那些收藏夹中
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------ | ---------------------------------------- |
| up_mid | num | 目标用户mid | 必要 | |
| type | num | 目标内容属性 | 非必要 | 默认为全部<br />0全部<br />2视频稿件 |
| rid | num | 目标内容id | 非必要 | 视频稿件视频稿件avid |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| data | 有效时obj<br />无效或null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ----- | ---------------- | ---- |
| count | num | 创建的收藏夹总数 | |
| list | array | 创建的收藏夹列表 | |
| season | null | | |
`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | obj | 收藏夹1 | |
| n | obj | 收藏夹n+1 | |
| ... | obj | ... | |
`medias`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------------------------ | ------------------------------------------ |
| id | num | 收藏夹mlid完整id | 收藏夹原始id+创建者mid尾号2位 |
| fid | num | 收藏夹原始id | |
| mid | num | 创建者mid | |
| attr | num | 属性位(?) | |
| title | str | 收藏夹标题 | |
| fav_state | num | 目标id是否存在于该收藏夹 | 存在于该收藏夹1<br />不存在于该收藏夹0 |
| media_count | num | 收藏夹内容数量 | |
**示例:**
查询用户`mid=509372`的所有创建收藏夹列表
```shell
curl -G 'https://api.bilibili.com/x/v3/fav/folder/created/list-all' \
--data-urlencode 'up_mid=509372' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"count": 2,
"list": [
{
"id": 939227072,
"fid": 9392270,
"mid": 509372,
"attr": 54,
"title": "学习",
"fav_state": 0,
"media_count": 22
},
{
"id": 75020272,
"fid": 750202,
"mid": 509372,
"attr": 22,
"title": "MAD/AMV",
"fav_state": 0,
"media_count": 16
}
],
"season": null
}
}
```
</details>
## 批量获取指定收藏id的内容
> https://api.bilibili.com/x/v3/fav/resource/infos
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | -------------- | ------ | ------------------------------------------------------------ |
| resources | strs | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2视频稿件<br />12音频<br />21视频合集<br />内容id<br />视频稿件视频稿件avid<br />音频音频auid<br />视频合集视频合集id |
| platform | str | 平台标识 | 非必要 | 可为web影响内容列表类型 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------------------------------- | ------------ | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| data | 有效时array<br />无效或null | 内容信息列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 内容信息1 | |
| n | obj | 内容信息n+1 | |
| ... | obj | ... | |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------------- | ------------------------------------------------------------ |
| id | num | 内容id | 视频稿件视频稿件avid<br />音频音频auid<br />视频合集视频合集id |
| type | num | 内容类型 | 2视频稿件<br />12音频<br />21视频合集 |
| title | str | 标题 | |
| cover | str | 封面url | |
| intro | str | 简介 | |
| page | num | 视频分P数 | |
| duration | num | 音频/视频时长 | |
| upper | obj | UP主信息 | |
| attr | num | 属性 | 0正常<br />1失效 |
| cnt_info | obj | 状态数 | |
| link | str | 跳转uri | |
| ctime | num | 投稿时间 | 时间戳 |
| pubtime | num | 发布时间 | 时间戳 |
| fav_time | num | 收藏时间 | 时间戳 |
| bv_id | str | 视频稿件bvid | |
| bvid | str | 视频稿件bvid | |
| season | null | | |
`data`数组中的对象中的`upper`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| mid | num | UP主mid | |
| name | str | UP主昵称 | |
| face | str | UP主头像url | |
`data`数组中的对象中的`cnt_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------ | ---- |
| collect | num | 收藏数 | |
| play | num | 播放数 | |
| danmaku | num | 弹幕数 | |
**示例:**
批量查询内容
1-视频稿件-`av583785685`
2-视频合集-`523`
3-音频-`au15664`
```shell
curl -G 'https://api.bilibili.com/x/v3/fav/resource/infos' \
--data-urlencode 'resources=583785685:2,523:21,15664:12'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"id": 583785685,
"type": 2,
"title": "已失效视频",
"cover": "http://i0.hdslb.com/bfs/archive/be27fd62c99036dce67efface486fb0a88ffed06.jpg",
"intro": "审核君辛苦了~\r\n使用curl命令访问B站api实现二维码登录 查询登录信息 视频投币 发送评论的操作\r\n本视频作为api收集项目的一个硬核DEMO\r\n由于当时录音的问题大部分是后期配的后面声音有点小\r\n想了解更多的去github页面也可以qq\r\n\r\nbgm\r\n雲流れ\r\nAutumn rain未修改版\r\n四月初雨微凉",
"page": 1,
"duration": 604,
"upper": {
"mid": 293793435,
"name": "社会易姐QwQ",
"face": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg"
},
"attr": 1,
"cnt_info": {
"collect": 1470,
"play": 28374,
"danmaku": 64
},
"link": "bilibili://video/583785685",
"ctime": 1594049831,
"pubtime": 1594049831,
"fav_time": 0,
"bv_id": "BV1kz4y1X7XP",
"bvid": "BV1kz4y1X7XP",
"season": null
},
{
"id": 523,
"type": 21,
"title": "2021哔哩哔哩拜年纪",
"cover": "https://i0.hdslb.com/bfs/archive/8ccc50f7cbc671762e0536491bd2b8aeebc0837d.jpg",
"intro": "感谢各位制作者们的辛勤付出!节目精彩,愿大家看的开心!",
"page": 0,
"duration": 0,
"upper": {
"mid": 1868902080,
"name": "哔哩哔哩拜年纪",
"face": "http://i0.hdslb.com/bfs/face/7f6cb94fc071aca9fbb4b1ca9cc6415e86847576.jpg"
},
"attr": 0,
"cnt_info": {
"collect": 0,
"play": 71527018,
"danmaku": 480547
},
"link": "bilibili://video/373561162",
"ctime": 0,
"pubtime": 0,
"fav_time": 0,
"bv_id": "",
"bvid": "",
"season": null
},
{
"id": 15664,
"type": 12,
"title": "威风堂堂",
"cover": "http://i0.hdslb.com/bfs/music/c417d30b394a8a5d4e8a150ad75837dbae3b79d4.jpg",
"intro": "翻唱。在电脑里放了半个月终于大家寒假快乐❁本家sm19233263❁压制: 寒雨❁mix: 三星堆❁vocal: 茶理理。超喜欢michan的那段英文念白所以加了进来w 谢谢三月月和嘟比比你们后期辛苦了!",
"page": 1,
"duration": 200,
"upper": {
"mid": 684169,
"name": "茶理理理子",
"face": ""
},
"attr": 0,
"cnt_info": {
"collect": 48872,
"play": 1508426,
"danmaku": 0
},
"link": "bilibili://music/detail/15664?name=%E5%A8%81%E9%A3%8E%E5%A0%82%E5%A0%82&uperName=%E8%8C%B6%E7%90%86%E7%90%86%E7%90%86%E5%AD%90&cover_url=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Fmusic%2Fc417d30b394a8a5d4e8a150ad75837dbae3b79d4.jpg&upperId=684169&author=%E8%8C%B6%E7%90%86%E7%90%86",
"ctime": 1502347604,
"pubtime": 1502347604,
"fav_time": 0,
"bv_id": "BV1bx411c7qt",
"bvid": "BV1bx411c7qt",
"season": null
}
]
}
```
</details>

570
docs/fav/list.md Normal file
View File

@@ -0,0 +1,570 @@
# 收藏夹内容
- [获取收藏夹内容明细列表](#获取收藏夹内容明细列表)
- [获取收藏夹全部内容id](#获取收藏夹全部内容id)
---
## 获取收藏夹内容明细列表
> https://api.bilibili.com/x/v3/fav/resource/list
*请求方式GET*
认证方式Cookie或APP
**注:查询权限收藏夹时需要相应用户登录**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ |
| media_id | num | 目标收藏夹mlid完整id | 必要 | |
| tid | num | 分区tid | 非必要 | 默认为全部分区<br />0全部分区<br />[详见说明](../video/video_zone.md) |
| keyword | str | 搜索关键字 | 非必要 | |
| order | str | 排序方式 | 非必要 | 按收藏时间:mtime<br />按播放量: view<br />按投稿时间pubtime |
| type | num | 查询范围 | 非必要 | 0当前收藏夹对应media_id<br /> 1全部收藏夹 |
| ps | num | 每页数量 | 必要 | 定义域1-20 |
| pn | num | 页码 | 非必要 | 默认为1 |
| platform | str | 平台标识 | 非必要 | 可为web影响内容列表类型 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | -------- | --------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-403访问权限不足 |
| message | str | 错误信息 | 默认为0 |
| data | 有效时obj<br />无效或null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ----- | ------------ | ---- |
| info | obj | 收藏夹元数据 | |
| medias | array | 收藏夹内容 | |
`data`中的`info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------------------- | -------------------------------------------------- |
| id | num | 收藏夹mlid完整id | 收藏夹原始id+创建者mid尾号2位 |
| fid | num | 收藏夹原始id | |
| mid | num | 创建者mid | |
| attr | num | 属性 | 0正常<br />1失效 |
| title | str | 收藏夹标题 | |
| cover | str | 收藏夹封面图片url | |
| upper | obj | 创建者信息 | |
| cover_type | num | 封面图类别(?) | |
| cnt_info | obj | 收藏夹状态数 | |
| type | num | 类型(?) | 一般是11 |
| intro | str | 备注 | |
| ctime | num | 创建时间 | 时间戳 |
| mtime | num | 收藏时间 | 时间戳 |
| state | num | 状态(?) | 一般为0 |
| fav_state | num | 收藏夹收藏状态 | 已收藏收藏夹1<br />未收藏收藏夹0<br />需要登录 |
| like_state | num | 点赞状态 | 已点赞1<br />未点赞0<br />需要登录 |
| media_count | num | 收藏夹内容数量 | |
`info`中的`upper`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ---------------- | ----------------------------------------------- |
| mid | num | 创建者mid | |
| name | str | 创建者昵称 | |
| face | str | 创建者头像url | |
| followed | bool | 是否已关注创建者 | |
| vip_type | num | 会员类别 | 0<br />1月大会员<br />2年度及以上大会员 |
| vip_statue | num | 会员开通状态 | 0<br />1有 |
`info`中的`cnt_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------ | ---- |
| collect | num | 收藏数 | |
| play | num | 播放数 | |
| thumb_up | num | 点赞数 | |
| share | num | 分享数 | |
`data`中的`medias`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | obj | 收藏内容1 | |
| n | obj | 收藏内容(n+1) | |
| ... | obj | ... | |
`medias`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------------- | ------------------------------------------------------------ |
| id | num | 内容id | 视频稿件视频稿件avid<br />音频音频auid<br />视频合集视频合集id |
| type | num | 内容类型 | 2视频稿件<br />12音频<br />21视频合集 |
| title | str | 标题 | |
| cover | str | 封面url | |
| intro | str | 简介 | |
| page | num | 视频分P数 | |
| duration | num | 音频/视频时长 | |
| upper | obj | UP主信息 | |
| attr | num | 属性位(?) | |
| cnt_info | obj | 状态数 | |
| link | str | 跳转uri | |
| ctime | num | 投稿时间 | 时间戳 |
| pubtime | num | 发布时间 | 时间戳 |
| fav_time | num | 收藏时间 | 时间戳 |
| bv_id | str | 视频稿件bvid | |
| bvid | str | 视频稿件bvid | |
| season | null | | |
`medias`数组中的对象中的`upper`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| mid | num | UP主mid | |
| name | str | UP主昵称 | |
| face | str | UP主头像url | |
`medias`数组中的对象中的`cnt_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------ | ---- |
| collect | num | 收藏数 | |
| play | num | 播放数 | |
| danmaku | num | 弹幕数 | |
**示例:**
查询收藏夹`id=1052622027`每页5个视频`1`页的内容明细
```shell
curl -G 'https://api.bilibili.com/x/v3/fav/resource/list' \
--data-urlencode 'media_id=1052622027' \
--data-urlencode 'platform=web' \
--data-urlencode 'pn=1' \
--data-urlencode 'ps=5' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"info": {
"id": 1052622027,
"fid": 10526220,
"mid": 686127,
"attr": 54,
"title": "猛 男 生 存",
"cover": "http://i2.hdslb.com/bfs/archive/bb51ee8a5fc5e03996138155f0f682d30ee16484.jpg",
"upper": {
"mid": 686127,
"name": "籽岷",
"face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp",
"followed": true,
"vip_type": 2,
"vip_statue": 1
},
"cover_type": 2,
"cnt_info": {
"collect": 3393,
"play": 184768,
"thumb_up": 3916,
"share": 44
},
"type": 11,
"intro": "猛 男 生 存",
"ctime": 1598884758,
"mtime": 1598884758,
"state": 0,
"fav_state": 0,
"like_state": 0,
"media_count": 28
},
"medias": [
{
"id": 371494037,
"type": 2,
"title": "猛 男 生 存",
"cover": "http://i2.hdslb.com/bfs/archive/bb51ee8a5fc5e03996138155f0f682d30ee16484.jpg",
"intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集BV1CZ4y1T7gC\n第二集BV1oA411a72k\n第三集BV1fK4y1e7Yj\n第四集BV1Ya4y1E7Y6\n第五集BV17V411z75A\n第六集BV1oi4y137sw\n第七集BV1Wt4y1D7Uu\n第八集BV1Bp4y1q7y9\n第九集BV1Lv411v7G2\n第十集BV1Xi4y137ER\n第十一集BV1nC4y1879J\n第十二集BV1K54y1",
"page": 1,
"duration": 546,
"upper": {
"mid": 686127,
"name": "籽岷",
"face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp"
},
"attr": 0,
"cnt_info": {
"collect": 11256,
"play": 1638040,
"danmaku": 7697
},
"link": "bilibili://video/371494037",
"ctime": 1595690513,
"pubtime": 1595690513,
"fav_time": 1598884777,
"bv_id": "BV1CZ4y1T7gC",
"bvid": "BV1CZ4y1T7gC",
"season": null
},
{
"id": 328991940,
"type": 2,
"title": "猛 男 生 存 2",
"cover": "http://i1.hdslb.com/bfs/archive/aa801612ea0229a08d000a525b715af24cba0964.jpg",
"intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集BV1CZ4y1T7gC\n第二集BV1oA411a72k\n第三集BV1fK4y1e7Yj\n第四集BV1Ya4y1E7Y6\n第五集BV17V411z75A\n第六集BV1oi4y137sw\n第七集BV1Wt4y1D7Uu\n第八集BV1Bp4y1q7y9\n第九集BV1Lv411v7G2\n第十集BV1Xi4y137ER\n第十一集BV1nC4y1879J\n第十二集BV1K54y1",
"page": 1,
"duration": 644,
"upper": {
"mid": 686127,
"name": "籽岷",
"face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp"
},
"attr": 0,
"cnt_info": {
"collect": 8695,
"play": 1334651,
"danmaku": 6064
},
"link": "bilibili://video/328991940",
"ctime": 1595770876,
"pubtime": 1595770876,
"fav_time": 1598884783,
"bv_id": "BV1oA411a72k",
"bvid": "BV1oA411a72k",
"season": null
},
{
"id": 884042215,
"type": 2,
"title": "猛 男 生 存 3",
"cover": "http://i1.hdslb.com/bfs/archive/f99059637c110dcd1cdae765a946801fbcefe4ab.jpg",
"intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集BV1CZ4y1T7gC\n第二集BV1oA411a72k\n第三集BV1fK4y1e7Yj\n第四集BV1Ya4y1E7Y6\n第五集BV17V411z75A\n第六集BV1oi4y137sw\n第七集BV1Wt4y1D7Uu\n第八集BV1Bp4y1q7y9\n第九集BV1Lv411v7G2\n第十集BV1Xi4y137ER\n第十一集BV1nC4y1879J\n第十二集BV1K54y1",
"page": 1,
"duration": 703,
"upper": {
"mid": 686127,
"name": "籽岷",
"face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp"
},
"attr": 0,
"cnt_info": {
"collect": 9449,
"play": 1429408,
"danmaku": 8243
},
"link": "bilibili://video/884042215",
"ctime": 1595847079,
"pubtime": 1595847079,
"fav_time": 1598884788,
"bv_id": "BV1fK4y1e7Yj",
"bvid": "BV1fK4y1e7Yj",
"season": null
},
{
"id": 669013980,
"type": 2,
"title": "猛 男 生 存 4",
"cover": "http://i1.hdslb.com/bfs/archive/def0f7009cb9a8b581ee03be9565918ff0c1913d.jpg",
"intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集BV1CZ4y1T7gC\n第二集BV1oA411a72k\n第三集BV1fK4y1e7Yj\n第四集BV1Ya4y1E7Y6\n第五集BV17V411z75A\n第六集BV1oi4y137sw\n第七集BV1Wt4y1D7Uu\n第八集BV1Bp4y1q7y9\n第九集BV1Lv411v7G2\n第十集BV1Xi4y137ER\n第十一集BV1nC4y1879J\n第十二集BV1K54y1",
"page": 1,
"duration": 895,
"upper": {
"mid": 686127,
"name": "籽岷",
"face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp"
},
"attr": 0,
"cnt_info": {
"collect": 9950,
"play": 1309544,
"danmaku": 13551
},
"link": "bilibili://video/669013980",
"ctime": 1595943988,
"pubtime": 1595943988,
"fav_time": 1598884792,
"bv_id": "BV1Ya4y1E7Y6",
"bvid": "BV1Ya4y1E7Y6",
"season": null
},
{
"id": 414034824,
"type": 2,
"title": "猛 男 生 存 5",
"cover": "http://i2.hdslb.com/bfs/archive/b4844ac89dde221d13bb8ddff80a8c4658bf7dc5.jpg",
"intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集BV1CZ4y1T7gC\n第二集BV1oA411a72k\n第三集BV1fK4y1e7Yj\n第四集BV1Ya4y1E7Y6\n第五集BV17V411z75A\n第六集BV1oi4y137sw\n第七集BV1Wt4y1D7Uu\n第八集BV1Bp4y1q7y9\n第九集BV1Lv411v7G2\n第十集BV1Xi4y137ER\n第十一集BV1nC4y1879J\n第十二集BV1K54y1",
"page": 1,
"duration": 814,
"upper": {
"mid": 686127,
"name": "籽岷",
"face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp"
},
"attr": 0,
"cnt_info": {
"collect": 9446,
"play": 1235998,
"danmaku": 9021
},
"link": "bilibili://video/414034824",
"ctime": 1596023668,
"pubtime": 1596023668,
"fav_time": 1598884798,
"bv_id": "BV17V411z75A",
"bvid": "BV17V411z75A",
"season": null
}
],
"has_more": true
}
}
```
</details>
## 获取收藏夹全部内容id
> https://api.bilibili.com/x/v3/fav/resource/ids
*请求方式GET*
认证方式Cookie或APP
**注:查询权限收藏夹时需要相应用户登录**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | --------------------------- |
| media_id | num | 目标收藏夹mlid完整id | 必要 | |
| platform | str | 平台标识 | 非必要 | 可为web影响内容列表类型 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------------------------------- | ---------- | --------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-403访问权限不足 |
| message | str | 错误信息 | 默认为0 |
| data | 有效时array<br />无效或null | 内容id列表 | |
`data`中的`medias`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 收藏内容id1 | |
| n | obj | 收藏内容id(n+1) | |
| ... | obj | ... | |
`medias`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ------------ | ------------------------------------------------------------ |
| id | num | 内容id | 视频稿件视频稿件avid<br />音频音频auid<br />视频合集视频合集id |
| type | num | 内容类型 | 2视频稿件<br />12音频<br />21视频合集 |
| bv_id | str | 视频稿件bvid | |
| bvid | str | 视频稿件bvid | |
**示例:**
查询收藏夹`id=1052622027`的全部内容id
```shell
curl -G 'https://api.bilibili.com/x/v3/fav/resource/ids' \
--data-urlencode 'media_id=1052622027' \
--data-urlencode 'platform=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"id": 371494037,
"type": 2,
"bv_id": "BV1CZ4y1T7gC",
"bvid": "BV1CZ4y1T7gC"
},
{
"id": 328991940,
"type": 2,
"bv_id": "BV1oA411a72k",
"bvid": "BV1oA411a72k"
},
{
"id": 884042215,
"type": 2,
"bv_id": "BV1fK4y1e7Yj",
"bvid": "BV1fK4y1e7Yj"
},
{
"id": 669013980,
"type": 2,
"bv_id": "BV1Ya4y1E7Y6",
"bvid": "BV1Ya4y1E7Y6"
},
{
"id": 414034824,
"type": 2,
"bv_id": "BV17V411z75A",
"bvid": "BV17V411z75A"
},
{
"id": 541550765,
"type": 2,
"bv_id": "BV1oi4y137sw",
"bvid": "BV1oi4y137sw"
},
{
"id": 626619000,
"type": 2,
"bv_id": "BV1Wt4y1D7Uu",
"bvid": "BV1Wt4y1D7Uu"
},
{
"id": 969124957,
"type": 2,
"bv_id": "BV1Bp4y1q7y9",
"bvid": "BV1Bp4y1q7y9"
},
{
"id": 244079274,
"type": 2,
"bv_id": "BV1Lv411v7G2",
"bvid": "BV1Lv411v7G2"
},
{
"id": 541500006,
"type": 2,
"bv_id": "BV1Xi4y137ER",
"bvid": "BV1Xi4y137ER"
},
{
"id": 796655080,
"type": 2,
"bv_id": "BV1nC4y1879J",
"bvid": "BV1nC4y1879J"
},
{
"id": 839243447,
"type": 2,
"bv_id": "BV1K54y1U77v",
"bvid": "BV1K54y1U77v"
},
{
"id": 329235451,
"type": 2,
"bv_id": "BV13A411e7ad",
"bvid": "BV13A411e7ad"
},
{
"id": 884202228,
"type": 2,
"bv_id": "BV1UK4y1v7K6",
"bvid": "BV1UK4y1v7K6"
},
{
"id": 926710567,
"type": 2,
"bv_id": "BV1BT4y157HK",
"bvid": "BV1BT4y157HK"
},
{
"id": 754200948,
"type": 2,
"bv_id": "BV1qk4y117Uk",
"bvid": "BV1qk4y117Uk"
},
{
"id": 371795957,
"type": 2,
"bv_id": "BV1iZ4y1K7LG",
"bvid": "BV1iZ4y1K7LG"
},
{
"id": 969268280,
"type": 2,
"bv_id": "BV1hp4y1v7mU",
"bvid": "BV1hp4y1v7mU"
},
{
"id": 414281629,
"type": 2,
"bv_id": "BV1xV411U7mm",
"bvid": "BV1xV411U7mm"
},
{
"id": 839319009,
"type": 2,
"bv_id": "BV1t54y1U7hg",
"bvid": "BV1t54y1U7hg"
},
{
"id": 329271769,
"type": 2,
"bv_id": "BV12A411J7JZ",
"bvid": "BV12A411J7JZ"
},
{
"id": 969365400,
"type": 2,
"bv_id": "BV1wp4y1i7U8",
"bvid": "BV1wp4y1i7U8"
},
{
"id": 796831427,
"type": 2,
"bv_id": "BV1yC4y1t7Gb",
"bvid": "BV1yC4y1t7Gb"
},
{
"id": 711972863,
"type": 2,
"bv_id": "BV1YD4y1m7FP",
"bvid": "BV1YD4y1m7FP"
},
{
"id": 754414390,
"type": 2,
"bv_id": "BV1Yk4y127YR",
"bvid": "BV1Yk4y127YR"
},
{
"id": 839478683,
"type": 2,
"bv_id": "BV1i54y127uw",
"bvid": "BV1i54y127uw"
},
{
"id": 499448381,
"type": 2,
"bv_id": "BV19K411N7KE",
"bvid": "BV19K411N7KE"
},
{
"id": 926919797,
"type": 2,
"bv_id": "BV1QT4y1L7Bb",
"bvid": "BV1QT4y1L7Bb"
}
]
}
```
</details>

316
docs/garb/color.md Normal file
View File

@@ -0,0 +1,316 @@
# 主题色
- [获取主题色基本信息1](#获取主题色基本信息1)
- [获取主题色基本信息2](#获取主题色基本信息2)
---
## 获取主题色基本信息1
> https://club.bilibili.com/api/query.skin.list.do
*请求方式GET*
鉴权方式appkey
认证方式仅可APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| appkey | str | APP密钥 | APP方式必要 | |
| build | num | 版本 | APP方式必要 | 可为`6082000` |
| sign | str | APP签名 | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ----- | ------------ | ---------------------------------------------------- |
| ts | num | 当前时间戳 | |
| code | num | 返回值 | 0成功<br />-3API校验密匙错误<br />-400请求错误 |
| data | array | 主题颜色列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | obj | 主题颜色1 | |
| n | obj | 主题颜色(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------ | ------------------------------- |
| id | num | 颜色id | |
| name | str | 颜色名称 | |
| is_free | bool | 是否免费 | false收费<br />true免费 |
| price | num | 价格 | 单位为硬币 |
| is_bought | bool | 是否已购买 | false未购买<br />true已购买 |
| status | num | 状态 | 1自动续费<br />4已退订 |
| buy_time | num | 购买时间 | 毫秒时间戳 |
| due_time | num | 到期时间 | 毫秒时间戳 |
| color_name | str | 颜色类型名称 | |
| is_overdue | bool | 是否已到期 | false未到期<br />true已到期 |
**示例:**
```shell
curl -G 'https://club.bilibili.com/api/query.skin.list.do' \
--data-urlencode 'access_key=xxx' \
--data-urlencode 'appkey=1d8b6e7d45233436' \
--data-urlencode 'build=6082000' \
--data-urlencode 'sign=2d37f2cd6f86337a6a07cb3cf311be86'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"ts": 1599225638239,
"code": 0,
"data": [
{
"id": 2,
"name": "少女粉",
"is_free": true,
"price": 0,
"is_bought": false,
"color_name": "pink",
"is_overdue": false
},
{
"id": 1,
"name": "夜间模式",
"is_free": true,
"price": 0,
"is_bought": false,
"color_name": "black",
"is_overdue": false
},
{
"id": 3,
"name": "姨妈红",
"is_free": false,
"price": 5,
"is_bought": false,
"color_name": "red",
"is_overdue": false
},
{
"id": 4,
"name": "咸蛋黄",
"is_free": false,
"price": 5,
"is_bought": false,
"color_name": "yellow",
"is_overdue": false
},
{
"id": 5,
"name": "早苗绿",
"is_free": false,
"price": 5,
"is_bought": false,
"status": 4,
"buy_time": 1599219782000,
"due_time": 1601811782000,
"color_name": "green",
"is_overdue": false
},
{
"id": 6,
"name": "胖次蓝",
"is_free": false,
"price": 5,
"is_bought": false,
"color_name": "blue",
"is_overdue": false
},
{
"id": 7,
"name": "基佬紫",
"is_free": false,
"price": 5,
"is_bought": false,
"color_name": "purple",
"is_overdue": false
}
]
}
```
</details>
## 获取主题色基本信息2
> https://api.bilibili.com/x/garb/skin/color/list
*请求方式GET*
认证方式仅可Cookie
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | ------------- |
| mobi_app | str | 平台标识 | 非必要 | 可为`android` |
| build | num | 版本 | 非必要 | 可为`6082000` |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | ------------ | ---------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-3API校验密匙错误<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| data | array | 主题颜色列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | obj | 主题颜色1 | |
| n | obj | 主题颜色(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------ | ------------------------------- |
| id | num | 颜色id | |
| name | str | 颜色名称 | |
| is_free | bool | 是否免费 | false收费<br />true免费 |
| price | num | 价格 | 单位为硬币 |
| is_bought | bool | 是否已购买 | false未购买<br />true已购买 |
| status | num | 状态 | 1自动续费<br />4已退订 |
| buy_time | num | 购买时间 | 毫秒时间戳 |
| due_time | num | 到期时间 | 毫秒时间戳 |
| color_name | str | 颜色类型名称 | |
| is_overdue | bool | 是否已到期 | false未到期<br />true已到期 |
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/garb/skin/color/list' \
--data-urlencode 'mobi_app=android' \
--data-urlencode 'build=6082000' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"id": 8,
"name": "简洁白",
"is_free": true,
"price": 0,
"is_bought": false,
"status": 0,
"buy_time": 0,
"due_time": 0,
"color_name": "white",
"is_overdue": false
},
{
"id": 2,
"name": "少女粉",
"is_free": true,
"price": 0,
"is_bought": false,
"status": 0,
"buy_time": 0,
"due_time": 0,
"color_name": "pink",
"is_overdue": false
},
{
"id": 1,
"name": "夜间模式",
"is_free": true,
"price": 0,
"is_bought": false,
"status": 0,
"buy_time": 0,
"due_time": 0,
"color_name": "black",
"is_overdue": false
},
{
"id": 3,
"name": "姨妈红",
"is_free": false,
"price": 5,
"is_bought": false,
"status": 0,
"buy_time": 0,
"due_time": 0,
"color_name": "red",
"is_overdue": false
},
{
"id": 4,
"name": "咸蛋黄",
"is_free": false,
"price": 5,
"is_bought": false,
"status": 0,
"buy_time": 0,
"due_time": 0,
"color_name": "yellow",
"is_overdue": false
},
{
"id": 5,
"name": "早苗绿",
"is_free": false,
"price": 5,
"is_bought": false,
"status": 4,
"buy_time": 1599219782000,
"due_time": 1601811782000,
"color_name": "green",
"is_overdue": false
},
{
"id": 6,
"name": "胖次蓝",
"is_free": false,
"price": 5,
"is_bought": false,
"status": 0,
"buy_time": 0,
"due_time": 0,
"color_name": "blue",
"is_overdue": false
},
{
"id": 7,
"name": "基佬紫",
"is_free": false,
"price": 5,
"is_bought": false,
"status": 0,
"buy_time": 0,
"due_time": 0,
"color_name": "purple",
"is_overdue": false
}
]
}
```
</details>

272
docs/garb/skin.md Normal file
View File

@@ -0,0 +1,272 @@
# APP主题
- [获取主题及加载动画](#获取主题及加载动画)
- [主题包结构](#主题包结构)
---
## 获取主题及加载动画
> https://app.bilibili.com/x/resource/show/skin
*请求方式GET*
鉴权方式appkey
认证方式仅可APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| appkey | str | APP密钥 | APP方式必要 | |
| build | num | 版本 | APP方式必要 | 可为`6082000` |
| ts | num | 当前时间戳 | APP方式必要 | 可为`0` |
| sign | str | APP签名 | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-3API校验密匙错误<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ----- | ------------ | ------------ |
| user_equip | obj | 个性主题信息 | 有效时有此项 |
| skin_colors | array | 主题颜色列表 | |
| load_equip | obj | 加载动画信息 | 有效时有此项 |
`data`中的`user_equip`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | --------------- | ------ |
| id | num | 装扮id | |
| name | str | 装扮名称 | |
| preview | str | 装扮封面url | |
| ver | num | 装扮版本 | 时间戳 |
| package_url | str | 装扮包url | |
| package_md5 | str | 装扮包md5校验值 | |
| data | obj | 装扮配置 | |
`user_equip`中的`data`对象:
| 字段 | 类型 | 内容 | 必要性 | 备注 |
| ------------------- | ---- | ----------------- | -------- | --------------------------- |
| color_mode | str | 颜色模式 | 必要 | light亮色<br />dark暗色 |
| color | str | 前景色? | 必要 | 颜色<br />1. 使用十六进制颜色值<br />2. 颜色值的大小写不限,下同<br />3. 例:#ffffff |
| color_second_page | str | 背景色? | 必要 | 颜色 |
| tail_color | str | 底边栏颜色 | 必要 | 颜色 |
| tail_color_selected | str | 底边栏颜色(选择时) | 必要 | 颜色 |
| tail_icon_ani | bool | 有无底边栏动画 | 必要 | false<br />true有 |
| tail_icon_ani_mode | str | 底边栏动画循环播放 | 必要 | once播放一次 |
| head_myself_mp4_play| str | 我的页面头图(视频)循环 | 必要 | once播放一次<br />loop循环播放 |
| tail_icon_mode | str | 底栏改图标或改颜色 | 必要 | img图标<br />color颜色 |
| side_bg_color | str | 侧边栏颜色 | 非必要 | 颜色<br />5.x 版本客户端的侧边栏 |
| side_line_color | str | 侧边栏线条颜色? | 非必要 | 颜色<br />5.x 版本客户端的侧边栏 |
| tail_icon_color | str | 底栏图标颜色 | 可能必要 | 颜色<br />若 tail_icon_mode = "color",则必要 |
| tail_icon_color_dark| str | 底栏图标颜色(夜间模式) | 可能必要 | 颜色<br />若 tail_icon_mode = "color",则必要 |
| tail_icon_color_selected| str | 底栏图标颜色(选择时) | 可能必要 | 颜色<br />若 tail_icon_mode = "color",则必要 |
| tail_icon_color_selected_dark| str | 底栏图标颜色(选择时)(夜间模式) | 可能必要 | 颜色<br />若 tail_icon_mode = "color",则必要 |
`skin_colors`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | obj | 主题颜色1 | |
| n | obj | 主题颜色(n+1) | |
| …… | obj | …… | …… |
`skin_colors`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------ | ------------------------------- |
| id | num | 颜色id | |
| name | str | 颜色名称 | |
| is_free | bool | 是否免费 | false收费<br />true免费 |
| price | num | 价格 | 单位为硬币 |
| is_bought | bool | 是否已购买 | false未购买<br />true已购买 |
| status | num | 状态 | 1自动续费<br />4已退订 |
| buy_time | num | 购买时间 | 毫秒时间戳 |
| due_time | num | 到期时间 | 毫秒时间戳 |
| color_name | str | 颜色类型名称 | |
| is_overdue | bool | 是否已到期 | false未到期<br />true已到期 |
`data`中的`load_equip`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | --------------- | ------ |
| id | num | 装扮id | |
| name | str | 装扮名称 | |
| ver | num | 装扮版本 | 时间戳 |
| loading_url | str | 加载动画图标url | |
**示例:**
```shell
curl -G 'https://app.bilibili.com/x/resource/show/skin' \
--data-urlencode 'access_key=xxx' \
--data-urlencode 'appkey=1d8b6e7d45233436' \
--data-urlencode 'build=6082000' \
--data-urlencode 'ts=0' \
--data-urlencode 'sign=ea212fea5b00a6278ea6d9938b4c500e'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"user_equip": {
"id": 2529,
"name": "初音未来-日版",
"preview": "http://i0.hdslb.com/bfs/garb/item/2fa16380b31b3cee6c889d645f2699de8e9d9faf.jpg",
"ver": 1598600025,
"package_url": "http://i0.hdslb.com/bfs/garb/zip/9c393edea0c7b7b59685a20cd655363ef573a325.zip",
"package_md5": "7b6d20d998ad543c6a275948a6a1a5fe",
"data": {
"color_mode": "light",
"color": "#212121",
"color_second_page": "#fff2d2",
"side_bg_color": "#ffe7ae",
"tail_color": "#996c00",
"tail_color_selected": "#0d6872",
"tail_icon_ani": true,
"tail_icon_ani_mode": "once"
}
},
"skin_colors": [
{
"id": 2,
"name": "少女粉",
"is_free": true,
"color_name": "pink"
},
{
"id": 1,
"name": "夜间模式",
"is_free": true,
"color_name": "black"
},
{
"id": 3,
"name": "姨妈红",
"price": 5,
"color_name": "red"
},
{
"id": 4,
"name": "咸蛋黄",
"price": 5,
"color_name": "yellow"
},
{
"id": 5,
"name": "早苗绿",
"price": 5,
"status": 4,
"buy_time": 1599219782000,
"due_time": 1601811782000,
"color_name": "green"
},
{
"id": 6,
"name": "胖次蓝",
"price": 5,
"color_name": "blue"
},
{
"id": 7,
"name": "基佬紫",
"price": 5,
"color_name": "purple"
}
],
"load_equip": {
"id": 2531,
"name": "初音未来13周年",
"ver": 1598602035,
"loading_url": "http://i0.hdslb.com/bfs/garb/item/9b12e8b5cc16a4c2e71e91c43796f09d5e132847.webp"
}
}
}
```
</details>
## 主题包结构
主题包为app端付费主题套装的整合包以zip格式通过url分发
包内的图片文件为app对应的资源替换替换时可随意修改后缀 jpg 或 png
必要性head_bg 及 head_tab_bg 为必要,其他非必要
| 文件名 | 说明 |
| --------------------------------- | -------------------------- |
| head_bg.jpg | 首页顶部栏背景 |
| head_tab_bg.jpg | 顶部栏背景 |
| head_myself_bg.jpg | 【我的】页面头图(小) |
| head_myself_squared_bg.jpg | 【我的】页面头图(大) |
| head_myself_mp4_bg.mp4 | 【我的】页面头图(视频)<br />格式参考:后缀必须 mp4、分辨率 1242 x 1074、60 FPS、去掉音轨(音频) |
| side_bg.jpg | 侧边栏背景 |
| side_bg_bottom.jpg | 侧边栏底部背景 |
| tail_bg.png | 底部栏背景 |
| tail_icon_main.png | 【首页】按钮 |
| tail_icon_channel.png | 【频道】按钮 |
| tail_icon_dynamic.png | 【动态】按钮 |
| tail_icon_shop.png | 【会员购】按钮 |
| tail_icon_myself.png | 【我的】按钮 |
| tail_icon_pub_btn_bg.png | 【发布】按钮 |
| tail_icon_selected_main.png | 【首页】按钮(选中状态) |
| tail_icon_selected_channel.png | 【频道】按钮(选中状态) |
| tail_icon_selected_dynamic.png | 【动态】按钮(选中状态) |
| tail_icon_selected_shop.png | 【会员购】按钮(选中状态) |
| tail_icon_selected_myself.png | 【我的】按钮(选中状态) |
| tail_icon_selected_pub_btn_bg.png | 【发布】按钮(选中状态) |
`id=2529初音未来-日版)`的资源为例
```shell
wget https://i0.hdslb.com/bfs/garb/zip/9c393edea0c7b7b59685a20cd655363ef573a325.zip
unzip -l 9c393edea0c7b7b59685a20cd655363ef573a325.zip
```
返回为
```
Archive: 9c393edea0c7b7b59685a20cd655363ef573a325.zip
Length Date Time Name
--------- ---------- ----- ----
22995 1980-00-00 00:00 tail_icon_selected_myself.png
18444 1980-00-00 00:00 head_bg.jpg
3061 1980-00-00 00:00 head_tab_bg.jpg
188898 1980-00-00 00:00 side_bg.jpg
2842 1980-00-00 00:00 side_bg_bottom.jpg
203134 1980-00-00 00:00 tail_bg.png
27539 1980-00-00 00:00 tail_icon_main.png
25632 1980-00-00 00:00 tail_icon_selected_main.png
27415 1980-00-00 00:00 tail_icon_selected_channel.png
191706 1980-00-00 00:00 head_myself_squared_bg.jpg
27919 1980-00-00 00:00 tail_icon_channel.png
27262 1980-00-00 00:00 tail_icon_selected_dynamic.png
147738 1980-00-00 00:00 head_myself_bg.jpg
28182 1980-00-00 00:00 tail_icon_dynamic.png
25878 1980-00-00 00:00 tail_icon_shop.png
26487 1980-00-00 00:00 tail_icon_selected_shop.png
21831 1980-00-00 00:00 tail_icon_myself.png
--------- -------
1016963 17 files
```

View File

@@ -0,0 +1,850 @@
# 历史记录
- [获取历史记录列表_web端](#获取历史记录列表_web端)
- [获取视频观看历史记录_web端旧版](#获取视频观看历史记录_旧版)
- [删除历史记录](#删除历史记录)
- [清空历史记录](#清空历史记录)
- [停用历史记录](#停用历史记录)
- [查询历史记录停用状态](#查询历史记录停用状态)
---
## 获取历史记录列表_web端
>https://api.bilibili.com/x/web-interface/history/cursor
*请求方式GET*
认证方式Cookie (SESSDATA)
注:`max``business``view_at`参数用于历史记录列表的 IFS (无限滚动),其用法类似链表的 next 指针
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ |
| max | num | 历史记录截止目标 id | 非必要 | 默认为 0<br />稿件:稿件 avid<br />剧集(番剧 / 影视):剧集 ssid<br />直播:直播间 id<br />文集:文集 rlid<br />文章:文章 cvid |
| business | str | 历史记录截止目标业务类型 | 非必要 | 默认为空<br />archive稿件<br />pgc剧集番剧 / 影视)<br />live直播<br />article-list文集<br />article文章 |
| view_at | num | 历史记录截止时间 | 非必要 | 时间戳<br />默认为 0<br />0 为当前时间 |
| type | str | 历史记录分类筛选 | 非必要 | all全部类型默认<br />archive稿件<br />live直播<br />article文章 |
| ps | num | 每页项数 | 非必要 | 默认为 20最大 30 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | ------------ | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为 0 |
| ttl | num | 1 | |
| data | array | 历史记录列表 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ----- | ---------------- | ---- |
| cursor | obj | 历史记录页面信息 | |
| tab | array | 历史记录筛选类型 | |
| list | array | 分段历史记录列表 | |
`data`中的`cursor`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------------- | -------------- |
| max | num | 最后一项目标 id | **见请求参数** |
| view_at | num | 最后一项时间节点 | 时间戳 |
| business | str | 最后一项业务类型 | **见请求参数** |
| ps | num | 每页项数 | |
`data`中的`tab`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------ | ---- |
| 0 | obj | 历史记录筛选类型 1 | |
| 1 | obj | 历史记录筛选类型 2 | |
| 2 | obj | 历史记录筛选类型 3 | |
`tab`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ------ | ---- |
| type | str | 类型 | |
| name | str | 类型名 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------- | ---------------- |
| 0 | obj | 历史记录 1 | |
| n | obj | 历史记录 (n+1) | 按照查看顺序排列 |
| …… | obj | | |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ------------------------------- | ------------------------ | ---------------------------------------- |
| title | str | 条目标题 | |
| long_title | str | 条目副标题 | |
| cover | str | 条目封面图 url | 用于专栏以外的条目 |
| covers | 有效时array<br />无效时null | 条目封面图组 | 仅用于专栏 |
| uri | str | 重定向 url | 仅用于剧集和直播 |
| history | obj | 条目详细信息 | |
| videos | num | 视频分 P 数目 | 仅用于稿件视频 |
| author_name | str | UP 主昵称 | |
| author_face | str | UP 主头像 url | |
| author_mid | num | UP 主 mid | |
| view_at | num | 查看时间 | 时间戳 |
| progress | num | 视频观看进度 | 单位为秒<br />用于稿件视频或剧集 |
| badge | str | 角标文案 | 稿件视频 / 剧集 / 笔记 |
| show_title | str | 分 P 标题 | 用于稿件视频或剧集 |
| duration | num | 视频总时长 | 用于稿件视频或剧集 |
| current | str | (?) | |
| total | num | 总计分集数 | 仅用于剧集 |
| new_desc | str | 最新一话 / 最新一 P 标识 | 用于稿件视频或剧集 |
| is_finish | num | 是否已完结 | 仅用于剧集<br />0未完结<br />1已完结 |
| is_fav | num | 是否收藏 | 0未收藏<br />1已收藏 |
| kid | num | 条目目标 id | **详细内容见参数** |
| tag_name | str | 子分区名 | 用于稿件视频和直播 |
| live_status | num | 直播状态 | 仅用于直播<br />0未开播<br />1已开播 |
`list`数组中的对象中的`covers`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------- | ---- |
| 0 | str | 封面图片 1 | |
| n | str | 封面图片 (n+1) | |
| …… | str | …… | |
`list`数组中的对象中的`history`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | --------------------- | ------------------------------------------------------------ |
| oid | num | 目标id | 稿件视频&剧集(当`business=archive``business=pgc`稿件avid<br />直播(当`business=live`直播间id<br />文章(当`business=article`文章cvid<br />文集(当`business=article-list`文集rlid |
| epid | num | 剧集epid | 仅用于剧集 |
| bvid | str | 稿件bvid | 仅用于稿件视频 |
| page | num | 观看到的视频分P数 | 仅用于稿件视频 |
| cid | num | 观看到的对象id | 稿件视频&剧集(当`business=archive``business=pgc`视频cid<br />文集(当`business=article-list`文章cvid |
| part | str | 观看到的视频分 P 标题 | 仅用于稿件视频 |
| business | str | 业务类型 | **见请求参数** |
| dt | num | 记录查看的平台代码 | 1 3 5 7手机端<br />2web端<br />4 6pad端<br />33TV端<br />0其他 |
**示例:**
获取当前时间截止的5条历史记录
```shell
curl -G 'https://api.bilibili.com/x/web-interface/history/cursor' \
--data-urlencode 'ps=5' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"cursor": {
"max": 26193,
"view_at": 1592985807,
"business": "pgc",
"ps": 5
},
"tab": [
{
"type": "archive",
"name": "视频"
},
{
"type": "live",
"name": "直播"
},
{
"type": "article",
"name": "专栏"
}
],
"list": [
{
"title": "韩国漫画如何出海掘金一年出口额2.8亿元",
"long_title": "",
"cover": "",
"covers": [
"https://i0.hdslb.com/bfs/article/b170c6fd7429ae205d6cb935e1d431710d82609d.jpg"
],
"uri": "",
"history": {
"oid": 6470274,
"epid": 0,
"bvid": "",
"page": 0,
"cid": 0,
"part": "",
"business": "article",
"dt": 2
},
"videos": 0,
"author_name": "三文娱",
"author_face": "http://i1.hdslb.com/bfs/face/98566839756a8e3de6e183109984b032de6ff2d9.jpg",
"author_mid": 34772409,
"view_at": 1593000539,
"progress": 0,
"badge": "专栏",
"show_title": "",
"duration": 0,
"current": "",
"total": 0,
"new_desc": "",
"is_finish": 0,
"is_fav": 0,
"kid": 6470274,
"tag_name": "",
"live_status": 0
},
{
"title": "从国际空间站俯瞰地球,静谧蓝星守护者",
"long_title": "",
"cover": "http://i0.hdslb.com/bfs/live/new_room_cover/f07d8a0c7c5655f81cf1586903a121f2680cf3bc.jpg",
"covers": null,
"uri": "https://live.bilibili.com/14047",
"history": {
"oid": 14047,
"epid": 0,
"bvid": "",
"page": 0,
"cid": 0,
"part": "",
"business": "live",
"dt": 2
},
"videos": 0,
"author_name": "Zelo-Balance",
"author_face": "http://i1.hdslb.com/bfs/face/7303b3032d1e13ca7c788cd9c30d4430f8ffd1ea.jpg",
"author_mid": 19193,
"view_at": 1592999822,
"progress": 0,
"badge": "直播中",
"show_title": "",
"duration": 0,
"current": "",
"total": 0,
"new_desc": "",
"is_finish": 0,
"is_fav": 0,
"kid": 14047,
"tag_name": "户外",
"live_status": 1
},
{
"title": "许巍 《蓝莲花》吉他Cover这回你们不用截图抓我了吧",
"long_title": "",
"cover": "http://i2.hdslb.com/bfs/archive/0225b1f1a790393097ceebb51e89796be806d6bc.jpg",
"covers": null,
"uri": "",
"history": {
"oid": 883617049,
"epid": 0,
"bvid": "BV1sK4y147ob",
"page": 1,
"cid": 205017957,
"part": "许巍 《蓝莲花》 Cover_1",
"business": "archive",
"dt": 2
},
"videos": 1,
"author_name": "硬核拆解",
"author_face": "http://i1.hdslb.com/bfs/face/4e131c9609299303cdde882792fc62b9f99cdcde.jpg",
"author_mid": 427494870,
"view_at": 1592999572,
"progress": 13,
"badge": "",
"show_title": "",
"duration": 91,
"current": "",
"total": 0,
"new_desc": "",
"is_finish": 0,
"is_fav": 0,
"kid": 883617049,
"tag_name": "演奏",
"live_status": 0
},
{
"title": "从清楚与混沌之分看Vtuber形象塑造",
"long_title": "",
"cover": "",
"covers": [
"https://i0.hdslb.com/bfs/article/5ddb94dd1890c639622717c7083fb2917b4aa475.jpg"
],
"uri": "",
"history": {
"oid": 268656,
"epid": 0,
"bvid": "",
"page": 0,
"cid": 6233590,
"part": "",
"business": "article-list",
"dt": 2
},
"videos": 0,
"author_name": "普天一光",
"author_face": "http://i2.hdslb.com/bfs/face/3702810bdac3d5103d684e61dc5bc8492a74f904.jpg",
"author_mid": 6614889,
"view_at": 1592998686,
"progress": 0,
"badge": "专栏",
"show_title": "",
"duration": 0,
"current": "",
"total": 0,
"new_desc": "",
"is_finish": 0,
"is_fav": 0,
"kid": 268656,
"tag_name": "",
"live_status": 0
},
{
"title": "百妖谱",
"long_title": "庆忌(下)",
"cover": "http://i0.hdslb.com/bfs/archive/695a4566d05620a24c51d6eb935fa4767d673b45.jpg",
"covers": null,
"uri": "https://www.bilibili.com/bangumi/play/ss26193",
"history": {
"oid": 370908663,
"epid": 326789,
"bvid": "",
"page": 0,
"cid": 199204975,
"part": "",
"business": "pgc",
"dt": 3
},
"videos": 0,
"author_name": "",
"author_face": "",
"author_mid": 0,
"view_at": 1592985807,
"progress": 533,
"badge": "国创",
"show_title": "第8话 庆忌(下)",
"duration": 1402,
"current": "",
"total": 12,
"new_desc": "更新至第10话",
"is_finish": 0,
"is_fav": 0,
"kid": 26193,
"tag_name": "",
"live_status": 0
}
]
}
}
```
</details>
## 获取视频观看历史记录_web端旧版
> https://api.bilibili.com/x/v2/history
*请求方式GET*
认证方式Cookie (SESSDATA)
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ------- |
| pn | num | 页码 | 非必要 | 默认为1 |
| ps | num | 每页项数 | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | ------------ | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | array | 历史记录列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ------------------------------------------ |
| 0 | obj | 历史观看1 | |
| n | obj | 历史观看(n+1) | 按照观看顺序排列<br />项数为总计观看视频数 |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------------------- | ------- | ------------------------------ | ------------------------------------------------------------ |
| aid | num | 稿件avid | |
| videos | num | 视频分P总数 | 默认为1 |
| tid | num | 分区tid | |
| tname | str | 子分区名称 | |
| copyright | num | 是否转载 | 1原创<br />2转载 |
| pic | str | 视频封面图片url | |
| title | str | 稿件标题 | |
| pubdate | num | 稿件发布时间 | 时间戳 |
| ctime | num | 用户提交稿件的时间 | 时间戳 |
| desc | str | 视频简介 | |
| state | num | 视频状态 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`state`备注 |
| ~~attribute~~(仅做历史性保留) | ~~num~~ | ~~稿件属性位配置~~ | 本字段已被删除<br />~~略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`attribute`备注~~ |
| duration | num | 视频总计持续时长所有分P | 单位为秒 |
| rights | obj | 视频属性标志 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`rights`对象 |
| owner | obj | 视频UP主信息 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`owner`对象 |
| stat | obj | 视频状态数 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`stat`对象 |
| dynamic | str | 视频同步发布的的动态的文字内容 | 无为空 |
| cid | num | 视频1P cid | |
| dimension | obj | 视频1P分辨率 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`dimension`对象 |
| bangumi | obj | 番剧/影视信息 | 非番剧/影视无此项 |
| cheese | obj | 课程信息 | 非课程无此项 |
| favorite | bool | 是否已收藏 | true已收藏<br />false未收藏 |
| type | num | 视频属性 | 3普通视频<br />4剧集<br />10课程 |
| sub_type | num | 附视频属性 | 0普通视频<br />1番剧<br />2电影<br />3纪录片<br />4国创<br />5电视剧<br />7综艺 |
| device | num | 观看平台代码 | 1 3 5 7手机端<br />2web端<br />4 6pad端<br />33TV端<br />0其他 |
| page | obj | 最后观看的分P信息 | |
| count | num | 分P数 | 非投稿视频无此项 |
| progress | num | 观看进度 | 单位为秒 |
| view_at | num | 观看时间 | 时间戳 |
| kid | num | 稿件avid | |
| business | str | 视频类型标识 | archive用户投稿视频<br />pgc番剧/影视<br />cheese课程 |
| redirect_link | str | 重定向url | |
| bvid | str | 稿件bvid | |
`data`数组中的对象`bangumi`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | --------------- | ------------ |
| cover | str | 番剧封面图片url | |
| ep_id | num | 番剧epid | |
| episode_status | num | | |
| follow | num | 0 | 作用尚不明确 |
| long_title | str | 单集标题 | |
| season | obj | 剧集信息 | |
| title | str | 集数 | |
`bangumi`中的`season`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ---- | ------------ | ---------------------- |
| is_finish | num | 是否完结 | 0连载中<br />1完结 |
| newest_ep_id | num | 最细一话epid | |
| newest_ep_index | str | 最细一话集数 | |
| season_id | num | 番剧ssid | |
| season_status | num | | |
| season_type | num | | |
| title | str | 番剧标题 | |
| total_count | num | 总集数 | |
`data`数组中的对象`cheese`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | --------------- | ---- |
| cover | str | 课程封面图片url | |
| long_title | str | 完整标题 | |
| number | str | 本集数 | |
| season_id | num | 课程ssid | |
| update_info | str | 总集数 | |
**示例:**
查询当前视频历史记录列表
```shell
curl -G 'https://api.bilibili.com/x/v2/history' \
--data-urlencode 'ps=5' \
--data-urlencode 'pn=1' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"aid": 96523832,
"videos": 1,
"tid": 33,
"tname": "连载动画",
"copyright": 2,
"pic": "http://i0.hdslb.com/bfs/archive/dfc29be381565ee041a0ec9cfc7a32f8a63f76cd.jpg",
"title": "【1月】异度侵入 ID:INVADED 12【独家正版】",
"pubdate": 1584289800,
"ctime": 1584289800,
"desc": "#12",
"state": 0,
"attribute": 338688,
"duration": 1481,
"redirect_url": "https://www.bilibili.com/bangumi/play/ep307457",
"rights": {
"bp": 0,
"elec": 0,
"download": 0,
"movie": 0,
"pay": 1,
"hd5": 1,
"no_reprint": 0,
"autoplay": 0,
"ugc_pay": 0,
"is_cooperation": 0,
"ugc_pay_preview": 0,
"no_background": 0
},
"owner": {
"mid": 928123,
"name": "哔哩哔哩番剧",
"face": "http://i1.hdslb.com/bfs/face/7a8412cbacb9fd18f40ddbbf0ad183e45afc1365.jpg"
},
"stat": {
"aid": 96523832,
"view": 4772927,
"danmaku": 108890,
"reply": 48584,
"favorite": 46,
"coin": 61768,
"share": 290,
"now_rank": 0,
"his_rank": 0,
"like": 1241,
"dislike": 0
},
"dynamic": "",
"cid": 164789275,
"dimension": {
"width": 1920,
"height": 1080,
"rotate": 0
},
"favorite": false,
"type": 4,
"sub_type": 1,
"device": 3,
"page": {
"cid": 164789275,
"page": 1,
"from": "vupload",
"part": "ID_INVADED_112.encoded",
"duration": 1481,
"vid": "",
"weblink": "",
"dimension": {
"width": 1920,
"height": 1080,
"rotate": 0
}
},
"bangumi": {
"ep_id": 307457,
"title": "12",
"long_title": "CHANNELED",
"episode_status": 13,
"follow": 0,
"cover": "http://i0.hdslb.com/bfs/archive/dfc29be381565ee041a0ec9cfc7a32f8a63f76cd.jpg",
"season": {
"season_id": 29310,
"title": "异度侵入 ID:INVADED",
"season_status": 13,
"is_finish": 1,
"total_count": 13,
"newest_ep_id": 307774,
"newest_ep_index": "13",
"season_type": 1
}
},
"progress": 277,
"view_at": 1588831600,
"kid": 29310,
"business": "pgc",
"redirect_link": "https://www.bilibili.com/bangumi/play/ep307457",
"bvid": "BV1K7411f7uu"
},
{
"aid": 497899395,
"videos": 1,
"tid": 189,
"tname": "电脑装机",
"copyright": 1,
"pic": "http://i0.hdslb.com/bfs/archive/fd4e0893b234ee729cf15198065eced98367ebfe.jpg",
"title": "600元的2007款iMac如今过时了吗",
"pubdate": 1587727345,
"ctime": 1587708111,
"desc": "苹果东西是真的保值酷睿2现在都还能卖的这么贵。第一次使用4K画质进行拍摄应该比以前清楚一些。如有问题请在评论区指出谢谢",
"state": 0,
"attribute": 16768,
"duration": 389,
"mission_id": 13106,
"rights": {
"bp": 0,
"elec": 0,
"download": 0,
"movie": 0,
"pay": 0,
"hd5": 1,
"no_reprint": 1,
"autoplay": 1,
"ugc_pay": 0,
"is_cooperation": 0,
"ugc_pay_preview": 0,
"no_background": 0
},
"owner": {
"mid": 3391089,
"name": "数字云糕Official",
"face": "http://i2.hdslb.com/bfs/face/238dfbca5dda5de2d5ba95ee4e99804714e2b5e2.jpg"
},
"stat": {
"aid": 497899395,
"view": 23325,
"danmaku": 92,
"reply": 115,
"favorite": 195,
"coin": 132,
"share": 23,
"now_rank": 0,
"his_rank": 0,
"like": 555,
"dislike": 0
},
"dynamic": "#IMAC##APPLE##MAC# 苹果东西是真的保值酷睿2现在都还能卖的这么贵。第一次使用4K画质进行拍摄应该比以前清楚一些。",
"cid": 182570131,
"dimension": {
"width": 1920,
"height": 1080,
"rotate": 0
},
"favorite": false,
"type": 3,
"sub_type": 0,
"device": 3,
"page": {
"cid": 182570131,
"page": 1,
"from": "vupload",
"part": "iMac",
"duration": 389,
"vid": "",
"weblink": "",
"dimension": {
"width": 1920,
"height": 1080,
"rotate": 0
}
},
"count": 1,
"progress": -1,
"view_at": 1588828357,
"kid": 497899395,
"business": "archive",
"redirect_link": "https://www.bilibili.com/video/av497899395",
"bvid": "BV1NK41157EF"
}
]
}
```
</details>
## 删除历史记录
> https://api.bilibili.com/x/v2/history/delete
*请求方式POST*
认证方式Cookie (SESSDATA)
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | --------------------------------------------------- | ------ | ------------------------------------------------------------ |
| kid | str | 删除的目标记录,格式为`{业务类型}_{目标id}`详见备注 | 必要 | 视频archive\_{稿件avid}<br />直播live_{直播间id}<br />专栏article\_{专栏cvid}<br />剧集pgc\_{剧集ssid}<br />文集article-list\_{文集rlid} |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
删除视频`av540580868`的观看历史记录
```shell
curl 'https://api.bilibili.com/x/v2/history/delete' \
--data-urlencode 'kid=archive_540580868' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 清空历史记录
> https://api.bilibili.com/x/v2/history/clear
*请求方式POST*
认证方式Cookie (SESSDATA)
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------------ | ------ | ---- |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
清空历史记录
```shell
curl 'https://api.bilibili.com/x/v2/history/clear' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 停用历史记录
> https://api.bilibili.com/x/v2/history/shadow/set
*请求方式POST*
认证方式Cookie (SESSDATA)
该操作不会影响原有历史记录
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------------ | ------ | -------------------------------------------- |
| switch | bool | 停用开关 | 非必要 | true停用<br />false正常<br />默认为false |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
停用历史记录功能
```shell
curl 'https://api.bilibili.com/x/v2/history/shadow/set' \
--data-urlencode 'switch=true' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 查询历史记录停用状态
> https://api.bilibili.com/x/v2/history/shadow
*请求方式GET*
认证方式Cookie (SESSDATA)
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | bool | 停用状态 | true停用<br />false正常 |
**示例:**
当前状态为未停用视频历史记录
```shell
curl 'https://api.bilibili.com/x/v2/history/shadow' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": false
}
```
</details>

View File

@@ -0,0 +1,470 @@
# 稍后再看
<img src="/imgs/toview.png" width="25" height="20"/>
- [视频添加稍后再看](#视频添加稍后再看)
- [添加频道中所有视频到稍后再看](#添加频道中所有视频到稍后再看)
- [获取稍后再看视频列表](#获取稍后再看视频列表)
- [删除稍后再看视频](#删除稍后再看视频)
- [清空稍后再看视频列表](#清空稍后再看视频列表)
---
## 视频添加稍后再看
>https://api.bilibili.com/x/v2/history/toview/add
*请求方式POST*
认证方式CookieSESSDATA
最多添加100个视频
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------------ | ------------ | ------------------ |
| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 |
| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误<br />90001列表已满<br />90003稿件已经被删除 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
添加视频`av41687433`/`BV1ht41147kj`到稍后再看列表
avid方式
```shell
curl 'https://api.bilibili.com/x/v2/history/toview/add' \
--data-urlencode 'aid=41687433' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
bvid方式
```shell
curl 'https://api.bilibili.com/x/v2/history/toview/add' \
--data-urlencode 'bvid=BV1ht41147kj' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 添加频道中所有视频到稍后再看
> https://space.bilibili.com/ajax/channel/addAllToView
*请求方式POST*
认证方式CookieSESSDATA
鉴权方式Cookie中`DedeUserID``DedeUserID__ckMd5`存在且不为0referer为 `.bilibili.com`域名下
带有转义
超过容量后会截取容量之内的添加
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------------ | ------ | ---- |
| cid | num | 目标频道id | 必要 | |
| mid | num | 目标频道所属的用户mid | 必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | --------------------------- |
| status | bool | 是否成功 | false失败<br />true成功 |
| data | str | 错误信息 | |
**示例:**
添加用户`mid=282994`下的频道`4693`中所有视频到稍后再看
```shell
curl 'https://space.bilibili.com/ajax/channel/addAllToView' \
--data-urlencode 'cid=4693' \
--data-urlencode 'mid=282994' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;'
-e 'https://www.bilibili.com'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"status": true,
"data": "操作成功"
}
```
</details>
## 获取稍后再看视频列表
> https://api.bilibili.com/x/v2/history/toview
*请求方式GET*
认证方式CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | data | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ------ | ---------------- | ---- |
| count | num | 稍后再看视频数 | |
| list | array | 稍后再看视频列表 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---------------------------------------------- |
| 0 | obj | 稍后再看1 | |
| n | obj | 稍后再看(n+1) | 按照添加顺序排列<br />项数为总计稍后再看视频数 |
| …… | obj | …… | …… |
| 99 | obj | 最后一项 | |
`data`中的`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------------------- | ------- | ------------------------------ | ------------------------------------------------------------ |
| aid | num | 稿件avid | |
| videos | num | 稿件分P总数 | 默认为1 |
| tid | num | 分区tid | |
| tname | str | 子分区名称 | |
| copyright | num | 是否转载 | 1原创<br />2转载 |
| pic | str | 稿件封面图片url | |
| title | str | 稿件标题 | |
| pubdate | num | 稿件发布时间 | 时间戳 |
| ctime | num | 用户提交稿件的时间 | 时间戳 |
| desc | str | 视频简介 | |
| state | num | 视频状态 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`state`备注 |
| ~~attribute~~(仅做历史性保留) | ~~num~~ | ~~稿件属性位配置~~ | 本字段已被删除~~略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`attribute`备注~~ |
| duration | num | 稿件总时长所有分P | 单位为秒 |
| rights | obj | 稿件属性标志 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`rights`对象 |
| owner | obj | 稿件UP主信息 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`owner`对象 |
| stat | obj | 稿件状态数 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`stat`对象 |
| dynamic | str | 视频同步发布的的动态的文字内容 | 无为空 |
| dimension | obj | 稿件1P分辨率 | 略,见[获取视频详细信息web端](/video/info.md#获取视频详细信息web端)中的`dimension`对象 |
| count | num | 稿件分P数 | 非投稿视频无此项 |
| cid | num | 视频cid | |
| progress | num | 观看进度时间 | 单位为秒 |
| add_at | num | 添加时间 | 时间戳 |
| bvid | str | 稿件bvid | |
**示例:**
获取稍后再看视频列表
```shell
curl 'https://api.bilibili.com/x/v2/history/toview' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"count": 25,
"list": [
{
"aid": 200333024,
"videos": 1,
"tid": 95,
"tname": "手机平板",
"copyright": 1,
"pic": "http://i1.hdslb.com/bfs/archive/a5e3072e670daec4c01a182aae91c1f85a48001e.jpg",
"title": "【山新】疫情下,配音演员怎么开工录音?",
"pubdate": 1586959137,
"ctime": 1586959137,
"desc": "疫情这段时间,配音演员们是怎么录音的呢=W=",
"state": 0,
"attribute": 16768,
"duration": 218,
"rights": {
"bp": 0,
"elec": 0,
"download": 0,
"movie": 0,
"pay": 0,
"hd5": 1,
"no_reprint": 1,
"autoplay": 1,
"ugc_pay": 0,
"is_cooperation": 0,
"ugc_pay_preview": 0,
"no_background": 0
},
"owner": {
"mid": 14082,
"name": "山新",
"face": "http://i0.hdslb.com/bfs/face/74c82caee6d9eb623e56161ea8ed6d68afabfeae.jpg"
},
"stat": {
"aid": 200333024,
"view": 361123,
"danmaku": 1792,
"reply": 1376,
"favorite": 7571,
"coin": 12129,
"share": 895,
"now_rank": 0,
"his_rank": 0,
"like": 54705,
"dislike": 0
},
"dynamic": "疫情这段时间,配音演员们是怎么录音的呢=W=",
"dimension": {
"width": 3840,
"height": 2160,
"rotate": 0
},
"page": {
"cid": 178808041,
"page": 1,
"from": "vupload",
"part": "无标题",
"duration": 218,
"vid": "",
"weblink": "",
"dimension": {
"width": 3840,
"height": 2160,
"rotate": 0
}
},
"count": 1,
"cid": 178808041,
"progress": 32,
"add_at": 1587041785,
"bvid": "BV1Yz411B7n3"
},
{
"aid": 710350011,
"videos": 1,
"tid": 124,
"tname": "趣味科普人文",
"copyright": 1,
"pic": "http://i0.hdslb.com/bfs/archive/c5b7e7c07a4abf27029c5afb3ab65fee4475b9a9.jpg",
"title": "不花一分钱建立自己的网站!给硬盘里的小姐姐换个新家!",
"pubdate": 1586919626,
"ctime": 1586898238,
"desc": "制作视频不易,你的点赞是对我最大的支持!\nUP主的个人网站https://amdradeonrin.github.io/MIKU/\n视频提到的文件在网站有下载\nGitHub上的网站源码https://github.com/AMDRadeonRin/MIKU",
"state": 0,
"attribute": 16768,
"duration": 169,
"mission_id": 13106,
"rights": {
"bp": 0,
"elec": 0,
"download": 0,
"movie": 0,
"pay": 0,
"hd5": 1,
"no_reprint": 1,
"autoplay": 1,
"ugc_pay": 0,
"is_cooperation": 0,
"ugc_pay_preview": 0,
"no_background": 0
},
"owner": {
"mid": 179757857,
"name": "GTX690战术核显卡导弹",
"face": "http://i2.hdslb.com/bfs/face/2504de8c1eeef22d91bbc45803f6b29afcbb0adf.jpg"
},
"stat": {
"aid": 710350011,
"view": 3293,
"danmaku": 37,
"reply": 117,
"favorite": 355,
"coin": 76,
"share": 11,
"now_rank": 0,
"his_rank": 0,
"like": 325,
"dislike": 0
},
"dynamic": "#网页制作##HTML##网页#给你们科普一下怎么弄网站吧你们也可以考虑整一个XD",
"dimension": {
"width": 1920,
"height": 1080,
"rotate": 0
},
"count": 1,
"cid": 0,
"progress": 0,
"add_at": 1587012410,
"bvid": "BV1LQ4y1T7Xh"
},
…………
]
}
}
```
</details>
## 删除稍后再看视频
> https://api.bilibili.com/x/v2/history/toview/del
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------------ | ------ | ------------------------------------------------------------ |
| viewed | bool | 是否删除所有已观看的视频 | 非必要 | true删除已观看视频<br />false不删除已观看视频<br />默认为false |
| aid | num | 删除的目标记录的avid | 非必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
删除视频`av540580868`的稍后再看记录
```shell
curl 'https://api.bilibili.com/x/v2/history/toview/del' \
--data-urlencode 'aid=540580868' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
删除所有已观看的视频
```shell
curl 'https://api.bilibili.com/x/v2/history/toview/del' \
--data-urlencode 'viewed=true' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 清空稍后再看视频列表
> https://api.bilibili.com/x/v2/history/toview/clear
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------------ | ------ | ---- |
| csrf | num | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
清空稍后再看视频列表
```shell
curl 'https://api.bilibili.com/x/v2/history/toview/clear' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>

971
docs/live/info.md Normal file
View File

@@ -0,0 +1,971 @@
# 直播间基本信息
- [直播间基本信息](#直播间基本信息)
- [获取直播间信息](#获取直播间信息)
- [获取用户对应的直播间状态](#获取用户对应的直播间状态)
- [获取房间页初始化信息](#获取房间页初始化信息)
- [获取主播信息](#获取主播信息)
- [批量查询直播间状态](#批量查询直播间状态)
- [获取直播间信息](#获取直播间信息)
---
## 获取直播间信息
> https://api.live.bilibili.com/room/v1/Room/get_info
*请求方式: GET*
**URL参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|---------|-----|------|-----|-------|
| room_id | num | 直播间号 | 必要 | 可以为短号 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|-----------------|
| code | num | 返回值 | 0成功<br />1不存在 |
| message | str | 错误信息 | |
| msg | str | 错误信息 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|-------------------------|-----------|--------|-----------------------------|
| uid | num | 主播mid | |
| room_id | num | 直播间长号 | |
| short_id | num | 直播间短号 | 为0是无短号 |
| attention | num | 关注数量 | |
| online | num | 观看人数 | |
| is_portrait | bool | 是否竖屏 | |
| description | str | 描述 | |
| live_status | num | 直播状态 | 0未开播<br />1直播中<br />2轮播中 |
| area_id | num | 分区id | |
| parent_area_id | num | 父分区id | |
| parent_area_name | str | 父分区名称 | |
| old_area_id | num | 旧版分区id | |
| background | str | 背景图片链接 | |
| title | str | 标题 | |
| user_cover | str | 封面 | |
| keyframe | str | 关键帧 | 用于网页端悬浮展示 |
| is_strict_room | bool | 未知 | 未知 |
| live_time | str | 直播开始时间 | YYYY-MM-DD HH:mm:ss |
| tags | str | 标签 | ','分隔 |
| is_anchor | num | 未知 | 未知 |
| room_silent_type | str | 禁言状态 | |
| room_silent_level | num | 禁言等级 | |
| room_silent_second | num | 禁言时间 | 单位是秒 |
| area_name | str | 分区名称 | |
| pardants | str | 未知 | 未知 |
| area_pardants | str | 未知 | 未知 |
| hot_words | list(str) | 热词 | |
| hot_words_status | num | 热词状态 | |
| verify | str | 未知 | 未知 |
| new_pendants | obj | 头像框\大v | |
| up_session | str | 未知 | |
| pk_status | num | pk状态 | |
| pk_id | num | pk id | |
| battle_id | num | 未知 | |
| allow_change_area_time | num | | |
| allow_upload_cover_time | num | | |
| studio_info | obj | | |
`new_pendants`对象:
| 字段 | 类型 | 内容 | 备注 |
|--------------|-----|-----|-------------------|
| frame | obj | 头像框 | |
| mobile_frame | obj | 同上 | 手机版, 结构一致, 可能null |
| badge | obj | 大v | |
| mobile_badge | obj | 同上 | 手机版, 结构一致, 可能null |
`frame`对象:
| 字段 | 类型 | 内容 | 备注 |
|--------------|------|--------|-----|
| name | str | 名称 | |
| value | str | 值 | |
| position | num | 位置 | |
| desc | str | 描述 | |
| area | num | 分区 | |
| area_old | num | 旧分区 | |
| bg_color | str | 背景色 | |
| bg_pic | str | 背景图 | |
| use_old_area | bool | 是否旧分区号 | |
`badge`对象:
| 字段 | 类型 | 内容 | 备注 |
|----------|-----|-----|-------------------------------------------|
| name | str | 类型 | v_person: 个人认证(黄) <br> v_company: 企业认证(蓝) |
| position | num | 位置 | |
| value | str | 值 | |
| desc | str | 描述 | |
`studio_info`对象:
| 字段 | 类型 | 内容 | 备注 |
|-------------|-------|-----|-----|
| status | num | | |
| master_list | array | | |
**示例:**
查询直播间`room_id=1`信息
```shell
curl -G 'https://api.live.bilibili.com/room/v1/Room/get_info' \
--data-urlencode 'room_id=1'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "ok",
"message": "ok",
"data": {
"uid": 9617619,
"room_id": 5440,
"short_id": 1,
"attention": 11919499,
"online": 0,
"is_portrait": false,
"description": "欢迎加入bilibili《快乐运动研究社》和B站UP主们一起探讨有关运动的经历感受解决身体和情绪的“疑难杂症”寻找适合自己的运动一起跟练本期我们一起探讨运动健身能缓解社交恐惧吗",
"live_status": 2,
"area_id": 145,
"parent_area_id": 1,
"parent_area_name": "娱乐",
"old_area_id": 6,
"background": "",
"title": "快乐运动研究社",
"user_cover": "https://i0.hdslb.com/bfs/live/new_room_cover/96943b8d106a777a34cf796421bb4254163b30e1.jpg",
"keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe08121926000000005440np0q7a.jpg",
"is_strict_room": false,
"live_time": "0000-00-00 00:00:00",
"tags": "",
"is_anchor": 0,
"room_silent_type": "",
"room_silent_level": 1,
"room_silent_second": 0,
"area_name": "视频聊天",
"pendants": "",
"area_pendants": "",
"hot_words": [
"2333333",
"喂,妖妖零吗",
"红红火火恍恍惚惚",
"FFFFFFFFFF",
"Yooooooo",
"啪啪啪啪啪",
"666666666",
"老司机带带我",
"你为什么这么熟练啊",
"gg",
"prprpr",
"向大佬低头",
"请大家注意弹幕礼仪哦!",
"还有这种操作!",
"囍",
"打call",
"你气不气?",
"队友呢?"
],
"hot_words_status": 0,
"verify": "",
"new_pendants": {
"frame": {
"name": "",
"value": "",
"position": 0,
"desc": "",
"area": 0,
"area_old": 0,
"bg_color": "",
"bg_pic": "",
"use_old_area": false
},
"badge": {
"name": "v_company",
"position": 3,
"value": "",
"desc": "哔哩哔哩直播官方账号"
},
"mobile_frame": {
"name": "",
"value": "",
"position": 0,
"desc": "",
"area": 0,
"area_old": 0,
"bg_color": "",
"bg_pic": "",
"use_old_area": false
},
"mobile_badge": null
},
"up_session": "",
"pk_status": 0,
"pk_id": 0,
"battle_id": 0,
"allow_change_area_time": 0,
"allow_upload_cover_time": 0,
"studio_info": {
"status": 0,
"master_list": []
}
}
}
```
</details>
## 获取用户对应的直播间状态
> https://api.live.bilibili.com/room/v1/Room/getRoomInfoOld
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|-----|-----|---------|-----|-----|
| mid | num | 目标用户mid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|---------------------|
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|----------------|-----|-----------|------------------|
| roomStatus | num | 直播间状态 | 0无房间<br />1有房间 |
| roundStatus | num | 轮播状态 | 0未轮播<br />1轮播 |
| live_status | num | 直播状态 | 0未开播<br />1直播中 |
| url | str | 直播间网页url | |
| title | str | 直播间标题 | |
| cover | str | 直播间封面url | |
| online | num | 直播间人气 | 值为上次直播时刷新 |
| roomid | num | 直播间id短号 | |
| broadcast_type | num | 0 | |
| online_hidden | num | 0 | |
**示例:**
查询用户`mid=322892`的直播间信息
```shell
curl -G 'https://api.live.bilibili.com/room/v1/Room/getRoomInfoOld' \
--data-urlencode 'mid=322892'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"roomStatus": 1,
"roundStatus": 0,
"live_status": 1,
"url": "https://live.bilibili.com/5441",
"title": "好久没当黑铁主播了",
"cover": "http://i0.hdslb.com/bfs/live/room_cover/833f7ff506bac17c06010e8834922993657505b2.jpg",
"online": 268602,
"roomid": 5441,
"broadcast_type": 0,
"online_hidden": 0
}
}
```
</details>
## 获取房间页初始化信息
> https://api.live.bilibili.com/room/v1/Room/room_init
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|-----|-----|------------|-----|-----|
| id | num | 目标直播间号(短号) | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|------------------------|
| code | num | 返回值 | 0成功<br />60004直播间不存在 |
| msg | str | 错误信息 | 默认为ok |
| message | str | 错误信息 | 默认为ok |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|--------------|------|--------------|------------------------------------|
| room_id | num | 直播间真实id | |
| short_id | num | 直播间id短号 | |
| uid | num | 主播用户mid | |
| need_p2p | num | 是否p2p | |
| is_hidden | bool | 是否隐藏 | |
| is_locked | bool | 是否锁定 | |
| is_portrait | bool | 是否竖屏 | |
| live_status | num | 直播状态 | 0未开播<br />1直播中<br />2轮播中 |
| hidden_till | num | 隐藏时间戳 | |
| lock_till | num | 锁定时间戳 | |
| encrypted | bool | 是否加密 | |
| pwd_verified | bool | 加密房间是否通过密码验证 | `encrypted`=true时才有意义 |
| live_time | num | 开播时间 | 未开播时为`-62170012800` |
| room_shield | num | 未知 | |
| is_sp | num | 是否为特殊直播间 | 0普通直播间<br />1付费直播间 |
| special_type | num | 特殊直播间标志 | 0普通直播间<br />1付费直播间<br />2拜年祭直播间 |
**示例:**
查询直播间`id=76`的直播间信息
```shell
curl -G 'https://api.live.bilibili.com/room/v1/Room/room_init' \
--data-urlencode 'id=76'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "ok",
"message": "ok",
"data": {
"room_id": 14073662,
"short_id": 76,
"uid": 50333369,
"need_p2p": 0,
"is_hidden": false,
"is_locked": false,
"is_portrait": false,
"live_status": 1,
"hidden_till": 0,
"lock_till": 0,
"encrypted": false,
"pwd_verified": false,
"live_time": 1602151186,
"room_shield": 1,
"is_sp": 0,
"special_type": 0
}
}
```
</details>
## 获取主播信息
> https://api.live.bilibili.com/live_user/v1/Master/info
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|-----|-----|---------|-----|-----|
| uid | num | 目标用户mid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|------------------|
| code | num | 返回值 | 0成功<br />1参数错误 |
| msg | str | 错误信息 | 默认为空 |
| message | str | 错误信息 | 默认为空 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|----------------|-----|-----------|------------|
| info | obj | 主播信息 | |
| exp | obj | 经验等级 | |
| follower_num | num | 主播粉丝数 | |
| room_id | num | 直播间id短号 | |
| medal_name | str | 粉丝勋章名 | |
| glory_count | num | 主播荣誉数 | |
| pendant | str | 直播间头像框url | |
| link_group_num | num | 0 | **作用尚不明确** |
| room_news | obj | 主播公告 | |
`info`对象:
| 字段 | 类型 | 内容 | 备注 |
|-----------------|-----|---------|-------------------------|
| uid | num | 主播mid | |
| uname | str | 主播用户名 | |
| face | str | 主播头像url | |
| official_verify | obj | 认证信息 | |
| gender | num | 主播性别 | -1保密<br />0<br />1男 |
`info`中的`official_verify`对象:
| 字段 | 类型 | 内容 | 备注 |
|------|-----|--------|------------------------------|
| type | num | 主播认证类型 | -1<br />0个人认证<br />1机构认证 |
| desc | str | 主播认证信息 | |
`exp`对象:
| 字段 | 类型 | 内容 | 备注 |
|--------------|-----|------|-----|
| master_level | obj | 主播等级 | |
`exp`中的`master_level`对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-------|--------|-----|
| level | num | 当前等级 | |
| color | num | 等级框颜色 | |
| current | array | 当前等级信息 | |
| next | array | 下一等级信息 | |
`master_level`中的`current`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|------|-----|
| 0 | num | 升级积分 | |
| 1 | num | 总积分 | |
`master_level`中的`next`数组:
| 项 | 类型 | 内容 | 备注 |
|-----|-----|------|-----|
| 0 | num | 升级积分 | |
| 1 | num | 总积分 | |
`room_news`对象:
| 字段 | 类型 | 内容 | 备注 |
|------------|-----|------|-----|
| content | str | 公告内容 | |
| ctime | str | 公告时间 | |
| ctime_text | str | 公告日期 | |
**示例:**
查询直播间`mid=76`的主播信息
```shell
curl -G 'https://api.live.bilibili.com/live_user/v1/Master/info' \
--data-urlencode 'uid=2'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"info": {
"uid": 2,
"uname": "碧诗",
"face": "https://i0.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg",
"official_verify": {
"type": 0,
"desc": "bilibili个人认证:bilibili创始人站长"
},
"gender": 1
},
"exp": {
"master_level": {
"level": 30,
"color": 10512625,
"current": [
2870000,
11883810
],
"next": [
3730000,
15613810
]
}
},
"follower_num": 926624,
"room_id": 1024,
"medal_name": "逸国",
"glory_count": 0,
"pendant": "",
"link_group_num": 0,
"room_news": {
"content": "",
"ctime": "",
"ctime_text": ""
}
}
}
```
</details>
## 批量查询直播间状态
> https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids
*请求方式GET/POST*
认证方式:无 (无需添加Cookie)
**url参数 (GET方式)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|--------|-------|------------|-----|-----|
| uids[] | array | 要查询的主播 mid | 必要 | |
**正文参数 (POST方式)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|------|------|------------|-----|-----|
| uids | nums | 要查询的主播 mid | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|-------------------------|
| code | num | 返回值 | 0成功<br />-111csrf校验失败 |
| message | str | 错误信息 | 默认为success |
| msg | str | 错误信息 | 默认为success |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|-----|-----|-------|------------|
| uid | str | 直播间信息 | 实际字段为主播mid |
`uid`对象:
| 字段 | 类型 | 内容 | 备注 |
|---------------------|-----|-----------|------------------------------|
| title | str | 直播间标题 | |
| room_id | num | 直播间房间号 | 直播间实际房间号 |
| uid | num | 主播mid | |
| online | num | 直播间在线人数 | |
| live_time | num | 直播持续时长 | |
| live_status | num | 直播间开播状态 | 0未开播<br />1正在直播<br />2轮播中 |
| short_id | num | 直播间房间号 | 直播间短房间号,常见于签约主播 |
| area | num | 直播间分区id | |
| area_name | str | 直播间分区名 | |
| area_v2_id | num | 直播间新版分区id | |
| area_v2_name | str | 直播间新版分区名 | |
| area_v2_parent_id | num | 直播间父分区id | |
| area_v2_parent_name | str | 直播间父分区名 | |
| uname | str | 主播用户名 | |
| face | str | 主播头像url | |
| tag_name | str | 直播间标签 | |
| tags | str | 直播间自定标签 | |
| cover_from_user | str | 直播间封面url | |
| keyframe | str | 直播间关键帧url | |
| lock_till | str | 直播间封禁信息 | |
| hidden_till | str | 直播间隐藏信息 | |
| broadcast_type | num | 直播类型 | 0:普通直播<br />1手机直播 |
**示例:**
查询用户`mid=672328094的直播间信息
```shell
# GET方式
curl -G 'https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids'
--data-urlencode 'uids[]=672328094'
# POST方式
curl 'https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids' \
-H "Content-Type: application/json" \
-d "{\"uids\": [672328094]}"
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"message": "success",
"data": {
"672328094": {
"title": "【B限】玩个毛线",
"room_id": 22637261,
"uid": 672328094,
"online": 4087370,
"live_time": 0,
"live_status": 2,
"short_id": 0,
"area": 6,
"area_name": "生活娱乐",
"area_v2_id": 371,
"area_v2_name": "虚拟主播",
"area_v2_parent_name": "虚拟主播",
"area_v2_parent_id": 9,
"uname": "嘉然今天吃什么",
"face": "http://i2.hdslb.com/bfs/face/d399d6f5cf7943a996ae96999ba3e6ae2a2988de.jpg",
"tag_name": "日常,学习,萌宠,厨艺,手机直播",
"tags": "",
"cover_from_user": "http://i0.hdslb.com/bfs/live/new_room_cover/f3ed7a782c13086e536ec8bc6e9593bb4918f905.jpg",
"keyframe": "http://i0.hdslb.com/bfs/live-key-frame/keyframe041722000000226372619dr3m8.jpg",
"lock_till": "0000-00-00 00:00:00",
"hidden_till": "0000-00-00 00:00:00",
"broadcast_type": 0
}
}
}
```
</details>
## 清晰度代码
| 代码 | 说明 |
|-------|-----|
| 30000 | 杜比 |
| 20000 | 4K |
| 10000 | 原画 |
| 400 | 蓝光 |
| 250 | 超清 |
| 150 | 高清 |
| 80 | 流畅 |
## 获取直播间信息
> https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo
*请求方式GET*
认证方式:无 (无需添加Cookie)
**url参数 (GET方式)**
| 参数名 | 类型 | 内容 | 必填 | 备注 |
|----------|-----|-------|-----|------------------------------------------------|
| room_id | num | 直播间id | 必要 | |
| protocol | str | 直播协议 | 必要 | 0http_stream<br/>1http_hls<br/>可多选, 使用英文逗号分隔 |
| format | str | 格式 | 必要 | 0flv<br/>1ts<br/>2fmp4<br/>可多选, 使用英文逗号分隔 |
| codec | str | 编码格式 | 必要 | 0AVC<br/>1HEVC<br/>可多选, 使用英文逗号分隔 |
| qn | num | 清晰度编码 | | 默认`150`<br/>[清晰度代码](#清晰度代码) |
| platform | str | `web` | | |
| ptype | num | `8` | | |
| dolby | num | `5` | | |
| panorama | num | `1` | | |
**json回复**
根对象:
| 字段名 | 类型 | 内容 | 备注 |
|---------|-----|------|-----------------------|
| code | num | 响应码 | 0成功<br/>1002002参数错误 |
| message | str | 0 | |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段名 | 类型 | 内容 | 备注 |
|-------------------|-------|-----------|---------------------------|
| room_id | num | 直播间id | |
| short_id | num | 直播间短id | |
| uid | num | 主播uid | |
| is_hidden | bool | 直播间是否被隐藏 | |
| is_locked | bool | 直播间是否被锁定 | |
| is_portrait | bool | 是否竖屏 | |
| live_status | num | 直播状态 | 0未开播<br/>1直播中<br/>2轮播中 |
| hidden_till | num | 隐藏结束时间 | |
| lock_till | num | 封禁结束时间 | 秒级时间戳 |
| encrypted | bool | 直播间为加密直播间 | |
| pwd_verified | bool | 是否通过密码验证 | 当`encrypted`为`true`时才有意义 |
| live_time | num | 本次开播时间 | 秒级时间戳 |
| room_shield | num | | |
| all_special_types | array | | |
| playurl_info | obj | 直播流信息 | |
`playurl_info`对象
| 字段名 | 类型 | 内容 | 备注 |
|-----------|-----|-----|-----|
| conf_json | str | | |
| playurl | obj | | |
`playurl`对象
| 字段名 | 类型 | 内容 | 备注 |
|-----------|-------|-------|-----|
| cid | num | 直播间id | |
| g_qn_desc | array | 清晰度列表 | |
| stream | array | 直播流信息 | |
| p2p_data | obj | | |
| dolby_qn | | | |
`g_qn_desc`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|-----------|-----|-------|-----------------|
| qn | num | 清晰度代码 | [清晰度代码](#清晰度代码) |
| desc | str | 清晰度描述 | |
| hdr_desc | str | | |
| attr_desc | | | |
`stream`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|---------------|-------|------|-----|
| protocol_name | str | 协议名 | |
| format | array | 格式列表 | |
`format`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|-------------|-------|------|-----|
| format_name | str | 格式名 | |
| codec | array | 编码列表 | |
`codec`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|------------|-------|-----------|-----------------|
| codec_name | str | 编码名 | |
| current_qn | num | 当前清晰度编码 | [清晰度代码](#清晰度代码) |
| accept_qn | array | 可用清晰度编码列表 | [清晰度代码](#清晰度代码) |
| base_url | str | 播放源路径 | |
| url_info | array | 域名信息列表 | |
| hdr_qn | null | | |
| dolby_type | num | | |
| attr_name | str | | |
`url_info`数组中的对象
| 字段名 | 类型 | 内容 | 备注 |
|------------|-----|-------|-----|
| host | str | 域名 | |
| extra | str | URL参数 | |
| stream_ttl | num | | |
`p2p_data`对象
| 字段名 | 类型 | 内容 | 备注 |
|-----------|------|-----|-----|
| p2p | bool | | |
| p2p_type | num | | |
| m_p2p | bool | | |
| m_servers | null | | |
**示例:**
查询room_id=3的直播间信息
```shell
curl -L -X GET 'https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=3&protocol=0,1&format=0,1,2&codec=0,1&qn=10000'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"room_id": 23058,
"short_id": 3,
"uid": 11153765,
"is_hidden": false,
"is_locked": false,
"is_portrait": false,
"live_status": 1,
"hidden_till": 0,
"lock_till": 0,
"encrypted": false,
"pwd_verified": true,
"live_time": 1671425336,
"room_shield": 1,
"all_special_types": [],
"playurl_info": {
"conf_json": "{\"cdn_rate\":10000,\"report_interval_sec\":150}",
"playurl": {
"cid": 23058,
"g_qn_desc": [
{
"qn": 30000,
"desc": "杜比",
"hdr_desc": "",
"attr_desc": null
},
{
"qn": 20000,
"desc": "4K",
"hdr_desc": "",
"attr_desc": null
},
{
"qn": 10000,
"desc": "原画",
"hdr_desc": "",
"attr_desc": null
},
{
"qn": 400,
"desc": "蓝光",
"hdr_desc": "HDR",
"attr_desc": null
},
{
"qn": 250,
"desc": "超清",
"hdr_desc": "HDR",
"attr_desc": null
},
{
"qn": 150,
"desc": "高清",
"hdr_desc": "",
"attr_desc": null
},
{
"qn": 80,
"desc": "流畅",
"hdr_desc": "",
"attr_desc": null
}
],
"stream": [
{
"protocol_name": "http_stream",
"format": [
{
"format_name": "flv",
"codec": [
{
"codec_name": "avc",
"current_qn": 10000,
"accept_qn": [
10000,
150
],
"base_url": "/live-bvc/462997/live_11153765_9369560.flv?",
"url_info": [
{
"host": "https://cn-hbcd-cu-02-20.bilivideo.com",
"extra": "expires=1674103815&pt=web&deadline=1674103815&len=0&oi=1963941079&platform=web&qn=10000&trid=1000061f434c07ac4f4184820bfb141e75e8&uipk=100&uipv=100&nbs=1&uparams=cdn,deadline,len,oi,platform,qn,trid,uipk,uipv,nbs&cdn=cn-gotcha01&upsig=f494aa9e92e24943061fe5082494ec44&sk=33541455720f64c7671bc1480acfb176&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-hbcd-cu-02-20&chash=1&sche=ban&score=12&pp=rtmp&machinezone=jd&source=onetier&trace=0&site=92e80b6f3ebfd393e7d1c1e2e648d9c1&order=1",
"stream_ttl": 3600
}
],
"hdr_qn": null,
"dolby_type": 0,
"attr_name": ""
}
]
}
]
},
{
"protocol_name": "http_hls",
"format": [
{
"format_name": "ts",
"codec": [
{
"codec_name": "avc",
"current_qn": 10000,
"accept_qn": [
10000,
150
],
"base_url": "/live-bvc/462997/live_11153765_9369560.m3u8?",
"url_info": [
{
"host": "https://cn-hbcd-cu-02-20.bilivideo.com",
"extra": "expires=1674103815&len=0&oi=1963941079&pt=web&qn=10000&trid=1003061f434c07ac4f4184820bfb141e75e8&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=4f9bcec18e3afdca04b31ffb285ec915&sk=33541455720f64c7671bc1480acfb176&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-hbcd-cu-02-20&chash=1&sche=ban&score=12&pp=rtmp&machinezone=jd&source=onetier&trace=0&site=92e80b6f3ebfd393e7d1c1e2e648d9c1&order=1",
"stream_ttl": 3600
}
],
"hdr_qn": null,
"dolby_type": 0,
"attr_name": ""
}
]
},
{
"format_name": "fmp4",
"codec": [
{
"codec_name": "avc",
"current_qn": 10000,
"accept_qn": [
10000,
150
],
"base_url": "/live-bvc/462997/live_11153765_9369560/index.m3u8?",
"url_info": [
{
"host": "https://cn-hbcd-cu-02-20.bilivideo.com",
"extra": "expires=1674103815&len=0&oi=1963941079&pt=web&qn=10000&trid=1007061f434c07ac4f4184820bfb141e75e8&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=cc57dce528316d8389f2f34e7bd15f5c&sk=a99391b8b4d5779b2e32e41dbc989d2d&flvsk=33541455720f64c7671bc1480acfb176&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-hbcd-cu-02-20&chash=1&sche=ban&bvchls=1&score=12&pp=rtmp&machinezone=jd&source=onetier&trace=0&site=92e80b6f3ebfd393e7d1c1e2e648d9c1&order=1",
"stream_ttl": 3600
},
{
"host": "https://c1--cn-gotcha208.bilivideo.com",
"extra": "expires=1674103815&len=0&oi=1963941079&pt=web&qn=10000&trid=1007061f434c07ac4f4184820bfb141e75e8&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha208&sign=2ff96adf5056c8dbee546955260fc2df&sk=a99391b8b4d5779b2e32e41dbc989d2d&p2p_type=1&src=57345&sl=1&free_type=0&pp=rtmp&machinezone=jd&source=onetier&trace=0&site=92e80b6f3ebfd393e7d1c1e2e648d9c1&order=2",
"stream_ttl": 3600
}
],
"hdr_qn": null,
"dolby_type": 0,
"attr_name": ""
}
]
}
]
}
],
"p2p_data": {
"p2p": true,
"p2p_type": 1,
"m_p2p": false,
"m_servers": null
},
"dolby_qn": null
}
}
}
}
```
</details>

214
docs/live/live_area.md Normal file
View File

@@ -0,0 +1,214 @@
# 直播间分区
- [获取全部直播间分区列表](#获取全部直播间分区列表)
---
## 获取全部直播间分区列表
> https://api.live.bilibili.com/room/v1/Area/getList
*请求方式GET*
直播分区共有两级,分别是父分区和子分区
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | ---------- | ------------- |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | 默认为success |
| message | str | 错误信息 | 默认为success |
| data | array | 父分区列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 父分区1 | |
| n | obj | 父分区(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------- | ---- |
| id | num | 父分区id | |
| name | name | 父分区名 | |
| list | list | 子分区列表 | |
`data`数组中的对象中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 子分区1 | |
| n | obj | 子分区(n+1) | |
| …… | obj | …… | …… |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ----------------- | ---------------- |
| id | str | 子分区id | |
| parent_id | str | 父分区id | |
| old_area_id | str | 旧分区id | |
| name | str | 子分区名 | |
| act_id | str | 0 | **作用尚不明确** |
| pk_status | str | | **作用尚不明确** |
| hot_status | num | 是否为热门分区 | 0<br />1是 |
| lock_status | str | 0 | **作用尚不明确** |
| pic | str | 子分区标志图片url | |
| parent_name | str | 父分区名 | |
| area_type | num | | |
**示例:**
如想在`网游`父分区下的`英雄联盟`分区开播则查到子分区id为`86`
```shell
curl 'https://api.live.bilibili.com/room/v1/Area/getList'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "success",
"message": "success",
"data": [
{
"id": 2,
"name": "网游",
"list": [
{
"id": "86",
"parent_id": "2",
"old_area_id": "4",
"name": "英雄联盟",
"act_id": "0",
"pk_status": "0",
"hot_status": 1,
"lock_status": "0",
"pic": "http://i0.hdslb.com/bfs/vc/dcfb14f14ec83e503147a262e7607858b05d7ac0.png",
"parent_name": "网游",
"area_type": 0
},
{
"id": "252",
"parent_id": "2",
"old_area_id": "3",
"name": "逃离塔科夫",
"act_id": "0",
"pk_status": "0",
"hot_status": 1,
"lock_status": "0",
"pic": "http://i0.hdslb.com/bfs/vc/762a7de3dd5fe8165d1d55b232484a017941592f.png",
"parent_name": "网游",
"area_type": 0
},
{
"id": "80",
"parent_id": "2",
"old_area_id": "1",
"name": "绝地求生",
"act_id": "0",
"pk_status": "0",
"hot_status": 1,
"lock_status": "0",
"pic": "http://i0.hdslb.com/bfs/vc/43ca83fdcd10505eaeef1b76cf8ce642a53b94da.png",
"parent_name": "网游",
"area_type": 0
},
…………
]
},
{
"id": 3,
"name": "手游",
"list": [
{
"id": "35",
"parent_id": "3",
"old_area_id": "12",
"name": "王者荣耀",
"act_id": "0",
"pk_status": "0",
"hot_status": 1,
"lock_status": "0",
"pic": "http://i0.hdslb.com/bfs/vc/0fefa924760b2dd492a12dddafe179bfa1216918.png",
"parent_name": "手游",
"area_type": 0
},
…………
]
},
{
"id": 6,
"name": "单机",
"list": [
{
"id": "236",
"parent_id": "6",
"old_area_id": "1",
"name": "主机游戏",
"act_id": "0",
"pk_status": "0",
"hot_status": 1,
"lock_status": "0",
"pic": "http://i0.hdslb.com/bfs/vc/edb636ee59f902e3134a2790545045bddd70978e.png",
"parent_name": "单机",
"area_type": 0
},
…………
]
},
{
"id": 1,
"name": "娱乐",
"list": [
{
"id": "21",
"parent_id": "1",
"old_area_id": "10",
"name": "视频唱见",
"act_id": "0",
"pk_status": "1",
"hot_status": 1,
"lock_status": "0",
"pic": "http://i0.hdslb.com/bfs/vc/72b93ddafdf63c9f0b626ad546847a3c03c92b6f.png",
"cate_id": "12",
"parent_name": "娱乐",
"area_type": 0
},
…………
]
},
{
"id": 5,
"name": "电台",
"list": [
{
"id": "190",
"parent_id": "5",
"old_area_id": "10",
"name": "唱见电台",
"act_id": "0",
"pk_status": "0",
"hot_status": 0,
"lock_status": "0",
"pic": "http://i0.hdslb.com/bfs/vc/d22d7fafbf9b24e2bc3ce1df5eb9f006e6035e5d.png",
"parent_name": "电台",
"area_type": 0
},
…………
]
}
]
}
```
</details>

160
docs/live/live_stream.md Normal file
View File

@@ -0,0 +1,160 @@
# 直播间视频流
- [根据真实直播间号获取直播视频流](#根据真实直播间号获取直播视频流)
---
## 根据真实直播间号获取直播视频流
> https://api.live.bilibili.com/room/v1/Room/playUrl
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ----------- | ------ | ---- |
| cid | num | 目标真实直播间号 | 必要 | 直播间的`room_id`(非短号) |
| platform | str | 直播流格式 | 非必要 | h5hls方式<br />webhttp-flv方式<br />默认为http-flv方式 |
| quality | num | 画质 | 非必要 | `qn``quality`任选其一<br />2流畅<br />3高清<br />4原画 |
| qn | str | 画质 | 非必要 | `qn``quality`任选其一<br />80流畅<br />150高清<br />400蓝光<br />10000原画<br />200004K<br />30000杜比 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400参数错误<br />19002003房间信息不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | str | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | ------------- | ------------------------ |
| current_quality | num | 当前画质代码`qn` | |
| accept_quality | array | 可选画质数参数 | |
| current_qn | num | 当前画质代码`quality` | |
| quality_description | array | 可选画质参数`quality` | |
| durl | array | 直播流url组 | |
`accept_quality`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | ---- |
| 0 | str | `qn`画质代码1 | |
| n | str | `qn`画质代码(n+1) | |
| …… | str | …… | …… |
`quality_description`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | obj | 画质代码1 | |
| n | obj | 画质代码(n+1) | |
| …… | obj | …… | …… |
`quality_description`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------------- | ---- |
| qn | num | 画质代码 | |
| desc | str | 该代码对应的画质名称 | |
`durl`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 主线服务器 | |
| n | obj | 备线n服务器 | |
| …… | obj | …… | …… |
`durl`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | ------------- | ------------------------ |
| url | str | 直播流url | flv或m3u8格式<br />**注:带有转义** |
| length | num | 0 | 作用尚不明确 |
| order | num | 服务器线路序号 | |
| stream_type | num | 0 | 作用尚不明确 |
| p2p_type | num | 0 | 作用尚不明确 |
**示例:**
查询直播间`cid=14073662`的直播间信息
```shell
curl -G 'https://api.live.bilibili.com/room/v1/Room/playUrl' \
--data-urlencode 'cid=14073662' \
--data-urlencode 'qn=10000' \
--data-urlencode 'platform=web'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"current_quality": 3,
"accept_quality": [
"4",
"3",
"2"
],
"current_qn": 3,
"quality_description": [
{
"qn": 4,
"desc": "原画"
},
{
"qn": 3,
"desc": "高清"
},
{
"qn": 2,
"desc": "流畅"
}
],
"durl": [
{
"url": "https://d1--cn-gotcha04.bilivideo.com/live-bvc/601131/live_14073662_bs_3699814_1500.flv?cdn=cn-gotcha04&expires=1602496530&len=0&oi=1939228219&pt=&qn=150&trid=e6540d81a5d04c2ea459c46ebe77472a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=20e4ac695fbdd1d11d5dac4f93caa783&ptype=0&src=9&sl=1&order=1",
"length": 0,
"order": 1,
"stream_type": 0,
"p2p_type": 0
},
{
"url": "https://d1--cn-gotcha01.bilivideo.com/live-bvc/757951/live_14073662_bs_3699814_1500.flv?cdn=cn-gotcha01&expires=1602496530&len=0&oi=1939228219&pt=&qn=150&trid=e6540d81a5d04c2ea459c46ebe77472a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=9deea67bb9e9c1f0fa3886a34aa09473&ptype=0&src=9&sl=1&order=2",
"length": 0,
"order": 2,
"stream_type": 0,
"p2p_type": 0
},
{
"url": "https://d1--cn-gotcha04.bilivideo.com/live-bvc/982058/live_14073662_bs_3699814_1500.flv?cdn=cn-gotcha04&expires=1602496530&len=0&oi=1939228219&pt=&qn=150&trid=e6540d81a5d04c2ea459c46ebe77472a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=8753b270960034660184d975d86c0161&ptype=0&src=9&sl=1&order=3",
"length": 0,
"order": 3,
"stream_type": 0,
"p2p_type": 0
},
{
"url": "https://d1--cn-gotcha04.bilivideo.com/live-bvc/139554/live_14073662_bs_3699814_1500.flv?cdn=cn-gotcha04&expires=1602496530&len=0&oi=1939228219&pt=&qn=150&trid=e6540d81a5d04c2ea459c46ebe77472a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=cf93474e923c9ba8288c45d954f81045&ptype=0&src=9&sl=1&order=4",
"length": 0,
"order": 4,
"stream_type": 0,
"p2p_type": 0
}
]
}
}
```
</details>

266
docs/live/manage.md Normal file
View File

@@ -0,0 +1,266 @@
# 直播间管理
- [更新直播间标题](#更新直播间标题)
- [开始直播](#开始直播)
- [关闭直播](#关闭直播)
---
## 更新直播间标题
> https://api.live.bilibili.com/room/v1/Room/update
*请求方式POST*
认证方式CookieSESSDATA
鉴权方式Cookie中`bili_jct`的值正确并与`csrf`相同
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------- | ---- | ------------------------ | ------ | -------------------- |
| room_id | num | 直播间id | 必要 | 必须为自己的直播间id |
| title | str | 直播间标题 | 必要 | 最大20字符 |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />65530token错误登录错误<br />1错误 |
| msg | str | 错误信息 | 默认为ok |
| message | str | 错误信息 | 默认为ok |
| data | array | 空 | |
**示例:**
修改直播间`10352053`标题为`测试`
```shell
curl 'https://api.live.bilibili.com/room/v1/Room/update' \
--data-urlencode 'room_id=10352053' \
--data-urlencode 'title=测试' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;bili_jct=xx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "ok",
"message": "ok",
"data": []
}
```
</details>
## 开始直播
> https://api.live.bilibili.com/room/v1/Room/startLive
*请求方式POST*
认证方式CookieSESSDATA
鉴权方式Cookie中`bili_jct`的值正确并与`csrf`相同
开播时必须有分区选择,开播后返回推流地址
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ----------------------------------- |
| room_id | num | 直播间id | 必要 | 必须为自己的直播间id |
| area_v2 | num | 直播分区id子分区id | 必要 | 详见[直播分区](live_area.md) |
| platform | str | 直播平台 | 必要 | web端<br />bililinkandroid_link |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />65530token错误登录错误<br />1错误<br />60009分区不存在<br />**(其他错误码有待补充)** |
| msg | str | 错误信息 | 默认为空 |
| message | str | 错误信息 | 默认为空 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ---------------- | ---------------------- |
| change | num | 是否改变状态 | 0未改变<br />1改变 |
| status | str | LIVE | |
| room_type | num | 0 | 作用尚不明确 |
| rtmp | obj | RTMP推流地址信息 | |
| protocols | array | | 作用尚不明确 |
| try_time | str | | 作用尚不明确 |
| live_key | str | | 作用尚不明确 |
| notice | obj | | 作用尚不明确 |
`data`中的`rtmp`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------------------------------- | ------------ |
| addr | str | RTMP推流发送地址 | **重要** |
| code | str | RTMP推流参数密钥 | **重要** |
| new_link | str | 获取CDN推流ip地址重定向信息的url | 没啥用 |
| provider | str | | 作用尚不明确 |
`data`中的`protocols`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------ | ------------ |
| 0 | obj | | 作用尚不明确 |
`data`中的`protocols`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------------------------------- | ------------ |
| protocol | str | rtmp | 作用尚不明确 |
| addr | str | RTMP推流发送地址 | |
| code | str | RTMP推流参数密钥 | |
| new_link | str | 获取CDN推流ip地址重定向信息的url | |
| provider | str | txy | 作用尚不明确 |
`data`中的`notice`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ---- | ------------ |
| type | num | 1 | 作用尚不明确 |
| status | num | 0 | 作用尚不明确 |
| title | str | 空 | 作用尚不明确 |
| msg | str | 空 | 作用尚不明确 |
| button_text | str | 空 | 作用尚不明确 |
| button_url | str | 空 | 作用尚不明确 |
**示例:**
`27`作为分区id开播直播间`10352053`
其中`"data"."rtmp"."addr"`为推流地址
`"data"."rtmp"."code"`为推流参数
```shell
curl 'https://api.live.bilibili.com/room/v1/Room/startLive' \
--data-urlencode 'room_id=10352053' \
--data-urlencode 'area_v2=27' \
--data-urlencode 'platform=pc' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;bili_jct=xx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"change": 1,
"status": "LIVE",
"room_type": 0,
"rtmp": {
"addr": "rtmp://txy.live-send.acg.tv/live-txy/",
"code": "?streamname=live_293793435_1567354&key=***",
"new_link": "http://tcdns.myqcloud.com:8086/bilibili_redirect?up_rtmp=txy.live-send.acg.tv%2Flive-txy%2F%3Fstreamname%3Dlive_293793435_1567354%26key%3D***",
"provider": "txy"
},
"protocols": [
{
"protocol": "rtmp",
"addr": "rtmp://txy.live-send.acg.tv/live-txy/",
"code": "?streamname=live_293793435_1567354&key=***",
"new_link": "http://tcdns.myqcloud.com:8086/bilibili_redirect?up_rtmp=txy.live-send.acg.tv%2Flive-txy%2F%3Fstreamname%3Dlive_293793435_1567354%26key%3D***",
"provider": "txy"
}
],
"try_time": "0000-00-00 00:00:00",
"live_key": "l:one:live:record:10352053:1589344980",
"notice": {
"type": 1,
"status": 0,
"title": "",
"msg": "",
"button_text": "",
"button_url": ""
}
}
}
```
</details>
## 关闭直播
> https://api.live.bilibili.com/room/v1/Room/stopLive
*请求方式POST*
认证方式CookieSESSDATA
鉴权方式Cookie中`bili_jct`的值正确并与`csrf`相同
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------- | ---- | ------------------------ | ------ | -------------------- |
| room_id | num | 直播间id | 必要 | 必须为自己的直播间id |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />65530token错误登录错误<br />-400没有权限<br />**(其他错误码有待补充)** |
| msg | str | 错误信息 | 默认为空 |
| message | str | 错误信息 | 默认为空 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ------------ | ---------------------- |
| change | num | 是否改变状态 | 0未改变<br />1改变 |
| status | str | PREPARING | |
**示例:**
关闭直播间`10352053`的直播
```shell
curl 'https://api.live.bilibili.com/room/v1/Room/stopLive' \
--data-urlencode 'room_id=10352053' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;bili_jct=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"message": "",
"data": {
"change": 1,
"status": "PREPARING"
}
}
```
</details>

2336
docs/live/message_stream.md Normal file

File diff suppressed because it is too large Load Diff

130
docs/live/redpocket.md Normal file
View File

@@ -0,0 +1,130 @@
# 直播间人气红包
- [获取指定直播间的红包信息](#获取指定直播间的红包信息)
---
## 获取指定直播间的红包信息
> https://api.live.bilibili.com/xlive/lottery-interface/v1/lottery/getLotteryInfoWeb
*请求方式GET*
认证方式可选CookieSESSDATA
如果不携带Cookie信息user_status将始终返回2未参与
如果所查询的直播间无红包popularity_red_pocket为null。
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------- | ---- | ---------------- | ------ | ---- |
| roomid | str | 直播间id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | ---------- | ------------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 0成功 |
| ttl | num | TimeToLive | 正常为1 |
| data | object | 返回数据 | |
`data`对象:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| popularity_red_pocket | array | 人气红包信息 | |
| …… | ...... | …… | …… |
`popularity_red_pocket`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------- | ---- |
| lot_id | num | 红包id | |
| sender_uid | num | 红包发送者uid | |
| sender_name | str | 红包发送者昵称 | |
| sender_face | str | 红包发送者头像 | |
| join_requirement | num | 参与条件? | |
| danmu | str | 参与红包时自动发送的弹幕内容 | |
| awards | array | 红包内容 | |
| lot_status | num | 未知 | |
| h5_url | str | 红包界面 | |
| user_status | num | 用户是否已参与 | 1已参与 2未参与 |
| lot_config_id | num | 未知 | |
| total_price | num | 红包总计价格 | |
**示例:**
查询房间号为24146996的直播间红包信息
```shell
curl -G 'https://api.live.bilibili.com/xlive/lottery-interface/v1/lottery/getLotteryInfoWeb?roomid=24146996'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"pk": null,
"guard": null,
"gift": null,
"storm": null,
"silver": null,
"activity_box": {
"ACTIVITY_ID": 0,
"ACTIVITY_PIC": ""
},
"danmu": null,
"anchor": null,
"red_pocket": null,
"popularity_red_pocket": [{
"lot_id": 622474,
"sender_uid": 1651908873,
"sender_name": "九泽糖糖の小蘑菇",
"sender_face": "http://i0.hdslb.com/bfs/face/c932c5c8b1607fe2e1da22b9780af19662dac939.jpg",
"join_requirement": 1,
"danmu": "老板大气!点点红包抽礼物!",
"awards": [{
"gift_id": 31212,
"num": 2,
"gift_name": "打call",
"gift_pic": "https://s1.hdslb.com/bfs/live/f75291a0e267425c41e1ce31b5ffd6bfedc6f0b6.png"
}, {
"gift_id": 31214,
"num": 3,
"gift_name": "牛哇",
"gift_pic": "https://s1.hdslb.com/bfs/live/23475a7a6170e0d94ba52720e23060dc7604b735.png"
}, {
"gift_id": 31216,
"num": 3,
"gift_name": "i了i了",
"gift_pic": "https://s1.hdslb.com/bfs/live/1157a445487b39c0b7368d91b22290c60fa665b2.png"
}],
"start_time": 1645358104,
"end_time": 1645358284,
"last_time": 180,
"remove_time": 1645358299,
"replace_time": 1645358294,
"current_time": 1645358231,
"lot_status": 1,
"h5_url": "https://live.bilibili.com/p/html/live-app-red-envelope/popularity.html?is_live_half_webview=1\u0026hybrid_half_ui=1,5,100p,100p,000000,0,50,0,0,1;2,5,100p,100p,000000,0,50,0,0,1;3,5,100p,100p,000000,0,50,0,0,1;4,5,100p,100p,000000,0,50,0,0,1;5,5,100p,100p,000000,0,50,0,0,1;6,5,100p,100p,000000,0,50,0,0,1;7,5,100p,100p,000000,0,50,0,0,1;8,5,100p,100p,000000,0,50,0,0,1\u0026hybrid_rotate_d=1\u0026hybrid_biz=popularityRedPacket\u0026lotteryId=622474",
"user_status": 1,
"lot_config_id": 3,
"total_price": 1600
}],
"activity_box_info": null
}
}
```
</details>

363
docs/live/user.md Normal file
View File

@@ -0,0 +1,363 @@
# 直播间用户实用 API
- [直播间用户实用 API](#直播间用户实用-api)
- [获取用户持有的粉丝勋章信息](#获取用户持有的粉丝勋章信息)
- [佩戴勋章](#佩戴勋章)
- [直播签到](#直播签到)
- [本月直播签到信息](#本月直播签到信息)
- [上月直播签到信息](#上月直播签到信息)
---
## 获取用户持有的粉丝勋章信息
> ~~https://api.live.bilibili.com/fans_medal/v5/live_fans_medal/iApiMedal~~
>
> https://api.live.bilibili.com/xlive/app-ucenter/v1/user/GetMyMedals
_请求方式GET_
认证方式CookieSESSDATA或 APP
**url 参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | ------------ | ------ | ------------------------------------------------- |
| page_size | num | 每页的数量 | 必要 | 最大为 10超出 `1002002参数异常` |
| page | num | 返回结果页数 | 必要 | 两个参数不填返回空,只 page 不填或错误则 500 异常 |
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br>-1002002参数异常<br>-500服务器异常 |
| message | str | 错误信息 | 默认为 "0" |
| ttl | str | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ---------------- | ---- |
| count | num | 勋章数量 | |
| items | array | 粉丝勋章信息本体 | |
| page_info | obj | 页码信息 | |
`items 数组内`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------ | ------ | -------------------- | -------------------------------------- |
| can_delete | bool | 可否删除 | |
| day_limit | num | 日经验上限(原力值) | eg: 1500 |
| guard_level | num | | |
| guard_medal_title | str | 加成状态 | |
| intimacy | num | 当前已得亲密度 | |
| is_lighted | num | 是否点亮 | 0未点亮<br>1点亮 |
| level | num | 勋章等级 | |
| medal_name | str | 勋章名 | |
| medal_color_border | num | 勋章边框颜色信息 | 颜色数值为 10 进制的 16 进制值(下同) |
| medal_color_start | num | 勋章起始颜色 | 从右往左渐变20 级+勋章) |
| medal_color_end | num | 勋章结束颜色 | 从右往左渐变20 级+勋章) |
| medal_id | num | 粉丝勋章 id | |
| next_intimacy | num | 升级所需经验 | |
| today_feed | num | 本日亲密度 | |
| roomid | num | 直播间房间号 | |
| status | num | | |
| target_id | number | up 主 mid | |
| target_name | str | up 主用户名 | |
| uname | str | up 主用户名 | |
`page_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | -------------- | ---- |
| total_page | num | 页码总长度 | |
| cur_page | num | 当前返回的页码 | |
**示例:**
```shell
curl https://api.live.bilibili.com/xlive/app-ucenter/v1/user/GetMyMedals?page=1&page_size=10 \
-b "SESSDATA=xxx"
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"items": [
{
"can_deleted": true,
"day_limit": 1500,
"guard_level": 0,
"guard_medal_title": "未开启加成",
"intimacy": 9617,
"is_lighted": 0,
"level": 11,
"medal_name": "锦依卫",
"medal_color_border": 12632256,
"medal_color_end": 12632256,
"medal_color_start": 12632256,
"medal_id": 29245,
"next_intimacy": 10000,
"today_feed": 0,
"roomid": 1546736,
"status": 0,
"target_id": 36081646,
"target_name": "洛天依",
"uname": "洛天依"
}
],
"page_info": {
"cur_page": 1,
"total_page": 1
},
"count": 1
}
}
```
</details>
## 佩戴勋章
> https://api.live.bilibili.com/xlive/web-room/v1/fansMedal/wear
_请求方式POST_
**表单参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ----------------------- | ------ | ---- |
| medal_id | num | 勋章 id | 必要 | |
| csrf | num | cookie 中 bili_jct 字段 | 必要 | |
| csrf_token | num | 同上 | 必要 | |
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | -------------- |
| code | num | 返回值 | 0成功 |
| ttl | str | 1 | |
| message | str | 错误信息 | 默认为佩戴成功 |
| data | obj | 信息本体 | 默认为无 |
**示例:**
佩戴勋章 id 为 1 的勋章
```JavaScript
var madelForm = new FormData();
madelForm.append("medal_id", 1);
madelForm.append("csrf", bili_jct);
madelForm.append("csrf_token", bili_jct);
$.ajax({
url: "https://api.live.bilibili.com/xlive/web-room/v1/fansMedal/wear",
type: "POST",
data: madelForm,
dataType: "JSON",
processData: false,
contentType: false,
cache: false,
xhrFields: {
withCredentials: true
},
success: function (){
}
})
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "佩戴成功",
"ttl": 1,
"data": {}
}
```
</details>
## 直播签到
> https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign
_请求方式GET_
认证方式CookieSESSDATA或 APP
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---------------------- |
| code | num | 返回值 | 0成功<br>1参数错误 |
| ttl | str | 1 | |
| message | str | 错误信息 | 默认为当日签到奖励内容 |
| data | obj | 信息本体 | 默认为空 |
## 本月直播签到信息
> https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/WebGetSignInfo
_请求方式GET_
认证方式CookieSESSDATA或 APP
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---------------------- |
| code | num | 返回值 | 0成功 |
| ttl | str | 1 | |
| message | str | 错误信息 | 默认为0 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ----- | ---------------------------- | ---------------------- |
| text | str | 今日签到奖励信息 | 默认为空 |
| specialText | str | 连续签到奖励信息 | 默认为空 |
| status | num | 签到状态 | 0未签到<br>1已签到 |
| allDays | num | 当月天数 | |
| curMonth | num | 当前月 | |
| curYear | num | 当前年 | |
| curDay | num | 当前日 | |
| curData | str | 当前日期(格式化) | eg: 2023-2-19 |
| hadSignDays | num | 当月已签到天数 | 默认为0 |
| newTask | num | 作用未知 | 默认为0 |
| signDaysList | array | 当月已签到日列表 | 默认为空 |
| signBonusDaysList | array | 当月已签到且有特殊奖励日列表 | 默认为空 |
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"text": "3000点用户经验,2根辣条",
"specialText": "再签到7天可以获得50根辣条",
"status": 1,
"allDays": 28,
"curMonth": 2,
"curYear": 2023,
"curDay": 19,
"curDate": "2023-2-19",
"hadSignDays": 13,
"newTask": 0,
"signDaysList": [
2,
3,
4,
5,
6,
7,
11,
13,
14,
15,
17,
18,
19
],
"signBonusDaysList": [
6
]
}
}
```
</details>
## 上月直播签到信息
> https://api.live.bilibili.com/sign/getLastMonthSignDays
_请求方式GET_
认证方式CookieSESSDATA或 APP
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---------------------- |
| code | num | 返回值 | 0成功 |
| ttl | str | 1 | |
| message | str | 错误信息 | 默认为0 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ----- | ---------------------------- | -------- |
| days | num | 上月天数 | |
| month | num | 上月月份值 | |
| hadSignDays | num | 上月已签到天数 | 默认为0 |
| signDaysList | array | 上月已签到日列表 | 默认为空 |
| signBonusDaysList | array | 上月已签到且有特殊奖励日列表 | 默认为空 |
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"month": 1,
"days": 31,
"hadSignDays": 20,
"signDaysList": [
1,
2,
3,
6,
7,
8,
10,
12,
13,
14,
15,
18,
20,
23,
24,
25,
26,
27,
30,
31
],
"signBonusDaysList": [
7,
31
]
}
}
```
</details>

72
docs/login/exit.md Normal file
View File

@@ -0,0 +1,72 @@
# 退出账号登录
- [退出登录(web 端)](#退出登录web端)
---
## 退出登录(web端)
> https://passport.bilibili.com/login/exit/v2
_请求方式POST_
认证方式Cookie
验证登录成功后会使用`set-cookie`字段清空以下 cookie 项:
`DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct`
并在服务器注销该登录 Token (SESSDATA),该 Token 即失效
请求必须包含以下cookie项`DedeUserID` `bili_jct` `SESSDATA`
**正文参数 (application/x-www-form-urlencoded)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ---------------------------------------- | ------ | --------------------------------- |
| biliCSRF | str | CSRF Token (位于 cookie 中的 `bili_jct`) | 必要 | |
| gourl | str | 成功后跳转到的页面 | 非必要 | 默认为`javascript:history.go(-1)` |
**json 回复:**
如果 cookie 已经失效则输出登录页 html
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------- | -------- | --------------------------------- |
| code | num | 返回值 | 0成功 <br />2202csrf 请求非法 |
| status | bool | 返回值 | `true`:成功 |
| ts | num | 时间戳 | |
| message | str | 错误信息 | 成功时不存在 |
| data | 有效时obj | 信息本体 | 失败时不存在 |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ---------- | ---- |
| redirectUrl | str | 重定向 url | |
**示例:**
```shell
curl -L -X POST 'https://passport.bilibili.com/login/exit/v2' \
-H 'Cookie: DedeUserID=xxx; bili_jct=xxx; SESSDATA=xxx' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'biliCSRF=xxxxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"status": true,
"ts": 1663034005,
"data": {
"redirectUrl": "https://passport.biligame.com/crossDomain?DedeUserID=&DedeUserID__ckMd5=&SESSDATA=&bili_jct=&gourl=javascript%3Ahistory.go%28-1%29"
}
}
```
</details>

View File

@@ -0,0 +1,636 @@
# 二维码登录
<img src="../../../assets/img/2233login.png"/>
- [扫码登录流程(伪代码)](#扫码登录流程伪代码)
- [web端扫码登录](#web端扫码登录)
- [申请二维码(web端)](#申请二维码web端)
- [扫码登录(web端)](#扫码登录web端)
- [web端扫码登录-旧版](#web端扫码登录-旧版)
- [申请二维码(web端-旧版)](#申请二维码web端-旧版)
- [扫码登录(web端-旧版)](#扫码登录web端-旧版)
- [TV端扫码登录](#TV端扫码登录)
- [申请二维码(TV端)](#申请二维码TV端)
- [扫码登录(TV端)](#扫码登录TV端)
---
## 扫码登录流程(伪代码)
```python
token, url = 申请二维码()
生成二维码(url) # 等待客户端扫码
while True:
status, cookie = 扫码登录(token)
match status:
case 未扫描:
continue
case 二维码超时 | 二维码失效:
提示('二维码失效或超时') # 需要用户重新操作
break
case 已扫描未确认:
提示('扫描成功')
case 登录成功:
提示('扫描成功')
存储cookie(cookie)
SSO登录页面跳转()
break
```
## web端扫码登录
### 申请二维码(web端)
> https://passport.bilibili.com/x/passport-login/web/qrcode/generate
*请求方式GET*
密钥超时为180秒
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|------|
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|------------|-----|------------------|--------|
| url | str | 二维码内容 (登录页面 url) | |
| qrcode_key | str | 扫码登录秘钥 | 恒为32字符 |
**示例:**
`url`中的值生成二维码,等待手机客户端扫描,并将`qrcode_key`保存备用
```shell
curl 'https://passport.bilibili.com/x/passport-login/web/qrcode/generate'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"url": "https://passport.bilibili.com/h5-app/passport/login/scan?navhide=1\u0026qrcode_key=8587cf8106a0b863c46d6bab913537f6\u0026from=",
"qrcode_key": "8587cf8106a0b863c46d6bab913537f6"
}
}
```
</details>
### 扫码登录(web端)
> https://passport.bilibili.com/x/passport-login/web/qrcode/poll
*请求方式GET*
密钥超时为180秒
验证登录成功后会进行设置以下cookie项
`DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct`
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|------------|-----|--------|-----|-----|
| qrcode_key | str | 扫码登录秘钥 | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|------|
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | |
| data | obj | 信息本体 | |
data 对象:
| 字段 | 类型 | 内容 | 备注 |
|---------------|-----|----------------------------------------------------------------|------------------------|
| url | str | 游戏分站跨域登录 url | 未登录为空 |
| refresh_token | str | 刷新`refresh_token` | 未登录为空 |
| timestamp | num | 登录时间 | 未登录为`0`<br />时间戳 单位为毫秒 |
| code | num | 0扫码登录成功<br />86038二维码已失效<br />86090二维码已扫码未确认<br />86101未扫码 | |
| message | str | 扫码状态信息 | |
**示例:**
使用扫描秘钥`c3bd5286a2b40a822f5f60e9bf3f602e`登录
```shell
curl -G "https://passport.bilibili.com/x/passport-login/web/qrcode/poll"\
--data-urlencode 'qrcode_key=c3bd5286a2b40a822f5f60e9bf3f602e' \
-c 'cookie.txt'
```
当密钥正确时但未扫描时`code``86101`
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"url": "",
"refresh_token": "",
"timestamp": 0,
"code": 86101,
"message": "未扫码"
}
}
```
</details>
扫描成功但手机端未确认时`code``86090`
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"url": "",
"refresh_token": "",
"timestamp": 0,
"code": 86090,
"message": "二维码已扫码未确认"
}
}
```
</details>
扫描成功手机端确认登录后,`code``0`并向浏览器写入cookie
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"url": "https://passport.biligame.com/crossDomain?DedeUserID=***\u0026DedeUserID__ckMd5=***\u0026Expires=***\u0026SESSDATA=***\u0026bili_jct=***\u0026gourl=https%3A%2F%2Fpassport.bilibili.com",
"refresh_token": "***",
"timestamp": 1662363009601,
"code": 0,
"message": ""
}
}
```
</details>
**响应头部抓包信息:**
可明显看见设置了几个cookie
<details>
<summary>查看响应示例:</summary>
```http
HTTP/1.1 200 OK
Date: Mon, 05 Sep 2022 07:30:09 GMT
Expires: Mon, 05 Sep 2022 07:30:08 GMT
Cache-control: no-cache
Content-encoding: br
Content-type: application/json; charset=utf-8
bili-status-code: 0
bili-trace-id: 0d23fe044a6315a5
set-cookie: SESSDATA=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT; HttpOnly; Secure
set-cookie: bili_jct=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT
set-cookie: DedeUserID=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT
set-cookie: DedeUserID__ckMd5=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT
set-cookie: sid=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT
x-bili-trace-id: 2fbd8abd97dbd4db0d23fe044a6315a5
x-cache-webcdn: BYPASS from blzone02
```
</details>
二维码失效时`code``86038`
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"url": "",
"refresh_token": "",
"timestamp": 0,
"code": 86038,
"message": "二维码已失效"
}
}
```
</details>
## web端扫码登录-旧版
以下为旧版扫码登录 API尚可正常访问
### 申请二维码(web端-旧版)
> https://passport.bilibili.com/qrcode/getLoginUrl
*请求方式GET*
密钥超时为180秒
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|--------|------|------|--------|
| code | num | 返回值 | 0成功 |
| status | bool | true | 作用尚不明确 |
| ts | num | 请求时间 | 时间戳 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|----------|-----|------------------|--------|
| url | str | 二维码内容 (登录页面 url) | |
| oauthKey | str | 扫码登录秘钥 | 恒为32字符 |
**示例:**
`url`中的值生成二维码,等待手机客户端扫描,并将`oauthKey`保存备用
```shell
curl 'https://passport.bilibili.com/qrcode/getLoginUrl'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"status": true,
"ts": 1583314311,
"data": {
"url": "https://passport.bilibili.com/qrcode/h5/login?oauthKey=c3bd5286a2b40a822f5f60e9bf3f602e",
"oauthKey": "c3bd5286a2b40a822f5f60e9bf3f602e"
}
}
```
</details>
### 扫码登录(web端-旧版)
> https://passport.bilibili.com/qrcode/getLoginInfo
*请求方式POST*
密钥超时为180秒
验证登录成功后会进行设置以下cookie项
`DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct`
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|----------|-----|--------|-----|----------------------------|
| oauthKey | str | 扫码登录秘钥 | 必要 | |
| gourl | str | 跳转url | 非必要 | 默认为http://www.bilibili.com |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|----------------------|---------------------------|---------------------------------------------------------|
| code | num | 返回值 | 0成功 |
| message | str | | 正确无 |
| ts | num | 扫码时间 | 错误无 |
| status | bool | 扫码是否成功 | true成功<br />false未成功 |
| data | 正确时obj<br />错误时num | 正确时游戏分站url<br />错误时:错误代码 | 未成功时:<br />-1密钥错误<br />-2密钥超时<br />-4未扫描<br />-5未确认 |
data 对象:
| 字段 | 类型 | 内容 | 备注 |
|-----|-----|--------------|-----|
| url | str | 游戏分站跨域登录 url | |
**示例:**
使用扫描秘钥`c3bd5286a2b40a822f5f60e9bf3f602e`登录
```shell
curl "https://passport.bilibili.com/qrcode/getLoginInfo"\
--data-urlencode 'oauthKey=c3bd5286a2b40a822f5f60e9bf3f602e' \
-c 'cookie.txt'
```
当密钥正确时但未扫描时`status``false``data``-4`
<details>
<summary>查看响应示例:</summary>
```json
{
"status":false,
"data":-4,
"message":"Can't scan~"
}
```
</details>
扫描成功但手机端未确认时`status``false``data``-5`
<details>
<summary>查看响应示例:</summary>
```json
{
"status":false,
"data":-5,
"message":"Can't confirm~"
}
```
</details>
扫描成功手机端确认登录后,`status``true``data`为对象并向浏览器写入cookie
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"status": true,
"ts": 1583315474,
"data": {
"url": "https://passport.biligame.com/crossDomain?DedeUserID=***&DedeUserID__ckMd5=***&Expires=***&SESSDATA=***&bili_jct=***&gourl=http%3A%2F%2Fwww.bilibili.com"
}
}
```
</details>
**响应头部抓包信息:**
可明显看见设置了几个cookie
<details>
<summary>查看响应示例:</summary>
```http
HTTP/1.1 200 OK
Date: Wed, 04 Mar 2020 10:36:37 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: Apache-Coyote/1.1
Set-Cookie: sid=***; Domain=.bilibili.com; Expires=Thu, 04-Mar-2021 10:36:37 GMT; Path=/
Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Mon, 31-Aug-2020 10:19:57 GMT; Path=/
Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Mon, 31-Aug-2020 10:19:57 GMT; Path=/
Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Mon, 31-Aug-2020 10:19:57 GMT; Path=/; HttpOnly
Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Mon, 31-Aug-2020 10:19:57 GMT; Path=/
Expires: Wed, 04 Mar 2020 10:36:36 GMT
Cache-Control: no-cache
X-Cache-Webcdn: BYPASS from ks-sxhz-dx-w-01
```
</details>
## TV端扫码登录
### 申请二维码(TV端)
> https://passport.snm0516.aisee.tv/x/passport-tv-login/qrcode/auth_code
>
> https://passport.bilibili.com/x/passport-tv-login/qrcode/auth_code
*请求方式POST*
鉴权方式appkey
密钥超时为180秒
本接口可申请用于TV端APP方式登录的`access_key`
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ---------- | ------------ | -------------------------- |
| appkey | str | APP 密钥 | APP 方式必要 | 仅可用`4409e2ce8ffd12b8` |
| local_id | str | TV 端 id | TV 端必要 | 可为`0` |
| ts | num | 当前时间戳 | APP 方式必要 | |
| sign | str | APP 签名 | APP 方式必要 | |
| mobi_app | str | 平台标识 | 非必要 | 会被拼接到返回的 url query |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|---------------------------------------|
| code | num | 返回值 | 0成功<br />-3API校验密匙错误<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | -------------- | ------------ |
| url | str | 二维码内容 url | |
| auth_code | str | 扫码登录秘钥 | 恒为 32 字符 |
**示例:**
```shell
curl 'https://passport.snm0516.aisee.tv/x/passport-tv-login/qrcode/auth_code' \
--data-urlencode 'appkey=4409e2ce8ffd12b8' \
--data-urlencode 'local_id=0' \
--data-urlencode 'ts=0' \
--data-urlencode 'sign=e134154ed6add881d28fbdf68653cd9c'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"url": "https://passport.bilibili.com/x/passport-tv-login/h5/qrcode/auth?auth_code=0eeb635a64526709d70cb4c854a3b001",
"auth_code": "0eeb635a64526709d70cb4c854a3b001"
}
}
```
</details>
### 扫码登录(TV端)
> https://passport.snm0516.aisee.tv/x/passport-tv-login/qrcode/poll
>
> https://passport.bilibili.com/x/passport-tv-login/qrcode/poll
*请求方式POST*
鉴权方式appkey
密钥超时为180秒
验证登录成功后会返回可用于APP方式登录的`access_key`以及`refresh_token`
**正文参数 (application/x-www-form-urlencoded)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|-----------|-----|-------|---------|-----------------------|
| appkey | str | APP密钥 | APP方式必要 | 仅可用`4409e2ce8ffd12b8` |
| auth_code | str | 扫码秘钥 | 必要 | |
| local_id | str | TV端id | TV端必要 | 可为0 |
| ts | num | 当前时间戳 | APP方式必要 | |
| sign | str | APP签名 | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----------------------|------|--------------------------------------------------------------------------------------------------------------|
| code | num | 返回值 | 0成功<br />-3API校验密匙错误<br />-400请求错误<br/>-404啥都木有<br />86038二维码已失效<br />86039二维码尚未确认<br/>86090二维码已扫码未确认 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | 有效时obj<br />无效时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|---------------|-----|------------|---------------------|
| mid | num | 登录用户mid | |
| access_token | str | APP登录Token | |
| refresh_token | str | APP刷新Token | |
| expires_in | num | 有效时间 | 默认15552000秒等于180天 |
**示例:**
使用扫描秘钥`6214464b3025541abf6f654cf7569a01`进行验证登录
```shell
curl 'https://passport.snm0516.aisee.tv/x/passport-tv-login/qrcode/poll' \
--data-urlencode 'appkey=4409e2ce8ffd12b8' \
--data-urlencode 'auth_code=6214464b3025541abf6f654cf7569a01' \
--data-urlencode 'local_id=0' \
--data-urlencode 'ts=0' \
--data-urlencode 'sign=87de3d0fee7c3f4facd244537238914e'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"is_new": false,
"mid": 10086,
"access_token": "********************************",
"refresh_token": "********************************",
"expires_in": 15552000,
"token_info": {
"mid": 10086,
"access_token": "********************************",
"refresh_token": "********************************",
"expires_in": 15552000
},
"cookie_info": {
"cookies": [
{
"name": "SESSDATA",
"value": "********************************",
"http_only": 1,
"expires": 1679988973,
"secure": 0
},
{
"name": "bili_jct",
"value": "********************************",
"http_only": 0,
"expires": 1679988973,
"secure": 0
},
{
"name": "DedeUserID",
"value": "*******",
"http_only": 0,
"expires": 1679988973,
"secure": 0
},
{
"name": "DedeUserID__ckMd5",
"value": "****************",
"http_only": 0,
"expires": 1679988973,
"secure": 0
},
{
"name": "sid",
"value": "********",
"http_only": 0,
"expires": 1679988973,
"secure": 0
}
],
"domains": [
".bilibili.com",
".biligame.com",
".bigfun.cn",
".bigfunapp.cn",
".dreamcast.hk"
]
},
"sso": [
"https://passport.bilibili.com/api/v2/sso",
"https://passport.biligame.com/api/v2/sso",
"https://passport.bigfunapp.cn/api/v2/sso"
]
}
}
```
</details>

View File

@@ -0,0 +1,258 @@
# 短信登录
- [获取国际冠字码_web端](#获取国际冠字码_web端)
- [发送短信验证码_web端](#发送短信验证码_web端)
- [使用短信验证码登录_web端](#使用短信验证码登录_web端)
---
web端短信登录流程
1. [完成人机验证](readme.md)
2. 发送短信,使用国际地区代码`cid`+手机号码`tel`+登录密钥`token`+极验`challenge`+验证结果`validate`+验证结果`seccode`
3. 提交短信验证码以验证登录操作,使用国际地区代码`cid`+手机号码`tel`+短信验证码`code`
## 获取国际冠字码_web端
> https://passport.bilibili.com/web/generic/country/list
*请求方式GET*
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ----- | ------------- | ---- |
| common | array | 常用国家&地区 | |
| others | array | 其他国家&地区 | |
`data`中的`common``others`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | -------------- | ---- |
| 0 | obj | 国家&地区1 | |
| n | obj | 国家&地区(n+1) | |
| …… | obj | …… | …… |
`common``others`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------- | ---- |
| id | num | 国际代码值 | |
| cname | str | 国家&地区名 | |
| country_id | str | 国家&地区区号 | |
**示例:**
```shell
curl 'https://passport.bilibili.com/web/generic/country/list'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"common": [
{
"id": 1,
"cname": "中国大陆",
"country_id": "86"
},
{
"id": 5,
"cname": "中国香港特别行政区",
"country_id": "852"
},
…………
],
"others": [
{
"id": 22,
"cname": "阿富汗",
"country_id": "93"
},
{
"id": 20,
"cname": "阿尔巴尼亚",
"country_id": "355"
},
…………
]
}
}
```
</details>
## 发送短信验证码_web端
> https://passport.bilibili.com/x/passport-login/web/sms/send
*请求方式POST*
同手机号短信发送 CD 时间为 60s
短信验证码 timeout 为 5min
**正文参数 (application/x-www-form-urlencoded)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --- | --- | --- | --- | --- |
| cid | num | 国际冠字码 | 必要 | 可以从[获取国际冠字码](#获取国际冠字码(web端))获取 |
| tel | num | 手机号码 | 必要 | |
| source | str | 登录来源 | 必要 | `main_web`:独立登录页<br />`main_mini`:小窗登录 |
| token | str | 登录 API token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 |
| challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 |
| validate | str | 极验 result | 必要 | 极验验证后得到 |
| seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | --------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />1002手机号格式错误<br />86203短信发送次数已达上限<br />1003验证码已经发送<br />1025该手机号在哔哩哔哩有过永久封禁记录无法再次注册或绑定新账号<br />2400登录秘钥错误<br />2406验证极验服务出错 |
| message | str | 错误信息 | 成功为0 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------------- | ------------------------ |
| captcha_key | str | 短信登录 token | 在下方传参时需要,请备用 |
**示例:**
例如手机号为`13888888888`国际id为`1 (中国大陆)`,登录秘钥为`aabbccdd`极验challenge为`2333`,极验结果为`666666`,进行发送短信验证码操作
```shell
curl 'https://passport.bilibili.com/x/passport-login/web/sms/send' \
--data-urlencode 'tel=13888888888' \
--data-urlencode 'cid=1' \
--data-urlencode 'source=main_web' \
--data-urlencode 'token=aabbccdd' \
--data-urlencode 'challenge=2333' \
--data-urlencode 'validate=666666' \
--data-urlencode 'seccode=666666|jordan'
```
<details>
<summary>查看响应示例:</summary>
```json
{"code":0,
"message":"0",
"ttl":1,
"data":{
"captcha_key":"7542f109c3318d74847626495c68c321"
}
}
```
</details>
## 使用短信验证码登录_web端
> https://passport.bilibili.com/x/passport-login/web/login/sms
*请求方式POST*
验证登录成功后会进行设置以下cookie项
`DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct`
**正文参数 (application/x-www-form-urlencoded)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --- | --- | --- | --- | --- |
| cid | num | 国际冠字码 | 必要 | 可以从[获取国际冠字码](#获取国际冠字码(web端))获取 |
| tel | num | 手机号码 | 必要 | |
| code | num | 短信验证码 | 必要 | timeout 为 5min |
| source | str | 登录来源 | 必要 | `main_web`:独立登录页<br />`main_mini`:小窗登录 |
| captcha_key | str | 短信登录 token | 必要 | 从[上述API](#发送短信验证码(web端))请求成功后返回 |
| go_url | str | 跳转url | 非必要 | 默认为 https://www.bilibili.com |
| keep | bool | 是否记住登录 | 非必要 | `true`:记住登录<br />`false`:不记住登录 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />1006请输入正确的短信验证码<br />1007短信验证码已过期 |
| message | str | 错误信息 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| is_new | bool | 是否为新注册用户 | false非新注册用户<br />true新注册用户 |
| status | num | 0 | 未知可能0就是成功吧 |
| url | str | 跳转 url | 默认为 https://www.bilibili.com |
**示例:**
使用手机号`13888888888`,短信验证码为`123456`,进行验证登录操作
```shell
curl 'https://passport.bilibili.com/x/passport-login/web/login/sms'
--data-urlencode 'cid=1' \
--data-urlencode 'tel=13888888888' \
--data-urlencode 'code=123456'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"is_new": false,
"status": 0,
"url": "https://space.bilibili.com"
}
}
```
</details>
**响应头部抓包信息:**
可明显看见设置了几个cookie填入浏览器即可成功登录
<details>
<summary>查看响应示例:</summary>
```http
HTTP/1.1 200 OK
Date: Mon, 13 Jul 2020 09:57:33 GMT
Content-Type: application/json;charset=UTF-8
Content-Length: 78
Connection: keep-alive
Server: Apache-Coyote/1.1
Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/; HttpOnly
Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Set-Cookie: sid=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/
Expires: Mon, 13 Jul 2020 09:57:32 GMT
Cache-Control: no-cache
X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01
```
</details>

View File

@@ -0,0 +1,499 @@
# 密码登录
- [密码登录流程(伪代码)](#密码登录流程伪代码)
- [web端密码登录](#web端密码登录)
- [获取公钥&盐(web端)](#获取公钥&盐web端)
- [登录操作(web端)](#登录操作web端)
- [web端密码登录-旧版](#web端密码登录-旧版)
- [获取公钥&盐(web端-旧版)](#获取公钥&盐web端-旧版)
- [登录操作(web端-旧版)](#登录操作web端-旧版)
- [APP端密码登录](#APP端密码登录)
- [获取公钥&盐(APP端)](#获取公钥&盐APP端)
- TODO登录操作(APP端)
- [登录密码的加密实例](#登录密码的加密实例)
---
## 密码登录流程(伪代码)
```python
账号 = '2333333'
密码字符串 = 'password'
# 1.人机验证步骤
token, gt, challenge = 获取验证码()
validate = 填写验证码(gt, challenge) # 这一步填写验证码 (访问极验API得到validate)
# 2.密码加密步骤
pubkey, salt = 获取公钥和盐()
加密后的密码 = RSA公钥加密(pubkey, salt+密码字符串) # 盐需要加在密码字符串前
base64编码后的密文 = base64编码(加密后的密码)
# 3.开始登录
cookie = 密码登录(账号, base64编码后的密文, token, challenge, validate)
存储cookie(cookie)
SSO登录页面跳转()
```
## web端密码登录
### 获取公钥&盐(web端)
> https://passport.bilibili.com/x/passport-login/web/key
*请求方式GET*
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|------|------|
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
|------|-----|--------|------------------------------------------|
| hash | str | 密码盐值 | 有效时间为 20s<br />恒为 16 字符<br />需要拼接在明文密码之前 |
| key | str | rsa 公钥 | PEM 格式编码<br />加密密码时需要使用 |
**示例:**
```shell
curl 'https://passport.bilibili.com/x/passport-login/web/key'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"hash": "9333681c87fd8d6e",
"key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n"
}
}
```
</details>
### 登录操作(web端)
> https://passport.bilibili.com/x/passport-login/web/login
*请求方式POST*
验证登录成功后会进行设置以下 cookie 项:
`sid` `DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct`
**正文参数 (application/x-www-form-urlencoded)**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | ---------------------- | ------ | ------------------------------------------------------------ |
| username | str | 用户登录账号 | 必要 | 手机号或邮箱地址 |
| password | str | 加密后的带盐密码 | 必要 | base64 格式 |
| keep | num | 0 | 必要 | |
| token | str | 登录 token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 |
| challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 |
| validate | str | 极验 result | 必要 | 极验验证后得到 |
| seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 |
| go_url | str | 跳转 url | 非必要 | 默认为 https://www.bilibili.com |
| source | str | 登录来源 | 非必要 | `main_web`:独立登录页<br />`main_mini`:小窗登录 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----------------------|------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| code | num | 返回值 | 0成功<br />-105验证码错误<br />-400请求错误<br />-629账号或密码错误<br />-653用户名或密码不能为空<br />-662提交超时,请重新提交<br />-2001缺少必要的的参数<br />-2100需验证手机号或邮箱<br />2400登录秘钥错误<br />2406验证极验服务出错<br />86000RSA解密失败 |
| message | str | 错误信息 | |
| data | 成功时obj<br />失败时null | 数据本体 | |
data 对象:
| 字段 | 类型 | 内容 | 备注 |
|---------------|-----|-------------------|------------------------|
| message | str | 扫码状态信息 | |
| refresh_token | str | 刷新`refresh_token` | |
| status | num | 0 | |
| timestamp | num | 登录时间 | 未登录为`0`<br />时间戳 单位为毫秒 |
| url | str | 游戏分站跨域登录 url | |
**示例:**
例如用户账号为`12345678900`,加密后的密码为`xxx`,登录秘钥为`aabbccdd`极验challenge为`2333`,极验结果为`666666`,进行验证登录操作
```shell
curl 'https://passport.bilibili.com/x/passport-login/web/login' \
--data-urlencode 'username=12345678900' \
--data-urlencode 'password=xxx' \
--data-urlencode 'keep=0' \
--data-urlencode 'source=main_web' \
--data-urlencode 'token=aabbccdd' \
--data-urlencode 'challenge=2333' \
--data-urlencode 'validate=666666' \
--data-urlencode 'seccode=666666|jordan'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"status": 0,
"message": "",
"url": "https://passport.biligame.com/crossDomain?DedeUserID=***&DedeUserID__ckMd5=***&Expires=***&SESSDATA=***&bili_jct=***&gourl=https%3A%2F%2Fwww.bilibili.com%2F",
"refresh_token": "***",
"timestamp": 1662452570273
}
}
```
</details>
**响应头部抓包信息:**
可明显看见设置了几个 cookie
<details>
<summary>查看响应示例:</summary>
```http
HTTP/1.1 200 OK
Date: Mon, 13 Jul 2020 06:56:00 GMT
Content-Type: application/json;charset=UTF-8
Content-Length: 273
Connection: keep-alive
Server: Apache-Coyote/1.1
Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/
Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/
Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/; HttpOnly
Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/
Content-Security-Policy-Report-Only: default-src 'self' data: *.bilibili.com *.hdslb.com; style-src 'self' 'unsafe-inline' *.hdslb.com static.geetest.com; img-src 'self' data: blob: *.bilibili.com *.hdslb.com http://*.hdslb.com static.geetest.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.bilibili.com *.hdslb.com api.geetest.com static.geetest.com; object-src 'self' *.hdslb.com; media-src 'self' *.acgvideo.com http://*.acgvideo.com *.ksyungslb.com; connect-src 'self' data: wss://*.bilibili.com:* *.bilibili.com *.hdslb.com *.biliapi.net *.biliapi.com; frame-ancestors 'self' *.bilibili.com *.biligame.com; report-uri https://security.bilibili.com/csp_report
Expires: Mon, 13 Jul 2020 06:55:59 GMT
Cache-Control: no-cache
X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01
```
</details>
## web端密码登录-旧版
以下为密码扫码登录 API尚可正常访问
### 获取公钥&盐(web端-旧版)
> https://passport.bilibili.com/login?act=getkey
*请求方式GET*
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|------|-----|--------|------------------------------------------|
| hash | str | 密码盐值 | 有效时间为 20s<br />恒为 16 字符<br />需要拼接在明文密码之前 |
| key | str | rsa 公钥 | PEM 格式编码<br />加密密码时需要使用 |
**示例:**
```shell
curl 'https://passport.bilibili.com/login?act=getkey'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"hash":"07c6501690c1af85",
"key":"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n"
}
```
</details>
### 登录操作(web端-旧版)
> https://passport.bilibili.com/web/login/v2
*请求方式POST*
验证登录成功后会进行设置以下cookie项
`sid` `DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct`
**正文参数 (application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------- | ---- | ---------------------- | ------ | ------------------------------------------------------------ |
| captchaType | num | 6 | 必要 | 必须为`6` |
| username | str | 用户登录账号 | 必要 | 手机号或邮箱地址 |
| password | str | 加密后的带盐密码 | 必要 | base64 格式 |
| keep | bool | 是否记住登录 | 必要 | `true`:记住登录<br />`false`:不记住登录 |
| key | str | 登录 token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 |
| challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 |
| validate | str | 极验 result | 必要 | 极验验证后得到 |
| seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 |
</details>
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---------|-----|-------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| code | num | 返回值 | 0成功<br />-400请求错误<br />-629账号或密码错误<br />-653用户名或密码不能为空<br />-662提交超时,请重新提交<br />-2001缺少必要的的参数<br />-2100需验证手机号或邮箱<br />2400登录秘钥错误<br />2406验证极验服务出错<br />86000RSA解密失败 |
| ts | num | 当前时间戳 | 成功时无此项 |
| message | str | 错误信息 | 默认为0 |
| data | obj | 数据本体 | 成功时有此项 |
`data`对象:
**未登录时:**
| 字段 | 类型 | 内容 | 备注 |
|-------------|-----|--------------|-----|
| redirectUrl | str | 游戏分站跨域登录 url | |
**已登录时:**
| 字段 | 类型 | 内容 | 备注 |
|---------|------|--------------------------|-----|
| isLogin | bool | true | |
| goUrl | str | https://www.bilibili.com | |
**需验证手机号或邮箱时**
| 字段 | 类型 | 内容 | 备注 |
|----------|-----|--------------------------|------------|
| mid | num | 用户 mid | |
| tel | str | 绑定的手机号 | 星号隐藏部分信息 |
| email | str | 绑定的邮箱 | 星号隐藏部分信息 |
| sorce | num | 0 | **作用尚不明确** |
| keeptime | num | 1 | **作用尚不明确** |
| goUrl | str | https://www.bilibili.com | |
**示例:**
例如用户账号为`12345678900`,加密后的密码为`xxx`,登录秘钥为`aabbccdd`极验challenge为`2333`,极验结果为`666666`,进行验证登录操作
```shell
curl 'https://passport.bilibili.com/web/login/v2' \
--data-urlencode 'captchaType=6' \
--data-urlencode 'username=12345678900' \
--data-urlencode 'password=xxx' \
--data-urlencode 'keep=true' \
--data-urlencode 'token=aabbccdd' \
--data-urlencode 'challenge=2333' \
--data-urlencode 'validate=666666' \
--data-urlencode 'seccode=666666|jordan'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"redirectUrl": "https://passport.biligame.com/crossDomain?DedeUserID=***&DedeUserID__ckMd5=***&Expires=15551000&SESSDATA=***&bili_jct=***&gourl=https%3A%2F%2Fwww.bilibili.com"
}
}
```
</details>
**响应头部抓包信息:**
可明显看见设置了几个 cookie
<details>
<summary>查看响应示例:</summary>
```http
HTTP/1.1 200 OK
Date: Mon, 13 Jul 2020 06:56:00 GMT
Content-Type: application/json;charset=UTF-8
Content-Length: 273
Connection: keep-alive
Server: Apache-Coyote/1.1
Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/
Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/
Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/; HttpOnly
Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/
Content-Security-Policy-Report-Only: default-src 'self' data: *.bilibili.com *.hdslb.com; style-src 'self' 'unsafe-inline' *.hdslb.com static.geetest.com; img-src 'self' data: blob: *.bilibili.com *.hdslb.com http://*.hdslb.com static.geetest.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.bilibili.com *.hdslb.com api.geetest.com static.geetest.com; object-src 'self' *.hdslb.com; media-src 'self' *.acgvideo.com http://*.acgvideo.com *.ksyungslb.com; connect-src 'self' data: wss://*.bilibili.com:* *.bilibili.com *.hdslb.com *.biliapi.net *.biliapi.com; frame-ancestors 'self' *.bilibili.com *.biligame.com; report-uri https://security.bilibili.com/csp_report
Expires: Mon, 13 Jul 2020 06:55:59 GMT
Cache-Control: no-cache
X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01
```
</details>
## APP端密码登录
### 获取公钥&盐(APP端)
> http://passport.bilibili.com/api/oauth2/getKey
*请求方式POST*
鉴权方式appkey
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|--------|-----|-------|---------|-----|
| appkey | str | APP密钥 | APP方式必要 | |
| sign | str | APP签名 | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|------|-----|--------|------------------------------------------|
| hash | str | 密码盐值 | 有效时间为 20s<br />恒为 16 字符<br />需要拼接在明文密码之前 |
| key | str | rsa 公钥 | PEM 格式编码<br />加密密码时需要使用 |
**示例:**
```shell
curl 'https://passport.bilibili.com/api/oauth2/getKey' \
--data-urlencode 'appkey=1d8b6e7d45233436' \
--data-urlencode 'sign=17004c193f688f0b5665c1068e733aff'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"hash": "07c6501690c1af85",
"key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n"
}
```
</details>
### 登录操作(APP端)
TODO
## 登录密码的加密实例
以下实例使用 Python 语言在任何平台web、APP使用密码登录都需要如下加密步骤
首先在需拉取 RSA PubKey 和 salt 备用
```python
import requests
resp = requests.get('https://passport.bilibili.com/x/passport-login/web/key').json()['data']
print('salt =', resp['hash'])
print('PubKey =', resp['key'])
```
`hash`字段为 salt长度固定为 16 字符timeout 时间只有 20s
`key`字段为 RSA PubKey为 PEM 格式,加密需要使用
```
salt = 9773d106a67e27d6
PubKey = -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n
6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx
/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+
Xl69GV6klzgxW6d2xQIDAQAB
-----END PUBLIC KEY-----
```
例如登录密码为`BiShi22332323`,现在对它进行加盐并使用获取的 PubKey 加密
```python
import rsa
password = 'BiShi22332323'
pubKey = rsa.PublicKey.load_pkcs1_openssl_pem(resp['key']) # 读取 PEM 密钥
encryptedPassword = rsa.encrypt((resp['hash']+password).encode(), pubKey) # 盐需要加在明文密码之前,一并加密
print(encryptedPassword)
```
下面将输出一段 bytes 数据:
```
b'}\x9c\xd4\xcd\x88\x92\xa7\xde\x85\xdb\xabm\xd7\xd3\x08\x02@xo\x85\xa4\xe1\x11\xd0o\x80\x03.$\xc8l\xbe\xba;\xfe\xee\xa7(\xf8S\x95\x1e\x9106\xa4\x1d\xcf\x8e\xbe\x8d\x94A\x86s\xf9"\x12\x0c\x135\xbb\xbc\xe1\xde\x1b\x90\t)P\xeb\xa9\x8fXY]\x83\x18\x81f\n:\xdb\xe1\xbe\xe8\x1e\xba\x1c D8d}B\x17\xf9\x8a\xf0i\'1\xa5\xc4\x05&\xaa;n\xf8{\xa02\xffY\xcelU\xd5\xaf\x8aJK\xdc\xf1@\xbc\x93'
```
接下来需要把加密后的结果进行 base64 编码
```python
import base64
b64Password = base64.b64encode(encryptedPassword).decode()
print('result =', b64Password)
```
以下为最终加密结果,可直接向 API 请求体传参以登录:
因为 RSA 公钥加密的**无法解密性**,故无法本地验证,仅可请求 API 验证(略...
```
result = fZzUzYiSp96F26tt19MIAkB4b4Wk4RHQb4ADLiTIbL66O/7upyj4U5UekTA2pB3Pjr6NlEGGc/kiEgwTNbu84d4bkAkpUOupj1hZXYMYgWYKOtvhvugeuhwgRDhkfUIX+YrwaScxpcQFJqo7bvh7oDL/Wc5sVdWvikpL3PFAvJM=
```
以下为密码加密的Java实现
```java
package com.ho.test;
import cn.hutool.core.codec.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
public class Test3 {
public static void main(String[] args) throws Exception {
//用户密码
String password = "abcdef";
//获取到的证书内容
String key = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n";
//获取到的盐值
String hash = "bb73382121594c46";
String[] split = key.strip().split("\n");
String newKey = split[1] + split[2] + split[3] + split[4];
//进行加密
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decode(newKey));
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.PUBLIC_KEY, publicKey);
byte[] bytes = cipher.doFinal((hash + password).getBytes());
String encode = Base64.encode(bytes);
System.out.println(encode);
}
}
```

View File

@@ -0,0 +1,99 @@
# 登录操作
人机验证方式登录包含**账号密码登录**与手**机短信验证码登录**
**注:扫码登录**不需要进行**人机验证**,故**不使用**以下接口
## 扫码登录
- [扫码登录](QR.md)
## 验证登录
人机验证流程:
1. 请求验证码参数,得到登录密钥`key`与极验id`gt`和极验KEY`challenge`
2. 进行滑动or点击验证
3. 返回验证结果`validate``seccode`,进行短信或密码登录
### 申请captcha验证码
> https://passport.bilibili.com/x/passport-login/captcha?source=main_web
*请求方式GET*
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | --------- |
| code | num | 返回值 | 0成功 |
| message | str | 返回信息 | |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | -------- |
| geetest | obj | 极验captcha数据 | |
| tencent | obj | (?) | **作用尚不明确** |
| token | str | 登录 API token | 与 captcha 无关,与登录接口有关 |
| type | str | 验证方式 | 用于判断使用哪一种验证方式,目前所见只有极验<br />geetest极验 |
`geetest`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------ | -------- |
| gt | str | 极验id | 一般为固定值 |
| challenge | str | 极验KEY | 由B站后端产生用于人机验证 |
**示例:**
```shell
curl 'https://passport.bilibili.com/x/passport-login/captcha?source=main_web'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"type": "geetest",
"token": "00fbe75cc2864ba0af969231f193a974",
"geetest": {
"challenge": "a57d9be17505d4a15ed84694c48fbf74",
"gt": "ac597a4506fee079629df5d8b66dd4fe"
},
"tencent": {
"appid": ""
}
}
}
```
</details>
### 进行验证
本文档为Bilibili文档验证码为geetest极验提供故不提供api
附: [手动验证器](https://kuresaru.github.io/geetest-validator/)
[及其源码](https://github.com/kuresaru/geetest-validator)
1. 打开手动验证器在1、2分别填入上面API返回的`gt``challenge`
2. 点击按钮3稍等加载验证码点击按钮4进行验证
3. 验证完成后点击按钮5生成验证结果
4. 使用最开始获得到的`key``challenge`和刚获得到的`validate``seccode`继续之后的登录操作
### 继续登录
- [短信登录](SMS.md)
- [密码登录](password.md)

569
docs/login/login_info.md Normal file
View File

@@ -0,0 +1,569 @@
# 登录基本信息
- [导航栏用户信息](#导航栏用户信息)
- [~~登录用户信息仅部分(已弃用)~~](#~~登录用户信息仅部分(已弃用)~~)
- [登录用户信息APP端](#登录用户信息APP端)
- [登录用户状态数(双端)](#登录用户状态数双端)
- [获取硬币数](#获取硬币数)
---
## 导航栏用户信息
> https://api.bilibili.com/nav带有转义
>
> https://api.bilibili.com/x/web-interface/nav原始数据
*请求方式GET*
认证方式仅可CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------------- | ---- | ---------------- | ------------------------------------------------- |
| isLogin | bool | 是否已登录 | false未登录<br />true已登录 |
| email_verified | num | 是否验证邮箱地址 | 0未验证<br />1已验证 |
| face | str | 用户头像url | |
| level_info | obj | 等级信息 | |
| mid | num | 用户mid | |
| mobile_verified | num | 是否验证手机号 | 0未验证<br />1已验证 |
| money | num | 拥有硬币数 | |
| moral | num | 当前节操值 | 上限为70 |
| official | obj | 认证信息 | |
| officialVerify | obj | 认证信息2 | |
| pendant | obj | 头像框信息 | |
| scores | num | 0 | 作用尚不明确 |
| uname | str | 用户昵称 | |
| vipDueDate | num | 会员到期时间 | 毫秒 时间戳 |
| vipStatus | num | 会员开通状态 | 0<br />1有 |
| vipType | num | 会员类型 | 0<br />1月度大会员<br />2年度及以上大会员 |
| vip_pay_type | num | 会员开通状态 | 0<br />1有 |
| vip_theme_type | num | 0 | 作用尚不明确 |
| vip_label | obj | 会员标签 | |
| vip_avatar_subscript | num | 是否显示会员图标 | 0不显示<br />1显示 |
| vip_nickname_color | str | 会员昵称颜色 | 颜色码 |
| wallet | obj | B币钱包信息 | |
| has_shop | bool | 是否拥有推广商品 | false<br />true有 |
| shop_url | str | 商品推广页面url | |
| allowance_count | num | 0 | 作用尚不明确 |
| answer_status | num | 0 | 作用尚不明确 |
`data`中的`level_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ------------------------ | ---- |
| current_level | num | 当前等级 | |
| current_min | num | 当前等级经验最低值 | |
| current_exp | num | 当前经验 | |
| next_exp | 小于6级时num<br />6级时str | 升级下一等级需达到的经验 |当用户等级为Lv6时值为`--`,代表无穷大 |
`data`中的`official`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------- | ------------------------------------------------- |
| role | num | 认证类型 | 0<br />1 2 7个人认证<br />3 4 5 6机构认证 |
| title | str | 认证信息 | 无为空 |
| desc | str | 认证备注 | 无为空 |
| type | num | 是否认证 | -1<br />0认证 |
`data`中的`official_verify`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ------------------- |
| type | num | 是否认证 | -1<br />0认证 |
| desc | str | 认证信息 | 无为空 |
`data`中的`pendant`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ----------- | ------------ |
| pid | num | 挂件id | |
| name | str | 挂件名称 | |
| image | str | 挂件图片url | |
| expire | num | 0 | 作用尚不明确 |
`data`中的`vip_label`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------- | ------------------------------------------------------------ |
| path | str | 空 | 作用尚不明确 |
| text | str | 会员名称 | |
| label_theme | str | 会员标签 | vip大会员<br />annual_vip年度大会员<br />ten_annual_vip十年大会员<br />hundred_annual_vip百年大会员 |
`data`中的`wallet`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ---- | ------------- | ------------ |
| mid | num | 登录用户mid | |
| bcoin_balance | num | 拥有B币数 | |
| coupon_balance | num | 每月奖励B币数 | |
| coupon_due_time | num | 0 | 作用尚不明确 |
**示例:**
```shell
curl 'https://api.bilibili.com/nav' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"isLogin":true,
"email_verified":1,
"face":"http://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg",
"level_info":{
"current_level":5,
"current_min":10800,
"current_exp":17065,
"next_exp":28800
},
"mid":293793435,
"mobile_verified":1,
"money":33.4,
"moral":70,
"official":{
"role":0,
"title":"",
"desc":"",
"type":-1
},
"officialVerify":{
"type":-1,
"desc":""
},
"pendant":{
"pid":0,
"name":"",
"image":"",
"expire":0,
"image_enhance":""
},
"scores":0,
"uname":"社会易姐QwQ",
"vipDueDate":1612454400000,
"vipStatus":1,
"vipType":2,
"vip_pay_type":1,
"vip_theme_type":0,
"vip_label":{
"path":"",
"text":"年度大会员",
"label_theme":"annual_vip"
},
"vip_avatar_subscript":1,
"vip_nickname_color":"#FB7299",
"wallet":{
"mid":293793435,
"bcoin_balance":8,
"coupon_balance":5,
"coupon_due_time":0
},
"has_shop":false,
"shop_url":"",
"allowance_count":0,
"answer_status":0
}
}
```
</details>
## ~~登录用户信息仅部分(已弃用)~~
<details>
<summary>查看折叠内容</summary>
> https://account.bilibili.com/home/userInfo
*请求方式GET*
认证方式仅可CookieSESSDATA
鉴权方式Cookie中`DedeUserID`存在且不为0
带有转义
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| status | bool | true | 作用尚不明确 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ---- | ----------------- | ------------------------------- |
| level_info | obj | 等级信息 | |
| bCoins | num | 拥有B币数 | |
| coins | num | 拥有硬币数 | |
| face | str | 登录用户头像url | |
| nameplate_current | null | ??? | 作用尚不明确 |
| nameplate_current | str | 登录用户勋章url | |
| pendant_current | str | 登录用户头像框url | |
| uname | str | 登录用户昵称 | |
| userStatus | str | 登录用户状态 | |
| vipType | num | 大会员类型 | 0<br />1月度<br />2年度 |
| vipStatus | num | 会员开通状态 | 0<br />1有 |
| official_verify | num | 是否认证 | -1<br />0认证 |
| pointBalance | num | 0 | 作用尚不明确 |
`data`中的`level_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ------------------------ | ---- |
| current_level | num | 当前等级 | |
| current_min | num | 当前等级经验最低值 | |
| current_exp | num | 当前经验 | |
| next_exp | num | 升级下一等级需达到的经验 | |
**示例:**
```shell
curl 'https://account.bilibili.com/home/userInfo' \
-b 'SESSDATA=xxx;DedeUserID=1;'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"status": true,
"data": {
"level_info": {
"current_level": 5,
"current_min": 10800,
"current_exp": 14270,
"next_exp": 28800
},
"bCoins": 10,
"coins": 2.5,
"face": "http:\/\/i2.hdslb.com\/bfs\/face\/480e2e98513aaeb65d2f2c76dbae750c4de722e9.jpg",
"nameplate_current": null,
"pendant_current": "http:\/\/i0.hdslb.com\/bfs\/face\/6550f53324c330f201a528e70ef305cb10ac2c01.png",
"uname": "\u793e\u4f1a\u6613\u59d0QwQ",
"userStatus": "\u6b63\u5f0f\u4f1a\u5458",
"vipType": 2,
"vipStatus": 1,
"official_verify": -1,
"pointBalance": 0
}
}
```
</details>
</details>
## 登录用户信息APP端
> https://app.bilibili.com/x/v2/account/myinfo
*请求方式GET*
认证方式仅可APP
鉴权方式appkey
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
| appkey | str | APP密钥 | APP方式必要 | |
| ts | num | 当前时间戳 | APP方式必要 | |
| sign | str | APP签名 | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-3API校验密匙错误<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------- | ---- | ---------------- | ----------------------------- |
| mid | num | 用户mid | |
| name | str | 用户昵称 | |
| sign | str | 用户签名 | |
| coins | num | 拥有硬币数 | |
| birthday | str | 用户生日 | YYYY-MM-DD |
| face | str | 用户头像url | |
| sex | num | 用户性别 | 0私密<br />1<br />2女 |
| level | num | 用户等级 | 0-6 |
| rank | num | 1000 | **作用尚不明确** |
| silence | num | 用户是否被封禁 | 0正常<br />1封禁 |
| vip | obj | 会员信息 | |
| email_status | num | 是否验证邮箱地址 | 0未验证<br />1已验证 |
| tel_status | num | 是否验证手机号 | 0未验证<br />1已验证 |
| official | obj | 认证信息 | |
| identification | num | 1 | **作用尚不明确** |
| invite | obj | | |
| is_tourist | num | 0 | **作用尚不明确** |
| pin_prompting | num | 0 | **作用尚不明确** |
`data`中的`vip`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------------- | ---- | ---------------- | ------------------------------- |
| type | num | 大会员类型 | 0<br />1月度<br />2年度 |
| status | num | 会员开通状态 | 0<br />1有 |
| due_date | num | 大会员到期时间 | 毫秒 时间戳 |
| vip_pay_type | num | 会员开通状态 | 0<br />1有 |
| theme_type | num | 会员开通状态 | 0<br />1有 |
| label | obj | 大会员信息 | |
| avatar_subscript | num | 是否显示会员图标 | 0不显示<br />1显示 |
| nickname_color | str | 会员昵称颜色 | 颜色码 |
`vip`中的`label`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------------ | ---------------- |
| path | str | 空 | **作用尚不明确** |
| text | str | 会员类型文字 | |
| label_theme | str | 会员类型 | |
`data`中的`official`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------- | ------------------------------------------------- |
| role | num | 认证类型 | 0<br />1 2 7个人认证<br />3 4 5 6机构认证 |
| title | str | 认证信息 | 无为空 |
| desc | str | 认证备注 | 无为空 |
| type | num | 认证备注 | 无为空 |
`data`中的`invite`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ---- | ---------------- |
| invite_remind | num | 1 | **作用尚不明确** |
| display | bool | true | **作用尚不明确** |
**示例:**
```shell
curl -G 'https://app.bilibili.com/x/v2/account/myinfo' \
--data-urlencode 'access_key=xxx' \
--data-urlencode 'appkey=4409e2ce8ffd12b8' \
--data-urlencode 'ts=0' \
--data-urlencode 'sign=b8fb8480049c525994be6507a97ae0b6'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"mid": 293793435,
"name": "社会易姐QwQ",
"sign": "高中技术宅一枚爱好MC&电子&8-bit音乐&数码&编程资深猿厨粉丝群1136462265",
"coins": 33.4,
"birthday": "2002-03-05",
"face": "http://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg",
"sex": 1,
"level": 5,
"rank": 10000,
"silence": 0,
"vip": {
"type": 2,
"status": 1,
"due_date": 1612454400000,
"vip_pay_type": 1,
"theme_type": 0,
"label": {
"path": "",
"text": "年度大会员",
"label_theme": "annual_vip"
},
"avatar_subscript": 1,
"nickname_color": "#FB7299"
},
"email_status": 1,
"tel_status": 1,
"official": {
"role": 0,
"title": "",
"desc": "",
"type": -1
},
"identification": 1,
"invite": {
"invite_remind": 1,
"display": true
},
"is_tourist": 0,
"pin_prompting": 0
}
}
```
</details>
## 登录用户状态数(双端)
> https://api.bilibili.com/x/web-interface/nav/stat
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ---------- | ---- |
| following | num | 关注数 | |
| follower | num | 粉丝数 | |
| dynamic_count | num | 发布动态数 | |
**示例:**
当前登录用户的状态数为粉丝596关注754发送的动态252
Cookie方式
```shell
curl 'https://api.bilibili.com/x/web-interface/nav/stat' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"following": 754,
"follower": 596,
"dynamic_count": 252
}
}
```
</details>
APP方式
```shell
curl -G 'https://api.bilibili.com/x/web-interface/nav/stat' \
--data-urlencode 'access_key=d907f51122c59599d580ade2315af971'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"following": 754,
"follower": 596,
"dynamic_count": 252
}
}
```
</details>
## 获取硬币数
> https://account.bilibili.com/site/getCoin
*请求方式GET*
认证方式仅可CookieSESSDATA
鉴权方式Cookie中` DedeUserID `存在且不为0
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| status | bool | true | 作用尚不明确 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | -------------------------------------- | ---------- | ---- |
| money | 硬币为正数时num<br />硬币为0时null | 当前硬币数 | |
**示例:**
```shell
curl 'https://account.bilibili.com/site/getCoin' \
-b 'SESSDATA=xxx;DedeUserID=1;'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"status": true,
"data": {
"money": 42.4
}
}
```
</details>

View File

@@ -0,0 +1,74 @@
# 登录记录
- [查询登录记录](#查询登录记录)
---
## 查询登录记录
> https://api.bilibili.com/x/safecenter/login_notice
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------- | ------ | ------------------------------------------------------------ |
| mid | num | 用户mid | 必要 | |
| buvid | str | 设备虚拟id | 非必要 | web端为操作登录接口时Cookie中的`buvid3`<br />若登录设备无`buvid`则留空 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ----------- | -------------------------- |
| mid | num | 登录用户mid | |
| device_name | str | 登录设备 | 依靠操作登录接口时的UA决定 |
| login_type | str | 登录方式 | 根据登录接口决定 |
| login_time | str | 登录时间 | YYYY-MM-DD hh:mm:ss |
| location | str | 登录位置 | 依靠ip决定 |
| ip | str | 登录ip | 部分用`*`打码 |
**示例:**
查询用户`293793435`设备id为`fuck_chenrui`的登录记录
```shell
curl -G 'https://api.bilibili.com/x/safecenter/login_notice' \
--data-urlencode 'mid=293793435' \
--data-urlencode 'buvid=fuck_chenrui' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"mid": 293793435,
"device_name": "Chrome浏览器",
"login_type": "扫码登录",
"login_time": "2020-10-02 22:42:38",
"location": "中国陕西渭南",
"ip": "36.40.***.**"
}
}
```
</details>

675
docs/login/member_center.md Normal file
View File

@@ -0,0 +1,675 @@
# 个人中心
- [获取我的信息](#获取我的信息)
- [查询每日奖励状态](#查询每日奖励状态)
- [查询每日投币获得经验数](#查询每日投币获得经验数)
- [查询大会员状态](#查询大会员状态)
- [查询账号安全情况](#查询账号安全情况)
- [查询账号实名认证状态](#查询账号实名认证状态)
- [查询实名认证详细信息](#查询实名认证详细信息)
- [查询硬币变化情况](#查询硬币变化情况)
- [修改个人签名](#修改个人签名)
---
## 获取我的信息
> https://api.bilibili.com/x/member/web/account
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | -------------- | --------------------------------------- |
| mid | num | 我的mid | |
| uname | str | 我的昵称 | |
| userid | str | 我的用户名 | |
| sign | str | 我的签名 | |
| birthday | str | 我的生日 | YYYY-MM-DD |
| sex | str | 我的性别 | 男 女 保密 |
| nick_free | bool | 是否未设置昵称 | false设置过昵称<br />true未设置昵称 |
| rank | str | 我的会员等级 | |
**示例:**
```shell
curl 'https://api.bilibili.com/x/member/web/account' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"mid":293793435,
"uname":"社会易姐QwQ",
"userid":"bili_84675323391",
"sign":"高中技术宅一枚爱好MC&电子&8-bit音乐&数码&编程资深猿厨粉丝群1136462265",
"birthday":"2002-03-05",
"sex":"男",
"nick_free":false,
"rank":"正式会员"
}
}
```
</details>
## 查询每日奖励状态
> https://api.bilibili.com/x/member/web/exp/reward
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | -------------------- | ------------------------------------------------------------ |
| login | bool | 每日登录 | false未完成<br />true已完成<br />完成奖励5经验 |
| watch | bool | 每日观看 | false未完成<br />true已完成<br />完成奖励5经验 |
| coins | num | 每日投币所奖励的经验 | 上限为50<br />注:该值更新存在延迟<br />[另外一个专门API](#查询每日投币获得经验数) |
| share | bool | 每日分享 | false未完成<br />true已完成<br />完成奖励5经验 |
| email | bool | 绑定邮箱 | false未完成<br />true已完成 |
| tel | bool | 绑定手机号 | false未完成<br />true已完成<br />首次完成完成奖励100经验 |
| safe_question | bool | 设置密保问题 | false未完成<br />true已完成 |
| identify_card | bool | 实名认证 | false未完成<br />true已完成<br />首次完成奖励50经验 |
**示例:**
```shell
curl 'https://api.bilibili.com/x/member/web/exp/reward' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"login": true,
"watch": true,
"coins": 30,
"share": true,
"email": true,
"tel": true,
"safe_question": true,
"identify_card": true
}
}
```
</details>
## 查询每日投币获得经验数
>https://www.bilibili.com/plus/account/exp.php
*请求方式GET*
认证方式仅可CookieSESSDATA
鉴权方式Cookie中`DedeUserID`存在且不为0
该接口实时更新,未发现延迟
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------------------- | ----------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 默认为0 |
| number | num | 每日投币所奖励的经验 | 上限为50<br |
**示例:**
```shell
curl 'https://www.bilibili.com/plus/account/exp.php' \
-b 'SESSDATA=xxx;DedeUserID=1'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"number": 20
}
```
</details>
## 查询大会员状态
> https://api.bilibili.com/x/vip/web/user/info
*请求方式GET*
认证方式仅可CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ---------------- | ------------------------------------------------------------ |
| mid | num | 我的mid | |
| vip_type | num | 大会员类型 | 0<br />1月度<br />2年度 |
| vip_status | num | 大会员状态 | 1正常<br />2由于IP地址更换过于频繁,服务被冻结<br />3你的大会员账号风险过高大会员功能已被锁定 |
| vip_due_date | num | 大会员到期时间 | 时间戳 毫秒 |
| vip_pay_type | num | 是否已购买大会员 | 0未购买<br />1已购买 |
| theme_type | num | 0 | 作用尚不明确 |
**示例:**
```shell
curl 'https://api.bilibili.com/x/vip/web/user/info' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"mid": 293793435,
"vip_type": 2,
"vip_status": 1,
"vip_due_date": 1612454400000,
"vip_pay_type": 1,
"theme_type": 0
}
}
```
</details>
## 查询账号安全情况
> https://passport.bilibili.com/web/site/user/info
*请求方式GET*
认证方式CookieSESSDATA或APP
鉴权方式如用Cookie方式认证时Cookie中`DedeUserID`存在且不为0
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ---------------- | ---- |
| account_info | obj | 账号绑定信息 | |
| account_safe | obj | 密码安全信息 | |
| account_sns | obj | 互联登录绑定信息 | |
| account_other | obj | | |
`data`中的`account_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------ | ---- | -------------- | ------------------------------- |
| hide_tel | str | 绑定的手机号 | 星号隐藏部分信息 |
| hide_mail | str | 绑定的邮箱 | 星号隐藏部分信息 |
| bind_tel | bool | 是否绑定手机号 | false未绑定<br />true已绑定 |
| bind_mail | bool | 是否绑定邮箱 | false未绑定<br />true已绑定 |
| tel_verify | bool | 是否验证手机号 | false未验证<br />true已验证 |
| mail_verify | bool | 是否验证邮箱 | false未验证<br />true已验证 |
| unneeded_check | bool | 是否未设置密码 | false已设置<br />true未设置 |
| realname_certified | bool | 是否实名认证 | false已认证<br />true未认证 |
`data`中的`account_safe`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | ---------------- | ----------------------------- |
| Score | num | 账号安全等级 | 0-100<br />已弃用? |
| score_new | num | 新版账号安全等级 | 0-100 |
| pwd_level | num | 当前密码强度等级 | 1<br />2<br />3强 |
| security | bool | 当前密码是否安全 | false不安全<br />true安全 |
`data`中的`account_sns`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------------ | ------------------------ |
| weibo_bind | num | 是否绑定微博 | 0未绑定<br />1已绑定 |
| qq_bind | num | 是否绑定qq | 0未绑定<br />1已绑定 |
| wechat_bind | num | 是否绑定微信 | 0未绑定<br />1已绑定 |
`data`中的`account_other`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ----- | ------------ |
| skipVerify | bool | false | 作用尚不明确 |
**示例:**
```shell
curl 'https://passport.bilibili.com/web/site/user/info' \
-b 'SESSDATA=xxx;DedeUserID=1;'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"data": {
"account_info": {
"hide_tel": "153*****056",
"hide_mail": "144****@qq.com",
"bind_tel": true,
"bind_mail": true,
"tel_verify": true,
"mail_verify": true,
"unneeded_check": false,
"realname_certified": true
},
"account_safe": {
"Score": 90,
"score_new": 100,
"pwd_level": 3,
"security": true
},
"account_sns": {
"weibo_bind": 1,
"qq_bind": 1,
"wechat_bind": 1
},
"account_other": {
"skipVerify": false
}
}
}
```
</details>
## 查询账号实名认证状态
> https://api.bilibili.com/x/member/realname/status
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ------------ | ------------------------ |
| status | num | 实名认证状态 | 0未认证<br />1已认证 |
**示例:**
当前状态为已认证
```shell
curl 'https://api.bilibili.com/x/member/realname/status' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"status": 1
}
}
```
</details>
## 查询实名认证详细信息
> https://api.bilibili.com/x/member/realname/apply/status
*请求方式GET*
认证方式CookieSESSDATA或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | ------------ | ------------------------------------------------------------ |
| status | num | 认证状态 | 1已认证<br />3未认证 |
| remark | str | 驳回信息 | 默认为空 |
| realname | str | 实名姓名 | 星号隐藏完全信息 |
| card | str | 证件号码 | 星号隐藏部分信息 |
| card_type | num | 证件类型代码 | 0身份证<br />2港澳居民来往内地通行证<br />3台湾居民来往大陆通行证<br />4护照(中国签发)<br />5外国人永久居留证<br />6其他国家或地区身份证明 |
```shell
curl 'https://api.bilibili.com/x/member/realname/apply/status' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"status": 1,
"remark": "",
"realname": "***",
"card": "6****************7",
"card_type": 0
}
}
```
</details>
## 查询硬币变化情况
> httpsss://api.bilibili.com/x/member/web/coin/log
*请求方式GET*
认证方式CookieSESSDATA或APP
仅能查询最近一周的情况
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------ | ----------- | ---- |
| access_key | str | APP登录Token | APP方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ------ | ---------------- | ---- |
| list | array | 变化记录条目列表 | |
| count | num | 变化记录条目数 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | ---- |
| 0 | obj | 变化记录条目1 | |
| n | obj | 变化记录条目(n+1) | |
| …… | obj | …… | …… |
`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | ---------------------- |
| time | str | 变化时间 | YYYY-MM-DD HH:MM:SS |
| delta | num | 变化量 | 正值为收入,负值为支出 |
| reason | str | 变化说明 | |
**示例:**
```shell
curl 'https://api.bilibili.com/x/member/web/coin/log' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"list": [
{
"time": "2020-05-19 23:58:29",
"delta": -1,
"reason": "给视频 BV1j5411s7M8 打赏"
},
{
"time": "2020-05-19 16:02:53",
"delta": -1,
"reason": "给视频 BV1Ht4y117A1 打赏"
},
{
"time": "2020-05-19 15:38:42",
"delta": 0.1,
"reason": "给视频 BV1nb411C7aa 打赏"
},
{
"time": "2020-05-19 02:19:20",
"delta": 1,
"reason": "登录奖励"
},
{
"time": "2020-05-18 22:34:04",
"delta": -1,
"reason": "给视频 BV1Bp4y1Q7uw 打赏"
},
{
"time": "2020-05-18 22:33:59",
"delta": -1,
"reason": "给视频 BV1j5411s7M8 打赏"
},
{
"time": "2020-05-18 02:45:53",
"delta": 1,
"reason": "登录奖励"
},
{
"time": "2020-05-17 03:02:38",
"delta": 1,
"reason": "登录奖励"
},
{
"time": "2020-05-16 01:57:02",
"delta": 1,
"reason": "登录奖励"
},
{
"time": "2020-05-15 11:10:35",
"delta": 0.2,
"reason": "给视频 BV1Yt41137T6 打赏"
},
{
"time": "2020-05-15 00:34:27",
"delta": 1,
"reason": "登录奖励"
},
{
"time": "2020-05-14 02:11:37",
"delta": 1,
"reason": "登录奖励"
},
{
"time": "2020-05-13 02:12:28",
"delta": 1,
"reason": "登录奖励"
}
],
"count": 13
}
}
```
</details>
## 修改个人签名
> https://api.bilibili.com/x/member/web/sign/update
*请求方式POST*
认证方式CookieSESSDATA或APP
修改签名不会立即生效,会等待审核队列稍后生效
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- |
| access_key | str | APP登录Token | APP方式必要 | |
| user_sign | str | 要设置的签名内容 | 非必要 | 删除签名留空或省去即可<br />最多支持70个字符 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />40015签名包含敏感词<br />40021签名不能包含表情图片<br />40022签名过长 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
更新个人标签为`高中技术宅一枚爱好MC&电子&8-bit音乐&数码&编程资深猿厨粉丝群1136462265`
```shell
curl 'https://api.bilibili.com/x/member/web/sign/update' \
--data-urlencode 'user_sign=高中技术宅一枚爱好MC&电子&8-bit音乐&数码&编程粉丝群1136462265' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1
}
```
</details>

79
docs/manga/Activity.md Normal file
View File

@@ -0,0 +1,79 @@
# 漫画任务操作
- [漫画任务操作](#漫画任务操作)
- [分享漫画](#分享漫画)
## 分享漫画
> https://manga.bilibili.com/twirp/activity.v1.Activity/ShareComic
_请求方式POST_
认证方式CookieSESSDATA/ APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ---- | ------ | ------- |
| platform | str | 平台 | 必要 | android |
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | --------- | -------- | ------------------------------------------------------- |
| code | num / str | 返回值 | 见对应表格 |
| msg | str | 错误信息 | |
| meta | obj | 错误信息 | invalid_argument 时存在,例如 `{"argument":"platform"}` |
| data | obj | | `code` 为 0`msg` 为空时存在 |
`code` - `msg` 对应表:
| code | code 类型 | msg | 备注 |
| ---------------- | --------- | ------------------ | --------------------------- |
| 0 | num | 空 | 分享成功,`data` 存在 |
| 0 | num | 今日已分享 | |
| invalid_argument | str | xxxx must be valid | xxxx 字段为必须,`meta`存在 |
| unauthenticated | str | must login | 必须登录才能分享 |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------- | ---- |
| point | num | 获取积分 | |
**示例:**
```bash
curl -X POST https://manga.bilibili.com/twirp/activity.v1.Activity/ShareComic \
-b "SESSDATA=xxxxx" \
--data-urlencode 'platform=android'
```
<details>
<summary>分享成功:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"point": 5
}
}
```
</details>
<details>
<summary>今日已分享:</summary>
```json
{
"code": 0,
"msg": "今日已分享"
}
```
</details>

217
docs/manga/ClockIn.md Normal file
View File

@@ -0,0 +1,217 @@
# 签到
> https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn
*请求方式POST*
认证方式CookieSESSDATA/ APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|----------|-----|----|-----|---------|
| platform | str | 平台 | 必要 | android |
| device | str | 平台 | 非必要 | h5 |
**正文参数( application/json **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|------|-----|------|-----|-------|
| type | num | | 非必要 | 补签时使用 |
| date | str | 补签日期 | 必要 | 补签时使用 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|------|-----------|------|--------------------------------------------|
| code | num / str | 返回值 | 0成功<br />invalid_argument今日已签到 |
| msg | str | 错误信息 | 成功:空<br />已签到clockin clockin is duplicate |
| meta | obj | 错误信息 | 今日已签到时存在 |
| data | obj | | |
**示例:**
普通签到:
```bash
curl -L -X POST 'https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn' \
-H 'Cookie: SESSDATA=xxx' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'platform=android'
```
<details>
<summary>签到成功:</summary>
```json
{
"code": 0,
"msg": "",
"data": {}
}
```
</details>
<details>
<summary>今日已签到:</summary>
```json
{
"code": "invalid_argument",
"msg": "clockin clockin is duplicate",
"meta": {
"argument": "clockin"
}
}
```
</details>
补签:
```bash
curl -L 'https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn?platform=android' \
-H 'Cookie: SESSDATA=xxx' \
-H 'content-type: application/json;charset=UTF-8' \
-d '{"type":0,"date":"2023-02-15"}'
```
<details>
<summary>补签成功:</summary>
```json
{
"code": 0,
"msg": "",
"data": {}
}
```
</details>
# 查询签到状态
> https://manga.bilibili.com/twirp/activity.v1.Activity/GetClockInInfo
*请求方式POST*
认证方式CookieSESSDATA/ APP
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
|------|-----|------|------|
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | 空 |
| data | obj | 信息本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
|-------------------|-------|------------------|------------------|
| day_count | num | 连续签到天数 | |
| status | num | 今日是否已签到 | 0未签到<br />1已签到 |
| credit_icon | str | | |
| sign_before_icon | str | | |
| sign_today_icon | str | | |
| breathe_icon | str | | |
| new_credit_x_icon | str | | |
| coupon_pic | str | | |
| points | array | 一次签到周期中每次签到可获得点数 | |
| point_infos | array | | |
`point_infos`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
|--------------|------|---------|----|
| point | num | 签到可获取积分 | |
| origin_point | num | | |
| is_activity | bool | | |
| title | str | 签到奖励描述 | |
**示例:**
```bash
curl -L -X POST 'https://manga.bilibili.com/twirp/activity.v1.Activity/GetClockInInfo' \
-H 'Cookie: SESSDATA=xxx'
```
<details>
<summary>成功:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"day_count": 58,
"status": 1,
"points": [
10,
20,
20,
10,
10,
10,
30
],
"credit_icon": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/9da6QImiK_w192_h192.png",
"sign_before_icon": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/BuA6z3lhN_w192_h192.png",
"sign_today_icon": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/TWSLUHbbg_w192_h192.png",
"breathe_icon": "http://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/anime.breathe.svga",
"point_infos": [
{
"point": 10,
"origin_point": 10,
"is_activity": false,
"title": "10积分"
},
{
"point": 20,
"origin_point": 20,
"is_activity": false,
"title": "20积分"
},
{
"point": 20,
"origin_point": 20,
"is_activity": false,
"title": "20积分"
},
{
"point": 10,
"origin_point": 10,
"is_activity": false,
"title": "10积分"
},
{
"point": 10,
"origin_point": 10,
"is_activity": false,
"title": "10积分"
},
{
"point": 10,
"origin_point": 10,
"is_activity": false,
"title": "10积分"
},
{
"point": 30,
"origin_point": 30,
"is_activity": false,
"title": "30积分+福利券"
}
],
"new_credit_x_icon": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/QP5DsW2S_w192_h192.png",
"coupon_pic": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/Yalqqoiz_w402_h162.png"
}
}
```
</details>

4223
docs/manga/Comic.md Normal file

File diff suppressed because it is too large Load Diff

256
docs/manga/Download.md Normal file
View File

@@ -0,0 +1,256 @@
# 获取当前话全部图片地址
> https://manga.bilibili.com/twirp/comic.v1.Comic/GetImageIndex
*请求方式POST*
认证方式CookieSESSDATA/ APP
**URL参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| access_key | str | APP登录凭证 | 必要 | 使用APP鉴权方式时必填 |
| appkey | str | cc8617fd6961e070 | 非必要 | |
| mobi_app | str | android_comic | 非必要 | |
| version | str | 4.21.0 | 非必要 | |
| build | str | 36421000 | 非必要 | |
| channel | str | bilicomic | 非必要 | |
| platform | str | android | 非必要 | |
| device | str | android | 非必要 | |
| buvid | str | XY118701XXXXXXXXX104911DXXXXXCAEXXXXE | 非必要 | 长度为37 |
| machine | str | | 非必要 | 手机品牌+型号 |
| is_teenager | num | 0 | 非必要 | |
| no_recommend | num | 0 | 非必要 | |
| ts | num | 秒级时间戳 | 非必要 |
**正文参数( application/json **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- |
| epIdep_id | num | 当前话的id | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | |
| data | obj | | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| path | str | .index 文件路径 | 解密详见[此处](./unlock_index_data.md) |
| images | array | 本话图片信息 | |
| last_modified | str | 本话信息最后修改时间 | |
| host | str | `https://manga.hdslb.com` | |
| video | obj | | |
`images` 数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| path | str | 图片的路径 | 不包含host |
| x | num | 图片宽度 | 单位像素px |
| y | num | 图片高度 | 单位像素px |
| video_path | str | | |
| video_size | str | | |
`video` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| svid | str | | |
| filename | str | | |
| route | str | | |
| resource | array | | |
| raw_width | str | | |
| raw_height | str | | |
| raw_rotate | str | | |
| img_urls | array | | |
| bin_url | str | | |
| img_x_len | num | | |
| img_x_size | num | | |
| img_y_len | num | | |
| img_y_size | num | | |
**示例:**
```bash
curl -L -X POST 'https://manga.bilibili.com/twirp/comic.v1.Comic/GetImageIndex' \
-H 'Cookie: SESSDATA=xxx;' \
-H 'Content-Type: application/json' \
--data-raw '{
"ep_id": 321912
}'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"path": "/bfs/manga/26564/321912/data.index?token=80eab62fef85c1c134a6399f817a938f&ts=63404145",
"images": [
{
"path": "/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg",
"x": 1600,
"y": 2268,
"video_path": "",
"video_size": "0"
},
{
"path": "/bfs/manga/bf1c48540b68f473b429317d8f6fa8cdb6eed3a5.jpg",
"x": 1600,
"y": 2268,
"video_path": "",
"video_size": "0"
},
{
"path": "/bfs/manga/a46cfe90cfb49c67a4dbfc0002e5bc3d87d02963.jpg",
"x": 1600,
"y": 2268,
"video_path": "",
"video_size": "0"
}
],
"last_modified": "2019-05-13 21:15:53",
"host": "https://manga.hdslb.com",
"video": {
"svid": "",
"filename": "",
"route": "",
"resource": [],
"raw_width": "0",
"raw_height": "0",
"raw_rotate": "0",
"img_urls": [],
"bin_url": "",
"img_x_len": 10,
"img_x_size": 160,
"img_y_len": 10,
"img_y_size": 90
}
}
}
```
</details>
# 获取某一图片的token
> https://manga.bilibili.com/twirp/comic.v1.Comic/ImageToken
*请求方式POST*
认证方式CookieSESSDATA/ APP
**URL参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ---- | ------------------------------------- | ------ | --------------------- |
| access_key | str | APP登录凭证 | 必要 | 使用APP鉴权方式时必填 |
| appkey | str | cc8617fd6961e070 | 非必要 | |
| mobi_app | str | android_comic | 非必要 | |
| version | str | 4.21.0 | 非必要 | |
| build | str | 36421000 | 非必要 | |
| channel | str | bilicomic | 非必要 | |
| platform | str | android | 非必要 | |
| device | str | android | 非必要 | |
| buvid | str | XY118701XXXXXXXXX104911DXXXXXCAEXXXXE | 非必要 | 长度为37 |
| machine | str | samsung+SM-G9730 | 非必要 | 手机品牌+型号 |
| is_teenager | num | 0 | 非必要 | |
| no_recommend | num | 0 | 非必要 | |
| ts | num | 秒级时间戳 | 非必要 | |
**正文参数( application/json **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------- | ------ | ------------------------------------------------------------ |
| urls | str | 请求token的图片地址 | 必要 | `[\"https://i0.hdslb.com{path}\"]` <br />{path}代表图片的相对网站路径支持jpg和webp |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ----- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | |
| data | array | | |
`data` 数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | ------------------- | ------------------------------------ |
| url | str | 图片下载的地址 | 此时网址开头 https://manga.hdslb.com |
| token | str | 图片下载需要的token | |
**示例:**
```bash
curl -L -X POST 'https://manga.bilibili.com/twirp/comic.v1.Comic/ImageToken' \
-H 'Cookie: SESSDATA=xxx;' \
-H 'Content-Type: application/json' \
--data-raw '{
"urls": "[\"https://i0.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg\"]"
}'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": [
{
"url": "https://manga.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg",
"token": "36931815abb35857627a22c347dc1c86&ts=634045c2"
}
]
}
```
</details>
# 下载图片
*请求方式GET*
在上一步获取token的基础上构建如下的url
例如获取到此token
```
{
"code": 0,
"msg": "",
"data": [
{
"url": "https://manga.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg",
"token": "36931815abb35857627a22c347dc1c86&ts=634045c2"
}
]
}
```
则访问以下网址即可,注意需要添加`?token=`。此网址有效期较短
```
https://manga.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg?token=36931815abb35857627a22c347dc1c86&ts=634045c2
```
备注:若访问 `https://i0或i1.hdslb.com/bfs/manga或new_dyn或archive/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg` 均无法获取

439
docs/manga/Season.md Normal file
View File

@@ -0,0 +1,439 @@
# 漫画赛季
- [漫画赛季](#漫画赛季)
- [获取赛季信息](#获取赛季信息)
- [赛季奖励领取](#赛季奖励领取)
_漫画赛季仅在 app 端可见,但可以使用 Cookie 鉴权_
## 获取赛季信息
> https://manga.bilibili.com/twirp/user.v1.Season/GetSeasonInfo
_请求方式POST_
接口不鉴权可查看基本信息,鉴权后可查看赛季个人信息和赛季规则。
认证方式CookieSESSDATA/ APP
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| code | num | 返回值 | |
| msg | str | 错误信息 | |
| data | obj | 信息本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------ | ----- | ------------------ | -------------------------- |
| current_time | str | 当前时间字符串 | ISO 8601 |
| start_time | str | 赛季开始 | ISO 8601 |
| end_time | str | 赛季结束 | ISO 8601 |
| remain_amount | num | 拥有积分 | 未登录为 `0` |
| season_id | str | 第几个赛季 | |
| tasks | array | 待领取奖励的任务 | 未登录/没有可领取时为 `[]` |
| welfare | array | 赛季奖励 | |
| next | obj | 未知 | 未登录为 `null` |
| cover | str | 版头图片 | |
| today_tasks | array | 今日的任务完成情况 | |
| text | obj | 赛季相关文案 | 未登录为 `null` |
| season_clock_in | obj | | |
| announcement | obj | 未知 | 未登录为 `null` |
| lottery | obj | | |
| mission_point_rate | str | | |
| season_title | str | 赛季标题 | |
| point_rate | obj | | |
| rank | obj | | |
`data` 对象的 `rank`
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ----- | ---- |
| is_visible | bool | false | |
`data` 对象的 `tasks`
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ---------- | ----------------------- |
| title | str | 任务描述 | |
| id | str | | |
| status | num | 任务状态 | 应该都是`1`:待领取奖励 |
| type | num | | 与 today_tasks 的一致 |
| amount | num | 可获取积分 | |
| ctime | str | 完成时间 | ISO 8601 |
`data` 对象的 `next`
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ---- | ---- |
| title | str | 空 | |
| amount | num | 0 | |
| gap_time | num | 0 | |
| current_time | num | 0 | |
`data` 对象的 `text`
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ------------ | ---- |
| notice | str | 赛季公告 | |
| clonckInRule | str | 赛季签到规则 | |
`data` 对象的 `announcement`
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ----- | ---- |
| title | str | 空 | |
| jump_url | str | 空 | |
| enable | bool | false | |
`data` 对象的 `point_rate`
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ---- | ---- |
| sign_in | num | 0 | |
| game | num | 0 | |
| daily_mission | num | 0 | |
| week_mission | num | 0 | |
`data` 对象的 `lottery`
| 字段 | 类型 | 内容 | 备注 |
| ---------------------- | ---- | ------------ | ---- |
| lottery_act_id | str | '0' | |
| enable_lottery | bool | 是否开启抽奖 | |
| lottery_id | str | '0' | |
| advance_lottery_act_id | str | '0' | |
| advance_pool_id | str | '0' | |
`data` 对象的 `season_clock_in`
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ---- | ---------------- | ---- |
| is_super_luck | bool | | |
| draw_luck_time | str | | |
| prize_type | num | | |
| prize_title | str | | |
| add_up_sign | num | 赛季连续签到天数 | |
| title | str | 签到标题 | |
| sign_old_amount | num | | |
| preluck_amount | num | | |
| continuous_days | num | 连续签到天数 | |
| address_id | str | | |
| has_super_prize | bool | | |
| subtitle | str | 签到子标题 | |
| prize_image | str | | |
| prize_target_days | num | | |
| prize_amount | num | | |
| tomorrow_amount | num | 明日签到积分 | |
| entrance_tag | str | | |
`data` 对象的 `today_tasks`
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---------- | ------------ | ------------------------------------------- |
| type | num | | |
| title | str | 任务标题 | 可能为空字符串 |
| amount | num | 可获得积分 | |
| status | num | 完成状态 | 0未完成<br />1待领取奖励<br />2已完成 |
| duration | num | 耗时(分) | 直接完成的为 0 |
| comics | comic 数组 | 任务指定漫画 | 仅`type=22`时有内容,所有账号是一致的 |
| page_url | str | 空 | |
| progress | num | 已完成进度 | |
| sub_id | num | | `type` 一致时有效 |
| share_type | num | `0` | |
`today_tasks`对象的 `comics`
| 字段 | 类型 | 内容 | 备注 |
| -------------- | -------- | -------- | ---- |
| comic_id | num | 漫画 id | |
| title | str | 漫画名称 | |
| vertical_cover | str | 漫画封面 | |
| styles | str 数组 | 漫画类型 | |
`data` 对象的 `welfare`
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ---- | ------------ | --------------------------------------------------------- |
| type | num | 奖励类型 | 200-限免卡<br/>202-漫读券<br/>203-优惠券<br/>205-最终宝箱 |
| success | num | 兑换状态 | 0-未兑换<br/>2-已兑换 |
| exchange_amount | num | 积分消耗 | |
| boss_welfare | bool | 最终奖励 | |
| boss_remain | num | 最终奖励剩余 | |
| rank | num | 顺序 | |
| title | str | 空 | |
| url | str | 空 | |
| kind_address_id | str | '0' | |
**示例:**
```bash
curl -X POST https://manga.bilibili.com/twirp/user.v1.Season/GetSeasonInfo
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"current_time": "2022-11-30T15:12:00+08:00",
"start_time": "2022-11-14T00:00:00+08:00",
"end_time": "2022-12-11T23:59:00+08:00",
"remain_amount": 0,
"season_id": "35",
"tasks": [],
"welfare": [
{
"type": 200,
"success": 0,
"exchange_amount": 100,
"boss_welfare": false,
"boss_remain": 0,
"rank": 1,
"title": "",
"url": "",
"kind_address_id": "0"
},
// 中间的省略
{
"type": 205,
"success": 0,
"exchange_amount": 0,
"boss_welfare": true,
"boss_remain": 0,
"rank": 21,
"title": "",
"url": "",
"kind_address_id": "0"
}
],
"next": null,
"cover": "https://i0.hdslb.com/bfs/manga-static/b81fcd291cff74965b71d67e7df261de5790c2cd.png",
"today_tasks": [
{
"type": 18,
"title": "",
"amount": 20,
"status": 0,
"duration": 30,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 1,
"share_type": 0
},
{
"type": 20,
"title": "",
"amount": 20,
"status": 0,
"duration": 3,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 1,
"share_type": 0
},
{
"type": 22,
"title": "",
"amount": 50,
"status": 0,
"duration": 15,
"comics": [
{
"comic_id": 32190,
"title": "我的成就有点多",
"vertical_cover": "https://i0.hdslb.com/bfs/manga-static/efc403e323656fad24335aef007af5f318879597.png",
"styles": ["都市"]
},
{
"comic_id": 30538,
"title": "我知道你的秘密",
"vertical_cover": "https://i0.hdslb.com/bfs/manga-static/607f2c13afcf82ebba98f18213033d93bba7d58a.jpg",
"styles": ["悬疑"]
},
{
"comic_id": 25874,
"title": "桃花宝典",
"vertical_cover": "http://i0.hdslb.com/bfs/manga-static/bb1d33004af7dfbf197572cb9ef1c5fdd19e17a8.jpg",
"styles": ["都市"]
}
],
"page_url": "",
"progress": 0,
"sub_id": 1,
"share_type": 0
},
{
"type": 17,
"title": "阅读3分钟",
"amount": 10,
"status": 0,
"duration": 3,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 1,
"share_type": 0
},
{
"type": 17,
"title": "阅读5分钟",
"amount": 10,
"status": 0,
"duration": 5,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 2,
"share_type": 0
},
{
"type": 17,
"title": "阅读10分钟",
"amount": 20,
"status": 0,
"duration": 10,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 3,
"share_type": 0
},
{
"type": 17,
"title": "阅读20分钟",
"amount": 40,
"status": 0,
"duration": 20,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 4,
"share_type": 0
},
{
"type": 17,
"title": "阅读30分钟",
"amount": 60,
"status": 0,
"duration": 30,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 5,
"share_type": 0
},
{
"type": 19,
"title": "每日首次玩猜拳",
"amount": 5,
"status": 0,
"duration": 1,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 1,
"share_type": 0
},
{
"type": 1,
"title": "打开系统通知",
"amount": 5,
"status": 0,
"duration": 0,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 0,
"share_type": 0
},
{
"type": 2,
"title": "设置个人偏好",
"amount": 5,
"status": 0,
"duration": 0,
"comics": [],
"page_url": "",
"progress": 0,
"sub_id": 0,
"share_type": 0
}
],
"text": null,
"season_clock_in": {
"is_super_luck": false,
"draw_luck_time": "",
"prize_type": 0,
"prize_title": "",
"add_up_sign": 0,
"title": "",
"sign_old_amount": 0,
"preluck_amount": 0,
"continuous_days": 0,
"address_id": "0",
"has_super_prize": false,
"subtitle": "",
"prize_image": "",
"prize_target_days": 0,
"prize_amount": 0,
"tomorrow_amount": 0,
"entrance_tag": ""
},
"announcement": null,
"lottery": {
"lottery_act_id": "0",
"enable_lottery": true,
"lottery_id": "0",
"advance_lottery_act_id": "0",
"advance_pool_id": "0"
},
"mission_point_rate": 0,
"season_title": "初冬赛季",
"point_rate": { "sign_in": 0, "game": 0, "daily_mission": 0, "week_mission": 0 },
"rank": { "is_visible": false }
}
}
```
</details>
## 赛季奖励领取
> https://manga.bilibili.com/twirp/user.v1.Season/TakeSeasonGifts
_请求方式POST_
认证方式CookieSESSDATA/ APP
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------- | ---- | ------- | ------ | --------------- |
| season_id | num | 赛季 id | 必要 | 必须为本赛季 id |
**json 回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| code | num | 返回值 | |
| msg | str | 错误信息 | |
`code` - `msg` 对照表:
| code | msg | 备注 |
| ---- | ------------------------------------ | ---------------------------- |
| 0 | | 领取成功 |
| 2 | 当前没有正在进行的赛季,无法兑换奖励 | season_id 字段不正确 |
| 7 | 任务已领取或者未完成 | 没有已经完成的 `today_tasks` |

730
docs/manga/User.md Normal file
View File

@@ -0,0 +1,730 @@
# 获取拥有的漫读券列表
> https://manga.bilibili.com/twirp/user.v1.User/GetCoupons
*请求方式POST*
认证方式CookieSESSDATA/ APP
**URL参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| access_key | str | APP登录凭证 | 必要 | 使用APP鉴权方式时必填 |
| appkey | str | cc8617fd6961e070 | 非必要 | |
| mobi_app | str | android_comic | 非必要 | |
| version | str | 4.13.0 | 非必要 | |
| build | str | 36413002 | 非必要 | |
| channel | str | bilicomic | 非必要 | |
| platform | str | android | 非必要 | |
| device | str | android | 非必要 | |
| buvid | str | | 非必要 | |
| machine | str | samsung+SM-G9730 | 非必要 | |
| is_teenager | num | 0 | 非必要 | |
| no_recommend | num | 0 | 非必要 | |
| ts | num | 秒级时间戳 | 非必要 | |
**正文参数( application/json **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- |
| pageNum | num | 页数 | 必要 | |
| pageSize | num | 分页大小 | 必要 | 默认20取值范围[1,100] |
| notExpired | bool | true | 非必要 | |
| tabType | num | 1 | 非必要 | |
| type | num | 0 | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | |
| data | obj | | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| total_remain_amount | num | | |
| user_coupons | array | | |
| coupon_info | obj | | |
`user_coupons` 数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| ID | num | 漫读券id | |
| remain_amount | num | 漫读券剩余数 | |
| expire_time | num | 过期时间 | |
| reason | num | 获取方式 | |
| type | num | 类型 | |
| ctime | num | 获取时间 | |
| total_amount | num | 漫读券总数 | |
| limits | array | (?) | |
| type_num | num | 7福利券 | |
| will_expire | num | 是否即将过期?<br />0<br />1是 | |
| discount | num | 0 | |
| discount_limit | num | 0 | |
| is_from_card | num | 0 | |
| valid_time | str | 0001-01-01 | |
| discount_base | num | 0 | |
`coupon_info` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| new_coupon_num | num | | |
| coupon_will_expire | num | | |
| rent_will_expire | num | | |
| new_rent_num | num | | |
| discount_will_expire | num | | |
| new_discount_num | num | | |
| month_ticket_will_expire | num | | |
| new_month_ticket_num | num | | |
| silver_will_expire | num | | |
| new_silver_num | num | | |
| remain_item | num | | |
| remain_discount | num | | |
| remain_coupon | num | 拥有的漫读券数量 | |
| remain_silver | num | 拥有的通用券数量 | |
| remain_shop_coupon | num | 拥有的商城优惠券数量 | |
| new_shop_num | num | | |
| shop_will_expire | num | | |
| new_suit_id | num | | |
| remain_suit_coupon | num | | |
| new_suit_num | num | | |
| suit_will_expire | num | | |
| vip_priv_coupon | bool | | |
**示例:**
```bash
curl -L -X POST 'https://manga.bilibili.com/twirp/user.v1.User/GetCoupons' \
-H 'Cookie: SESSDATA=xxx;' \
-H 'Content-Type: application/json' \
--data-raw '{
"notExpired": true,
"pageNum": 1,
"pageSize": 20,
"tabType": 1,
"type": 0
}'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"total_remain_amount": 1,
"user_coupons": [
{
"ID": 7473503,
"remain_amount": 1,
"expire_time": "2022-05-24 12:00:33",
"reason": "积分兑换",
"type": "福利券",
"ctime": "2022-05-17 12:00:33",
"total_amount": 1,
"limits": [],
"type_num": 7,
"will_expire": 0,
"discount": 0,
"discount_limit": 0,
"is_from_card": 0,
"valid_time": "0001-01-01",
"discount_base": 0
}
],
"coupon_info": {
"new_coupon_num": 0,
"coupon_will_expire": 0,
"rent_will_expire": 0,
"new_rent_num": 0,
"discount_will_expire": 0,
"new_discount_num": 0,
"month_ticket_will_expire": 0,
"new_month_ticket_num": 0,
"silver_will_expire": 0,
"new_silver_num": 0,
"remain_item": 0,
"remain_discount": 0,
"remain_coupon": 1,
"remain_silver": 8,
"remain_shop_coupon": 1,
"new_shop_num": 0,
"shop_will_expire": 0,
"new_suit_id": 60007,
"remain_suit_coupon": 0,
"new_suit_num": 0,
"suit_will_expire": 0,
"vip_priv_coupon": false
}
}
}
```
</details>
# 获取已购漫画
> https://manga.bilibili.com/twirp/user.v1.User/GetAutoBuyComics
*请求方式POST*
认证方式CookieSESSDATA/ APP
**URL参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ---- | ------ | ---- |
| device | str | 设备 | 非必要 | |
| platform | str | 平台 | 非必要 | |
**正文参数( application/json **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- |
| page_num | num | 页数 | 必要 | |
| page_size | num | 分页大小 | 必要 | 默认15 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---------- | -------- | ------- |
| code | num | 返回值 | 0成功 |
| msg | str | 错误信息 | |
| data | obj(array) | | |
`data`array中的对象
| 字段 | 类型 | 内容 | 备注 |
| ---------------- | ---- | ---------------- | ---- |
| id | num | 内部id | |
| comic_id | str | 漫画id | |
| comic_title | str | 漫画标题 | |
| hcover | str | 横版头图 | |
| scover | str | 方形头图 | |
| vcover | str | 竖版封面图 | |
| bought_ep_count | num | 已购章节数 | |
| gold_status | num | | |
| coupon_status | num | | |
| comic_status | num | 漫画状态 | |
| last_ord | num | 最后一话 | |
| ctime | str | 获取时间 | |
| last_short_title | str | 最后一话的短标题 | |
| bug_type | num | 购买类型 | |
| ep_for_chapters | num | | |
| orders | obj | 自动扣费顺序 | |
| enable_auto_pay | bool | 是否开启自动付费 | |
| type | num | | |
**示例**
```bash
curl -L -X POST 'https://manga.bilibili.com/twirp/user.v1.User/GetAutoBuyComics' \
-H "Cookie: xxxxx" \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36' \
-d '{"page_num": 1,"page_size": 15}'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": [
{
"id": 20276887,
"comic_id": 26554,
"comic_title": "擅长捉弄的(原)高木同学",
"hcover": "http://i0.hdslb.com/bfs/manga-static/443b4a49be1e92cd204af1472e2a7f41c1df7336.png",
"scover": "http://i0.hdslb.com/bfs/manga-static/e29eb39aed0971851efe5998d3b9c156ba52bb4e.jpg",
"vcover": "http://i0.hdslb.com/bfs/manga-static/9536b3d6c6eaef5992986d6b06d35188c20f4366.jpg",
"bought_ep_count": 13,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 235,
"ctime": "2022-01-26 21:39:33",
"last_short_title": "235",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 15129353,
"comic_id": 29726,
"comic_title": "NEW GAME!",
"hcover": "https://i0.hdslb.com/bfs/manga-static/586df1c03978ef01eac9e6a670f26395f6495ead.jpg",
"scover": "https://i0.hdslb.com/bfs/manga-static/7110c8751fef26b082b5452bd515736a78bf0670.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/d3aa1477dcc9720f9bcee19c775849baad6b4e66.jpg",
"bought_ep_count": 4,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 180,
"ctime": "2021-06-21 16:29:27",
"last_short_title": "180",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 13525712,
"comic_id": 28080,
"comic_title": "终将成为你",
"hcover": "https://i0.hdslb.com/bfs/manga-static/bed69097d5fdc68bff87fce1e168b810448ee145.jpg",
"scover": "https://i0.hdslb.com/bfs/manga-static/855e851b58c805b05b347fddb80a46dcb260afac.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/10e8243b502bd19947cd49a6ac2ea0a9b8c5daa3.jpg",
"bought_ep_count": 5,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 45,
"ctime": "2021-04-09 08:26:41",
"last_short_title": "第45话",
"buy_type": 9,
"ep_for_chapters": 0,
"orders": [],
"enable_auto_pay": false,
"type": 0
},
{
"id": 13469083,
"comic_id": 28198,
"comic_title": "米诺斯的牛肉100%",
"hcover": "http://i0.hdslb.com/bfs/manga-static/75931d991ddd40bc49c655ff3fca770d45eac9aa.jpg",
"scover": "http://i0.hdslb.com/bfs/manga-static/ee37104f5d97bb486e69d660d9a93242a1c2817a.jpg",
"vcover": "http://i0.hdslb.com/bfs/manga-static/be5400d37c1428ecc98a8e2d1772175991a262ed.jpg",
"bought_ep_count": 1,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 6,
"ctime": "2021-04-06 12:21:20",
"last_short_title": "6",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [],
"enable_auto_pay": false,
"type": 0
},
{
"id": 13436048,
"comic_id": 27545,
"comic_title": "宝石之国",
"hcover": "http://i0.hdslb.com/bfs/manga-static/94637fff52eca04a8f32e19ed0c2f676b9bee96e.png",
"scover": "http://i0.hdslb.com/bfs/manga-static/e538ce332a639809aea70c8e30a19645e9b2ae3e.jpg",
"vcover": "http://i0.hdslb.com/bfs/manga-static/91e03718b03b7d3a2dca53c461b4b84953ce8cb0.jpg",
"bought_ep_count": 11,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 96,
"ctime": "2021-04-05 00:09:17",
"last_short_title": "96",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 13237163,
"comic_id": 27877,
"comic_title": "极主夫道",
"hcover": "https://i0.hdslb.com/bfs/manga-static/5a8b7bd678e2ae135415af31493417ae77bc83dd.png",
"scover": "http://i0.hdslb.com/bfs/manga-static/aa36b8cff89e42c1820e43c483d483ed3eb8d938.png",
"vcover": "http://i0.hdslb.com/bfs/manga-static/96a6b07bcea58955efed4df876bc8f1b5df9d5cc.jpg",
"bought_ep_count": 6,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 96,
"ctime": "2021-03-27 12:28:27",
"last_short_title": "96",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 12913068,
"comic_id": 25519,
"comic_title": "四月是你的谎言",
"hcover": "http://i0.hdslb.com/bfs/manga-static/33cda8ed8e6c89691d5397dc47f8c7c7945a54c4.png",
"scover": "http://i0.hdslb.com/bfs/manga-static/a6ed17ddac9bb568cefeb4eda8f8f3298db6c8cd.jpg",
"vcover": "http://i0.hdslb.com/bfs/manga-static/6d82d75a9a2817a18e16e2b82f76312d0fd02d06.jpg",
"bought_ep_count": 36,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 44,
"ctime": "2021-03-11 23:58:50",
"last_short_title": "44",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 12793711,
"comic_id": 28537,
"comic_title": "前男友成为了那样的男子",
"hcover": "https://i0.hdslb.com/bfs/manga-static/33440f7675a424dcce35459e2392e23e9d345531.jpg",
"scover": "http://i0.hdslb.com/bfs/manga-static/3de961215ad2a96ccf5dbb45d85db88934b545cb.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/77feff2a5f1aab93060e8ce5105e5616cb7313a7.jpg",
"bought_ep_count": 3,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 54,
"ctime": "2021-03-06 19:20:03",
"last_short_title": "44",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 12751111,
"comic_id": 26009,
"comic_title": "辉夜大小姐想让我告白 ~天才们的恋爱头脑战~",
"hcover": "https://i0.hdslb.com/bfs/manga-static/7fe349fd5a3d9522546e1582ad03604e82b1ff41.png",
"scover": "http://i0.hdslb.com/bfs/manga-static/b0ac1e3379e940c47b31209edf016e32e8bcee37.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/6188cad7ec7ac2b0555c0a815f9d2afbe7c0c5cb.jpg",
"bought_ep_count": 2,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 259,
"ctime": "2021-03-05 00:16:13",
"last_short_title": "269",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 12479079,
"comic_id": 27867,
"comic_title": "邪神与厨二病少女",
"hcover": "https://i0.hdslb.com/bfs/manga-static/96594b34528640f51ef5062648b55c871f4d4b1b.jpg",
"scover": "https://i0.hdslb.com/bfs/manga-static/54a7f8d35024ef46dc270dc758d882bc98c4a1c5.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/1b07c3be74d65cbb707934de190af10ca81588f3.jpg",
"bought_ep_count": 194,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 216.5,
"ctime": "2021-02-23 00:18:06",
"last_short_title": "216.5",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 11749927,
"comic_id": 29119,
"comic_title": "足艺少女小村同学",
"hcover": "https://i0.hdslb.com/bfs/manga-static/30b7917fd7d8b0afe6d913f09bab31e5eafae8b6.jpg",
"scover": "https://i0.hdslb.com/bfs/manga-static/f4ec445bc209ad473cdf9127528c09e271535617.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/8f83793c06dc0f59cab3a6acf4b978dc3c0a01f9.jpg",
"bought_ep_count": 13,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 58,
"ctime": "2021-01-31 11:04:31",
"last_short_title": "最终话",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 11605399,
"comic_id": 29053,
"comic_title": "如果是理想中的女儿,就算是世界最强也能受到宠爱吗?",
"hcover": "https://i0.hdslb.com/bfs/manga-static/5a7886e2b94515ea75a3ea34d9c77db3f2487b59.jpg",
"scover": "https://i0.hdslb.com/bfs/manga-static/88f6d08fed2998aba96cedbfdffba555bef4d1c1.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/517a155372e7de966cca2f5f42edabd31a90b169.jpg",
"bought_ep_count": 5,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 28,
"ctime": "2021-01-25 19:40:15",
"last_short_title": "28",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 11386175,
"comic_id": 28656,
"comic_title": "就算这样,“步”还是靠了过来",
"hcover": "http://i0.hdslb.com/bfs/manga-static/c95456b2d00f84293bda62b12539d19172b45db1.jpg",
"scover": "http://i0.hdslb.com/bfs/manga-static/2601c1474cd214d28797381e70b2c19ac7d67869.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/3a556ed655ddf84c7930b3ce180fbdbf8f1d8112.jpg",
"bought_ep_count": 2,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 160,
"ctime": "2021-01-17 10:48:29",
"last_short_title": "160",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 11356706,
"comic_id": 26731,
"comic_title": "在魔王城说晚安",
"hcover": "https://i0.hdslb.com/bfs/manga-static/061f63826f1aa24a5b9346f79b915999004b13da.jpg",
"scover": "http://i0.hdslb.com/bfs/manga-static/94ae037dae4cc61d580c5c3c42702ccf10d977dc.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/2958043a10024ddebfafc4fd47d3566043689300.jpg",
"bought_ep_count": 148,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 292,
"ctime": "2021-01-16 11:25:47",
"last_short_title": "292",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
},
{
"id": 11079049,
"comic_id": 27355,
"comic_title": "堀与宫村",
"hcover": "https://i0.hdslb.com/bfs/manga-static/b51b905707664415dab91cf81fb0373f970b54b5.jpg",
"scover": "https://i0.hdslb.com/bfs/manga-static/6ac604dfd0ad6c486a520519983212d74c340f28.jpg",
"vcover": "https://i0.hdslb.com/bfs/manga-static/c29ba3ce67613539666582d31d42b40fb48cc3c7.jpg",
"bought_ep_count": 119,
"gold_status": 2,
"coupon_status": 2,
"comic_status": 0,
"last_ord": 126,
"ctime": "2021-01-05 12:52:59",
"last_short_title": "page.122",
"buy_type": 0,
"ep_for_chapters": 0,
"orders": [
{
"id": 2,
"title": "漫读券"
},
{
"id": 3,
"title": "通用券"
},
{
"id": 1,
"title": "漫币"
}
],
"enable_auto_pay": false,
"type": 0
}
]
}
```
</details>

277
docs/manga/index_file.md Normal file
View File

@@ -0,0 +1,277 @@
# data.index
- [data.index文件解析](#data.index文件解析)
- [获取data.index](#获取data.index)
- [文件解密算法](#文件解密算法)
- [进行解密操作](#进行解密操作)
- [data.index内容](#data.index内容)
---
## data.index文件解析
本解密及数据解析例程以《在魔王城说晚安 第 1 话 不眠之城的公主》为例
本话链接https://manga.bilibili.com/mc26731/329893 mcid=`26731`, epid=`329893`
使用 Python 语言为例
### 获取data.index
直接使用 GET 方法请求该话对应的 data.index 文件地址,就会得到一个二进制文件
```bash
curl -s 'https://manga.hdslb.com/bfs/manga/26731/329893/data.index?token=4b93ced19dc5ade671064804232ef4f5&ts=634e1943' | hexdump -C
```
data.index 文件内容的 HEX 如下
首部有 9 Byte 作为 File Magic 内容是 ASCII 编码的 `BILICOMIC`
```
00000000 42 49 4c 49 43 4f 4d 49 43 f5 43 06 04 7f 68 08 |BILICOMIC.C...h.|
00000010 00 ad 08 05 00 6b 68 00 00 a5 08 05 00 6b 68 00 |.....kh......kh.|
00000020 00 a5 08 0c 00 6b 68 69 6e c1 6d 7d 2e 0f 09 74 |.....khin.m}...t|
00000030 ec 33 c3 8f 5c 2c 64 86 df 40 a4 82 58 9c 42 f5 |.3..\,d..@..X.B.|
00000040 ab 21 51 4d aa f9 f1 e0 84 84 9b 40 12 58 87 1e |.!QM.......@.X..|
00000050 ba 28 29 7d ce 89 04 03 d9 91 8d fd 7e 31 1d be |.()}........~1..|
00000060 ba d8 35 ef cb a0 83 db 71 5e f1 ee f1 90 19 43 |..5.....q^.....C|
00000070 03 dd 32 f7 b8 7a b7 07 7f b9 3f 7d 3a d5 54 7e |..2..z....?}:.T~|
00000080 5f fa e2 bd c1 90 bb 0f 9c 7d 34 e4 f0 49 2f 17 |_........}4..I/.|
00000090 39 1b c0 cc 45 25 47 72 76 34 13 12 b9 12 f9 f3 |9...E%Grv4......|
000000a0 8b b9 56 13 72 be 60 5e 55 27 5f 98 e0 3e 41 78 |..V.r.`^U'_..>Ax|
000000b0 d5 af 56 d0 82 3c d5 e0 55 94 70 d0 0c 16 5f 33 |..V..<..U.p..._3|
000000c0 c5 bb 14 d7 e9 e5 4a 7c 7f db 04 ea 7b 9b 90 94 |......J|....{...|
000000d0 fd 53 e1 d2 f8 86 1b 7c ea 97 dd 0b 22 33 75 39 |.S.....|...."3u9|
000000e0 24 76 39 38 6d 58 a4 ed b4 14 8f 71 49 95 9c cb |$v98mX.....qI...|
000000f0 eb 42 eb ec df a2 22 ae 39 0c 3d 03 95 43 27 55 |.B....".9.=..C'U|
00000100 c1 c8 b2 37 2c 01 b0 f4 22 7c 51 1a 93 b5 ab 6d |...7,..."|Q....m|
00000110 72 95 0c 33 9a ed 2d d6 22 f0 08 b6 5c bb f6 b5 |r..3..-."...\...|
00000120 07 5f cf a1 3a 66 c8 30 41 29 31 dd 17 63 46 85 |._..:f.0A)1..cF.|
00000130 ea 53 20 a0 aa 89 65 91 78 37 ac 4b 06 e6 59 7a |.S ...e.x7.K..Yz|
00000140 c2 b7 10 56 cc a0 2e 85 94 09 01 89 83 43 82 a4 |...V.........C..|
00000150 db 60 91 89 15 83 aa 45 aa d6 5f fd 6a 64 f9 1c |.`.....E.._.jd..|
00000160 9d ef c3 6c 34 85 e7 49 8a a7 c3 bc 32 09 eb b8 |...l4..I....2...|
00000170 ef 70 ab d6 6a d2 7f f6 96 b1 9a 75 eb f8 47 34 |.p..j......u..G4|
00000180 db 1d 99 78 57 58 04 4e e0 c4 a4 58 d8 81 f5 02 |...xWX.N...X....|
00000190 3c 42 7e 1c 27 98 3c 70 df 04 13 33 fa ff 21 3b |<B~.'.<p...3..!;|
000001a0 6c b4 52 ed 16 27 c8 c9 3a a5 fb 21 b9 dc a9 8a |l.R..'..:..!....|
000001b0 68 0a 38 f0 4c 33 55 96 a8 a5 dd b1 1a 75 b0 26 |h.8.L3U......u.&|
000001c0 83 ea a4 49 23 03 77 42 bd f3 f1 5d 82 a8 73 67 |...I#.wB...]..sg|
000001d0 2f ef 67 49 14 69 8c b9 d6 62 2c 8d 43 93 f2 b9 |/.gI.i...b,.C...|
000001e0 d2 bd 21 4f 2d 48 20 f6 02 d0 05 17 d3 8e 1b 9d |..!O-H .........|
000001f0 58 6c 6a 67 a9 ef 64 ca 4d 9c 40 17 c3 6f 2a 70 |Xljg..d.M.@..o*p|
00000200 36 0b 14 4c 51 a9 4f ff b9 75 42 b2 8f 2c fb c3 |6..LQ.O..uB..,..|
00000210 d1 13 2c 0b de 48 24 64 24 6f 88 b4 eb af cf ce |..,..H$d$o......|
00000220 66 3a 12 58 dc 3f c5 03 94 a3 e1 ef 1d 59 ca d5 |f:.X.?.......Y..|
00000230 58 07 b8 e3 c9 71 b2 e0 c9 15 54 4c cd e1 62 19 |X....q....TL..b.|
00000240 66 4e 02 f0 a0 85 8c a4 b5 f6 47 e3 c9 dd c3 54 |fN........G....T|
00000250 4d fc c8 45 e7 8f 22 00 68 e0 46 f4 ec 19 b4 b0 |M..E..".h.F.....|
00000260 f8 01 53 21 68 ad 49 6b 37 f5 fa 5f 0e 18 07 f3 |..S!h.Ik7.._....|
00000270 14 bf 03 59 f4 d5 5e a7 9c fd e1 90 9b 18 a9 12 |...Y..^.........|
00000280 b1 a7 2c 52 1d d2 b8 81 c7 3d 22 6f 5b de f9 4e |..,R.....="o[..N|
00000290 ba 38 c0 84 99 5d e3 7b ba 04 e1 e1 9a 0d bc 31 |.8...].{.......1|
000002a0 ef 6e 79 5c 38 e7 1d 72 9a 51 ea 55 6e fb a1 b8 |.ny\8..r.Q.Un...|
000002b0 75 29 b3 06 a9 52 10 53 17 24 e6 84 4b 00 f5 59 |u)...R.S.$..K..Y|
000002c0 81 28 ad cd cc dd a9 a6 56 a5 06 e7 65 39 6b 89 |.(......V...e9k.|
000002d0 5c 13 ba 51 c0 48 91 fc 74 19 b5 f9 bd d4 d5 44 |\..Q.H..t......D|
000002e0 ea 6a e7 02 6c 96 9d ed 2d d7 37 49 7f c3 e2 cd |.j..l...-.7I....|
000002f0 ff 0e f7 90 ea 88 7e bc 17 4a df e5 fb 98 93 3f |......~..J.....?|
00000300 01 a5 08 fa ff 3b 23 07 08 ac 60 82 8a be 6a 00 |.....;#...`...j.|
00000310 00 dd 02 05 00 3b 23 01 02 b1 08 11 00 63 68 08 |.....;#......ch.|
00000320 00 a5 08 05 00 62 00 87 8a 70 0a 05 00 13 62 00 |.....b...p....b.|
00000330 00 ac 08 05 00 6b 68 00 00 a5 08 05 00 6b 68 00 |.....kh......kh.|
00000340 00 a5 08 6c 6e 0f 0d 78 2e c1 69 71 50 20 6d 06 |...ln..x..iqP m.|
00000350 00 a5 08 05 01 6b 69 00 37 a5 08 05 0c 68 68 00 |.....ki.7....hh.|
00000360 00 a5 |..|
```
### 文件解密算法
首先以`mcid`对应漫画id以及`epid`(对应单话)生成一个 8 Byte 的数组作为密钥
具体内容为前 4 Byte 为 epid 后 4 Byte 为 mcid字节排序均为小端序 MSB First
接下来从返回数据的 09H 处开始,逐字节与密钥取单个字节进行 **XOR异或**运算,密钥数组每 8 Byte 循环一次
解密成功的数据是一个 zip 格式的压缩文件,提取`index.dat`中的数据并以 JSON 数据解析就完成了
### 进行解密操作
`mcid=26731` `epid=329893`,计算得到的数组便是密钥
```python
mcid = 26731
epid = 329893
key = list(epid.to_bytes(4, 'little') + mcid.to_bytes(4, 'little'))
print(key)
```
```python
[165, 8, 5, 0, 107, 104, 0, 0]
```
拉取索引数据并解密,需要**跳过前 9 Byte**,这时候已经能看到数据具有 zip 格式压缩文件的特征,前两 Byte 为 “PK”50H 4BH
```python
import requests
data = requests.get('https://manga.hdslb.com/bfs/manga/26731/329893/data.index?token=0ba7042d3a5d138c59151316a1914058&ts=634e53fb').content
temp = bytearray(data[9:])
for i in range(len(temp)):
temp[i] ^= key[i % 8]
print(temp)
```
```python
bytearray(b'PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00index.dat\xec\x96\xcb\x8a\\G\x0c\x86\xdf\xe5\xac\x87X\xf7*\xf5\xab\x84YH\xaa\x92\x99\xe0\x84!\x93E\x123\xef\x1e\xba\x8d!x\xce\xe2l\x03\xd94\x85\xf8~Zu\xbe\xba}=\xea\xcb\xcb\xeb\xdbq\xfb\xf9\xeb\xf1\xfbqC\x03x:\xf2\xb8\x11\xdf\x07\x7f\x1c7x:\xbe<~__\xea\xb8\xc1\xfb\xd3\x0f\x9c\xd8<\xe1\xf0"G\x179\xbe\xc8\xc9EN/rv\x91\x1b\x17\xb9y\x91\xf3\x8b\x1c^\x16r\xd5\x08^U\x82W\x9d\xe0U)x\xd5\n^\xd5\x82W\xbd\xe0U1x\xd5\x0c}73\xc5\x1e\x1c\xd2\xe9\x8e"|\x7f~\x0c\xef{\xf0\xf8\x94\xfd\xf6\xe9\xd7\xf8\xeds|\xea2\xd5\x0e"X\x1d9$\xd31=m3\xcc\xed\xb4\xb1\x87tI\xfe\xf4\xcb\xeb\xe7\xe3\xe9\xdf\xc9J\xae9\xa95\x06\x95(OU\xc1m\xba2,j\xd8\xf4"\xd9Y\x1f\x93\xde\xc3mr0\x046\x9a\x86E\xd6"U\x00\xb3\\\xd0\x9e\xb5\x07\xfa\xc7\xa4:\r\xa00A\x8c9\xd8\x17\x08.\x85\xea\xf6(\xa5\xaa\xe2\r\x91x\x92\xa4N\x06\x8d1z\xc2\x12\x18S\xcc\xcbF\x85\x94\xac\t\x8c\x83(\xea\xa4\xdb\xc5\x99\x8c\x15\xe8\xc2E\xaasW\xf8j\x0f\x91\x1c\x9dJ\xcbi4\xee\x8fI\x8a\x02\xcb\xb92b\x83\xb8\xef\xd5\xa3\xd3j\xb9\x17\xf6\x96\x14\x92p\xeb\x93/4\xdb\xb8\x91}W3lN\xe0a\xac]\xd8\xea\x9d\x02<\xe7v\x19\'\xf3Tp\xdf\xa1\x1b6\xfa\x94I;l\x11Z\xe8\x16L\xa0\xc9:\x00\xf3$\xb9\xb7\xc1\x8ah\xaf0\xf5LX=\x96\xa8\x00\xd5\xb4\x1a\x1e\xd8&\x83O\xacL#h\x1fB\xbdV\xf9X\x82\xc3\x1bg/JoL\x14\x02\xe4\xb9\xd6\xc7$\x88C\xf8\x9a\xb9\xd2\x18)J-#H\xf6\x02u\r\x12\xd3\xe5s\x9dX\xc9bb\xa9\x84\x0c\xcaM9H\x12\xc3\x04Bp6\xae\x1cIQ\xc2\'\xff\xb9\xd0J\xb7\x8fG\x93\xc3\xd1\xb6$\x0e\xde#Ld$\xca\x80\xb1\xeb\xc4\xa7\xcef\x9f\x1a]\xdcT\xad\x03\x94\x06\xe9\xea\x1d2\xa2\xd5X\xa2\xb0\xe6\xc9\x1a\xda\xe0\xc9\xb0\\I\xcd\x8a\n\x19f\xeb\n\xf5\xa0\xee\xe4\xa4\xb5SO\xe6\xc9\xb6\xabTMY\xc0@\xe7\xe4J\x00hEN\xf1\xecr\xdc\xb0\xf8\xa4[$h\xc6!k7P\xf2Z\x0eso\xf3\x14\x1a\x0b\\\xf4\xbe6\xa7\x9cX\xe9\x95\x9bs\xc1\x12\xb1\x02$W\x1d\xb9\xd0\x81\xc7\x98*j[\xb5\x91N\xba\x9d\xc8\x81\x996\x8b{\xba\xa1\xe9\xe4\x9af\xd41\xef\xcbqY8\x8cur\x9a\xf4\xe2Pn\x90\xc9\xb8u\x8c\xbb\x03\xa99xS\x17\x81\xee\x81Kk\x9dY\x81\x8d\xa5\xc8\xcc\xb6\xc1\xa6V\x00\x0e\xe2eR\x03\x89\\\xb6\xb2T\xc0#\xf9\xfct\xbc\xbd\xfc\xbd\xbf\xbdD\xea\xcf\xef\x07l\xfd\xf5\xed-r?L\x7f\xa8\x8a\xcd\xff\xab\xff\x95\xea\xe3\x16\xbc\x17\xef\xd7\xe0\xfb\xf3\xfb?\x01\x00\x00\xff\xffPK\x07\x08\th\x87\x8a\xd5\x02\x00\x00x\n\x00\x00PK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\th\x87\x8a\xd5\x02\x00\x00x\n\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00index.datPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x007\x00\x00\x00\x0c\x03\x00\x00\x00\x00')
```
进行解压缩数据,提取`index.dat`中的数据
```python
import zipfile
from io import BytesIO
with zipfile.ZipFile(BytesIO(temp)) as zf:
index_data = zf.read('index.dat')
print(index_data)
```
JSON 内容如下:
<details>
<summary>查看json内容</summary>
```json
{
"clips": [
{"r": 1600, "b": 2300, "t": 0, "l": 0, "pic": 0},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 1},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 2},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 3},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 4},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 5},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 6},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 7},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 8},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 9},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 10},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 11},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 12},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 13},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 14},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 15},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 16},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 17},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 18},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 19},
{"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 20},
{"r": 846, "b": 1200, "t": 0, "l": 0, "pic": 21}
],
"pics": [
"/bfs/manga/fc655fa220dfab74bb91b9b6e308e92e1f74fc4b.jpg",
"/bfs/manga/cb3c882f5a72c45385541e65dba6ac7689c24ebc.jpg",
"/bfs/manga/9f79683a30a1f165a6abcd2550066bd0f9bce719.jpg",
"/bfs/manga/592702a6411a8739d041d50cff9ac52ccc3e0ab1.jpg",
"/bfs/manga/52fb305a77f80d4078469c67ca4c4d8031722acc.jpg",
"/bfs/manga/d3bb31ca1943c2558eca9df9a44b7fb52d927f1e.jpg",
"/bfs/manga/2ac06b8dbaae0499edf7fb6cd99c1fe4b424a96f.jpg",
"/bfs/manga/98f63f139ecf30e3b037635fc1f59fb40388e947.jpg",
"/bfs/manga/55099ea5e0e198482ea6d216a5e41b02835701b7.jpg",
"/bfs/manga/ee60daaf9ca659bb0df7d45402c86c79a1f64739.jpg",
"/bfs/manga/8620f9742fddc97d4179f18fd2b9f1b1420138dd.jpg",
"/bfs/manga/0490a9d8bdb6312ac56baa24ed0595a2465d98dc.jpg",
"/bfs/manga/bc3234cb0ba2be2b724b1a640a418f1db7b2ac43.jpg",
"/bfs/manga/0d16c5e9779f187916e4b173e7a6447b14707ece.jpg",
"/bfs/manga/58f3985afc3f2cf57052725dfea47af5634ac1c8.jpg",
"/bfs/manga/de09b30d952566c2c1308f5da59a2ffb3b2deb5c.jpg",
"/bfs/manga/36ecc5565340605883cb000f513b49bfc91e0d3e.jpg",
"/bfs/manga/120f3174def02b3dd908ee69b427d094506b884d.jpg",
"/bfs/manga/fdbe3bd0d446c0129557bd19037785456e55f12c.jpg",
"/bfs/manga/813a1bb68c3f89616583c8662fa81984d6a907db.jpg",
"/bfs/manga/fd3a53f04831e577707e4c873e2fc205e71d5cde.jpg",
"/bfs/manga/50e1c513336e0685ca01723d64c712294e534ca0.jpg"
],
"sizes": [
{"cx": 1600, "cy": 2300},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 1600, "cy": 2468},
{"cx": 846, "cy": 1200}
]
}
```
</details>
## data.index内容
以下内容为解密后的 JSON 数据定义
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ----- | -------- | ---- |
| clips | array | 尺寸信息 | |
| pics | array | 图片路径 | |
| sizes | array | 尺寸信息 | |
根对象中的`clips`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 第 1 页信息 | |
| n | obj | 第 (n+1) 页信息 | |
| …… | obj | …… | …… |
`clips`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------ | ------------- |
| r | num | 图片宽度 | |
| b | num | 图片高度 | |
| t | num | (?) | |
| l | num | (?) | |
| pic | num | 图片页码序号 | 从 0 开始递增 |
根对象中的`pics`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------------- | ------------------------------ |
| 0 | str | 第 1 图片路径 | 图片不能直接访问,需要二次鉴权 |
| n | str | 第 (n+1) 图片路径 | |
| …… | str | …… | …… |
根对象中的`sizes`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------------- | ---- |
| 0 | obj | 第 1 页信息 | |
| n | obj | 第 (n+1) 页信息 | |
| …… | obj | …… | …… |
`clips`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| cx | num | 图片宽度 | |
| cy | num | 图片高度 | |

204
docs/manga/light_card.md Normal file
View File

@@ -0,0 +1,204 @@
# 获取轻享卡信息
> https://manga.bilibili.com/twirp/card.v1.Card/GetUserLightCard
*请求方式POST*
是否需要登录:`是`
认证方式CookieSESSDATA/ APP
Content-Type`application/x-www-form-urlencoded`
**URL参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|------------|-----|----------------|-----|-----------------|
| access_key | str | 登录`access_key` | | 与`SESSDATA`二选其一 |
**json回复**
根对象:
| 字段名 | 类型 | 内容 | 备注 |
|------|-----|------|------|
| code | num | 响应码 | 0成功 |
| msg | str | | |
| data | obj | 信息本体 | |
`data`对象:
| 字段名 | 类型 | 内容 | 备注 |
|--------------------|-------|----------------|---------------------------------|
| state | num | 轻享卡开通状态 | 0未开通<br/>1已开通 |
| show_state | num | | |
| expire_date | str | 轻享卡到期时间 | |
| receive_amount | num | 已领取数量 | |
| save_money | num | 已节省漫币 | |
| index | num | 默认选择签到周期 | |
| week | array | 一个领取周期内的领取状态信息 | |
| month_reward_state | num | 是否可选择全勤奖 | 0不可领取<br/>1可领取<br/>2不可领取灰色 |
| month_reward | num | | |
| cur_month_end | str | 全勤奖领取剩余时间 | |
| server_time | str | 当前服务器时间 | |
`week`数组中的对象:
| 字段名 | 类型 | 内容 | 备注 |
|-------------------|-----|-------------|------------------------------------------------|
| index | num | 第几领取周期 | 从`1`开始 |
| start_time | str | 本周期领取开始时间 | 1待领取<br/>2已领取<br/>3明日可领<br/>4已失效<br/>5可领取 |
| end_time | str | 本周期领取结束时间 | `同上` |
| first | num | 本周期第1天的领取状态 | `同上` |
| second | num | 本周期第2天的领取状态 | `同上` |
| third | num | 本周期第3天的领取状态 | `同上` |
| fourth | num | 本周期第4天的领取状态 | `同上` |
| full_reward_state | num | 周期全勤奖领取状态 | 1不可领取<br/>2:可领取<br/>3已领取 |
**示例:**
`SESSDATA`方式:
```shell
curl -L -X POST 'https://manga.bilibili.com/twirp/card.v1.Card/GetUserLightCard' \
-H 'Cookie: SESSDATA=xxx'
```
`access_key`方式:
```shell
curl -L -X POST 'https://manga.bilibili.com/twirp/card.v1.Card/GetUserLightCard?access_key=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"state": 1,
"show_state": 1,
"expire_date": "2023-03-09T23:59:59+08:00",
"receive_amount": 18,
"save_money": 890,
"index": 1,
"week": [
{
"index": 1,
"start_time": "2023-02-10T00:00:00+08:00",
"end_time": "2023-02-16T23:59:59+08:00",
"first": 5,
"second": 1,
"third": 1,
"fourth": 1,
"full_reward_state": 1
},
{
"index": 2,
"start_time": "2023-02-17T00:00:00+08:00",
"end_time": "2023-02-23T23:59:59+08:00",
"first": 1,
"second": 1,
"third": 1,
"fourth": 1,
"full_reward_state": 1
},
{
"index": 3,
"start_time": "2023-02-24T00:00:00+08:00",
"end_time": "2023-03-02T23:59:59+08:00",
"first": 1,
"second": 1,
"third": 1,
"fourth": 1,
"full_reward_state": 1
},
{
"index": 4,
"start_time": "2023-03-03T00:00:00+08:00",
"end_time": "2023-03-09T23:59:59+08:00",
"first": 1,
"second": 1,
"third": 1,
"fourth": 1,
"full_reward_state": 1
}
],
"month_reward_state": 0,
"month_reward": 0,
"cur_month_end": "2023-03-10T00:00:00+08:00",
"server_time": "2023-02-10T10:59:43+08:00"
}
}
```
</details>
# 领取轻享卡奖励
> https://manga.bilibili.com/twirp/card.v1.Card/GetLightCoupon
*请求方式POST*
是否需要登录:`是`
认证方式CookieSESSDATA/ APP
Content-Type`application/json`
**URL参数**
| 参数名 | 类型 | 必填 | 内容 | 备注 |
|------------|-----|----|-----------------|----|
| access_key | str | | 与`SESSDATA`二选其一 | |
**正文参数( application/json **
| 参数名 | 类型 | 必填 | 内容 | 备注 |
|-----------|-----|----|-----|--------|
| weekIndex | num | √ | 第几周 | 从`1`开始 |
| type | num | √ | 第几天 | 从`1`开始 |
**json回复**
根对象:
| 字段名 | 类型 | 内容 | 备注 |
|------|-----|-----|----------------------------------------------------|
| code | num | 响应码 | 0成功<br/>3今日已领取,请明日再来<br/>3还未满足领取条件<br/>4找不到数据~ |
| msg | str | | |
| data | obj | | |
**示例:**
`SESSDATA`方式:
```shell
curl -L -X POST 'https://manga.bilibili.com/twirp/card.v1.Card/GetLightCoupon' \
-H 'content-type: application/json; charset=utf-8' \
-H 'Cookie: SESSDATA=xxx' \
--data-raw '{"type":1,"weekIndex":1}'
```
`access_key`方式:
```shell
curl -L -X POST 'https://manga.bilibili.com/twirp/card.v1.Card/GetLightCoupon?access_key=xxx' \
-H 'content-type: application/json; charset=utf-8' \
--data-raw '{"type":1,"weekIndex":1}'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": {}
}
```
</details>

451
docs/manga/point_shop.md Normal file
View File

@@ -0,0 +1,451 @@
# 积分商城
- [获取当前持有点数](#获取当前持有点数)
- [获取兑换奖品列表](#获取兑换奖品列表)
- [兑换物品](#兑换物品)
- [获取兑换历史记录](#获取兑换历史记录)
- [获取玩法说明](#获取玩法说明)
*积分商城由web页面提供功能地址为*
> https://manga.bilibili.com/eden/credits-exchange.html
## 获取当前持有点数
> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint
*请求方式POST*
认证方式CookieSESSDATA/ APP
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | |
| msg | str | 错误信息 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ------------ |
| point | str | 点数 | 不登录时为0 |
**示例:**
```bash
curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"point": "66666"
}
}
```
</details>
## 获取兑换奖品列表
> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct
*请求方式POST*
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | |
| msg | str | 错误信息 | |
| data | array | 奖品列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ---- |
| 0 | obj | 奖品1 | |
| n | obj | 奖品(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ------------ |
| id | num | 物品id | |
| type | num | 物品类型 | 0商城相关<br />3限免券<br />7福利券 |
| title | str | 物品名 | |
| image | str | 显示的图像 | 福利券为空 |
| amount | num | 库存总量 | |
| cost | num | 兑换所需点数(原价) | |
| real_cost | num | 兑换所需点数(现价) | |
| remain_amount | num | 库存剩余数 | |
| comic_id | num | 相关漫画id | |
| limits | array | 限定使用范围(漫画) | 限免券所适用的漫画 |
| discount | num | (?) | 目前恒为0 |
| product_type | num | 物品类型 | 1限免券、福利券<br />4商城满99立减10元券、商城5元无门槛券<br />5商城5魔晶 |
| pendant_url | str | (?) | |
| pendant_expire | num | (?) | 0限免券、福利券<br />7商城满99立减10元券、商城5元无门槛券、商城5魔晶 |
| exchange_limit | num | 兑换次数限制 | |
| address_deadline | str | (?) | |
| act_type | num | (?) | 目前恒为0 |
| has_exchanged | bool | 是否兑换过该物品 | |
| main_coupon_deadline | str | 兑换后使用截止时间 | |
| deadline | str | 兑换后使用截止时间 | |
| point | str | (?) | 目前恒为0 |
**示例:**
```bash
curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": [
{
"id": 195,
"type": 7,
"title": "积分兑换",
"image": "",
"amount": 15999,
"cost": 200,
"real_cost": 100,
"remain_amount": 0,
"comic_id": 0,
"limits": [],
"discount": 0,
"product_type": 1,
"pendant_url": "",
"pendant_expire": 7,
"exchange_limit": 0,
"address_deadline": "0001-01-01T00:00:00Z",
"act_type": 0,
"has_exchanged": false,
"main_coupon_deadline": "0001-01-01T00:00:00Z",
"deadline": "",
"point": "0"
},
{
"id": 1009,
"type": 0,
"title": "商城5魔晶",
"image": "",
"amount": 500,
"cost": 260,
"real_cost": 30,
"remain_amount": 0,
"comic_id": 0,
"limits": [],
"discount": 0,
"product_type": 5,
"pendant_url": "",
"pendant_expire": 0,
"exchange_limit": 1,
"address_deadline": "0001-01-01T00:00:00Z",
"act_type": 0,
"has_exchanged": false,
"main_coupon_deadline": "2022-03-22T23:59:59+08:00",
"deadline": "2022-03-22T23:59:59+08:00",
"point": "0"
},
{
"id": 1008,
"type": 0,
"title": "商城满99立减10元券",
"image": "",
"amount": 400,
"cost": 2000,
"real_cost": 400,
"remain_amount": 390,
"comic_id": 0,
"limits": [],
"discount": 0,
"product_type": 4,
"pendant_url": "",
"pendant_expire": 0,
"exchange_limit": 1,
"address_deadline": "0001-01-01T00:00:00Z",
"act_type": 0,
"has_exchanged": false,
"main_coupon_deadline": "2022-03-22T23:59:59+08:00",
"deadline": "2022-03-22T23:59:59+08:00",
"point": "0"
},
{
"id": 1007,
"type": 0,
"title": "商城5元无门槛券",
"image": "",
"amount": 200,
"cost": 1000,
"real_cost": 200,
"remain_amount": 134,
"comic_id": 0,
"limits": [],
"discount": 0,
"product_type": 4,
"pendant_url": "",
"pendant_expire": 0,
"exchange_limit": 1,
"address_deadline": "0001-01-01T00:00:00Z",
"act_type": 0,
"has_exchanged": false,
"main_coupon_deadline": "2022-03-22T23:59:59+08:00",
"deadline": "2022-03-22T23:59:59+08:00",
"point": "0"
},
{
"id": 1536,
"type": 3,
"title": "白兔糖",
"image": "http://i0.hdslb.com/bfs/manga-static/c3369754789a77b5d0b15cc31c75538ac035b3aa.jpg",
"amount": 4000,
"cost": 100,
"real_cost": 75,
"remain_amount": 3991,
"comic_id": 27164,
"limits": [
{
"type": 1,
"id": 27164,
"title": "白兔糖"
}
],
"discount": 0,
"product_type": 1,
"pendant_url": "",
"pendant_expire": 7,
"exchange_limit": 0,
"address_deadline": "0001-01-01T00:00:00Z",
"act_type": 0,
"has_exchanged": false,
"main_coupon_deadline": "0001-01-01T00:00:00Z",
"deadline": "",
"point": "0"
}
]
}
```
</details>
## 兑换物品
> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange
*请求方式POST*
认证方式CookieSESSDATA/ APP
**正文参数( application/x-www-form-urlencoded 或 application/json**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| product_id | str | 物品id | 必要 | |
| product_num | num | 兑换个数 | 必要 | |
| point | num | 物品所需点数 | 必要 | 现价real_cost |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0兑换成功<br />1积分不足<br />1您点的太快了~<br />2库存不足<br />3product point mismatchpoint填写错误<br />3超过用户最大可兑换数量<br />4现在抢票的人太多啦再点一下有机会优先上车喔 ε=ε=(ノ≧∇≦) |
| message | str | 错误信息 | |
**示例:**
```bash
curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange' \
--data-urlencode 'product_id=195' \
--data-urlencode 'product_num=1' \
--data-urlencode 'point=real_cost' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": ""
}
```
</details>
## 获取兑换历史记录
> https://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList
*请求方式POST*
认证方式CookieSESSDATA/ APP
**正文参数( application/x-www-form-urlencoded 或 application/json**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ |
| act_id | num | 固定值90018 | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | |
| msg | str | 错误信息 | | |
| data | obj | 信息本体 |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | -------- | ---- |
| prizes | obj | 兑换记录 | |
| addr | obj | (?) | |
`data`中的`prizes`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ------------ |
| user_prize_id | str | 兑换id? | |
| prize_id | num | 兑换的物品id | |
| ctime | str | 兑换时间 | |
| addr | null | (?) | |
| deadline | str | 过期时间 | |
| type | num | 类型 | 1限免券、福利券<br />8商城5魔晶 |
| name | str | 物品名 | |
**示例:**
```bash
curl 'https://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList' \
--data-urlencode 'act_id=90018' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"prizes": [
{
"user_prize_id": "55117444",
"prize_id": 1009,
"ctime": "2022-03-21T12:22:53+08:00",
"addr": null,
"deadline": "0001-01-01T00:00:00Z",
"type": 8,
"name": "商城5魔晶"
},
{
"user_prize_id": "2594073385420523088",
"prize_id": 1536,
"ctime": "2022-03-21T12:07:24+08:00",
"addr": null,
"deadline": "0001-01-01T00:00:00Z",
"type": 1,
"name": "白兔糖限免卡"
},
{
"user_prize_id": "4899916394614914913",
"prize_id": 195,
"ctime": "2021-12-24T12:01:08+08:00",
"addr": null,
"deadline": "0001-01-01T00:00:00Z",
"type": 1,
"name": "积分兑换"
},
{
"user_prize_id": "1152921504636496551",
"prize_id": 195,
"ctime": "2021-12-13T12:05:13+08:00",
"addr": null,
"deadline": "0001-01-01T00:00:00Z",
"type": 1,
"name": "积分兑换"
}
],
"addr": {
"name": "",
"phone": "",
"address": "",
"id_card": ""
}
}
}
```
</details>
## 获取玩法说明
> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule
*请求方式POST*
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| code | num | 返回值 | |
| msg | str | 错误信息 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| rule | str | 玩法说明 | |
**示例:**
```bash
curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "",
"data": {
"rule": "日常兑换说明:\n1、赛季积分达到一定数量可兑换积分商城内相应的商品\n2、日常兑换奖品的刷新时间为每日中午12点每天可兑换的奖品总数有限具体可见商品页面展示请尽快兑换。\n3、兑换的福利券限免卡奖品有效期详见兑换框内显示或卡券包内详情说明哦请及时在有效期内使用。\n4、赛季积分有效期为当前赛季时长每期赛季时长详见福利中心页面倒计时显示请及时在有效期内进行使用。\n5、赛季积分可在福利中心完成特定任务获取具体详情可至福利中心查看部分活动也可获取赛季积分可随时关注活动信息哦。"
}
}
```
</details>

65
docs/message/msg.md Normal file
View File

@@ -0,0 +1,65 @@
# 通知消息
- [未读消息数](#未读消息数)
---
## 未读消息数
> https://api.bilibili.com/x/msgfeed/unread
*请求方式GET*
认证方式CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
data 对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------------- | ------------ |
| at | num | 未读at数 | |
| chat | num | 0 | 作用尚不明确 |
| like | num | 未读点赞数 | |
| reply | num | 未读回复数 | |
| sys_msg | num | 未读系统通知数 | |
| up | num | UP主助手信息数 | |
**示例:**
以下信息代表了未读点赞数为10未读回复数为4未读at消息数为3未读系统通知数为2UP主助手信息数为1
```shell
curl 'https://api.bilibili.com/x/msgfeed/unread' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"at": 3,
"chat": 0,
"like": 10,
"reply": 4,
"sys_msg": 2,
"up": 1
}
}
```
</details>

374
docs/message/private_msg.md Normal file
View File

@@ -0,0 +1,374 @@
# 私信
- [未读私信数](#未读私信数)
- [发送私信web端](#发送私信web端)
- [私信消息记录](#私信消息记录)
---
## 未读私信数
> https://api.vc.bilibili.com/session_svr/v1/session_svr/single_unread
*请求方式GET*
认证方式CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-6账号未登录 |
| message | str | 错误信息 | 默认为ok |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------- | ---- | -------------------- | ---- |
| unfollow_unread | num | 未关注用户未读私信数 | |
| follow_unread | num | 已关注用户未读私信数 | |
| _gt_ | num | 0 | |
**示例:**
以下信息代表了为未关注用户未读私信数为`1`条,已关注用户未读私信数为`6`
```shell
curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/single_unread' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "ok",
"message": "ok",
"data": {
"unfollow_unread": 1,
"follow_unread": 6,
"_gt_": 0
}
}
```
</details>
## 发送私信web端
> https://api.vc.bilibili.com/web_im/v1/web_im/send_msg
*请求方式POST*
认证方式CookieSESSDATA
**正文参数application/x-www-form-urlencoded**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------------ | ------------------------------------ | ------------------------ | ------ | -------------------------------------- |
| msg[sender_uid] | num | 发送者mid | 必要 | |
| msg[receiver_id] | num | 接收者mid | 必要 | |
| msg[receiver_type] | num | 1 | 必要 | 固定为1 |
| msg[msg_type] | num | 消息类型 | 必要 | 1:发送文字<br>2:发送图片<br>5:撤回消息 |
| msg[msg_status] | num | 0 | 非必要 | |
| msg[dev_id] | string | 372778FD-E359-461D-86A3-EA2BCC6FF52A | 必要 | **获取方式在下面** |
| msg[timestamp] | num | 时间戳(秒) | 必要 | |
| msg[content] | 发送文字时str<br />撤回消息时num | 消息内容 | 必要 | **详见下表** |
| csrf | str | CSRF Token位于cookie | 必要 | |
---
**dev_id的获取**
以JS为例
```javascript
const deviceid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (function (name) {
let randomInt = 16 * Math.random() | 0;
return ("x" === name ? randomInt : 3 & randomInt | 8).toString(16).toUpperCase()
}));
```
代码来自 [andywang425/BLTH](https://github.com/andywang425/BLTH/blob/45fe93e31754ca8bf07059d46266398e787dbf45/B%E7%AB%99%E7%9B%B4%E6%92%AD%E9%97%B4%E6%8C%82%E6%9C%BA%E5%8A%A9%E6%89%8B.js#L6618)
以Java为例
```java
public class Util{
private String getDevId() {
char[] b = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char[] s = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".toCharArray();
for (int i = 0; i < s.length; i++) {
if ('-' == s[i] || '4' == s[i]) {
continue;
}
int randomInt = (int) (16 * Math.random());
if ('x' == s[i]) {
s[i] = b[randomInt];
} else {
s[i] = b[3 & randomInt | 8];
}
}
return new String(s);
}
}
```
---
`msg[content]`消息内容:
当发送文字时(`msg[msg_type]=1`
该参数为json序列字串
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---- |
| content | str | 私信内容 | |
当发送图片时(`msg[msg_type]=2`
该参数为json序列字串
根对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | :-------------------------------------------- |
| url | str | 图片url | 默认为B站相簿图片上传通道<br />也可用三方图床 |
| width | num | 图片的宽 | 单位:像素(非必要) |
| height | num | 图片的高 | 单位:像素(非必要) |
| type | str | 图片格式 | (非必要) |
| original | num | 1 | **作用未知**(非必要) |
| size | num | 文件大小 | 单位:千字节(非必要)<br>__向上取整__ |
当撤回消息时(`msg[msg_type]=5`
该参数为数值,为目标消息的` msg_key `
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------- |
| code | num | 返回值 | 0成功<br> |
| message | str | 错误信息 | 默认为ok |
| ttl | num | | 默认为1 |
| data | obj | 主体 | 出错时为空 |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ---- | ---------- | ------------ |
| msg_key| num | 消息唯一id | |
| msg_content | str | 发送的消息 | |
| key_hit_infos | obj | | 作用尚不明确 |
**示例:**
给目标用户`mid=1`发一条文字私信:
> up主你好
>
> 催更[doge]
```shell
curl 'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg' \
--data-urlencode 'msg[sender_uid]=293793435' \
--data-urlencode 'msg[receiver_id]=1' \
--data-urlencode 'msg[receiver_type] =1' \
--data-urlencode 'msg[msg_type]=1' \
--data-urlencode 'msg[dev_id] =372778FD-E359-461D-86A3-EA2BCC6FF52A' \
--data-urlencode 'msg[timestamp] =1626181379' \
--data-urlencode 'msg[content]={"content":"up主你好\n催更[doge]"}' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{"code":0,
"message":"0",
"ttl":1,
"data":{"msg_key":6984393491767669026,
"msg_content":"up主你好\n催更[doge]",
"key_hit_infos":{}}}
```
</details>
给目标用户`mid=1`发一条图片私信:
> <img src="https://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" style="zoom:50%;" >
```shell
curl 'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg' \
--data-urlencode 'msg[sender_uid]=293793435' \
--data-urlencode 'msg[receiver_id]=1' \
--data-urlencode 'msg[receiver_type] =1' \
--data-urlencode 'msg[msg_type]=2' \
--data-urlencode 'msg[content]={"url":https://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg}' \
--data-urlencode 'csrf_token=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"msg":"ok",
"message":"ok",
"data":{
"msg_key":6852570013146024354,
"_gt_":0
}
}
```
</details>
## 私信消息记录
> https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs
*请求方式GET*
此接口有设计缺陷,能够获取已经撤回,无法显示(如 发送私信 中msg[msg_type]:3的消息
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------------ | ------------------ |
| sender_device_id | num | 发送者设备 | 可选 | 1 |
| talker_id | num | 聊天对象的UID | 必要 | -------------- |
| session_type | num | 聊天对象的类型 | 必要 | 1为用户2为粉丝团 |
| size | num | 列出消息条数 | 可选 | 默认是20 |
| build | num | 未知 | 可选 | 默认是0 |
| mobi_app | str | 设备 | 可选 | web |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------ | -------- | ---------------------------- |
| code | num | 返回值 | 0成功 <br />-400请求错误 |
| msg | str | 错误信息 | 默认为0 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | array | 数据列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| messages | array | 聊天记录列表 | |
| has_more | num | 0 | |
| min_seqno | num | 未知 | |
| max_seqno | num | 未知 | |
| e_infos | array | 聊天表情列表 | |
`messages`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| sender_uid | num | 发送者uid | 注意名称是sender_uid |
| receiver_type | num | 与session_type对应 | 1为用户2为粉丝团 |
| receiver_id | num | 接收者uid | 注意名称是receiver_id |
| msg_type | num | 消息类型 | 1:文字消息<br>2:图片消息<br>5:撤回的消息<br>12、13:通知 |
| content | str | 消息内容 | 此处存在设计缺陷 |
| msg_seqno | num | 未知 | |
| timestamp | num | 消息发送时间戳 | |
| at_uids | array | 未知 | |
| msg_key | num | 未知 | |
| msg_status | num | 消息状态 | 0 |
| notify_code |str | 未知 | |
| new_face_version |num | 未知 | 疑似只在粉丝团消息中出现 |
`e_infos`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| text | str | 表情名称 | |
| uri | str | 表情链接 | |
| size | num | 表情尺寸 | 1 |
**示例:**
获取与目标用户`mid=123`私信记录:
```shell
curl 'https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs?sender_device_id=1&talker_id=123&session_type=1&size=20&build=0&mobi_app=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {
"messages": [
{
"sender_uid": 2239814,
"receiver_type": 1,
"receiver_id": 123,
"msg_type": 1,
"content": "{\"content\":\"[口罩]\"}",
"msg_seqno": 309675413389322,
"timestamp": 1654154093,
"at_uids": [
0
],
"msg_key": 7104537732714964358,
"msg_status": 0,
"notify_code": "",
"new_face_version": 1
},
{
"sender_uid": 2239814,
"receiver_type": 1,
"receiver_id": 123,
"msg_type": 5,
"content": "{\"content\":\"1\"}",
"msg_seqno": 308302399586307,
"timestamp": 1654072255,
"at_uids": [
0
],
"msg_key": 7104186240789226795,
"msg_status": 0,
"notify_code": ""
},
],
"has_more": 0,
"min_seqno": 308188515844097,
"max_seqno": 309675413389322,
"e_infos": [
{
"text": "[口罩]",
"url": "http://i0.hdslb.com/bfs/emote/3ad2f66b151496d2a5fb0a8ea75f32265d778dd3.png",
"size": 1
}
]
}
}
```
</details>

456
docs/newbie_exam/action.md Normal file
View File

@@ -0,0 +1,456 @@
# 操作
- [提交答题](#提交答题)
- [提交基础题](#提交基础题)
- [提交附加题](#提交附加题)
- [提交自选题](#提交自选题)
- [获取验证码](#获取验证码)
- [提交验证码](#提交验证码)
- [提交自选题分类](#提交自选题分类)
- [提前交卷](#提前交卷)
---
## 提交答题
### 提交基础题
> https://api.bilibili.com/x/answer/v4/base/check
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------- | ---- | ------------------------ | -------------- | ------------------------------------------ |
| question_id | num | 题目id | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 |
| ans_hash | str | 选项hash | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />41014答题过快或错误太多<br />41012用户答题提交题目id不合法<br />41020用户基础题已通过<br />41023用户答题记录不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ------------ | ----------------------------------- |
| passed | bool | 选项是否正确 | true选项正确<br />false选项错误 |
**示例:**
提交题目id为`104`的题选项hash为`cb4c8cc9424fc771f7c1598e74de498f`
```shell
curl 'https://api.bilibili.com/x/answer/v4/base/check' \
--data-urlencode 'question_id=104' \
--data-urlencode 'ans_hash=cb4c8cc9424fc771f7c1598e74de498f' \
--data-urlencode 'csrf=xxxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"passed": true
}
}
```
</details>
### 提交附加题
> https://api.bilibili.com/x/answer/v4/base/check
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------- | ---- | ------------------------ | -------------- | ------------------------------------------ |
| question_id | num | 题目id | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 |
| ans_hash | str | 选项hash | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />41014答题过快或错误太多<br />41012用户答题提交题目id不合法<br />41023用户答题记录不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ------------ | ----------------------------------- |
| passed | bool | 选项是否正确 | true选项正确<br />false选项错误 |
**示例:**
提交题目id为`104`的题选项hash为`cb4c8cc9424fc771f7c1598e74de498f`
```shell
curl 'https://api.bilibili.com/x/answer/v4/base/check' \
--data-urlencode 'question_id=104' \
--data-urlencode 'ans_hash=cb4c8cc9424fc771f7c1598e74de498f' \
--data-urlencode 'csrf=xxxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"passed": true
}
}
```
</details>
### 提交自选题
> https://api.bilibili.com/x/answer/v4/pro/check
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------- | ---- | ------------------------ | -------------- | ------------------------------------------ |
| question_id | num | 题目id | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 |
| ans_hash | str | 选项hash | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 |
| csrf | str | CSRF Token位于cookie | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />41014答题过快或错误太多<br />41012用户答题提交题目id不合法<br />41023用户答题记录不存在<br />41026获取用户DB题目信息异常 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ---- | ---------- |
| passed | bool | true | 恒为`true` |
**示例:**
提交题目id为`2935`的题选项hash为`ffd55cbe0624f466bee2ea3eb576a4d0`
```shell
curl -G 'https://api.bilibili.com/x/answer/v4/pro/check' \
--data-urlencode 'question_id=2935' \
--data-urlencode 'ans_hash=ffd55cbe0624f466bee2ea3eb576a4d0' \
--data-urlencode 'csrf=xxxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"passed": true
}
}
```
</details>
## 获取验证码
> https://api.bilibili.com/x/answer/v4/captcha
*请求方式GET*
认证方式APP或CookieSESSDATA
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />41010用户答题非法访问<br />41014答题过快或错误太多<br />41020用户基础题已通过<br />41021用户基础题未通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ---- | ----------- | ------------- |
| type | str | 验证码类型? | geetest极验 |
| gt | str | 极验id | |
| challenge | str | 极验key | |
| token | str | (?) | |
| url | str | (?) | |
**示例:**
```shell
curl 'https://api.bilibili.com/x/answer/v4/captcha' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"type": "geetest",
"gt": "abc55d1fb914cb110cfb4c232a4b4c35",
"challenge": "90a6e03e626e13ee186ddae0107c3ae2",
"token": "",
"url": ""
}
}
```
</details>
## 提交验证码
> https://api.bilibili.com/x/answer/v4/captcha/check
*请求方式POST*
认证方式APP或CookieSESSDATA
**注:**
旧版`edition=0`同时提交自选题分类以及验证码
新版`edition=2`仅仅提交验证码
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------------- | ---- | ---------------------- | -------------- | ---------------- |
| types | nums | 自选题分类(旧版) | 非必要 | 新版不需要此字段 |
| type | str | 验证码类型 | 非必要 | |
| bilibili_token | str | | 非必要 | |
| bilibili_code | str | | 非必要 | |
| geetest_challenge | str | 极验key | 非必要 | |
| geetest_seccode | str | 极验结果+\|jordan | 非必要 | |
| geetest_validate | str | 极验结果 | 非必要 | |
| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-105验证码错误<br />-400请求错误<br />41010用户答题非法访问<br />41014答题过快或错误太多<br />41021用户基础题未通过<br />41031自选题未通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
```shell
curl 'https://api.bilibili.com/x/answer/v4/captcha/check' \
--data-urlencode 'types=' \
--data-urlencode 'type=geetest' \
--data-urlencode 'bilibili_token=' \
--data-urlencode 'bilibili_code=' \
--data-urlencode 'geetest_challenge=3f809a7a9c51edca751fd26c032c182d' \
--data-urlencode 'geetest_seccode=513ec576a275a3eb250829202d4dce46|jordan' \
--data-urlencode 'geetest_validate=513ec576a275a3eb250829202d4dce46' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 提交自选题分类
> https://api.bilibili.com/x/answer/v4/pro/type/check
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------------------- | -------------- | ---- |
| types | nums | 自选题分类(新版) | 必要 | |
| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />41010用户答题非法访问<br />41014答题过快或错误太多<br />41021用户基础题未通过<br />41031自选题未通过<br />41052用户题目类型不合法<br />41055基础附加题未通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
选择`游戏` `影视` `科教/知识` `动画/动漫`分类
```shell
curl 'https://api.bilibili.com/x/answer/v4/pro/type/check' \
--data-urlencode 'types=1,2,3,4' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>
## 提前交卷
> https://api.bilibili.com/x/answer/v4/submit
*请求方式POST*
认证方式APP或CookieSESSDATA
当当前得分>=60时可请求本接口提前完成答题
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------------------- | -------------- | ---- |
| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />41014答题过快或错误太多<br />41023用户答题记录不存在<br />41031自选题未通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ---------------- | -------------------------------------------- |
| hid | num | 答题会话id | |
| mid | num | 答题用户mid | |
| score | num | 得分 | |
| status | num | 0 | |
| number | num | 0 | |
| result | str | succeed | |
| stage | str | result | |
| version | str | 版本 | 目前为`v4` |
| start_time | num | 本次答题开始时间 | 时间戳 |
| first_answer | num | 0 | |
| progress | str | | |
| text | str | | |
| url | str | | |
| in_reg_audit | bool | | |
| edition | num | 答题版本 | 0旧版40+10+50<br />2新版40+30+30 |
| rewards | null | | |
| captcha | num | 1 | |
**示例:**
```shell
curl 'https://api.bilibili.com/x/answer/v4/submit' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"hid": 1623207905520705,
"mid": 293793435,
"score": 63,
"status": 3,
"number": 0,
"result": "succeed",
"stage": "result",
"version": "v4",
"start_time": 1636889218,
"first_answer": 0,
"progress": "",
"text": "",
"url": "",
"in_reg_audit": false,
"edition": 0,
"rewards": null,
"captcha": 1
}
}
```
</details>

263
docs/newbie_exam/fetch.md Normal file
View File

@@ -0,0 +1,263 @@
# 拉取题目
- [拉取基础题](#拉取基础题)
- [拉取附加题](#拉取附加题)
- [拉取自选题](#拉取自选题)
---
## 拉取基础题
> https://api.bilibili.com/x/answer/v4/base
*请求方式GET*
认证方式Cookie或APP
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多<br />41020用户基础题已通过<br />41023用户答题记录不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ---- |
| question | obj | 题目内容 | |
`data`中的`question`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ----- | ------------------ | ------------------------------------------------------------ |
| id | num | 问题id | **问题id不代表题图因为选项是打乱的** |
| number | num | 当前题号 | |
| q_height | num | 问题部分总高度 | |
| q_coord_y | num | 问题部分Y裁剪起始 | 当然是0 |
| image | str | 题图url | 题目文字+所有的选项文字排版成一张图存储在bfs中 |
| from | str | 问题来源页面url | 如“xx弹幕是否违规”所在的视频页 |
| options | array | 选项列表 | |
| type_id | num | 题目父类型id | 见[查询自选题分类](info.md#查询自选题分类)<br />**注36为基础题** |
| type_name | str | 分院小电视提示文案 | 如xx小电视 |
| type_image | str | 分院小电视图标url | |
`question`中的`options`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----- | ---------------------- |
| 0 | obj | 选项A | |
| 1 | obj | 选项B | 选项至少2个 |
| 2 | obj | 选项C | 数组长度取决于选项个数 |
| 3 | obj | 选项D | |
`question`中的`options`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ----------------- | ------------------------ |
| number | num | 选项序号 | 如1为A 2为B |
| high | num | 选项部分总高度 | |
| coord_y | num | 选项部分Y裁剪起始 | |
| hash | str | 选项hash | 作为提交对应选项时应传参 |
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/answer/v4/base' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"question": {
"id": 6511,
"number": 1,
"q_height": 38.4,
"q_coord_y": 0,
"image": "https://i0.hdslb.com/bfs/member/9d7f1f1f0b7478a621d1b998a5a98982.png",
"from": "",
"options": [
{
"number": 1,
"high": 42,
"coord_y": 38.4,
"hash": "f7619d6c2040d44f39dc87a7aa34fb9e"
},
{
"number": 2,
"high": 42,
"coord_y": 80.4,
"hash": "dce5140040f40ca4030783585684369d"
}
],
"type_id": 36,
"type_name": "小电视校长",
"type_image": "https://i0.hdslb.com/bfs/face/7b67c0c0da64a6ab059ff49bb0d4b92988b91806.png"
}
}
}
```
</details>
## 拉取附加题
> https://api.bilibili.com/x/answer/v4/extra
*请求方式GET*
认证方式Cookie或APP
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多<br />41021用户基础题未通过<br />41023用户答题记录不存在<br />41054用户附加题已通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
同[拉取基础题](#拉取基础题)的`data`对象
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/answer/v4/extra' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"question": {
"id": 11492,
"number": 44,
"q_height": 76.8,
"q_coord_y": 0,
"image": "https://i0.hdslb.com/bfs/member/b6c846613bd0b44cd7c8af1d83e3f0c2.png",
"from": "https://www.bilibili.com/video/av14659093",
"options": [
{
"number": 1,
"high": 42,
"coord_y": 76.8,
"hash": "ca15e6009047cf82358c50ab90fd8d9e"
},
{
"number": 2,
"high": 42,
"coord_y": 118.8,
"hash": "60e86a1c736c68da3462f66377e4e8ca"
}
],
"type_id": 36,
"type_name": "小电视校长",
"type_image": "https://i0.hdslb.com/bfs/face/7b67c0c0da64a6ab059ff49bb0d4b92988b91806.png"
}
}
}
```
</details>
## 拉取自选题
> https://api.bilibili.com/x/answer/v4/pro
*请求方式GET*
认证方式Cookie或APP
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多<br />41021用户基础题未通过<br />41023用户答题记录不存在<br />41051用户答题验证码未通过<br />41055基础附加题未通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
同[拉取基础题](#拉取基础题)的`data`对象
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/answer/v4/pro' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"question": {
"id": 824,
"number": 54,
"q_height": 38.4,
"q_coord_y": 0,
"image": "https://i0.hdslb.com/bfs/member/417e02be5652f79d0312fa2fcee28869.png",
"from": "",
"options": [
{
"number": 1,
"high": 42,
"coord_y": 38.4,
"hash": "c4574c23cf728c19abeab3e7525258d4"
},
{
"number": 2,
"high": 42,
"coord_y": 80.4,
"hash": "ffd48760758fbb8a2c183d1d04f692f8"
},
{
"number": 3,
"high": 42,
"coord_y": 122.4,
"hash": "898d414dff49fe20c4a1da1e148fadb2"
},
{
"number": 4,
"high": 42,
"coord_y": 164.4,
"hash": "09018443f09d8ef4f6fec5e96e082270"
}
],
"type_id": 1,
"type_name": "游戏小电视",
"type_image": "https://i0.hdslb.com/bfs/face/6590bee26086fed66ee7cc5bac26a32d2f733037.png"
}
}
}
```
</details>

556
docs/newbie_exam/info.md Normal file
View File

@@ -0,0 +1,556 @@
# 查询信息
- [查询答题状态](#查询答题状态)
- [查询自选题分类](#查询自选题分类)
- [查询答题结果](#查询答题结果)
---
## 查询答题状态
> https://api.bilibili.com/x/answer/v4/status
*请求方式GET*
认证方式Cookie或APP
**json回复**
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ------------------ | ------------------------------------------------------------ |
| hid | num | 答题会话id | |
| mid | num | 答题用户mid | |
| score | num | 当前得分 | |
| status | num | 答题状态 | 0未答题<br />2答题中<br />3已通过 |
| number | num | 当前题号 | |
| result | str | 是否通过答题 | failed未通过<br />succeed已通过 |
| stage | str | 当前答题阶段 | base基础题<br />extra附加题<br />pro_type等待选择自选题类型<br />pro自选题<br />complete已完成 |
| version | str | 答题版本 | 当前为`v4` |
| start_time | num | 本次答题开始时间 | 时间戳 |
| first_answer | num | ? | |
| progress | str | 当前答题进度 | 百分比<br />60分为100% |
| text | str | 提示文案 | |
| url | str | 答题页面url | |
| in_reg_audit | bool | 是否为第一次答题 | |
| edition | num | 答题版本 | 0旧版40+10+50<br />2新版40+30+30 |
| rewards | null | (?) | |
| captcha | num | 是否已经提交验证码 | 1已提交<br />仅新版提交验证码后存在 |
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/answer/v4/status' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"hid": 1623207905520705,
"mid": 293793435,
"score": 2,
"status": 2,
"number": 2,
"result": "failed",
"stage": "base",
"version": "v4",
"start_time": 1623207905,
"first_answer": 2,
"progress": "3",
"text": "继续答题",
"url": "https://www.bilibili.com/h5/newbie/entry?navhide=1",
"in_reg_audit": false,
"edition": 0,
"rewards": null
}
}
```
</details>
## 查询自选题分类
> https://api.bilibili.com/x/answer/v4/pro/type
*请求方式GET*
认证方式Cookie或APP
当字段`edition`的值不同时,该接口返回的数据也不同
**json回复**
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | ---------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多<br />41021用户基础题未通过<br />41031自选题未通过<br />41055基础附加题未通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | array | 父分类列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 父分类1 | |
| n | obj | 父分类(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ----- | ---------- | ---- |
| id | num | 父分类id | |
| name | str | 父分类名 | |
| fields | array | 子分类列表 | |
`data`数组中的对象中的`fields`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 子分类1 | |
| n | obj | 子分类(n+1) | |
| …… | obj | …… | …… |
`fields`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| id | num | 子分类id | |
| name | str | 子分类名 | |
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/answer/v4/pro/type' \
-b 'SESSDATA=xxx'
```
旧版`edition=0`返回:
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"id": 1,
"name": "游戏",
"fields": [
{
"id": 8,
"name": "动作射击"
},
{
"id": 9,
"name": "冒险格斗"
},
{
"id": 12,
"name": "策略模拟 "
},
{
"id": 13,
"name": "角色扮演 "
},
{
"id": 14,
"name": "音乐体育 "
}
]
},
{
"id": 2,
"name": "影视",
"fields": [
{
"id": 15,
"name": "纪录片 "
},
{
"id": 16,
"name": "电影 "
},
{
"id": 17,
"name": "电视剧 "
}
]
},
{
"id": 3,
"name": "科技",
"fields": [
{
"id": 18,
"name": "军事 "
},
{
"id": 19,
"name": "地理 "
},
{
"id": 20,
"name": "历史 "
},
{
"id": 21,
"name": "文学 "
},
{
"id": 22,
"name": "数学 "
},
{
"id": 23,
"name": "物理 "
},
{
"id": 24,
"name": "化学 "
},
{
"id": 25,
"name": "生物 "
},
{
"id": 26,
"name": "数码科技 "
}
]
},
{
"id": 4,
"name": "动画",
"fields": [
{
"id": 27,
"name": "动画声优 "
},
{
"id": 28,
"name": "动漫内容 "
}
]
},
{
"id": 5,
"name": "艺术",
"fields": [
{
"id": 29,
"name": "ACG音乐 "
},
{
"id": 30,
"name": "三次元音乐 "
},
{
"id": 31,
"name": "绘画 "
}
]
},
{
"id": 6,
"name": "流行前线",
"fields": [
{
"id": 32,
"name": "娱乐 "
},
{
"id": 33,
"name": "时尚 "
},
{
"id": 34,
"name": "运动 "
}
]
},
{
"id": 7,
"name": "鬼畜",
"fields": [
{
"id": 35,
"name": "鬼畜 "
}
]
}
]
}
```
</details>
新版`edition=2`返回:
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"id": 1,
"name": "游戏",
"fields": [
{
"id": 1,
"name": "游戏"
}
]
},
{
"id": 2,
"name": "影视",
"fields": [
{
"id": 2,
"name": "影视"
}
]
},
{
"id": 3,
"name": "科教/知识",
"fields": [
{
"id": 3,
"name": "科教/知识"
}
]
},
{
"id": 4,
"name": "动画/动漫",
"fields": [
{
"id": 4,
"name": "动画/动漫"
}
]
},
{
"id": 5,
"name": "音乐/舞蹈",
"fields": [
{
"id": 5,
"name": "音乐/舞蹈"
}
]
},
{
"id": 32,
"name": "明星/娱乐",
"fields": [
{
"id": 32,
"name": "明星/娱乐"
}
]
},
{
"id": 35,
"name": "鬼畜",
"fields": [
{
"id": 35,
"name": "鬼畜"
}
]
},
{
"id": 42,
"name": "时尚/健身",
"fields": [
{
"id": 42,
"name": "时尚/健身"
}
]
}
]
}
```
</details>
## 查询答题结果
> https://api.bilibili.com/x/answer/v4/result
*请求方式GET*
认证方式:无
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------- | ------ | ---- |
| hid | num | 答题会话id | 必要 | |
**json回复**
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---------------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />41023用户答题记录不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ----- | ------------------------ | ----------------------------------- |
| hid | num | 答题会话id | |
| mid | num | 答题用户mid | |
| member | num | | |
| score | num | 得分 | |
| level | num | 用户等级 | |
| first_pass | num | | |
| uname | str | 用户昵称 | |
| face | str | 用户头像url | |
| status | str | 答题结果 | failed未通过<br />succeed已通过 |
| question_types | array | 已选择的自选题列表 | |
| power | array | 自选题分类得分情况 | |
| start_time | num | 开始答题时间 | 时间戳 |
| share | obj | | |
| can_show_rank_btn | bool | | |
| is_same_user | bool | | |
| view_more | str | | |
| video_info | obj | | |
| main_tids | array | | |
| sub_tids | array | | |
| power_result | null | | |
| score_rate | num | 分数超过平均用户的百分比 | |
| permission | obj | | |
| rewards | null | | |
**示例:**
```shell
curl -G 'https://api.bilibili.com/x/answer/v4/result' \
--data-urlencode 'hid=1615088061307609' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"hid": 1615088061307609,
"mid": 1386643599,
"member": 0,
"score": 70,
"level": 0,
"first_pass": 0,
"uname": "眉凭铱ひ前非",
"face": "http://i0.hdslb.com/bfs/face/cd83d4cdbfb521455c168eaa181915b40cb664d1.jpg",
"status": "succeed",
"question_types": [
{
"id": 12,
"name": "策略模拟 "
},
{
"id": 13,
"name": "角色扮演 "
},
{
"id": 14,
"name": "音乐体育 "
},
{
"id": 8,
"name": "动作射击"
},
{
"id": 9,
"name": "冒险格斗"
}
],
"power": [
{
"score": 0,
"name": "动画"
},
{
"score": 0,
"name": "艺术"
},
{
"score": 5,
"name": "游戏"
},
{
"score": 0,
"name": "科技"
},
{
"score": 0,
"name": "影视"
},
{
"score": 0,
"name": "鬼畜"
}
],
"start_time": 1615088061,
"share": {
"content": "",
"short_content": ""
},
"can_show_rank_btn": false,
"is_same_user": true,
"view_more": "",
"video_info": {
"url": "",
"name": "",
"img": "",
"watch_num": "",
"up_num": ""
},
"main_tids": [],
"sub_tids": [],
"power_result": null,
"score_rate": 84,
"permission": {
"reply": true,
"color_dm": true
}
}
}
```
</details>

135
docs/note/action.md Normal file
View File

@@ -0,0 +1,135 @@
# 笔记操作
- [保存视频笔记](#保存视频笔记)
- [删除视频笔记](#删除视频笔记)
---
## 保存视频笔记
> https://api.bilibili.com/x/note/add
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ---- | ------------------------ | ------ | ------------------------------------------------------------ |
| oid | num | 目标id | 必要 | |
| oid_type | num | 目标id类型 | 必要 | `0`视频(oid=avid) |
| note_id | num | 笔记id | 非必要 | 创建时无需此项 |
| title | str | 笔记标题 | 必要 | |
| summary | str | 笔记预览文本 | 必要 | |
| content | str | 笔记正文json序列 | 必要 | 格式见[附表](readme.md#附表-笔记正文序列格式) |
| tags | str | 笔记跳转标签列表 | 非必要 | |
| cls | num | 1 | 非必要 | 作用尚不明确 |
| from | str | 提交类型 | 非必要 | `auto`自动提交<br />`save`手动提交<br />`close`关闭时自动提交 |
| cont_len | num | 正文字数 | 非必要 | |
| platform | str | 平台 | 非必要 | 可为`web` |
| publish | num | 是否公开笔记 | 非必要 | `0`不公开<br />`1`公开 |
| auto_comment | num | 是否添加到评论区 | 非必要 | `0`不添加<br />`1`添加 |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | `0`成功 <br />`-101`账号未登录<br />`-111`csrf校验失败<br />`-400`请求错误<br />`79508`该稿件已存在笔记,无法新增<br />`79513`笔记所属视频不合法 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------------ | ---- |
| note_id | num | 笔记id | |
**示例:**
保存内容为加粗的STRONG的笔记`3809605586518023``av970322090`
```shell
curl 'https://api.bilibili.com/x/note/add' \
--data-urlencode 'oid=970322090' \
--data-urlencode 'oid_type=0' \
--data-urlencode 'note_id=3809605586518023'
--data-urlencode 'title=周刊哔哩哔哩排行榜#543'
--data-urlencode 'summary=STRONG'
--data-urlencode 'content=[{"attributes":{"bold":true},"insert":"STRONG"},{"insert":"\n"}]'
--data-urlencode 'tags='
--data-urlencode 'cls=1'
--data-urlencode 'from=save'
--data-urlencode 'csrf=xxx'
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"note_id": 3809605586518023
}
}
```
</details>
## 删除视频笔记
> https://api.bilibili.com/x/note/del
*请求方式POST*
认证方式CookieSESSDATA
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------- | ---- | ------------------------ | ------ | ---- |
| oid | num | 目标稿件avid | 必要 | |
| note_id | num | 笔记id | 非必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功 <br />-101账号未登录<br />-111csrf校验失败<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
**示例:**
删除稿件`av457253380`下的笔记`4075968478576647`
```shell
curl 'https://api.bilibili.com/x/note/del' \
--data-urlencode 'oid=457253380' \
--data-urlencode 'note_id=4075968478576647' \
--data-urlencode 'csrf=xxx'
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1
}
```
</details>

315
docs/note/info.md Normal file

File diff suppressed because one or more lines are too long

660
docs/note/list.md Normal file
View File

@@ -0,0 +1,660 @@
# 笔记列表
- [查询稿件私有笔记](#查询稿件私有笔记)
- [查询用户私有笔记](#查询用户私有笔记)
- [查询稿件公开笔记](#查询稿件公开笔记)
- [查询用户公开笔记](#查询用户公开笔记)
---
## 查询稿件私有笔记
> https://api.bilibili.com/x/note/list/archive
*请求方式GET*
认证方式CookieSESSDATA
该接口只能查询私有笔记,无法查询公开笔记
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ------------------------ | ------ | ----------------- |
| oid | num | 目标id | 必要 | |
| oid_type | num | 目标id类型 | 必要 | `0`视频(oid=avid) |
| csrf | str | CSRF Token位于cookie | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | -------- | -------------------------------------------------- |
| noteIds | array | 笔记列表 | 无笔记则无此项<br />可能后续会允许视频添加多个笔记 |
`data`中的`noteIds`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------ | ---- |
| 0 | str | 笔记id | |
**示例:**
查询视频`av970322090`的笔记id
```shell
curl 'https://api.bilibili.com/x/note/list/archive' \
--data-urlencode 'oid=970322090' \
--data-urlencode 'oid_type=0' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code":0,
"message":"0",
"ttl":1,
"data":{
"noteIds":[
"3809605586518023"
]
}
}
```
</details>
## 查询用户私有笔记
> https://api.bilibili.com/x/note/list
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------- | ---- | ------------ | ----------- | ------------------------------------------------------- |
| ps | num | 每页项数 | 必要 | |
| pn | num | 页码 | 必要 | |
| csrf | str | CSRF Token位于cookie | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ----- | -------- | ------------ |
| list | array | 明细列表 | |
| page | obj | 页面信息 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---------------- |
| 0 | obj | 笔记1 | |
| n | obj | 笔记n+1 | 按照创建顺序排列 |
| …… | obj | …… | …… |
`list`中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------------------- | ---- | ------------ | ------------------------- |
| title | str | 笔记标题 | |
| summary | str | 笔记预览文本 | |
| mtime | str | 提交时间 | YYYY-MM-DD hh:mm |
| arc | obj | 视频信息 | |
| note_id | num | 笔记id | |
| audit_status | num | 0 | 作用尚不明确 |
| web_url | str | 笔记h5页url | |
| note_id_str | str | 笔记id str | |
| message | str | 更新信息 | "更新于 YYYY-MM-DD hh:mm" |
| forbid_note_entrance | bool | (?) | |
| likes | num | 点赞数 | |
| has_like | bool | 是否点赞 | |
`list`中的`arc`中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ------------ | ---------------------- |
| oid | num | 目标id | |
| bvid | str | 稿件bvid | |
| pic | str | 稿件封面图片url | |
| desc | str | 视频简介 | |
| status | num | 0 | |
| oid_type | num | 目标id类型 | `0`视频(oid=avid) |
| aid | num | 稿件avid | |
`data`中的`page`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ------------ | -------------------- |
| total | num | 笔记总数 | |
| size | num | 每页项数 | |
| num | num | 页码 | |
**示例:**
```shell
curl 'https://api.bilibili.com/x/note/list' \
--data-urlencode 'ps=10' \
--data-urlencode 'pn=1'
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"list": [
{
"title": "2022哔哩哔哩拜年纪",
"summary": " ...",
"mtime": "2022-02-16 16:46",
"arc": {
"oid": 338677252,
"bvid": "BV1fR4y1T7aV",
"pic": "http://i2.hdslb.com/bfs/archive/1e683a5363f35aa0a65419dbf145177099e38f90.jpg",
"desc": "愿大家看的开心!新年快乐,虎年大吉,欧气十足,万事顺意!ヾ(≧▽≦*)o",
"status": 0,
"oid_type": 0,
"aid": 338677252
},
"note_id": 24508729145690110,
"audit_status": 0,
"web_url": "https://www.bilibili.com/h5/note-app?oid=338677252&oid_type=0&pagefrom=fullpage&navhide=1&-Bct.statusbar.mode=0",
"note_id_str": "24508729145690112",
"message": "更新于 2022-02-16 16:46",
"forbid_note_entrance": false,
"likes": 0,
"has_like": false
}
],
"page": {
"total": 1,
"size": 10,
"num": 1
}
}
}
```
</details>
## 查询稿件公开笔记
> https://api.bilibili.com/x/note/publish/list/archive
*请求方式GET*
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ---------- | ------ | ----------------- |
| oid | num | 目标id | 必要 | |
| oid_type | num | 目标id类型 | 必要 | `0`视频(oid=avid) |
| ps | num | 每页项数 | 必要 | |
| pn | num | 页码 | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------------- | ----- | ------------ | ---- |
| list | array | 公开笔记列表 | |
| page | obj | 页面信息 | |
| show_public_note | bool | | |
| message | str | | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---------------- |
| 0 | obj | 笔记1 | |
| n | obj | 笔记n+1 | 按照创建顺序排列 |
| …… | obj | …… | …… |
`list`中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------------------- | ------------------------- |
| cvid | num | 公开笔记对应的专栏cvid | |
| title | str | 笔记标题 | |
| summary | str | 笔记预览 | |
| pubtime | str | 发布时间 | YYYY-MM-DD hh:mm |
| web_url | str | 笔记h5页url | |
| message | str | 更新信息 | "更新于 YYYY-MM-DD hh:mm" |
| author | obj | 作者信息 | |
| likes | num | 点赞数 | |
| has_like | bool | 是否点赞 | 需要登录(Cookie) |
`list`中的对象中的`author`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ---------- | ---- |
| mid | num | 用户mid | |
| name | str | 昵称 | |
| face | str | 头像url | |
| level | num | 用户等级 | |
| vip_info | obj | 会员信息 | |
| pendant | obj | 头像框信息 | |
**示例:**
查询视频`av338677252`的公开笔记列表
```shell
curl 'https://api.bilibili.com/x/note/publish/list/archive' \
--data-urlencode 'oid=338677252' \
--data-urlencode 'oid_type=0' \
--data-urlencode 'ps=10' \
--data-urlencode 'pn=1'
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"list": [
{
"cvid": 15160286,
"title": "2022哔哩哔哩拜年纪",
"summary": "我决定再重新做一个系列,叫做影评系列 那么我们这一次是影系列的第n期 我也不知道是多少期,到时候回去统计一下 今天的影评是写2022年哔哩哔哩拜年纪 【...",
"pubtime": "2022-02-07 23:44",
"web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15160286&pagefrom=ugcvideo",
"message": "更新于 2022-02-07 23:44",
"author": {
"mid": 523870870,
"name": "夜达星xxxxxxx",
"face": "http://i1.hdslb.com/bfs/face/2cdfd277e63b6bb1f400ed616b5caf0a04196f28.jpg",
"level": 3,
"vip_info": {
"type": 0,
"status": 0,
"due_date": 0,
"vip_pay_type": 0,
"theme_type": 0,
"label": {
"path": "",
"text": "",
"label_theme": "",
"text_color": "",
"bg_style": 0,
"bg_color": "",
"border_color": ""
},
"avatar_subscript": 0,
"nickname_color": "",
"role": 0,
"avatar_subscript_url": ""
},
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0,
"image_enhance": "",
"image_enhance_frame": ""
}
},
"likes": 7,
"has_like": false
},
{
"cvid": 15086217,
"title": "2022哔哩哔哩拜年纪",
"summary": "节目表,多图预警,方便各位时间戳跳转…… 01:20 New Day [图片] 06:32 重返哔哩楼1 [图片] 11:06 嗨,...",
"pubtime": "2022-02-01 20:07",
"web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15086217&pagefrom=ugcvideo",
"message": "更新于 2022-02-01 20:07",
"author": {
"mid": 3810985,
"name": "Remレム22",
"face": "http://i1.hdslb.com/bfs/face/4cce970eb1b9fb8b322d49133a11caa630178728.jpg",
"level": 6,
"vip_info": {
"type": 2,
"status": 1,
"due_date": 1694880000000,
"vip_pay_type": 1,
"theme_type": 0,
"label": {
"path": "",
"text": "年度大会员",
"label_theme": "annual_vip",
"text_color": "#FFFFFF",
"bg_style": 1,
"bg_color": "#FB7299",
"border_color": ""
},
"avatar_subscript": 1,
"nickname_color": "#FB7299",
"role": 3,
"avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png"
},
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0,
"image_enhance": "",
"image_enhance_frame": ""
}
},
"likes": 22,
"has_like": false
},
{
"cvid": 15080841,
"title": "2022哔哩哔哩拜年纪",
"summary": "2022哔哩哔哩拜年纪从厨师的角度开始了故事而厨师象征着每个人每一道菜都是每个厨师用汗水耕耘出来的并且在主线故事中穿插这不同的小故事代表了近几年生...",
"pubtime": "2022-02-01 10:10",
"web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15080841&pagefrom=ugcvideo",
"message": "更新于 2022-02-01 10:10",
"author": {
"mid": 482114483,
"name": "沐曦mornal",
"face": "http://i2.hdslb.com/bfs/face/cf1ef9c2045e317dfe6dbe8659b6f7a69c7572d5.jpg",
"level": 4,
"vip_info": {
"type": 1,
"status": 1,
"due_date": 1646755200000,
"vip_pay_type": 1,
"theme_type": 0,
"label": {
"path": "",
"text": "大会员",
"label_theme": "vip",
"text_color": "#FFFFFF",
"bg_style": 1,
"bg_color": "#FB7299",
"border_color": ""
},
"avatar_subscript": 1,
"nickname_color": "",
"role": 1,
"avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png"
},
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0,
"image_enhance": "",
"image_enhance_frame": ""
}
},
"likes": 7,
"has_like": false
},
{
"cvid": 15080246,
"title": "2022哔哩哔哩拜年纪",
"summary": "niumniumnium~~~33是我的菜了 这次的跨年纪呢确实不同于以往。我发现现代技术确实给类似的活动提供了平台与支持但是不可否认的是bilibi...",
"pubtime": "2022-02-01 08:59",
"web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15080246&pagefrom=ugcvideo",
"message": "更新于 2022-02-01 08:59",
"author": {
"mid": 1049943541,
"name": "吃瓜的DINGBALL",
"face": "http://i1.hdslb.com/bfs/face/93e7a3826586338e15e5703f9d49bb3bbd0adfa5.jpg",
"level": 2,
"vip_info": {
"type": 1,
"status": 0,
"due_date": 1641744000000,
"vip_pay_type": 0,
"theme_type": 0,
"label": {
"path": "",
"text": "",
"label_theme": "",
"text_color": "",
"bg_style": 0,
"bg_color": "",
"border_color": ""
},
"avatar_subscript": 0,
"nickname_color": "",
"role": 0,
"avatar_subscript_url": ""
},
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0,
"image_enhance": "",
"image_enhance_frame": ""
}
},
"likes": 10,
"has_like": false
},
{
"cvid": 15077197,
"title": "2022哔哩哔哩拜年纪",
"summary": "23333333333333333333333333333333333333333333333333333333333333333333333333333...",
"pubtime": "2022-01-31 22:53",
"web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15077197&pagefrom=ugcvideo",
"message": "更新于 2022-01-31 22:53",
"author": {
"mid": 433136442,
"name": "KiBi_3",
"face": "http://i0.hdslb.com/bfs/face/4c11d1419316f14b8b0f5c146d0cd34627955244.jpg",
"level": 2,
"vip_info": {
"type": 0,
"status": 0,
"due_date": 0,
"vip_pay_type": 0,
"theme_type": 0,
"label": {
"path": "",
"text": "",
"label_theme": "",
"text_color": "",
"bg_style": 0,
"bg_color": "",
"border_color": ""
},
"avatar_subscript": 0,
"nickname_color": "",
"role": 0,
"avatar_subscript_url": ""
},
"pendant": {
"pid": 0,
"name": "",
"image": "",
"expire": 0,
"image_enhance": "",
"image_enhance_frame": ""
}
},
"likes": 2,
"has_like": false
},
{
"cvid": 15077019,
"title": "2022哔哩哔哩拜年纪",
"summary": "2022加油吖~~~~~~~~~~~~~~~~~~~~~2022加油吖2022加油吖2022加油吖2022加油吖2022加油吖2022加油吖...",
"pubtime": "2022-01-31 22:36",
"web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15077019&pagefrom=ugcvideo",
"message": "更新于 2022-01-31 22:36",
"author": {
"mid": 11283554,
"name": "zhen_____",
"face": "http://i0.hdslb.com/bfs/baselabs/381fcc3865daf85bd6a1ddc4b6dfbd11ba937dc9.jpg",
"level": 6,
"vip_info": {
"type": 2,
"status": 1,
"due_date": 1730736000000,
"vip_pay_type": 0,
"theme_type": 0,
"label": {
"path": "",
"text": "年度大会员",
"label_theme": "annual_vip",
"text_color": "#FFFFFF",
"bg_style": 1,
"bg_color": "#FB7299",
"border_color": ""
},
"avatar_subscript": 1,
"nickname_color": "#FB7299",
"role": 3,
"avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png"
},
"pendant": {
"pid": 5459,
"name": "星座系列:巨蟹座",
"image": "http://i2.hdslb.com/bfs/garb/item/a6e5b6b36a4a6c00ca8881ecc837c2aa9ebcb53d.png",
"expire": 0,
"image_enhance": "http://i2.hdslb.com/bfs/garb/item/a6e5b6b36a4a6c00ca8881ecc837c2aa9ebcb53d.png",
"image_enhance_frame": ""
}
},
"likes": 5,
"has_like": false
}
],
"page": {
"total": 6,
"size": 10,
"num": 1
},
"show_public_note": true,
"message": ""
}
}
```
</details>
## 查询用户公开笔记
> https://api.bilibili.com/x/note/publish/list/user
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------------------ | ------ | ---- |
| ps | num | 每页项数 | 必要 | |
| pn | num | 页码 | 必要 | |
| csrf | str | CSRF Token位于cookie | 非必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误<br />-101账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ----- | -------- | ---- |
| list | array | 明细列表 | |
| page | obj | 页面信息 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---------------- |
| 0 | obj | 笔记1 | |
| n | obj | 笔记n+1 | 按照创建顺序排列 |
| …… | obj | …… | …… |
`data`中的`page`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---- | -------- | ---- |
| total | num | 笔记总数 | |
| size | num | 每页项数 | |
| num | num | 页码 | |
**示例:**
```shell
curl 'https://api.bilibili.com/x/note/publish/list/user' \
--data-urlencode 'ps=10' \
--data-urlencode 'pn=1'
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"page": {
"total": 0,
"size": 10,
"num": 1
}
}
}
```
</details>

159
docs/note/readme.md Normal file
View File

@@ -0,0 +1,159 @@
# 视频笔记
2020-11-16 B站推出了测试版的功能——"视频笔记"与视频稿件关联为富文本模式可供记录观看视频时的感悟以及视频中的重要内容目前只可在web端操作
笔记分为私有笔记和公开笔记,一个稿件只能添加一篇私有笔记,但可以公开多篇笔记
公开笔记与【专栏】性质相同,使用`cvid`寻址相应的公开笔记
---
**继续查看:**
- [笔记列表](list.md)
- [笔记详细信息](info.md)
- [笔记操作](action.md)
---
## 附表-笔记正文序列格式
根数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | obj | 第1个元素 | |
| n | obj | 第(n+1)个元素 | |
| …… | obj | …… | …… |
根数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------ | ------------------- |
| attributes | obj | 元素属性 | 无属性无此项 |
| insert | str | 元素内容 | 为跳转/图片时无此项 |
| insert | obj | 元素跳转信息 | 非跳转/图片时无此项 |
对象中的`attributes`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ---------- | ------------------------------ |
| bold | bool | 是否加粗 | |
| strike | bool | 是否删除线 | |
| underline | bool | 是否下划线 | |
| background | str | 背景颜色 | |
| color | str | 文字颜色 | |
| list | str | 列表属性 | ordered有序列表/bullet无序列表 |
| size | str | 文字字号 | |
对象中的`insert`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | -------- | ------ |
| tag | obj | 跳转标签 | 二选一 |
| imageUpload | obj | 笔记图片 | 二选一 |
`insert`中的`tag`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ----------------- | ------------ |
| cid | num | 视频cid | |
| status | num | 0 | 作用尚不明确 |
| index | num | 在稿件中的分P索引 | |
| seconds | num | 视频进度 | |
| cidCount | num | 稿件总分P数 | |
| key | str | 标签创建时间戳 | |
| title | str | output | 作用尚不明确 |
`insert`中的`imageUpload`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ---------- | ------------ |
| url | str | 图片链接 | |
| status | str | done | 作用尚不明确 |
| width | num | 图片宽度-2 | |
示例:
以下笔记正文序列包含`字号``加粗``高亮``普通文本`格式
```json
[
{
"attributes": {
"size": "24px",
"bold": true
},
"insert": "关掉"
},
{
"attributes": {
"size": "24px"
},
"insert": ""
},
{
"attributes": {
"size": "24px",
"bold": true
},
"insert": "关掉"
},
{
"insert": ""
},
{
"attributes": {
"background": "#fff359"
},
"insert": "一定要"
},
{
"attributes": {
"background": "#fff359",
"bold": true
},
"insert": "关掉"
},
{
"insert": "\n再不关掉那些"
},
{
"attributes": {
"bold": true
},
"insert": "网络游戏"
},
{
"insert": ",小孩哪有"
},
{
"attributes": {
"bold": true
},
"insert": "美好的未来"
},
{
"insert": ",哪有"
},
{
"attributes": {
"bold": true
},
"insert": "美好的前程"
},
{
"insert": ",祖国哪有"
},
{
"attributes": {
"bold": true
},
"insert": "栋梁之才"
},
{
"insert": "\n"
}
]
```

84
docs/other/API_sign.md Normal file
View File

@@ -0,0 +1,84 @@
# API 签名与鉴权
部分客户端专用的 rest api 存在基于 sign 的鉴权,需要使用规定的`appkey`及其对应的`appsec`与原始请求参数进行签名计算
不同`appkey`对应不同的 app (如客户端、概念版、必剪、漫画、bililink等)
不同平台同 app 也会存在不同的 `appkey`(如安卓端、ios端、TV端等)
同平台同 app 下不同功能也会存在不同的 `appkey`(如登录专用、取流专用等)
**appkey与appsec一一对应**
- [API签名的计算方式](#API签名的计算方式)
- [已知的APPKey](#已知的APPKey)
---
## API签名的计算方式
首先为参数中添加`appkey`字段,然后按照参数的 key 重新排序,再将重排序后的参数使用 url query 格式序列化拼接与该 appkey 相对应的 appsec (盐值) 进行**md5 hash计算**32位小写该 hash 便是 API 签名
为参数尾部增添`sign`字段,它的值为上一步计算所得的 hash一并作为表单提交
**实例:**
使用 appkey = `1d8b6e7d45233436`, appsec = `560c52ccd288fed045859ed18bffd973` 对如下 `params` 参数进行签名
```python
import hashlib
import urllib.parse
def appsign(params, appkey, appsec):
'为请求参数进行 api 签名'
params.update({'appkey': appkey})
params = dict(sorted(params.items())) # 重排序参数 key
query = urllib.parse.urlencode(params) # 序列化参数
sign = hashlib.md5((query+appsec).encode()).hexdigest() # 计算 api 签名
params.update({'sign':sign})
return params
appkey = '1d8b6e7d45233436'
appsec = '560c52ccd288fed045859ed18bffd973'
params = {
'id':114514,
'str':'1919810',
'test':'いいよ,こいよ',
}
signed_params = appsign(params, appkey, appsec)
query = urllib.parse.urlencode(signed_params)
print(signed_params)
print(query)
```
输出以下内容,分别是进行 api 签名后参数的 dict 以及 url query 格式
```
{'appkey': '1d8b6e7d45233436', 'id': 114514, 'str': '1919810', 'test': 'いいよ,こいよ', 'sign': '01479cf20504d865519ac50f33ba3a7d'}
appkey=1d8b6e7d45233436&id=114514&str=1919810&test=%E3%81%84%E3%81%84%E3%82%88%EF%BC%8C%E3%81%93%E3%81%84%E3%82%88&sign=01479cf20504d865519ac50f33ba3a7d
```
## 已知的APPKey
| appkey | appsecsign盐值 | 平台 | 应用 | 备注 |
|------------------|----------------------------------|-----|----------|------|
| 07da50c9a0bf829f | 25bdede4e1581c836cab73a48790ca6e | 安卓 | 概念版 | |
| 1d8b6e7d45233436 | 560c52ccd288fed045859ed18bffd973 | 安卓 | 客户端 | 一般用途 |
| 178cf125136ca8ea | 34381a26236dd1171185c0beb042e1c6 | 安卓 | 概念版 | |
| 27eb53fc9058f8c3 | c2ed53a74eeefe3cf99fbd01d8c9c375 | ios | 客户端 | 一般用途 |
| 37207f2beaebf8d7 | e988e794d4d4b6dd43bc0e89d6e90c43 | 安卓 | biliLink | |
| 4409e2ce8ffd12b8 | 59b43e04ad6965f34319062b478f83dd | TV | 客户端 | |
| 57263273bc6b67f6 | a0488e488d1567960d3a765e8d129f90 | 安卓 | 客户端 | |
| 8d23902c1688a798 | 710f0212e62bd499b8d3ac6e1db9302a | 安卓 | 车机版 | |
| 5dce947fe22167f9 | | 安卓 | 必剪 | |
| 7d336ec01856996b | a1ce6983bc89e20a36c37f40c4f1a0dd | 安卓 | 概念版 | |
| 85eb6835b0a1034e | 2ad42749773c441109bdc0191257a664 | | | |
| 8e16697a1b4f8121 | f5dd03b752426f2e623d7badb28d190a | 安卓 | 国际版 | |
| aae92bc66f3edfab | af125a0d5279fd576c1b4418a3e8276d | PC | 投稿工具 | |
| ae57252b0c09105d | c75875c596a69eb55bd119e74b07cfe3 | 安卓 | 国际版 | |
| bb3101000e232e27 | 36efcfed79309338ced0380abd824ac1 | 安卓 | 国际版 | |
| bca7e84c2d947ac6 | 60698ba2f68e01ce44738920a0ffe768 | 安卓 | 客户端 | 登录专用 |
| cc578d267072c94d | ffb6bb4c4edae2566584dbcacfc6a6ad | 安卓 | 轻视频 | |
| cc8617fd6961e070 | 3131924b941aac971e45189f265262be | 安卓 | 漫画 | |
| iVGUTjsxvpLeuDCf | aHRmhWMLkdeMuILqORnYZocwMBpMEOdt | 安卓 | 客户端 | 取流专用 |
| YvirImLGlLANCLvM | JNlZNgfNGKZEpaDTkCdPQVXntXhuiJEM | ios | 客户端 | 取流专用 |

389
docs/other/bvid_desc.md Normal file
View File

@@ -0,0 +1,389 @@
# bvid说明
2020-03-23 B站推出了全新的稿件视频id`bvid`来接替之前的`avid`,其意义与之相同
详见:
1. [【升级公告】AV号全面升级至BV号专栏](https://www.bilibili.com/read/cv5167957)
2. [【升级公告】AV号全面升级至BV号](https://www.bilibili.com/blackboard/activity-BV-PC.html)
---
- [概述](#概述)
- [格式](#格式)
- [实质](#实质)
- [avid发号方式的变化](#avid发号方式的变化)
- [算法概述](#算法概述)
- [av->bv算法](#av->bv算法)
- [bv->av算法](#bv->av算法)
- [编程实现](#编程实现)
- [Python](#Python)
- [C](#C)
- [TypeScript](#TypeScript)
- [Java](#Java)
- [Kotlin](#Kotlin)
- [Golang](#Golang)
---
## 概述
### 格式
“bvid”恒为长度为12的字符串前两个字母为大写“BV”后10个为base58计算结果
### 实质
“bvid"为“avid”的base58编码可通过算法进行相互转化
### avid发号方式的变化
从2009-09-09 09:09:09 [av2](https://www.bilibili.com/video/av2)的发布到2020-03-28 19:45:02 [av99999999](https://www.bilibili.com/video/av99999999)的发布B站结束了以投稿时间为顺序的avid发放改为随机发放avid
~~暗示B站东方要完泪目~~
## 算法概述
算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)
### av->bv算法
本算法及示例程序仅能编码及解码avid<` 29460791296 `无法验证avid>=` 29460791296 `的正确性
1. a=(avid⊕177451812)+8728348608
2. 以i为循环变量循环6次b[i]=(a/58^i)%58
3. 将b[i]中各个数字转换为以下码表中的字符
码表:
> fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF
4. 初始化字符串b[i]=`BV1 4 1 7 `
5. 按照以下字符顺序编码表编码并填充至b[i]
字符顺序编码表:
> 0 -> 11
>
> 1 -> 10
>
> 2 -> 3
>
> 3 -> 8
>
> 4 -> 4
>
> 5 -> 6
### bv->av算法
为以上算法的逆运算
## 编程实现
使用Python、C、TypeScript、Java、Kotlin以及Golang作为示例欢迎社区提交更多例程
### Python
```python
table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF' # 码表
tr = {} # 反查码表
# 初始化反查码表
for i in range(58):
tr[table[i]] = i
s = [11, 10, 3, 8, 4, 6] # 位置编码表
XOR = 177451812 # 固定异或值
ADD = 8728348608 # 固定加法值
def bv2av(x):
r = 0
for i in range(6):
r += tr[x[s[i]]] * 58 ** i
return (r - ADD) ^ XOR
def av2bv(x):
x = (x ^ XOR) + ADD
r = list('BV1 4 1 7 ')
for i in range(6):
r[s[i]] = table[x // 58 ** i % 58]
return ''. join(r)
print(av2bv(170001))
print(bv2av('BV17x411w7KC'))
```
输出为:
```
BV17x411w7KC
170001
```
### C
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
const char table[] = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; // 码表
char tr[124]; // 反查码表
const unsigned long long XOR = 177451812; // 固定异或值
const unsigned long long ADD = 8728348608; // 固定加法值
const int s[] = {11, 10, 3, 8, 4, 6}; // 位置编码表
// 初始化反查码表
void tr_init() {
for (int i = 0; i < 58; i++)
tr[table[i]] = i;
}
unsigned long long bv2av(char bv[]) {
unsigned long long r = 0;
unsigned long long av;
for (int i = 0; i < 6; i++)
r += tr[bv[s[i]]] * (unsigned long long)pow(58, i);
av = (r - ADD) ^ XOR;
return av;
}
char *av2bv(unsigned long long av) {
char *result = (char*)malloc(13);
strcpy(result,"BV1 4 1 7 ");
av = (av ^ XOR) + ADD;
for (int i = 0; i < 6; i++)
result[s[i]] = table[(unsigned long long)(av / (unsigned long long)pow(58, i)) % 58];
return result;
}
int main() {
tr_init();
printf("%s\n", av2bv(170001));
printf("%u\n", bv2av("BV17x411w7KC"));
return 0;
}
```
输出为:
```
BV17x411w7KC
170001
```
### TypeScript
感谢[#417](https://github.com/SocialSisterYi/bilibili-API-collect/issues/417#issuecomment-1186475063)提供
```typescript
export default class BvCode {
private TABEL = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'; // 码表
private TR: Record<string, number> = {}; // 反查码表
private S = [11, 10, 3, 8, 4, 6]; // 位置编码表
private XOR = 177451812; // 固定异或值
private ADD = 8728348608; // 固定加法值
constructor() {
// 初始化反查码表
const len = this.TABEL.length;
for (let i = 0; i < len; i++) {
this.TR[this.TABEL[i]] = i;
}
}
av2bv(av: number): string {
const x_ = (av ^ this.XOR) + this.ADD;
const r = ['B', 'V', '1', , , '4', , '1', , '7'];
for (let i = 0; i < 6; i++) {
r[this.S[i]] = this.TABEL[Math.floor(x_ / 58 ** i) % 58];
}
return r.join('');
}
bv2av(bv: string): number {
let r = 0;
for (let i = 0; i < 6; i++) {
r += this.TR[bv[this.S[i]]] * 58 ** i;
}
return (r - this.ADD) ^ this.XOR;
}
}
const bvcode = new BvCode();
console.log(bvcode.av2bv(170001));
console.log(bvcode.bv2av('BV17x411w7KC'));
```
输出为:
```
BV17x411w7KC
170001
```
### Java
```java
/**
* 算法来自https://www.zhihu.com/question/381784377/answer/1099438784
*/
public class Util {
private static final String TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF";
private static final int[] S = new int[]{11, 10, 3, 8, 4, 6};
private static final int XOR = 177451812;
private static final long ADD = 8728348608L;
private static final Map<Character, Integer> MAP = new HashMap<>();
static {
for (int i = 0; i < 58; i++) {
MAP.put(TABLE.charAt(i), i);
}
}
public static String aidToBvid(int aid) {
long x = (aid ^ XOR) + ADD;
char[] chars = new char[]{'B', 'V', '1', ' ', ' ', '4', ' ', '1', ' ', '7', ' ', ' '};
for (int i = 0; i < 6; i++) {
int pow = (int) Math.pow(58, i);
long i1 = x / pow;
int index = (int) (i1 % 58);
chars[S[i]] = TABLE.charAt(index);
}
return String.valueOf(chars);
}
public static int bvidToAid(String bvid) {
long r = 0;
for (int i = 0; i < 6; i++) {
r += MAP.get(bvid.charAt(S[i])) * Math.pow(58, i);
}
return (int) ((r - ADD) ^ XOR);
}
}
```
### Kotlin
```kotlin
/**
* 此程序非完全原创改编自GH站内某大佬的Java程序修改了部分代码且转换为Kotlin
* 算法来源同上
*/
object VideoUtils {
//这里是由知乎大佬不知道用什么方法得出的转换用数字
var ss = intArrayOf(11, 10, 3, 8, 4, 6, 2, 9, 5, 7)
var xor: Long = 177451812 //二进制时加减数1
var add = 8728348608L //十进制时加减数2
//变量初始化工作,加载哈希表
private const val table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"
private val mp = HashMap<String, Int>()
private val mp2 = HashMap<Int, String>()
//现在定义av号和bv号互转的方法
//定义一个power乘方方法这是转换进制必要的
fun power(a: Int, b: Int): Long {
var power: Long = 1
for (c in 0 until b) power *= a.toLong()
return power
}
//bv转av方法
fun bv2av(s: String): String {
var r: Long = 0
//58进制转换
for (i in 0..57) {
val s1 = table.substring(i, i + 1)
mp[s1] = i
}
for (i in 0..5) {
r += mp[s.substring(ss[i], ss[i] + 1)]!! * power(58, i)
}
//转换完成后,需要处理,带上两个随机数
return (r - add xor xor).toString()
}
//av转bv方法
fun av2bv(st: String): String {
try {
var s = java.lang.Long.valueOf(st.split("av".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()[1])
val sb = StringBuffer("BV1 4 1 7 ")
//逆向思路,先将随机数还原
s = (s xor xor) + add
//58进制转回
for (i in 0..57) {
val s1 = table.substring(i, i + 1)
mp2[i] = s1
}
for (i in 0..5) {
val r = mp2[(s / power(58, i) % 58).toInt()]
sb.replace(ss[i], ss[i] + 1, r!!)
}
return sb.toString()
} catch (e: ArrayIndexOutOfBoundsException) {
return ""
}
}
}
```
### Golang
```go
package main
import "math"
const TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"
var S = [11]uint{11, 10, 3, 8, 4, 6}
const XOR = 177451812
const ADD = 8728348608
var TR = map[string]int64{}
// 初始化 TR
func init() {
for i := 0; i < 58; i++ {
TR[TABLE[i:i+1]] = int64(i)
}
}
func BV2AV(bv string) int64 {
r := int64(0)
for i := 0; i < 6; i++ {
r += TR[bv[S[i]:S[i]+1]] * int64(math.Pow(58, float64(i)))
}
return (r - ADD) ^ XOR
}
func AV2BV(av int64) string {
x := (av ^ XOR) + ADD
r := []rune("BV1 4 1 7 ")
for i := 0; i < 6; i++ {
r[S[i]] = rune(TABLE[x/int64(math.Pow(58, float64(i)))%58])
}
return string(r)
}
func main() {
println(AV2BV(170001))
println(BV2AV("BV17x411w7KC"))
}
```
输出为:
```
BV17x411w7KC
170001
```

65
docs/other/errcode.md Normal file
View File

@@ -0,0 +1,65 @@
# 公共错误码
下表为大部分接口返回值中`code`字段值中公共的错误代码
- [权限类](#权限类)
- [请求类](#请求类)
---
## 权限类
| 代码 | 含义 |
| ---- | -------------------------- |
| -1 | 应用程序不存在或已被封禁 |
| -2 | Access Key 错误 |
| -3 | API 校验密匙错误 |
| -4 | 调用方对该 Method 没有权限 |
| -101 | 账号未登录 |
| -102 | 账号被封停 |
| -103 | 积分不足 |
| -104 | 硬币不足 |
| -105 | 验证码错误 |
| -106 | 账号非正式会员或在适应期 |
| -107 | 应用不存在或者被封禁 |
| -108 | 未绑定手机 |
| -110 | 未绑定手机 |
| -111 | csrf 校验失败 |
| -112 | 系统升级中 |
| -113 | 账号尚未实名认证 |
| -114 | 请先绑定手机 |
| -115 | 请先完成实名认证 |
## 请求类
| 代码 | 含义 |
| ---- | --------------------- |
| -304 | 木有改动 |
| -307 | 撞车跳转 |
| -400 | 请求错误 |
| -401 | 未认证 (或非法请求) |
| -403 | 访问权限不足 |
| -404 | 啥都木有 |
| -405 | 不支持该方法 |
| -409 | 冲突 |
| -412 | 请求被拦截 (客户端 ip 被服务端风控) |
| -500 | 服务器错误 |
| -503 | 过载保护,服务暂不可用 |
| -504 | 服务调用超时 |
| -509 | 超出限制 |
| -616 | 上传文件不存在 |
| -617 | 上传文件太大 |
| -625 | 登录失败次数太多 |
| -626 | 用户不存在 |
| -628 | 密码太弱 |
| -629 | 用户名或密码错误 |
| -632 | 操作对象数量限制 |
| -643 | 被锁定 |
| -650 | 用户等级太低 |
| -652 | 重复的用户 |
| -658 | Token 过期 |
| -662 | 密码时间戳过期 |
| -688 | 地理区域限制 |
| -689 | 版权限制 |
| -701 | 扣节操失败 |
|-8888|对不起,服务器开小差了~ (ಥ﹏ಥ)|

Some files were not shown because too many files have changed in this diff Show More