diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 8d6d4b5..b5cfe71 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -9,4 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username -custom: https://afdian.net/@ShakaiAneE +custom: https://afdian.com/@ShakaiAneE diff --git a/.github/ISSUE_TEMPLATE/1-add-request.yml b/.github/ISSUE_TEMPLATE/1-add-request.yml new file mode 100644 index 0000000..5661753 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-add-request.yml @@ -0,0 +1,56 @@ +name: "新增请求" +description: "请求添加文档中未收录的 API 定义" +title: "[新增请求] " +labels: ["新增/Add"] +body: + - type: checkboxes + id: reminders + attributes: + label: "提交前请确认" + options: + - label: "我已检索仓库中文档,确认不包含所提及内容,且 Issues、Pull Requests 中无相关提交" + required: true + - type: dropdown + id: source + attributes: + label: "API 来源" + description: "该 API 在何平台中使用" + multiple: true + options: + - "Web 端(含 h5)" + - "PC 客户端(Electron)" + - "Android 客户端(含粉版、平板版、蓝版、概念版、国际版等)" + - "TV 客户端(含云视听小电视、车机、物联网版等)" + - "iOS 客户端(含粉版、平板版、概念版等)" + - "必剪客户端" + - "漫画客户端" + - "其他(请在详情中备注)" + validations: + required: true + - type: dropdown + id: type + attributes: + label: "API 类型" + description: "API 所使用的协议标准及调用方式" + options: + - "REST" + - "gRPC" + - "长连接数据帧(含 ws、TCP)" + - "其他类型(请在详情中备注)" + validations: + required: true + - type: input + id: address + attributes: + label: "API 地址" + description: "REST 的 url,或 gRPC 的包名+服务名" + placeholder: "eg: https://api.bilibili.com/2333333" + validations: + required: true + - type: textarea + id: details + attributes: + label: "详情描述" + description: "请描述该 API 的使用场景、请求及响应字段等,可附上原始抓包记录" + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/2-update-request.yml b/.github/ISSUE_TEMPLATE/2-update-request.yml new file mode 100644 index 0000000..4b62189 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-update-request.yml @@ -0,0 +1,29 @@ +name: "更新请求" +description: "请求补充或更新文档中已有的 API 定义" +title: "[更新请求] <title>" +labels: ["更新/Update"] +body: + - type: checkboxes + id: reminders + attributes: + label: "提交前请确认" + options: + - label: "我已确认文档中相关内容存在错误或不足,且 Issues、Pull Requests 中无相关提交" + required: true + - type: input + id: document_link + attributes: + label: "原文档链接" + description: | + 需要更新的文档链接,指定到具体 API<br> + eg: https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/bangumi/info.md#获取剧集明细web端ssidepid方式<br> + https://socialsisteryi.github.io/bilibili-API-collect/docs/bangumi/info.html#获取剧集明细-web端-ssid-epid方式 + validations: + required: true + - type: textarea + id: details + attributes: + label: "更新内容" + description: "请指出原文档中与最新 API 行为不符之处,并附上已知的最新改动和验证信息" + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/3-mistake-report.yml b/.github/ISSUE_TEMPLATE/3-mistake-report.yml new file mode 100644 index 0000000..dc119aa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-mistake-report.yml @@ -0,0 +1,64 @@ +name: "错误修正" +description: "发现文档内容有误并提交修正请求" +title: "[错误修正] <title>" +labels: ["错误/Mistakes"] +body: + - type: checkboxes + id: confirmations + attributes: + label: "提交前请确认" + options: + - label: "我已确认文档中的错误存在,且 Issues、Pull Requests 中无相同修正" + required: true + - label: "我已验证修正内容的正确性" + required: false + + - type: input + id: document_link + attributes: + label: "错误所在文档链接" + description: | + 需要修正的文档链接,指定到具体 API<br> + eg: https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/bangumi/info.md#获取剧集明细web端ssidepid方式<br> + https://socialsisteryi.github.io/bilibili-API-collect/docs/bangumi/info.html#获取剧集明细-web端-ssid-epid方式 + validations: + required: true + + - type: dropdown + id: error_type + attributes: + label: "错误类型" + multiple: true + options: + - "API 地址/鉴权方式错误" + - "参数错误" + - "响应数据结构或响应示例错误" + - "描述性内容错误(如拼写/流程说明)" + - "接口已弃用下线" + - "其他(请在下文说明)" + validations: + required: true + + - type: textarea + id: error_description + attributes: + label: "错误描述" + description: "请详细说明具体错误所在,如有多个错误请编号列出" + validations: + required: true + + - type: textarea + id: evidence + attributes: + label: "纠错依据" + description: "如果有,请提供抓包记录等佐证,方便确认。如果有多个错误,请将依据对应错误描述的编号列出" + validations: + required: false + + - type: textarea + id: correction + attributes: + label: "修正方案" + description: "如果可以,请提供修正后的内容,如有多个修正点请编号列出" + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..e65606e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: 参与讨论 + url: https://github.com/SocialSisterYi/bilibili-API-collect/discussions + about: 代码用例、情报分享等内容请使用 Discussions diff --git a/.github/workflows/vuepress-deploy.yml b/.github/workflows/vuepress-deploy.yml new file mode 100644 index 0000000..4595426 --- /dev/null +++ b/.github/workflows/vuepress-deploy.yml @@ -0,0 +1,18 @@ +name: deploy and pubish +on: [push] +jobs: + build-and-deploy: + runs-on: ubuntu-latest + if: github.repository == 'SocialSisterYi/bilibili-API-collect' + steps: + - name: Checkout + uses: actions/checkout@master + + - name: vuepress-deploy + uses: jenkey2011/vuepress-deploy@master + env: + ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + TARGET_REPO: SocialSisterYi/bilibili-API-collect + TARGET_BRANCH: gh_pages + BUILD_SCRIPT: yarn && yarn build + BUILD_DIR: .vuepress/dist/ diff --git a/.gitignore b/.gitignore index fe3113c..d55cc68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ -mkdocs/html/* -README.md +/.vuepress/.cache/ +/.vuepress/.temp/ +/.vuepress/dist/ +/node_modules/ +.idea/ +.vscode/ .DS_Store +*.swp diff --git a/.vuepress/client.js b/.vuepress/client.js new file mode 100644 index 0000000..0509372 --- /dev/null +++ b/.vuepress/client.js @@ -0,0 +1,8 @@ +import { defineClientConfig } from '@vuepress/client' +import Layout from './theme/layouts/Layout.vue' + +export default defineClientConfig({ + layouts: { + Layout, + }, +}) diff --git a/.vuepress/config.js b/.vuepress/config.js new file mode 100644 index 0000000..99b7f2e --- /dev/null +++ b/.vuepress/config.js @@ -0,0 +1,52 @@ +import { defaultTheme, defineUserConfig } from "vuepress"; +import markdownItTaskLists from "markdown-it-task-lists"; +import { copyCodePlugin } from "vuepress-plugin-copy-code2"; +import { searchPlugin } from "@vuepress/plugin-search"; + +export default defineUserConfig({ + base: "/bilibili-API-collect/", + lang: "zh-CN", + title: "BAC Document", + description: "社区开源的第三方哔哩哔哩 API 文档", + head: [["link", { rel: "icon", href: "/logo2.jpg" }]], + locales: { + "/": { + lang: "zh-CN", + }, + }, + theme: defaultTheme({ + logo: "/logo2.jpg", + navbar: [ + { text: "首页", link: "/" }, + { text: "目录", link: "/#🍴目录" }, + { text: "贡献指南", link: "/CONTRIBUTING.html" }, + { + text: "相关社群", + children: [ + { + text: "QQ交流群(综合技术交流)", + link: "http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&noverify=0&group_code=191187164", + }, + { + text: "Telegram交流群(Github Bot推送)", + link: "https://t.me/bilibili_API_collect_community", + }, + ], + }, + ], + sidebar: "auto", + repo: "https://github.com/SocialSisterYi/bilibili-API-collect", + docsBranch: "master", + editLinkText: "在 GitHub 上编辑此页", + colorMode: "auto" + }), + plugins: [copyCodePlugin({}), searchPlugin({})], + markdown: { + code: { + lineNumbers: true, + }, + }, + extendsMarkdown: (md) => { + md.use(markdownItTaskLists); + }, +}); diff --git a/imgs/logo2.jpg b/.vuepress/public/logo2.jpg similarity index 100% rename from imgs/logo2.jpg rename to .vuepress/public/logo2.jpg diff --git a/.vuepress/theme/layouts/Layout.vue b/.vuepress/theme/layouts/Layout.vue new file mode 100644 index 0000000..78a07a0 --- /dev/null +++ b/.vuepress/theme/layouts/Layout.vue @@ -0,0 +1,18 @@ +<template> + <ParentLayout> + <template #page-bottom> + <footer style="text-align: center"> + Copyright © 2020-2025 + <a href="https://github.com/SocialSisterYi/">SocialSisterYi</a> | + <a + href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/LICENSE" + >CC-BY-NC-4.0 Licensed</a + > + </footer> + </template> + </ParentLayout> +</template> + +<script setup> +import ParentLayout from '@vuepress/theme-default/layouts/Layout.vue'; +</script> diff --git a/APP_widget/splash.md b/APP_widget/splash.md deleted file mode 100644 index 0f2b659..0000000 --- a/APP_widget/splash.md +++ /dev/null @@ -1,142 +0,0 @@ -# APP端开屏图片 - -- [获取APP端开屏图片列表](#获取APP端开屏图片列表) - ---- - -## 获取APP端开屏图片列表 - -> http://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 />-3:API校验密匙错误<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 'http://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的图片为: - -![]( http://i0.hdslb.com/bfs/archive/fe737da5cdedf9dad038e5fd30e957be8a063bc2.png ) - diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6b867be --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,283 @@ +# 贡献指南 + +欢迎来到 bilibili-API-collect 社区贡献指南,本文主要面向需要进行提交贡献文档内容的用户。 + +## 总则 + +[bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect) 项目(简称 BAC 或 b-a-c)是一个仅用于学习研究、社区开源、公益性质的 [B 站(哔哩哔哩)](https://www.bilibili.com/)API(应用程序接口)文档,使用 [CC-BY-NC 4.0 协议](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/LICENSE)开源,它将无差别收集整理相关的**主站业务接口**。 + +该项目使用 [Markdown](https://zh.wikipedia.org/zh-cn/Markdown) 语法进行文档书写,按照业务类型及功能以**路径**+**文件**形式索引,任何用户都可通过 Issue、Pull Request 与 Discussion 提供自己分析出的接口地址与使用说明。 + +本项目收集的接口类型包括但不限于 REST API、gRPC、WebSocket,文档内统一优先使用安全套接字协议,如 `https`、`securityRpc`、`wss`。 + +## Issue、Discussion 与社群讨论 + +对文档内容存在**不理解**之处、以及发现文档内容有所**缺失**或**错误**,可直接提出,强烈建议以提交 **Issue** 的形式添加 / 补充 / 更新文档中的说明,以发起 **Discussion** 的形式提出问题、代码用例、情报分享,并希望关于本项目的各种交流都是**公开进行**的,因为这样才可以保证关键信息的一致性。 + +提交 Issue 请遵守以下原则: + +1. 标题需要点明 API 的用处, `<title>` 要替换为标题主要内容而不是保留不动,切勿仅填写 `补充`、`修复`,形式良好的标题可以是 `[新增请求] 新增 xx 接口`、`[更新请求] xx 接口地址已失效`、`[更新请求] xx 接口的参数有变化` +2. 正文请按照 Issue 模板进行填写,标明 API 来源(Web、Android、iOS、TV 等)、API 类型(REST、gRPC、WebSocket 等)、API 地址 +3. 详情描述需要提供该 API 的使用场景、请求及响应字段等,可附上原始抓包记录 (文本格式优先);在更新时还需指出原文档中与最新 API 行为不符之处,并附上已知的最新改动。例如:“在前端页面某地址 / APP 某界面访问某 API(标明地址),它的某参数与文档中不符(标明文档地址)” + +发起 Discussion 请遵守以下原则: + +1. 标题言简意骇,说明欲提出的问题要点,如 `如何通过 xx 接口获取 yy`、`关于 xx 字段意义的探讨`、`建议将 xx 加入 yy 分类` 等标题;切勿使用表意含糊不清或索取性的标题,如 `怎么解决风控`、`搜索的接口是什么`、`好兄弟有没有投稿的接口` 等标题 +2. Discussion 正文应对遇到的问题进行尽可能详细的描述,展开并聚焦有关的信息,例如: “按照文档中某位置的说明进行了某操作,为什么无法获得预期结果”、“请问某 API 的某字段的具体含义是什么” +3. 提出问题时注意[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)并且[别像弱智一样提问](https://github.com/tangx/Stop-Ask-Questions-The-Stupid-Ways) + +同时,您还可以通过加入社群的方式参与讨论 + +- QQ 交流群:[邀请链接](https://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&noverify=0&group_code=191187164) +- Telegram 交流群:[@bilibili_API_collect_community](https://t.me/bilibili_API_collect_community) + +::: tip ✅提示 + +QQ 交流群为综合技术交流群(兼 Owner 的粉丝群),可交流探讨任何技术,包括但不限于 [BAC 项目](https://github.com/SocialSisterYi/bilibili-API-collect) + +Telegram 交流群主要用作 [BAC 项目](https://github.com/SocialSisterYi/bilibili-API-collect)的 Github Bot 接收,也可以进行项目相关的讨论,但不建议在此讨论交流其他内容(公开群) + +::: + +::: warning ⚠️注意 + +群内讨论同样需要遵守**公开交流**的原则,以及群内会定期清理不活跃成员。 + +**QQ 交流群**的加群问题答案可以去 [Owner 的主页](https://github.com/SocialSisterYi) Contact 部分找到,如果您填写“我不知道,从 Github 来的”那么管理员将有理由禁止您进群讨论! + +::: + +::: danger 🈲禁止 + +项目 Issue 及其相关社群中**禁止**询问讨论 风控解除、爬虫(采集)、破解、漏洞利用、买卖代码和账号 相关内容,抵制基于本项目进行的一切黑产行为! + +::: + +## 目录与路径结构 + +### 目录 + +文档目录以 **Markdown 无序列表**语法写在 [README.md](README.md) 中,使用缩进标识文档的层级,如 `视频` 下存在 `基本信息`、`快照`、`视频推荐`、`TAG` 等子分类,使用 **Markdown 复选框**语法该标注文档是否编写完成 + +```markdown +- [ ] 视频 + - [x] 基本信息 + - [x] 快照 + - [x] 视频推荐 + - [ ] TAG +``` + +### 路径 + +路径层级应当与文档目录一致,以文件夹的形式存放在项目中的 `/docs` 路径下,命名统一使用英文小写,如 `video`、`danmaku`、`comment`, 不建议出现 `&` 等特殊字符 + +二级、三级路径应当存在二级三级目录,可选添加 `README.md` 以描述该子目录 + +### 文件 + +各个子接口集整理为 Markdown (.md) 文件,命名统一使用英文小写,如 `info.md`、`action.md`、`list.md` + +文档文件中用于存放相关的接口的说明,如 `video/` 下的 `info.md`,存在 `查询视频基本信息`、`查询视频简介`、`查询视频分P列表` 等内容 + +## Markdown 文档内容格式 + +文档使用 [VuePress](https://vuepress.vuejs.org/) 生成,可以使用 [VuePress Markdown 扩展语法](https://vuepress.vuejs.org/guide/markdown.html)编写 + +注:以下文档范式主要针对接口类文档, 可根据**实际情况**进行调整, 你也可以使用 [`json-apidoc-gen`](https://github.com/SessionHu/json-apidoc-gen) 工具直接生成模板自行填充内容. 非接口类文档, 如算法等, 可以参考已有的内容 + +### 头部 + +文档首行为**一级标签**格式标题,如 `# 用户基本信息` + +**文档头部不需要手写索引**,索引由 VuePress 自动生成 + +### 接口说明 + +文档中可存在多个接口说明,应当遵守同一范式,依次排列在文档中 + +接口说明分为 `标题`、`地址`、`说明`、`请求参数`、`响应正文`、`示例` 这些部分 + +接口标题为**二级以下**的标签,接口地址使用**引用**语法,地址只保留 REST API 路径,不应携带 query 等内容 + +接口地址下方需要注明接口的请求方式,如 `GET`、`POST`、`PUT` 等,使用*斜体*语法 + +若接口存在认证或鉴权,需要在说明中注明,如 `Cookie (SESSDATA)`、`APP`(认证是针对用户的,鉴权是针对接口使用的) + +其他使用说明也可写在这里,如 `限制游客访问的视频需要登录` + +e.g.: + +```markdown +## 获取视频详细信息_web端 + +> https://api.bilibili.com/x/web-interface/view + +*请求方式:GET* + +认证方式:Cookie (SESSDATA) + +限制游客访问的视频需要登录 +``` + +**请求参数**应在**接口说明**的下方,应注明参数类型 url 参数或正文参数(正文参数应注明 content-type,如 `application/x-www-form-urlencoded` 或 `multipart/form-data`),使用**加粗**语法 + +对象的字段及其含义使用**表格**进行整理,表头统一依次为 `参数名`、`类型`、`内容`、`必要性`、`备注`,类型为 `num`、`str`、`bool`、`nums`、`strs`、`file` 等 (未来可能会统一改为基于 TypeScript 的类型系统),必要性为 `必要`、`非必要`、`必要 (可选)` 等,表格内每个字段为一行 + +e.g.: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | --------- | ----------- | ----------------- | +| aid | num | 稿件 avid | 必要 (可选) | avid 与 bvid 任选 | +| bvid | str | 稿件 bvid | 必要 (可选) | avid 与 bvid 任选 | + +**响应正文**应在**请求参数**的下方,接口响应的数据格式应标注,如 `JSON 回复`、`XML 回复`、`ProtoBuf 回复`,使用**加粗**语法 + +JSON Object 或 ProtoBuf Message 应以对象的**表格**形式书写,表头为 `根对象` 或 `xx 中的 yy 对象` 或 `xx.yy.zz 对象`,若对象位于数组中则为 `xx 数组中的对象` 或 `xx[] 中的对象` + +表头统一依次为 `字段`、`类型`、`内容`、`备注`,类型为 JSON / Protobuf 的标准类型,如 `num`、`str`、`bool`、`obj`、`array`、`null` 等 + +不明确定义的字段说明在内容的末尾添加问号,如 `播放数?`;定义尚未明确的字段使用 `(?)` 在内容中占位,并在备注中填写 `作用尚不明确` + +多个对象及数组,使用**遍历树**的顺序进行排列, 若数组中的每一项结构均相同也可以直接省略为像 `xxx 数组中的对象` 这样的格式 + +e.g.: + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ----------- | ------------ | +| bvid | str | 稿件 bvid | | +| aid | num | 稿件 avid | | +| videos | num | 稿件分P总数 | 默认为 1 | +| tid | num | 分区 tid | | +| no_cache | bool | (?) | 作用尚不明确 | + +Json Array 或 ProtoBuf Repeated 类型使用数组的**表格**形式书写,表头统一依次为 `项`、`类型`、`内容`、`备注`,无限长度数组表尾需要添加**省略号** + +数组每项内容若与实际数据有关联,`内容` 字段则可标为 `(n+1)P 视频内容` 这样的形式 + +e.g.: + +`data` 中的 `pages` 数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ------------- | +| 0 | obj | 1P 视频内容 | 无分 P 仅有此项 | +| n | obj | (n+1)P 视频内容 | | +| …… | obj | …… | …… | + +**示例**部分位于所有**响应正文**部分下方,需要**加粗**格式,分为请求命令示例与响应体示例两部分 + +请求命令示例为一段可测试该接口的 cURL 命令或某种编程语言的代码,使用**代码块**语法书写,命令应当尽可能简短、便于使人阅读, 代码缩进为 **2** 个 **空格 (U+0020)** + +示例命令中的认证信息应做**脱敏处理**,如 Cookie、Token、access_key 等,可替换为 `xxx` 占位 + +示例命令前后可以适当添加一些文字说明 + +响应体示例为一段格式化后的 JSON 或 ProtoBuf Message,使用**代码块**语法书写,并使用 `<details>` 标签进行折叠, 仍一律使用 **2** 个 **空格** 进行缩进 + +e.g.: + +````markdown +**示例:** + +获取视频 `av85440373` 的基本信息 + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/view' \ + --data-urlencode 'aid=85440373' +``` + +<details> +<summary>查看响应示例:</summary> + +```jsonc +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "bvid": "BV117411r7R1", + "aid": 85440373, + "videos": 1, + "tid": 28, + "tname": "原创音乐", + "copyright": 1, + // ... + } +} +``` + +</details> +```` + +### 枚举值与属性位 + +接口返回或请求中若存在一些 enum 类型或二进制属性位,应当单独进行探讨,如视频的属性位 `attribute` 或视频清晰度 `qn` + +这些值及其说明使用**表格**进行整理,表头统一为 `位` / `代码` / `值`、`含义`、`备注` + +这些枚举值或属性位的用法应附加文字说明 + +e.g.: + +| 值 | 含义 | 备注 | +| ---- | ------------- | ------------------------------------------------------------ | +| 6 | 240P 极速 | 仅 MP4 格式支持<br />仅 `platform=html5` 时有效 | +| 16 | 360P 流畅 | | +| 32 | 480P 清晰 | | +| 64 | 720P 高清 | WEB 端默认值<br />B 站前端需要登录才能选择,但是直接发送请求可以不登录就拿到 720P 的取流地址<br />**无 720P 时则为 720P60** | +| 74 | 720P60 高帧率 | 需要登录认证 | +| 80 | 1080P 高清 | TV 端与 APP 端默认值<br />需要登录认证 | + +## Proto 定义格式 + +proto 文件为 [Protocol Buffers](https://protobuf.dev/) 以及 [gRPC](https://grpc.io/docs/) 的数据结构体定义,多用于客户端的接口,本文档也做相关的收集 + +存放于项目的 `/grpc_api` 路径下,使用包名进行路径层级的组织,如: + +``` +/grpc_api/bilibili/main/community/reply/v1/reply.proto +/grpc_api/bilibili/app/archive/v1/archive.proto +/grpc_api/bilibili/app/view/v1/view.proto +``` + +proto 文件内使用**单行注释**标注字段或对象的含义,如: + +```protobuf +// UP主信息 +message Author { + // UP主mid + int64 mid = 1; + // UP主昵称 + string name = 2; + // UP主头像url + string face = 3; +} +``` + +## 文档提交 + +### 拉取 (Pull) 与 提交 (Commit) + +本项目仓库仅托管于 GitHub, 使用 Git 作为版本控制系统, 你需要对两者有基础的了解 + +请先 fork, 然后在自己的 fork 上进行修改 + +提交的标题不要使用默认的 `Update xxx`, 建议遵循 [Conventional Commits (约定式提交) 规范](https://www.conventionalcommits.org/zh-hans/v1.0.0/), 标题语言可根据个人习惯 + +当发现远程与本地仓库不一致时, 若你操作的 fork 的 branch 无打开的 PR, 建议使用变基拉取, 而不是生成一个额外的合并提交的合并拉取, 反之则相反 + +移动文件请使用 `git mv`, 而不是删除并添加同一个文件于不同位置 (该问题在 VSCode 的 GUI 版 Git 中存在) + +### 拉取请求 (Pull Request) + +使用 拉取请求 (Pull Request, PR) 将修改后的文档提交到 `master` 分支,标题需写明修改或新增的内容, `gh_pages` 分支将在 PR 合并后自动更新 + +如果你还没有完成计划的全部修改, 请创建 Draft Pull Request 表示你还没有做好被合并的准备 ~~(抢占先机, 精神可嘉, 值得鼓励)~~ + +PR 正文使用 **无序列表** 写明更改的每一项内容, 可以使用复选框表明进度, 需要关闭的 Issue 请使用 `close #xxxx` 这样的格式一并包含在内 + +如果内容包含代码, 请一并提供测试的输入与输出的文本或截图, 最好可以附上完整的测试环境及相关可执行文件等 + +PR 合并后, 请及时删除或更新分支. 特别是在使用压缩合并或变基合并后, 请 `Discard changes` 或直接删除分支, 以免在下一次 PR 后出现重复相同提交的问题 diff --git a/README.md b/README.md index 6fcc3d3..e74b089 100644 --- a/README.md +++ b/README.md @@ -1,243 +1,330 @@ <p align="center"> - <img src="imgs/logo.png" width="250" height="200"> + <img src="./assets/img/logo.png" width="250" height="200" /> </p> -<h1 align="center">哔哩哔哩-API收集整理</h1> -<p align="center"> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/issues" style="text-decoration:none"> - <img src="https://img.shields.io/github/issues/SocialSisterYi/bilibili-API-collect.svg" alt="GitHub issues"/> +<h1 align="center">哔哩哔哩 - API 收集整理</h1> +<p align="center" class="shields"> + <a href="https://github.com/SocialSisterYi/bilibili-API-collect/issues" style="text-decoration: none;"> + <img src="https://img.shields.io/github/issues/SocialSisterYi/bilibili-API-collect.svg?style=flat&color=red" alt="GitHub issues"/> </a> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/stargazers" style="text-decoration:none" > - <img src="https://img.shields.io/github/stars/SocialSisterYi/bilibili-API-collect.svg" alt="GitHub stars"/> + <a href="https://github.com/SocialSisterYi/bilibili-API-collect/stargazers" style="text-decoration: none;"> + <img src="https://img.shields.io/github/stars/SocialSisterYi/bilibili-API-collect.svg?style=flat&color=yellow" alt="GitHub stars"/> </a> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/network" style="text-decoration:none" > - <img src="https://img.shields.io/github/forks/SocialSisterYi/bilibili-API-collect.svg" alt="GitHub forks"/> + <a href="https://github.com/SocialSisterYi/bilibili-API-collect/network" style="text-decoration: none;"> + <img src="https://img.shields.io/github/forks/SocialSisterYi/bilibili-API-collect.svg?style=flat&color=blue" alt="GitHub forks"/> </a> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/LICENSE" style="text-decoration:none" > - <img src="https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg" alt="GitHub license"/> + <a href="https://github.com/SocialSisterYi/bilibili-API-collect/actions" style="text-decoration: none;"> + <img src="https://img.shields.io/github/actions/workflow/status/SocialSisterYi/bilibili-API-collect/vuepress-deploy.yml?style=flat" alt="Build status"/> + </a> + <a href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/LICENSE" style="text-decoration: none;"> + <img src="https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg?style=flat" alt="GitHub license"/> </a> </p> -<h3 align="center">野生API文档</h3> -<h3 align="center">不断更新中....</h3> +<p align="center" class="trendshift"> + <a href="https://trendshift.io/repositories/3218" target="_blank"> + <img src="https://trendshift.io/api/badge/repositories/3218" alt="Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/> + </a> +</p> +<h3 align="center">野生 API 文档</h3> +<h3 align="center">不断更新中....</h3> -本项目旨在对 B 站 web 端、移动端以及 TV 端散落在世界各地的野生 api 进行收集整理,研究使用方法并对其进行说明,运用了黑箱法、控制变量法、js 逆向分析法、apk 拆包及反编译法、网络抓包法等研究办法 +本项目旨在对 B 站 WEB、APP、TV 等客户端中,散落在世界各地的野生 API 进行收集整理,研究使用方法并对其进行说明,运用了黑箱法、控制变量法、代码逆向分析、拆包及反编译法、网络抓包法等研究办法 -所有 rest api 均为标准 http 协议,请求数据大多为 url query 表单,返回数据大多为 json 或 protobuf +本文档探讨的对象是主站业务接口,[官方开放平台](https://openhome.bilibili.com/doc) 和 [直播开放平台](https://open-live.bilibili.com/document/) 均不属于本项目范畴,请移步 -PS:所有 rest api 均可使用 https,文档中为了统一写作`http`,为了数据安全建议调用接口时使用 https +B站 API 采用 C/S 结构,大多数接口为 REST API 和 gRPC,少部分接口为 WebSocket;REST API 接口请求数据大多为 url query 表单或 JSON,返回数据大多为 JSON 或 Protobuf,强制使用 https 协议 -小小的 Demo:~~av583785685~~ [视频失效原因](https://shakaianee.top/archives/56/)([Youtube备链](https://www.youtube.com/watch?v=nfF91Z6fqGk)) +📖阅读地址:[Github Pages](https://socialsisteryi.github.io/bilibili-API-collect/) -联动项目:[Hsury/Bilibili-Toolkit](https://github.com/Hsury/Bilibili-Toolkit) +小小的 Demo:~~av583785685~~ [视频失效原因](https://shakaianee.top/archives/56/) ([Youtube 备链](https://www.youtube.com/watch?v=nfF91Z6fqGk)) ---- - -**声明**: +::: warning ⚠️声明 1. 本项目遵守 CC-BY-NC 4.0 协议,禁止一切商业使用,如需转载请注明作者 ID 2. **请勿滥用,本项目仅用于学习和测试!请勿滥用,本项目仅用于学习和测试!请勿滥用,本项目仅用于学习和测试!** 3. 利用本项目提供的接口、文档等造成不良影响及后果与本人无关 4. 由于本项目的特殊性,可能随时停止开发或删档 5. 本项目为开源项目,不接受任何形式的催单和索取行为,更不容许存在付费内容 +6. **上传任何信息时请注意脱敏,删去账户密码、敏感 cookies 等可能泄漏个人信息的数据(例如 `SESSDATA`、`bili_jct` 之类的 cookies)** ---- +::: -计划整理分类 & 目录:(文档已完结请选中 checkbox)二级目录正在建设中..... +## 🌱参与贡献 -- [x] [API 签名](other/API_sign.md) -- [ ] [公共错误码](other/errcode.md) -- [x] [图片格式化](other/picture.md) -- [x] [bvid 说明](other/bvid_desc.md) +欢迎各位 dalao 对本项目做出贡献,也希望每个使用者都能提出宝贵的意见 + +目前本项目存在的问题包括但不限于: + +1. 文档二级目录尚未完成 +2. 部分文档较旧,修改与更新没有跟进 +3. 目前文档使用 Markdown 语法编写,不易生成编程语言的 SDK,详见 [#604](https://github.com/SocialSisterYi/bilibili-API-collect/issues/604) + +更多信息请浏览 [贡献指南](CONTRIBUTING.md) + +## 🍴目录 + +计划整理分类 & 目录:(文档已完结请选中 checkbox) + +- [ ] [接口签名与验证](docs/misc/sign) + - [x] [APP API 签名](docs/misc/sign/APP.md)(`appkey` 与 `sign`) + - [x] [已知的 APPKey](docs/misc/sign/APPKey.md) + - [x] [Wbi 签名](docs/misc/sign/wbi.md)(`wts`与`w_rid`) + - [ ] [bili_ticket](docs/misc/sign/bili_ticket.md) + - [ ] [v_voucher 验证](docs/misc/sign/v_voucher.md) +- [ ] [杂项](docs/misc) + - [x] [获取当前时间戳](docs/misc/time_stamp.md) + - [x] [公共错误码](docs/misc/errcode.md) + - [x] [图片格式化](docs/misc/picture.md) + - [x] [bvid 说明](docs/misc/bvid_desc.md) + - [ ] [设备唯一标识 BUVID](docs/misc/device_identity.md) + - [ ] [获取 buvid3 / buvid4 / b_nut](docs/misc/buvid3_4.md) + - [ ] [b23.tv 短链](docs/misc/b23tv.md) - [ ] [gRPC API 接口定义](grpc_api) -- [ ] [登录](login) - - [x] [登录操作(人机认证)](login/login_action) - - [x] [短信登录](login/login_action/SMS.md) - - [x] [密码登录](login/login_action/password.md) - - [x] [二维码登录](login/login_action/QR.md) - - [ ] SNS 登录(QQ & 微博) - - [x] [登录基本信息](login/login_info.md) - - [ ] [个人中心](login/member_center.md) - - [ ] [注销登录](login/exit.md) - - [x] [登录记录](login/login_notice.md) -- [ ] [消息中心](message) - - [ ] [通知类消息](message/msg.md) - - [ ] [私信](message/private_msg.md) - - [ ] [设置](message/config.md) -- [ ] [用户](user) - - [x] [基本信息](user/info.md) - - [x] [状态数](user/status_number.md) - - [x] [关系](user/relation.md) - - [ ] [个人空间](user/space.md) - - [x] [检查昵称是否可注册](user/check_nickname.md) - - [x] [用户注册](user/register.md) - - [x] [大会员福利兑换](user/vip.md) -- [ ] [视频](video) - - [x] [视频分区一览(分区代码)](video/video_zone.md) - - [x] [基本信息](video/info.md) - - [x] [状态数](video/status_number.md) - - [x] [快照](video/snapshot.md) - - [x] [点赞 & 投币 & 收藏](video/like_coin_fav.md) - - [ ] [TAG](video/tags.md) - - [x] [视频推荐](video/recommend.md) - - [x] [播放&下载地址(视频流)](video/videostream_url.md) - - [ ] [互动视频](video/interact_video.md) - - [x] [高能进度条](video/pbp.md) - - [ ] [信息上报(心跳及记录历史)](video/report.md) - - [x] [视频属性数据](video/attribute_data.md) - - [x] [视频在线人数](video/online.md) -- [ ] [剧集(番剧、影视)](bangumi) - - [ ] [基本信息](bangumi/info.md) - - [ ] 状态数 - - [ ] 操作 -- [ ] [视频弹幕](danmaku) - - [x] [protobuf 实时弹幕](danmaku/danmaku_proto.md) - - [x] [protobuf 弹幕元数据(BAS 弹幕 / 互动弹幕)](danmaku/danmaku_view_proto.md) - - [x] [xml 实时弹幕](danmaku/danmaku_xml.md) - - [x] [历史弹幕](danmaku/history.md) - - [x] [快照](danmaku/snapshot.md) - - [ ] [弹幕操作](danmaku/action.md) - - [ ] 高级弹幕 - - [ ] 屏蔽管理 - - [ ] 智能防挡弹幕 - - [x] [弹幕个人配置修改](danmaku/config.md) - - [x] [名词解释](danmaku/buzzword.md) -- [x] [视频笔记](note) - - [x] [笔记列表](note/list.md) - - [x] [笔记详细信息](note/info.md) - - [x] [笔记操作](note/action.md) -- [ ] [专栏](article) - - [ ] 分区 - - [ ] [基本信息](article/info.md) - - [ ] [点赞 & 投币 & 收藏 & 分享](article/like_coin_fav.md) - - [ ] [文集基本信息](article/articles.md) -- [ ] [音频](audio) - - [x] [歌曲基本信息](audio/info.md) - - [ ] [歌单 & 音频收藏夹详细信息](audio/music_list.md) - - [ ] [状态数](audio/status_number.md) - - [ ] [投币 & 收藏](audio/coin&fav.md) - - [x] [播放 & 下载地址(音频流)](audio/musicstream_url.md) - - [ ] 音频榜单 -- [ ] [排行榜 & 最新视频](ranking&dynamic) - - [ ] [排行榜](ranking&dynamic/ranking.md) - - [ ] [最新视频](ranking&dynamic/dynamic.md) -- [ ] [搜索](search) - - [x] [搜索请求](search/search_request.md) - - [x] [搜索结果](search/search_response.md) - - [x] [默认搜索 & 热搜](search/hot.md) - - [x] [搜索建议](search/suggest.md) -- [ ] [小黑屋](blackroom) - - [ ] 基本信息 - - [x] [封禁公示](blackroom/banlist.md) - - [x] [风纪委员及众裁案件相关](blackroom/jury) - - [x] [风纪委员基本信息](blackroom/jury/base_info.md) - - [x] [众裁案件基本信息](blackroom/jury/judgement_info.md) - - [x] [裁决操作](blackroom/jury/action.md) -- [x] [评论区](comment) - - [x] [评论区明细](comment/list.md) - - [x] [操作](comment/action.md) -- [ ] [表情](emoji) - - [x] [表情及表情包信息](emoji/list.md) - - [x] [操作](emoji/action.md) -- [ ] [创作中心](creativecenter) - - [ ] [统计与数据](creativecenter/statistics&data.md) - - [ ] 列表查询相关 - - [x] [电磁力数据](creativecenter/railgun.md) -- [x] [实时广播(通讯协议)](broadcast) - - [x] [视频内广播](broadcast/video_room.md) -- [ ] [充电](electric) - - [x] [B币方式](electric/Bcoin.md) - - [x] [微信 & 支付宝方式](electric/WeChat&Alipay.md) - - [x] [充电留言](electric/charge_msg.md) - - [x] [充电列表](electric/charge_list.md) -- [ ] [动态](dynamic) - - [ ] [发送 & 转载动态](dynamic/publish.md) - - [ ] [根据关键字搜索用户(at 别人时的填充列表)](dynamic/atlist.md) - - [ ] [删除动态](dynamic/delete.md) - - [ ] 动态列表 - - [x] [特定话题动态列表](/dynamic/tag_dynamics.md) - - [ ] [动态内容](/dynamic/get_dynamic_detail.md) - - [ ] 操作 -- [ ] [相簿](album) - - [x] [基本信息](album/info.md) - - [x] [相簿列表](album/list.md) - - [x] [推荐作者](album/recommend_author.md) - - [x] [活动列表](album/activity_list.md) - - [x] [操作](album/action.md) - - [ ] 投稿 -- [ ] [历史记录 & 稍后再看](history&toview) - - [x] [历史记录](history&toview/history.md) - - [x] [稍后再看](history&toview/toview.md) -- [ ] [收藏夹](fav) - - [x] [基本信息](fav/info.md) - - [x] [收藏夹内容](fav/list.md) - - [ ] [收藏夹操作](fav/action.md) -- [ ] [课程](cheese) - - [x] [课程基本信息](cheese/info.md) - - [ ] 已购课程 - - [ ] 分区推荐列表 - - [ ] 操作 - - [x] [播放 & 下载地址(视频流)](cheese/videostream_url.md) -- [ ] [直播](live) - - [ ] [直播间基本信息](live/info.md) - - [ ] [直播分区](live/live_area.md) - - [ ] [直播间管理](live/manage.md) - - [ ] 直播间操作 - - [ ] [直播视频流](live/live_stream.md) - - [ ] [直播信息流](live/message_stream.md) -- [ ] [转正答题](newbie_exam) - - [x] [查询信息](newbie_exam/info.md) - - [x] [拉取题目](newbie_exam/fetch.md) - - [x] [操作](newbie_exam/action.md) -- [ ] B币钱包 - - [ ] 基本信息 - - [ ] B币充值 - - [ ] 贝壳相关 -- [ ] [哔哩哔哩漫画](manga) - - [x] [签到](manga/clockin.md) - - [x] [积分商城](manga/point_shop.md) - +- [ ] [登录](docs/login) + - [x] [登录操作 (人机认证)](docs/login/login_action) + - [x] [短信登录](docs/login/login_action/SMS.md) + - [x] [密码登录](docs/login/login_action/password.md) + - [x] [二维码登录](docs/login/login_action/QR.md) + - [ ] SNS 登录 (QQ & 微信 & 微博) + - [x] [登录基本信息](docs/login/login_info.md) + - [ ] [个人中心](docs/login/member_center.md) + - [ ] [注销登录](docs/login/exit.md) + - [x] [登录记录](docs/login/login_notice.md) + - [x] [Web 端 Cookie 刷新](docs/login/cookie_refresh.md) +- [ ] [消息中心](docs/message) + - [ ] [通知类消息](docs/message/msg.md) + - [x] [私信](docs/message/private_msg.md) + - [x] [私信消息类型、内容说明](docs/message/private_msg_content.md) + - [x] [设置](docs/message/settings.md) +- [ ] [用户](docs/user) + - [x] [基本信息](docs/user/info.md) + - [x] [状态数](docs/user/status_number.md) + - [x] [关系](docs/user/relation.md) + - [ ] [个人空间](docs/user/space.md) + - [x] ~~[检查昵称是否可注册](docs/user/check_nickname.md)~~ (已失效) + - [x] [用户注册](docs/user/register.md) + - [x] [用户认证类型一览](docs/user/official_role.md) + - [ ] [加入老粉计划](docs/user/contract.md) + - [x] [所有粉丝勋章](docs/user/medals.md) +- [ ] [大会员](docs/vip) + - [ ] [大会员基本信息](docs/vip/info.md) + - [ ] [大会员中心](docs/vip/center.md) + - [ ] [大会员签到](docs/vip/clockin.md) + - [ ] [大会员操作](docs/vip/action.md) +- [ ] [视频](docs/video) + - [x] [视频分区一览 (分区代码)](docs/video/video_zone.md) + - [ ] [视频分区一览 (分区代码) (v2)](docs/video/video_zone_v2.md) + - [x] [基本信息](docs/video/info.md) + - [x] ~~[状态数](docs/video/status_number.md)~~ (已失效) + - [x] [快照](docs/video/snapshot.md) + - [x] [点赞 & 投币 & 收藏 & 分享](docs/video/action.md) + - [ ] [TAG](docs/video/tags.md) + - [x] [视频推荐](docs/video/recommend.md) + - [x] [播放 & 下载地址 (视频流)](docs/video/videostream_url.md) + - [ ] [互动视频](docs/video/interact_video.md) + - [x] [高能进度条](docs/video/pbp.md) + - [ ] [信息上报 (心跳及记录历史)](docs/video/report.md) + - [x] [视频属性数据](docs/video/attribute_data.md) + - [x] [视频在线人数](docs/video/online.md) + - [x] [视频 AI 摘要](docs/video/summary.md) + - [ ] [稿件投诉](docs/video/appeal.md) + - [ ] [视频合集](docs/video/collection.md) + - [ ] [播放器](docs/video/player.md) +- [ ] [剧集 (番剧、影视)](docs/bangumi) + - [ ] [基本信息](docs/bangumi/info.md) + - [ ] [播放 & 下载地址(视频流)](docs/bangumi/videostream_url.md) + - [ ] [时间轴](docs/bangumi/timeline.md) + - [ ] [追番相关](docs/bangumi/follow.md) + - [ ] 状态数 + - [ ] 操作 +- [ ] [视频弹幕](docs/danmaku) + - [x] [protobuf 实时弹幕](docs/danmaku/danmaku_proto.md) + - [x] [protobuf 弹幕元数据(BAS 弹幕 / 互动弹幕)](docs/danmaku/danmaku_view_proto.md) + - [x] [xml 实时弹幕](docs/danmaku/danmaku_xml.md) + - [x] [历史弹幕](docs/danmaku/history.md) + - [x] [快照](docs/danmaku/snapshot.md) + - [ ] [弹幕操作](docs/danmaku/action.md) + - [ ] 高级弹幕 + - [ ] 屏蔽管理 + - [ ] [智能防挡弹幕](docs/danmaku/webmask.md) + - [x] [弹幕个人配置修改](docs/danmaku/config.md) + - [x] [名词解释](docs/danmaku/buzzword.md) + - [x] [点赞查询](docs/danmaku/thumbup.md) +- [x] [视频笔记](docs/note) + - [x] [笔记列表](docs/note/list.md) + - [x] [笔记详细信息](docs/note/info.md) + - [x] [笔记操作](docs/note/action.md) +- [ ] [专栏](docs/article) + - [ ] [专栏分类](docs/article/category.md) + - [x] [基本信息](docs/article/info.md) + - [x] [点赞 & 投币 & 收藏 & 分享](docs/article/action.md) + - [x] [文集基本信息](docs/article/articles.md) + - [x] [删除](docs/article/delete.md) +- [ ] [音频](docs/audio) + - [x] [歌曲基本信息](docs/audio/info.md) + - [ ] [歌单 & 音频收藏夹详细信息](docs/audio/music_list.md) + - [ ] [状态数](docs/audio/status_number.md) + - [ ] [投币 & 收藏](docs/audio/action.md) + - [x] [播放 & 下载地址(音频流)](docs/audio/musicstream_url.md) + - [x] [音频榜单](docs/audio/rank.md) +- [ ] [排行榜 & 最新视频](docs/video_ranking) + - [ ] [排行榜](docs/video_ranking/ranking.md) + - [ ] [热门视频](docs/video_ranking/popular.md) + - [ ] [最新视频](docs/video_ranking/dynamic.md) + - [x] [入站必刷视频](docs/video_ranking/precious_videos.md) +- [ ] [搜索](docs/search) + - [x] [搜索请求](docs/search/search_request.md) + - [x] [搜索结果](docs/search/search_response.md) + - [x] [默认搜索 & 热搜](docs/search/hot.md) + - [x] [搜索建议](docs/search/suggest.md) +- [ ] [小黑屋](docs/blackroom) + - [ ] 基本信息 + - [x] [封禁公示](docs/blackroom/banlist.md) + - [x] [风纪委员及众裁案件相关](docs/blackroom/jury) + - [x] [风纪委员基本信息](docs/blackroom/jury/base_info.md) + - [x] [众裁案件基本信息](docs/blackroom/jury/judgement_info.md) + - [x] [裁决操作](docs/blackroom/jury/action.md) +- [x] [评论区](docs/comment) + - [x] [评论区明细](docs/comment/list.md) + - [x] [操作](docs/comment/action.md) +- [ ] [表情](docs/emoji) + - [x] [表情及表情包信息](docs/emoji/list.md) + - [x] [操作](docs/emoji/action.md) +- [ ] [创作中心](docs/creativecenter) + - [ ] [投稿](docs/creativecenter/upload.md) + - [ ] [统计与数据](docs/creativecenter/statistics&data.md) + - [ ] 列表查询相关 + - [x] [电磁力数据](docs/creativecenter/railgun.md) + - [ ] [合集管理](docs/creativecenter/season.md) + - [ ] [视频相关杂项](docs/creativecenter/videos.md) +- [x] [实时广播(通讯协议)](docs/broadcast) + - [x] [视频内广播](docs/broadcast/video_room.md) +- [ ] [充电](docs/electric) + - [ ] [包月充电](docs/electric/monthly.md) + - [ ] 自定义充电 + - [x] [B 币方式充电](docs/electric/Bcoin.md) + - [x] [微信 & 支付宝方式充电](docs/electric/WeChat&Alipay.md) + - [x] [充电留言](docs/electric/charge_msg.md) + - [x] [充电列表](docs/electric/charge_list.md) +- [ ] [动态](docs/dynamic) + - [ ] [获取动态列表](docs/dynamic/all.md) + - [ ] [获取用户空间动态](docs/dynamic/space.md) + - [ ] [动态基本信息](docs/dynamic/basicInfo.md) + - [ ] [动态详细信息字段](docs/dynamic/card_info.md) + - [ ] [获取动态详情](docs/dynamic/detail.md) + - [ ] [动态类型对照](docs/dynamic/dynamic_enum.md) + - [ ] [动态信息](docs/dynamic/content.md) + - [ ] [话题搜索](docs/dynamic/topic.md) + - [ ] [发送 & 转载动态](docs/dynamic/publish.md) + - [ ] [根据关键字搜索用户(at 别人时的填充列表)](docs/dynamic/atlist.md) + - [ ] [操作](docs/dynamic/action.md) + - [ ] 动态列表 + - [x] [特定话题动态列表](docs/dynamic/tag_dynamics.md) + - [ ] [动态内容](docs/dynamic/get_dynamic_detail.md) + - [ ] [导航栏动态](docs/dynamic/nav.md) +- [ ] ~~[相簿](docs/album)~~ (已下线) + - [x] ~~[基本信息](docs/album/info.md)~~ + - [x] ~~[相簿列表](docs/album/list.md)~~ + - [x] ~~[推荐作者](docs/album/recommend_author.md)~~ + - [x] ~~[活动列表](docs/album/activity_list.md)~~ + - [x] ~~[操作](docs/album/action.md)~~ + - [ ] ~~投稿~~ +- [ ] [历史记录 & 稍后再看](docs/historytoview) + - [x] [历史记录](docs/historytoview/history.md) + - [x] [稍后再看](docs/historytoview/toview.md) +- [ ] [收藏夹](docs/fav) + - [x] [基本信息](docs/fav/info.md) + - [x] [收藏夹内容](docs/fav/list.md) + - [ ] [收藏夹操作](docs/fav/action.md) +- [ ] [课程](docs/cheese) + - [x] [课程基本信息](docs/cheese/info.md) + - [ ] 已购课程 + - [ ] 分区推荐列表 + - [ ] 操作 + - [x] [播放 & 下载地址(视频流)](docs/cheese/videostream_url.md) +- [ ] [直播](docs/live) + - [ ] [直播间基本信息](docs/live/info.md) + - [ ] [直播推荐](docs/live/recommend.md) + - [ ] [直播分区](docs/live/live_area.md) + - [ ] [直播间管理](docs/live/manage.md) + - [ ] 直播间操作 + - [ ] [直播视频流](docs/live/live_stream.md) + - [ ] [直播信息流](docs/live/message_stream.md) + - [ ] [直播红包](docs/live/redpocket.md) + - [ ] [直播间表情包](docs/live/emoticons.md) + - [ ] [直播间用户实用 API](docs/live/user.md) + - [x] [直播间禁言相关](docs/live/silent_user_manage.md) + - [ ] [关注UP直播情况](docs/live/follow_up_live.md) + - [ ] [直播心跳上报](docs/live/report.md) + - [ ] [直播间弹幕](docs/live/danmaku.md) +- [ ] [活动](docs/activity) + - [ ] [活动列表](docs/activity/list.md) + - [ ] [活动主题信息](docs/activity/info.md) +- [ ] [转正答题](docs/newbie_exam) + - [x] [查询信息](docs/newbie_exam/info.md) + - [x] [拉取题目](docs/newbie_exam/fetch.md) + - [x] [操作](docs/newbie_exam/action.md) +- [ ] [青少年守护](docs/teenager/) + - [x] [青少年模式](docs/teenager/teenager_mode.md) + - [ ] 亲子平台 + - [ ] 课堂模式 +- [ ] [B 币钱包](docs/wallet/) + - [ ] [基本信息](docs/wallet/info.md) + - [ ] B 币充值 + - [ ] 贝壳相关 +- [ ] [哔哩哔哩漫画](docs/manga) + - [ ] 用户信息 + - [x] [签到](docs/manga/ClockIn.md) + - [x] [积分商城](docs/manga/point_shop.md) + - [x] [漫画操作](docs/manga/Comic.md) + - [ ] [漫画任务操作](docs/manga/Activity.md) + - [x] [漫画赛季](docs/manga/Season.md) + - [x] [漫读券/已购相关](docs/manga/User.md) + - [x] [下载](docs/manga/Download.md) + - [x] [data.index 解析](docs/manga/index_file.md) + - [ ] [获取轻享卡信息](docs/manga/light_card.md) - [ ] 哔哩哔哩游戏 -- [ ] 轻视频 -- [ ] [终端网络查询](clientinfo) - - [x] [基于ip的地理位置查询](clientinfo/ip.md) - - [x] [终端信息查询](clientinfo/client_info.md) -- [ ] [其他](other) - - [x] [获取当前时间戳](other/time_stamp.md) -- [ ] [web端组件](web_widget) - - [x] [分区当日投稿数](web_widget/zone_upload.md) - - [x] [404 页漫画收集](web_widget/404_manga.md) -- [ ] [APP端组件](APP_widget) - - [x] [开屏图片](APP_widget/splash.md) -- [ ] [个性装扮](garb) - - [x] [APP 主题](garb/skin.md) - - [x] [主题色](garb/color.md) +- [ ] [终端网络查询](docs/clientinfo) + - [x] [基于 IP 的地理位置查询](docs/clientinfo/ip.md) +- [ ] [客服中心](docs/customerservice) + - [ ] [客服消息](docs/customerservice/msg.md) +- [ ] [web 端组件](docs/web_widget) + - [x] [分区当日投稿数](docs/web_widget/zone_upload.md) + - [x] [404 页漫画收集](docs/web_widget/404_manga.md) + - [ ] [首页横幅头图](docs/web_widget/header.md) +- [ ] [APP 端组件](docs/APP_widget) + - [x] [开屏图片 + 恰饭珍贵录像](docs/APP_widget/splash.md) + - [ ] [获取最新 APP 版本](docs/APP_widget/ver.md) +- [ ] [个性装扮](docs/garb) + - [x] [APP 主题](docs/garb/skin.md) + - [x] [主题色](docs/garb/color.md) + - [ ] [装扮/收藏集](docs/garb/lottery.md) -B站专栏同步推出[《B站api研究记》](https://www.bilibili.com/read/readlist/rl207146)系列(更新状态:咕咕......),~~欢迎关注~~ +## ✨鸣谢 -**--Project_by [社会易姐QwQ](https://space.bilibili.com/293793435)** +你们的存在,让社区更美好 -# 相关协议基础 +[![contributors](https://opencollective.com/bilibili-api-collect/contributors.svg?width=860&button=false)](https://github.com/SocialSisterYi/bilibili-API-collect/graphs/contributors) -http 协议:[传送门](https://www.cnblogs.com/an-wen/p/11180076.html) +## 📖相关协议基础 -json 序列格式:[传送门](https://www.sojson.com/json/json_index.html) +HTTP 协议:[传送门](https://www.cnblogs.com/an-wen/p/11180076.html) -xml 序列格式:[传送门](https://www.w3school.com.cn/xml/xml_intro.asp) +JSON 序列格式:[传送门](https://www.sojson.com/json/json_index.html) -protobuf 序列格式:[传送门](https://www.jianshu.com/p/a24c88c0526a ) +XML 序列格式:[传送门](https://www.w3school.com.cn/xml/xml_intro.asp) -# 交流 +ProtoBuf 序列格式:[传送门](https://www.jianshu.com/p/a24c88c0526a) -<img src="imgs/up_face.jpg" width="100" height="100"> +## 💦交流 -QQ 粉丝交流群:[1136462265](https://jq.qq.com/?_wv=1027&k=s1M0LCcu) +<img src="https://avatars.githubusercontent.com/u/45892418" width="100" height="100" /> -Telegram 讨论组:[@bilibili_API_collect_community](https://t.me/bilibili_API_collect_community) +⚠注意:开源社群欢迎交流探讨,**拒绝**咨询、**不支持**合作,**黑产号**一经发现立即拉黑并举报相关 SRC -B 站空间:<https://space.bilibili.com/293793435> +- QQ 交流群:[邀请链接](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&noverify=0&group_code=191187164) +- Telegram 交流群:[@bilibili_API_collect_community](https://t.me/bilibili_API_collect_community) -个人博客:<https://shakaianee.top> - -# 发电 +## 🧋发电 欢迎来~~交♂易~~,大家的支持就是我继续开发的动力! @@ -245,50 +332,66 @@ B 站空间:<https://space.bilibili.com/293793435> WeChat & Alipay: -<img src="imgs/sponsorQR.jpg" width="300" height="300"> +<img src="./assets/img/sponsorQR.jpg" width="300" height="300" /> -OR Aifadian:https://afdian.net/@ShakaiAneE +OR Aifadian:[https://afdian.com/@ShakaiAneE](https://afdian.com/@ShakaiAneE) -# 相关项目 +## 🔗相关项目推荐 -## 库及文档 +### 库及文档 - [jingyuexing/bilibiliAPI](https://github.com/jingyuexing/bilibiliAPI) - [fython/BilibiliAPIDocs](https://github.com/fython/BilibiliAPIDocs) - [czp3009/bilibili-api](https://github.com/czp3009/bilibili-api) - [Vespa314/bilibili-api](https://github.com/Vespa314/bilibili-api) -- [whjstc/openbilibili-go-common-1](https://github.com/whjstc/openbilibili-go-common-1) -- [wnstar/bili-utils](https://github.com/wnstar/bili-utils) -- [lovelyyoshino/Bilibili-Live-API](https://github.com/lovelyyoshino/Bilibili-Live-API) -- [flaribbit/bilibili-manga-spider](https://github.com/flaribbit/bilibili-manga-spider) -- [simon300000/bili-api](https://github.com/simon300000/bili-api) -- [iyear/biligo](https://github.com/iyear/biligo) Bilibili API SDK in Golang +- [Pengfei00/bili-utils](https://github.com/Pengfei00/bili-utils): bilibili 工具箱 +- [lovelyyoshino/Bilibili-Live-API](https://github.com/lovelyyoshino/Bilibili-Live-API): Bilibili 直播/番剧 API 文档 +- [flaribbit/bilibili-manga-spider](https://github.com/flaribbit/bilibili-manga-spider): Bilibili 漫画爬虫 +- [simon300000/bili-api](https://github.com/simon300000/bili-api): Bilibili Node.js API +- [iyear/biligo](https://github.com/iyear/biligo): Bilibili API SDK in Golang +- [bilibili-openplatform/demo](https://github.com/bilibili-openplatform/demo): 哔哩哔哩开放平台示例代码库 +- [ddiu8081/blive-message-listener](https://github.com/ddiu8081/blive-message-listener): Bilibili-live danmu listener with type. Bilibili 直播间弹幕监听库,支持类型输出。 +- [Nemo2011/bilibili-api](https://github.com/Nemo2011/bilibili-api): 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。工具齐全。 +- [CuteReimu/bilibili](https://github.com/CuteReimu/bilibili): 哔哩哔哩API的Go版本SDK -## 成品 +### 成品 -- [3Shain/BiliChat](https://github.com/3Shain/BiliChat) : 基于h5的B站直播弹幕姬 -- [AncientLysine/BiliLocal](https://github.com/AncientLysine/BiliLocal):本地弹幕播放器 -- [zyzsdy/biliroku](https://github.com/zyzsdy/biliroku):bilibili 生放送(直播)录制 -- [otakustay/danmaku-to-ass](https://github.com/otakustay/danmaku-to-ass):A站B站弹幕转字幕文件 -- [bilibili-helper/bilibili-helper-o](https://github.com/bilibili-helper/bilibili-helper-o):哔哩哔哩 (bilibili.com) 辅助工具,可以下载视频,查询弹幕发送人以及一些十分实用的直播区功能。 -- [apachecn/BiliDriveEx](https://github.com/apachecn/BiliDriveEx):基于B站相簿上传的文件分块索引存储器 -- [apachecn/CDNDrive](https://github.com/apachecn/CDNDrive):基于B站相簿上传的文件分块索引存储器 -- [Hsury/BiliDrive](https://github.com/Hsury/BiliDrive):基于B站相簿上传的文件分块索引存储器 -- [Tsuk1ko/bilibili-live-chat](https://github.com/Tsuk1ko/bilibili-live-chat):无后端的仿 YouTube Live Chat 风格的简易 Bilibili 弹幕姬 -- [ironmanic/crawler_target_users_good](https://github.com/ironmanic/crawler_target_users_good):搜索bilibili特定视频,为评论 点赞,关注,私信,一体化服务 -- [dd-center/DDatElectron](https://github.com/dd-center/DDatElectron):DD@Home 分布式项目, 桌面客户端 -- [dd-center/vtbs.moe](https://github.com/dd-center/vtbs.moe):B站VTB数据中心 -- [JunzhouLiu/BILIBILI-HELPER](https://github.com/JunzhouLiu/BILIBILI-HELPER):利用Linux Crontab定时任务,云函数,Docker等方式实现B站,哔哩哔哩(Bilibili)每日自动投币,签到,银瓜子兑换硬币,领取大会员福利,大会员月底给自己充电等。每天轻松获取65经验值。 -- [the1812/Bilibili-Evolved](https://github.com/the1812/Bilibili-Evolved):强大的哔哩哔哩增强脚本: 下载视频, 音乐, 封面, 弹幕 / 简化直播间, 评论区, 首页 / 自定义顶栏, 删除广告, 夜间模式 / 触屏设备支持 +- [NullPointerException/AnimePipe](https://codeberg.org/NullPointerException/AnimePipe): 功能完善的Android流媒体综合客户端,支持Bilibili, Youtube, NicoNico +- [3Shain/Comen](https://github.com/3Shain/Comen): 基于h5的B站直播弹幕姬 +- [AncientLysine/BiliLocal](https://github.com/AncientLysine/BiliLocal): 本地弹幕播放器 +- [zyzsdy/biliroku](https://github.com/zyzsdy/biliroku): bilibili 生放送(直播)录制 +- [otakustay/danmaku-to-ass](https://github.com/otakustay/danmaku-to-ass): A站B站弹幕转字幕文件 +- [bilibili-helper/bilibili-helper-o](https://github.com/bilibili-helper/bilibili-helper-o): 哔哩哔哩 (bilibili.com) 辅助工具,可以下载视频,查询弹幕发送人以及一些十分实用的直播区功能。 +- [apachecn/CDNDrive](https://github.com/apachecn/CDNDrive): 基于B站相簿上传的文件分块索引存储器 +- [Hsury/BiliDrive](https://github.com/Hsury/BiliDrive): 基于B站相簿上传的文件分块索引存储器 +- [Tsuk1ko/bilibili-live-chat](https://github.com/Tsuk1ko/bilibili-live-chat): 无后端的仿 YouTube Live Chat 风格的简易 Bilibili 弹幕姬 +- [ironmanic/crawler_target_users_good](https://github.com/ironmanic/crawler_target_users_good): 搜索bilibili特定视频,为评论 点赞,关注,私信,一体化服务 +- [dd-center/DDatElectron](https://github.com/dd-center/DDatElectron): DD@Home 分布式项目, 桌面客户端 +- [dd-center/vtbs.moe](https://github.com/dd-center/vtbs.moe): B站VTB数据中心 +- [the1812/Bilibili-Evolved](https://github.com/the1812/Bilibili-Evolved): 强大的哔哩哔哩增强脚本: 下载视频、音乐、封面、弹幕 / 简化直播间、评论区、首页 / 自定义顶栏、删除广告、夜间模式 / 触屏设备支持 - [xlzy520/bili-short-url](https://github.com/xlzy520/bili-short-url): 哔哩哔哩短链生成器 - [zjkwdy/bili_app_splash](https://github.com/zjkwdy/bili_app_splash): B站壁纸娘和开屏图自动下载,每天使用Actions自动同步 - [Jannchie/BiliOB](https://github.com/Jannchie/BiliOB): BiliOB观测者是一个观测B站UP主及视频数据变化,并予以分析的Web应用程序 -- [biliob233/biliob233.github.io](https://github.com/biliob233/biliob233.github.io):~~无可奉告~~ +- [biliob233/biliob233.github.io](https://github.com/biliob233/biliob233.github.io): ~~无可奉告~~ +- [biliup/biliup](https://github.com/biliup/biliup): 全自动录播、投稿工具,支持录制直播弹幕,也支持Youtube、twitch直播回放列表自动搬运到B站 +- [ddiu8081/bilicli](https://github.com/ddiu8081/bilicli): Bilibili-live danmu dashboard in your terminal. +- [MotooriKashin/Bilibili-Old](https://github.com/MotooriKashin/Bilibili-Old): 恢复旧版Bilibili页面,为了那些念旧的人。 +- [SocialSisterYi/bcut-asr](https://github.com/SocialSisterYi/bcut-asr): 使用必剪API的语音字幕识别 +- [CzJam/Bili_Realtime_Data](https://github.com/CzJam/Bili_Realtime_Data): Bilibili粉丝与视频实时数据统计 +- [kingwingfly/fav](https://github.com/kingwingfly/fav): 自动同步bili收藏夹、合集视频到本地的CLI工具(Rust实现,并提供一个文档测试完善的Rust风格的用于构建有状态爬虫的核心库) +- [linyuye/Bilibili_crawler](https://github.com/linyuye/Bilibili_crawler): 基于bilibili懒加载api爬取b站动态,视频等评论区 +- [ouzexi/bilibili-hot-tags](https://github.com/ouzexi/bilibili-hot-tags): 一个B站热门视频标签检索统计小工具 -## 其他 +### 其他 -- [kuresaru/geetest-validator](https://github.com/kuresaru/geetest-validator):geetest调试器 +- [kuresaru/geetest-validator](https://github.com/kuresaru/geetest-validator): GeeTest 调试器 +- [bloomrpc/bloomrpc](https://github.com/bloomrpc/bloomrpc): GUI Client for GRPC Services +- [grpc/grpc](https://github.com/grpc/grpc): The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#) +- [glideapps/quicktype](https://github.com/glideapps/quicktype): quicktype generates strongly-typed models and serializers from JSON, JSON Schema, TypeScript, and GraphQL queries, making it a breeze to work with JSON type-safely in many programming languages. 一键生成多种语言的JSON反序列化所需类,以便于快速反序列化,有网页版 +- [SessionHu/json-apidoc-gen](https://github.com/SessionHu/json-apidoc-gen): Simple CLI tool for generating BAC document template -- [uw-labs/bloomrpc](https://github.com/uw-labs/bloomrpc): GUI Client for GRPC Services - -- [grpc/grpc](https://github.com/grpc/grpc): The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#) \ No newline at end of file +<style scoped> + .shields a { + margin: auto .5em; + } +</style> diff --git a/imgs/2233login.png b/assets/img/2233login.png similarity index 100% rename from imgs/2233login.png rename to assets/img/2233login.png diff --git a/imgs/activit.svg b/assets/img/activit.svg similarity index 100% rename from imgs/activit.svg rename to assets/img/activit.svg diff --git a/imgs/add.svg b/assets/img/add.svg similarity index 100% rename from imgs/add.svg rename to assets/img/add.svg diff --git a/assets/img/aiSummary.svg b/assets/img/aiSummary.svg new file mode 100644 index 0000000..efa4420 --- /dev/null +++ b/assets/img/aiSummary.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="1024" height="1024" viewBox="0 0 1024 1024"><defs><clipPath id="master_svg0_1_5"><rect x="0" y="0" width="1024" height="1024" rx="0"/></clipPath><linearGradient x1="-0.03559274226427078" y1="0.14154286682605743" x2="0.3670809864997864" y2="1.0495315790176392" id="master_svg1_1_92"><stop offset="0%" stop-color="#393946" stop-opacity="1"/><stop offset="40.115898847579956%" stop-color="#23232E" stop-opacity="1"/><stop offset="100%" stop-color="#191924" stop-opacity="1"/></linearGradient><linearGradient x1="1.0356004238128662" y1="0.14154286682605743" x2="0.6329137682914734" y2="1.0495315790176392" id="master_svg2_1_93"><stop offset="0%" stop-color="#393946" stop-opacity="1"/><stop offset="40.115898847579956%" stop-color="#23232E" stop-opacity="1"/><stop offset="100%" stop-color="#191924" stop-opacity="1"/></linearGradient><filter id="master_svg3_1_05" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="-5" y="-5" width="831.2000732421875" height="728.800048828125"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="1" dx="1"/><feGaussianBlur stdDeviation="1.5"/><feColorMatrix type="matrix" values="0 0 0 0 0.03954499959945679 0 0 0 0 0.08450230211019516 0 0 0 0 0.20010699331760406 0 0 0 0.8500000238418579 0"/><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><filter id="master_svg4_1_12" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="0" y="0" width="887.4667358398438" height="750.933349609375"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feColorMatrix in="SourceAlpha" type="matrix" result="hardAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="3.714289903640747" dx="2.785710096359253"/><feGaussianBlur stdDeviation="1.3928600549697876"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.25 0"/><feBlend mode="normal" in2="shape" result="effect1_innerShadow"/><feColorMatrix in="SourceAlpha" type="matrix" result="hardAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="-1.8571399450302124" dx="-2"/><feGaussianBlur stdDeviation="1.8571399450302124"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0.15444999933242798 0 0 0 0 0.45426398515701294 0 0 0 0.10999999940395355 0"/><feBlend mode="normal" in2="effect1_innerShadow" result="effect2_innerShadow"/></filter><linearGradient x1="0.21811191737651825" y1="0.21849091351032257" x2="0.6896499991416931" y2="1.0494545698165894" id="master_svg5_1_95"><stop offset="0%" stop-color="#F4FCFF" stop-opacity="1"/><stop offset="100%" stop-color="#EAF5F9" stop-opacity="1"/></linearGradient></defs><g clip-path="url(#master_svg0_1_5)"><g><g><path d="M257.357049609375,80.1351999267578C279.080249609375,62.032609926757814,311.364849609375,64.96772992675781,329.467549609375,86.69049992675781L414.802349609375,189.09079992675782C432.902349609375,210.8137999267578,429.967349609375,243.0987999267578,408.245349609375,261.2007999267578C386.522349609375,279.30379992675785,354.239349609375,276.3687999267578,336.135049609375,254.6457999267578L250.801749609375,152.2452999267578C232.699149609375,130.5224999267578,235.634279609375,98.2374999267578,257.357049609375,80.1351999267578Z" fill-rule="evenodd" fill="url(#master_svg1_1_92)" fill-opacity="1"/></g><g><path d="M749.5745874023437,80.1351999267578C727.8525874023437,62.032609926757814,695.5695874023438,64.96772992675781,677.4648874023437,86.69049992675781L592.1314874023437,189.09079992675782C574.0306074023438,210.8137999267578,576.9660174023437,243.0987999267578,598.6884874023438,261.2007999267578C620.4109874023437,279.30379992675785,652.6942874023438,276.3687999267578,670.7985874023437,254.6457999267578L756.1315874023437,152.2452999267578C774.2325874023437,130.5224999267578,771.3005874023438,98.2374999267578,749.5745874023437,80.1351999267578Z" fill-rule="evenodd" fill="url(#master_svg2_1_93)" fill-opacity="1"/></g><g style="opacity:0.20000000298023224;" filter="url(#master_svg3_1_05)"><g><path d="M921.6000244140625,623.0460183105469C921.6000244140625,854.0370183105468,738.2150244140626,921.6000183105468,512.0000244140625,921.6000183105468C285.7840244140625,921.6000183105468,102.4000244140625,854.0370183105468,102.4000244140625,623.0460183105469C102.4000244140625,392.05501831054687,133.9078244140625,204.80001831054688,512.0000244140625,204.80001831054688C905.8480244140625,204.80001831054688,921.6000244140625,392.05501831054687,921.6000244140625,623.0460183105469Z" fill="#D9D9D9" fill-opacity="1"/></g></g><g filter="url(#master_svg4_1_12)"><g><path d="M955.7336625976562,646.7890183105469C955.7336625976562,909.8580183105469,757.0666625976562,955.7330183105469,511.99966259765625,955.7330183105469C266.93266259765625,955.7330183105469,68.26666259765625,909.8580183105469,68.26666259765625,646.7890183105469C68.26666259765625,341.3330183105469,102.39996259765624,204.80001831054688,511.99966259765625,204.80001831054688C938.6666625976562,204.80001831054688,955.7336625976562,341.3330183105469,955.7336625976562,646.7890183105469Z" fill="url(#master_svg5_1_95)" fill-opacity="1"/></g></g><g><path d="M163.36666870117188,485.00368701171874C163.36666870117188,407.0843870117187,219.98396870117188,340.03798701171877,297.34866870117185,330.76228701171874C450.79566870117185,312.36440701171875,572.3406687011718,311.68546701171874,727.4906687011719,330.44178701171876C804.5126687011718,339.7532870117187,860.6616687011718,406.65778701171877,860.6616687011718,484.2426870117188L860.6616687011718,655.0866870117188C860.6616687011718,728.1596870117187,810.8406687011719,792.7736870117187,738.8226687011719,805.1506870117187C576.9556687011718,832.9626870117188,449.55266870117185,827.6006870117187,292.1596687011719,802.6006870117187C217.16826870117188,790.6886870117187,163.36666870117188,724.7296870117187,163.36666870117188,648.7996870117188L163.36666870117188,485.00368701171874Z" fill="#191924" fill-opacity="1"/></g><g><path d="M639.7466748046875,522.6667022705078L639.7466748046875,617.7519022705078Q639.7466748046875,618.5060022705078,639.7836748046875,619.2593022705078Q639.8206748046875,620.0125022705079,639.8945748046875,620.7630022705079Q639.9684748046875,621.5135022705078,640.0791748046875,622.2595022705078Q640.1898748046875,623.0057022705078,640.3369748046875,623.7447022705078Q640.4840748046875,624.4847022705078,640.6672748046875,625.2167022705078Q640.8505748046875,625.9477022705078,641.0694748046875,626.6697022705079Q641.2883748046875,627.3907022705079,641.5424748046875,628.1007022705078Q641.7964748046875,628.8117022705078,642.0850748046875,629.5077022705078Q642.3736748046875,630.2047022705078,642.6961748046875,630.8867022705078Q643.0185748046875,631.5677022705078,643.3740748046876,632.2337022705078Q643.7295748046874,632.8987022705078,644.1172748046876,633.5447022705079Q644.5049748046875,634.1917022705078,644.9239748046875,634.8187022705079Q645.3428748046875,635.4457022705078,645.7921748046875,636.0517022705078Q646.2413748046876,636.6577022705078,646.7197748046875,637.2407022705078Q647.1981748046875,637.8237022705079,647.7046748046876,638.3827022705078Q648.2110748046875,638.9407022705078,648.7443748046875,639.4747022705078Q649.2775748046874,640.0077022705078,649.8363748046875,640.5137022705078Q650.3951748046875,641.0207022705079,650.9780748046875,641.4987022705078Q651.5610748046875,641.9777022705078,652.1667748046875,642.4267022705078Q652.7724748046875,642.8757022705079,653.3995748046875,643.2947022705079Q654.0265748046875,643.7137022705078,654.6734748046875,644.1017022705078Q655.3202748046875,644.4887022705078,655.9853748046875,644.8447022705078Q656.6504748046875,645.1997022705078,657.3321748046875,645.5227022705078Q658.0138748046875,645.8447022705078,658.7106748046875,646.1337022705078Q659.4073748046875,646.4217022705078,660.1173748046875,646.6757022705078Q660.8274748046875,646.9307022705078,661.5491348046875,647.1487022705078Q662.2707948046875,647.3677022705078,663.0023248046875,647.5517022705078Q663.7338548046876,647.7347022705078,664.4735048046875,647.8817022705078Q665.2131448046875,648.0287022705078,665.9591148046875,648.1397022705078Q666.7050848046875,648.2497022705078,667.4555848046875,648.3237022705079Q668.2060948046875,648.3977022705078,668.9593148046876,648.4347022705078Q669.7125408046875,648.4717022705079,670.4666748046875,648.4717022705079Q671.2208088046875,648.4717022705079,671.9740348046874,648.4347022705078Q672.7272548046875,648.3977022705078,673.4777648046875,648.3237022705079Q674.2282648046875,648.2497022705078,674.9742348046875,648.1397022705078Q675.7202048046875,648.0287022705078,676.4598448046875,647.8817022705078Q677.1994948046874,647.7347022705078,677.9310248046875,647.5517022705078Q678.6625548046875,647.3677022705078,679.3842148046875,647.1487022705078Q680.1058748046875,646.9307022705078,680.8159748046875,646.6757022705078Q681.5259748046875,646.4217022705078,682.2226748046875,646.1337022705078Q682.9194748046875,645.8447022705078,683.6011748046875,645.5227022705078Q684.2828748046875,645.1997022705078,684.9479748046875,644.8447022705078Q685.6130748046875,644.4887022705078,686.2598748046875,644.1017022705078Q686.9067748046875,643.7137022705078,687.5337748046875,643.2947022705079Q688.1608748046875,642.8757022705079,688.7665748046875,642.4267022705078Q689.3722748046875,641.9777022705078,689.9552748046875,641.4987022705078Q690.5381748046875,641.0207022705079,691.0969748046875,640.5137022705078Q691.6557748046876,640.0077022705078,692.1889748046875,639.4747022705078Q692.7222748046875,638.9407022705078,693.2286748046874,638.3827022705078Q693.7351748046875,637.8237022705079,694.2135748046875,637.2407022705078Q694.6919748046874,636.6577022705078,695.1411748046875,636.0517022705078Q695.5904748046875,635.4457022705078,696.0093748046875,634.8187022705079Q696.4283748046875,634.1917022705078,696.8160748046874,633.5447022705079Q697.2037748046876,632.8987022705078,697.5592748046874,632.2337022705078Q697.9147748046875,631.5677022705078,698.2371748046875,630.8867022705078Q698.5596748046875,630.2047022705078,698.8482748046875,629.5077022705078Q699.1368748046875,628.8117022705078,699.3908748046875,628.1007022705078Q699.6449748046875,627.3907022705079,699.8638748046875,626.6697022705079Q700.0827748046875,625.9477022705078,700.2660748046875,625.2167022705078Q700.4492748046875,624.4847022705078,700.5963748046875,623.7447022705078Q700.7434748046875,623.0057022705078,700.8541748046875,622.2595022705078Q700.9648748046875,621.5135022705078,701.0387748046875,620.7630022705079Q701.1126748046875,620.0125022705079,701.1496748046875,619.2593022705078Q701.1866748046875,618.5060022705078,701.1866748046875,617.7519022705078L701.1866748046875,522.6667022705078Q701.1866748046875,521.9125682705078,701.1496748046875,521.1593422705079Q701.1126748046875,520.4061222705078,701.0387748046875,519.6556122705078Q700.9648748046875,518.9051122705079,700.8541748046875,518.1591422705078Q700.7434748046875,517.4131722705079,700.5963748046875,516.6735322705078Q700.4492748046875,515.9338822705079,700.2660748046875,515.2023522705078Q700.0827748046875,514.4708222705078,699.8638748046875,513.7491622705078Q699.6449748046875,513.0275022705079,699.3908748046875,512.3174022705078Q699.1368748046875,511.6074022705078,698.8482748046875,510.91070227050784Q698.5596748046875,510.2139022705078,698.2371748046875,509.5322022705078Q697.9147748046875,508.85050227050783,697.5592748046874,508.18540227050784Q697.2037748046876,507.52030227050784,696.8160748046874,506.8735022705078Q696.4283748046875,506.2266022705078,696.0093748046875,505.59960227050783Q695.5904748046875,504.9725022705078,695.1411748046875,504.36680227050783Q694.6919748046874,503.7611022705078,694.2135748046875,503.1781022705078Q693.7351748046875,502.5952022705078,693.2286748046874,502.03640227050784Q692.7222748046875,501.4776022705078,692.1889748046875,500.9444022705078Q691.6557748046876,500.4111022705078,691.0969748046875,499.9047022705078Q690.5381748046875,499.3982022705078,689.9552748046875,498.91980227050783Q689.3722748046875,498.4414022705078,688.7665748046875,497.9922022705078Q688.1608748046875,497.5429022705078,687.5337748046875,497.1240022705078Q686.9067748046875,496.7050022705078,686.2598748046875,496.3173022705078Q685.6130748046875,495.9296022705078,684.9479748046875,495.5741022705078Q684.2828748046875,495.2186022705078,683.6011748046875,494.89620227050784Q682.9194748046875,494.5737022705078,682.2226748046875,494.2851022705078Q681.5259748046875,493.9965022705078,680.8159748046875,493.7425022705078Q680.1058748046875,493.48840227050783,679.3842148046875,493.2695022705078Q678.6625548046875,493.0506022705078,677.9310248046875,492.8673022705078Q677.1994948046874,492.6841022705078,676.4598448046875,492.5370022705078Q675.7202048046875,492.38990227050783,674.9742348046875,492.2792022705078Q674.2282648046875,492.1685022705078,673.4777648046875,492.09460227050783Q672.7272548046875,492.0207022705078,671.9740348046874,491.9837022705078Q671.2208088046875,491.9467022705078,670.4666748046875,491.9467022705078Q669.7125408046875,491.9467022705078,668.9593148046876,491.9837022705078Q668.2060948046875,492.0207022705078,667.4555848046875,492.09460227050783Q666.7050848046875,492.1685022705078,665.9591148046875,492.2792022705078Q665.2131448046875,492.38990227050783,664.4735048046875,492.5370022705078Q663.7338548046876,492.6841022705078,663.0023248046875,492.8673022705078Q662.2707948046875,493.0506022705078,661.5491348046875,493.2695022705078Q660.8274748046875,493.48840227050783,660.1173748046875,493.7425022705078Q659.4073748046875,493.9965022705078,658.7106748046875,494.2851022705078Q658.0138748046875,494.5737022705078,657.3321748046875,494.89620227050784Q656.6504748046875,495.2186022705078,655.9853748046875,495.5741022705078Q655.3202748046875,495.9296022705078,654.6734748046875,496.3173022705078Q654.0265748046875,496.7050022705078,653.3995748046875,497.1240022705078Q652.7724748046875,497.5429022705078,652.1667748046875,497.9922022705078Q651.5610748046875,498.4414022705078,650.9780748046875,498.91980227050783Q650.3951748046875,499.3982022705078,649.8363748046875,499.9047022705078Q649.2775748046874,500.4111022705078,648.7443748046875,500.9444022705078Q648.2110748046875,501.4776022705078,647.7046748046876,502.03640227050784Q647.1981748046875,502.5952022705078,646.7197748046875,503.1781022705078Q646.2413748046876,503.7611022705078,645.7921748046875,504.36680227050783Q645.3428748046875,504.9725022705078,644.9239748046875,505.59960227050783Q644.5049748046875,506.2266022705078,644.1172748046876,506.8735022705078Q643.7295748046874,507.52030227050784,643.3740748046876,508.18540227050784Q643.0185748046875,508.85050227050783,642.6961748046875,509.5322022705078Q642.3736748046875,510.2139022705078,642.0850748046875,510.91070227050784Q641.7964748046875,511.6074022705078,641.5424748046875,512.3174022705078Q641.2883748046875,513.0275022705079,641.0694748046875,513.7491622705078Q640.8505748046875,514.4708222705078,640.6672748046875,515.2023522705078Q640.4840748046875,515.9338822705079,640.3369748046875,516.6735322705078Q640.1898748046875,517.4131722705079,640.0791748046875,518.1591422705078Q639.9684748046875,518.9051122705079,639.8945748046875,519.6556122705078Q639.8206748046875,520.4061222705078,639.7836748046875,521.1593422705079Q639.7466748046875,521.9125682705078,639.7466748046875,522.6667022705078Z" fill-rule="evenodd" fill="#2CFFFF" fill-opacity="1"/></g><g><path d="M375.2577557128906,485.21440764160155L375.2550557128906,485.2118076416016Q375.24655571289065,485.20330764160155,375.2380557128906,485.1948076416016Q375.1149557128906,485.07190764160157,374.99045571289065,484.95040764160154Q374.9815557128906,484.94170764160157,374.9726557128906,484.93300764160153Q374.4414557128906,484.4154076416016,373.8859557128906,483.9240076416016Q373.33035571289065,483.4326076416016,372.7517557128906,482.9686076416016Q372.17305571289063,482.5046076416016,371.5727557128906,482.0691076416016Q370.97235571289065,481.63350764160157,370.35165571289065,481.22750764160156Q369.7310557128906,480.8214076416016,369.09145571289065,480.44580764160156Q368.45195571289065,480.07010764160157,367.79505571289064,479.7258076416016Q367.1380557128906,479.38150764160156,366.4652557128906,479.06930764160154Q365.79255571289065,478.75700764160155,365.1054557128906,478.47760764160154Q364.4183557128906,478.1982076416016,363.7186557128906,477.9523076416016Q363.0189057128906,477.7064076416016,362.3081057128906,477.49460764160153Q361.5973057128906,477.2827076416016,360.8771057128906,477.1054076416016Q360.1569157128906,476.92810764160157,359.42899571289064,476.78570764160156Q358.70108571289063,476.6434076416016,357.96715571289064,476.53640764160156Q357.2332157128906,476.42930764160155,356.4949757128906,476.35780764160154Q355.7567257128906,476.2863076416016,355.0158957128906,476.2505076416016Q354.2750557128906,476.21470764160154,353.5333557128906,476.21470764160154L353.5325367328906,476.21470764160154Q352.1499857128906,476.21470764160154,350.7730257128906,476.33900764160154Q349.44232571289064,476.45900764160154,348.12707571289064,476.69420764160157Q346.81182571289065,476.92930764160155,345.52195571289064,477.2777076416016Q344.23208571289064,477.6262076416016,342.97735571289064,478.08530764160156Q341.72255571289065,478.54440764160154,340.51245571289064,479.11070764160155Q339.3022557128906,479.67700764160156,338.14585571289064,480.3463076416016Q336.9894557128906,481.0155076416016,335.89555571289065,481.78260764160154Q334.8015557128906,482.54980764160155,333.77835571289063,483.40900764160153Q332.75515571289066,484.2682076416016,331.81045571289064,485.21300764160156Q331.8019557128906,485.22150764160153,331.79345571289065,485.23000764160156Q331.67055571289063,485.3531076416016,331.5490557128906,485.47760764160154Q331.54035571289063,485.4865076416016,331.5316557128906,485.49540764160156Q331.01405571289064,486.0266076416016,330.52265571289064,486.58210764160157Q330.03125571289064,487.13770764160154,329.56725571289064,487.7163076416016Q329.10325571289064,488.29500764160156,328.66775571289065,488.89530764160156Q328.23215571289063,489.49570764160154,327.8261557128906,490.11640764160154Q327.42005571289064,490.73700764160156,327.0444557128906,491.37660764160154Q326.66875571289063,492.01610764160154,326.32445571289065,492.67300764160154Q325.9801557128906,493.3300076416016,325.6679557128906,494.0028076416016Q325.3556557128906,494.67550764160154,325.0762557128906,495.3626076416016Q324.79685571289065,496.0497076416016,324.55095571289064,496.7494076416016Q324.30505571289063,497.4491576416016,324.0932557128906,498.15996764160155Q323.88135571289064,498.8707576416016,323.70405571289064,499.59095764160156Q323.52675571289063,500.31114764160156,323.3843557128906,501.03906764160155Q323.24205571289065,501.76697764160156,323.13495571289064,502.50090764160154Q323.0279557128906,503.23484764160156,322.9564557128906,503.9730876416016Q322.88495571289064,504.7113376416016,322.84915571289065,505.4521676416016Q322.8133557128906,506.1930076416016,322.8133557128906,506.93470764160156L322.8133557128906,506.9355266216016Q322.8133557128906,508.3180776416016,322.9376557128906,509.6950376416016Q323.0576557128906,511.02573764160155,323.2928557128906,512.3409876416016Q323.5279557128906,513.6562376416016,323.87635571289064,514.9461076416015Q324.22485571289064,516.2359776416016,324.6839557128906,517.4907076416016Q325.1430557128906,518.7455076416015,325.7093557128906,519.9556076416015Q326.2756557128906,521.1658076416015,326.94495571289065,522.3222076416016Q327.61415571289064,523.4786076416016,328.3812557128906,524.5725076416015Q329.1484557128906,525.6665076416016,330.0076557128906,526.6897076416016Q330.86685571289064,527.7129076416015,331.8116557128906,528.6576076416015L331.8142557128906,528.6602076416016L373.4799557128906,570.3237076416016L331.8116557128906,611.9897076416016Q331.27835571289063,612.5227076416015,330.7718557128906,613.0817076416016Q330.2654557128906,613.6407076416016,329.78695571289063,614.2237076416015Q329.3085557128906,614.8067076416015,328.85935571289065,615.4117076416015Q328.41005571289065,616.0177076416015,327.9910557128906,616.6447076416016Q327.57205571289063,617.2717076416016,327.18435571289064,617.9187076416016Q326.79665571289064,618.5657076416015,326.44115571289063,619.2307076416016Q326.0856557128906,619.8957076416016,325.76315571289064,620.5777076416016Q325.4407557128906,621.2587076416015,325.1520557128906,621.9557076416015Q324.86345571289064,622.6527076416015,324.60935571289065,623.3627076416016Q324.3553557128906,624.0727076416016,324.13635571289063,624.7947076416016Q323.9174557128906,625.5157076416016,323.73415571289064,626.2477076416016Q323.55095571289064,626.9787076416015,323.40375571289064,627.7187076416016Q323.2566557128906,628.4587076416016,323.1459557128906,629.2047076416015Q323.0352557128906,629.9507076416015,322.9613557128906,630.7007076416015Q322.88745571289064,631.4517076416016,322.85035571289063,632.2047076416015Q322.8133557128906,632.9577076416016,322.8133557128906,633.7117076416016L322.8133557128906,633.7127076416016Q322.8133557128906,634.4507076416015,322.84875571289064,635.1877076416015Q322.8827557128906,635.8947076416016,322.94925571289065,636.5997076416015Q323.01585571289064,637.3047076416016,323.1147557128906,638.0057076416016Q323.2136557128906,638.7067076416015,323.34485571289065,639.4017076416015Q323.4759557128906,640.0977076416016,323.6389557128906,640.7867076416015Q323.8019557128906,641.4757076416015,323.99655571289065,642.1567076416015Q324.19115571289063,642.8377076416016,324.4169557128906,643.5087076416016Q324.64265571289064,644.1797076416016,324.89905571289063,644.8387076416016Q325.15555571289065,645.4987076416015,325.44205571289064,646.1467076416016Q325.7286557128906,646.7937076416016,326.04465571289063,647.4277076416015Q326.36075571289064,648.0607076416015,326.70565571289063,648.6787076416016Q327.0505557128906,649.2977076416016,327.42365571289065,649.8987076416015Q327.79665571289064,650.5007076416016,328.19705571289063,651.0847076416015Q328.59735571289065,651.6687076416016,329.02425571289064,652.2337076416015Q329.45105571289065,652.7987076416016,329.9034557128906,653.3427076416016Q330.3558557128906,653.8877076416015,330.83285571289065,654.4107076416016Q331.3098557128906,654.9337076416016,331.81045571289064,655.4347076416016Q332.3436557128906,655.9677076416016,332.9024557128906,656.4747076416015Q333.46125571289065,656.9807076416016,334.0442557128906,657.4587076416016Q334.6271557128906,657.9377076416015,335.2329557128906,658.3867076416016Q335.8386557128906,658.8357076416016,336.46575571289065,659.2547076416015Q337.0927557128906,659.6737076416016,337.7396557128906,660.0617076416015Q338.3864557128906,660.4497076416015,339.0515557128906,660.8047076416016Q339.7166557128906,661.1607076416016,340.3984557128906,661.4827076416016Q341.08015571289064,661.8057076416015,341.77695571289064,662.0937076416016Q342.4736557128906,662.3827076416015,343.1837557128906,662.6367076416016Q343.89382571289065,662.8907076416016,344.6155157128906,663.1097076416015Q345.3371957128906,663.3287076416016,346.0687557128906,663.5117076416016Q346.80030571289063,663.6957076416015,347.5399757128906,663.8427076416016Q348.2796457128906,663.9897076416016,349.0256357128906,664.1007076416015Q349.7716357128906,664.2107076416016,350.5221657128906,664.2847076416016Q351.27269571289065,664.3587076416015,352.02594571289063,664.3957076416016Q352.7791957128906,664.4327076416016,353.5333557128906,664.4327076416016Q354.32820271289063,664.4327076416016,355.1220457128906,664.3917076416016Q355.8255057128906,664.3547076416015,356.5265657128906,664.2867076416015Q357.22762571289064,664.2177076416016,357.92480571289065,664.1177076416016Q358.62198571289065,664.0167076416016,359.3138057128906,663.8837076416016Q360.00563571289064,663.7517076416016,360.6906657128906,663.5877076416016Q361.3756957128906,663.4237076416016,362.0524757128906,663.2277076416016Q362.7292557128906,663.0327076416015,363.39637571289063,662.8067076416016Q364.06345571289063,662.5807076416015,364.7195557128906,662.3237076416016Q365.3755557128906,662.0667076416016,366.0191557128906,661.7807076416016Q366.6627557128906,661.4947076416015,367.2926557128906,661.1787076416016Q367.9224557128906,660.8637076416015,368.5370557128906,660.5197076416016Q369.15175571289063,660.1757076416015,369.7500557128906,659.8037076416016Q370.3483557128906,659.4317076416016,370.9289557128906,659.0327076416015Q371.5094557128906,658.6337076416016,372.07115571289063,658.2087076416016Q372.6328557128906,657.7837076416015,373.17455571289065,657.3337076416016Q373.7161557128906,656.8827076416015,374.2365557128906,656.4087076416015Q374.7569557128906,655.9337076416016,375.2550557128906,655.4357076416015L438.6475557128906,592.0466076416016Q439.18075571289063,591.5134076416016,439.68725571289065,590.9546076416016Q440.19365571289063,590.3959076416015,440.6721557128906,589.8129076416016Q441.15055571289065,589.2300076416016,441.59985571289064,588.6243076416016Q442.0490557128906,588.0186076416015,442.46805571289065,587.3915076416016Q442.88705571289063,586.7645076416015,443.2747557128906,586.1177076416016Q443.6624557128906,585.4708076416016,444.0179557128906,584.8058076416015Q444.3735557128906,584.1407076416016,444.6959557128906,583.4590076416016Q445.0184557128906,582.7773076416015,445.30705571289064,582.0805076416016Q445.5956557128906,581.3838076416016,445.8497557128906,580.6738076416016Q446.10375571289063,579.9637076416016,446.3227557128906,579.2421076416016Q446.54165571289064,578.5204076416015,446.7249557128906,577.7889076416016Q446.9081557128906,577.0573076416016,447.0553557128906,576.3177076416016Q447.20245571289064,575.5781076416016,447.31315571289065,574.8321076416016Q447.4238557128906,574.0861076416015,447.49775571289064,573.3356076416015Q447.5716557128906,572.5851076416016,447.6087557128906,571.8319076416016Q447.6457557128906,571.0787076416016,447.6457557128906,570.3246076416016Q447.6457557128906,569.5704076416016,447.6087557128906,568.8172076416016Q447.5718557128906,568.0640076416016,447.49795571289064,567.3135076416015Q447.4240557128906,566.5630076416015,447.3133557128906,565.8170076416015Q447.2027557128906,565.0710076416016,447.0556557128906,564.3314076416016Q446.90855571289063,563.5917076416016,446.72535571289063,562.8602076416016Q446.54215571289063,562.1286076416015,446.3232557128906,561.4070076416016Q446.10435571289065,560.6853076416015,445.85025571289066,559.9753076416016Q445.59625571289064,559.2652076416016,445.3076557128906,558.5685076416015Q445.01905571289063,557.8717076416016,444.6966557128906,557.1900076416016Q444.37425571289066,556.5082076416015,444.01875571289065,555.8432076416016Q443.6633557128906,555.1781076416015,443.2756557128906,554.5312076416016Q442.88795571289063,553.8844076416016,442.46895571289065,553.2573076416015Q442.05005571289064,552.6303076416016,441.6008557128906,552.0245076416015Q441.1515557128906,551.4188076416016,440.6731557128906,550.8358076416016Q440.19475571289064,550.2528076416015,439.6883557128906,549.6941076416016Q439.1819557128906,549.1353076416016,438.6486557128906,548.6020076416015L375.2577557128906,485.21440764160155Z" fill-rule="evenodd" fill="#2CFFFF" fill-opacity="1"/></g></g></g></svg> \ No newline at end of file diff --git a/imgs/akari.jpg b/assets/img/akari.jpg similarity index 100% rename from imgs/akari.jpg rename to assets/img/akari.jpg diff --git a/imgs/ban.png b/assets/img/ban.png similarity index 100% rename from imgs/ban.png rename to assets/img/ban.png diff --git a/imgs/battery-100.png b/assets/img/battery-100.png similarity index 100% rename from imgs/battery-100.png rename to assets/img/battery-100.png diff --git a/imgs/bilibili.svg b/assets/img/bilibili.svg similarity index 100% rename from imgs/bilibili.svg rename to assets/img/bilibili.svg diff --git a/imgs/blackroom.svg b/assets/img/blackroom.svg similarity index 100% rename from imgs/blackroom.svg rename to assets/img/blackroom.svg diff --git a/imgs/channel.svg b/assets/img/channel.svg similarity index 100% rename from imgs/channel.svg rename to assets/img/channel.svg diff --git a/imgs/class.svg b/assets/img/class.svg similarity index 100% rename from imgs/class.svg rename to assets/img/class.svg diff --git a/imgs/coin.svg b/assets/img/coin.svg similarity index 100% rename from imgs/coin.svg rename to assets/img/coin.svg diff --git a/imgs/collect.svg b/assets/img/collect.svg similarity index 100% rename from imgs/collect.svg rename to assets/img/collect.svg diff --git a/imgs/comment.svg b/assets/img/comment.svg similarity index 100% rename from imgs/comment.svg rename to assets/img/comment.svg diff --git a/imgs/delete.svg b/assets/img/delete.svg similarity index 100% rename from imgs/delete.svg rename to assets/img/delete.svg diff --git a/imgs/download.svg b/assets/img/download.svg similarity index 100% rename from imgs/download.svg rename to assets/img/download.svg diff --git a/imgs/fav.svg b/assets/img/fav.svg similarity index 100% rename from imgs/fav.svg rename to assets/img/fav.svg diff --git a/imgs/follow.svg b/assets/img/follow.svg similarity index 100% rename from imgs/follow.svg rename to assets/img/follow.svg diff --git a/imgs/history.png b/assets/img/history.png similarity index 100% rename from imgs/history.png rename to assets/img/history.png diff --git a/imgs/home.svg b/assets/img/home.svg similarity index 100% rename from imgs/home.svg rename to assets/img/home.svg diff --git a/imgs/like.svg b/assets/img/like.svg similarity index 100% rename from imgs/like.svg rename to assets/img/like.svg diff --git a/imgs/live.svg b/assets/img/live.svg similarity index 100% rename from imgs/live.svg rename to assets/img/live.svg diff --git a/imgs/loadTV.gif b/assets/img/loadTV.gif similarity index 100% rename from imgs/loadTV.gif rename to assets/img/loadTV.gif diff --git a/imgs/logo.png b/assets/img/logo.png similarity index 100% rename from imgs/logo.png rename to assets/img/logo.png diff --git a/assets/img/logo2.jpg b/assets/img/logo2.jpg new file mode 100644 index 0000000..199eefc Binary files /dev/null and b/assets/img/logo2.jpg differ diff --git a/imgs/musicplus.svg b/assets/img/musicplus.svg similarity index 100% rename from imgs/musicplus.svg rename to assets/img/musicplus.svg diff --git a/imgs/ploading.gif b/assets/img/ploading.gif similarity index 100% rename from imgs/ploading.gif rename to assets/img/ploading.gif diff --git a/imgs/ranking.svg b/assets/img/ranking.svg similarity index 100% rename from imgs/ranking.svg rename to assets/img/ranking.svg diff --git a/imgs/read.svg b/assets/img/read.svg similarity index 100% rename from imgs/read.svg rename to assets/img/read.svg diff --git a/imgs/relation.svg b/assets/img/relation.svg similarity index 100% rename from imgs/relation.svg rename to assets/img/relation.svg diff --git a/imgs/share.svg b/assets/img/share.svg similarity index 100% rename from imgs/share.svg rename to assets/img/share.svg diff --git a/imgs/sponsorQR.jpg b/assets/img/sponsorQR.jpg similarity index 100% rename from imgs/sponsorQR.jpg rename to assets/img/sponsorQR.jpg diff --git a/imgs/sub.svg b/assets/img/sub.svg similarity index 100% rename from imgs/sub.svg rename to assets/img/sub.svg diff --git a/imgs/tebietuijian.svg b/assets/img/tebietuijian.svg similarity index 100% rename from imgs/tebietuijian.svg rename to assets/img/tebietuijian.svg diff --git a/imgs/topic.svg b/assets/img/topic.svg similarity index 100% rename from imgs/topic.svg rename to assets/img/topic.svg diff --git a/imgs/toview.png b/assets/img/toview.png similarity index 100% rename from imgs/toview.png rename to assets/img/toview.png diff --git a/imgs/tuiguang.svg b/assets/img/tuiguang.svg similarity index 100% rename from imgs/tuiguang.svg rename to assets/img/tuiguang.svg diff --git a/imgs/video_up.svg b/assets/img/video_up.svg similarity index 100% rename from imgs/video_up.svg rename to assets/img/video_up.svg diff --git a/imgs/zone/ad.svg b/assets/zone_icon/ad.svg similarity index 100% rename from imgs/zone/ad.svg rename to assets/zone_icon/ad.svg diff --git a/imgs/zone/animal.svg b/assets/zone_icon/animal.svg similarity index 100% rename from imgs/zone/animal.svg rename to assets/zone_icon/animal.svg diff --git a/imgs/zone/anime.svg b/assets/zone_icon/anime.svg similarity index 100% rename from imgs/zone/anime.svg rename to assets/zone_icon/anime.svg diff --git a/imgs/zone/car.svg b/assets/zone_icon/car.svg similarity index 100% rename from imgs/zone/car.svg rename to assets/zone_icon/car.svg diff --git a/imgs/zone/cinephile.svg b/assets/zone_icon/cinephile.svg similarity index 100% rename from imgs/zone/cinephile.svg rename to assets/zone_icon/cinephile.svg diff --git a/imgs/zone/comic.svg b/assets/zone_icon/comic.svg similarity index 100% rename from imgs/zone/comic.svg rename to assets/zone_icon/comic.svg diff --git a/imgs/zone/dance.svg b/assets/zone_icon/dance.svg similarity index 100% rename from imgs/zone/dance.svg rename to assets/zone_icon/dance.svg diff --git a/imgs/zone/digital.svg b/assets/zone_icon/digital.svg similarity index 100% rename from imgs/zone/digital.svg rename to assets/zone_icon/digital.svg diff --git a/imgs/zone/documentary.svg b/assets/zone_icon/documentary.svg similarity index 100% rename from imgs/zone/documentary.svg rename to assets/zone_icon/documentary.svg diff --git a/imgs/zone/douga.svg b/assets/zone_icon/douga.svg similarity index 100% rename from imgs/zone/douga.svg rename to assets/zone_icon/douga.svg diff --git a/imgs/zone/ent.svg b/assets/zone_icon/ent.svg similarity index 100% rename from imgs/zone/ent.svg rename to assets/zone_icon/ent.svg diff --git a/imgs/zone/fashion.svg b/assets/zone_icon/fashion.svg similarity index 100% rename from imgs/zone/fashion.svg rename to assets/zone_icon/fashion.svg diff --git a/imgs/zone/food.svg b/assets/zone_icon/food.svg similarity index 100% rename from imgs/zone/food.svg rename to assets/zone_icon/food.svg diff --git a/imgs/zone/game.svg b/assets/zone_icon/game.svg similarity index 100% rename from imgs/zone/game.svg rename to assets/zone_icon/game.svg diff --git a/imgs/zone/guochuang.svg b/assets/zone_icon/guochuang.svg similarity index 100% rename from imgs/zone/guochuang.svg rename to assets/zone_icon/guochuang.svg diff --git a/imgs/zone/information.svg b/assets/zone_icon/information.svg similarity index 100% rename from imgs/zone/information.svg rename to assets/zone_icon/information.svg diff --git a/imgs/zone/kichiku.svg b/assets/zone_icon/kichiku.svg similarity index 100% rename from imgs/zone/kichiku.svg rename to assets/zone_icon/kichiku.svg diff --git a/imgs/zone/knowledge.svg b/assets/zone_icon/knowledge.svg similarity index 100% rename from imgs/zone/knowledge.svg rename to assets/zone_icon/knowledge.svg diff --git a/imgs/zone/life.svg b/assets/zone_icon/life.svg similarity index 100% rename from imgs/zone/life.svg rename to assets/zone_icon/life.svg diff --git a/imgs/zone/movie.svg b/assets/zone_icon/movie.svg similarity index 100% rename from imgs/zone/movie.svg rename to assets/zone_icon/movie.svg diff --git a/imgs/zone/music.svg b/assets/zone_icon/music.svg similarity index 100% rename from imgs/zone/music.svg rename to assets/zone_icon/music.svg diff --git a/imgs/zone/sports.svg b/assets/zone_icon/sports.svg similarity index 100% rename from imgs/zone/sports.svg rename to assets/zone_icon/sports.svg diff --git a/imgs/zone/tech.svg b/assets/zone_icon/tech.svg similarity index 100% rename from imgs/zone/tech.svg rename to assets/zone_icon/tech.svg diff --git a/imgs/zone/teleplay.svg b/assets/zone_icon/teleplay.svg similarity index 100% rename from imgs/zone/teleplay.svg rename to assets/zone_icon/teleplay.svg diff --git a/assets/zone_v2_icon/ai.svg b/assets/zone_v2_icon/ai.svg new file mode 100644 index 0000000..797fd6f --- /dev/null +++ b/assets/zone_v2_icon/ai.svg @@ -0,0 +1,17 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M6.11152 13.3818L12.7385 13.3818L14.074 16.2091L4.77077 16.2091L6.11152 13.3818z" + fill="#00B9E7ff"></path> + <path + d="M7.51228 5.77233C7.6183 5.49296 7.88599 5.30823 8.18479 5.30823L10.302 5.30823C10.5325 5.30823 10.6918 5.53896 10.61 5.75451L5.38035 19.5351C5.27433 19.8144 5.00664 19.9992 4.70783 19.9992L3.15565 19.9992C2.65222 19.9992 2.30452 19.4953 2.48314 19.0247L7.51228 5.77233z" + fill="#00B9E7ff"></path> + <path + d="M17.7595 5.24761C17.3688 5.24499 17.0508 5.5496 17.0515 5.92584L17.0642 19.3231C17.0648 19.6966 17.3794 19.9991 17.7673 19.9991L19.4532 19.9991C19.8415 19.9991 20.1563 19.6959 20.1563 19.322L20.1563 5.93605C20.1563 5.56393 19.8444 5.26155 19.458 5.25897L17.7595 5.24761z" + fill="#59E0F9ff"></path> + <path + d="M11.4125 5.77007C11.3065 5.4907 11.0388 5.30597 10.74 5.30597L8.14548 5.30597L13.5445 19.5328C13.6505 19.8122 13.9182 19.9969 14.217 19.9969L15.7691 19.9969C16.2726 19.9969 16.6203 19.4931 16.4417 19.0224L11.4125 5.77007z" + fill="#59E0F9ff"></path> + <path + d="M21.8385 2.26096C21.9179 2.10202 22.1446 2.10202 22.224 2.26096L22.3536 2.52039C22.6034 3.02047 22.9711 3.45233 23.4249 3.77874L23.663 3.95005C23.7826 4.03605 23.7826 4.21395 23.663 4.29994L23.4249 4.47126C22.9711 4.79767 22.6034 5.22952 22.3536 5.72961L22.224 5.98904C22.1446 6.14798 21.9179 6.14798 21.8385 5.98904L21.7089 5.72961C21.4591 5.22952 21.0914 4.79767 20.6376 4.47126L20.3995 4.29994C20.2799 4.21395 20.2799 4.03605 20.3995 3.95005L20.6376 3.77874C21.0914 3.45233 21.4591 3.02047 21.7089 2.52039L21.8385 2.26096z" + fill="#FDDE80ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/animal.svg b/assets/zone_v2_icon/animal.svg new file mode 100644 index 0000000..74cb01e --- /dev/null +++ b/assets/zone_v2_icon/animal.svg @@ -0,0 +1,11 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M14.36582 3.67143C15.80352 3.65373 17.00323 4.92678 17.39434 6.70047C17.46086 7.00223 17.7719 7.19548 18.07651 7.14389C18.6671 7.04388 19.24147 7.11564 19.73645 7.38712C21.21533 8.19796 21.42538 10.48176 20.20589 12.48835C19.88563 13.02058 19.48099 13.49606 19.00848 13.89667C18.84211 14.0377 18.77798 14.26694 18.84067 14.47584C18.95462 14.85523 19.01606 15.25757 19.01606 15.67392L19.01606 16.1641C19.01606 17.26858 18.57734 18.32774 17.79638 19.1087C17.01542 19.88966 15.95626 20.32838 14.85178 20.32838L9.29912 20.32838C8.19468 20.32838 7.1355 19.88966 6.35456 19.1087C5.57361 18.32774 5.13488 17.26858 5.13488 16.1641L5.13488 15.67392C5.13488 15.25699 5.19634 14.85485 5.31033 14.47517C5.37301 14.26637 5.3088 14.03712 5.14245 13.89619C4.66991 13.49578 4.26526 13.02038 3.94509 12.48835C2.72556 10.48176 2.93556 8.19796 4.41446 7.38712C4.90967 7.11554 5.48421 7.04383 6.07527 7.14374C6.37981 7.19522 6.69059 7.0019 6.75702 6.70026C7.14757 4.92688 8.34733 3.65373 9.78518 3.67143C10.47494 3.68023 11.11843 3.98481 11.64941 4.49674C11.88154 4.72055 12.26957 4.72063 12.5017 4.49685C13.03267 3.98511 13.67597 3.68023 14.36582 3.67143z" + fill="#FF5C7Aff"></path> + <path + d="M11.7289 7.80475C11.84861 8.98123 11.20435 9.99031 10.28861 10.05924C9.3728 10.12819 8.53423 9.22949 8.41399 8.05301C8.29375 6.87653 8.93848 5.86693 9.85373 5.79852C10.76957 5.72959 11.60861 6.62827 11.7289 7.80475zM15.7225 8.05301C15.60221 9.23001 14.76317 10.12762 13.8479 10.05924C12.93264 9.99083 12.28733 8.98071 12.40762 7.80423C12.52781 6.62775 13.36694 5.72959 14.28269 5.79852C15.19795 5.86693 15.84269 6.87653 15.7225 8.05301zM18.16906 11.42227C17.58182 12.4055 16.52822 12.8807 15.8161 12.48317C15.10349 12.08573 15.0024 10.96675 15.59011 9.98358C16.17734 9.00041 17.23104 8.52516 17.94365 8.92267C18.65578 9.32019 18.75677 10.43914 18.16906 11.42227zM8.55615 9.98358C9.14388 10.96675 9.04281 12.08573 8.33018 12.48317C7.61808 12.8807 6.56443 12.4055 5.97671 11.42227C5.38951 10.43914 5.49057 9.32019 6.20319 8.92267C6.9153 8.52516 7.96895 9.00041 8.55615 9.98358z" + fill="#FFCFE6ff"></path> + <path + d="M12.17328 11.43072C12.72787 11.43072 13.26845 11.60534 13.71821 11.92982C13.89734 12.05904 14.06899 12.21734 14.21914 12.39619C14.67053 12.9337 15.25728 13.46515 15.83606 13.8623C16.0105 13.98192 16.16976 14.12496 16.30896 14.28874C16.70842 14.75875 16.91242 15.36394 16.8791 15.97978C16.84579 16.59562 16.57757 17.17526 16.12973 17.5993C15.68189 18.02342 15.08851 18.25968 14.47181 18.25949L9.67882 18.25949C9.06126 18.26083 8.46676 18.02506 8.018 17.60074C7.56923 17.17651 7.30045 16.59619 7.26714 15.97949C7.23383 15.36288 7.43852 14.75693 7.83897 14.28682C7.97802 14.12352 8.137 13.98096 8.31101 13.86173C8.89154 13.46381 9.5054 12.94397 9.94973 12.39821C10.10381 12.20899 10.27306 12.04474 10.43242 11.92982C10.88218 11.60534 11.42275 11.43072 11.97734 11.43072L12.17328 11.43072z" + fill="#FFCFE6ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/car.svg b/assets/zone_v2_icon/car.svg new file mode 100644 index 0000000..9dd5705 --- /dev/null +++ b/assets/zone_v2_icon/car.svg @@ -0,0 +1,23 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M21.24202 9.24032C21.31075 9.46754 21.28675 9.71272 21.1753 9.92231C21.06374 10.13194 20.87386 10.2888 20.64701 10.35888L20.0521 10.53139C19.93997 10.56576 19.82218 10.57776 19.70544 10.56653C19.5887 10.55539 19.47533 10.52141 19.37174 10.4664C19.26816 10.41149 19.17638 10.33661 19.1017 10.24618C19.02701 10.15574 18.97094 10.05152 18.93658 9.9394C18.90221 9.82728 18.89021 9.70949 18.90134 9.59275C18.91248 9.47601 18.94656 9.36261 19.00147 9.25902C19.05648 9.15543 19.13126 9.06369 19.2217 8.98902C19.31213 8.91435 19.41638 8.85823 19.52851 8.82385L20.12352 8.65131C20.23555 8.61552 20.35363 8.6024 20.47085 8.61272C20.58806 8.62304 20.70211 8.65659 20.80618 8.71141C20.91034 8.76624 21.0025 8.84124 21.07728 8.93204C21.15206 9.02286 21.20813 9.12765 21.24202 9.24032zM5.17807 9.93642C5.10935 10.16285 4.95356 10.35264 4.74493 10.46419C4.53631 10.57574 4.29192 10.59994 4.06548 10.53139L3.47052 10.35888C3.2437 10.2888 3.0538 10.13194 2.94231 9.92231C2.83084 9.71272 2.80684 9.46754 2.87556 9.24032C2.9089 9.12779 2.96424 9.02298 3.03839 8.932C3.11254 8.84102 3.20402 8.76568 3.30752 8.71033C3.41101 8.65499 3.52448 8.62074 3.64131 8.60959C3.75815 8.59843 3.87604 8.6106 3.98814 8.64536L4.5831 8.8179C4.69586 8.85188 4.80079 8.90785 4.89181 8.98257C4.98284 9.05729 5.05818 9.1493 5.11349 9.25328C5.16879 9.35725 5.20298 9.47115 5.21406 9.58839C5.22515 9.70564 5.21291 9.82393 5.17807 9.93642z" + fill="#00B9E7ff"></path> + <path + d="M6.97476 4.78406C8.65316 4.44467 10.36118 4.27327 12.07354 4.27239C13.82131 4.27461 15.56477 4.44596 17.27952 4.78406C17.47834 4.82236 17.6641 4.91076 17.81923 5.04089C17.97437 5.17104 18.0937 5.33861 18.16598 5.52776L20.34038 11.24707C20.38176 11.35603 20.40307 11.47171 20.40307 11.58826L20.40307 16.76659C20.40307 16.92442 20.34038 17.07571 20.22874 17.18726C20.11718 17.29882 19.96589 17.3615 19.80806 17.3615L4.33908 17.3615C4.18129 17.3615 4.02996 17.29882 3.91837 17.18726C3.8068 17.07571 3.74412 16.92442 3.74412 16.76659L3.74412 11.59834C3.74412 11.47526 3.76781 11.35325 3.8139 11.23901L6.12396 5.51586C6.19464 5.33331 6.30926 5.17102 6.45767 5.04336C6.60609 4.91571 6.7837 4.82665 6.97476 4.78406z" + fill="#00B9E7ff"></path> + <path + d="M5.529 12.00691L7.90884 12.00691C8.30549 12.00691 8.5038 12.20515 8.5038 12.60182L8.5038 13.19683C8.5038 13.59341 8.30549 13.79174 7.90884 13.79174L5.529 13.79174C5.13236 13.79174 4.93404 13.59341 4.93404 13.19683L4.93404 12.60182C4.93404 12.20515 5.13236 12.00691 5.529 12.00691z" + fill="#FDDE80ff"></path> + <path + d="M16.2383 12.00691L18.61814 12.00691C19.01482 12.00691 19.21315 12.20515 19.21315 12.60182L19.21315 13.19683C19.21315 13.59341 19.01482 13.79174 18.61814 13.79174L16.2383 13.79174C15.84173 13.79174 15.64339 13.59341 15.64339 13.19683L15.64339 12.60182C15.64339 12.20515 15.84173 12.00691 16.2383 12.00691z" + fill="#FDDE80ff"></path> + <path + d="M7.79001 6.40233C9.11029 6.17235 10.44797 6.05689 11.78813 6.05724C13.31962 6.07062 14.84832 6.1899 16.36339 6.41422C16.47677 6.43024 16.58304 6.47862 16.66954 6.55355C16.75613 6.62846 16.8192 6.72677 16.85126 6.83665L17.77344 9.96614C17.79533 10.04115 17.80224 10.11974 17.7937 10.19741C17.78525 10.27507 17.76154 10.35034 17.724 10.41878C17.68637 10.48733 17.63568 10.54771 17.57482 10.59667C17.51386 10.64554 17.44387 10.68202 17.3689 10.7039C17.29622 10.7185 17.22144 10.7185 17.14877 10.7039C15.20918 10.51747 13.42426 10.42426 11.79408 10.42426C10.20394 10.4255 8.61508 10.51286 7.0344 10.68605C6.95666 10.6943 6.87804 10.6871 6.80307 10.66502C6.72808 10.64285 6.6582 10.60608 6.59743 10.55693C6.53665 10.50778 6.48615 10.4471 6.44884 10.37837C6.41152 10.30963 6.38811 10.23427 6.37995 10.15651C6.36471 10.07993 6.36471 10.00109 6.37995 9.9245L7.31404 6.81879C7.3462 6.71165 7.40791 6.61574 7.4921 6.54207C7.57629 6.46841 7.67954 6.41997 7.79001 6.40233z" + fill="#59E1F9ff"></path> + <path + d="M3.74414 15.65299C3.74414 14.85763 4.38885 14.21299 5.18414 14.21299L5.28938 14.21299C6.08466 14.21299 6.72938 14.85763 6.72938 15.65299L6.72938 17.70653C6.72938 18.50189 6.08466 19.14653 5.28938 19.14653L5.18414 19.14653C4.38885 19.14653 3.74414 18.50189 3.74414 17.70653L3.74414 15.65299z" + fill="#00B9E7ff"></path> + <path + d="M17.42822 15.65299C17.42822 14.85763 18.07296 14.21299 18.86822 14.21299L18.97344 14.21299C19.7688 14.21299 20.41344 14.85763 20.41344 15.65299L20.41344 17.70653C20.41344 18.50189 19.7688 19.14653 18.97344 19.14653L18.86822 19.14653C18.07296 19.14653 17.42822 18.50189 17.42822 17.70653L17.42822 15.65299z" + fill="#00B9E7ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/cinephile.svg b/assets/zone_v2_icon/cinephile.svg new file mode 100644 index 0000000..de746dc --- /dev/null +++ b/assets/zone_v2_icon/cinephile.svg @@ -0,0 +1,32 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M5.16093 18.89558L18.83645 18.89558C19.63171 18.89558 20.27645 18.25085 20.27645 17.45558L20.27645 6.34031C20.27645 5.54503 19.63171 4.90031 18.83645 4.90031L5.16094 4.90031C4.36565 4.90031 3.72094 5.54503 3.72094 6.34031L3.72094 17.45558C3.72094 18.25085 4.36565 18.89558 5.16093 18.89558z" + fill="#9796EDff"></path> + <path + d="M5.49187 7.15125C5.49187 7.54889 5.81423 7.87125 6.21187 7.87125L7.53881 7.87125C7.93645 7.87125 8.25881 7.54889 8.25881 7.15125C8.25881 6.75361 7.93645 6.43125 7.53881 6.43125L6.21187 6.43125C5.81423 6.43125 5.49187 6.75361 5.49187 7.15125z" + fill="#6D69E4ff"></path> + <path + d="M10.6897 7.15125C10.6897 7.54889 11.01206 7.87125 11.4097 7.87125L12.73661 7.87125C13.13424 7.87125 13.45661 7.54889 13.45661 7.15125C13.45661 6.75361 13.13424 6.43125 12.73661 6.43125L11.4097 6.43125C11.01206 6.43125 10.6897 6.75361 10.6897 7.15125z" + fill="#6D69E4ff"></path> + <path + d="M15.88733 7.15125C15.88733 7.54889 16.2097 7.87125 16.60733 7.87125L17.93424 7.87125C18.33187 7.87125 18.65424 7.54889 18.65424 7.15125C18.65424 6.75361 18.33187 6.43125 17.93424 6.43125L16.60733 6.43125C16.2097 6.43125 15.88733 6.75361 15.88733 7.15125z" + fill="#6D69E4ff"></path> + <path + d="M5.49187 17.14742C5.49187 17.54515 5.81423 17.86742 6.21187 17.86742L7.53881 17.86742C7.93645 17.86742 8.25881 17.54515 8.25881 17.14742C8.25881 16.74979 7.93645 16.42742 7.53881 16.42742L6.21187 16.42742C5.81423 16.42742 5.49187 16.74979 5.49187 17.14742z" + fill="#6D69E4ff"></path> + <path + d="M10.6897 17.14742C10.6897 17.54515 11.01206 17.86742 11.4097 17.86742L12.73661 17.86742C13.13424 17.86742 13.45661 17.54515 13.45661 17.14742C13.45661 16.74979 13.13424 16.42742 12.73661 16.42742L11.4097 16.42742C11.01206 16.42742 10.6897 16.74979 10.6897 17.14742z" + fill="#6D69E4ff"></path> + <path + d="M15.88733 17.14742C15.88733 17.54515 16.2097 17.86742 16.60733 17.86742L17.93424 17.86742C18.33187 17.86742 18.65424 17.54515 18.65424 17.14742C18.65424 16.74979 18.33187 16.42742 17.93424 16.42742L16.60733 16.42742C16.2097 16.42742 15.88733 16.74979 15.88733 17.14742z" + fill="#6D69E4ff"></path> + <path + d="M3.72094 14.9591L20.27645 14.9591L20.27645 8.83594L3.72094 8.83594L3.72094 14.9591z" + fill="#6D69E4ff"></path> + <path + d="M9.8783 12.948C9.91536 12.84787 9.93389 12.79776 9.95213 12.77434C10.02883 12.67565 10.17802 12.67565 10.25482 12.77434C10.27296 12.79776 10.29149 12.84787 10.32854 12.948C10.53485 13.50557 10.97443 13.94515 11.532 14.15146C11.63222 14.18851 11.68224 14.20704 11.70566 14.22528C11.80435 14.30198 11.80435 14.45117 11.70566 14.52787C11.68224 14.54611 11.63222 14.56464 11.532 14.6017C10.97443 14.808 10.53485 15.24758 10.32854 15.80515C10.29149 15.90528 10.27296 15.95539 10.25482 15.97882C10.17802 16.0775 10.02883 16.0775 9.95213 15.97882C9.93389 15.95539 9.91536 15.90528 9.8783 15.80515C9.672 15.24758 9.23242 14.808 8.67487 14.6017C8.5747 14.56464 8.52462 14.54611 8.50123 14.52787C8.40254 14.45117 8.40254 14.30198 8.50123 14.22528C8.52462 14.20704 8.5747 14.18851 8.67487 14.15146C9.23242 13.94515 9.672 13.50557 9.8783 12.948z" + fill="#FDDE80ff"></path> + <path + d="M13.42128 6.99748C13.50605 6.76846 13.54838 6.65394 13.58995 6.60048C13.76544 6.37484 14.10653 6.37484 14.28202 6.60048C14.32358 6.65394 14.36592 6.76846 14.45069 6.99748C14.92234 8.27225 15.92746 9.27733 17.20224 9.74909C17.4313 9.83376 17.54573 9.87619 17.5992 9.91776C17.8249 10.09325 17.8249 10.43424 17.5992 10.60973C17.54573 10.6513 17.4313 10.69373 17.20224 10.7785C15.92746 11.25014 14.92234 12.25526 14.45069 13.53005C14.36592 13.75901 14.32358 13.87354 14.28202 13.92701C14.10653 14.1527 13.76544 14.1527 13.58995 13.92701C13.54838 13.87354 13.50605 13.75901 13.42128 13.53005C12.94954 12.25526 11.94451 11.25014 10.66973 10.7785C10.44067 10.69373 10.32614 10.6513 10.27267 10.60973C10.04707 10.43424 10.04707 10.09325 10.27267 9.91776C10.32614 9.87619 10.44067 9.83376 10.66973 9.74909C11.94451 9.27733 12.94954 8.27225 13.42128 6.99748z" + fill="#FDDE80ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/dance.svg b/assets/zone_v2_icon/dance.svg new file mode 100644 index 0000000..1082252 --- /dev/null +++ b/assets/zone_v2_icon/dance.svg @@ -0,0 +1,23 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M22.45853 11.58826C22.62758 11.94816 22.47293 12.37699 22.11302 12.54614L11.7097 17.43446C11.34979 17.60362 10.92096 17.44896 10.7519 17.08906C10.58275 16.72915 10.73741 16.30032 11.09731 16.13117L21.50064 11.24285C21.86054 11.0737 22.28938 11.22845 22.45853 11.58826z" + fill="#FFCFE6ff"></path> + <path + d="M17.59709 7.57625C17.94307 7.77225 18.06461 8.21161 17.86867 8.55759L12.62534 17.81386C12.42941 18.15984 11.99002 18.28138 11.64403 18.08544C11.29805 17.88941 11.17642 17.45002 11.37245 17.10403L16.61568 7.84786C16.81171 7.50186 17.2511 7.38026 17.59709 7.57625z" + fill="#FFCFE6ff"></path> + <path + d="M12.16022 6.47833C12.55786 6.47833 12.88022 6.80069 12.88022 7.19833L12.88022 17.40806C12.88022 17.8057 12.55786 18.12806 12.16022 18.12806C11.76259 18.12806 11.44022 17.8057 11.44022 17.40806L11.44022 7.19833C11.44022 6.80069 11.76259 6.47833 12.16022 6.47833z" + fill="#FFCFE6ff"></path> + <path + d="M6.70345 8.53544C7.03465 8.31539 7.48154 8.40548 7.7016 8.73668L13.0248 16.74845C13.24493 17.07965 13.15478 17.52653 12.82358 17.74656C12.49238 17.96669 12.0455 17.87654 11.82547 17.54534L6.5022 9.53359C6.28214 9.20239 6.37225 8.7555 6.70345 8.53544z" + fill="#FFCFE6ff"></path> + <path + d="M9.66182 17.5007C9.57036 17.28797 9.68467 17.0519 9.89453 16.95398L12.09898 15.92611L14.30141 16.95312C14.51126 17.05094 14.6256 17.28691 14.5343 17.49955C14.1288 18.44381 13.1905 19.10515 12.09782 19.10515C11.00554 19.10515 10.06752 18.44429 9.66182 17.5007z" + fill="#FFCFE6ff"></path> + <path + d="M7.16267 14.97974C7.7695 12.8303 9.75514 11.23526 12.09878 11.23526C14.44253 11.23526 16.4183 12.81062 17.02512 14.96026L22.13731 12.53549C22.50115 12.36288 22.67424 11.93654 22.5119 11.568C22.49309 11.52528 22.47504 11.48554 22.45862 11.45078C20.62118 7.57511 16.67299 4.89487 12.09878 4.89487C7.45255 4.89487 3.4522 7.66017 1.65375 11.63472L1.65375 11.63472C1.49874 11.97734 1.64364 12.38957 1.98407 12.54922C3.48774 13.25472 7.16267 14.97974 7.16267 14.97974z" + fill="#FF5C7Aff"></path> + <path + d="M1.65842 11.60611C1.82741 11.24611 2.2562 11.09126 2.61615 11.26032L12.85507 16.06723C13.21507 16.23619 13.36982 16.66502 13.20086 17.02493C13.0319 17.38493 12.60307 17.53968 12.24317 17.37072L2.00419 12.56381C1.64424 12.39485 1.48943 11.96602 1.65842 11.60611z" + fill="#FFCFE6ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/douga.svg b/assets/zone_v2_icon/douga.svg new file mode 100644 index 0000000..00a4f8c --- /dev/null +++ b/assets/zone_v2_icon/douga.svg @@ -0,0 +1,26 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M5.67687 4.05598L5.67687 4.05598C4.8817 4.05598 4.23687 4.70064 4.23687 5.49582L4.23687 11.94893L8.11451 15.3912L12.12979 11.94893L12.12979 4.05598L5.67687 4.05598z" + fill="#6D69E4ff"></path> + <path + d="M15.57206 15.82656L12.12979 19.72838L5.67687 19.72838C4.88158 19.72838 4.23687 19.08365 4.23687 18.28838L4.23687 11.94893L6.74114 11.94893C6.63916 12.15446 6.58075 12.38554 6.58075 12.63053C6.58075 13.47792 7.26776 14.16461 8.11482 14.16461C8.96189 14.16461 9.64886 13.47792 9.64886 12.63053C9.64886 12.38554 9.59049 12.15446 9.48819 11.94893L12.12979 11.94893L15.57206 15.82656z" + fill="#9796EDff"></path> + <path + d="M16.00752 8.16033L12.12989 11.63318L12.12989 14.24419C12.33542 14.14195 12.56659 14.08349 12.81158 14.08349C13.65898 14.08349 14.34566 14.77046 14.34566 15.61757C14.34566 16.46467 13.65898 17.15165 12.81158 17.15165C12.56659 17.15165 12.33542 17.09357 12.12989 16.99094L12.12989 19.72838L18.46934 19.72838C19.26461 19.72838 19.90934 19.08365 19.90934 18.28838L19.90934 11.63318L16.00752 8.16033z" + fill="#6D69E4ff"></path> + <path + d="M18.46934 4.05598C19.26461 4.05598 19.90934 4.70069 19.90934 5.49598L19.90934 11.94893L17.38723 11.94893C17.48947 11.74339 17.54755 11.51222 17.54755 11.26694C17.54755 10.41984 16.86086 9.73286 16.01357 9.73286C15.16646 9.73286 14.47949 10.41984 14.47949 11.26694C14.47949 11.51222 14.53786 11.74339 14.64019 11.94893L12.12989 11.94893L12.12989 9.3073C11.92435 9.40959 11.69328 9.46768 11.44829 9.46768C10.6009 9.46768 9.91392 8.781 9.91392 7.93361C9.91392 7.08655 10.6009 6.39986 11.44829 6.39986C11.69328 6.39986 11.92435 6.45795 12.12989 6.56025L12.12989 4.05598L18.46934 4.05598z" + fill="#9796EDff"></path> + <path + d="M12.12979 9.04368L10.4809 8.09169C9.47782 7.51265 8.65694 7.98655 8.65694 9.14492L8.65694 14.57338C8.65694 14.69107 8.66543 14.80176 8.68171 14.90496L12.12979 11.94893L12.12979 9.04368z" + fill="#FDDE80ff"></path> + <path + d="M13.72944 13.75075L10.4809 15.6263C9.47782 16.20557 8.65694 15.73171 8.65694 14.57338L8.65694 14.06611C9.23658 13.84704 9.64886 13.28707 9.64886 12.63053C9.64886 12.38554 9.59049 12.15446 9.48819 11.94893L12.12979 11.94893L13.72944 13.75075z" + fill="#FDDE80ff"></path> + <path + d="M13.88794 10.05869L15.1823 10.80595C16.18531 11.38522 16.18531 12.33302 15.1823 12.9121L13.10477 14.11152C13.00982 14.09309 12.91181 14.08349 12.81158 14.08349C12.56659 14.08349 12.33542 14.14195 12.12989 14.24419L12.12989 11.63318L13.88794 10.05869z" + fill="#FDDE80ff"></path> + <path + d="M8.65694 9.14491C8.65694 7.98655 9.47781 7.51266 10.4808 8.09169L15.18221 10.80586C16.18522 11.38522 16.18522 12.33302 15.18221 12.9121L10.4808 15.6263C9.47781 16.20557 8.65694 15.73171 8.65694 14.57338L8.65694 9.14491z" + fill="#FDDE80ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/emotion.svg b/assets/zone_v2_icon/emotion.svg new file mode 100644 index 0000000..8ed2de6 --- /dev/null +++ b/assets/zone_v2_icon/emotion.svg @@ -0,0 +1,8 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M11.64326 6.75353C8.80572 2.45969 3.05423 4.99012 3.47601 9.85922C3.84148 14.0784 8.01705 17.41958 10.97002 19.14355C11.38675 19.38691 11.89891 19.38691 12.31574 19.14355C15.26842 17.41958 19.44403 14.0783 19.8095 9.85922C20.23123 4.99012 14.48035 2.45969 11.64326 6.75353z" + fill="#FF5C7Aff"></path> + <path + d="M16.95014 12.98275C16.39747 10.17744 12.90787 10.2649 12.09763 12.85632C11.43677 14.97024 12.67536 17.39645 13.7856 18.93235C14.06842 19.32355 14.54659 19.51978 15.02266 19.44C16.89158 19.12675 19.47754 18.27005 20.49216 16.30128C21.73584 13.88774 19.31395 11.37437 16.95014 12.98275z" + fill="#FFCFE6ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/entertainment.svg b/assets/zone_v2_icon/entertainment.svg new file mode 100644 index 0000000..b69d02f --- /dev/null +++ b/assets/zone_v2_icon/entertainment.svg @@ -0,0 +1,20 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M5.92972 20.481C5.34469 21.0726 4.39035 21.075 3.80205 20.4867L3.42324 20.1078C2.83711 19.5217 2.83752 18.5713 3.42416 17.9856L12.0134 9.41117C12.372 9.05293 12.9589 9.05293 13.3175 9.41117L14.4768 10.5692C14.8355 10.9275 14.8355 11.5132 14.4768 11.8714C12.0808 14.2648 7.88596 18.5029 5.92972 20.481z" + fill="#FF5C7Aff"></path> + <path + d="M8.72852 12.693L12.0139 9.41126C12.3725 9.05302 12.9593 9.05302 13.318 9.41126L14.4773 10.5693C14.836 10.9276 14.836 11.5137 14.4773 11.872L11.1758 15.1698L8.72852 12.693z" + fill="#FC6376ff"></path> + <path + d="M16.2118 14.531C16.5704 14.8893 16.971 14.782 17.1024 14.2925L19.5843 5.04082C19.7152 4.55181 19.422 4.25849 18.932 4.38973L9.67009 6.86887C9.18053 6.99964 9.07312 7.40025 9.43176 7.75849L16.2118 14.531z" + fill="#FDDE80ff"></path> + <path + d="M20.7561 9.99241C21.1147 10.3507 21.0073 10.7508 20.5173 10.882L11.2554 13.3612C10.7658 13.4919 10.4722 13.1991 10.6036 12.7096L13.0855 3.45795C13.2164 2.96893 13.6174 2.86165 13.9761 3.21989L20.7561 9.99241z" + fill="#FDDE80ff"></path> + <path + d="M6.6992 14.7177L9.17585 17.167L8.47269 17.878L5.99603 15.4287L6.6992 14.7177z" + fill="#FFCFE6ff"></path> + <path + d="M8.67909 12.7448L11.1456 15.2003L10.44 15.909L7.97356 13.4535L8.67909 12.7448z" + fill="#FFCFE6ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/fashion.svg b/assets/zone_v2_icon/fashion.svg new file mode 100644 index 0000000..5572bef --- /dev/null +++ b/assets/zone_v2_icon/fashion.svg @@ -0,0 +1,14 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M16.0695 2.7305C12.7258 3.85612 10.9074 4.09695 8.30573 2.7305L12.1298 8.01044L16.0695 2.7305z" + fill="#FFCFE6ff"></path> + <path + d="M8.37409 10.243C6.22673 12.7549 5.26956 15.1018 4.17298 18.4108C4.09425 18.6483 4.10943 18.9135 4.27234 19.1035C6.38097 21.5625 16.2982 21.696 19.208 19.118C19.4281 18.923 19.4887 18.6141 19.4071 18.3315C18.4274 14.9392 16.8594 12.462 14.8639 10.243L8.37409 10.243z" + fill="#FF5C7Aff"></path> + <path + d="M6.71505 2.5833C7.21559 2.4809 7.56291 2.47743 8.05183 2.52926C8.29103 2.55462 8.50926 2.67534 8.66566 2.85809L11.0339 5.6253C11.3497 5.99425 11.9202 5.99425 12.236 5.6253L14.5849 2.88068C14.7528 2.68446 14.9917 2.56125 15.2493 2.54369C15.689 2.51373 16.0305 2.51088 16.555 2.59268C17.7675 2.77617 18.4473 4.98552 18.4928 6.49521C18.5014 6.77775 18.3517 7.04445 18.089 7.1489C17.3664 7.43628 16.3941 7.44278 15.6755 7.33024L14.8472 10.6895C12.29 11.0952 10.8825 11.103 8.42274 10.6895L7.60432 7.36766C6.85494 7.52539 5.78994 7.47444 5.07016 7.13883C4.84587 7.03425 4.71412 6.80481 4.71142 6.55735C4.69584 5.13103 5.45156 3.01836 6.71505 2.5833z" + fill="#FF5C7Aff"></path> + <path + d="M8.19688 9.85347C9.66073 10.5601 13.5345 10.7668 15.1159 9.75003L15.6793 11.2107C12.9174 12.2073 9.85241 12.1155 7.65021 11.2107L8.19688 9.85347z" + fill="#FFCFE6ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/food.svg b/assets/zone_v2_icon/food.svg new file mode 100644 index 0000000..b9ada08 --- /dev/null +++ b/assets/zone_v2_icon/food.svg @@ -0,0 +1,23 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M3.18094 10.5647C3.18094 11.01408 3.35942 11.44493 3.67714 11.76269C3.99484 12.08035 4.42574 12.25882 4.87505 12.25882C5.32436 12.25882 5.75527 12.08035 6.07298 11.76269C6.39068 11.44493 6.56917 11.01408 6.56917 10.5647C6.56917 10.11542 6.39068 9.68453 6.07298 9.36682C5.75527 9.04911 5.32436 8.87062 4.87505 8.87062C4.42574 8.87062 3.99484 9.04911 3.67714 9.36682C3.35942 9.68453 3.18094 10.11542 3.18094 10.5647z" + fill="#FB813Aff"></path> + <path + d="M5.69523 9.30581C5.69518 9.60927 5.76987 9.90977 5.91502 10.19011C6.06016 10.47053 6.27294 10.72531 6.54118 10.93987C6.80942 11.15443 7.12788 11.32474 7.47837 11.4408C7.82887 11.55696 8.20452 11.61677 8.5839 11.61677C8.96327 11.61677 9.33893 11.55696 9.68938 11.4408C10.03987 11.32474 10.3584 11.15443 10.62662 10.93987C10.89485 10.72531 11.10758 10.47053 11.25274 10.19011C11.39789 9.90977 11.47258 9.60927 11.47258 9.30581C11.47258 9.00234 11.39789 8.70184 11.25274 8.42147C11.10758 8.1411 10.89485 7.88634 10.62662 7.67174C10.3584 7.45715 10.03987 7.28693 9.68938 7.17079C9.33893 7.05465 8.96327 6.99487 8.5839 6.99487C8.20452 6.99487 7.82887 7.05465 7.47837 7.17079C7.12788 7.28693 6.80942 7.45715 6.54118 7.67174C6.27294 7.88634 6.06016 8.1411 5.91502 8.42147C5.76987 8.70184 5.69518 9.00234 5.69523 9.30581z" + fill="#FB813Aff"></path> + <path + d="M14.90909 11.21645C14.90899 11.59296 14.9832 11.96582 15.1272 12.31373C15.2713 12.66163 15.4825 12.97766 15.7487 13.24397C16.01501 13.51018 16.33104 13.72147 16.67894 13.86557C17.02675 14.00966 17.39962 14.08378 17.77622 14.08378C18.15274 14.08378 18.5256 14.00966 18.87341 13.86557C19.22131 13.72147 19.53744 13.51018 19.80365 13.24397C20.06986 12.97766 20.28106 12.66163 20.42515 12.31373C20.56925 11.96582 20.64336 11.59296 20.64326 11.21645C20.64336 10.83994 20.56925 10.46707 20.42515 10.11917C20.28106 9.77126 20.06986 9.45516 19.80365 9.1889C19.53744 8.92264 19.22131 8.71142 18.87341 8.56733C18.5256 8.42322 18.15274 8.34905 17.77622 8.34905C17.39962 8.34905 17.02675 8.42322 16.67894 8.56733C16.33104 8.71142 16.01501 8.92264 15.7487 9.1889C15.4825 9.45516 15.2713 9.77126 15.1272 10.11917C14.9832 10.46707 14.90899 10.83994 14.90909 11.21645z" + fill="#FB813Aff"></path> + <path + d="M11.7816 9.52223C11.7816 9.91584 11.85907 10.3056 12.0097 10.66925C12.16032 11.0329 12.38112 11.36323 12.65942 11.64163C12.93773 11.91994 13.26816 12.14074 13.63181 12.29136C13.99546 12.44198 14.38522 12.51946 14.77882 12.51946C15.17242 12.51946 15.56218 12.44198 15.92582 12.29136C16.28947 12.14074 16.61981 11.91994 16.89821 11.64163C17.17651 11.36323 17.39722 11.0329 17.54784 10.66925C17.69846 10.3056 17.77603 9.91584 17.77603 9.52223C17.77603 8.72732 17.46029 7.96496 16.89821 7.40287C16.33603 6.84078 15.5737 6.525 14.77882 6.525C13.98384 6.525 13.2215 6.84078 12.65942 7.40287C12.09734 7.96496 11.7816 8.72732 11.7816 9.52223z" + fill="#FB813Aff"></path> + <path + d="M21.52992 9.91312C21.70147 9.91322 21.86602 9.98144 21.98736 10.10275C22.10861 10.22419 22.17677 10.38874 22.17677 10.56029L22.17571 10.59082L22.1737 10.62125C21.85181 14.01696 19.23504 16.76074 15.85699 17.35306L16.31107 19.16976C16.33027 19.24666 16.33171 19.32682 16.3153 19.40429C16.29878 19.48176 16.26499 19.55443 16.21622 19.61683C16.16746 19.67923 16.10515 19.72973 16.03402 19.76448C15.96288 19.79923 15.88474 19.81728 15.80554 19.81728L8.27921 19.81728C8.20003 19.81728 8.12188 19.79923 8.05071 19.76448C7.97955 19.72973 7.91723 19.67923 7.8685 19.61683C7.81977 19.55443 7.7859 19.48176 7.76947 19.40429C7.75305 19.32682 7.75449 19.24666 7.7737 19.16976L8.22772 17.35306C4.89166 16.76822 2.29831 14.08474 1.92424 10.74768L1.91171 10.62672C1.90307 10.53629 1.9134 10.44509 1.94207 10.35898C1.97073 10.27286 2.01708 10.19366 2.07813 10.12646C2.13919 10.05928 2.21362 10.0056 2.29664 9.96886C2.37965 9.93212 2.46943 9.91314 2.56021 9.91312L21.52992 9.91312z" + fill="#FDDE80ff"></path> + <path + d="M10.51066 3.65813L13.57402 3.65813C14.05238 3.65813 14.4695 3.9834 14.58538 4.44758L15.95184 9.91314L8.13281 9.91314L9.49929 4.44792C9.55566 4.22235 9.68582 4.02209 9.86909 3.87899C10.05235 3.73588 10.27814 3.65814 10.51066 3.65813z" + fill="#FDDE80ff"></path> + <path + d="M12.04234 15.12614C12.5953 15.12614 13.1257 15.34579 13.5167 15.7368C13.90771 16.1279 14.12746 16.65821 14.12746 17.21126L14.12746 19.81747L9.95722 19.81747L9.95722 17.21126C9.95722 16.65821 10.17686 16.1279 10.56787 15.7368C10.95898 15.34579 11.48928 15.12614 12.04234 15.12614z" + fill="#FB813Aff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/game.svg b/assets/zone_v2_icon/game.svg new file mode 100644 index 0000000..7fe5842 --- /dev/null +++ b/assets/zone_v2_icon/game.svg @@ -0,0 +1,14 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M5.73713 20.26694L18.61296 20.26694C19.40822 20.26694 20.05296 19.6223 20.05296 18.82694L20.05296 5.83225C20.05296 5.03696 19.40822 4.39225 18.61296 4.39225L5.73712 4.39225C4.94183 4.39225 4.29712 5.03696 4.29712 5.83225L4.29713 18.82694C4.29713 19.6223 4.94184 20.26694 5.73713 20.26694z" + fill="#57D587ff"></path> + <path + d="M7.73276 8.05963C7.60831 8.05963 7.50647 8.16223 7.50647 8.28763L7.50647 10.96666C7.50647 11.09203 7.60831 11.19466 7.73276 11.19466L10.39162 11.19466C10.51603 11.19466 10.61789 11.09203 10.61789 10.96666L10.61789 8.28763C10.61789 8.16223 10.51603 8.05963 10.39162 8.05963L7.73276 8.05963z" + fill="#1F9F81ff"></path> + <path + d="M16.84051 8.28763C16.84051 8.16223 16.73875 8.05963 16.61424 8.05963L13.95542 8.05963C13.83091 8.05963 13.72915 8.16223 13.72915 8.28763L13.72915 10.96666C13.72915 11.09203 13.83091 11.19466 13.95542 11.19466L16.61424 11.19466C16.73875 11.19466 16.84051 11.09203 16.84051 10.96666L16.84051 8.28763z" + fill="#1F9F81ff"></path> + <path + d="M10.84416 11.19456C10.71974 11.19456 10.61789 11.29718 10.61789 11.42256L10.61789 12.70666C10.61789 12.83203 10.51603 12.93466 10.39162 12.93466L9.37919 12.93466C9.25473 12.93466 9.1529 13.03728 9.1529 13.16266L9.1529 14.27395L9.1529 14.72995L9.1529 15.84163L9.1529 16.29763L9.1529 17.40893C9.1529 17.5343 9.25473 17.63693 9.37919 17.63693L10.27843 17.63693C10.40294 17.63693 10.5047 17.5343 10.5047 17.40893L10.5047 16.29763C10.5047 16.17226 10.60656 16.06963 10.73098 16.06963L11.85658 16.06963L12.17338 16.06963L12.49066 16.06963L13.61616 16.06963C13.74058 16.06963 13.84243 16.17226 13.84243 16.29763L13.84243 17.40893C13.84243 17.5343 13.94429 17.63693 14.0687 17.63693L14.96755 17.63693C15.09197 17.63693 15.19382 17.5343 15.19382 17.40893L15.19382 16.29763L15.19382 15.84163L15.19382 14.72995L15.19382 14.27395L15.19382 13.16266C15.19382 13.03728 15.09197 12.93466 14.96755 12.93466L13.95562 12.93466C13.8311 12.93466 13.72934 12.83203 13.72934 12.70666L13.72934 11.42256C13.72934 11.29718 13.62749 11.19456 13.50298 11.19456L10.84416 11.19456z" + fill="#1F9F81ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/gym.svg b/assets/zone_v2_icon/gym.svg new file mode 100644 index 0000000..4b1e3a8 --- /dev/null +++ b/assets/zone_v2_icon/gym.svg @@ -0,0 +1,17 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M2.00343 12.04454C2.00343 11.51434 2.41329 11.08454 2.91886 11.08454L21.22742 11.08454C21.73296 11.08454 22.14278 11.51434 22.14278 12.04454C22.14278 12.57475 21.73296 13.00454 21.22742 13.00454L2.91886 13.00454C2.41329 13.00454 2.00343 12.57475 2.00343 12.04454z" + fill="#FF8834ff"></path> + <path + d="M18.79498 5.27997L17.35498 5.27997L17.35498 18.72L18.79498 18.72C19.59034 18.72 20.23498 18.07526 20.23498 17.28L20.23498 6.71994C20.23498 5.92466 19.59024 5.27997 18.79498 5.27997z" + fill="#FFD671ff"></path> + <path + d="M8.23125 5.27997L6.79125 5.27997L6.79125 18.72L8.23125 18.72C9.02654 18.72 9.67123 18.07526 9.67123 17.28L9.67123 6.71995C9.67123 5.92467 9.02653 5.27997 8.23125 5.27997z" + fill="#FF8834ff"></path> + <path + d="M15.91498 5.28L17.35498 5.28L17.35498 18.72L15.91498 18.72C15.11971 18.72 14.47498 18.07526 14.47498 17.28L14.47498 6.71983C14.47498 5.92466 15.11981 5.28 15.91498 5.28z" + fill="#FF8834ff"></path> + <path + d="M5.35125 5.27997L6.79125 5.27997L6.79125 18.72L5.35125 18.72C4.55596 18.72 3.91125 18.07526 3.91125 17.28L3.91125 6.71994C3.91125 5.92466 4.55597 5.27997 5.35125 5.27997z" + fill="#FFD671ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/handmake.svg b/assets/zone_v2_icon/handmake.svg new file mode 100644 index 0000000..96f3bcc --- /dev/null +++ b/assets/zone_v2_icon/handmake.svg @@ -0,0 +1,23 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M12.62496 14.23738C12.36461 14.6424 11.77267 14.6424 11.51222 14.23757L10.54176 12.72902C10.4015 12.5111 10.4015 12.23146 10.54157 12.01344L16.35754 2.96447C16.50086 2.74146 16.80134 2.67425 16.99843 2.85151C18.05741 3.80375 18.30067 5.40988 17.50579 6.64666L12.62496 14.23738z" + fill="#6D69E4ff"></path> + <path + d="M11.37398 12.43008L12.56045 13.11504L10.65005 16.42397L9.46356 15.73901L11.37398 12.43008z" + fill="#6D69E4ff"></path> + <path + d="M11.49312 14.24842C11.75386 14.64998 12.34176 14.65008 12.60259 14.24861L13.58832 12.73152C13.73069 12.51245 13.73069 12.23011 13.58851 12.01094L7.71324 2.95969C7.56982 2.73875 7.2717 2.67196 7.07455 2.84664C6.00046 3.79827 5.75254 5.40777 6.55671 6.64666L11.49312 14.24842z" + fill="#9796EDff"></path> + <path + d="M11.37398 13.11504L12.56045 12.43008L14.40605 15.62678L13.21958 16.31174L11.37398 13.11504z" + fill="#9796EDff"></path> + <path + d="M6.8168 18.86678C5.84817 18.24422 5.56763 16.95437 6.1902 15.98573C6.81276 15.01709 8.10268 14.73648 9.07131 15.35914C10.03997 15.9817 10.32048 17.27155 9.69792 18.24019C9.07535 19.20883 7.78543 19.48934 6.8168 18.86678zM5.96217 20.19648C4.25917 19.10189 3.76595 16.83408 4.86051 15.13104C5.95507 13.4281 8.22294 12.93485 9.92592 14.02944C11.62896 15.12394 12.12221 17.39184 11.02762 19.09478C9.93302 20.79782 7.66517 21.29107 5.96217 20.19648z" + fill="#FDDE80ff"></path> + <path + d="M15.05808 18.86678C14.08944 18.24422 13.80893 16.95437 14.43149 15.98573C15.05405 15.01709 16.3439 14.73648 17.31254 15.35914C18.28118 15.9817 18.56179 17.27155 17.93914 18.24019C17.31658 19.20883 16.02672 19.48934 15.05808 18.86678zM14.20349 20.19648C12.50045 19.10189 12.0072 16.83408 13.10179 15.13104C14.19638 13.4281 16.46419 12.93485 18.16723 14.02944C19.87018 15.12394 20.36342 17.39184 19.26883 19.09478C18.17434 20.79782 15.90643 21.29107 14.20349 20.19648z" + fill="#FDDE80ff"></path> + <path + d="M13.07414 12.32688C13.07414 12.87965 12.62602 13.32778 12.07325 13.32778C11.52048 13.32778 11.07235 12.87965 11.07235 12.32688C11.07235 11.77411 11.52048 11.32598 12.07325 11.32598C12.62602 11.32598 13.07414 11.77411 13.07414 12.32688z" + fill="#FDDE80ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/health.svg b/assets/zone_v2_icon/health.svg new file mode 100644 index 0000000..ee172e4 --- /dev/null +++ b/assets/zone_v2_icon/health.svg @@ -0,0 +1,11 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M3.67336 7.39739C3.67336 6.59091 3.67336 6.18766 3.83031 5.87964C3.96837 5.60868 4.18866 5.38838 4.45961 5.25033C4.76765 5.09338 5.17089 5.09338 5.97736 5.09338L18.14179 5.09338C18.94829 5.09338 19.35149 5.09338 19.65955 5.25033C19.93046 5.38838 20.15078 5.60868 20.28883 5.87964C20.44579 6.18766 20.44579 6.5909 20.44579 7.39738L20.44579 16.60262C20.44579 17.40912 20.44579 17.81232 20.28883 18.12038C20.15078 18.3913 19.93046 18.61162 19.65955 18.74966C19.35149 18.90662 18.94829 18.90662 18.14179 18.90662L5.97735 18.90662C5.17089 18.90662 4.76765 18.90662 4.45961 18.74966C4.18866 18.61162 3.96837 18.3913 3.83031 18.12038C3.67336 17.81232 3.67336 17.40912 3.67336 16.60262L3.67336 7.39739z" + fill="#FF5C7Aff"></path> + <path + d="M3.09983 7.20505L3.09983 7.20505C3.09983 6.57943 3.09983 6.26662 3.19538 6.01756C3.34163 5.63638 3.64284 5.33518 4.02401 5.18893C4.27307 5.09338 4.58588 5.09338 5.2115 5.09338L5.2115 5.09338L18.93494 5.09338L18.93494 5.09338C19.56058 5.09338 19.87344 5.09338 20.12246 5.18893C20.50368 5.33518 20.80483 5.63637 20.95114 6.01757C21.04666 6.26662 21.04666 6.57944 21.04666 7.20505L21.04666 7.20505C21.04666 7.41359 21.04666 7.51786 21.01478 7.60088C20.96602 7.72794 20.8656 7.82834 20.73859 7.87709C20.65555 7.90894 20.5513 7.90894 20.34278 7.90894L3.80372 7.90894C3.59518 7.90894 3.49091 7.90894 3.40789 7.87709C3.28083 7.82834 3.18043 7.72794 3.13167 7.60088C3.09983 7.51786 3.09983 7.41359 3.09983 7.20505z" + fill="#FFCFE6ff"></path> + <path + d="M13.20672 11.86099L13.20672 9.88544C13.20672 9.62034 12.99187 9.40544 12.72672 9.40544L11.39251 9.40544C11.12736 9.40544 10.91251 9.62034 10.91251 9.88544L10.91251 11.86099L8.93696 11.86099C8.67185 11.86099 8.45696 12.07584 8.45696 12.34099L8.45696 13.6752C8.45696 13.94035 8.67185 14.1552 8.93696 14.1552L10.91251 14.1552L10.91251 16.13078C10.91251 16.39584 11.12736 16.61078 11.39251 16.61078L12.72672 16.61078C12.99187 16.61078 13.20672 16.39584 13.20672 16.13078L13.20672 14.1552L15.1823 14.1552C15.44736 14.1552 15.6623 13.94035 15.6623 13.6752L15.6623 12.34099C15.6623 12.07584 15.44736 11.86099 15.1823 11.86099L13.20672 11.86099z" + fill="#FFCFE6ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/home.svg b/assets/zone_v2_icon/home.svg new file mode 100644 index 0000000..066b5dd --- /dev/null +++ b/assets/zone_v2_icon/home.svg @@ -0,0 +1,26 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M5.59324 5.04454C5.59324 4.24928 6.2378 3.60457 7.03307 3.60457C7.06633 3.60457 7.09987 3.60457 7.13368 3.60457L14.02454 3.60457C14.05824 3.60457 14.09174 3.60457 14.12486 3.60457C14.92022 3.60456 15.56496 4.24931 15.56496 5.04468L15.56496 20.40461L7.13367 20.40461C6.28292 20.40461 5.59324 19.79482 5.59324 19.04246L5.59324 5.04454z" + fill="#FF8834ff"></path> + <path + d="M9.42703 11.3329C9.42703 11.06784 9.64195 10.8529 9.90701 10.8529L11.2512 10.8529C11.51626 10.8529 11.7312 11.06784 11.7312 11.3329L11.7312 12.67699C11.7312 12.94214 11.51626 13.15699 11.2512 13.15699L9.90701 13.15699C9.64195 13.15699 9.42703 12.94214 9.42703 12.67699L9.42703 11.3329z" + fill="#FFD671ff"></path> + <path + d="M9.42703 7.04062C9.42703 6.77553 9.64195 6.56062 9.90701 6.56062L11.2512 6.56062C11.51626 6.56062 11.7312 6.77553 11.7312 7.04062L11.7312 8.38475C11.7312 8.64985 11.51626 8.86475 11.2512 8.86475L9.90701 8.86475C9.64195 8.86475 9.42703 8.64985 9.42703 8.38475L9.42703 7.04062z" + fill="#FFD671ff"></path> + <path + d="M9.42703 15.62506C9.42703 15.36 9.64195 15.14506 9.90701 15.14506L11.2512 15.14506C11.51626 15.14506 11.7312 15.36 11.7312 15.62506L11.7312 16.96915C11.7312 17.2343 11.51626 17.44915 11.2512 17.44915L9.90701 17.44915C9.64195 17.44915 9.42703 17.2343 9.42703 16.96915L9.42703 15.62506z" + fill="#FFD671ff"></path> + <path + d="M15.56496 8.80705L19.03325 8.80705C19.82851 8.80705 20.47325 9.45176 20.47325 10.24704L20.47325 10.24704L20.47325 18.96461C20.47325 19.75987 19.82851 20.40461 19.03325 20.40461L15.56496 20.40461L15.56496 8.80705z" + fill="#FFD671ff"></path> + <path + d="M17.15616 11.3327C17.15616 11.06755 17.37101 10.8527 17.63616 10.8527L18.40205 10.8527C18.6672 10.8527 18.88205 11.06755 18.88205 11.3327L18.88205 12.6768C18.88205 12.94186 18.6672 13.1568 18.40205 13.1568L17.63616 13.1568C17.37101 13.1568 17.15616 12.94186 17.15616 12.6768L17.15616 11.3327z" + fill="#FF8834ff"></path> + <path + d="M17.15616 15.62486C17.15616 15.35971 17.37101 15.14486 17.63616 15.14486L18.40205 15.14477C18.6672 15.14477 18.88205 15.35971 18.88205 15.62477L18.88205 16.96896C18.88205 17.23402 18.6672 17.44896 18.40205 17.44896L17.63616 17.44896C17.37101 17.44896 17.15616 17.23402 17.15616 16.96896L17.15616 15.62486z" + fill="#FF8834ff"></path> + <path + d="M4.46813 19.8047C4.46813 19.2745 4.89793 18.8447 5.42813 18.8447L20.63626 18.8447C21.16646 18.8447 21.59626 19.2745 21.59626 19.8047C21.59626 20.33491 21.16646 20.7647 20.63626 20.7647L5.42813 20.7647C4.89793 20.7647 4.46813 20.33491 4.46813 19.8047z" + fill="#FF8834ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/information.svg b/assets/zone_v2_icon/information.svg new file mode 100644 index 0000000..68a2917 --- /dev/null +++ b/assets/zone_v2_icon/information.svg @@ -0,0 +1,20 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M20.7696 9.43989C20.7696 8.64461 20.12486 7.99991 19.3296 7.99988C16.87613 7.9998 14.42275 7.99956 11.96928 7.99979C11.17411 7.99986 10.52957 8.64452 10.52957 9.4397L10.52957 18.96499C10.52957 19.76026 11.17421 20.40499 11.96957 20.40499C14.42285 20.40499 16.87622 20.40499 19.3296 20.40499C20.12486 20.40499 20.7696 19.76026 20.7696 18.96499C20.7696 15.78998 20.7696 12.61498 20.7696 9.43989z" + fill="#00B9E7ff"></path> + <path + d="M17.56512 4.12356L5.86988 4.12356C5.16028 4.12356 4.58508 4.65644 4.58508 5.3136L4.58508 19.21469C4.58508 19.8719 5.16028 20.4047 5.86988 20.4047L17.56512 20.4047C18.27427 20.4047 18.8495 19.8719 18.8495 19.21469L18.8495 5.3136C18.8495 4.65644 18.27427 4.12356 17.56512 4.12356z" + fill="#59E1F9ff"></path> + <path + d="M6.55239 15.36586C6.55239 14.96861 6.87441 14.64662 7.27164 14.64662L16.14778 14.64662C16.54493 14.64662 16.86701 14.96861 16.86701 15.36586C16.86701 15.7631 16.54493 16.08509 16.14778 16.08509L7.27164 16.08509C6.87441 16.08509 6.55239 15.7631 6.55239 15.36586z" + fill="#00B9E7ff"></path> + <path + d="M6.55239 17.90045C6.55239 17.5032 6.87441 17.18122 7.27164 17.18122L16.14778 17.18122C16.54493 17.18122 16.86701 17.5032 16.86701 17.90045C16.86701 18.2977 16.54493 18.61968 16.14778 18.61968L7.27164 18.61968C6.87441 18.61968 6.55239 18.2977 6.55239 17.90045z" + fill="#00B9E7ff"></path> + <path + d="M15.61574 13.17888L7.81898 13.17888C7.13058 13.17888 6.56738 12.61891 6.56738 11.93443L6.56738 7.62798C6.56738 6.94351 7.13058 6.38353 7.81898 6.38353L15.61574 6.38353C16.30416 6.38353 16.86701 6.94351 16.86701 7.62798L16.86701 11.93443C16.86701 12.61891 16.30416 13.17888 15.61574 13.17888z" + fill="#00B9E7ff"></path> + <path + d="M10.3943 8.60394C10.3943 8.06573 10.77312 7.84541 11.23603 8.11452L13.40477 9.37584C13.86768 9.64495 13.86768 10.08557 13.40477 10.35466L11.23603 11.616C10.77312 11.88566 10.3943 11.66534 10.3943 11.12659L10.3943 8.60394z" + fill="#FDDE80ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/kichiku.svg b/assets/zone_v2_icon/kichiku.svg new file mode 100644 index 0000000..a02252b --- /dev/null +++ b/assets/zone_v2_icon/kichiku.svg @@ -0,0 +1,20 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M21.44573 11.95363C21.44573 9.55713 19.50038 7.61437 17.10058 7.61437C15.08016 7.61437 13.38701 8.99326 12.90048 10.85837C12.61642 10.97539 12.34656 11.1191 12.09197 11.28422C11.8248 11.11114 11.54035 10.9632 11.24141 10.8431C10.7495 8.98562 9.05986 7.61437 7.04517 7.61437C4.64539 7.61437 2.7 9.55713 2.7 11.95363C2.7 13.36733 3.37985 14.61888 4.42758 15.41136C4.42758 15.4225 4.42605 15.43315 4.42605 15.4439C4.42605 18.18326 6.64974 20.40394 9.39251 20.40394C10.38893 20.40394 11.31456 20.10806 12.09197 19.60387C12.86947 20.10806 13.7951 20.40394 14.7911 20.40394C17.5343 20.40394 19.75795 18.18326 19.75795 15.4439C19.75795 15.42365 19.75488 15.40406 19.75488 15.38381C20.78198 14.59027 21.44573 13.35091 21.44573 11.95363z" + fill="#FF5C7Aff"></path> + <path + d="M12.58224 5.53555L11.71478 5.53555C9.34452 5.53555 7.40521 7.47222 7.40521 9.83926L7.40521 15.31181C7.40521 17.67888 9.34452 19.61558 11.71478 19.61558L12.58224 19.61558C14.95258 19.61558 16.89187 17.67888 16.89187 15.31181L16.89187 9.83926C16.89187 7.47222 14.95258 5.53555 12.58224 5.53555z" + fill="#ffffffff"></path> + <path + d="M9.46395 12.41309C9.51499 12.25402 9.73997 12.25402 9.79104 12.41309L9.80074 12.44323C9.99446 13.04669 10.41043 13.55386 10.96445 13.86182C11.0785 13.92528 11.0785 14.08934 10.96445 14.1527C10.41043 14.46067 9.99446 14.96784 9.80074 15.5713L9.79104 15.60154C9.73997 15.76051 9.51499 15.76051 9.46395 15.60154L9.45425 15.5713C9.26053 14.96784 8.84449 14.46067 8.29054 14.1527C8.17648 14.08934 8.17648 13.92528 8.29054 13.86182C8.84449 13.55386 9.26053 13.04669 9.45425 12.44323L9.46395 12.41309z" + fill="#FF5C7Aff"></path> + <path + d="M14.28221 12.41309C14.33328 12.25402 14.55821 12.25402 14.60928 12.41309L14.61898 12.44323C14.8127 13.04669 15.22877 13.55386 15.78269 13.86182C15.89674 13.92528 15.89674 14.08934 15.78269 14.1527C15.22877 14.46067 14.8127 14.96784 14.61898 15.5713L14.60928 15.60154C14.55821 15.76051 14.33328 15.76051 14.28221 15.60154L14.27251 15.5713C14.07878 14.96784 13.66282 14.46067 13.1088 14.1527C12.99475 14.08934 12.99475 13.92528 13.1088 13.86182C13.66282 13.55386 14.07878 13.04669 14.27251 12.44323L14.28221 12.41309z" + fill="#FF5C7Aff"></path> + <path + d="M15.88627 4.34697C15.40176 4.34697 14.94173 4.44877 14.52384 4.62983C13.90205 3.99273 13.03459 3.59566 12.07315 3.59566C11.11171 3.59566 10.24426 3.99273 9.62208 4.62983C9.20452 4.44877 8.74409 4.34697 8.25997 4.34697C6.36862 4.34697 4.83576 5.87813 4.83576 7.76653C4.83576 9.65493 6.36862 11.18611 8.25997 11.18611C9.22144 11.18611 10.08883 10.78906 10.71072 10.1519C11.12861 10.33296 11.58864 10.43482 12.07315 10.43482C12.55766 10.43482 13.0177 10.33296 13.4352 10.1519C14.05738 10.78906 14.92483 11.18611 15.88627 11.18611C17.77728 11.18611 19.3105 9.65493 19.3105 7.76653C19.3105 5.87813 17.77728 4.34697 15.88627 4.34697z" + fill="#FF5C7Aff"></path> + <path + d="M13.46515 16.05629C13.46515 16.85155 12.81917 17.49658 12.02285 17.49658C11.22586 17.49658 10.58064 16.85155 10.58064 16.05629C10.58064 15.26102 11.22586 14.616 12.02285 14.616C12.81917 14.616 13.46515 15.26102 13.46515 16.05629z" + fill="#FF5C7Aff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/knowledge.svg b/assets/zone_v2_icon/knowledge.svg new file mode 100644 index 0000000..154fe65 --- /dev/null +++ b/assets/zone_v2_icon/knowledge.svg @@ -0,0 +1,17 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M11.314 2.23489C12.9446 2.23067 14.532 2.75886 15.8349 3.73921C17.1379 4.71955 18.0852 6.09845 18.5329 7.66636C18.9806 9.23427 18.9042 10.9055 18.3154 12.426C17.8016 13.7526 16.9223 14.9013 15.7852 15.7421C15.4744 15.972 15.2705 16.326 15.2705 16.7125L15.2705 17.592C15.2617 17.8153 15.2705 18.4288 15.2705 18.4288C15.2705 18.4288 14.2951 18.5929 13.8545 18.5929C13.4139 18.5929 8.6663 18.5929 8.6663 18.5929C8.23657 18.5929 7.26348 18.3716 7.26348 18.3716C7.26348 18.3716 7.26348 17.3741 7.26348 16.9398L7.26348 16.6997C7.26348 16.3201 7.06671 15.9714 6.76507 15.741C5.64258 14.8837 4.78051 13.7248 4.28335 12.394C3.71494 10.8724 3.65406 9.20783 4.10982 7.64882C4.56557 6.08982 5.51348 4.7201 6.81195 3.7443C8.11043 2.7685 9.68976 2.239 11.314 2.23489z" + fill="#FF8834ff"></path> + <path + d="M12.1195 12.5257C12.3663 12.5257 12.5664 12.3256 12.5664 12.0788L12.5664 11.3639C12.5664 11.1171 12.7665 10.917 13.0133 10.917L13.6389 10.917C14.6152 10.917 14.7114 10.3559 14.7114 10.0232L14.7114 6.7135C14.7114 6.22927 14.351 5.81976 13.6389 5.81976L9.17018 5.81976C8.28824 5.81976 7.91895 6.26199 7.91895 6.7135L7.91895 8.50456C7.91895 8.75099 8.11871 8.95076 8.36514 8.95076L9.61773 8.95076C9.86415 8.95076 10.0639 8.75099 10.0639 8.50456L10.0639 7.96765C10.0639 7.72085 10.264 7.52078 10.5108 7.52078L12.1195 7.52078C12.3663 7.52078 12.5664 7.72085 12.5664 7.96765L12.5664 9.57638C12.5664 9.82318 12.3663 10.0232 12.1195 10.0232L11.4939 10.0232C10.2266 10.0114 9.88517 10.5345 9.88517 10.917L9.88517 12.0788C9.88517 12.3256 10.0852 12.5257 10.332 12.5257L12.1195 12.5257zM11.2537 13.0396C11.5011 13.0396 11.7431 13.113 11.9488 13.2505C12.1546 13.388 12.315 13.5834 12.4097 13.812C12.5044 14.0407 12.5291 14.2922 12.4809 14.535C12.4326 14.7777 12.3134 15.0006 12.1384 15.1756C11.9634 15.3506 11.7405 15.4698 11.4978 15.518C11.2551 15.5663 11.0035 15.5415 10.7748 15.4468C10.5462 15.3521 10.3508 15.1918 10.2133 14.986C10.0758 14.7802 10.0024 14.5383 10.0024 14.2909C10.0024 13.959 10.1343 13.6407 10.3689 13.4061C10.6036 13.1714 10.9218 13.0396 11.2537 13.0396z" + fill="#FFE8AFff"></path> + <path + d="M7.61193 19.1082C7.56041 18.8267 7.79538 18.593 8.0816 18.593L14.5507 18.593C14.8369 18.593 15.0719 18.8267 15.0204 19.1082C14.9 19.7663 14.5593 20.4539 14.0385 20.8941C13.3787 21.4518 12.4838 21.7652 11.5507 21.7652L11.0816 21.7652C10.1485 21.7652 9.25362 21.4518 8.59382 20.8941C8.073 20.4539 7.73233 19.7663 7.61193 19.1082z" + fill="#00B9E7ff"></path> + <path + d="M6.53796 17.9091C6.53796 17.4028 6.94835 16.9924 7.45459 16.9924L14.9778 16.9924C15.484 16.9924 15.8944 17.4028 15.8944 17.9091L15.8944 18.0758C15.8944 18.582 15.484 18.9924 14.9778 18.9924L7.45459 18.9924C6.94835 18.9924 6.53796 18.582 6.53796 18.0758L6.53796 17.9091z" + fill="#FFD671ff"></path> + <path + d="M20.289 3.28204C20.345 3.15749 20.5218 3.15749 20.5779 3.28204L20.8592 3.90715C21.1186 4.4836 21.5405 4.97188 22.0732 5.31218L22.267 5.43598C22.3971 5.51903 22.3971 5.70894 22.267 5.79199L22.0821 5.91013C21.5438 6.25396 21.1188 6.74879 20.8602 7.33278L20.5783 7.96932C20.5226 8.09501 20.3442 8.09501 20.2886 7.96932L20.0206 7.36425C19.7533 6.76065 19.3084 6.25278 18.7453 5.90825L18.5589 5.79416C18.4242 5.71178 18.4242 5.51619 18.5589 5.43381L18.7543 5.3142C19.3118 4.9731 19.7535 4.47182 20.0217 3.87581L20.289 3.28204z" + fill="#FFD671ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/life_experience.svg b/assets/zone_v2_icon/life_experience.svg new file mode 100644 index 0000000..2ef38e2 --- /dev/null +++ b/assets/zone_v2_icon/life_experience.svg @@ -0,0 +1,8 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M10.61434 6.33318C10.44384 7.21354 10.50317 8.08513 10.75046 8.88596L5.69662 13.35926L5.69921 13.36157C5.57936 13.47024 5.465 13.58765 5.35702 13.7137C3.97257 15.33053 4.16094 17.76355 5.77777 19.14806C7.39459 20.53248 9.82762 20.34413 11.21203 18.7273C11.30314 18.62093 11.38742 18.51101 11.46499 18.39811L15.31018 12.58262C17.97302 12.82781 20.43984 11.0184 20.9593 8.33736C21.17885 7.20411 21.01738 6.0853 20.56435 5.11334C20.37149 4.69955 19.82563 4.66821 19.52582 5.01252L17.27568 7.59697C17.10634 7.79142 16.81142 7.81181 16.61702 7.6425L15.29088 6.48796C15.09648 6.31865 15.07603 6.02376 15.24538 5.82931L17.46605 3.27885C17.7697 2.93007 17.65584 2.38682 17.2104 2.26236C17.07254 2.22383 16.9319 2.19058 16.78886 2.16287C13.93229 1.60943 11.16778 3.47652 10.61434 6.33318z" + fill="#FDDE80ff"></path> + <path + d="M7.35426 17.3065C6.75449 16.79299 6.68461 15.8904 7.19819 15.29059C7.71177 14.69088 8.61432 14.62099 9.21409 15.1345C9.81389 15.6481 9.88378 16.55069 9.37018 17.1504C8.8566 17.75021 7.95404 17.8201 7.35426 17.3065z" + fill="#FB813Aff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/life_joy.svg b/assets/zone_v2_icon/life_joy.svg new file mode 100644 index 0000000..1b31b60 --- /dev/null +++ b/assets/zone_v2_icon/life_joy.svg @@ -0,0 +1,14 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M4.07763 7.63768C4.05931 6.56311 5.5539 6.83651 6.30349 7.10752C7.97693 7.98802 10.8193 9.80818 8.8013 10.0448C6.27878 10.3405 4.10053 8.98089 4.07763 7.63768z" + fill="#FB813Aff"></path> + <path + d="M4.55611 14.4882C4.84141 11.4532 7.31628 10.1389 8.31998 9.82821C8.48729 9.82821 9.61772 10.5076 13.464 11.2928C16.0255 11.8156 17.6628 11.0097 18.4364 9.93394C18.805 9.42136 19.3229 9.07939 19.7434 9.55032C20.3467 10.226 21.0067 11.5269 21.0067 13.5405C21.0067 17.3561 18.0324 20.9886 12.5657 20.9886C7.48437 20.9886 4.24105 17.8397 4.55611 14.4882z" + fill="#FDDE80ff"></path> + <path + d="M14.8068 7.41519C14.8068 9.84733 12.8352 11.819 10.4031 11.819C7.97092 11.819 5.99929 9.84733 5.99929 7.41519C5.99929 4.98305 7.97092 3.01141 10.4031 3.01141C12.8352 3.01141 14.8068 4.98305 14.8068 7.41519z" + fill="#FDDE80ff"></path> + <path + d="M10.0014 7.74284C10.0014 8.297 9.5522 8.74623 8.99804 8.74623C8.44388 8.74623 7.99465 8.297 7.99465 7.74284C7.99465 7.18868 8.44388 6.73944 8.99804 6.73944C9.5522 6.73944 10.0014 7.18868 10.0014 7.74284z" + fill="#FB813Aff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/music.svg b/assets/zone_v2_icon/music.svg new file mode 100644 index 0000000..10c5f58 --- /dev/null +++ b/assets/zone_v2_icon/music.svg @@ -0,0 +1,17 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M20.36371 11.11344C20.36371 7.03327 17.00093 3.69495 12.89088 3.69495L11.25552 3.69495C7.1455 3.69495 3.78273 7.03327 3.78273 11.11344L3.78273 17.13898C3.78273 17.88566 4.38811 18.49114 5.1349 18.49114C5.43671 19.51978 5.98057 20.27731 7.11021 20.27731L8.35096 20.27731C8.80764 20.27731 9.17878 19.91088 9.18128 19.45718L9.21324 13.14941C9.21532 12.69274 8.84292 12.32102 8.38293 12.32102L7.11021 12.32102C6.69256 12.32102 6.29858 12.42566 5.95151 12.60826L5.95151 10.98528C5.95151 8.03846 8.38018 5.62746 11.34854 5.62746L12.85142 5.62746C15.81984 5.62746 18.24845 8.03846 18.24845 10.98528L18.24845 12.63706C17.88893 12.4368 17.47546 12.32102 17.03616 12.32102L15.76349 12.32102C15.30346 12.32102 14.93107 12.69274 14.93318 13.14941L14.96515 19.45718C14.96765 19.91088 15.33878 20.27731 15.79546 20.27731L17.03616 20.27731C18.16589 20.27731 18.70973 19.51978 19.01155 18.49114C19.75834 18.49114 20.36371 17.88566 20.36371 17.13898L20.36371 11.11344z" + fill="#59E0F9ff"></path> + <path + d="M5.11552 15.22608C5.11552 14.15078 5.11552 13.61309 5.32479 13.2024C5.50887 12.84115 5.8026 12.54739 6.16386 12.36336C6.57458 12.15408 7.11223 12.15408 8.18752 12.15408L8.61742 12.15408C9.15507 12.15408 9.4239 12.15408 9.62928 12.25872C9.80986 12.35078 9.95674 12.49757 10.0488 12.67824C10.15344 12.88358 10.15344 13.15238 10.15344 13.69008L10.15344 18.74131C10.15344 19.27891 10.15344 19.54781 10.0488 19.75315C9.95674 19.93373 9.80986 20.08061 9.62928 20.17267C9.4239 20.27731 9.15507 20.27731 8.61742 20.27731L8.18752 20.27731C7.11223 20.27731 6.57458 20.27731 6.16386 20.06803C5.8026 19.884 5.50887 19.59024 5.32479 19.22899C5.11552 18.81821 5.11552 18.28061 5.11552 17.20531L5.11552 15.22608z" + fill="#00B9E7ff"></path> + <path + d="M19.03075 15.22608C19.03075 14.15078 19.03075 13.61309 18.82147 13.2024C18.63734 12.84115 18.34368 12.54739 17.98243 12.36336C17.57165 12.15408 17.03405 12.15408 15.95875 12.15408L15.52675 12.15408C14.98906 12.15408 14.72026 12.15408 14.51491 12.25872C14.33424 12.35078 14.18736 12.49757 14.09539 12.67824C13.99075 12.88358 13.99075 13.15238 13.99075 13.69008L13.99075 18.74131C13.99075 19.27891 13.99075 19.54781 14.09539 19.75315C14.18736 19.93373 14.33424 20.08061 14.51491 20.17267C14.72026 20.27731 14.98906 20.27731 15.52675 20.27731L15.95875 20.27731C17.03405 20.27731 17.57165 20.27731 17.98243 20.06803C18.34368 19.884 18.63734 19.59024 18.82147 19.22899C19.03075 18.81821 19.03075 18.28061 19.03075 17.20531L19.03075 15.22608z" + fill="#00B9E7ff"></path> + <path + d="M13.9992 12.87389C13.9992 12.34349 14.42928 11.91341 14.95968 11.91341L14.95968 11.91341C15.49018 11.91341 15.92026 12.34349 15.92026 12.87389L15.92026 19.55741C15.92026 20.0879 15.49018 20.51798 14.95968 20.51798L14.95968 20.51798C14.42928 20.51798 13.9992 20.0879 13.9992 19.55741L13.9992 12.87389z" + fill="#FDDE80ff"></path> + <path + d="M8.24077 12.87389C8.24077 12.34349 8.67081 11.91341 9.20127 11.91341L9.20127 11.91341C9.73171 11.91341 10.16179 12.34349 10.16179 12.87389L10.16179 19.55741C10.16179 20.0879 9.73171 20.51798 9.20127 20.51798L9.20127 20.51798C8.67081 20.51798 8.24077 20.0879 8.24077 19.55741L8.24077 12.87389z" + fill="#FDDE80ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/outdoors.svg b/assets/zone_v2_icon/outdoors.svg new file mode 100644 index 0000000..0af234d --- /dev/null +++ b/assets/zone_v2_icon/outdoors.svg @@ -0,0 +1,14 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M9.29448 4.11732C9.64829 3.40975 10.65802 3.40975 11.01178 4.11732L18.0985 18.29069C18.4176 18.92899 17.95344 19.68 17.23978 19.68L3.06644 19.68C2.3528 19.68 1.88864 18.92899 2.20779 18.29069L9.29448 4.11732z" + fill="#1F9F81ff"></path> + <path + d="M3.05915 19.68019C2.34988 19.67482 1.89021 18.92698 2.20821 18.29098L5.83356 11.04019L6.34665 12.06643C6.62966 12.63245 7.43746 12.63245 7.72048 12.06643L8.3349 10.83754C8.68868 10.13002 9.6984 10.13002 10.05216 10.83754L12.10666 14.94643C12.38966 15.51245 13.19741 15.51245 13.48051 14.94643L14.95354 12.00029L18.09888 18.29098C18.41808 18.92928 17.95392 19.68029 17.24026 19.68029L3.26428 19.68029C3.26216 19.68019 3.26004 19.68019 3.25792 19.68019L3.05915 19.68019z" + fill="#57D587ff"></path> + <path + d="M16.01443 9.87732C16.36829 9.16975 17.37802 9.16975 17.73178 9.87732L21.9385 18.29069C22.2576 18.92899 21.79344 19.68 21.07978 19.68L12.66643 19.68C11.95277 19.68 11.48861 18.92899 11.80781 18.29069L16.01443 9.87732z" + fill="#1F9F81ff"></path> + <path + d="M19.51354 13.44L21.93888 18.29069C22.25808 18.92899 21.79392 19.68 21.08026 19.68L12.66682 19.68C11.95325 19.68 11.48909 18.92899 11.80819 18.29069L14.95354 12L17.16422 16.42138C17.34115 16.77514 17.84602 16.77514 18.02285 16.42138L19.51354 13.44z" + fill="#57D587ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/painting.svg b/assets/zone_v2_icon/painting.svg new file mode 100644 index 0000000..2e0cd81 --- /dev/null +++ b/assets/zone_v2_icon/painting.svg @@ -0,0 +1,23 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M12.3744 18.84662C12.69341 20.00419 13.71994 21.08438 14.85139 20.68234C18.26458 19.46938 20.71642 16.13021 20.71642 12.20093C20.71642 7.24727 16.81949 3.23156 12.01248 3.23156C7.20531 3.23156 3.30844 7.24727 3.30844 12.20093C3.33446 12.77126 3.45612 13.28774 3.61254 13.63834C4.17721 14.90381 5.61394 15.15859 6.73392 15.12922C8.03405 15.09514 9.63226 15.24019 10.56096 16.00886C11.59786 16.8671 12.11866 17.91859 12.3744 18.84662z" + fill="#FDDE80ff"></path> + <path + d="M8.78526 10.49779C8.78526 11.44157 8.02013 12.20669 7.07629 12.20669C6.13247 12.20669 5.36734 11.44157 5.36734 10.49779C5.36734 9.55393 6.13247 8.78881 7.07629 8.78881C8.02013 8.78881 8.78526 9.55393 8.78526 10.49779z" + fill="#FB813Aff"></path> + <path + d="M12.408 7.48322C12.408 8.20428 11.82355 8.78881 11.1025 8.78881C10.38144 8.78881 9.7969 8.20428 9.7969 7.48322C9.7969 6.76216 10.38144 6.17764 11.1025 6.17764C11.82355 6.17764 12.408 6.76216 12.408 7.48322z" + fill="#FB813Aff"></path> + <path + d="M16.3633 7.48323C16.3633 8.02254 15.92611 8.45974 15.38678 8.45974C14.84755 8.45974 14.41027 8.02254 14.41027 7.48323C14.41027 6.94392 14.84755 6.50672 15.38678 6.50672C15.92611 6.50672 16.3633 6.94392 16.3633 7.48323z" + fill="#FB813Aff"></path> + <path + d="M14.71584 14.62147C14.41421 14.09914 14.58682 13.43146 15.10368 13.1207L21.1801 9.46733C21.82541 9.07934 22.66397 9.30876 23.02195 9.97121C23.37216 10.61933 23.12429 11.4287 22.4711 11.76941L16.18522 15.04906C15.6599 15.32304 15.012 15.1345 14.71584 14.62147z" + fill="#FB813Aff"></path> + <path + d="M11.78429 14.75242C12.32054 14.68214 12.92227 13.98 13.23936 13.54013L15.35971 16.06061C13.86586 16.96474 11.96122 16.30694 11.5559 15.00941C11.51616 14.88211 11.65219 14.76979 11.78429 14.75242z" + fill="#FB813Aff"></path> + <path + d="M16.15882 14.96486C15.96509 15.86717 15.07661 16.44154 14.1743 16.24781C13.272 16.05408 12.69763 15.1655 12.89136 14.2633C13.08509 13.36099 13.97366 12.78662 14.87587 12.98035C15.77818 13.17408 16.35254 14.06256 16.15882 14.96486z" + fill="#FB813Aff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/parenting.svg b/assets/zone_v2_icon/parenting.svg new file mode 100644 index 0000000..719ea97 --- /dev/null +++ b/assets/zone_v2_icon/parenting.svg @@ -0,0 +1,26 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M5.96079 9.69571C5.59021 9.81677 5.26667 9.8328 4.86949 9.85738L9.89213 5.07405L10.87805 9.6721L15.83242 9.6721C17.87904 9.6721 19.53811 11.33117 19.53811 13.37779C19.53811 15.42432 17.87904 17.08339 15.83242 17.08339L10.16016 17.08339C7.92572 17.08339 6.09908 15.30134 6.04398 13.06752L5.96079 9.69571z" + fill="#FDDE80ff"></path> + <path + d="M9.6025 4.46082C10.41341 5.55808 9.75648 7.49415 8.20206 8.64297C6.64761 9.79181 3.96818 10.40179 3.055 9.26052C1.96426 7.89731 3.63332 5.60959 5.18777 4.46077C6.74222 3.31196 8.79157 3.36356 9.6025 4.46082z" + fill="#FDDE80ff"></path> + <path + d="M6.87196 6.71961C6.87196 7.12133 6.5463 7.447 6.14457 7.447C5.74284 7.447 5.41718 7.12133 5.41718 6.71961C5.41718 6.31788 5.74284 5.99222 6.14457 5.99222C6.5463 5.99222 6.87196 6.31788 6.87196 6.71961z" + fill="#FB813Aff"></path> + <path + d="M6.14543 12.70627L10.23763 14.1047L8.64211 18.77357L4.54988 17.37514L6.14543 12.70627z" + fill="#FDDE80ff"></path> + <path + d="M14.78726 14.63981L18.7393 12.88387L20.74282 17.3928L16.79078 19.14874L14.78726 14.63981z" + fill="#FDDE80ff"></path> + <path + d="M21.96979 15.99082C22.31914 16.3897 22.27901 16.99613 21.88022 17.34547C15.86986 22.61002 7.48995 22.30915 2.4827 17.30218C2.10779 16.9273 2.10778 16.31942 2.48267 15.94454C2.85756 15.56966 3.4654 15.56966 3.84032 15.94454C8.08284 20.18688 15.31133 20.54678 20.61514 15.90125C21.01392 15.5519 21.62045 15.59203 21.96979 15.99082z" + fill="#FB813Aff"></path> + <path + d="M19.39718 14.39482C19.72656 11.1407 18.06538 10.3655 17.14954 9.91958C17.37629 9.69235 18.31123 9.5818 19.1807 9.99101C20.37235 10.55174 21.10224 11.98934 21.42298 12.9239C21.54499 13.27949 21.33542 13.65331 20.98474 13.78877C20.39798 14.01523 19.57814 14.33251 19.39718 14.39482z" + fill="#FB813Aff"></path> + <path + d="M10.83811 9.66922C10.11696 4.5294 7.26305 3.30956 5.97503 3.99554C5.97565 3.79332 5.97577 3.52899 5.97581 3.2852C5.97588 2.91278 6.25105 2.59212 6.62292 2.5719C11.19946 2.32295 12.21792 7.17193 12.41837 9.66922C12.19757 9.69322 11.40576 9.66922 10.83811 9.66922z" + fill="#FB813Aff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/rural.svg b/assets/zone_v2_icon/rural.svg new file mode 100644 index 0000000..86890a6 --- /dev/null +++ b/assets/zone_v2_icon/rural.svg @@ -0,0 +1,17 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M10.91453 10.73011C7.95237 9.85407 7.59103 5.97928 10.11072 4.12781C13.15738 5.65305 12.98035 8.82602 10.91453 10.73011z" + fill="#57D587ff"></path> + <path + d="M18.67613 9.33284C18.19392 12.384 14.39933 13.24752 12.2351 10.99085C13.34995 7.77122 16.51891 7.53296 18.67613 9.33284z" + fill="#57D587ff"></path> + <path + d="M11.30275 17.05469C7.42624 18.98832 3.35071 15.35866 4.16538 11.05008C8.74932 9.70172 11.6015 13.12618 11.30275 17.05469z" + fill="#57D587ff"></path> + <path + d="M19.80106 14.7049C19.08797 18.83357 13.92499 19.93133 11.03338 16.8288C12.60778 12.48394 16.91021 12.22205 19.80106 14.7049z" + fill="#57D587ff"></path> + <path + d="M16.30752 5.67904C16.56192 6.14421 16.39104 6.72755 15.92592 6.98196C13.72982 8.183 12.6264 10.43021 12.22214 12.83395C11.81539 15.25277 12.15562 17.6279 12.63734 18.80381C12.83827 19.29446 12.60346 19.8551 12.1128 20.05603C11.62224 20.25706 11.0616 20.02224 10.86058 19.53158C10.22304 17.97514 9.87216 15.2304 10.32874 12.51552C10.78781 9.78549 12.10214 6.88484 15.00461 5.29743C15.46973 5.04302 16.05312 5.21388 16.30752 5.67904z" + fill="#1F9F81ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/shortplay.svg b/assets/zone_v2_icon/shortplay.svg new file mode 100644 index 0000000..dae6736 --- /dev/null +++ b/assets/zone_v2_icon/shortplay.svg @@ -0,0 +1,26 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M3.28234 9.44915C3.28234 8.65385 3.92704 8.00915 4.72234 8.00915L18.60384 8.00915C19.3991 8.00915 20.04384 8.65385 20.04384 9.44915L20.04384 18.55642C20.04384 19.35168 19.3991 19.99642 18.60384 19.99642L4.72234 19.99642C3.92704 19.99642 3.28234 19.35168 3.28234 18.55642L3.28234 9.44915z" + fill="#6D69E4ff"></path> + <path + d="M3.30774 6.48804C3.30774 5.77451 3.83026 5.16858 4.53603 5.06368L10.46851 4.18192C11.26406 4.06368 12.07267 4.06356 12.86813 4.18158L18.81648 5.06397C19.52246 5.1687 20.04518 5.77471 20.04518 6.48839L20.04518 8.03538L3.30774 8.03538L3.30774 6.48804z" + fill="#FDDE80ff"></path> + <path + d="M3.2646 18.55642L3.2646 8.01092L10.72051 8.01092C10.72051 10.45459 8.77914 15.92371 4.72764 15.92371C6.42906 15.92371 6.81611 17.75664 6.79081 19.16352C6.78217 19.64362 6.36905 19.99642 5.88889 19.99642L4.7046 19.99642C3.90932 19.99642 3.2646 19.35168 3.2646 18.55642z" + fill="#9796EDff"></path> + <path + d="M20.04586 18.55642L20.04586 8.01094L12.59002 8.01094C12.59002 10.45459 14.53133 15.92371 18.58282 15.92371C16.88141 15.92371 16.49434 17.75664 16.51968 19.16352C16.52832 19.64362 16.94141 19.99642 17.4216 19.99642L18.60586 19.99642C19.40112 19.99642 20.04586 19.35168 20.04586 18.55642z" + fill="#9796EDff"></path> + <path + d="M6.42128 8.02812L3.28242 8.02812L3.28242 16.0439C6.1361 16.0439 6.56402 10.70006 6.42128 8.02812z" + fill="#6D69E4ff"></path> + <path + d="M16.90704 8.02812L20.04586 8.02812L20.04586 16.0439C17.19216 16.0439 16.76429 10.70006 16.90704 8.02812z" + fill="#6D69E4ff"></path> + <path + d="M3.2646 15.24941L5.88621 15.24941C6.4164 15.24941 6.84621 15.6792 6.84621 16.20941L6.84621 16.20941C6.84621 16.73962 6.4164 17.16941 5.88621 17.16941L3.2646 17.16941L3.2646 15.24941z" + fill="#FDDE80ff"></path> + <path + d="M20.04586 15.24941L17.42016 15.24941C16.88995 15.24941 16.46016 15.6792 16.46016 16.20941L16.46016 16.20941C16.46016 16.73962 16.88995 17.16941 17.42016 17.16941L20.04586 17.16941L20.04586 15.24941z" + fill="#FDDE80ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/sports.svg b/assets/zone_v2_icon/sports.svg new file mode 100644 index 0000000..70f6360 --- /dev/null +++ b/assets/zone_v2_icon/sports.svg @@ -0,0 +1,8 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M11.96112 11.90266L12.51312 12.57888C12.73104 12.84586 12.83904 13.18579 12.81494 13.52957C12.79085 13.87334 12.63658 14.19494 12.38362 14.4289L6.04611 20.28893C5.83904 20.48045 5.56644 20.58538 5.2844 20.58211C5.00236 20.57875 4.7323 20.46749 4.52977 20.27117C4.32434 20.07216 4.20036 19.80374 4.18199 19.51834C4.16362 19.23283 4.25216 18.95078 4.43037 18.7271L6.93946 15.57552L9.85382 11.91571C9.97968 11.7576 10.13942 11.62973 10.32115 11.54141C10.50298 11.45309 10.70227 11.40653 10.90435 11.40528C11.10643 11.40403 11.3063 11.4481 11.48918 11.53411C11.67206 11.62022 11.83334 11.74618 11.96112 11.90266z" + fill="#1F9F81ff"></path> + <path + d="M16.60733 3.48445C17.30227 3.48483 17.97043 3.75239 18.47347 4.23176C18.97651 4.71111 19.27603 5.36557 19.30992 6.05964C19.34381 6.75371 19.10957 7.43424 18.65558 7.96035C18.2017 8.48647 17.56282 8.81788 16.87123 8.88599L18.26746 9.94675C18.36806 10.02369 18.50237 10.0373 18.61651 9.98345L20.31802 9.18298C20.5559 9.07102 20.82662 9.05058 21.07862 9.12555C21.33053 9.20052 21.54614 9.36564 21.6841 9.58942C21.82022 9.81035 21.86755 10.07472 21.81638 10.32912C21.76522 10.58362 21.61939 10.80912 21.40838 10.96022L18.49757 13.0463C18.27658 13.2047 18.01296 13.29283 17.74118 13.29926C17.46931 13.3057 17.20186 13.23014 16.97357 13.0824L15.44717 12.09437L14.42717 13.19837L16.05888 15.12403C16.09757 15.16934 16.13309 15.21725 16.16544 15.26726L16.21037 15.34358C16.38432 15.6576 16.42637 16.02787 16.3273 16.37299C16.22822 16.71802 15.9961 17.00957 15.68208 17.18352L11.24246 19.64112C10.98701 19.78234 10.6872 19.82035 10.40458 19.7473C10.12205 19.67424 9.87821 19.49568 9.72317 19.24829C9.56556 18.99667 9.50644 18.69571 9.55721 18.4031C9.60797 18.11059 9.76512 17.84707 9.9983 17.66333L12.43757 15.74112L9.98122 14.16269L9.9457 14.13898C9.93869 14.13437 9.93178 14.12966 9.92496 14.12486L9.60547 13.95917C9.44086 13.87421 9.29545 13.75632 9.17823 13.6129C9.06103 13.46938 8.9745 13.30339 8.92404 13.12512C8.87357 12.94694 8.86022 12.76022 8.88483 12.57658C8.90943 12.39293 8.97147 12.21638 9.06708 12.0577L10.72368 9.31018L10.01366 8.9907C9.96048 8.96686 9.90202 8.95716 9.84403 8.96255C9.78595 8.96794 9.73027 8.98823 9.68237 9.02147L7.82232 10.30646C7.60337 10.45786 7.338 10.52707 7.07301 10.50182C6.80803 10.47658 6.56048 10.35859 6.37402 10.16861C6.28791 10.08096 6.22047 9.97679 6.17576 9.86235C6.13105 9.74791 6.10999 9.62558 6.11386 9.50278C6.11773 9.37997 6.14645 9.25923 6.19828 9.14782C6.25011 9.03642 6.32398 8.93669 6.41543 8.85463L9.38007 6.1935C9.55734 6.03445 9.77347 5.925 10.00656 5.87618C10.23965 5.82735 10.48147 5.8409 10.70765 5.91543L14.02493 7.00758C13.89667 6.60188 13.86595 6.17168 13.93507 5.75185C14.00419 5.33202 14.17133 4.93441 14.42285 4.59125C14.67437 4.24808 15.00326 3.96903 15.38275 3.77674C15.76234 3.58444 16.18186 3.4843 16.60733 3.48445L16.60733 3.48445z" + fill="#57D587ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/tech.svg b/assets/zone_v2_icon/tech.svg new file mode 100644 index 0000000..9874d4e --- /dev/null +++ b/assets/zone_v2_icon/tech.svg @@ -0,0 +1,23 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M12.02688 16.19126L9.47718 16.19126L8.48827 20.24736C8.41458 20.54966 8.64349 20.84102 8.95461 20.84102L12.02688 20.84102L15.09946 20.84102C15.41059 20.84102 15.63955 20.54966 15.56582 20.24736L14.57693 16.19126L12.02688 16.19126z" + fill="#FDDE80ff"></path> + <path + d="M12.0265 5.11161C11.68627 5.11161 11.40749 4.83518 11.40749 4.49694L11.40749 2.92935C11.40749 2.59111 11.68627 2.31468 12.0265 2.31468C12.36662 2.31468 12.6455 2.59111 12.6455 2.92935L12.6455 4.49694C12.6455 4.83518 12.36662 5.11161 12.0265 5.11161z" + fill="#00B9E7ff"></path> + <path + d="M5.44948 12.45869L5.44948 10.1089C5.44948 6.51677 8.40948 3.57738 12.02678 3.57738C15.64464 3.57738 18.60461 6.51677 18.60461 10.1089L18.60461 12.45869C18.60461 12.81619 18.31267 13.10611 17.95267 13.10611L6.1014 13.10611C5.74138 13.10611 5.44948 12.81619 5.44948 12.45869z" + fill="#00B9E7ff"></path> + <path + d="M18.30816 16.26451L5.74677 16.26451C4.34618 16.26451 3.20062 15.15648 3.20062 13.80269C3.20062 12.44851 4.34618 11.34048 5.74677 11.34048L18.30816 11.34048C19.7088 11.34048 20.85427 12.44851 20.85427 13.80269C20.85427 15.15648 19.7088 16.26451 18.30816 16.26451z" + fill="#59E1F9ff"></path> + <path + d="M18.0864 13.80269C18.0864 14.2633 17.71018 14.63683 17.2463 14.63683C16.78205 14.63683 16.40621 14.2633 16.40621 13.80269C16.40621 13.34208 16.78205 12.96845 17.2463 12.96845C17.71018 12.96845 18.0864 13.34208 18.0864 13.80269z" + fill="#00B9E7ff"></path> + <path + d="M7.64822 13.80259C7.64822 14.2632 7.272 14.63683 6.80816 14.63683C6.3439 14.63683 5.9681 14.2632 5.9681 13.80259C5.9681 13.34198 6.3439 12.96835 6.80816 12.96835C7.272 12.96835 7.64822 13.34198 7.64822 13.80259z" + fill="#00B9E7ff"></path> + <path + d="M12.91315 13.8025C12.91315 14.2631 12.53693 14.63674 12.07315 14.63674C11.6089 14.63674 11.23306 14.2631 11.23306 13.8025C11.23306 13.34189 11.6089 12.96826 12.07315 12.96826C12.53693 12.96826 12.91315 13.34189 12.91315 13.8025z" + fill="#00B9E7ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/travel.svg b/assets/zone_v2_icon/travel.svg new file mode 100644 index 0000000..e2891a1 --- /dev/null +++ b/assets/zone_v2_icon/travel.svg @@ -0,0 +1,26 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M7.28637 20.13062C7.28637 19.42819 7.85893 18.85872 8.56137 18.85872C9.2638 18.85872 9.83635 19.42819 9.83635 20.13062C9.83635 20.83306 9.2638 21.40253 8.56137 21.40253C7.85893 21.40253 7.28637 20.83306 7.28637 20.13062z" + fill="#59E1F9ff"></path> + <path + d="M14.51731 20.13062C14.51731 19.42819 15.08986 18.85872 15.79229 18.85872C16.49472 18.85872 17.06726 19.42819 17.06726 20.13062C17.06726 20.83306 16.49472 21.40253 15.79229 21.40253C15.08986 21.40253 14.51731 20.83306 14.51731 20.13062z" + fill="#59E1F9ff"></path> + <path + d="M9.77107 3.69966C9.29394 3.69966 8.90712 4.08648 8.90712 4.56366L8.90712 9.36919L7.75512 9.36919L7.75512 4.56366C7.75512 3.45025 8.65771 2.54766 9.77107 2.54766L14.35613 2.54766C15.46954 2.54766 16.37213 3.45025 16.37213 4.56366L16.37213 9.63337L15.22013 9.63337L15.22013 4.56366C15.22013 4.08648 14.83325 3.69966 14.35613 3.69966L9.77107 3.69966z" + fill="#59E1F9ff"></path> + <path + d="M7.37112 4.56367C7.37112 3.23819 8.44563 2.16366 9.77107 2.16366L14.35613 2.16366C15.6816 2.16366 16.75613 3.23818 16.75613 4.56366L16.75613 10.01737L14.83613 10.01737L14.83613 4.56366C14.83613 4.29856 14.62118 4.08366 14.35613 4.08366L9.77107 4.08366C9.50603 4.08366 9.29112 4.29856 9.29112 4.56367L9.29112 9.7532L7.37112 9.7532L7.37112 4.56367zM9.77107 2.93166C8.86979 2.93166 8.13912 3.66233 8.13912 4.56367L8.13912 8.9852L8.52312 8.9852L8.52312 4.56367C8.52312 3.87442 9.08187 3.31566 9.77107 3.31566L14.35613 3.31566C15.04541 3.31566 15.60413 3.87441 15.60413 4.56366L15.60413 9.24937L15.98813 9.24937L15.98813 4.56366C15.98813 3.66233 15.25747 2.93166 14.35613 2.93166L9.77107 2.93166z" + fill="#59E1F9ff"></path> + <path + d="M9.77146 4.03555C9.47984 4.03555 9.24345 4.27194 9.24345 4.56355L9.24345 4.80656C9.24345 5.31025 8.83513 5.71857 8.33145 5.71857C7.82776 5.71857 7.41945 5.31025 7.41945 4.80656L7.41945 4.56355C7.41945 3.26458 8.47247 2.21155 9.77146 2.21155L14.35642 2.21155C15.65539 2.21155 16.70842 3.26458 16.70842 4.56355L16.70842 4.90056C16.70842 5.40424 16.30013 5.81256 15.79642 5.81256C15.2928 5.81256 14.88442 5.40424 14.88442 4.90056L14.88442 4.56355C14.88442 4.27194 14.64806 4.03555 14.35642 4.03555L9.77146 4.03555z" + fill="#59E1F9ff"></path> + <path + d="M5.11429 8.49827C5.11429 7.7029 5.75914 7.05815 6.55452 7.05827C10.23398 7.05876 13.91347 7.05902 17.59296 7.05831C18.38842 7.05816 19.03334 7.70292 19.03334 8.49836L19.03334 18.42451C19.03334 19.21978 18.3887 19.86451 17.59334 19.86451C13.91366 19.86451 10.23398 19.86451 6.55429 19.86451C5.75901 19.86451 5.11429 19.21978 5.11429 18.42451L5.11429 8.49827z" + fill="#00B9E7ff"></path> + <path + d="M8.86945 11.22643C8.86945 10.69622 9.29926 10.26643 9.82944 10.26643C10.35965 10.26643 10.78944 10.69622 10.78944 11.22643L10.78944 15.69638C10.78944 16.22659 10.35965 16.65638 9.82944 16.65638C9.29926 16.65638 8.86945 16.22659 8.86945 15.69638L8.86945 11.22643z" + fill="#FDDE80ff"></path> + <path + d="M13.35821 11.22643C13.35821 10.69622 13.788 10.26643 14.31821 10.26643C14.84842 10.26643 15.27821 10.69622 15.27821 11.22643L15.27821 15.69638C15.27821 16.22659 14.84842 16.65638 14.31821 16.65638C13.788 16.65638 13.35821 16.22659 13.35821 15.69638L13.35821 11.22643z" + fill="#FDDE80ff"></path> +</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/vlog.svg b/assets/zone_v2_icon/vlog.svg new file mode 100644 index 0000000..bb8343d --- /dev/null +++ b/assets/zone_v2_icon/vlog.svg @@ -0,0 +1,26 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> + <path + d="M19.21968 13.77802C19.42733 13.68547 19.56115 13.47936 19.56115 13.25194L19.56115 10.74586L20.71315 9.59381L20.71315 14.2224C20.71315 14.90957 20.30602 15.53146 19.67616 15.80621L13.80115 18.3696L10.51142 17.65949L19.21968 13.77802z" + fill="#6D69E4ff"></path> + <path + d="M19.56115 10.74586L20.71315 10.74586L20.71315 11.32186C20.71315 11.6399 20.4552 11.89786 20.13715 11.89786L19.56115 11.89786L19.56115 10.74586z" + fill="#6D69E4ff"></path> + <path + d="M18.40877 7.866C18.40877 7.54788 18.66662 7.29 18.98477 7.29L20.13677 7.29C20.45491 7.29 20.71277 7.54788 20.71277 7.866L20.71277 10.74595C20.71277 11.0641 20.45491 11.32195 20.13677 11.32195L18.98477 11.32195C18.66662 11.32195 18.40877 11.0641 18.40877 10.74595L18.40877 7.866z" + fill="#6D69E4ff"></path> + <path + d="M17.54477 3.8339L5.44875 3.8339C4.65346 3.8339 4.00875 4.47862 4.00875 5.2739L4.00875 12.76195C4.00875 13.55722 4.65347 14.20195 5.44875 14.20195L17.54477 14.20195C18.34003 14.20195 18.98477 13.55722 18.98477 12.76195L18.98477 5.2739C18.98477 4.47862 18.34003 3.8339 17.54477 3.8339z" + fill="#6D69E4ff"></path> + <path + d="M6.31312 6.13781C6.31312 5.50158 6.82889 4.98581 7.46512 4.98581L14.95315 4.98581C15.58934 4.98581 16.10515 5.50158 16.10515 6.13781L16.10515 11.89786C16.10515 12.53405 15.58934 13.04986 14.95315 13.04986L7.46512 13.04986C6.82889 13.04986 6.31312 12.53405 6.31312 11.89786L6.31312 6.13781z" + fill="#FDDE80ff"></path> + <path + d="M9.76877 7.50189C9.76877 7.04184 10.2815 6.76744 10.66426 7.02263L13.08182 8.63436C13.42387 8.86236 13.42387 9.36489 13.08182 9.59289L10.66426 11.20464C10.2815 11.45981 9.76877 11.18544 9.76877 10.72531L9.76877 7.50189z" + fill="#6D69E4ff"></path> + <path + d="M10.34515 16.50586C10.34515 15.7105 10.98989 15.06586 11.78515 15.06586L13.51315 15.06586C14.30842 15.06586 14.95315 15.7105 14.95315 16.50586L14.95315 19.09786C14.95315 19.89312 14.30842 20.53786 13.51315 20.53786L11.78515 20.53786C10.98989 20.53786 10.34515 19.89312 10.34515 19.09786L10.34515 16.50586z" + fill="#6D69E4ff"></path> + <path + d="M10.34515 17.8895L14.95315 17.8895L14.95315 18.8495L10.34515 18.8495L10.34515 17.8895z" + fill="#9796EDff"></path> +</svg> \ No newline at end of file diff --git a/audio/music_list.md b/audio/music_list.md deleted file mode 100644 index 01c5503..0000000 --- a/audio/music_list.md +++ /dev/null @@ -1,300 +0,0 @@ -# 歌单&音频收藏夹详细信息 - -- [歌单&音频收藏夹详细信息](#歌单音频收藏夹详细信息) - - [查询自己创建的歌单](#查询自己创建的歌单) - - [查询音频收藏夹(默认歌单)信息](#查询音频收藏夹默认歌单信息) - -- [歌单&音频收藏夹详细信息](#歌单音频收藏夹详细信息) - - [查询自己创建的歌单](#查询自己创建的歌单) - - [查询音频收藏夹(默认歌单)信息](#查询音频收藏夹默认歌单信息) - ---- - -## 查询自己创建的歌单 - -> http://www.bilibili.com/audio/music-service-c/web/collections/list - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式: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 'http://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> - -## 查询音频收藏夹(默认歌单)信息 - -> http://www.bilibili.com/audio/music-service-c/web/collections/info - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式: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 'http://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> - - diff --git a/bangumi/info.md b/bangumi/info.md deleted file mode 100644 index 2f7fa5b..0000000 --- a/bangumi/info.md +++ /dev/null @@ -1,422 +0,0 @@ -# 剧集基本信息 - -- [剧集基本信息(mdid方式)](#剧集基本信息(mdid方式)) -- [获取剧集明细(web端)(ssid/epid方式)](#获取剧集明细(web端)(ssid/epid方式)) - ---- - -## 剧集基本信息(mdid方式) - - -> http://api.bilibili.com/pgc/review/user - -*请求方式:GET* - -鉴权方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | ---- | -| media_id | str | 剧集mdid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:错误 | -| message | str | 错误信息 | 默认为success | -| result | obj | 信息本体 | | - -`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | ---------------- | -| media | obj | 剧集信息 | | -| review | obj | 用户操作信息 | 仅登录时存在此项 | - -`result`中的`media`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------------- | -------------------------- | -| areas | array | 地区 | | -| cover | str | 封面图片url | | -| media_id | num | 剧集mdid | | -| new_ep | obj | 最新一话信息 | | -| rating | obj | 评分信息 | | -| season_id | int | 剧集ssid | | -| share_url | url | 剧集详情页连接 | | -| title | str | 标题 | | -| type_name | str | 剧集类型 | `番剧`、`国创`、`电影`等等 | - -`media`中的`areas`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 地区信息1 | | -| n | obj | 地区信息(n+1) | | -| …… | obj | …… | | - -`areas`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ------------------------------------------------------------ | -| id | num | 所属地区编号 | 1:中国大陆<br />2:日本<br />3:美国<br />4:英国<br />6:中国香港<br />8:韩国<br />9:法国<br />10:泰国<br />13:西班牙<br />15:德国<br />35:意大利<br />39:新西兰<br />43:澳大利亚 | -| name | str | 所属地区名称 | | - -`media`中的`new_ep`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------------- | -------------------------- | -| id | int | 最新一话的epid | | -| index | str | 最新一话名称 | | -| index_show | str | 最新一话显示名称 | eg. `第1话`、`更新至第4话` | - -`media`中的`rating`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | ---- | -| count | num | 总计评分人数 | | -| score | num | 评分 | | - -`result`中的`review`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---- | ------------ | -| is_coin | num | 0 | 作用尚不明确 | -| is_open | num | 1 | 作用尚不明确 | - -**示例:** - -查询剧集`md28220978`的基本信息 - -```shell -curl -G 'http://api.bilibili.com/pgc/review/user' \ ---data-urlencode 'media_id=28220978' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "success", - "result": { - "media": { - "areas": [ - { - "id": 2, - "name": "日本" - } - ], - "cover": "http://i0.hdslb.com/bfs/bangumi/8aa0bfce050c72c6626b63d3093a88527c251026.jpg", - "media_id": 28220978, - "new_ep": { - "id": 21278, - "index": "14", - "index_show": "全14话" - }, - "rating": { - "count": 53376, - "score": 9.9 - }, - "season_id": 1172, - "share_url": "https://www.bilibili.com/bangumi/media/md28220978", - "title": "轻音少女 第一季", - "type_name": "番剧" - }, - "review": { - "is_coin": 0, - "is_open": 1 - } - } -} -``` - -</details> - -## 获取剧集明细(web端)(ssid/epid方式) - -> http://api.bilibili.com/pgc/view/web/season - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------------ | ------------------------ | -| season_id | num | 番剧ssid | 必要(可选) | season_id与ep_id任选其一 | -| ep_id | num | 剧集epid | 必要(可选) | season_id与ep_id任选其一 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------- | -| code | num | 返回值 | 0:成功<br />-404:错误 | -| message | str | 错误信息 | 默认为success | -| ttl | num | 1 | 作用尚不明确 | -| result | obj | 信息本体 | | - -`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ------ | -------------------------- | ------------------------------------------ | -| activity | obj | 参与的活动 | | -| alias | str | 空 | 作用尚不明确 | -| bkg_cover | str | 网页背景图片url | 无则为空 | -| cover | str | 剧集封面图片url | | -| episodes | array | 正片剧集列表 | | -| evaluate | str | 简介 | | -| jp_title | str | 空 | 作用尚不明确 | -| link | str | 简介页面url | | -| media_id | num | 剧集mdid | | -| mode | num | 2 | 作用尚不明确 | -| new_ep | obj | 更新信息 | | -| payment | obj | 会员&付费信息 | 若无相关内容则无此项 | -| positive | obj | | | -| publish | obj | 发布信息 | | -| rating | obj | 评分信息 | 若无相关内容则无此项 | -| record | str | 备案号 | 无则为空 | -| rights | obj | 属性标志信息 | | -| season_id | num | 番剧ssid | | -| season_title | str | 剧集标题 | | -| seasons | array | 同系列所有季信息 | | -| section | array | 花絮、PV、番外等非正片内容 | 若无相关内容则无此项 | -| series | obj | 系列信息 | | -| share_copy | str | 《{标题}》+{备注} | | -| share_sub_title | str | 备注 | | -| share_url | str | 番剧播放页面url | | -| show | obj | 网页全屏标志 | | -| square_cover | str | 方形封面图片url | | -| stat | obj | 状态数 | | -| status | num | | | -| subtitle | str | 剧集副标题 | | -| title | str | 剧集标题 | | -| total | num | 总计正片集数 | 未完结:大多为-1<br />已完结:正整数 | -| type | num | 剧集类型 | 1:番剧<br />2:电影<br />3:纪录片<br />4:国创<br />5:电视剧<br />7:综艺 | -| up_info | obj | UP主信息 | 若无相关内容则无此项 | - -`result`中的`activity`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | ------------ | -| head_bg_url | str | 空 | 作用尚不明确 | -| id | num | 活动id | | -| title | str | 活动标题 | | - -`result`中的`episodes`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------ | -| 0 | obj | 正片第1集 | | -| n | obj | 正片第(n+1)集 | 按照顺序排列 | -| …… | obj | | | - -`episodes`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | --------------------------------- | -------------------- | -| aid | num | 单集稿件avid | | -| badge | str | 标签文字 | 例如`会员`、`限免`等 | -| badge_info | obj | | | -| badge_type | num | | | -| bvid | str | 单集稿件bvid | | -| cid | num | 视频cid | | -| cover | str | 单集封面url | | -| dimension | obj | 分辨率信息 | | -| from | str | | | -| id | num | 单集epid | | -| link | str | 单集网页url | | -| long_title | str | 单集完整标题 | | -| pub_time | num | 发布时间 | 时间戳 | -| pv | num | 0 | 作用尚不明确 | -| release_date | str | 空 | 作用尚不明确 | -| rights | obj | | | -| share_copy | str | 《{标题}》+第n话+{单集完整标题} | | -| share_url | str | 单集网页url | | -| short_link | str | 单集网页url短链接 | | -| status | num | | | -| subtitle | str | 单集副标题 | 观看次数文字 | -| title | str | 单集标题 | | -| vid | str | 单集vid | vupload_+{cid} | - - - - - - - -`result`中的`new_ep`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | ---------------- | -| desc | str | 更新备注 | | -| id | num | 最新一话epid | | -| is_new | num | 是否最新发布 | 0:否<br />1:是 | -| title | str | 最新一话标题 | | - -`result`中的`payment`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | ---- | ---- | -| discount | num | | | -| pay_type | obj | | | -| price | str | | | -| promotion | str | | | -| tip | str | | | -| vip_discount | num | | | -| vip_first_promotion | str | | | -| vip_promotion | str | | | - - - -`result`中的`positive`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---- | ---- | -| id | num | | | -| title | str | | | - -`result`中的`publish`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ---------------- | ------------------------ | -| is_finish | num | 完结状态 | 0:未完结<br />1:已完结 | -| is_started | num | 是否发布 | 0:未发布<br />1:已发布 | -| pub_time | str | 发布时间 | YYYY-MM-DDD hh:mm:ss | -| pub_time_show | str | 发布时间文字介绍 | | -| unknow_pub_date | num | 0 | 作用尚不明确 | -| weekday | num | 0 | 作用尚不明确 | - -`result`中的`rating`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | ---- | -| count | num | 总计评分人数 | | -| score | num | 评分 | | - -`result`中的`rights`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | -------- | ------------------------------- | -| allow_bp | num | | | -| allow_bp_rank | num | | | -| allow_download | num | | | -| allow_review | num | | | -| area_limit | num | | | -| ban_area_show | num | | | -| can_watch | num | | | -| copyright | str | 版权标志 | bilibili:授权<br />dujia:独家 | -| forbid_pre | num | | | -| is_cover_show | num | | | -| is_preview | num | | | -| only_vip_download | num | | | -| resource | str | | | -| watch_platform | num | | | - -`result`中的`seasons`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ------------ | -| 0 | obj | 同系列剧集1 | | -| n | obj | 同系列剧集(n+1) | 按照顺序排列 | -| …… | obj | | | - -`seasons`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---- | ---- | -| badge | str | | | -| badge_info | obj | | | -| badge_type | num | | | -| cover | str | | | -| media_id | str | | | -| new_ep | num | | | -| season_id | obj | | | -| season_title | num | | | -| season_type | str | | | -| stat | obj | | | - - - - - - - - - -`result`中的`section`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ------------ | -| 0 | obj | 其他内容块1 | | -| n | obj | 其他内容块(n+1) | 按照顺序排列 | -| …… | obj | | | - -`section`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---- | -| episode_id | num | 0 | | -| episodes | array | 板块内容 | | -| id | num | 板块id? | | -| title | str | 板块标题 | | -| type | num | ? | | - - - - - - - - - - - -`result`中的`series`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------ | ---- | -| series_id | num | 系列id | | -| series_title | str | 系列名 | | - -`result`中的`show`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | -------------------- | -| wide_screen | num | 是否全屏 | 0:正常<br />1:全屏 | - -`result`中的`stat`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------ | ---- | -| coins | num | 投币数 | | -| danmakus | num | 弹幕数 | | -| favorites | num | 收藏数 | | -| likes | num | 点赞数 | | -| reply | num | 评论数 | | -| share | num | 分享数 | | -| views | num | 播放数 | | - -`result`中的`up_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ----------- | ---- | -| avatar | str | 头像图片url | | -| follower | num | 粉丝数 | | -| is_follow | num | 0 | | -| mid | num | UP主mid | | -| pendant | obj | | | -| theme_type | num | 0 | | -| uname | str | UP主昵称 | | -| verify_type | num | | | -| vip_status | num | | | -| vip_type | num | | | - -## diff --git a/blackroom/jury/base_info.md b/blackroom/jury/base_info.md deleted file mode 100644 index 1646207..0000000 --- a/blackroom/jury/base_info.md +++ /dev/null @@ -1,254 +0,0 @@ -# 风纪委员会用户基本信息 - -- [基本数据](#基本数据) -- [统计信息](#统计信息) -- [检查申请风纪委员会资格](#检查申请风纪委员会资格) - ---- - -## 基本数据 - -> http://api.bilibili.com/x/credit/jury/jury - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | object | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------------------- | ---------------------------- | -| caseTotal | num | 总众裁数 | | -| face | str | 用户头像url | | -| restDays | num | 当前资格剩余天数 | | -| rightRadio | num | 当前裁决正确率百分比 | 裁决数小于3时固定为50 | -| status | num | 当前状态 | 1:具有资格<br />2:资格失效 | -| uname | str | 用户昵称 | | - -**示例:** - -Cookie方式: - -```shell -curl 'http://api.bilibili.com/x/credit/jury/jury' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'http://api.bilibili.com/x/credit/jury/jury' \ ---data-urlencode 'access_key=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "caseTotal": 7, - "face": "http://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "restDays": 30, - "rightRadio": 80, - "status": 1, - "uname": "社会易姐QwQ" - } -} -``` - -</details> - -## 统计信息 - -> http://api.bilibili.com/x/credit/jury/kpi - -*方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**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 | 尚不明确 | | -| 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 'http://api.bilibili.com/x/credit/jury/kpi' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'http://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> - -## 检查申请风纪委员会资格 - -> http://api.bilibili.com/x/credit/jury/requirement - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -只有用户会员等级≥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 'http://api.bilibili.com/x/credit/jury/requirement' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'http://api.bilibili.com/x/credit/jury/requirement' \ ---data-urlencode 'access_key=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "blocked": false, - "cert": true, - "level": true, - "rule": true - } -} -``` - -</details> diff --git a/clientinfo/client_info.md b/clientinfo/client_info.md deleted file mode 100644 index a268a03..0000000 --- a/clientinfo/client_info.md +++ /dev/null @@ -1,95 +0,0 @@ -# 终端信息查询 - -- [终端信息查询](#终端信息查询) - ---- - -## 终端信息查询 - -> http://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 'http://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> - diff --git a/clientinfo/ip.md b/clientinfo/ip.md deleted file mode 100644 index b2add2b..0000000 --- a/clientinfo/ip.md +++ /dev/null @@ -1,66 +0,0 @@ -# 通过ip确定地理位置 - -- [通过ip确定位置](#通过ip确定位置) - ---- - -## 通过ip确定位置 - -> http://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 'http://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> diff --git a/danmaku/danmaku_proto.md b/danmaku/danmaku_proto.md deleted file mode 100644 index f2b4625..0000000 --- a/danmaku/danmaku_proto.md +++ /dev/null @@ -1,107 +0,0 @@ -# protobuf弹幕 - -2020年5月23日,哔哩哔哩网页端及移动端启用了新的默认弹幕api,网页端弹幕显示的上限变为原弹幕池上限的两倍。 - -新的api是以6分钟为一个单位加载,即每次加载6分钟内的弹幕 - -- [获取实时弹幕](#获取实时弹幕) - ---- - -## 获取实时弹幕 - -> http://api.bilibili.com/x/v2/dm/web/seg.so (web端) -> -> http://api.bilibili.com/x/v2/dm/list/seg.so (APP端) -> -> http://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回复:** - -porto定义见:[bilibili.community.service.dm.v1.DmSegMobileReply](../grpc_api/bilibili/community/service/dm/v1.proto) - -消息`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 />9:BAS弹幕(仅限于特殊弹幕专包) | -| 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 = 'http://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 -``` - diff --git a/docs/APP_widget/splash.md b/docs/APP_widget/splash.md new file mode 100644 index 0000000..2a3179c --- /dev/null +++ b/docs/APP_widget/splash.md @@ -0,0 +1,567 @@ +# 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 />-3:API校验密匙错误<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的图片为: + +<img src="https://i0.hdslb.com/bfs/archive/fe737da5cdedf9dad038e5fd30e957be8a063bc2.png" referrerpolicy="no-referrer" /> + + +## 获取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 />-3:API校验密匙错误<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> diff --git a/docs/APP_widget/ver.md b/docs/APP_widget/ver.md new file mode 100644 index 0000000..3296c87 --- /dev/null +++ b/docs/APP_widget/ver.md @@ -0,0 +1,236 @@ +# 获取最新 APP 版本 + +## 获取版本信息 + +> https://app.bilibili.com/x/v2/version + +*请求方法: GET* + +<!--{ + "from": { + "url": "https://app.bilibili.com/" + } +}--> + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| mobi_app | str | 目标客户端类型 | 不必要 | 留空为最新有更新的平台<br />android: Android 版<br />iphone: iPhone 版<br />ipad: iPad HD 版<br />win: UWP 版<br />android_tv_yst: TV 版<br />android_car: 车机版<br />pc_client: PC 客户端 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | int | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 `0` | +| ttl | int | 1 | | +| data | array | 版本信息列表 | | + +`data` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| plat | int | 平台 | 0: Android<br />1: iPhone<br />2: iPad HD<br />3: UWP<br />12: TV 版<br />35: 车机版<br />40: PC 客户端 | +| desc | str | 版本描述 | | +| version | str | 版本号 | | +| build | int | 内部版本号 | | + +**示例:** + +```shell +curl -G 'https://app.bilibili.com/x/v2/version' \ +--url-query'mobi_app=android' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "plat": 0, + "desc": "-修复了一些bug,切了个大西瓜~", + "version": "8.9.0", + "build": 8090300, + "ptime": 1723612377 + }, + // ... + { + "plat": 0, + "desc": "[修正]横屏状态下,视频列表加载失败的问题\n[修正]超过48kHz采样率的音频无法播放的问题\n[修正]部分系统黑屏的问题\nPS:帮下面的同学祈祷早日上架", + "version": "2.0.4", + "build": 0, + "ptime": 1382630400 + } + ] +} +``` + +</details> + +## 版本升级 + +> https://app.bilibili.com/x/v2/version/fawkes/upgrade + +*请求方式: GET* + +鉴权方式(非必须):[APP API 签名与鉴权](../misc/sign/APP.md) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| - | - | - | - | - | +| abi | str | 设备 CPU ABI | 不必要 | 如 `arm64-v8a` | +| appid | str | 客户端类型 | 不必要 | 如 `tv.danmaku.bili` | +| brand | str | 设备品牌 | 不必要 | 如 `google` | +| build | int | 当前 APP 版本号 | 必要 | 如 `8000200` | +| channel | str | APP 分发渠道 | 必要 | 如 `master` | +| deviceid | str | 设备唯一 ID | 不必要 | 即 XU-Prefixed BUVID,见 [device_identity](../misc/device_identity.md) | +| env | str | APP 分发环境 | 不必要 | 默认 `prod` | +| iv | int | 当前 APP innerVer | 不必要 | 如 `8000210` | +| mobi_app | str | APP mobi_app | 必要 | 如 `android` | +| model | str | 设备型号 | 不必要 | 如 `Pixel 2 XL` | +| nt | str | - | 必要 | 默认 `1` | +| ov | str | 设备 OS 版本 | 必要 | 安卓即 API Level,如 Android 11 为 `30` | +| platform | str | 设备平台 | 不必要 | 如 `android` | +| screen | str | 设备屏幕参数 | 不必要 | 如 `2712_1440@537.882_537.882` +| sn | int | 当前 APP SN | 必要 | 如 `15088473` | +| vn | str | 当前 APP 版本名称 | 必要 | 如 `8.0.0` | + +**标头参数(Headers):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| - | - | - | - | - | +| app-key | str | APPKey 名称 | 必要 | 大体等同于 [`mobi_app`](../misc/sign/APPKey.md)。特别地:64 位版本粉版客户端应为 `android64` | +| buvid | str | BUVID | 必要 | XU-Prefixed BUVID,见 [device_identity](../misc/device_identity.md) | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| code | int | 返回值 | 0: 成功<br />-304: 木有改动<br />-400: 请求异常 | +| message | str | 错误信息 | 默认为 `0` | +| ttl | int | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| title | str | 标题 | | +| content | str | 内容 | | +| version | str | 最新版本名称 | | +| version_code | int | 最新版本号 | 即 `build` | +| url | str | 下载地址 | | +| size | int | 大小 | 单位字节 | +| md5 | str | MD5 值 | | +| silent | int | 是否静默安装? | | +| upgrade_type | int | 升级类型? | | +| cycle | int | 升级周期? | | +| policy | int | 升级策略? | | +| policy_url | str | 升级策略链接? | | +| ptime | int | 发布时间 | | + +**示例:** + +```shell +curl -G 'https://app.bilibili.com/x/v2/version/fawkes/upgrade' \ +--url-query 'build=1145141' \ +--url-query 'channel=apt' \ +--url-query 'mobi_app=android' \ +--url-query 'nt=awa' \ +--url-query 'ov=qwq' \ +--url-query 'platform=archlinux' \ +--url-query 'sn=919810' \ +--url-query 'vn=!!!' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "title": "升级提醒", + "content": "-修复了一些bug,并吃了一桶冰淇凌~\n-记得检查暑假作业哦!", + "version": "8.10.0", + "version_code": 8100300, + "url": "https://dl.hdslb.com/mobile/pack/android64/15793300/iBiliPlayer-apinkRelease-8.10.0-b15793300.apk", + "size": 132432843, + "md5": "f196c0ea68ff894dab0cf380cafad802", + "silent": 0, + "upgrade_type": 1, + "cycle": 4, + "policy": 0, + "policy_url": "", + "is_gray": 0, + "ptime": 1724207041 + } +} +``` + +</details> + +## 拼接最新版本下载地址 + +> https://api.bilibili.com/x/web-frontend/getappversion + +*请求方法: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---- | ---- | ---- | ---- | ---- | +| target | string | 目标平台 | 目测仅 `pc_electron`, 错误的值会导致返回 `HTTP 404` | +| cdn_url | string | CDN URL | 任意字符串, 默认 `https://dl.hdslb.com/mobile/fixed/bili_win/bili_win-install.exe` | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| code | number | 返回值 | 0: 成功<br />-1: need target | +| message | string | 错误消息 | 成功时无此项 | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| cdn_url | string | CDN URL | 内容同请求参数 `cdn_url` | +| sole_cdn_url | string | 带版本的 CDN URL | `cdn_url + "?v=" + 最新版本` | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/web-frontend/getappversion' \ +--url-query 'target=pc_electron' \ +--url-query 'cdn_url=https://dl.hdslb.com/mobile/fixed/bili_win/bili_win-install.exe' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "data": { + "cdn_url": "https://dl.hdslb.com/mobile/fixed/bili_win/bili_win-install.exe", + "sole_cdn_url": "https://dl.hdslb.com/mobile/fixed/bili_win/bili_win-install.exe?v=1.16.1-2" + } +} +``` + +</details> diff --git a/docs/activity/info.md b/docs/activity/info.md new file mode 100644 index 0000000..ddf2f68 --- /dev/null +++ b/docs/activity/info.md @@ -0,0 +1,93 @@ +# 活动主题信息 + +## 主题信息 + +> https://api.bilibili.com/x/activity/subject/info + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| - | - | - | - | - | +| sid | num | 活动 id | 必要 | | +| bvid | str | 来源视频 bvid | 非必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| code | num | 返回值 | 0: 成功<br />-400: 请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| id | num | 活动 id | | +| oid | num | 0 | | +| type | num | 13 | | +| state | num | 1 | | +| stime | num | 开始时间 | UNIX 秒级时间戳 | +| etime | num | 结束时间 | UNIX 秒级时间戳 | +| ctime | num | 创建时间 | UNIX 秒级时间戳 | +| mtime | num | 修改时间 | UNIX 秒级时间戳 | +| name | str | 活动名称 | | +| act_url | str | 活动链接 | | +| lstime | num | ? | 作用尚不明确 | +| letime | num | ? | 作用尚不明确 | +| cover | str | 封面图片 | | +| dic | str | 简介 | | +| h5_cover | str | H5 封面 | | +| android_url | str | Android 端活动链接 | | +| ios_url | str | iOS 端活动链接 | | +| child_sids | str | 子活动 id? | | +| calendar | str | 日历? | 空 或 `{}`? | +| lid | num | ? | 仅在传入 bvid 时存在 | + +**示例:** + +```shell +curl -G --url 'https://api.bilibili.com/x/activity/subject/info' \ +--url-query 'sid=4017552' \ +--url-query 'bvid=BV1mKY4e8ELy' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "id": 4017552, + "oid": 0, + "type": 13, + "state": 1, + "stime": 1720540800, + "etime": 1728575999, + "ctime": 1720439769, + "mtime": 1720591285, + "name": "科技猎手2024第2季", + "act_url": "https://www.bilibili.com/blackboard/era/kejilieshou2PC.html", + "lstime": 1720540800, + "letime": 1728575999, + "cover": "https://i0.hdslb.com/bfs/activity-plat/static/98bc38873cc71e154019070975cd20a0/fLOEOStVUV.jpg", + "dic": "科技猎手召集中!投稿赢奖金>>", + "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/98bc38873cc71e154019070975cd20a0/PTIFsXkV0o.jpg", + "android_url": "https://www.bilibili.com/blackboard/era/kejilieshou2H5.html", + "ios_url": "https://www.bilibili.com/blackboard/era/kejilieshou2H5.html", + "child_sids": "", + "calendar": "", + "lid": 294258214 + } +} +``` + +</details> diff --git a/docs/activity/list.md b/docs/activity/list.md new file mode 100644 index 0000000..f187bd5 --- /dev/null +++ b/docs/activity/list.md @@ -0,0 +1,213 @@ +# 活动列表 + +## 获取活动列表 + +> https://api.bilibili.com/x/activity/page/list + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| plat | str | 活动平台类型? | 必要 | 可选范围 [1, 3], 以半角逗号分隔, 默认 `1,3` | +| mold | int | 0 | 非必要 | | +| http | int | 3 | 非必要 | | +| pn | int | 目标页码 | 非必要 | 默认为 `1` | +| ps | int | 每页条数 | 非必要 | 默认为 `15` | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| code | int | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | int | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| list | array | 活动列表 | | +| num | int | 当前页码 | | +| size | int | 每页条数 | | +| total | int | 总条数 | | + +`list` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| id | int | 活动 ID | | +| state | int | 1 | | +| stime | int | 开始时间 | UNIX 秒级时间戳 | +| etime | int | 结束时间 | UNIX 秒级时间戳 | +| ctime | int | 创建时间? | UNIX 秒级时间戳, 可能为 0 | +| mtime | int | 修改时间? | UNIX 秒级时间戳, 可能为 0 | +| name | str | 活动名称 | | +| author | str | 空 || +| pc_url | str | 空 || +| rank | int | 0 | | +| h5_url | str | 活动链接 | | +| pc_cover | str | 空 | | +| h5_cover | str | 活动封面 | | +| page_name | str | 页面名称 | | +| plat | int | 活动平台类型? | 即 URL 中 `plat` 参数 | +| desc | str | 活动描述 | | +| click | int | 0 | | +| type | int | 0 | | +| mold | int | 0 | | +| series | int | 0 | | +| dept | int | 0 | | +| reply_id | int | 0 | | +| tp_id | int | 0 | | +| ptime | int | 0 | | +| catalog | int | 0 | | +| creator | str | 空 | | +| spm_id | str | 空 | | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/activity/page/list' \ +--url-query 'plat=1,2,3' \ +--url-query 'ps=4' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "id": 207, + "state": 1, + "stime": 1723262400, + "etime": 1724774399, + "ctime": 0, + "mtime": 0, + "name": "原神fes2024", + "author": "", + "pc_url": "", + "rank": 0, + "h5_url": "https://www.bilibili.com/blackboard/era/DK8i0NS7fxwcLBgm.html", + "pc_cover": "", + "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/d32c2bb79f59192cb072d7bf79b61c6d/In2tYOLFTZ.png", + "page_name": "原神fes2024", + "plat": 2, + "desc": "", + "click": 0, + "type": 0, + "mold": 0, + "series": 0, + "dept": 0, + "reply_id": 0, + "tp_id": 0, + "ptime": 0, + "catalog": 0, + "creator": "", + "spm_id": "" + }, + { + "id": 210, + "state": 1, + "stime": 1723219200, + "etime": 1725983999, + "ctime": 0, + "mtime": 0, + "name": "暗区突围端游海外版全员夺金冲榜挑战赛", + "author": "", + "pc_url": "", + "rank": 0, + "h5_url": "https://www.bilibili.com/blackboard/era/UP8CZSTfboDVZuGr.html", + "pc_cover": "", + "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/f9a67e268d55d029e6b27d81246fc59a/LPN9dlcRlW.png", + "page_name": "暗区突围端游海外版全员夺金冲榜挑战赛", + "plat": 2, + "desc": "", + "click": 0, + "type": 0, + "mold": 0, + "series": 0, + "dept": 0, + "reply_id": 0, + "tp_id": 0, + "ptime": 0, + "catalog": 0, + "creator": "", + "spm_id": "" + }, + { + "id": 199, + "state": 1, + "stime": 1723089600, + "etime": 1725897599, + "ctime": 0, + "mtime": 0, + "name": "剑与远征:启程公测创作者激励", + "author": "", + "pc_url": "", + "rank": 0, + "h5_url": "https://www.bilibili.com/blackboard/era/HkHatvvW9nJZXEMh.html", + "pc_cover": "", + "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/7785e7ecb0434c85530b92e3586f32ff/CgKENr0ftC.jpeg", + "page_name": "剑与远征:启程公测创作者激励", + "plat": 2, + "desc": "", + "click": 0, + "type": 0, + "mold": 0, + "series": 0, + "dept": 0, + "reply_id": 0, + "tp_id": 0, + "ptime": 0, + "catalog": 0, + "creator": "", + "spm_id": "" + }, + { + "id": 203, + "state": 1, + "stime": 1723089600, + "etime": 1724255999, + "ctime": 0, + "mtime": 0, + "name": "王者荣耀新英雄少司缘创作激励", + "author": "", + "pc_url": "", + "rank": 0, + "h5_url": "https://www.bilibili.com/blackboard/era/g0gn2j4ZENrCLYLn.html", + "pc_cover": "", + "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/a99ba278036e9fbfa81b9100d13d9e7e/9UHZg6r0Y5.jpg", + "page_name": "王者荣耀新英雄少司缘创作激励", + "plat": 2, + "desc": "", + "click": 0, + "type": 0, + "mold": 0, + "series": 0, + "dept": 0, + "reply_id": 0, + "tp_id": 0, + "ptime": 0, + "catalog": 0, + "creator": "", + "spm_id": "" + } + ], + "num": 1, + "size": 4, + "total": 5391 + } +} +``` + +</details> diff --git a/album/action.md b/docs/album/action.md similarity index 90% rename from album/action.md rename to docs/album/action.md index 79d6240..1d42821 100644 --- a/album/action.md +++ b/docs/album/action.md @@ -1,14 +1,11 @@ # 相簿操作 -- [点赞相簿](#点赞相簿) -- [收藏相簿](#收藏相簿) -- [取消收藏相簿](#取消收藏相簿) +<details> +<summary>功能已下线</summary> ---- +## ~~点赞相簿~~ -## 点赞相簿 - -> http://api.vc.bilibili.com/link_draw/v2/Vote/operate +> https://api.vc.bilibili.com/link_draw/v2/Vote/operate *请求方式:POST* @@ -44,7 +41,7 @@ 点赞相簿`id=99184721` ```shell -curl 'http://api.vc.bilibili.com/link_draw/v2/Vote/operate' \ +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' \ @@ -67,9 +64,9 @@ curl 'http://api.vc.bilibili.com/link_draw/v2/Vote/operate' \ </details> -## 收藏相簿 +## ~~收藏相簿~~ -> http://api.vc.bilibili.com/user_plus/v1/Fav/add +> https://api.vc.bilibili.com/user_plus/v1/Fav/add *请求方式:POST* @@ -99,7 +96,7 @@ curl 'http://api.vc.bilibili.com/link_draw/v2/Vote/operate' \ 收藏相簿`id=99184721` ```shell -curl 'http:///api.vc.bilibili.com/user_plus/v1/Fav/add' \ +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' \ @@ -123,7 +120,7 @@ curl 'http:///api.vc.bilibili.com/user_plus/v1/Fav/add' \ ## 取消收藏相簿 -> http://api.vc.bilibili.com/user_plus/v1/Fav/delete +> https://api.vc.bilibili.com/user_plus/v1/Fav/delete *请求方式:POST* @@ -153,7 +150,7 @@ curl 'http:///api.vc.bilibili.com/user_plus/v1/Fav/add' \ 取消收藏相簿`id=99184721` ```shell -curl 'http://api.vc.bilibili.com/user_plus/v1/Fav/delete' \ +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' \ @@ -173,4 +170,5 @@ curl 'http://api.vc.bilibili.com/user_plus/v1/Fav/delete' \ } ``` -</details> \ No newline at end of file +</details> +</details> diff --git a/album/activity_list.md b/docs/album/activity_list.md similarity index 96% rename from album/activity_list.md rename to docs/album/activity_list.md index 91c4c07..4c82f37 100644 --- a/album/activity_list.md +++ b/docs/album/activity_list.md @@ -1,12 +1,11 @@ # 相簿活动列表 -- [获取相簿热门活动列表](#获取相簿热门活动列表) - ---- +<details> +<summary>功能已下线</summary> ## 获取相簿热门活动列表 -> http://api.vc.bilibili.com/photo_activity/v2/Activity/list +> https://api.vc.bilibili.com/photo_activity/v2/Activity/list *请求方式:GET* @@ -65,7 +64,7 @@ 获取`画友`分区,全部类型的5条活动 ```shell -curl -G 'http://api.vc.bilibili.com/photo_activity/v2/Activity/list' \ +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' \ @@ -149,4 +148,5 @@ curl -G 'http://api.vc.bilibili.com/photo_activity/v2/Activity/list' \ } ``` -</details> \ No newline at end of file +</details> +</details> diff --git a/album/info.md b/docs/album/info.md similarity index 98% rename from album/info.md rename to docs/album/info.md index ff9c529..5489857 100644 --- a/album/info.md +++ b/docs/album/info.md @@ -1,12 +1,11 @@ # 相簿基本信息 -- [获取相簿详细信息](#获取相簿详细信息) - ---- +<details> +<summary>功能已下线</summary> ## 获取相簿详细信息 ->http://api.vc.bilibili.com/link_draw/v1/doc/detail +>https://api.vc.bilibili.com/link_draw/v1/doc/detail *请求方式:GET* @@ -143,7 +142,7 @@ 查询相簿`id=99184721`的详细信息 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v1/doc/detail' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/detail' \ --data-urlencode 'doc_id=99184721' \ -b 'SESSDATA=xxx' ``` @@ -246,4 +245,5 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v1/doc/detail' \ } ``` -</details> \ No newline at end of file +</details> +</details> diff --git a/album/list.md b/docs/album/list.md similarity index 99% rename from album/list.md rename to docs/album/list.md index 2b61886..44adb6f 100644 --- a/album/list.md +++ b/docs/album/list.md @@ -1,16 +1,11 @@ # 相簿列表 -- [获取画友首页列表](#获取画友首页列表) -- [获取摄影首页列表](#获取摄影首页列表) -- [获取画友列表](#获取画友列表) -- [获取摄影列表](#获取摄影列表) -- [获取指定用户的相簿列表](#获取指定用户的相簿列表) - ---- +<details> +<summary>功能已下线</summary> ## 获取画友首页列表 -> http://api.vc.bilibili.com/link_draw/v2/Doc/index +> https://api.vc.bilibili.com/link_draw/v2/Doc/index *请求方式:GET* @@ -99,7 +94,7 @@ 用按热度排序方式获取画友首页列表 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v2/Doc/index' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v2/Doc/index' \ --data-urlencode 'type=hot' \ --data-urlencode 'page_num=1' \ --data-urlencode 'page_size=5' \ @@ -275,7 +270,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Doc/index' \ ## 获取摄影首页列表 -> http://api.vc.bilibili.com/link_draw/v2/Photo/index +> https://api.vc.bilibili.com/link_draw/v2/Photo/index *请求方式:GET* @@ -298,7 +293,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Doc/index' \ 用推荐方式获取画友首页列表 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/index' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v2/Photo/index' \ --data-urlencode 'type=recommend' \ --data-urlencode 'page_num=1' \ --data-urlencode 'page_size=5' \ @@ -667,7 +662,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/index' \ ## 获取画友列表 -> http://api.vc.bilibili.com/link_draw/v2/Doc/list +> https://api.vc.bilibili.com/link_draw/v2/Doc/list *请求方式:GET* @@ -691,7 +686,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/index' \ 用按热度排序方式获取`全部`类型的画友列表 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v2/Doc/list' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v2/Doc/list' \ --data-urlencode 'category=all' \ --data-urlencode 'type=hot' \ --data-urlencode 'page_num=1' \ @@ -941,7 +936,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Doc/list' \ ## 获取摄影列表 -> http://api.vc.bilibili.com/link_draw/v2/Photo/list +> https://api.vc.bilibili.com/link_draw/v2/Photo/list *请求方式:GET* @@ -965,7 +960,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Doc/list' \ 用按热度排序方式获取`Cosplay`类型的摄影列表 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/list' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v2/Photo/list' \ --data-urlencode 'category=cos' \ --data-urlencode 'type=hot' \ --data-urlencode 'page_num=1' \ @@ -1329,7 +1324,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/list' \ ## 获取指定用户的相簿列表 -> http://api.vc.bilibili.com/link_draw/v1/doc/others +> https://api.vc.bilibili.com/link_draw/v1/doc/others *请求方式:GET* @@ -1380,7 +1375,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/list' \ 获取用户` 1360010 `的所有类型相簿 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v1/doc/others' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/others' \ --data-urlencode 'biz=0' \ --data-urlencode 'poster_uid=1360010' \ --data-urlencode 'page_num=1' \ @@ -2439,4 +2434,5 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v1/doc/others' \ } ``` -</details> \ No newline at end of file +</details> +</details> diff --git a/album/recommend_author.md b/docs/album/recommend_author.md similarity index 92% rename from album/recommend_author.md rename to docs/album/recommend_author.md index 4ed63b5..ba57f07 100644 --- a/album/recommend_author.md +++ b/docs/album/recommend_author.md @@ -1,13 +1,11 @@ # 相簿推荐作者 -- [获取摄影推荐作者](#获取摄影推荐作者) -- [获取画友推荐作者](#获取画友推荐作者) - ---- +<details> +<summary>功能已下线</summary> ## 获取摄影推荐作者 -> http://api.vc.bilibili.com/link_draw/v2/Photo/uper +> https://api.vc.bilibili.com/link_draw/v2/Photo/uper *请求方式:GET* @@ -50,7 +48,7 @@ 请求获取摄影推荐作者,数量为5 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/uper' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v2/Photo/uper' \ --data-urlencode 'num=5' ``` @@ -101,7 +99,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/uper' \ ## 获取画友推荐作者 -> http://api.vc.bilibili.com/link_draw/v2/Doc/drawer +> https://api.vc.bilibili.com/link_draw/v2/Doc/drawer *请求方式:GET* @@ -120,7 +118,7 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Photo/uper' \ 请求获取画友推荐作者,数量为5 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v2/Doc/drawer' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v2/Doc/drawer' \ --data-urlencode 'num=5' ``` @@ -168,4 +166,4 @@ curl -G 'http://api.vc.bilibili.com/link_draw/v2/Doc/drawer' \ ``` </details> - +</details> diff --git a/article/like_coin_fav.md b/docs/article/action.md similarity index 88% rename from article/like_coin_fav.md rename to docs/article/action.md index fa8ca0f..c195594 100644 --- a/article/like_coin_fav.md +++ b/docs/article/action.md @@ -1,16 +1,10 @@ -# 专栏投币&点赞&收藏 - -- [点赞文章](#点赞文章) -- [投币文章](#投币文章) -- [收藏文章](#收藏文章) - ---- +# 专栏点赞&投币&收藏 ## 点赞文章 -<img src="/imgs/like.svg" width="100" height="100"/> +<img src="../../assets/img/like.svg" width="100" height="100"/> -> http://api.bilibili.com/x/article/like +> https://api.bilibili.com/x/article/like *请求方式:POST* @@ -39,7 +33,7 @@ 为文章`cv5806746`点赞 ```shell -curl 'http://api.bilibili.com/x/article/like' \ +curl 'https://api.bilibili.com/x/article/like' \ --data-urlencode 'id=5806746' \ --data-urlencode 'type=1' \ --data-urlencode 'csrf=xxx' \ @@ -61,9 +55,9 @@ curl 'http://api.bilibili.com/x/article/like' \ ## 投币文章 -<img src="/imgs/coin.svg" width="100" height="100"/> +<img src="../../assets/img/coin.svg" width="100" height="100"/> -> http://api.bilibili.com/x/web-interface/coin/add +> https://api.bilibili.com/x/web-interface/coin/add *请求方式:POST* @@ -74,6 +68,7 @@ curl 'http://api.bilibili.com/x/article/like' \ | 参数名 | 类型 | 内容 | 必要性 | 备注 | | -------- | ---- | ------------------- | ------ | ------- | | aid | num | 文章cvid | 必要 | | +| upid | num | 文章作者mid | 必要 | | | multiply | num | 投币数量 | 必要 | 上限为2 | | avtype | num | 2 | 必要 | 必须为2 | | csrf | str | CSRF Token(位于cookie) | 必要 | | @@ -100,8 +95,9 @@ data 对象: 为文章`cv5806746`投币1枚 ```shell -curl 'http://api.bilibili.com/x/web-interface/coin/add' \ +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' \ @@ -126,9 +122,9 @@ curl 'http://api.bilibili.com/x/web-interface/coin/add' \ ## 收藏文章 -<img src="/imgs/fav.svg" width="100" height="100"/> +<img src="../../assets/img/fav.svg" width="100" height="100"/> ->http://api.bilibili.com/x/article/favorites/add +>https://api.bilibili.com/x/article/favorites/add *请求方式:POST* @@ -156,7 +152,7 @@ curl 'http://api.bilibili.com/x/web-interface/coin/add' \ 收藏文章`cv5806746` ```shell -curl 'http://api.bilibili.com/x/article/favorites/add' \ +curl 'https://api.bilibili.com/x/article/favorites/add' \ --data-urlencode 'id=5806746' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' diff --git a/article/articles.md b/docs/article/articles.md similarity index 98% rename from article/articles.md rename to docs/article/articles.md index b1a80cb..0890ca9 100644 --- a/article/articles.md +++ b/docs/article/articles.md @@ -1,12 +1,8 @@ # 文集基本信息 -- [获取文集基本信息](#获取文集基本信息) - ---- - ## 获取文集基本信息 -> http://api.bilibili.com/x/article/list/web/articles +> https://api.bilibili.com/x/article/list/web/articles *请求方式:GET* @@ -111,7 +107,7 @@ 查询文集`rl207146`的基本信息 ```shell -curl -G 'http://api.bilibili.com/x/article/list/web/articles' \ +curl -G 'https://api.bilibili.com/x/article/list/web/articles' \ --data-urlencode 'id=207146' \ -b 'SESSDATA=xxx' ``` diff --git a/docs/article/category.md b/docs/article/category.md new file mode 100644 index 0000000..833fa40 --- /dev/null +++ b/docs/article/category.md @@ -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 | 全部笔记 | diff --git a/docs/article/delete.md b/docs/article/delete.md new file mode 100644 index 0000000..22e7a6e --- /dev/null +++ b/docs/article/delete.md @@ -0,0 +1,46 @@ +# 删除专栏 + +> <https://member.bilibili.com/x/web/article/delete> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------ | ---- | +| aid | num | 文章cvid | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------- | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项<br />37104:无权限操作他人专栏 | +| message | str | 错误信息 | 默认为`0` | +| ttl | num | 1 | | + +**示例:** + +```shell +curl 'https://member.bilibili.com/x/web/article/delete' \ + --data-urlencode 'aid=114514' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +</details> diff --git a/article/info.md b/docs/article/info.md similarity index 66% rename from article/info.md rename to docs/article/info.md index b6bbbea..7e986f0 100644 --- a/article/info.md +++ b/docs/article/info.md @@ -1,12 +1,8 @@ # 专栏基本信息 -- [获取专栏文章基本信息](#获取专栏文章基本信息) - ---- - ## 获取专栏文章基本信息 -> http://api.bilibili.com/x/article/viewinfo +> https://api.bilibili.com/x/article/viewinfo *请求方式:GET* @@ -51,7 +47,9 @@ | in_list | bool | 是否收于文集 | false:否<br />true:是 | | pre | num | 上一篇文章cvid | 无为0 | | next | num | 下一篇文章cvid | 无为0 | -| share_channels | array | 分享方式列表 | | +| share_channels | array | 分享方式列表 | | +| type | num | 文章类别 | 0:文章<br />2:笔记 | + `stats`对象: @@ -101,7 +99,7 @@ 查询文章`cv2`的基本信息 ```shell -curl -G 'http://api.bilibili.com/x/article/viewinfo' \ +curl -G 'https://api.bilibili.com/x/article/viewinfo' \ --data-urlencode 'id=2' \ -b 'SESSDATA=xxx' ``` @@ -111,59 +109,73 @@ curl -G 'http://api.bilibili.com/x/article/viewinfo' \ ```json { - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "like": 1, - "attention": true, - "favorite": false, - "coin": 0, - "stats": { - "view": 317712, - "favorite": 3249, - "like": 10176, - "dislike": 0, - "reply": 1333, - "share": 302, - "coin": 2002, - "dynamic": 28 - }, - "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" - }] - } + "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 + } } ``` diff --git a/audio/coin&fav.md b/docs/audio/action.md similarity index 57% rename from audio/coin&fav.md rename to docs/audio/action.md index 895fb54..8199f05 100644 --- a/audio/coin&fav.md +++ b/docs/audio/action.md @@ -1,13 +1,8 @@ # 音频投币&收藏 -- [查询音频收藏状态](#查询音频收藏状态) -- [查询音频投币数](#查询音频投币数) - ---- - ## 查询音频收藏状态 -> http://www.bilibili.com/audio/music-service-c/web/collections/songs-coll +> https://www.bilibili.com/audio/music-service-c/web/collections/songs-coll *请求方式:GET* @@ -36,7 +31,7 @@ 查询音频`au13598`的收藏状态 ```shell -curl -G 'http://www.bilibili.com/audio/music-service-c/web/collections/songs-coll' \ +curl -G 'https://www.bilibili.com/audio/music-service-c/web/collections/songs-coll' \ --data-urlencode 'sid=13598' \ -b 'SESSDATA=xxx;DedeUserID=1;' ``` @@ -56,7 +51,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/collections/songs-col ## 查询音频投币数 -> http://www.bilibili.com/audio/music-service-c/web/coin/audio +> https://www.bilibili.com/audio/music-service-c/web/coin/audio *请求方式:GET* @@ -85,7 +80,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/collections/songs-col 查询音频`au13598`的投币数 ```shell -curl -G 'http://www.bilibili.com/audio/music-service-c/web/coin/audio' \ +curl -G 'https://www.bilibili.com/audio/music-service-c/web/coin/audio' \ --data-urlencode 'sid=15664' \ -b 'SESSDATA=xxx;DedeUserID=1;' ``` @@ -102,3 +97,52 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/coin/audio' \ ``` </details> + +## 投币音频 + +> https://www.bilibili.com/audio/music-service-c/web/coin/add + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**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> diff --git a/audio/info.md b/docs/audio/info.md similarity index 95% rename from audio/info.md rename to docs/audio/info.md index 17c8b9e..2b296ff 100644 --- a/audio/info.md +++ b/docs/audio/info.md @@ -1,15 +1,8 @@ # 歌曲基本信息 -- [查询歌曲基本信息](#查询歌曲基本信息) -- [查询歌曲TAG](#查询歌曲TAG) -- [查询歌曲创作成员列表](#查询歌曲创作成员列表) -- [获取歌曲歌词](#获取歌曲歌词) - ---- - ## 查询歌曲基本信息 -> http://www.bilibili.com/audio/music-service-c/web/song/info +> https://www.bilibili.com/audio/music-service-c/web/song/info *请求方式:GET* @@ -93,7 +86,7 @@ 查询音频`au13598`的基本信息 ```shell -curl -G 'http://www.bilibili.com/audio/music-service-c/web/song/info' \ +curl -G 'https://www.bilibili.com/audio/music-service-c/web/song/info' \ --data-urlencode 'sid=13598' \ -b 'SESSDATA=xxx' ``` @@ -152,7 +145,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/song/info' \ ## 查询歌曲TAG -> http://www.bilibili.com/audio/music-service-c/web/tag/song +> https://www.bilibili.com/audio/music-service-c/web/tag/song *请求方式:GET* @@ -194,7 +187,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/song/info' \ 查询音频`au15664`的TAG ```shell -curl -G 'http://www.bilibili.com/audio/music-service-c/web/tag/song' \ +curl -G 'https://www.bilibili.com/audio/music-service-c/web/tag/song' \ --data-urlencode 'sid=15664' ``` @@ -250,7 +243,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/tag/song' \ ## 查询歌曲创作成员列表 -> http://www.bilibili.com/audio/music-service-c/web/member/song +> https://www.bilibili.com/audio/music-service-c/web/member/song *请求方式:GET* @@ -306,7 +299,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/tag/song' \ 查询音频`au815861`的创作成员信息 ```shell -curl -G 'http://www.bilibili.com/audio/music-service-c/web/member/song' \ +curl -G 'https://www.bilibili.com/audio/music-service-c/web/member/song' \ --data-urlencode 'sid=815861' ``` @@ -386,7 +379,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/member/song' \ ## 获取歌曲歌词 -> http://www.bilibili.com/audio/music-service-c/web/song/lyric +> https://www.bilibili.com/audio/music-service-c/web/song/lyric *请求方式:GET* @@ -413,7 +406,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/member/song' \ 获取音频`au15664`的歌词信息 ```shell -curl -G 'http://www.bilibili.com/audio/music-service-c/web/song/lyric' \ +curl -G 'https://www.bilibili.com/audio/music-service-c/web/song/lyric' \ --data-urlencode 'sid=15664' \ -b 'SESSDATA=xxx' ``` diff --git a/docs/audio/music_list.md b/docs/audio/music_list.md new file mode 100644 index 0000000..8e8dff0 --- /dev/null +++ b/docs/audio/music_list.md @@ -0,0 +1,782 @@ +# 歌单&音频收藏夹详细信息 + +## 查询自己创建的歌单 + +> https://www.bilibili.com/audio/music-service-c/web/collections/list + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +鉴权方式: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* + +认证方式:Cookie(SESSDATA) + +鉴权方式: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/>5:PGC歌单 | +| 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/>5:PGC歌单 | +| 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> diff --git a/audio/musicstream_url.md b/docs/audio/musicstream_url.md similarity index 73% rename from audio/musicstream_url.md rename to docs/audio/musicstream_url.md index 2a314a1..26f9c2c 100644 --- a/audio/musicstream_url.md +++ b/docs/audio/musicstream_url.md @@ -1,12 +1,8 @@ # 音频流URL -<img src="/imgs/download.svg" width="100" height="100"/> +<img src="../../assets/img/download.svg" width="100" height="100"/> -- [获取音频流URL(无法获取付费音频)(web端)](#获取音频流URL(无法获取付费音频)(web端)) -- [获取音频流URL(可获取付费音频)(双端)](#获取音频流URL(可获取付费音频)(双端)) -- [音频流的获取](#音频流的获取) - ---- +## 音质qn参数定义 音质`qn`参数: @@ -17,9 +13,9 @@ | 2 | 高品质 320K | | 3 | 无损 FLAC (大会员) | -## 获取音频流URL(无法获取付费音频)(web端) +## 获取音频流URL(web端) -> http://www.bilibili.com/audio/music-service-c/web/url +> https://www.bilibili.com/audio/music-service-c/web/url *请求方式:GET* @@ -32,6 +28,8 @@ | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ------ | ---- | -------- | ------ | ---- | | sid | num | 音频auid | 必要 | | +| quality | num | 2 | 不必要 | | +| privilege | num | 2 | 不必要 | | **json回复:** @@ -39,8 +37,9 @@ | 字段 | 类型 | 内容 | 备注 | | ---- | ---- | -------- | ----------------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />7201006:未找到或已下架<br />72000000:请求错误 | -| msg | str | 错误信息 | 默认为success | +| code | num | 返回值 | 0: 成功<br />4511006: 已跳过无法播放的歌曲<br />7201006:未找到或已下架<br />72000000:请求错误 | +| message | str | 返回值 | 字符串形式的 code | +| msg | str | 返回信息 | 成功为 success | | data | obj | 数据本体 | | `data`对象: @@ -49,27 +48,26 @@ | --------- | ----- | --------- | --------------------------------------- | | sid | num | 音频auid | | | type | num | 音质标识 | -1:试听片段(192K)<br />1:192K | -| info | str | 空 | **作用尚不明确** | +| info | str | 空 | | | timeout | num | 有效时长 | 单位为秒<br />一般为3h | | size | num | 文件大小 | 单位为字节<br />当`type`为-1时`size`为0 | | cdns | array | 音频流url | | -| qualities | null | - | | -| title | null | - | | -| cover | null | - | | +| qualities | null | | | +| title | str | 空 | | +| cover | str | 空 | | `data`对象的`cdns`数组: - | 项 | 类型 | 内容 | 备注 | | ---- | ---- | ------------- | ---- | | 0 | str | 音频流url | | -| 1 | str | 备用音频流url | | +| 1 | str | 备用音频流url | 可能不存在 | **示例:** ```shell -curl -G 'http://www.bilibili.com/audio/music-service-c/web/url' \ ---data-urlencode 'sid=sid=15664' +curl -G 'https://www.bilibili.com/audio/music-service-c/web/url' \ +--data-urlencode 'sid=777180' ``` <details> @@ -77,30 +75,30 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/url' \ ```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 - } + "code": 0, + "data": { + "sid": 777180, + "title": "", + "cover": "", + "type": 1, + "info": "", + "timeout": 10800, + "size": 5579903, + "cdns": [ + "https://upos-sz-mirrorcos.bilivideo.com/ugaxcode/m190314ws1dikiap1oivtapctuj1agjc-192k.m4a?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1725013547&gen=playurlv2&os=cosbv&oi=1746706124&trid=493923009cef4225ab8e1b9bda42c635B&mid=0&platform=pc&og=cos&upsig=043779511e2770cf6c3da04ed8a89f25&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&bvc=vod&nettype=0&orderid=0,1&logo=00000000" + ], + "qualities": null + }, + "message": "0", + "msg": "success" } ``` </details> -## 获取音频流URL(可获取付费音频)(双端) +## 获取音频流URL(可获取付费音频) -> http://api.bilibili.com/audio/music-service-c/url +> https://api.bilibili.com/audio/music-service-c/url *请求方式:GET* @@ -180,7 +178,7 @@ curl -G 'http://www.bilibili.com/audio/music-service-c/web/url' \ Cookie方式: ```shell -curl -G 'http://api.bilibili.com/audio/music-service-c/url +curl -G 'https://api.bilibili.com/audio/music-service-c/url' \ --data-urlencode 'songid=682118' \ --data-urlencode 'quality=3' \ --data-urlencode 'privilege=2' \ @@ -192,7 +190,7 @@ curl -G 'http://api.bilibili.com/audio/music-service-c/url APP方式: ```shell -curl -G 'http://api.bilibili.com/audio/music-service-c/url +curl -G 'https://api.bilibili.com/audio/music-service-c/url' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'songid=682118' \ --data-urlencode 'quality=3' \ @@ -266,17 +264,16 @@ curl -G 'http://api.bilibili.com/audio/music-service-c/url ## 音频流的获取 -将`data`.`cdns`.`[0]`或`data`.`cdns`.`[1]`中的内容作为url进行GET操作 +将 `data.cdns[n]` 作为 URL 进行 GET 操作 -需要验证请求`user-agent` 不为空 +需要验证请求头 `User-Agent` 不为空且不含敏感字串, 且 `Referer` 必须在 `.bilibili.com` 下 -**user-agent错误并且referer不在`*.bilibili.com`域名下的情况下会导致403 Forbidden,故无法获取** +**示例:** -**以上述音频url为例:** +使用 cURL + FFPlay 直接从音频流播放 ```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' +curl -G "https://upos-sz-mirrorcos.bilivideo.com/ugaxcode/7bf6a3a3e94421ccc653f005457b1e8c-192k.m4a?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1725013121&gen=playurlv2&os=cosbv&oi=1823807031&trid=1a4703f1e7344bb891691c5857e8cfb9B&mid=0&platform=pc&og=cos&upsig=e3a9fba59b46ab2720c8b1807844e9f3&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&bvc=vod&nettype=0&orderid=0,1&logo=00000000" \ +--referer 'https://www.bilibili.com/' -A 'Mozilla/5.0' \ +--output - | ffplay - ``` - -响应正文将返回一个flac文件 diff --git a/docs/audio/rank.md b/docs/audio/rank.md new file mode 100644 index 0000000..ff2a809 --- /dev/null +++ b/docs/audio/rank.md @@ -0,0 +1,1160 @@ +# 音频榜单 + +以下接口均来自页面 https://music.bilibili.com/pc/rank + +## 获取音频榜单每期列表 + +> https://api.bilibili.com/x/copyright-music-publicity/toplist/all_period + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | ------------------------ | ------ | ---------------------- | +| list_type | num | 榜单类型 | 必要 | 1:热榜<br />2:原创榜 | +| csrf | str | CSRF Token(位于cookie) | 非必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---- | +| list | obj | 年份索引 | | + +`data`中的`list`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ----- | ---------------------- | ---- | +| {年份} | array | 对应年份索引的每期信息 | | +| …… | array | …… | | + +`list`中的`{年份}`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------------- | ---- | +| 0 | obj | 该年中的单期数据 | | +| …… | obj | …… | …… | + +`{年份}`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | -------- | -------- | +| ID | num | 榜单 id | | +| priod | num | 榜单期数 | | +| publish_time | num | 发布时间 | 秒时间戳 | + +**示例:** + +```bash +curl -G 'https://api.bilibili.com/x/copyright-music-publicity/toplist/all_period' \ + --data-urlencode 'list_type=1' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": { + "2022": [ + { + "ID": 38, + "priod": 29, + "publish_time": 1672394399 + }, + { + "ID": 36, + "priod": 28, + "publish_time": 1671789599 + }, + { + "ID": 34, + "priod": 27, + "publish_time": 1671184800 + }, + { + "ID": 32, + "priod": 26, + "publish_time": 1670579999 + }, + { + "ID": 30, + "priod": 25, + "publish_time": 1669976540 + }, + { + "ID": 28, + "priod": 24, + "publish_time": 1669370757 + }, + { + "ID": 26, + "priod": 23, + "publish_time": 1668766987 + }, + { + "ID": 22, + "priod": 22, + "publish_time": 1668163419 + }, + { + "ID": 21, + "priod": 21, + "publish_time": 1667558276 + }, + { + "ID": 20, + "priod": 20, + "publish_time": 1666951199 + }, + { + "ID": 19, + "priod": 19, + "publish_time": 1666346399 + }, + { + "ID": 18, + "priod": 18, + "publish_time": 1665741599 + }, + { + "ID": 17, + "priod": 17, + "publish_time": 1665136799 + }, + { + "ID": 16, + "priod": 16, + "publish_time": 1664531999 + }, + { + "ID": 15, + "priod": 15, + "publish_time": 1663927199 + }, + { + "ID": 14, + "priod": 14, + "publish_time": 1663322399 + }, + { + "ID": 13, + "priod": 13, + "publish_time": 1662717599 + }, + { + "ID": 12, + "priod": 12, + "publish_time": 1662113559 + }, + { + "ID": 11, + "priod": 11, + "publish_time": 1661508657 + }, + { + "ID": 10, + "priod": 10, + "publish_time": 1660903199 + }, + { + "ID": 9, + "priod": 9, + "publish_time": 1660298400 + }, + { + "ID": 8, + "priod": 8, + "publish_time": 1659693599 + }, + { + "ID": 7, + "priod": 7, + "publish_time": 1659088799 + }, + { + "ID": 6, + "priod": 6, + "publish_time": 1658483999 + }, + { + "ID": 5, + "priod": 5, + "publish_time": 1657879200 + }, + { + "ID": 4, + "priod": 4, + "publish_time": 1657274399 + }, + { + "ID": 3, + "priod": 3, + "publish_time": 1656669600 + }, + { + "ID": 2, + "priod": 2, + "publish_time": 1656064800 + }, + { + "ID": 1, + "priod": 1, + "publish_time": 1655460091 + } + ], + "2023": [ + { + "ID": 76, + "priod": 48, + "publish_time": 1683885696 + }, + { + "ID": 74, + "priod": 47, + "publish_time": 1683281010 + }, + { + "ID": 72, + "priod": 46, + "publish_time": 1682675999 + }, + { + "ID": 70, + "priod": 45, + "publish_time": 1682071442 + }, + { + "ID": 68, + "priod": 44, + "publish_time": 1681466400 + }, + { + "ID": 66, + "priod": 43, + "publish_time": 1680861599 + }, + { + "ID": 64, + "priod": 42, + "publish_time": 1680256799 + }, + { + "ID": 62, + "priod": 41, + "publish_time": 1679652088 + }, + { + "ID": 60, + "priod": 40, + "publish_time": 1679047199 + }, + { + "ID": 58, + "priod": 39, + "publish_time": 1678442399 + }, + { + "ID": 56, + "priod": 38, + "publish_time": 1677837600 + }, + { + "ID": 54, + "priod": 37, + "publish_time": 1677232800 + }, + { + "ID": 52, + "priod": 36, + "publish_time": 1676628000 + }, + { + "ID": 50, + "priod": 35, + "publish_time": 1676023199 + }, + { + "ID": 48, + "priod": 34, + "publish_time": 1675418399 + }, + { + "ID": 46, + "priod": 33, + "publish_time": 1674813599 + }, + { + "ID": 44, + "priod": 32, + "publish_time": 1674208799 + }, + { + "ID": 42, + "priod": 31, + "publish_time": 1673603999 + }, + { + "ID": 40, + "priod": 30, + "publish_time": 1672999199 + } + ] + } + } +} +``` + +</details> + +## 查询音频榜单单期信息 + +> https://api.bilibili.com/x/copyright-music-publicity/toplist/detail + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ------------------------ | ------ | ------------------------------------------------ | +| list_id | num | 榜单 id | 必要 | 见 [获取音频榜单每期列表](#获取音频榜单每期列表) | +| csrf | str | CSRF Token(位于cookie) | 非必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ----------------------- | ------------------------------------------------------------ | +| listen_fid | num | 畅听版歌单收藏夹原始 id | 非真实收藏夹 mlid<br />需要在后方拼接用户 mid 的后两位,如`16484498`->`1648449844` | +| all_fid | num | 完整版歌单收藏夹原始 id | 非真实收藏夹 mlid<br />算法同上 | +| fav_mid | num | 绑定收藏夹用户的 mid | 例如`1164440244`([音乐热榜bot](https://space.bilibili.com/1164440244)账号) | +| cover_url | str | 榜单封面 url | | +| is_subscribe | bool | 是否已订阅榜单 | `true`:已订阅<br />`false`:未订阅<br />需要登录(Cookie 或 APP),未登录恒为`false` | +| listen_count | num | 平台有版权音频的数量 | | + +**示例:** + +查询 [第 48 期音频榜单](https://music.bilibili.com/pc/rank?list_id=76)(id=76) 信息 + +```bash +curl -G 'https://api.bilibili.com/x/copyright-music-publicity/toplist/detail' \ + --data-urlencode 'list_id=76' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "listen_fid": 23317138, + "all_fid": 23672948, + "fav_mid": 1164440244, + "cover_url": "http://i0.hdslb.com/bfs/music-publicity/d8509dc6ee94dd5cc4658a2cbca4f525b4396df5.png", + "is_subscribe": false, + "listen_count": 5 + } +} +``` + +</details> + +## 获取音频榜单单期内容 + +> https://api.bilibili.com/x/copyright-music-publicity/toplist/music_list + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ------------------------ | ------ | ------------------------------------------------ | +| list_id | num | 榜单 id | 必要 | 见 [获取音频榜单每期列表](#获取音频榜单每期列表) | +| csrf | str | CSRF Token(位于cookie) | 非必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ----- | -------- | ---- | +| list | array | 内容列表 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| 0 | obj | 榜单内容 1 | | +| n | obj | 榜单内容 (n+1) | | +| …… | obj | …… | …… | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ----- | ------------------ | ------------------------------------------- | +| music_id | str | 音频 MAID | 例如`MA409252256362326366` | +| music_title | str | 音频标题 | | +| singer | str | 音频作者 | | +| album | str | 音频专辑 | | +| mv_aid | num | 音频 MV 的 avid | 若该音频无 MV 则该字段为 0 | +| mv_bvid | str | 音频 MV 的 bvid | | +| mv_cover | str | 音频封面 url | | +| heat | num | 热度值 | | +| rank | num | 排序值 | 1 为最高排序,DESC 方式 | +| can_listen | bool | 平台是否有版权 | `true`:平台有版权<br />`false`:平台无版权 | +| recommendation | str | (?) | | +| creation_aid | num | 关联稿件 avid | | +| creation_bvid | str | 关联稿件 bvid | | +| creation_cover | str | 关联稿件封面 url | | +| creation_title | str | 关联稿件标题 | | +| creation_up | num | 关联稿件 UP 主 mid | | +| creation_nickname | str | 关联稿件 UP 主昵称 | | +| creation_duration | num | 关联稿件时长 | 单位为秒 | +| creation_play | num | 关联稿件播放量 | | +| creation_reason | str | 关联稿件二级分区名 | | +| achievements | array | 获得成就 | | +| material_id | num | (?) | | +| material_use_num | num | (?) | | +| material_duration | num | (?) | | +| material_show | num | (?) | | +| song_type | num | (?) | | + +`list`数组中的对象中的`achievements`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| 0 | str | 成就文案 1 | | +| n | str | 成就文案 (n+1) | | +| …… | str | …… | …… | + +**示例:** + +查询 [第 48 期音频榜单](https://music.bilibili.com/pc/rank?list_id=76)(id=76) 榜单内容列表 + +```bash +curl -G 'https://api.bilibili.com/x/copyright-music-publicity/toplist/music_list' \ + --data-urlencode 'list_id=76' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "music_id": "MA409252256362326366", + "music_title": "極楽浄土", + "singer": "GARNiDELiA", + "album": "約束 -Promise code-", + "mv_aid": 28361833, + "mv_bvid": "BV1us41137Fd", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/07e0d9826c574e37df25387cab6df062.jpg", + "heat": 5328979, + "rank": 1, + "can_listen": true, + "recommendation": "", + "creation_aid": 910787823, + "creation_bvid": "BV1HM4y1b79Z", + "creation_cover": "http://i1.hdslb.com/bfs/archive/5780a05437ec9880301ed093537d6af97b0f8bdb.jpg", + "creation_title": "【MARiA】乘风2023初舞台!《极乐净土》,虽迟但到!", + "creation_up": 110352985, + "creation_nickname": "GARNiDELiA", + "creation_duration": 100, + "creation_play": 13487670, + "creation_reason": "官方现场", + "achievements": [ + "重回榜单", + "最高排名1" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA456045402056087707", + "music_title": "アイドル", + "singer": "YOASOBI", + "album": "アイドル", + "mv_aid": 227499491, + "mv_bvid": "BV17h411u7sb", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/4bf2fe90e9d2361c3c4ddf59064c6e69.jpg", + "heat": 1856277, + "rank": 2, + "can_listen": false, + "recommendation": "", + "creation_aid": 952765045, + "creation_bvid": "BV1Ws4y1A7fS", + "creation_cover": "http://i0.hdslb.com/bfs/archive/8326350bab039ffee9274d7e1f94240d170fa096.jpg", + "creation_title": "【中文字幕】我推的孩子「アイドル」官方MV(4K 60帧/Hi-Res)", + "creation_up": 11585165, + "creation_nickname": "爱莉丝青贝尔克", + "creation_duration": 226, + "creation_play": 3742892, + "creation_reason": "音乐MV", + "achievements": [ + "本期排名持平", + "最高排名1" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA458652518440821364", + "music_title": "野火wildfire", + "singer": "HOYO- Mix,Jonathan Steingard", + "album": "雪融于烬", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/e0825a2cfee22ce77f02d4d80826a1d9.jpg", + "heat": 1767135, + "rank": 3, + "can_listen": false, + "recommendation": "", + "creation_aid": 355732312, + "creation_bvid": "BV1ZX4y117Dx", + "creation_cover": "http://i0.hdslb.com/bfs/archive/c98bd629876e8b7b4c056d39bcfeaabe7327e996.jpg", + "creation_title": "这首“野火”神曲,我还能再听亿遍!!!", + "creation_up": 394861137, + "creation_nickname": "Hanserのcece", + "creation_duration": 219, + "creation_play": 2158925, + "creation_reason": "动画创作", + "achievements": [ + "本期排名↑1", + "最高排名3" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA459088929228874460", + "music_title": "不问别离", + "singer": "指尖笑", + "album": "不问别离", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/b1507c1649500a0dcf0295b4b68e4b15.jpg", + "heat": 1576823, + "rank": 4, + "can_listen": false, + "recommendation": "", + "creation_aid": 740818022, + "creation_bvid": "BV1Sk4y1E7qH", + "creation_cover": "http://i2.hdslb.com/bfs/archive/5301b2fee7ad520c8946b5eb92888cf8be563a80.jpg", + "creation_title": "日推歌单 | \"我叹那春花秋月不问别离 长风起孤城笛声里全是你\" |《不问ciaga》", + "creation_up": 550445292, + "creation_nickname": "peach63", + "creation_duration": 164, + "creation_play": 274898, + "creation_reason": "音乐MV", + "achievements": [ + "本期排名↑10", + "最高排名4" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA459819223808501000", + "music_title": "Spicy", + "singer": "aespa", + "album": "MY WORLD - The 3rd Mini Album", + "mv_aid": 570920682, + "mv_bvid": "BV1qz4y1a7m8", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/6455687e7d72dd838ffd2aa753fd7761.jpg", + "heat": 1441365, + "rank": 5, + "can_listen": false, + "recommendation": "", + "creation_aid": 570920682, + "creation_bvid": "BV1qz4y1a7m8", + "creation_cover": "http://i2.hdslb.com/bfs/archive/cd5456735bd645343a51b8df9b4a91236b08e657.jpg", + "creation_title": "aespa《Spicy》MV", + "creation_up": 3493085782739496, + "creation_nickname": "SMTOWN", + "creation_duration": 205, + "creation_play": 2363321, + "creation_reason": "官方MV", + "achievements": [ + "新晋上榜", + "最高排名5" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA458946536466866804", + "music_title": "UNFORGIVEN (feat. Nile Rodgers)", + "singer": "LE SSERAFIM,Nile Rodgers", + "album": "UNFORGIVEN", + "mv_aid": 528370662, + "mv_bvid": "BV1LM41137Pc", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/47e6685cfe44185ec4daab5e765e3b26.jpg", + "heat": 1362593, + "rank": 6, + "can_listen": true, + "recommendation": "", + "creation_aid": 698312930, + "creation_bvid": "BV1wm4y1y76i", + "creation_cover": "http://i1.hdslb.com/bfs/archive/4f097f5067fc3408118f7d59b2c36d8278660dd9.jpg", + "creation_title": "假如让金采源唱全曲......", + "creation_up": 496743369, + "creation_nickname": "YuueFriloeyyy_", + "creation_duration": 183, + "creation_play": 319267, + "creation_reason": "歌曲演唱", + "achievements": [ + "本期排名↑3", + "最高排名6" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA451591354456234292", + "music_title": "雪 Distance", + "singer": "Capper,罗言", + "album": "Uniconfication", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/5899008cea7ed157b8bdb6f9b89dd7ff.jpg", + "heat": 1233174, + "rank": 7, + "can_listen": false, + "recommendation": "", + "creation_aid": 355903423, + "creation_bvid": "BV1QX4y127jq", + "creation_cover": "http://i2.hdslb.com/bfs/archive/e3542cf8d7cf7cc58268c840d845bb12d4c52662.jpg", + "creation_title": "⚡️“可是雪啊,埋进土里”⚡️", + "creation_up": 22169833, + "creation_nickname": "寒了个羽", + "creation_duration": 158, + "creation_play": 2622705, + "creation_reason": "音乐创作", + "achievements": [ + "本期排名↓1", + "最高排名3" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA460246447678301091", + "music_title": "Ghost Face (鬼脸) (LIVE版)", + "singer": "法老", + "album": "中国说唱巅峰对决2023 第一期", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/0d4050feb7cac1a568849832d5fa9f67.jpg", + "heat": 1163291, + "rank": 8, + "can_listen": false, + "recommendation": "", + "creation_aid": 355995337, + "creation_bvid": "BV1qX4y1y78r", + "creation_cover": "http://i0.hdslb.com/bfs/archive/f5e7a51dbe1f48441042dad1e45148c400a3f9fe.jpg", + "creation_title": "【法老Pharaoh】虽迟但到!说唱巅峰对决《Ghost Face》live", + "creation_up": 12807175, + "creation_nickname": "法老爷爷", + "creation_duration": 79, + "creation_play": 885856, + "creation_reason": "官方现场", + "achievements": [ + "新晋上榜", + "最高排名8" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA458974797167092444", + "music_title": "F*ck My Life", + "singer": "SEVENTEEN", + "album": "SEVENTEEN 10th Mini Album 'FML'", + "mv_aid": 313423265, + "mv_bvid": "BV1tP41117mv", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/6723df38fcca9b2ab85b564e3809426e.jpg", + "heat": 735517, + "rank": 9, + "can_listen": true, + "recommendation": "", + "creation_aid": 313423265, + "creation_bvid": "BV1tP41117mv", + "creation_cover": "http://i1.hdslb.com/bfs/archive/38377552bd74cc32851d6466343dc3a26983c3b6.jpg", + "creation_title": "SEVENTEEN 'F*ck My Life' Official MV", + "creation_up": 692206640, + "creation_nickname": "SEVENTEEN", + "creation_duration": 220, + "creation_play": 1008830, + "creation_reason": "官方MV", + "achievements": [ + "新晋上榜", + "最高排名9" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA460247474041267107", + "music_title": "Control's Wishes", + "singer": "Steven Grove,塞壬唱片-MSR", + "album": "孤星OST", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/6068f2c64c6796f68b8dae7772f891ac.jpg", + "heat": 628233, + "rank": 10, + "can_listen": false, + "recommendation": "", + "creation_aid": 740625544, + "creation_bvid": "BV1ck4y1E7KJ", + "creation_cover": "http://i1.hdslb.com/bfs/archive/11381997120391d655c91b19bc08e110ca8201e5.jpg", + "creation_title": "【小提琴/钢琴】明日方舟四周年孤星PV曲《Control's Wishes》", + "creation_up": 2016022052, + "creation_nickname": "-桑榆墨景-", + "creation_duration": 193, + "creation_play": 37881, + "creation_reason": "器乐演奏", + "achievements": [ + "新晋上榜", + "最高排名10" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA459266635128138957", + "music_title": "花园种花(在小小的花园里种小小的花)", + "singer": "桃子老师花开富贵", + "album": "花园种花", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/fb1d6a44bb8337edf6c9d32c421e9c89.jpg", + "heat": 623604, + "rank": 11, + "can_listen": false, + "recommendation": "", + "creation_aid": 398216313, + "creation_bvid": "BV1uo4y1x7UF", + "creation_cover": "http://i0.hdslb.com/bfs/archive/9562b126010376f7dcfedf0397170696eb1a19c5.jpg", + "creation_title": "姬子老师:开拓者家长们,路上有点堵车,这节挖呀挖呀挖课来晚了", + "creation_up": 391636983, + "creation_nickname": "动漫跳舞姬", + "creation_duration": 33, + "creation_play": 566777, + "creation_reason": "动画创作", + "achievements": [ + "新晋上榜", + "最高排名11" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA455203227252613620", + "music_title": "Cupid", + "singer": "FIFTY FIFTY", + "album": "The Beginning: Cupid", + "mv_aid": 226830843, + "mv_bvid": "BV1sh41137rs", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/e91891c4e2573f4d4ada329db9a86b30.jpg", + "heat": 562273, + "rank": 12, + "can_listen": false, + "recommendation": "", + "creation_aid": 485862497, + "creation_bvid": "BV19T411b7nE", + "creation_cover": "http://i2.hdslb.com/bfs/archive/ece27463e3eb13f9fbbcb799436375495a795e3c.jpg", + "creation_title": "挑战在cp29和一百位coser比心!", + "creation_up": 1477074, + "creation_nickname": "菌儿rikushi", + "creation_duration": 148, + "creation_play": 1216246, + "creation_reason": "COSPLAY创作", + "achievements": [ + "重回榜单", + "最高排名12" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA457806074590836885", + "music_title": "星间旅行", + "singer": "HOYO-MiX,茶理理理子", + "album": "崩坏星穹铁道-星间旅行 Interstellar Journ", + "mv_aid": 612992200, + "mv_bvid": "BV1rh4y1n77f", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/20ddff696bbbd7f00fc8b76f7b5334f7.jpg", + "heat": 515238, + "rank": 13, + "can_listen": false, + "recommendation": "", + "creation_aid": 995418876, + "creation_bvid": "BV1vs4y197gt", + "creation_cover": "http://i0.hdslb.com/bfs/archive/2d6997320bd2bb20f50b363a894033f325fed871.jpg", + "creation_title": "《星穹铁道玩家现状》", + "creation_up": 551188239, + "creation_nickname": "企鹅带带北极熊", + "creation_duration": 88, + "creation_play": 1570181, + "creation_reason": "音乐创作", + "achievements": [ + "本期排名↓10", + "最高排名2" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA434298821720206219", + "music_title": "可愛くてごめん (feat. かぴ)", + "singer": "HoneyWorks,かぴ", + "album": "告白実行委員会 -FLYING SONGS- 恋してる", + "mv_aid": 779733306, + "mv_bvid": "BV1iy4y1Z7Ri", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/45ce3f52d31386741589a3a5ca9a420c.jpg", + "heat": 438720, + "rank": 14, + "can_listen": true, + "recommendation": "", + "creation_aid": 862702118, + "creation_bvid": "BV1gG4y117nV", + "creation_cover": "http://i1.hdslb.com/bfs/archive/38d94515fe5f6294bf7712d8b26eb049ec3cf627.jpg", + "creation_title": "这么可爱真是抱歉!❤️(*/∇\*)天台宅舞", + "creation_up": 434476793, + "creation_nickname": "优联酱uu", + "creation_duration": 140, + "creation_play": 1199819, + "creation_reason": "舞蹈创作", + "achievements": [ + "重回榜单", + "最高排名2" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA440555130794857381", + "music_title": "阳光开朗大男孩", + "singer": "卦者灵风", + "album": "阳光开朗大男孩", + "mv_aid": 421697247, + "mv_bvid": "BV1z341187Y9", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/220c674ca22acb91114f6e0705d0f426.jpg", + "heat": 371851, + "rank": 15, + "can_listen": true, + "recommendation": "", + "creation_aid": 995281134, + "creation_bvid": "BV1as4y1d7QR", + "creation_cover": "http://i0.hdslb.com/bfs/archive/4628837eb5baf879a2be79b16836c90e0466dd6c.jpg", + "creation_title": "【灵能手书】阳光开朗大男孩", + "creation_up": 8504036, + "creation_nickname": "kipoki", + "creation_duration": 81, + "creation_play": 627123, + "creation_reason": "动画创作", + "achievements": [ + "重回榜单", + "最高排名1" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA406539170333366962", + "music_title": "此生不换", + "singer": "青鸟飞鱼", + "album": "仙剑奇侠传三 电视剧原声带", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/450bd04688ef6a691b1adb816ace6155.jpg", + "heat": 361410, + "rank": 16, + "can_listen": false, + "recommendation": "", + "creation_aid": 545438082, + "creation_bvid": "BV1Cq4y1J7Ge", + "creation_cover": "http://i1.hdslb.com/bfs/archive/1b8b80f7ba9dccaf648cfb641b40e1d38965a4a4.jpg", + "creation_title": "开口爷青回!男生宿舍回忆向翻唱仙剑3插曲《此生不换》|我和室友的翻唱日常.", + "creation_up": 346782115, + "creation_nickname": "陈家淇_B11", + "creation_duration": 258, + "creation_play": 2976435, + "creation_reason": "歌曲演唱", + "achievements": [ + "重回榜单", + "最高排名15" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA444928930235832050", + "music_title": "太空电梯", + "singer": "阿鲲", + "album": "流浪地球2电影原声大碟", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/c64c10b911ace04ae45b3172abe3a1d8.jpg", + "heat": 352572, + "rank": 17, + "can_listen": false, + "recommendation": "", + "creation_aid": 269421756, + "creation_bvid": "BV1ic41157cc", + "creation_cover": "http://i0.hdslb.com/bfs/archive/39a27b9d804750325b260f6bc69a3afa8c01a1dc.jpg", + "creation_title": "都说是涂装问题了,看,这战斗力不就上来了吗!", + "creation_up": 478832800, + "creation_nickname": "大刀王五EP", + "creation_duration": 87, + "creation_play": 706377, + "creation_reason": "动画创作", + "achievements": [ + "重回榜单", + "最高排名1" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA400017093531020491", + "music_title": "兰亭序", + "singer": "周杰伦", + "album": "魔杰座", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/a03f7d174c3b01e4c6b3907a115c5434.jpg", + "heat": 347017, + "rank": 18, + "can_listen": false, + "recommendation": "", + "creation_aid": 825572396, + "creation_bvid": "BV1kg4y1L7v6", + "creation_cover": "http://i0.hdslb.com/bfs/archive/59e8436511ff45402e3d5dcf2c01feeb94897103.jpg", + "creation_title": "无关风月我题序等你回《兰亭序》", + "creation_up": 628615890, + "creation_nickname": "qqq还在梦里", + "creation_duration": 125, + "creation_play": 522133, + "creation_reason": "歌曲演唱", + "achievements": [ + "重回榜单", + "最高排名6" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA457811156946443719", + "music_title": "I'll Do It", + "singer": "Heidi Montag", + "album": "Superficial", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/e1d95f62257da69db1dc36e949f789f5.jpg", + "heat": 345773, + "rank": 19, + "can_listen": false, + "recommendation": "", + "creation_aid": 313275936, + "creation_bvid": "BV1XP411y7UD", + "creation_cover": "http://i1.hdslb.com/bfs/archive/c42e54074a50ee1eaddbd5495091c2152aad8ecf.jpg", + "creation_title": "“嗨,老婆” 【崩坏星穹铁道】", + "creation_up": 14158002, + "creation_nickname": "Ishi丶", + "creation_duration": 61, + "creation_play": 103542, + "creation_reason": "动画创作", + "achievements": [ + "本期排名↓12", + "最高排名6" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + }, + { + "music_id": "MA409255441550338398", + "music_title": "失恋阵线联盟", + "singer": "草蜢", + "album": "失恋阵线联盟", + "mv_aid": 0, + "mv_bvid": "", + "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/5d6b27035d5f7c0e7781b779871aca04.jpg", + "heat": 337176, + "rank": 20, + "can_listen": false, + "recommendation": "", + "creation_aid": 415864088, + "creation_bvid": "BV1QV411b7CT", + "creation_cover": "http://i1.hdslb.com/bfs/archive/8735563d73f86ef7073ed580a41e12c409bd2a5b.jpg", + "creation_title": "年会舞蹈《失恋阵线联盟》完整版", + "creation_up": 451425930, + "creation_nickname": "舞大师舞蹈工作室", + "creation_duration": 135, + "creation_play": 5336890, + "creation_reason": "舞蹈创作", + "achievements": [ + "重回榜单", + "最高排名20" + ], + "material_id": 0, + "material_use_num": 0, + "material_duration": 0, + "material_show": 1, + "song_type": 2 + } + ] + } +} +``` + +</details> + +## 订阅或退订榜单 + +> https://api.bilibili.com/x/copyright-music-publicity/toplist/subscribe/update + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ------------------------ | --------------- | ------------------------------------------------ | +| state | num | 操作代码 | 必要 | 1:订阅<br />2:退订 | +| list_id | num | 榜单 id | 非必要 | 见 [获取音频榜单每期列表](#获取音频榜单每期列表) | +| csrf | str | CSRF Token(位于cookie) | Cookie 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 验证失败<br />400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | + +**示例:** + +```bash +curl 'https://api.bilibili.com/x/copyright-music-publicity/toplist/subscribe/update' \ + --data-urlencode 'state=1' \ + --data-urlencode 'state=76' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +</details> diff --git a/audio/status_number.md b/docs/audio/status_number.md similarity index 87% rename from audio/status_number.md rename to docs/audio/status_number.md index a5ca235..62621c1 100644 --- a/audio/status_number.md +++ b/docs/audio/status_number.md @@ -1,12 +1,8 @@ # 音频状态数 -- [歌曲状态数](#歌曲状态数) - ---- - ## 歌曲状态数 ->http://www.bilibili.com/audio/music-service-c/web/stat/song +>https://www.bilibili.com/audio/music-service-c/web/stat/song *请求方式:GET* @@ -43,7 +39,7 @@ 查询歌曲`au15664`的状态数 ```shell -curl -G 'http://www.bilibili.com/audio/music-service-c/web/stat/song' \ +curl -G 'https://www.bilibili.com/audio/music-service-c/web/stat/song' \ --data-urlencode 'sid=15664' ``` diff --git a/docs/bangumi/follow.md b/docs/bangumi/follow.md new file mode 100644 index 0000000..a614e27 --- /dev/null +++ b/docs/bangumi/follow.md @@ -0,0 +1,124 @@ +# 追番相关 + +## 追番 +> https://api.bilibili.com/pgc/web/follow/add + +*请求方式:POST* + +鉴权方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|----------|-----|--------|-----|-----| +| season_id | str | 剧集ssid | 必要 | | +| csrf | str | csrf token(位于cookies中的bili_jct) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ------ | ------------------------------- | +| code | num | 返回值 | 0:成功<br />-111:csrf校验失败 | +| 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* + +鉴权方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | ----------------------------------- | ------ | ---- | +| season_id | str | 剧集ssid | 必要 | | +| csrf | str | csrf token(位于cookies中的bili_jct) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ------ | ------------------------------- | +| code | num | 返回值 | 0:成功<br />-111:csrf校验失败 | +| 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> diff --git a/docs/bangumi/info.md b/docs/bangumi/info.md new file mode 100644 index 0000000..6857cd3 --- /dev/null +++ b/docs/bangumi/info.md @@ -0,0 +1,1033 @@ +# 剧集基本信息 + +## 剧集基本信息(mdid方式) + +> https://api.bilibili.com/pgc/review/user + +*请求方式:GET* + +鉴权方式:Cookie(SESSDATA)或APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|----------|-----|--------|-----|-----| +| media_id | str | 剧集mdid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|----------------------------------| +| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:错误 | +| message | str | 错误信息 | 默认为success | +| result | obj | 信息本体 | | + +`result`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------|-----|--------|----------| +| media | obj | 剧集信息 | | +| review | obj | 用户操作信息 | 仅登录时存在此项 | + +`result`中的`media`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------------|-------|-----------|--------------------------------------------------------------| +| areas | array | 地区 | | +| cover | str | 封面图片url | | +| horizontal_picture | str | 横板封面图片url | | +| media_id | num | 剧集mdid | | +| new_ep | obj | 最新一话信息 | | +| rating | obj | 评分信息 | | +| season_id | num | 剧集ssid | | +| share_url | url | 剧集详情页连接 | | +| title | str | 标题 | | +| type | num | 剧集类型id | 1:番剧<br/>2:电影<br/>3:纪录片<br/>4:国创<br/>5:电视剧<br/>6:漫画<br/>7:综艺 | +| type_name | str | 剧集类型 | | + +`media`中的`areas`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|-----------|-----| +| 0 | obj | 地区信息1 | | +| n | obj | 地区信息(n+1) | | +| …… | obj | …… | | + +`areas`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|-----|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| id | num | 所属地区编号 | 1:中国大陆<br />2:日本<br />3:美国<br />4:英国<br />5:加拿大<br/>6:中国香港<br />7:中国台湾<br/>8:韩国<br />9:法国<br />10:泰国<br />12:新加坡<br/>13:西班牙<br/>14:俄罗斯<br />15:德国<br />16:其他<br/>17:丹麦<br/>18:乌克兰<br/>19:以色列<br/>20:伊朗<br/>24:匈牙利<br/>22:克罗地亚<br/>23:冰岛<br/>24:匈牙利<br/>25:南非<br/>26:印尼<br/>27:印度<br/>30:土耳其<br/>31:墨西哥<br/>32:委内瑞拉<br/>33:巴西<br/>34:希腊<br/>35:意大利<br />36:挪威<br/>37:捷克<br/>39:新西兰<br />40:智利<br/>41:比利时<br/>42:波兰<br/>43:澳大利亚<br/>44:爱尔兰<br/>45:瑞典<br/>46:瑞士<br/>47:芬兰<br/>48:苏联<br/>49:荷兰<br/>51:阿根廷<br/>53:古巴<br/>54:菲律宾<br/>55:哈萨克斯坦 | +| name | str | 所属地区名称 | | + +`media`中的`new_ep`对象: + +| 字段 | 类型 | 内容 | 备注 | +|------------|-----|-----------|--------------------| +| id | num | 最新一话的epid | | +| index | str | 最新一话名称 | | +| index_show | str | 最新一话显示名称 | eg. `第1话`、`更新至第4话` | + +`media`中的`rating`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------|-----|--------|-----| +| count | num | 总计评分人数 | | +| score | num | 评分 | | + +`result`中的`review`对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|-----|--------| +| is_coin | num | 0 | 作用尚不明确 | +| is_open | num | 1 | 作用尚不明确 | + +**示例:** + +查询剧集`md28220978`的基本信息 + +```shell +curl -G 'https://api.bilibili.com/pgc/review/user' \ +--data-urlencode 'media_id=28220978' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "success", + "result": { + "media": { + "areas": [ + { + "id": 2, + "name": "日本" + } + ], + "cover": "http://i0.hdslb.com/bfs/bangumi/8aa0bfce050c72c6626b63d3093a88527c251026.jpg", + "horizontal_picture": "http://i0.hdslb.com/bfs/bangumi/8aa0bfce050c72c6626b63d3093a88527c251026.jpg", + "media_id": 28220978, + "new_ep": { + "id": 21278, + "index": "14", + "index_show": "全14话" + }, + "rating": { + "count": 80693, + "score": 9.9 + }, + "season_id": 1172, + "share_url": "https://www.bilibili.com/bangumi/media/md28220978", + "title": "轻音少女 第一季", + "type": 1, + "type_name": "番剧" + } + } +} +``` + +</details> + +## 获取剧集明细(web端)(ssid/epid方式) + +> https://api.bilibili.com/pgc/view/web/season + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | -------- | ------------ | ------------------------ | +| season_id | num | 番剧ssid | 必要(可选) | season_id与ep_id任选其一 | +| ep_id | num | 剧集epid | 必要(可选) | season_id与ep_id任选其一 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------- | +| code | num | 返回值 | 0:成功<br />-404:错误 | +| message | str | 错误信息 | 默认为success | +| ttl | num | 1 | 作用尚不明确 | +| result | obj | 信息本体 | | + +`result`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ------ | -------------------------- | ------------------------------------------ | +| activity | obj | 参与的活动 | | +| alias | str | 空 | 作用尚不明确 | +| bkg_cover | str | 网页背景图片url | 无则为空 | +| cover | str | 剧集封面图片url | | +| episodes | array | 正片剧集列表 | | +| evaluate | str | 简介 | | +| jp_title | str | 空 | 作用尚不明确 | +| link | str | 简介页面url | | +| media_id | num | 剧集mdid | | +| mode | num | 2 | 作用尚不明确 | +| new_ep | obj | 更新信息 | | +| payment | obj | 会员&付费信息 | 若无相关内容则无此项 | +| positive | obj | | | +| publish | obj | 发布信息 | | +| rating | obj | 评分信息 | 若无相关内容则无此项 | +| record | str | 备案号 | 无则为空 | +| rights | obj | 属性标志信息 | | +| season_id | num | 番剧ssid | | +| season_title | str | 剧集标题 | | +| seasons | array | 同系列所有季信息 | | +| section | array | 花絮、PV、番外等非正片内容 | 若无相关内容则无此项 | +| series | obj | 系列信息 | | +| share_copy | str | 《{标题}》+{备注} | | +| share_sub_title | str | 备注 | | +| share_url | str | 番剧播放页面url | | +| show | obj | 网页全屏标志 | | +| square_cover | str | 方形封面图片url | | +| stat | obj | 状态数 | | +| status | num | | | +| subtitle | str | 剧集副标题 | | +| title | str | 剧集标题 | | +| total | num | 总计正片集数 | 未完结:大多为-1<br />已完结:正整数 | +| type | num | 剧集类型 | 1:番剧<br />2:电影<br />3:纪录片<br />4:国创<br />5:电视剧<br />7:综艺 | +| up_info | obj | UP主信息 | 若无相关内容则无此项 | + +`result`中的`activity`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------- | ------------ | +| head_bg_url | str | 空 | 作用尚不明确 | +| id | num | 活动id | | +| title | str | 活动标题 | | + +`result`中的`episodes`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ------------ | +| 0 | obj | 正片第1集 | | +| n | obj | 正片第(n+1)集 | 按照顺序排列 | +| …… | obj | | | + +`episodes`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | --------------------------------- | -------------------- | +| aid | num | 单集稿件avid | | +| badge | str | 标签文字 | 例如`会员`、`限免`等 | +| badge_info | obj | | | +| badge_type | num | | | +| bvid | str | 单集稿件bvid | | +| cid | num | 视频cid | | +| cover | str | 单集封面url | | +| dimension | obj | 分辨率信息 | | +| from | str | | | +| id | num | 单集epid | | +| link | str | 单集网页url | | +| long_title | str | 单集完整标题 | | +| pub_time | num | 发布时间 | 时间戳 | +| pv | num | 0 | 作用尚不明确 | +| release_date | str | 空 | 作用尚不明确 | +| rights | obj | | | +| share_copy | str | 《{标题}》+第n话+{单集完整标题} | | +| share_url | str | 单集网页url | | +| short_link | str | 单集网页url短链接 | | +| status | num | | | +| subtitle | str | 单集副标题 | 观看次数文字 | +| title | str | 单集标题 | | +| vid | str | 单集vid | vupload_+{cid} | + +`result`中的`new_ep`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ------------ | ---------------- | +| desc | str | 更新备注 | | +| id | num | 最新一话epid | | +| is_new | num | 是否最新发布 | 0:否<br />1:是 | +| title | str | 最新一话标题 | | + +`result`中的`payment`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------- | ---- | ------------ | -------- | +| discount | num | 折扣 | 100为原价 | +| pay_type | obj | 支付相关 | | +| price | str | 售价 | | +| promotion | str | 推广信息 | | +| vip_discount | num | 大会员折扣 | | +| vip_first_promotion | str | | | +| vip_price | str | 大会员售价 | | +| vip_promotion | str | 大会员推广信息 | | + +`payment`中的`pay_type`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------- | ---- | ------------- | ------------------------- | +| allow_discount | num | 启用折扣 | 0:否<br />1:是<br />下同 | +| allow_pack | num | | | +| allow_ticket | num | 启用票券 | | +| allow_time_limit | num | 启用时间限制 | | +| allow_vip_discount | num | 启用大会员折扣 | | +| forbid_bb | num | 禁止使用B币券 | | + +`result`中的`positive`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ---- | ---- | +| id | num | | | +| title | str | | | + +`result`中的`publish`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | ---------------- | ------------------------ | +| is_finish | num | 完结状态 | 0:未完结<br />1:已完结 | +| is_started | num | 是否发布 | 0:未发布<br />1:已发布 | +| pub_time | str | 发布时间 | YYYY-MM-DDD hh:mm:ss | +| pub_time_show | str | 发布时间文字介绍 | | +| unknow_pub_date | num | 0 | 作用尚不明确 | +| weekday | num | 0 | 作用尚不明确 | + +`result`中的`rating`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ------------ | ---- | +| count | num | 总计评分人数 | | +| score | num | 评分 | | + +`result`中的`rights`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | -------- | ------------------------------- | +| allow_bp | num | | | +| allow_bp_rank | num | | | +| allow_download | num | | | +| allow_review | num | | | +| area_limit | num | | | +| ban_area_show | num | | | +| can_watch | num | | | +| copyright | str | 版权标志 | bilibili:授权<br />dujia:独家 | +| forbid_pre | num | | | +| is_cover_show | num | | | +| is_preview | num | | | +| only_vip_download | num | | | +| resource | str | | | +| watch_platform | num | | | + +`result`中的`seasons`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------------- | ------------ | +| 0 | obj | 同系列剧集1 | | +| n | obj | 同系列剧集(n+1) | 按照顺序排列 | +| …… | obj | | | + +`seasons`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ---- | ---- | +| badge | str | | | +| badge_info | obj | | | +| badge_type | num | | | +| cover | str | | | +| media_id | str | | | +| new_ep | num | | | +| season_id | obj | | | +| season_title | num | | | +| season_type | str | | | +| stat | obj | | | + +`result`中的`section`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------------- | ------------ | +| 0 | obj | 其他内容块1 | | +| n | obj | 其他内容块(n+1) | 按照顺序排列 | +| …… | obj | | | + +`section`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| episode_id | num | 0 | | +| episodes | array | 板块内容 | | +| id | num | 板块id? | | +| title | str | 板块标题 | | +| type | num | ? | | + +`result`中的`series`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ------ | ---- | +| series_id | num | 系列id | | +| series_title | str | 系列名 | | + +`result`中的`show`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------- | -------------------- | +| wide_screen | num | 是否全屏 | 0:正常<br />1:全屏 | + +`result`中的`stat`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------ | ---- | +| coins | num | 投币数 | | +| danmakus | num | 弹幕数 | | +| favorites | num | 收藏数 | | +| likes | num | 点赞数 | | +| reply | num | 评论数 | | +| share | num | 分享数 | | +| views | num | 播放数 | | + +`result`中的`up_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ----------- | ---- | +| avatar | str | 头像图片url | | +| follower | num | 粉丝数 | | +| is_follow | num | 0 | | +| mid | num | UP主mid | | +| pendant | obj | | | +| theme_type | num | 0 | | +| uname | str | UP主昵称 | | +| verify_type | num | | | +| vip_status | num | | | +| vip_type | num | | | + +# 获取剧集分集信息 + +> https://api.bilibili.com/pgc/web/season/section + +*请求方式:GET* + +鉴权方式:Cookie(SESSDATA)或APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|-----------|-----|--------|-----|-----| +| season_id | str | 剧集ssid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|-------------------| +| code | num | 返回值 | 0:成功<br />-404:错误 | +| message | str | 错误信息 | 默认为success | +| result | obj | 信息本体 | | + +`result`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------|-------|--------|-----| +| main_section | obj | 正片信息 | | +| section | array | 花絮、PV等 | | + +`result`中的`main_section`对象: + +| 字段 | 类型 | 内容 | 备注 | +|----------|-------|------------------------------|-----| +| episodes | array | 分集信息 | | +| id | num | 分组id | | +| type | num | 0:正片<br/>1:PV&其他<br/>2:OP&ED | | +| title | str | | | + +`episodes`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-----|----------|-----| +| aid | num | 视频av号 | | +| badge | str | | | +| badge_info | obj | | | +| badge_type | num | 0 | | +| cid | num | 分集cid | | +| cover | str | 分集封面 | | +| from | str | bangumi | | +| id | num | 分集epId | | +| is_premiere | num | 0 | | +| long_title | str | 长标题 | | +| share_url | str | 分集播放页url | | +| status | num | 2 | | +| title | str | 短标题 | | +| vid | str | | | + +`badge_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +|----------------|-----|-----|-----| +| bg_color | str | | | +| bg_color_night | str | | | +| text | str | | | + +`section`数组中的对象: + +**同`main_section`对象** + +**示例:** + +```shell +curl -L -X GET 'https://api.bilibili.com/pgc/web/season/section?season_id=42290' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "success", + "result": { + "main_section": { + "episodes": [ + { + "aid": 300876247, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 772096113, + "cover": "http://i0.hdslb.com/bfs/archive/c09aec64c1787e287b0187498a4443177cc2112c.jpg", + "from": "bangumi", + "id": 606591, + "is_premiere": 0, + "long_title": "瞒天过海!罪犯新选组", + "share_url": "https://www.bilibili.com/bangumi/play/ep606591", + "status": 2, + "title": "1", + "vid": "" + }, + { + "aid": 555940678, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 779868818, + "cover": "http://i0.hdslb.com/bfs/archive/52ccef75fc179c7f8a4f2ff989a1249c78f564e0.jpg", + "from": "bangumi", + "id": 606592, + "is_premiere": 0, + "long_title": "光芒四射!遗物日本刀", + "share_url": "https://www.bilibili.com/bangumi/play/ep606592", + "status": 2, + "title": "2", + "vid": "" + }, + { + "aid": 216208730, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 779450100, + "cover": "http://i0.hdslb.com/bfs/archive/7eee64ff758fb426b6cd16bc7d525f4de98fd4dc.jpg", + "from": "bangumi", + "id": 606596, + "is_premiere": 0, + "long_title": "乔装打扮!潜入花街", + "share_url": "https://www.bilibili.com/bangumi/play/ep606596", + "status": 2, + "title": "3", + "vid": "" + }, + { + "aid": 386385026, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 786667756, + "cover": "http://i0.hdslb.com/bfs/archive/6851be597e1fa496a8b1486000e83654c2fac45c.jpg", + "from": "bangumi", + "id": 606597, + "is_premiere": 0, + "long_title": "一探究竟!神秘妖刀", + "share_url": "https://www.bilibili.com/bangumi/play/ep606597", + "status": 2, + "title": "4", + "vid": "" + }, + { + "aid": 729094525, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 793386614, + "cover": "http://i0.hdslb.com/bfs/archive/5dfa30d48188b26c616a05745132a59f6823dade.jpg", + "from": "bangumi", + "id": 606598, + "is_premiere": 0, + "long_title": "展现无遗!和尚与医生的决心", + "share_url": "https://www.bilibili.com/bangumi/play/ep606598", + "status": 2, + "title": "5", + "vid": "" + }, + { + "aid": 599314561, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 798315932, + "cover": "http://i0.hdslb.com/bfs/archive/3daae9ee434d335ff9e5a9d8244bc1e6b7ffa8d0.jpg", + "from": "bangumi", + "id": 606599, + "is_premiere": 0, + "long_title": "直捣敌巢!败德白川屋", + "share_url": "https://www.bilibili.com/bangumi/play/ep606599", + "status": 2, + "title": "6", + "vid": "" + }, + { + "aid": 259686552, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 807199844, + "cover": "http://i0.hdslb.com/bfs/archive/9ff73932c210abe64373be6f3959c2eee6c7470b.jpg", + "from": "bangumi", + "id": 606600, + "is_premiere": 0, + "long_title": "全力阻止!新选组解散", + "share_url": "https://www.bilibili.com/bangumi/play/ep606600", + "status": 2, + "title": "7", + "vid": "" + }, + { + "aid": 514942530, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 814175863, + "cover": "http://i0.hdslb.com/bfs/archive/31a19bf3af61e58f1e8c4a387779fc3272cb47a7.jpg", + "from": "bangumi", + "id": 606601, + "is_premiere": 0, + "long_title": "激烈战斗!池田屋事件", + "share_url": "https://www.bilibili.com/bangumi/play/ep606601", + "status": 2, + "title": "8", + "vid": "" + }, + { + "aid": 515024193, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 819960797, + "cover": "http://i0.hdslb.com/bfs/archive/68a0a12a74e99b6cd85cfa0fb7be70d82d8b6558.jpg", + "from": "bangumi", + "id": 606602, + "is_premiere": 0, + "long_title": "真心炸裂!人之思绪 鬼之念想", + "share_url": "https://www.bilibili.com/bangumi/play/ep606602", + "status": 2, + "title": "9", + "vid": "" + }, + { + "aid": 430293537, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 827739564, + "cover": "http://i0.hdslb.com/bfs/archive/6411f71c947ba9b011ca0fe2891334147ef1e14d.jpg", + "from": "bangumi", + "id": 606603, + "is_premiere": 0, + "long_title": "全力守护!美利坚黑船", + "share_url": "https://www.bilibili.com/bangumi/play/ep606603", + "status": 2, + "title": "10", + "vid": "" + }, + { + "aid": 858116183, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 833436271, + "cover": "http://i0.hdslb.com/bfs/archive/48736284b5cf0f3515cddb95f1c1b8658ec6c5ff.jpg", + "from": "bangumi", + "id": 606604, + "is_premiere": 0, + "long_title": "勇往直前!京都大决战", + "share_url": "https://www.bilibili.com/bangumi/play/ep606604", + "status": 2, + "title": "11", + "vid": "" + }, + { + "aid": 773279679, + "badge": "会员", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "会员" + }, + "badge_type": 0, + "cid": 840839493, + "cover": "http://i0.hdslb.com/bfs/archive/316f7c8a750699bf53ee44d43669fabb0271be86.jpg", + "from": "bangumi", + "id": 606605, + "is_premiere": 0, + "long_title": "替身传说!罪犯新选组", + "share_url": "https://www.bilibili.com/bangumi/play/ep606605", + "status": 13, + "title": "12", + "vid": "" + } + ], + "id": 81861, + "title": "正片", + "type": 0 + }, + "section": [ + { + "episodes": [ + { + "aid": 898153042, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 766274696, + "cover": "http://i0.hdslb.com/bfs/archive/ac27ed20081e99fc36720ef0714f81d8df2c279a.png", + "from": "bangumi", + "id": 576387, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep576387", + "status": 2, + "title": "PV", + "vid": "" + }, + { + "aid": 215937670, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 773008915, + "cover": "http://i0.hdslb.com/bfs/archive/0a6b589e9175dfee1d9699fb55c5c0677941994a.png", + "from": "bangumi", + "id": 606995, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep606995", + "status": 2, + "title": "西川贵教", + "vid": "" + }, + { + "aid": 813460609, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 773007362, + "cover": "http://i0.hdslb.com/bfs/archive/6c8f4136731c1c2f8171f5c006f79f0603d11bdf.png", + "from": "bangumi", + "id": 606998, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep606998", + "status": 2, + "title": "幕末替身声优采访", + "vid": "" + }, + { + "aid": 556287340, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 785468206, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 660464, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep660464", + "status": 2, + "title": "声优对谈 01", + "vid": "" + }, + { + "aid": 984099086, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 792637456, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 669591, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep669591", + "status": 2, + "title": "声优对谈 02", + "vid": "" + }, + { + "aid": 259364452, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 798995285, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 670446, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep670446", + "status": 2, + "title": "声优对谈 03", + "vid": "" + }, + { + "aid": 772146427, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 808201440, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 672539, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep672539", + "status": 2, + "title": "声优对谈 04", + "vid": "" + }, + { + "aid": 687381109, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 814826609, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 676133, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep676133", + "status": 2, + "title": "声优对谈 05", + "vid": "" + }, + { + "aid": 730289528, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 826951152, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 676134, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep676134", + "status": 2, + "title": "声优对谈 07", + "vid": "" + }, + { + "aid": 602813211, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 826951370, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 676135, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep676135", + "status": 2, + "title": "声优对谈 08", + "vid": "" + }, + { + "aid": 515295782, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 826951255, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 676137, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep676137", + "status": 2, + "title": "声优对谈 09", + "vid": "" + }, + { + "aid": 815269384, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 826951558, + "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", + "from": "bangumi", + "id": 676138, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep676138", + "status": 2, + "title": "声优对谈 10", + "vid": "" + } + ], + "id": 82126, + "title": "PV&其他", + "type": 1 + }, + { + "episodes": [ + { + "aid": 556712105, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 794382832, + "cover": "http://i0.hdslb.com/bfs/archive/1f4ab8b9af0689900e7c486c4e676e27988091be.png", + "from": "bangumi", + "id": 670062, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep670062", + "status": 2, + "title": "NCOP", + "vid": "" + }, + { + "aid": 259129266, + "badge": "", + "badge_info": { + "bg_color": "#FB7299", + "bg_color_night": "#BB5B76", + "text": "" + }, + "badge_type": 0, + "cid": 794382772, + "cover": "http://i0.hdslb.com/bfs/archive/d08738a452187a0229c3b99beaf1cb4ff868a030.png", + "from": "bangumi", + "id": 670063, + "is_premiere": 0, + "long_title": "", + "share_url": "https://www.bilibili.com/bangumi/play/ep670063", + "status": 2, + "title": "NCED", + "vid": "" + } + ], + "id": 85065, + "title": "OP&ED", + "type": 2 + } + ] + } +} +``` + +</details> diff --git a/docs/bangumi/timeline.md b/docs/bangumi/timeline.md new file mode 100644 index 0000000..6742cb7 --- /dev/null +++ b/docs/bangumi/timeline.md @@ -0,0 +1,799 @@ +# 番剧或影视时间线 + +## 获取番剧或影视时间线 + +> https://api.bilibili.com/pgc/web/timeline +*请求方式:GET* + +鉴权方式:Cookie(SESSDATA)或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> \ No newline at end of file diff --git a/docs/bangumi/videostream_url.md b/docs/bangumi/videostream_url.md new file mode 100644 index 0000000..e8a53da --- /dev/null +++ b/docs/bangumi/videostream_url.md @@ -0,0 +1,359 @@ +# 视频流URL + +<img src="../../assets/img/download.svg" width="100" height="100"/> + +B站的番剧视频为http流媒体,需要对应的api以视频id获取取流url,并进行取流 + +## 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 />需要认证登录账号 | +| 100 | 智能修复 | 仅支持dash方式<br />需要`fnval&12240=12240`<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格式 | +| 12240 | 是否需求智能修复 | 必须为dash格式<br />需要认证大会员账号 | + +例如:请求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* + +认证方式:Cookie(SESSDATA) + +--- + +关于视频流会员鉴权: + +- 获取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 | 视频清晰度选择 | 非必要 | 未登录默认32(480P)<br />登录默认64(720P)<br />**值含义见上表**<br />注:dash方式无效 | +| fnval | num | 视频获取方式选择 | 非必要 | 默认为0<br />0 2:flv方式(可能会有分段)<br />1:低清mp4方式(仅240P与360P,且限速65K/s)<br />16 80:dash方式(音视频分流,支持H.265) | +| fnver | num | 0 | 非必要 | 固定为0 | +| fourk | num | 是否允许4K视频 | 非必要 | 默认为0<br />画质最高1080P:0<br />画质最高4K:1 | +| 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 | offset(dash、flv)<br/> second(mp4) | 作用尚不明确 | +| 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`中的1P(cid=`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文件 diff --git a/blackroom/banlist.md b/docs/blackroom/banlist.md similarity index 59% rename from blackroom/banlist.md rename to docs/blackroom/banlist.md index c1a8945..9895a0c 100644 --- a/blackroom/banlist.md +++ b/docs/blackroom/banlist.md @@ -1,11 +1,8 @@ # 封禁公示 -- [获取封禁用户公示列表](#获取封禁用户公示列表) -- [封禁处理公示详情](#封禁处理公示详情) +## Enum类型代码 ---- - -**已知的违规类型代码总览:** +### 表1:已知的封禁原因类型代码总览 | 代码 | 含义 | | ---- | -------------------- | @@ -42,10 +39,11 @@ | 31 | 发布违规抽奖 | | 32 | 恶意冒充他人 | -**已知的违规来源代码:** +### 表2:已知的违规类型代码 | 代码 | 含义 | | ---- | -------- | +| 0 | 全部类型 | | 1 | 评论 | | 2 | 弹幕 | | 3 | 私信 | @@ -58,7 +56,7 @@ ## 获取封禁用户公示列表 -> http://api.bilibili.com/x/credit/blocked/list +> https://api.bilibili.com/x/credit/blocked/list *请求方式:GET* @@ -66,11 +64,11 @@ **url参数:** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---------------------------------------------- | -| btype | num | 来源筛选 | 非必要 | 空:全部类型<br />0:系统封禁<br />1:风纪仲裁 | -| otype | num | 类型筛选 | 非必要 | **见上表**<br />**0:全部类型** | -| pn | num | 页码 | 非必要 | 默认为1 | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ------------------------------------------------------------ | +| btype | num | 来源筛选 | 非必要 | 空:全部类型<br />`0`:系统封禁<br />`1`:风纪仲裁(仲裁系统升级后此类型已不再更新) | +| otype | num | 类型筛选 | 非必要 | **见[表2](#表2已知的违规类型代码)**<br />默认为`0`:全部类型 | +| pn | num | 页码 | 非必要 | 默认为`1` | **json回复:** @@ -78,55 +76,55 @@ | 字段 | 类型 | 内容 | 备注 | | ------- | ------ | -------- | ------------ | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | +| code | num | 返回值 | `0`:成功 | +| message | str | 错误信息 | 默认为`0` | +| ttl | num | `1` | | | data | array | 公示列表 | | `data`数组: -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 封禁公示1 | | -| n | obj | 封禁公示(n+1) | | -| …… | obj | …… | …… | +| 项 | 类型 | 内容 | 备注 | +| ---- | ------ | --------------- | ---- | +| 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 | 来源类型 | **见上表** | -| originTypeName | str | 来源名 | | -| punishTitle | str | 公示标题 | | -| punishTime | num | 处罚时间 | 时间戳 | -| punishType | num | 处理手段类型 | 2:封禁<br />3:永久封禁 | -| punishTypeName | str | 处理手段名 | | -| moralNum | num | 0 | 作用尚不明确 | -| blockedDays | num | 封禁天数 | 永封为0 | -| publishStatus | num | 1 | 作用尚不明确 | -| blockedType | num | 处理来源 | 0:系统封禁<br />1:风纪仲裁 | -| blockedForever | num | 是否永封 | 0:非永封<br />1:永封 | -| reasonType | num | 违规类型 | **见上表** | -| reasonTypeName | str | 违规类型名称 | | -| operatorName | str | 空 | 作用尚不明确 | -| caseId | num | 仲裁信息id | 系统封禁时固定为0 | -| ctime | num | 创建时间 | 时间戳 | -| commentSum | num | 该条目评论数 | | +| 字段 | 类型 | 内容 | 备注 | +| ------------------- | ---- | ---------------- | ------------------------------------------- | +| 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 'http://api.bilibili.com/x/credit/blocked/list' \ +curl -G 'https://api.bilibili.com/x/credit/blocked/list' \ --data-urlencode 'btype=' \ --data-urlencode 'otype=0' \ --data-urlencode 'pn=1' @@ -202,7 +200,7 @@ curl -G 'http://api.bilibili.com/x/credit/blocked/list' \ ## 封禁处理公示详情 -> http://api.bilibili.com/x/credit/blocked/info +> https://api.bilibili.com/x/credit/blocked/info *请求方式:GET* @@ -219,46 +217,46 @@ curl -G 'http://api.bilibili.com/x/credit/blocked/list' \ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ----------------------------------------------- | | code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此信息 | -| message | str | 错误信息 | 默认为0 | +| 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 | 来源类型 | **见上表** | -| originTypeName | str | 来源名 | | -| punishTitle | str | 公示标题 | | -| punishTime | num | 处罚时间 | 时间戳 | -| punishType | num | 处理手段类型 | 2:封禁<br />3:永久封禁 | -| punishTypeName | str | 处理手段名 | | -| moralNum | num | 0 | 作用尚不明确 | -| blockedDays | num | 封禁天数 | 永封为0 | -| publishStatus | num | 1 | 作用尚不明确 | -| blockedType | num | 处理来源 | 0:系统封禁<br />1:风纪仲裁 | -| blockedForever | num | 是否永封 | 0:非永封<br />1:永封 | -| reasonType | num | 违规类型 | **违规类型见表** | -| reasonTypeName | str | 违规类型名称 | | -| operatorName | str | 空 | 作用尚不明确 | -| caseId | num | 仲裁信息 | 系统封禁时固定为0 | -| ctime | num | 创建时间 | 时间戳 | -| commentSum | num | 该条目评论数 | | +| 字段 | 类型 | 内容 | 备注 | +| ------------------- | ---- | ---------------- | ------------------------------------------- | +| 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 'http://api.bilibili.com/x/credit/blocked/info' \ +curl -G 'https://api.bilibili.com/x/credit/blocked/info' \ --data-urlencode 'id=1091621' ``` diff --git a/blackroom/jury/action.md b/docs/blackroom/jury/action.md similarity index 54% rename from blackroom/jury/action.md rename to docs/blackroom/jury/action.md index 5b26b7a..700fed3 100644 --- a/blackroom/jury/action.md +++ b/docs/blackroom/jury/action.md @@ -1,14 +1,53 @@ # 仲裁操作 -- [申请加入风纪委员会](#申请加入风纪委员会) -- [拉取新案件](#拉取新案件) -- [进行仲裁投票](#进行仲裁投票) - ---- - ## 申请加入风纪委员会 -> http://api.bilibili.com/x/credit/jury/apply +> 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 />-111:csrf 校验失败<br />25001:申请等级限制(会员等级<3)<br />25002:没有实名认证<br />25003:90天内有封禁记录<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* @@ -42,7 +81,7 @@ Cookie方式: ```shell -curl 'http://api.bilibili.com/x/credit/jury/apply' \ +curl 'https://api.bilibili.com/x/credit/jury/apply' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ``` @@ -50,7 +89,7 @@ curl 'http://api.bilibili.com/x/credit/jury/apply' \ APP方式: ```shell -curl 'http://api.bilibili.com/x/credit/jury/apply' \ +curl 'https://api.bilibili.com/x/credit/jury/apply' \ --data-urlencode 'access_key=xxx' ``` <details> @@ -64,11 +103,71 @@ curl 'http://api.bilibili.com/x/credit/jury/apply' \ } ``` +</details> </details> ## 拉取新案件 -> http://api.bilibili.com/x/credit/jury/caseObtain +> 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* @@ -103,7 +202,7 @@ curl 'http://api.bilibili.com/x/credit/jury/apply' \ Cookie方式: ```shell -curl 'http://api.bilibili.com/x/credit/jury/caseObtain' \ +curl 'https://api.bilibili.com/x/credit/jury/caseObtain' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ``` @@ -111,7 +210,7 @@ curl 'http://api.bilibili.com/x/credit/jury/caseObtain' \ APP方式: ```shell -curl 'http://api.bilibili.com/x/credit/jury/caseObtain' \ +curl 'https://api.bilibili.com/x/credit/jury/caseObtain' \ --data-urlencode 'access_key=xxx' ``` @@ -130,10 +229,56 @@ curl 'http://api.bilibili.com/x/credit/jury/caseObtain' \ ``` </details> +</details> + ## 进行仲裁投票 -> http://api.bilibili.com/x/credit/jury/vote +> 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 />-111:csrf 错误<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* @@ -171,7 +316,7 @@ curl 'http://api.bilibili.com/x/credit/jury/caseObtain' \ Cookie方式: ```shell -curl 'http://api.bilibili.com/x/credit/jury/vote' \ +curl 'https://api.bilibili.com/x/credit/jury/vote' \ --data-urlencode 'cid=2333' \ --data-urlencode 'vote=1' \ --data-urlencode 'content=' \ @@ -188,7 +333,7 @@ curl 'http://api.bilibili.com/x/credit/jury/vote' \ APP方式: ```shell -curl 'http://api.bilibili.com/x/credit/jury/vote' \ +curl 'https://api.bilibili.com/x/credit/jury/vote' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'cid=2333' \ --data-urlencode 'vote=1' \ @@ -213,3 +358,4 @@ curl 'http://api.bilibili.com/x/credit/jury/vote' \ ``` </details> +</details> \ No newline at end of file diff --git a/docs/blackroom/jury/base_info.md b/docs/blackroom/jury/base_info.md new file mode 100644 index 0000000..c86c9fc --- /dev/null +++ b/docs/blackroom/jury/base_info.md @@ -0,0 +1,331 @@ +# 风纪委员会用户基本信息 + +## 基本数据 + +> https://api.bilibili.com/x/credit/v2/jury/jury + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 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>查看折叠内容:</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> + +## 统计信息 + +新API(2021年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>查看折叠内容:</summary> + +> https://api.bilibili.com/x/credit/jury/kpi + +*方式:GET* + +认证方式:Cookie(SESSDATA)或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=A;2=S;3=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* + +认证方式:Cookie(SESSDATA)或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> diff --git a/blackroom/jury/judgement_info.md b/docs/blackroom/jury/judgement_info.md similarity index 50% rename from blackroom/jury/judgement_info.md rename to docs/blackroom/jury/judgement_info.md index c07a686..9b2d9d3 100644 --- a/blackroom/jury/judgement_info.md +++ b/docs/blackroom/jury/judgement_info.md @@ -1,25 +1,259 @@ # 众裁信息 -- [查询投票过的单个案件](#查询投票过的单个案件) -- [查询案件众裁信息](#查询案件众裁信息) -- [查询我的众裁记录](#查询我的众裁记录) -- [获取众议观点](#获取众议观点) +## Enum类型代码 ---- - -投票类型码总览: +### 投票类型码总览 | 代码 | 含义 | -| - | ---- | -| 0 | 未投票 | -| 1 | 封禁 | -| 2 | 否 | -| 3 | 弃权 | -| 4 | 删除 | +| ---- | --- | +| 0 | 未投票 | +| 1 | 封禁 | +| 2 | 否 | +| 3 | 弃权 | +| 4 | 删除 | -## 查询投票过的单个案件 +### 投票选项码总览 -> http://api.bilibili.com/x/credit/jury/juryCase +<table> + <tr> + <th>任务类型</th> + <th>代码</th> + <th>含义</th> + </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* + +认证方式:Cookie(SESSDATA)或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 | 弹幕 dmid | | +| vote_cd | num | `-1` | 暂不明确 | +| result | num | 众议结论 | 见开头「投票选项码总览」 | +| result_text | str | 众议结论文本 | 见开头「投票选项码总览」 | +| title | str | 视频标题 | | +| case_info | object | 案件信息 | | +| my_point | object | 我的观点 | 仅自己投过票才有该字段 | +| vote_info | object | 投票信息 | | + +`data` 对象下的`case_info`对象 + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ------ | ------------ | ----------------------------------------------- | +| comment | object | 单条评论信息 | 仅当`case_type`为`1`有值。见「对象:评论信息」 | +| danmu_img | str | 弹幕截图 | 仅当`case_type`为`4`有值,截图URL | +| comments | object | 若干条评论 | 仅当`case_type`为`2`有值。见「对象:评论信息」 | +| single_danmu | str | 单条弹幕信息 | 仅当`case_type`为`3`有值。见「对象:评论信息)」 | + + +对象:评论信息 + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ------ | ------------------------ | -------------------------------------------------------------- | +| mid | num | 用户uid | | +| uname | str | 用户名 | | +| face | str | 用户头像 | 头像URL | +| content | str | 评论内容 | | +| child_comments | object | 子评论(对该评论的回复) | 见「对象:评论信息」,单条评论和子评论下无`child_comments`字段 | + + +对象:弹幕信息 + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | -------- | ------- | +| id_str | str | 弹幕dmid | | +| content | str | 弹幕内容 | | +| progress | num | | 尚不明确 | + +`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:平时不观看此类视频 | + +`data` 对象下的`vote_info`对象 + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ----- | -------- | -------------------------------------------- | +| all_count | num | 总投票数 | | +| counts | array | 观点分布 | 格式:`[合适, 一般, 不合适, 无法判断]` | +| insiders_counts | array | 行为分布 | 格式:`[平时会看此类视频, 平时不看此类视频]` | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/credit/v2/jury/case/info' \ + --data-urlencode 'case_id=AC2SiaD8jlrL' \ + -b 'SESSDATA=xxx' +``` + +<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* @@ -43,7 +277,7 @@ | code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误<br />25010:没有权限查看案件 | | message | str | 信息 | 默认为0 | | ttl | num | 1 | | -| data | obj | 数据本体 | | +| data | object | 数据本体 | | `data` 对象: @@ -83,7 +317,7 @@ Cookie方式: ```shell -curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ +curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \ --data-urlencode 'cid=1239790' \ -b 'SESSDATA=xxx' ``` @@ -91,7 +325,7 @@ curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ APP方式: ```shell -curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ +curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'cid=1239790' \ ``` @@ -135,11 +369,15 @@ curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ } ``` +</details> </details> ## 查询案件众裁信息 -> http://api.bilibili.com/x/credit/jury/caseInfo +注:这是一个旧版的API,暂未找到对应的新版API。 +<details> +<summary>展开:</summary> +> https://api.bilibili.com/x/credit/jury/caseInfo *请求方式:GET* @@ -155,12 +393,12 @@ curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ 根对象: -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有效时:obj<br />无效时:null | 数据本体 | | +| 字段 | 类型 | 内容 | 备注 | +| ------- | -------------------------------- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 信息 | 默认为0 | +| ttl | num | 1 | | +| data | 有效时:object<br />无效时:null | 数据本体 | | `data` 对象: @@ -196,7 +434,7 @@ curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ 查询案件`1239790`的信息 ```shell -curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ +curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \ --data-urlencode 'cid=1239790' ``` @@ -236,12 +474,94 @@ curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ } } ``` - +</details> </details> ## 查询我的众裁记录 -> http://api.bilibili.com/x/credit/jury/caseList +> 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* @@ -268,11 +588,11 @@ curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ `data`数组: -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------ | -| 0 | obj | 仲裁记录1 | | -| n | obj | 仲裁记录(n+1) | 按照时间顺序 | -| …… | obj | …… | …… | +| 项 | 类型 | 内容 | 备注 | +| ---- | ------ | --------------- | ------------ | +| 0 | object | 仲裁记录1 | | +| n | object | 仲裁记录(n+1) | 按照时间顺序 | +| …… | object | …… | …… | `data`数组中的对象: @@ -312,7 +632,7 @@ curl -G 'http://api.bilibili.com/x/credit/jury/juryCase' \ Cookie方式: ```shell -curl -G 'http://api.bilibili.com/x/credit/jury/caseList' \ +curl -G 'https://api.bilibili.com/x/credit/jury/caseList' \ --data-urlencode 'ps=1' \ --data-urlencode 'pn=1' \ -b 'SESSDATA=xxx' @@ -320,7 +640,7 @@ curl -G 'http://api.bilibili.com/x/credit/jury/caseList' \ APP方式: ```shell -curl -G 'http://api.bilibili.com/x/credit/jury/caseList' \ +curl -G 'https://api.bilibili.com/x/credit/jury/caseList' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'ps=1' \ --data-urlencode 'pn=1' @@ -367,11 +687,117 @@ curl -G 'http://api.bilibili.com/x/credit/jury/caseList' \ } ``` +</details> </details> ## 获取众议观点 -> http://api.bilibili.com/x/credit/jury/case/opinion +> 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 = 20)(default = 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* @@ -392,7 +818,7 @@ curl -G 'http://api.bilibili.com/x/credit/jury/caseList' \ | code | num | 返回值 | 0:成功<br />-400:请求错误 | | message | str | 信息 | 默认为0 | | ttl | num | 1 | | -| data | obj | 数据本体 | | +| data | object | 数据本体 | | `data` 对象: @@ -403,11 +829,11 @@ curl -G 'http://api.bilibili.com/x/credit/jury/caseList' \ `data` 中的`opinion` 数组: -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ------------ | -| 0 | obj | 观点1 | | -| n | obj | 观点(n+1) | 按照时间顺序 | -| …… | obj | …… | …… | +| 项 | 类型 | 内容 | 备注 | +| ---- | ------ | ----------- | ------------ | +| 0 | object | 观点1 | | +| n | object | 观点(n+1) | 按照时间顺序 | +| …… | object | …… | …… | `opinion` 数组中的对象: @@ -428,7 +854,7 @@ curl -G 'http://api.bilibili.com/x/credit/jury/caseList' \ 查看案件`1239790`的众议观点,每页10项,查看第一页 ```shell -curl -G 'http://api.bilibili.com/x/credit/jury/case/opinion' \ +curl -G 'https://api.bilibili.com/x/credit/jury/case/opinion' \ --data-urlencode 'cid=1239790' \ --data-urlencode 'ps=10' \ --data-urlencode 'pn=1' \ @@ -548,4 +974,5 @@ curl -G 'http://api.bilibili.com/x/credit/jury/case/opinion' \ } ``` -</details> \ No newline at end of file +</details> +</details> diff --git a/broadcast/readme.md b/docs/broadcast/readme.md similarity index 94% rename from broadcast/readme.md rename to docs/broadcast/readme.md index e625bb0..a99fedd 100644 --- a/broadcast/readme.md +++ b/docs/broadcast/readme.md @@ -1,12 +1,8 @@ # 全站广播 -可用的广播服务: - -- [视频实时信息](video_room.md)√ - ## 获取广播服务器地址 -> http://api.bilibili.com/x/web-interface/broadcast/servers +> https://api.bilibili.com/x/web-interface/broadcast/servers *请求方式:GET* @@ -62,7 +58,7 @@ 当`platform`=`web`时,不显示节点ip ```shell -curl -G 'http://api.bilibili.com/x/web-interface/broadcast/servers' \ +curl -G 'https://api.bilibili.com/x/web-interface/broadcast/servers' \ --data-urlencode 'platform=web' ``` @@ -97,7 +93,7 @@ curl -G 'http://api.bilibili.com/x/web-interface/broadcast/servers' \ 当`platform`=其他时,显示节点ip ```shell -curl -G 'http://api.bilibili.com/x/web-interface/broadcast/servers' \ +curl -G 'https://api.bilibili.com/x/web-interface/broadcast/servers' \ --data-urlencode 'platform=1' ``` diff --git a/broadcast/video_room.md b/docs/broadcast/video_room.md similarity index 93% rename from broadcast/video_room.md rename to docs/broadcast/video_room.md index c4ae9ff..b0dd551 100644 --- a/broadcast/video_room.md +++ b/docs/broadcast/video_room.md @@ -1,13 +1,5 @@ # 视频实时信息 -- [认证包(上行)](#认证包(上行)) -- [认证包回复(下行)](#认证包回复(下行)) -- [心跳包(上行)](#心跳包(上行)) -- [心跳包回复(实时观看数)(下行)](#心跳包回复(实时观看数)(下行)) -- [普通包(实时弹幕)(下行)](#普通包(实时弹幕)(下行)) - ---- - ## 认证包(上行) **正文内容json:** diff --git a/cheese/info.md b/docs/cheese/info.md similarity index 98% rename from cheese/info.md rename to docs/cheese/info.md index a1c6e4b..b3f0b89 100644 --- a/cheese/info.md +++ b/docs/cheese/info.md @@ -1,10 +1,5 @@ # 课程基本信息 -- [获取课程基本信息](#获取课程基本信息) -- [获取课程分集列表](#获取课程分集列表) - ---- - 课程ssid与epid和番剧不互通 课程avid与普通视频绝大部分api接口不能互通,少部分互通接口如下: @@ -19,7 +14,7 @@ ## 获取课程基本信息 -> http://api.bilibili.com/pugv/view/web/season +> https://api.bilibili.com/pugv/view/web/season *请求方式:GET* @@ -251,7 +246,7 @@ ssid方式: ```shell -curl -G 'http://api.bilibili.com/pugv/view/web/season' \ +curl -G 'https://api.bilibili.com/pugv/view/web/season' \ --data-urlencode 'season_id=61' \ -b 'SESSDATA=xxx' \ -e 'https://www.bilibili.com' @@ -260,7 +255,7 @@ curl -G 'http://api.bilibili.com/pugv/view/web/season' \ epid方式: ```shell -curl -G 'http://api.bilibili.com/pugv/view/web/season' \ +curl -G 'https://api.bilibili.com/pugv/view/web/season' \ --data-urlencode 'ep_id=790' \ -b 'SESSDATA=xxx' \ -e 'https://www.bilibili.com' @@ -466,7 +461,7 @@ curl -G 'http://api.bilibili.com/pugv/view/web/season' \ ## 获取课程分集列表 -> http://api.bilibili.com/pugv/view/web/ep/list +> https://api.bilibili.com/pugv/view/web/ep/list *请求方式:GET* @@ -539,7 +534,7 @@ curl -G 'http://api.bilibili.com/pugv/view/web/season' \ 按照每页5项查询课程`ss61`的分集列表第1页 ```shell -curl -G 'http://api.bilibili.com/pugv/view/web/ep/list' \ +curl -G 'https://api.bilibili.com/pugv/view/web/ep/list' \ --data-urlencode 'season_id=61' \ --data-urlencode 'ps=5 ' \ --data-urlencode 'pn=1' \ diff --git a/cheese/videostream_url.md b/docs/cheese/videostream_url.md similarity index 97% rename from cheese/videostream_url.md rename to docs/cheese/videostream_url.md index 22733f2..fee29dd 100644 --- a/cheese/videostream_url.md +++ b/docs/cheese/videostream_url.md @@ -1,14 +1,10 @@ # 课程视频流URL -- [获取课程视频流URL(web端)](#获取课程视频流URL(web端)) - ---- - -<img src="/imgs/download.svg" width="100" height="100"/> +<img src="../../assets/img/download.svg" width="100" height="100"/> ## 获取课程视频流URL(web端) -> http://api.bilibili.com/pugv/player/web/playurl +> https://api.bilibili.com/pugv/player/web/playurl *请求方式:GET* @@ -123,7 +119,7 @@ 获取课程`ep790`(cid=`132105993`,avid=`76973173`)的视频流url,清晰度为1080P60 ```shell -curl -G 'http://api.bilibili.com/pugv/player/web/playurl' \ +curl -G 'https://api.bilibili.com/pugv/player/web/playurl' \ --data-urlencode 'ep_id=790' \ --data-urlencode 'avid=76973173' \ --data-urlencode 'cid=132105993' \ diff --git a/docs/clientinfo/ip.md b/docs/clientinfo/ip.md new file mode 100644 index 0000000..841f3c3 --- /dev/null +++ b/docs/clientinfo/ip.md @@ -0,0 +1,155 @@ +# 通过ip确定地理位置 + +## 根据请求IP确定属地 + +> https://api.bilibili.com/x/web-interface/zone +> +> https://api.live.bilibili.com/xlive/web-room/v1/index/getIpInfo + +*请求方式: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> + +## 查询任意 IP 地址的归属地 + +> https://api.live.bilibili.com/ip_service/v1/ip_service/get_ip_addr +> https://api.live.bilibili.com/client/v1/Ip/getInfoNew + +注: 以上接口等效 + +*请求方式:GET* + +**URL参数:** + + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| ip | str | IP地址 | 不必要 | IPv4或IPv6地址不限, 留空与[根据请求IP确定地理位置](#根据请求ip确定地理位置)基本相同 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为空 | +| msg | str | 错误信息 | 同message | +| data | obj | 信息本体 | 出错时为空数组 | + +`data`对象: + +与[根据请求IP确定地理位置](#根据请求ip确定地理位置)回复的`data`对象基本相同, 但无 `zone_id` `country_code` 字段 + +**示例:** + +查询请求IP地址的归属地: + +```shell +curl -G 'https://api.live.bilibili.com/client/v1/Ip/getInfoNew' +``` + +<details> +<summary>查看响应示例:</summary> + + +```json +{ + "code": 0, + "msg": "", + "message": "", + "data": { + "addr": "104.28.156.113", + "country": "新加坡", + "province": "新加坡", + "city": "", + "isp": "cloudflare.com", + "latitude": "1.352083", + "longitude": "103.819836" + } +} +``` + +</details> + +查询IP地址`8.8.8.8`的归属地: + +```shell +curl -G 'https://api.live.bilibili.com/ip_service/v1/ip_service/get_ip_addr' \ +--data-urlencode 'ip=8.8.8.8' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "msg": "", + "message": "", + "data": { + "addr": "8.8.8.8", + "country": "GOOGLE.COM", + "province": "GOOGLE.COM", + "city": "", + "isp": "level3.com", + "latitude": "", + "longitude": "" + } +} +``` + +</details> diff --git a/comment/action.md b/docs/comment/action.md similarity index 90% rename from comment/action.md rename to docs/comment/action.md index b04bb1a..a0f4823 100644 --- a/comment/action.md +++ b/docs/comment/action.md @@ -1,17 +1,8 @@ # 评论区操作 -- [发表评论](#发表评论) -- [点赞评论](#点赞评论) -- [点踩评论](#点踩评论) -- [删除评论](#删除评论) -- [置顶评论](#置顶评论) -- [举报评论](#举报评论) - ---- - ## 发表评论 -> http://api.bilibili.com/x/v2/reply/add +> https://api.bilibili.com/x/v2/reply/add *请求方式:POST* @@ -34,12 +25,12 @@ 根对象: -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<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 />**(其他错误码有待补充)** | -| message | str | 错误信息 | <br /> | -| ttl | num | 1 | | -| data | obj | 数据本体 | | +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<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 />12045:购买后即可发表评论<br/>**(其他错误码有待补充)** | +| message | str | 错误信息 | <br /> | +| ttl | num | 1 | | +| data | obj | 数据本体 | | `data`对象: @@ -65,7 +56,7 @@ 给视频`av243322853`发送内容为`测试test[泠鸢yousa_awsl]`的评论(带有表情转义符),平台标识为1(web端) ```shell -curl 'http://api.bilibili.com/x/v2/reply/add' \ +curl 'https://api.bilibili.com/x/v2/reply/add' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=243322853' \ --data-urlencode 'message=测试test[泠鸢yousa_awsl]' \ @@ -235,7 +226,7 @@ curl 'http://api.bilibili.com/x/v2/reply/add' \ ## 点赞评论 -> http://api.bilibili.com/x/v2/reply/action +> https://api.bilibili.com/x/v2/reply/action *请求方式:POST* @@ -269,7 +260,7 @@ curl 'http://api.bilibili.com/x/v2/reply/add' \ 点赞视频`av243322853`下评论`rpid=3039053308` ```shell -curl 'http://api.bilibili.com/x/v2/reply/action' \ +curl 'https://api.bilibili.com/x/v2/reply/action' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=243322853' \ --data-urlencode 'rpid=3039053308' \ @@ -293,7 +284,7 @@ curl 'http://api.bilibili.com/x/v2/reply/action' \ ## 点踩评论 -> http://api.bilibili.com/x/v2/reply/hate +> https://api.bilibili.com/x/v2/reply/hate *请求方式:POST* @@ -327,7 +318,7 @@ curl 'http://api.bilibili.com/x/v2/reply/action' \ 点踩视频`av243322853`下评论`rpid=3039053308` ```shell -curl 'http://api.bilibili.com/x/v2/reply/hate' \ +curl 'https://api.bilibili.com/x/v2/reply/hate' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=243322853' \ --data-urlencode 'rpid=3039053308' \ @@ -351,7 +342,7 @@ curl 'http://api.bilibili.com/x/v2/reply/hate' \ ## 删除评论 -> http://api.bilibili.com/x/v2/reply/del +> https://api.bilibili.com/x/v2/reply/del *请求方式:POST* @@ -384,7 +375,7 @@ curl 'http://api.bilibili.com/x/v2/reply/hate' \ 删除`av243322853`下评论`rpid=3039053308` ```shell -curl 'http://api.bilibili.com/x/v2/reply/del' \ +curl 'https://api.bilibili.com/x/v2/reply/del' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=243322853' \ --data-urlencode 'rpid=3039053308' \ @@ -407,7 +398,7 @@ curl 'http://api.bilibili.com/x/v2/reply/del' \ ## 置顶评论 -> http://api.bilibili.com/x/v2/reply/top +> https://api.bilibili.com/x/v2/reply/top *请求方式:POST* @@ -441,7 +432,7 @@ curl 'http://api.bilibili.com/x/v2/reply/del' \ 置顶视频`av243322853`下评论`rpid=2940645593` ```shell -curl 'http://api.bilibili.com/x/v2/reply/top' \ +curl 'https://api.bilibili.com/x/v2/reply/top' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=243322853' \ --data-urlencode 'rpid=2940645593' \ @@ -465,7 +456,7 @@ curl 'http://api.bilibili.com/x/v2/reply/top' \ ## 举报评论 -> http://api.bilibili.com/x/v2/reply/report +> https://api.bilibili.com/x/v2/reply/report *请求方式:POST* @@ -512,7 +503,7 @@ curl 'http://api.bilibili.com/x/v2/reply/top' \ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-403:权限不足<br />-404:无此项<br />-500:服务器错误<br />-509:请求过于频繁<br />12002:评论区已关闭<br />12006:没有该评论<br />12008:已经举报过了<br />12009:评论主体的type不合法<br />12019:举报过于频繁<br />**(其他错误码有待补充)** | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-403:权限不足<br />-404:无此项<br />-500:服务器错误<br />-509:请求过于频繁<br />12002:评论区已关闭<br />12006:没有该评论<br />12008:已经举报过了<br />12009:评论主体的type不合法<br />12019:举报过于频繁<br />12077:其他举报理由过长或过短<br />**(其他错误码有待补充)** | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | @@ -521,7 +512,7 @@ curl 'http://api.bilibili.com/x/v2/reply/top' \ 举报视频` av752881391 `下评论`rpid=3062537442`,理由是`引战` ```shell -curl 'http://api.bilibili.com/x/v2/reply/report' \ +curl 'https://api.bilibili.com/x/v2/reply/report' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=752881391' \ --data-urlencode 'rpid=3062537442' \ diff --git a/comment/list.md b/docs/comment/list.md similarity index 50% rename from comment/list.md rename to docs/comment/list.md index 35724f0..e371a4e 100644 --- a/comment/list.md +++ b/docs/comment/list.md @@ -1,18 +1,8 @@ # 评论区明细 -- [获取评论区明细_翻页加载](#获取评论区明细_翻页加载) -- [获取评论区明细_懒加载](#获取评论区明细_懒加载) -- [获取指定评论的回复](#获取指定评论的回复) -- [获取指定评论对话树](获取指定评论对话树) -- [获取评论区热评](#获取评论区热评) -- [获取指定评论信息](#获取指定评论信息) -- [获取评论区评论总数](#获取评论区评论总数) - ---- - ## 获取评论区明细_翻页加载 -> http://api.bilibili.com/x/v2/reply +> https://api.bilibili.com/x/v2/reply *请求方式:GET* @@ -27,7 +17,7 @@ | oid | num | 目标评论区 id | 必要 | | | sort | num | 排序方式 | 非必要 | 默认为0<br />0:按时间<br />1:按点赞数<br />2:按回复数 | | nohot | num | 是否不显示热评 | 非必要 | 默认为0<br />1:不显示<br />0:显示 | -| ps | num | 每页项数 | 非必要 | 默认为20<br />定义域:1-49 | +| ps | num | 每页项数 | 非必要 | 默认为20<br />定义域:1-20 | | pn | num | 页码 | 非必要 | 默认为1 | **json回复:** @@ -47,8 +37,8 @@ | ------------ | -------------------------------- | -------- | ---------------- | | page | obj | 页信息 | | | config | obj | 评论区显示控制 | | -| replies | 禁用时:null<br />正常时:array | 评论列表 | | -| hots | 禁用时:null<br />正常时:array | 热评列表 | | +| replies | 禁用时:null<br />正常时:array | 评论列表 | | +| hots | 禁用时:null<br />正常时:array | 热评列表 | | | upper | obj | 置顶评论 | | | top | null | (?) | | | notice | 无效时:null<br />有效时:obj | 评论区公告信息 | | @@ -128,7 +118,7 @@ | 字段 | 类型 | 内容 | 备注 | | ------------------------ | ---- | ------------------ | ----------------------------------- | -| input_disable | bool | 禁止输入? | | +| input_disable | bool | 是否禁止新增评论 | 用户涉及合约争议,锁定该用户所有稿件、动态的评论区,不允许新增评论,`root_input_text`和`child_input_text`值为“当前评论区不可新增评论” | | root_input_text | str | 评论框文字 | | | child_input_text | str | 评论框文字 | | | bg_text | str | 空评论区文字 | | @@ -143,7 +133,7 @@ 获取视频`av2`的评论区明细,不显示热评,按照热度排序,每页5项,查看第1页 ```shell -curl -G 'http://api.bilibili.com/x/v2/reply' \ +curl -G 'https://api.bilibili.com/x/v2/reply' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=2' \ --data-urlencode 'sort=1' \ @@ -866,11 +856,15 @@ curl -G 'http://api.bilibili.com/x/v2/reply' \ ## 获取评论区明细_懒加载 -> http://api.bilibili.com/x/v2/reply/main +> https://api.bilibili.com/x/v2/reply/wbi/main + +> ~~https://api.bilibili.com/x/v2/reply/main~~ *请求方式:GET* -认证方式:Cookie(SESSDATA)或APP +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +注: Wbi 签名错误时返回 -403 而非 -352 **url参数:** @@ -880,8 +874,39 @@ curl -G 'http://api.bilibili.com/x/v2/reply' \ | type | num | 评论区类型代码 | 必要 | [类型代码见表](readme.md#评论区类型代码) | | oid | num | 目标评论区 id | 必要 | | | mode | num | 排序方式 | 非必要 | 默认为 3<br />0 3:仅按热度<br />1:按热度+按时间<br />2:仅按时间 | -| next | num | 评论页选择 | 非必要 | 按热度时:热度顺序页码(0 为第一页)<br />按时间时:时间倒序楼层号<br />默认为 0 | -| ps | num | 每页项数 | 非必要 | 默认为 20<br />定义域:1-30 | +| next | num | 翻页 | 非必要 | 不推荐, 已弃用, 优先级比 `pagination_str` 高 | +| pagination_str | obj | 分页信息 | 非必要 | 见下 | +| plat | num | 平台类型 | 非必要 | 如 `1` | +| seek_rpid | str | 空 | 非必要 | 当获取第一页评论时存在 | +| web_location | str | 1315875 | 非必要 | | + +`pagination_str`: + +| 参数名 | 类型 | 内容 | 备注 | +| ----- | - | ------|------| +| offset | str | 一个套着字符串皮的 JSON Object | 上次响应 `data.cursor.pagination_reply.next_offset` 的值, 获取第一页时为空, 其余见下参考 | + +`pagination_str` 中的 `offset`: + +| 参数名 | 类型 | 内容 | 备注 | +| ----- | ---- | -- | - | +| type | num | 类型 | 当 URL 参数 mode 为 2 时, 此项为 3<br />当 URL 参数 mode 为 3 时, 此项为 1 | +| direction | num | 方向 | 1: 正序(默认)<br />2: 倒序 | +| data | obj | 分页数据 | 当 type 为 1 时存在 | +| Data | obj | 分页数据 | 当 type 为 3 时存在 | +<!--not typo here--> + +`offset` 中的 `data` (type=1): + +| 参数名 | 类型 | 内容 | 备注 | +| - | - | - | - | +| pn | num | 页码 (上次响应 `data.cursor.next` 的值) | | + +`offset` 中的 `Data` (type=3): + +| 参数名 | 类型 | 内容 | 备注 | +| - | - | - | - | +| cursor | num | 上次响应 `data.cursor.next` 的值 | | **json回复:** @@ -918,6 +943,10 @@ curl -G 'http://api.bilibili.com/x/v2/reply' \ | upper | obj | UP主信息 | | | show_bvid | bool | 显示 bvid? | | | control | obj | 评论区输入属性 | | +| note | num | 1 | | +| esports_grade_card | null | | | +| callbacks | null | | | +| context_feature | str | | | `data`中的`cursor`对象: @@ -929,9 +958,17 @@ curl -G 'http://api.bilibili.com/x/v2/reply' \ | next | num | 下页页码 | | | is_end | bool | 是否为最后页 | false:否<br />true:是 | | mode | num | 排序方式 | | -| show_type | num | (?) | | | support_mode | array | 支持的排序方式 | | | name | str | 评论区类型名 | | +| pagination_reply | str | 用于下一次请求的偏移信息 | | +| session_id | str | 空 | | + +`cursor`中的`pagination_reply`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -- | - | +| next_offset | str | 用于下一次请求的偏移信息 | | +| prev_offset | str | 用于本次请求的偏移信息 | | `data`中的`config`对象: @@ -1008,2687 +1045,512 @@ curl -G 'http://api.bilibili.com/x/v2/reply' \ **示例:** -获取视频`av2`的评论区明细,按照热度排序,每页5项,查看第1页 +获取视频`av2`的评论区明细, 按时间排序, 第一页 ```shell -curl -G 'http://api.bilibili.com/x/v2/reply/main' \ ---data-urlencode 'type=1' \ +curl -G 'https://api.bilibili.com/x/v2/reply/wbi/main' \ --data-urlencode 'oid=2' \ ---data-urlencode 'mode=3' \ ---data-urlencode 'next=0' \ ---data-urlencode 'ps=5' \ --b 'SESSDATA=xxx' +--data-urlencode 'type=1' \ +--data-urlencode 'mode=2' \ +--data-urlencode 'w_rid=xxx' \ +--data-urlencode 'wts=xxx' ``` <details> <summary>查看响应示例:</summary> -```json +```jsonc { - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "cursor": { - "all_count": 76793, - "is_begin": true, - "prev": 1, - "next": 2, - "is_end": false, - "mode": 3, - "show_type": 1, - "support_mode": [ - 1, - 2, - 3 - ], - "name": "热门评论" + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "cursor": { + "is_begin": true, + "prev": 71880, + "next": 71859, + "is_end": false, + "mode": 2, + "mode_text": "", + "all_count": 86234, + "support_mode": [ + 2, + 3 + ], + "name": "最新评论", + "pagination_reply": { + "next_offset": "{\"type\":3,\"direction\":1,\"Data\":{\"cursor\":71859}}" + }, + "session_id": "" + }, + "replies": [ + { + "rpid": 237740291920, + "oid": 2, + "type": 1, + "mid": 1201423076, + "root": 0, + "parent": 0, + "dialog": 0, + "count": 0, + "rcount": 0, + "state": 0, + "fansgrade": 0, + "attr": 0, + "ctime": 1723639342, + "mid_str": "1201423076", + "oid_str": "2", + "rpid_str": "237740291920", + "root_str": "0", + "parent_str": "0", + "dialog_str": "0", + "like": 0, + "action": 0, + "member": { + "mid": "1201423076", + "uname": "天堂いyoulin", + "sex": "保密", + "sign": "", + "avatar": "https://i2.hdslb.com/bfs/face/d0925e782198cadc0c400a3ed4fbdf94142357fb.jpg", + "rank": "10000", + "face_nft_new": 0, + "is_senior_member": 0, + "senior": {}, + "level_info": { + "current_level": 4, + "current_min": 0, + "current_exp": 0, + "next_exp": 0 + }, + "pendant": { + "pid": 0, + "name": "", + "image": "", + "expire": 0, + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0 + }, + "nameplate": { + "nid": 0, + "name": "", + "image": "", + "image_small": "", + "level": "", + "condition": "" + }, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 0, + "vipDueDate": 0, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "", + "use_img_label": true, + "img_label_uri_hans": "", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" + }, + "avatar_subscript": 0, + "nickname_color": "" + }, + "fans_detail": null, + "user_sailing": { + "pendant": null, + "cardbg": null, + "cardbg_with_focus": null + }, + "user_sailing_v2": {}, + "is_contractor": false, + "contract_desc": "", + "nft_interaction": null, + "avatar_item": { + "container_size": { + "width": 1.8, + "height": 1.8 + }, + "fallback_layers": { + "layers": [ + { + "visible": true, + "general_spec": { + "pos_spec": { + "coordinate_pos": 2, + "axis_x": 0.9, + "axis_y": 0.9 + }, + "size_spec": { + "width": 1, + "height": 1 + }, + "render_spec": { + "opacity": 1 + } + }, + "layer_config": { + "tags": { + "AVATAR_LAYER": {} + }, + "is_critical": true, + "layer_mask": { + "general_spec": { + "pos_spec": { + "coordinate_pos": 2, + "axis_x": 0.9, + "axis_y": 0.9 + }, + "size_spec": { + "width": 1, + "height": 1 + }, + "render_spec": { + "opacity": 1 + } + }, + "mask_src": { + "src_type": 3, + "draw": { + "draw_type": 1, + "fill_mode": 1, + "color_config": { + "day": { + "argb": "#FF000000" + } + } + } + } + } + }, + "resource": { + "res_type": 3, + "res_image": { + "image_src": { + "src_type": 1, + "placeholder": 6, + "remote": { + "url": "https://i2.hdslb.com/bfs/face/d0925e782198cadc0c400a3ed4fbdf94142357fb.jpg", + "bfs_style": "widget-layer-avatar" + } + } + } + } + } + ], + "is_critical_group": true + }, + "mid": "1201423076" + } }, - "hots": null, - "notice": null, - "replies": [ - { - "rpid": 476670, - "oid": 2, - "type": 1, - "mid": 58426, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 2733, - "rcount": 2608, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1291350931, - "rpid_str": "476670", - "root_str": "0", - "parent_str": "0", - "like": 90419, - "action": 0, - "member": { - "mid": "58426", - "uname": "残星什么的就是残星", - "sex": "男", - "sign": "少说话多做事 _微博@残星", - "avatar": "http://i1.hdslb.com/bfs/face/56ac36b37662e3746228f30eb4acf2cd332b66a5.jpg", - "rank": "20000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 30, - "name": "字幕君", - "image": "http://i1.hdslb.com/bfs/face/383c3fed3dc162c93a8d616a272693f6650e98f1.png", - "image_small": "http://i2.hdslb.com/bfs/face/7ad18084e40b725210e22696e0efdae408cd378c.png", - "level": "稀有勋章", - "condition": "弹幕大赛获得" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1710777600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "貌似没人来", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 6 - }, - "replies": [ - { - "rpid": 214198733, - "oid": 2, - "type": 1, - "mid": 18370638, - "root": 476670, - "parent": 476670, - "dialog": 214198733, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1488888369, - "rpid_str": "214198733", - "root_str": "476670", - "parent_str": "476670", - "like": 1958, - "action": 0, - "member": { - "mid": "18370638", - "uname": "初音ハク", - "sex": "保密", - "sign": "我是艾尔的利刃", - "avatar": "http://i0.hdslb.com/bfs/face/71b838cc7c69dc16e0ad49fa4e6f84a2fe2eaadb.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 74, - "name": "大会员2018年度勋章", - "image": "http://i0.hdslb.com/bfs/face/421179426c929dfeaed4117461c83f5d07ffb148.png", - "image_small": "http://i2.hdslb.com/bfs/face/682001c2e1c2ae887bdf2a0e18eef61180c48f84.png", - "level": "稀有勋章", - "condition": "2018.6.26-7.8某一天是年度大会员" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1654790400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "划了4千多条评论找到的啊ε=ε=(ノ≧∇≦)ノ", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "1821天前发布" - } - }, - { - "rpid": 568785293, - "oid": 2, - "type": 1, - "mid": 52987877, - "root": 476670, - "parent": 476670, - "dialog": 568785293, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1514903586, - "rpid_str": "568785293", - "root_str": "476670", - "parent_str": "476670", - "like": 6534, - "action": 0, - "member": { - "mid": "52987877", - "uname": "Mr-Shadow", - "sex": "男", - "sign": "重灾区话题回避", - "avatar": "http://i2.hdslb.com/bfs/face/dc679f8221b27e2056c1ad018d168402d80d98d5.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 2511, - "name": "初音未来13周年", - "image": "http://i2.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", - "expire": 0, - "image_enhance": "http://i2.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", - "image_enhance_frame": "http://i2.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png" - }, - "nameplate": { - "nid": 61, - "name": "有爱楷模", - "image": "http://i2.hdslb.com/bfs/face/5a90f715451325c642a6ac39e01195cb6d075734.png", - "image_small": "http://i0.hdslb.com/bfs/face/5bfc1b4fb3f4b411495dddb0b2127ad80f6fbcac.png", - "level": "普通勋章", - "condition": "当前持有粉丝勋章最高等级>=10级" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1666281600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 2511, - "name": "初音未来13周年", - "image": "http://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", - "jump_url": "", - "type": "suit", - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", - "image_enhance_frame": "http://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png" - }, - "cardbg": { - "id": 2528, - "name": "初音未来13周年", - "image": "http://i0.hdslb.com/bfs/garb/item/7dbd22f700e0a7fe0c0d0da7b1a54241626bf1cd.png", - "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/2554?navhide=1&mid=52987877&from=reply", - "fan": { - "is_fan": 1, - "number": 94388, - "color": "#07b6d5", - "name": "初音未来周年纪念", - "num_desc": "094388" - }, - "type": "suit" - }, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "你可能抢到了整个b站最难抢到的沙发(`・ω・´)", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "1520天前发布" - } - }, - { - "rpid": 2237449754, - "oid": 2, - "type": 1, - "mid": 400121455, - "root": 476670, - "parent": 568785293, - "dialog": 568785293, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1578311878, - "rpid_str": "2237449754", - "root_str": "476670", - "parent_str": "568785293", - "like": 194, - "action": 0, - "member": { - "mid": "400121455", - "uname": "TxAY丶", - "sex": "保密", - "sign": "6月后有空做视频 | 星火工作室后期、CM拜年祭制作成员", - "avatar": "http://i1.hdslb.com/bfs/face/ce011d50196afd8fedc45240f6aebab061aee524.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 4, - "name": "青铜殿堂", - "image": "http://i2.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", - "image_small": "http://i1.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", - "level": "普通勋章", - "condition": "单个自制视频总播放数>=1万" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626364800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @Mr-Shadow :你可能抢到了整个b站最难抢到的热评的热评", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "786天前发布" - } - } - ], - "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": true, - "invisible": false, - "reply_control": { - "sub_reply_entry_text": "共2608条回复", - "sub_reply_title_text": "相关回复共2608条", - "time_desc": "4107天前发布" - } - }, - { - "rpid": 917945205, - "oid": 2, - "type": 1, - "mid": 34762090, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 461, - "rcount": 365, - "state": 0, - "fansgrade": 1, - "attr": 0, - "ctime": 1532071373, - "rpid_str": "917945205", - "root_str": "0", - "parent_str": "0", - "like": 29793, - "action": 0, - "member": { - "mid": "34762090", - "uname": "某不科学的瓜皮", - "sex": "男", - "sign": "持杯拱天,谓无言,静沉眠", - "avatar": "http://i1.hdslb.com/bfs/face/cc61140c64409a3f5793207f3c866555e8638ab5.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 4, - "name": "青铜殿堂", - "image": "http://i0.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", - "image_small": "http://i2.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", - "level": "普通勋章", - "condition": "单个自制视频总播放数>=1万" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1631980800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": { - "uid": 34762090, - "medal_id": 29058, - "medal_name": "逸国", - "score": 0, - "level": 1, - "intimacy": 0, - "master_status": 1, - "is_receive": 1, - "medal_color": 643602062, - "medal_color_end": 643602062, - "medal_color_border": 4284257934, - "medal_color_name": 4284257934, - "medal_color_level": 4284257934, - "guard_level": 0 - }, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "7.20日,站长被封7天\n\n历史性留名[2233娘_卖萌]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[2233娘_卖萌]": { - "id": 140, - "package_id": 6, - "state": 0, - "type": 2, - "attr": 0, - "text": "[2233娘_卖萌]", - "url": "http://i0.hdslb.com/bfs/emote/ea893aa25355de95ab4f03c2dad3f0c58d0c159e.png", - "meta": { - "size": 2 - }, - "mtime": 1626664892, - "jump_title": "卖萌" - } - }, - "jump_url": {}, - "max_line": 6 - }, - "replies": [ - { - "rpid": 1781253749, - "oid": 2, - "type": 1, - "mid": 34762090, - "root": 917945205, - "parent": 917945205, - "dialog": 1781253749, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 1, - "attr": 0, - "ctime": 1563598609, - "rpid_str": "1781253749", - "root_str": "917945205", - "parent_str": "917945205", - "like": 1224, - "action": 0, - "member": { - "mid": "34762090", - "uname": "某不科学的瓜皮", - "sex": "男", - "sign": "持杯拱天,谓无言,静沉眠", - "avatar": "http://i1.hdslb.com/bfs/face/cc61140c64409a3f5793207f3c866555e8638ab5.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 4, - "name": "青铜殿堂", - "image": "http://i0.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", - "image_small": "http://i2.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", - "level": "普通勋章", - "condition": "单个自制视频总播放数>=1万" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1631980800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": { - "uid": 34762090, - "medal_id": 29058, - "medal_name": "逸国", - "score": 0, - "level": 1, - "intimacy": 0, - "master_status": 1, - "is_receive": 1, - "medal_color": 643602062, - "medal_color_end": 643602062, - "medal_color_border": 4284257934, - "medal_color_name": 4284257934, - "medal_color_level": 4284257934, - "guard_level": 0 - }, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "站长被封一周年 [小电视_笑]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[小电视_笑]": { - "id": 121, - "package_id": 5, - "state": 0, - "type": 2, - "attr": 0, - "text": "[小电视_笑]", - "url": "http://i0.hdslb.com/bfs/emote/f80d384875183dfe2e24be13011c595c0210d273.png", - "meta": { - "size": 2 - }, - "mtime": 1628587688, - "jump_title": "笑" - } - }, - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "956天前发布" - } - }, - { - "rpid": 1781556726, - "oid": 2, - "type": 1, - "mid": 417437969, - "root": 917945205, - "parent": 1781253749, - "dialog": 1781253749, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1563605321, - "rpid_str": "1781556726", - "root_str": "917945205", - "parent_str": "1781253749", - "like": 372, - "action": 0, - "member": { - "mid": "417437969", - "uname": "理查奈德", - "sex": "男", - "sign": "欲雷普琪露诺的各种小圈子小鬼", - "avatar": "http://i2.hdslb.com/bfs/face/6923f6414503413f292a1cfad13ac483683a77d6.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @某不科学的瓜皮 :这是件值得庆祝的日子啊(滑稽保命)[滑稽]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[滑稽]": { - "id": 27, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[滑稽]", - "url": "http://i0.hdslb.com/bfs/emote/d15121545a99ac46774f1f4465b895fe2d1411c3.png", - "meta": { - "size": 1 - }, - "mtime": 1645206695, - "jump_title": "滑稽" - } - }, - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "956天前发布" - } - }, - { - "rpid": 2254034005, - "oid": 2, - "type": 1, - "mid": 435781129, - "root": 917945205, - "parent": 917945205, - "dialog": 2254034005, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1578829367, - "rpid_str": "2254034005", - "root_str": "917945205", - "parent_str": "917945205", - "like": 137, - "action": 0, - "member": { - "mid": "435781129", - "uname": "yourmumdie", - "sex": "保密", - "sign": "签名不能留八个字", - "avatar": "http://i1.hdslb.com/bfs/face/77489a807c616304cef9ac446b8bed2528de4e25.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1644249600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "av7", - "plat": 0, - "device": "", - "members": [], - "jump_url": { - "av7": { - "title": "2012地球便当之日宣传片", - "state": 0, - "prefix_icon": "https://i0.hdslb.com/bfs/activity-plat/static/20201110/4c8b2dbaded282e67c9a31daa4297c3c/AeQJlYP7e.png", - "app_url_schema": "", - "app_name": "", - "app_package_name": "", - "click_report": "7", - "is_half_screen": false, - "exposure_report": "" - } - }, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "780天前发布" - } - } - ], - "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": true, - "invisible": false, - "reply_control": { - "sub_reply_entry_text": "共365条回复", - "sub_reply_title_text": "相关回复共365条", - "time_desc": "1321天前发布" - } - }, - { - "rpid": 2576184175, - "oid": 2, - "type": 1, - "mid": 24512285, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 1066, - "rcount": 1000, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1584945297, - "rpid_str": "2576184175", - "root_str": "0", - "parent_str": "0", - "like": 44307, - "action": 0, - "member": { - "mid": "24512285", - "uname": "艾斯黛斯T", - "sex": "男", - "sign": "飞飞飞", - "avatar": "http://i2.hdslb.com/bfs/face/e2176a16d749fdb720d4181309d4075c91db7952.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 4104, - "name": "良辰美景·不问天", - "image": "http://i2.hdslb.com/bfs/garb/item/4dbf08aae75f9479a21db2bb289229b8d71631e1.png", - "expire": 0, - "image_enhance": "http://i2.hdslb.com/bfs/garb/item/253bf41272ddef301c1f6a0361abd49d772bfafc.webp", - "image_enhance_frame": "http://i2.hdslb.com/bfs/garb/item/c4934a1ffdb3865fe79b319de439af3973b53ec9.png" - }, - "nameplate": { - "nid": 58, - "name": "收集达人", - "image": "http://i0.hdslb.com/bfs/face/3f5539e1486303422ffc8595862ccb6606e0b745.png", - "image_small": "http://i0.hdslb.com/bfs/face/cf85e7908095d256e595ec9759f4e7795f23bc22.png", - "level": "普通勋章", - "condition": "同时拥有粉丝勋章>=15个" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1646236800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 4104, - "name": "良辰美景·不问天", - "image": "http://i0.hdslb.com/bfs/garb/item/4dbf08aae75f9479a21db2bb289229b8d71631e1.png", - "jump_url": "", - "type": "suit", - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/253bf41272ddef301c1f6a0361abd49d772bfafc.webp", - "image_enhance_frame": "http://i0.hdslb.com/bfs/garb/item/c4934a1ffdb3865fe79b319de439af3973b53ec9.png" - }, - "cardbg": { - "id": 4123, - "name": "良辰美景·不问天", - "image": "http://i0.hdslb.com/bfs/garb/item/f251c507a2b09605d414c9107ffe2073bbf65735.png", - "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/4019?navhide=1&mid=24512285&from=reply", - "fan": { - "is_fan": 1, - "number": 70746, - "color": "#fe7491", - "name": "良辰美景·不问天", - "num_desc": "070746" - }, - "type": "suit" - }, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "人类最古のav号(挂了的不算)也变成bv了[大哭][大哭][大哭]青春结束了", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[大哭]": { - "id": 5, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[大哭]", - "url": "http://i0.hdslb.com/bfs/emote/2caafee2e5db4db72104650d87810cc2c123fc86.png", - "meta": { - "size": 1 - }, - "mtime": 1597738918, - "jump_title": "大哭" - } - }, - "jump_url": {}, - "max_line": 6 - }, - "replies": [ - { - "rpid": 2578082161, - "oid": 2, - "type": 1, - "mid": 407225717, - "root": 2576184175, - "parent": 2576184175, - "dialog": 2578082161, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1584964926, - "rpid_str": "2578082161", - "root_str": "2576184175", - "parent_str": "2576184175", - "like": 2030, - "action": 0, - "member": { - "mid": "407225717", - "uname": "白月魁单推人", - "sex": "保密", - "sign": "", - "avatar": "http://i2.hdslb.com/bfs/face/57899fca9856acfb2f92fdabf00e655a74aeae67.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626364800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "先留个名,估计以后av会被当成冷知识放出来[大哭]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[大哭]": { - "id": 5, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[大哭]", - "url": "http://i0.hdslb.com/bfs/emote/2caafee2e5db4db72104650d87810cc2c123fc86.png", - "meta": { - "size": 1 - }, - "mtime": 1597738918, - "jump_title": "大哭" - } - }, - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "709天前发布" - } - }, - { - "rpid": 2579961512, - "oid": 2, - "type": 1, - "mid": 329965337, - "root": 2576184175, - "parent": 2576184175, - "dialog": 2579961512, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1584982846, - "rpid_str": "2579961512", - "root_str": "2576184175", - "parent_str": "2576184175", - "like": 248, - "action": 0, - "member": { - "mid": "329965337", - "uname": "积极发言的刘同学", - "sex": "男", - "sign": "Hi这里是刘同学,一个业余的校园摄影及公路自行车骑手,同时也是在校高中生(有时穿穿dk)", - "avatar": "http://i2.hdslb.com/bfs/face/3b586d7dbe8c2dba32b213e0a474fe6d86921b85.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1585324800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "10个小时就有6500多赞?你是魔鬼?", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "708天前发布" - } - }, - { - "rpid": 2596150498, - "oid": 2, - "type": 1, - "mid": 426825448, - "root": 2576184175, - "parent": 2578082161, - "dialog": 2578082161, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1585211858, - "rpid_str": "2596150498", - "root_str": "2576184175", - "parent_str": "2578082161", - "like": 605, - "action": 0, - "member": { - "mid": "426825448", - "uname": "TrueBinger", - "sex": "男", - "sign": "这个人不懒,但是什么都没有留下。", - "avatar": "http://i1.hdslb.com/bfs/face/4bcc2120e3cb0ce855de6500a9bc422e981ced32.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 62, - "name": "有爱大佬", - "image": "http://i0.hdslb.com/bfs/face/a10ee6b613e0d68d2dfdac8bbf71b94824e10408.png", - "image_small": "http://i2.hdslb.com/bfs/face/54f4c31ab9b1f1fa2c29dbbc967f66535699337e.png", - "level": "普通勋章", - "condition": "当前持有粉丝勋章最高等级>=15级" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1592668800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @渣男5107号 :哈喽各位小伙伴们大家好,众所周知,世界第一大视频网站bilibili的视频采用bv号来标记视频,可小伙伴们知道吗,其实在2020.3之前,bv一直都是av哦!这已经是100000年前的事了,小伙伴们知道了吗[滑稽]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[滑稽]": { - "id": 27, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[滑稽]", - "url": "http://i0.hdslb.com/bfs/emote/d15121545a99ac46774f1f4465b895fe2d1411c3.png", - "meta": { - "size": 1 - }, - "mtime": 1645206695, - "jump_title": "滑稽" - } - }, - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "706天前发布" - } - } - ], - "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": true, - "invisible": false, - "reply_control": { - "sub_reply_entry_text": "共1000条回复", - "sub_reply_title_text": "相关回复共1000条", - "time_desc": "709天前发布" - } - }, - { - "rpid": 495059, - "oid": 2, - "type": 1, - "mid": 2, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 898, - "rcount": 838, - "state": 2, - "fansgrade": 0, - "attr": 0, - "ctime": 1291918239, - "rpid_str": "495059", - "root_str": "0", - "parent_str": "0", - "like": 34223, - "action": 0, - "member": { - "mid": "2", - "uname": "碧诗", - "sex": "男", - "sign": "kami.im 直男过气网红 # av362830 “We Are Star Dust”", - "avatar": "http://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "rank": "20000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 10, - "name": "见习偶像", - "image": "http://i2.hdslb.com/bfs/face/e93dd9edfa7b9e18bf46fd8d71862327a2350923.png", - "image_small": "http://i1.hdslb.com/bfs/face/275b468b043ec246737ab8580a2075bee0b1263b.png", - "level": "普通勋章", - "condition": "所有自制视频总播放数>=10万" - }, - "official_verify": { - "type": 0, - "desc": "bilibili创始人(站长)" - }, - "vip": { - "vipType": 2, - "vipDueDate": 3901881600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "十年大会员", - "label_theme": "ten_annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": { - "id": 3865, - "name": "2021拜年纪", - "image": "http://i0.hdslb.com/bfs/garb/item/e2c4d4ba094ddb98c1f72114a12081b4eca7ed88.png", - "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/3898?navhide=1&mid=2&from=reply", - "fan": { - "is_fan": 1, - "number": 21206, - "color": "#ec3d39", - "name": "2021拜年纪", - "num_desc": "021206" - }, - "type": "suit" - }, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "wwwww", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 6 - }, - "replies": [ - { - "rpid": 164517433, - "oid": 2, - "type": 1, - "mid": 3476504, - "root": 495059, - "parent": 495059, - "dialog": 164517433, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1479570959, - "rpid_str": "164517433", - "root_str": "495059", - "parent_str": "495059", - "like": 478, - "action": 0, - "member": { - "mid": "3476504", - "uname": "MaskQwQ麦斯科", - "sex": "保密", - "sign": "重拾过去。。", - "avatar": "http://i2.hdslb.com/bfs/face/7bf954d807cbda4de4221d78f3b425534042ac02.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 194, - "name": "黑白无双", - "image": "http://i2.hdslb.com/bfs/face/89b25cad74abd9e42a94b11e456bc21fe36b8763.png", - "expire": 0, - "image_enhance": "http://i2.hdslb.com/bfs/face/89b25cad74abd9e42a94b11e456bc21fe36b8763.png", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 74, - "name": "大会员2018年度勋章", - "image": "http://i0.hdslb.com/bfs/face/421179426c929dfeaed4117461c83f5d07ffb148.png", - "image_small": "http://i1.hdslb.com/bfs/face/682001c2e1c2ae887bdf2a0e18eef61180c48f84.png", - "level": "稀有勋章", - "condition": "2018.6.26-7.8某一天是年度大会员" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1771344000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 194, - "name": "黑白无双", - "image": "http://i0.hdslb.com/bfs/face/89b25cad74abd9e42a94b11e456bc21fe36b8763.png", - "jump_url": "", - "type": "vip", - "image_enhance": "http://i0.hdslb.com/bfs/face/89b25cad74abd9e42a94b11e456bc21fe36b8763.png", - "image_enhance_frame": "" - }, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "拉了半天总算是见了底", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "1928天前发布" - } - }, - { - "rpid": 464424502, - "oid": 2, - "type": 1, - "mid": 37145412, - "root": 495059, - "parent": 495059, - "dialog": 464424502, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 1, - "attr": 0, - "ctime": 1509257961, - "rpid_str": "464424502", - "root_str": "495059", - "parent_str": "495059", - "like": 298, - "action": 0, - "member": { - "mid": "37145412", - "uname": "边走边发呆", - "sex": "男", - "sign": "这个人懒死了,什么都不发=_= 头像是素晴日", - "avatar": "http://i0.hdslb.com/bfs/face/4dfe0f1b0bfc9b1afea9e3bacbc5a92221fe9b09.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 60, - "name": "有爱萌新", - "image": "http://i1.hdslb.com/bfs/face/51ca16136e570938450bca360f28761ceb609f33.png", - "image_small": "http://i2.hdslb.com/bfs/face/9abfa4769357f85937782c2dbc40fafda4f57217.png", - "level": "普通勋章", - "condition": "当前持有粉丝勋章最高等级>=5级" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1559836800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": { - "uid": 37145412, - "medal_id": 29058, - "medal_name": "逸国", - "score": 0, - "level": 7, - "intimacy": 0, - "master_status": 1, - "is_receive": 1, - "medal_color": 643660702, - "medal_color_end": 643660702, - "medal_color_border": 6126494, - "medal_color_name": 6126494, - "medal_color_level": 6126494, - "guard_level": 0 - }, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "5000多楼6225评论(;¬_¬)手有点酸,如果不是特殊方法进来的话是要大会员吧(● ̄(エ) ̄●)", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "1585天前发布" - } - }, - { - "rpid": 4002945120, - "oid": 2, - "type": 1, - "mid": 282146749, - "root": 495059, - "parent": 464424502, - "dialog": 464424502, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1611588059, - "rpid_str": "4002945120", - "root_str": "495059", - "parent_str": "464424502", - "like": 107, - "action": 0, - "member": { - "mid": "282146749", - "uname": "能天使exia", - "sex": "女", - "sign": "电子学会评测师,脑机非技术研究学者,黑客网络贴吧二周目群管,明日方舟三服,三崩子团长,公主焊接会长,红三圈模组收集者,游戏尝鲜人,随心情更新", - "avatar": "http://i1.hdslb.com/bfs/face/f6ec44a9d2785783fa6b1b2dd4b7ad7b17e7cbb9.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 3508, - "name": "总之就是非常可爱", - "image": "http://i1.hdslb.com/bfs/garb/item/2c63178e3fcce804a851ef510e03c2b0e91a61e0.png", - "expire": 0, - "image_enhance": "http://i1.hdslb.com/bfs/garb/item/2c63178e3fcce804a851ef510e03c2b0e91a61e0.png", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 72, - "name": "风纪元老", - "image": "http://i0.hdslb.com/bfs/face/032bce9fd6dcb562d83b60f8a8719362b18a0afb.png", - "image_small": "http://i2.hdslb.com/bfs/face/2930b8bf5d7c68e1961d81ed3a59783af9d639a2.png", - "level": "稀有勋章", - "condition": "风纪委员连任期数 >= 12" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1727280000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 3508, - "name": "总之就是非常可爱", - "image": "http://i0.hdslb.com/bfs/garb/item/2c63178e3fcce804a851ef510e03c2b0e91a61e0.png", - "jump_url": "", - "type": "suit", - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/2c63178e3fcce804a851ef510e03c2b0e91a61e0.png", - "image_enhance_frame": "" - }, - "cardbg": { - "id": 5323, - "name": "明日方舟音律系列", - "image": "http://i0.hdslb.com/bfs/garb/item/e62b17700b3c1bc981606905f85615363c183105.png", - "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/5359?navhide=1&mid=282146749&from=reply", - "fan": { - "is_fan": 1, - "number": 11418, - "color": "#ffb628", - "name": "明日方舟音律联觉", - "num_desc": "011418" - }, - "type": "suit" - }, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @边走边发呆 :拜登时代洛阳铲,带人,食大便了,现在的b站没有楼层了[牛年]", - "plat": 0, - "device": "", - "members": [ - { - "mid": "37145412", - "uname": "边走边发呆", - "sex": "男", - "sign": "这个人懒死了,什么都不发=_= 头像是素晴日", - "avatar": "http://i0.hdslb.com/bfs/face/4dfe0f1b0bfc9b1afea9e3bacbc5a92221fe9b09.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 60, - "name": "有爱萌新", - "image": "http://i1.hdslb.com/bfs/face/51ca16136e570938450bca360f28761ceb609f33.png", - "image_small": "http://i2.hdslb.com/bfs/face/9abfa4769357f85937782c2dbc40fafda4f57217.png", - "level": "普通勋章", - "condition": "当前持有粉丝勋章最高等级>=5级" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1559836800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - } - } - ], - "emote": { - "[牛年]": { - "id": 3146, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[牛年]", - "url": "http://i0.hdslb.com/bfs/emote/9275275ff1f2659310648221107d20bc4970f106.png", - "meta": { - "size": 1 - }, - "mtime": 1611200715, - "jump_title": "牛年" - } - }, - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "400天前发布" - } - } - ], - "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, - "invisible": false, - "reply_control": { - "sub_reply_entry_text": "共838条回复", - "sub_reply_title_text": "相关回复共838条", - "time_desc": "4100天前发布" - } - }, - { - "rpid": 646408628, - "oid": 2, - "type": 1, - "mid": 33066927, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 173, - "rcount": 160, - "state": 0, - "fansgrade": 1, - "attr": 0, - "ctime": 1519135750, - "rpid_str": "646408628", - "root_str": "0", - "parent_str": "0", - "like": 7197, - "action": 0, - "member": { - "mid": "33066927", - "uname": "冰魂喵丶", - "sex": "男", - "sign": "反正不要钱,多少关注下?\n等我有时间,就把你们全吃了", - "avatar": "http://i0.hdslb.com/bfs/face/f60445649445f69db7293f1cb611f6c0dcdd9a21.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 71, - "name": "资深委员", - "image": "http://i1.hdslb.com/bfs/face/5beecb936bd7422a5ac11c9c5c8df56f334b2a65.png", - "image_small": "http://i0.hdslb.com/bfs/face/9f8e0d5cd0201cf7177199d9365be562be1deb05.png", - "level": "高级勋章", - "condition": "风纪委员连任期数 >= 6" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1620748800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": { - "uid": 33066927, - "medal_id": 29058, - "medal_name": "逸国", - "score": 0, - "level": 1, - "intimacy": 0, - "master_status": 1, - "is_receive": 1, - "medal_color": 643602062, - "medal_color_end": 643602062, - "medal_color_border": 4284257934, - "medal_color_name": 4284257934, - "medal_color_level": 4284257934, - "guard_level": 0 - }, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": { - "id": 32680, - "name": "坎公骑冠剑", - "image": "http://i0.hdslb.com/bfs/garb/item/e861ec7f80f9725fbed51bbfc51ade4c083ddedc.png", - "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/32658?navhide=1&mid=33066927&from=reply", - "fan": { - "is_fan": 1, - "number": 16578, - "color": "#f7b130", - "name": "坎公骑冠剑", - "num_desc": "016578" - }, - "type": "suit" - }, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "第一首:来夢緑 - kagome-kagome ~ 月の眷属達カラオケ\n第二首:dBu music - 千年幻想郷 -Aurora sky edition-\n第三首:Sensitive Heart - 千年幻想郷 ~ History of the Moon\n第四首:Yellow-Zebra - 月の律动~Rhythm of the moon~(东方永夜抄 “千年幻想郷 ~ History of the Moon”)\n第五首:工藤舞 - D.S.F.S(ヴォヤージュ1969)\n第六首:Angelic Quasar - かの郷は永き幻の\n第七首:東方永夜抄 - 黒髪のアマンダ\n第八首:君の美術館 - 千年幻想郷 ~ History of the Moon\n\n------------------------\n这些是av:2出现的音乐,应该不会缺少的喵~。(笑) 如果有需要有兴趣的话欢迎复制喵~~(`・ω・´)\n复制的9818楼的\n前排提示:本视频只有大会员能看", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 6 - }, - "replies": [ - { - "rpid": 646507261, - "oid": 2, - "type": 1, - "mid": 11531860, - "root": 646408628, - "parent": 646408628, - "dialog": 646507261, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1519138195, - "rpid_str": "646507261", - "root_str": "646408628", - "parent_str": "646408628", - "like": 140, - "action": 0, - "member": { - "mid": "11531860", - "uname": "方圆十里有名的俊后生", - "sex": "男", - "sign": "", - "avatar": "http://i0.hdslb.com/bfs/baselabs/fab0bf0029e891eed162175c73473003528a5f22.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 1, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1647619200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "大会员", - "label_theme": "vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "车万大法好", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "1471天前发布" - } - }, - { - "rpid": 1601887431, - "oid": 2, - "type": 1, - "mid": 341470991, - "root": 646408628, - "parent": 646408628, - "dialog": 1601887431, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1557745446, - "rpid_str": "1601887431", - "root_str": "646408628", - "parent_str": "646408628", - "like": 94, - "action": 0, - "member": { - "mid": "341470991", - "uname": "飞行科", - "sex": "保密", - "sign": "", - "avatar": "http://i2.hdslb.com/bfs/face/327188d3f35510699e54a65a65b2fba95dd6ded2.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626364800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "东方不能沉", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "1024天前发布" - } - }, - { - "rpid": 1627517285, - "oid": 2, - "type": 1, - "mid": 244446278, - "root": 646408628, - "parent": 646408628, - "dialog": 1627517285, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1558630445, - "rpid_str": "1627517285", - "root_str": "646408628", - "parent_str": "646408628", - "like": 75, - "action": 0, - "member": { - "mid": "244446278", - "uname": "KRHX", - "sex": "男", - "sign": "自由的明天仍在前方\n如繁星般闪烁着光芒\n即便只是缥缈的愿景\n也要朝着那黎明迈向\n哪怕路途艰辛\n哪怕前途渺茫\n世间进步仍未停息\n向那理想的彼方", - "avatar": "http://i2.hdslb.com/bfs/face/df0e691dd30d84f9c5224dbb7820b03953c7e6de.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1647446400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "东方不能沉啊", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "1013天前发布" - } - } - ], - "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, - "invisible": false, - "reply_control": { - "sub_reply_entry_text": "共160条回复", - "sub_reply_title_text": "相关回复共160条", - "time_desc": "1471天前发布" - } + "content": { + "message": "好多20年和18年的[辣眼睛]", + "members": [], + "emote": { + "[辣眼睛]": { + "id": 2374, + "package_id": 1, + "state": 0, + "type": 1, + "attr": 0, + "text": "[辣眼睛]", + "url": "https://i0.hdslb.com/bfs/emote/35d62c496d1e4ea9e091243fa812866f5fecc101.png", + "meta": { + "size": 1, + "suggest": [ + "" + ] + }, + "mtime": 1668688325, + "jump_title": "辣眼睛" } - ], - "top": { - "admin": null, - "upper": null, - "vote": null - }, - "top_replies": null, - "lottery_card": null, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "up_selection": { - "pending_count": 0, - "ignore_count": 0 - }, - "cm": {}, - "cm_info": { - "ads": null - }, - "effects": { - "preloading": "" + }, + "jump_url": {}, + "max_line": 6 }, + "replies": [], "assist": 0, - "blacklist": 0, - "vote": 0, - "lottery": 0, - "config": { - "showadmin": 1, - "showentry": 1, - "showfloor": 0, - "showtopic": 1, - "show_up_flag": true, - "read_only": false, - "show_del_log": true + "up_action": { + "like": false, + "reply": false }, - "upper": { - "mid": 2 + "invisible": false, + "reply_control": { + "max_line": 6, + "time_desc": "21分钟前发布", + "location": "IP属地:河北" }, - "show_bvid": false, - "control": { - "input_disable": false, - "root_input_text": "发一条友善的评论", - "child_input_text": "", - "giveup_input_text": "不发没关系,请继续友善哦~", - "bg_text": "看看下面~来发评论吧", - "web_selection": false, - "answer_guide_text": "需要升级成为lv2会员后才可以评论,先去答题转正吧!", - "answer_guide_icon_url": "http://i0.hdslb.com/bfs/emote/96940d16602cacbbac796245b7bb99fa9b5c970c.png", - "answer_guide_ios_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=12", - "answer_guide_android_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=6", - "show_type": 1, - "show_text": "", - "disable_jump_emote": false + "folder": { + "has_folded": false, + "is_folded": false, + "rule": "" }, - "note": 1, - "callbacks": null - } + "dynamic_id_str": "0", + "note_cvid_str": "0", + "track_info": "" + }, + // ... + { + "rpid": 237689432448, + "oid": 2, + "type": 1, + "mid": 1647250883, + "root": 0, + "parent": 0, + "dialog": 0, + "count": 0, + "rcount": 0, + "state": 0, + "fansgrade": 0, + "attr": 0, + "ctime": 1723624563, + "mid_str": "1647250883", + "oid_str": "2", + "rpid_str": "237689432448", + "root_str": "0", + "parent_str": "0", + "dialog_str": "0", + "like": 1, + "action": 0, + "member": { + "mid": "1647250883", + "uname": "小烟同学424", + "sex": "保密", + "sign": "墓前玩使命,墓前暑假", + "avatar": "https://i2.hdslb.com/bfs/face/930661ca1bcacf8005efcca499b7380dcd4c2716.jpg", + "rank": "10000", + "face_nft_new": 0, + "is_senior_member": 0, + "senior": {}, + "level_info": { + "current_level": 5, + "current_min": 0, + "current_exp": 0, + "next_exp": 0 + }, + "pendant": { + "pid": 0, + "name": "", + "image": "", + "expire": 0, + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0 + }, + "nameplate": { + "nid": 0, + "name": "", + "image": "", + "image_small": "", + "level": "", + "condition": "" + }, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 0, + "vipDueDate": 0, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "", + "use_img_label": true, + "img_label_uri_hans": "", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" + }, + "avatar_subscript": 0, + "nickname_color": "" + }, + "fans_detail": null, + "user_sailing": { + "pendant": null, + "cardbg": null, + "cardbg_with_focus": null + }, + "user_sailing_v2": {}, + "is_contractor": false, + "contract_desc": "", + "nft_interaction": null, + "avatar_item": { + "container_size": { + "width": 1.8, + "height": 1.8 + }, + "fallback_layers": { + "layers": [ + { + "visible": true, + "general_spec": { + "pos_spec": { + "coordinate_pos": 2, + "axis_x": 0.9, + "axis_y": 0.9 + }, + "size_spec": { + "width": 1, + "height": 1 + }, + "render_spec": { + "opacity": 1 + } + }, + "layer_config": { + "tags": { + "AVATAR_LAYER": {} + }, + "is_critical": true, + "layer_mask": { + "general_spec": { + "pos_spec": { + "coordinate_pos": 2, + "axis_x": 0.9, + "axis_y": 0.9 + }, + "size_spec": { + "width": 1, + "height": 1 + }, + "render_spec": { + "opacity": 1 + } + }, + "mask_src": { + "src_type": 3, + "draw": { + "draw_type": 1, + "fill_mode": 1, + "color_config": { + "day": { + "argb": "#FF000000" + } + } + } + } + } + }, + "resource": { + "res_type": 3, + "res_image": { + "image_src": { + "src_type": 1, + "placeholder": 6, + "remote": { + "url": "https://i2.hdslb.com/bfs/face/930661ca1bcacf8005efcca499b7380dcd4c2716.jpg", + "bfs_style": "widget-layer-avatar" + } + } + } + } + } + ], + "is_critical_group": true + }, + "mid": "1647250883" + } + }, + "content": { + "message": "还。。。有人吗?", + "members": [], + "jump_url": {}, + "max_line": 6 + }, + "replies": [], + "assist": 0, + "up_action": { + "like": false, + "reply": false + }, + "invisible": false, + "reply_control": { + "max_line": 6, + "time_desc": "4小时前发布", + "location": "IP属地:陕西" + }, + "folder": { + "has_folded": false, + "is_folded": false, + "rule": "" + }, + "dynamic_id_str": "0", + "note_cvid_str": "0", + "track_info": "" + } + ], + "top": { + "admin": null, + "upper": null, + "vote": null + }, + "top_replies": [], + "up_selection": { + "pending_count": 0, + "ignore_count": 0 + }, + "effects": { + "preloading": "" + }, + "assist": 0, + "blacklist": 0, + "vote": 0, + "config": { + "showtopic": 1, + "show_up_flag": true, + "read_only": false + }, + "upper": { + "mid": 2 + }, + "control": { + "input_disable": false, + "root_input_text": "你渴望拥有力量吗?评论让力量更强大", + "child_input_text": "你渴望拥有力量吗?评论让力量更强大", + "giveup_input_text": "不发没关系,请继续友善哦~", + "screenshot_icon_state": 1, + "upload_picture_icon_state": 1, + "answer_guide_text": "需要升级成为lv2会员后才可以评论,先去答题转正吧!", + "answer_guide_icon_url": "http://i0.hdslb.com/bfs/emote/96940d16602cacbbac796245b7bb99fa9b5c970c.png", + "answer_guide_ios_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=12", + "answer_guide_android_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=6", + "bg_text": "", + "empty_page": null, + "show_type": 1, + "show_text": "", + "web_selection": false, + "disable_jump_emote": false, + "enable_charged": false, + "enable_cm_biz_helper": false, + "preload_resources": null + }, + "note": 1, + "esports_grade_card": null, + "callbacks": null, + "context_feature": "" + } } ``` @@ -3696,7 +1558,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/main' \ ## 获取指定评论的回复 -> http://api.bilibili.com/x/v2/reply/reply +> https://api.bilibili.com/x/v2/reply/reply *请求方式:GET* @@ -3712,7 +1574,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/main' \ | type | num | 评论区类型代码 | 必要 | [类型代码见表](readme.md#评论区类型代码) | | oid | num | 目标评论区 id | 必要 | | | root | num | 根回复 rpid | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为20<br />定义域:1-49 | +| ps | num | 每页项数 | 非必要 | 默认为20<br />定义域:1-49 <br /> 但 data_replies 的最大内容数为20,因此设置为49其实也只会有20条回复被返回 | | pn | num | 页码 | 非必要 | 默认为1 | **json回复:** @@ -3733,7 +1595,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/main' \ | config | obj | 评论区显示控制 | | | control | obj | 评论区输入属性 | | | page | obj | 页面信息 | | -| replies | array | 评论对话树列表 | | +| replies | array | 评论对话树列表 | 最大内容数为20 | | root | obj | 根评论信息 | [对象定义见表](readme.md#评论条目对象) | | show_bvid | bool | 显示 bvid? | | | show_text | str | (?) | | @@ -3793,7 +1655,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/main' \ 获取视频`av201022189`下评论`rpid=3030790837`的回复,每页5项,获取第1页 ```shell -curl -G 'http://api.bilibili.com/x/v2/reply/reply' \ +curl -G 'https://api.bilibili.com/x/v2/reply/reply' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=201022189' \ --data-urlencode 'root=3030790837' \ @@ -4582,7 +2444,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/reply' \ ## 获取指定评论对话树 -> http://api.bilibili.com/x/v2/reply/dialog/cursor +> https://api.bilibili.com/x/v2/reply/dialog/cursor *请求方式:GET* @@ -4690,7 +2552,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/reply' \ 获取视频`av201022189`下评论`rpid=3030790837`的对话`rpid=3030978856`,每页最大5项 ```shell -curl -G 'http://api.bilibili.com/x/v2/reply/dialog/cursor' \ +curl -G 'https://api.bilibili.com/x/v2/reply/dialog/cursor' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=201022189' \ --data-urlencode 'root=3030790837' \ @@ -5346,7 +3208,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/dialog/cursor' \ ## 获取评论区热评 -> http://api.bilibili.com/x/v2/reply/hot +> https://api.bilibili.com/x/v2/reply/hot *请求方式:GET* @@ -5405,7 +3267,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/dialog/cursor' \ 获取视频`av2`的评论区热评,每页5项,查看第1页 ```shell -curl -G 'http://api.bilibili.com/x/v2/reply/hot' \ +curl -G 'https://api.bilibili.com/x/v2/reply/hot' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=2' \ --data-urlencode 'ps=5' \ @@ -5643,7 +3505,12 @@ curl -G 'http://api.bilibili.com/x/v2/reply/hot' \ ## 获取指定评论信息 -> http://api.bilibili.com/x/v2/reply/info +该接口已经弃用 + +<details> +<summary>点击展开折叠内容:</summary> + +> https://api.bilibili.com/x/v2/reply/info *请求方式:GET* @@ -5671,7 +3538,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/hot' \ 获取视频`av379743801`评论区下`rpid=95737567200`的信息 ```bash -curl -G 'http://api.bilibili.com/x/v2/reply/info' \ +curl -G 'https://api.bilibili.com/x/v2/reply/info' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=379743801' \ --data-urlencode 'rpid=95737567200' \ @@ -5795,9 +3662,11 @@ curl -G 'http://api.bilibili.com/x/v2/reply/info' \ </details> +</details> + ## 获取评论区评论总数 -> http://api.bilibili.com/x/v2/reply/count +> https://api.bilibili.com/x/v2/reply/count *请求方式:GET* @@ -5830,7 +3699,7 @@ curl -G 'http://api.bilibili.com/x/v2/reply/info' \ 获取视频`av2`的评论区总计评论条数 ```shell -curl -G 'http://api.bilibili.com/x/v2/reply/count' \ +curl -G 'https://api.bilibili.com/x/v2/reply/count' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=2' ``` diff --git a/comment/readme.md b/docs/comment/readme.md similarity index 89% rename from comment/readme.md rename to docs/comment/readme.md index 77a2da1..4670158 100644 --- a/comment/readme.md +++ b/docs/comment/readme.md @@ -1,6 +1,6 @@ # 评论区 -<img src="/imgs/comment.svg" width="100" height="100"/> +<img src="../../assets/img/comment.svg" width="100" height="100"/> 评论系统为全站通用,且APP与web端接口共用,以type标明对象类型,以oid指向响应的对象id @@ -54,7 +54,7 @@ | count | num | 二级评论条数 | | | rcount | num | 回复评论条数 | | | floor | num | 评论楼层号 | **注:若不支持楼层则无此项** | -| state | num | (?) | | +| state | num | 评论状态 | 0: 正常<br />17: 被阿瓦隆系统隐藏 (无法被别人看到, 只能自己看到) | | fansgrade | num | 是否具有粉丝标签 | 0:无<br />1:有 | | attr | num | 某属性位? | | | ctime | num | 评论发送时间 | 时间戳 | @@ -70,7 +70,8 @@ | folder | obj | 折叠信息 | | | up_action | obj | 评论 UP 主操作信息 | | | show_follow | bool | (?) | | -| invisible | bool | | | +| invisible | bool | 评论是否被隐藏 | | +| card_label | obj | 右上角卡片标签信息 | | | reply_control | obj | 评论提示文案信息 | | `评论条目`中的`member`对象: @@ -131,7 +132,7 @@ | 字段 | 类型 | 内容 | 备注 | | ---- | ---- | -------- | ---------------------------------------- | -| type | num | 是否认证 | -1:无<br />0:个人认证<br />1:机构认证 | +| type | num | 认证类型 | -1:无<br />0:个人认证<br />1:机构认证 | | desc | str | 认证信息 | 无为空 | `member`中的`vip`对象: @@ -227,6 +228,7 @@ | emote | obj | 需要渲染的表情转义 | 评论内容无表情则无此项 | | jump_url | obj | 需要高亮的超链转义 | | | max_line | num | 6 | 收起最大行数 | +| pictures | array | 评论图片数组 | | `content`中的`members`数组: @@ -284,6 +286,15 @@ | appPackageName | str | (?) | | | clickReport | str | 上报 id | | +`content`中的`pictures`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | -------- | -------- | +| img_src | str | 图片地址 | | +| img_width | num | 图片宽度 | | +| img_height | num | 图片高度 | | +| img_size | num | 图片大小 | 单位KB | + `评论条目`中的`replies`数组: | 项 | 类型 | 内容 | 备注 | @@ -307,10 +318,30 @@ | 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 天/小时 前发布` | \ No newline at end of file +| time_desc | str | 时间提示 | `xx 天/小时 前发布` | +| location | str | IP属地 | `IP属地:xx`<br />评论者发送评论时的IP地址属地<br />仅对2022-07-25 11:00及以后发布的评论有效<br />需要登录| diff --git a/creativecenter/railgun.md b/docs/creativecenter/railgun.md similarity index 87% rename from creativecenter/railgun.md rename to docs/creativecenter/railgun.md index 2e1d70b..8b171bb 100644 --- a/creativecenter/railgun.md +++ b/docs/creativecenter/railgun.md @@ -1,16 +1,10 @@ # 电磁力相关 -- [获取电磁力等级(web端)](#获取电磁力等级(web端)) -- [获取电磁力详细数值(双端)](#获取电磁力详细数值(双端)) -- [获取电磁力数值历史变化(双端)](#获取电磁力数值历史变化(双端)) - ---- - 电磁力每周日下午刷新 ## 获取电磁力等级(web端) -> http://member.bilibili.com/x/web/elec/user +> https://api.bilibili.com/studio/up-rating/v3/rating/info *请求方式:GET* @@ -32,13 +26,15 @@ | 字段 | 类型 | 内容 | 备注 | | ------ | ---- | ----------- | ---------------- | | mid | num | 当前用户mid | | -| state | num | 电磁力等级 | | -| reason | str | 空 | **作用尚不明确** | +| level | num | 电磁力等级 | | +| score | num | 电磁力分数 | | +| credit | num | 信用分 | | +| state | num | ? | 一直是2 | **示例:** ```shell -curl 'http://member.bilibili.com/x/web/elec/user' \ +curl 'https://member.bilibili.com/x/web/elec/user' \ -b 'SESSDATA=xxx' ``` @@ -51,18 +47,21 @@ curl 'http://member.bilibili.com/x/web/elec/user' \ "message": "0", "ttl": 1, "data": { - "mid": 293793435, + "mid": ***, + "level": 4, + "score": 326, + "credit": 100, "state": 2, - "reason": "" + "update_date": 1694966400 } } ``` </details> -## 获取电磁力详细数值(双端) +## (失效)获取电磁力详细数值(双端) -> http://api.bilibili.com/studio/up-rating/rating/summary +> https://api.bilibili.com/studio/up-rating/rating/summary *请求方式:GET* @@ -109,14 +108,14 @@ curl 'http://member.bilibili.com/x/web/elec/user' \ Cookie方式: ```shell -curl 'http://api.bilibili.com/studio/up-rating/rating/summary' \ +curl 'https://api.bilibili.com/studio/up-rating/rating/summary' \ -b 'SESSDATA=xxx' ``` APP方式: ```shell -curl -G 'http://api.bilibili.com/studio/up-rating/rating/summary' \ +curl -G 'https://api.bilibili.com/studio/up-rating/rating/summary' \ --data-urlencode 'access_key=xxx' ``` @@ -162,7 +161,7 @@ curl -G 'http://api.bilibili.com/studio/up-rating/rating/summary' \ ## 获取电磁力数值历史变化(双端) -> http://api.bilibili.com/studio/up-rating/rating/history +> https://api.bilibili.com/studio/up-rating/rating/history *请求方式:GET* @@ -226,7 +225,7 @@ curl -G 'http://api.bilibili.com/studio/up-rating/rating/summary' \ Cookie方式: ```shell -curl -G 'http://api.bilibili.com/studio/up-rating/rating/history' \ +curl -G 'https://api.bilibili.com/studio/up-rating/rating/history' \ --data-urlencode 'type=1' \ -b 'SESSDATA=xxx' ``` @@ -234,7 +233,7 @@ curl -G 'http://api.bilibili.com/studio/up-rating/rating/history' \ APP方式: ```shell -curl -G 'http://api.bilibili.com/studio/up-rating/rating/history' \ +curl -G 'https://api.bilibili.com/studio/up-rating/rating/history' \ --data-urlencode 'type=1' \ --data-urlencode 'access_key=xxx' ``` diff --git a/docs/creativecenter/season.md b/docs/creativecenter/season.md new file mode 100644 index 0000000..472ce32 --- /dev/null +++ b/docs/creativecenter/season.md @@ -0,0 +1,918 @@ +# 合集管理 + +关于用户空间的合集及视频列表参见 [合集和视频列表信息](../video/collection.md) + +## 获取合集列表 + +> https://member.bilibili.com/x2/creative/web/seasons + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | --------- | ----------- | ----------------- | +| pn | num | 页码 | 必要 | 默认为 1 | +| ps | num | 每页数量 | 必要 | 默认为 30 | +| order | str | 排序方式 | 不必要 | 创建时间: ctime<br />修改时间: mtime | +| sort | str | 排序方式 | 不必要 | 创建时间: asc<br />修改时间: desc | +| draft | num | 1 | 不必要 | 作用尚不明确 | + +**JSON回复:** + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| seasons | arr | 合集列表 | | +| tip | obj | 内容 `title` `url` 均为空 | | +| total | num | 合集总数 | | +| play_type | num | 1 | 作用尚不明确 | + +`seasons`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| season | obj | 合集信息 | | +| course | null | | | +| checkin | obj | 审核信息? | | +| seasonStat | obj | 合集统计信息 | | +| sections | obj | 小节列表 | | +| part_episodes | arr | 合集视频列表 | | + +`seasons`数组中的对象中的`season`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| id | num | 合集 ID | | +| title | str | 合集标题 | | +| desc | str | 合集描述 | | +| cover | str | 合集封面 URL | | +| isEnd | num | 是否已完结? | 0: 未完结 | +| mid | num | 合集作者 ID | | +| isAct | num | 是否为活动合集? | 0: 否 | +| is_pay | num | 是否付费? | 0: 否 | +| state | num | 合集状态? | 0: 正常显示<br />-6: 正在审核 | +| partState | num | 合集分段状态? | 0 | +| signState | num | 合集签名状态? | 0 | +| rejectReason | str | 合集拒绝原因? | | +| ctime | num | 创建时间 | | +| mtime | num | 修改时间 | | +| no_section | num | 是否设小节 | 1: 不设小节 | +| forbid | num | 合集是否禁止? | 0: 否 | +| protocol_id | str | 空 | | +| ep_num | num | 0 | | +| season_price | num | 合集价格? | 0: 免费 | +| is_opened | num | 是否公开? | 1: 公开 | +| has_charging_pay | num | 是否充电付费? | 0: 否 | + +`seasons`数组中的对象中的`checkin`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| status | num | 状态? | 0: 正常显示 | +| status_reason | str | 状态原因? | | +| season_status | num | 合集审核状态? | 1: 审核通过 | + +`seasons`数组中的对象中的`seasonStat`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| view | num | 播放量 | | +| danmaku | num | 弹幕数 | | +| reply | num | 评论数 | | +| fav | num | 收藏数 | | +| coin | num | 硬币数 | | +| share | num | 分享数 | | +| nowRank | num | 当前排名? | | +| hisRank | num | 历史最高排名? | | +| like | num | 点赞数 | | +| subscription | num | 订阅数 | | +| vt | num | 0 | | + +`seasons`数组中的对象中的`sections`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| sections | arr | 小节列表 | 套了个娃 | + +`seasons`数组中的对象中的`sections`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| id | num | 小节 ID | | +| type | num | 1 | | +| seasonId | num | 合集 ID | | +| title | str | 小节标题 | | +| order | num | 排序 | | +| state | num | 状态? | 0: 正常 | +| partState | num | 合集分段状态? | 0: 正常 | +| rejectReason | str | 拒绝原因? | | +| ctime | num | 创建时间 | | +| mtime | num | 修改时间 | | +| epCount | num | 视频数量 | | +| cover | str | 封面 URL | | +| has_charging_pay | num | 是否充电付费? | 0: 否 | +| Episodes | null | | | + +`seasons`数组中的对象中的`part_episodes`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| id | num | 合集内视频 ID | | +| title | str | 视频标题 | | +| aid | num | 视频 aid | | +| bvid | str | 视频 bvid | | +| cid | num | 视频 cid | | +| seasonId | num | 合集 ID | | +| sectionId | num | 小节 ID | | +| order | num | 排序编号 | | +| videoTitle | str | 空 | | +| archiveTitle | str | 空 | | +| archiveState | num | 0 | | +| rejectReason | str | 拒绝理由? | | +| state | num | 0 | | +| cover | str | 封面 URL | | +| is_free | num | 是否免费? | 0: 免费 | +| aid_owner | bool | false | | +| charging_pay | num | 充电付费? | 0: 否 | + +**示例:** + +```shell +curl -G 'https://member.bilibili.com/x2/creative/web/seasons' \ +--data-urlencode 'pn=1' \ +--data-urlencode 'ps=30' \ +-b "SESSDATA=xxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "seasons": [ + { + "season": { + "id": 3541247, + "title": "🍥Debian", + "desc": "这里是泽生折腾 Debian GNU/Linux 的珍贵影像记录喵~", + "cover": "https://archive.biliimg.com/bfs/archive/ec51de61b53159c5e2430cf963f5f97e692baeaf.jpg", + "isEnd": 0, + "mid": 645769214, + "isAct": 0, + "is_pay": 0, + "state": 0, + "partState": 0, + "signState": 0, + "rejectReason": "", + "ctime": 1722573640, + "mtime": 1722577206, + "no_section": 1, + "forbid": 0, + "protocol_id": "", + "ep_num": 0, + "season_price": 0, + "is_opened": 1, + "has_charging_pay": 0 + }, + "course": null, + "checkin": { + "status": 0, + "status_reason": "", + "season_status": 1 + }, + "seasonStat": { + "view": 6793, + "danmaku": 21, + "reply": 93, + "fav": 64, + "coin": 26, + "share": 12, + "nowRank": 0, + "hisRank": 0, + "like": 141, + "subscription": 0, + "vt": 0 + }, + "sections": { + "sections": [ + { + "id": 3954033, + "type": 1, + "seasonId": 3541247, + "title": "正片", + "order": 1, + "state": 0, + "partState": 0, + "rejectReason": "", + "ctime": 1722573640, + "mtime": 1722577206, + "epCount": 2, + "cover": "http://i2.hdslb.com/bfs/archive/b76c0b574862f5a8e8eb133f5f33fcbcd602401a.jpg", + "has_charging_pay": 0, + "Episodes": null + } + ] + }, + "part_episodes": [ + { + "id": 77260687, + "title": "Linux小寄巧: 原地卸载内核然后尝试救活!", + "aid": 1906473802, + "bvid": "BV1MU411S7iJ", + "cid": 1625992822, + "seasonId": 3541247, + "sectionId": 3954033, + "order": 1, + "videoTitle": "", + "archiveTitle": "", + "archiveState": 0, + "rejectReason": "", + "state": 0, + "cover": "http://i2.hdslb.com/bfs/archive/b76c0b574862f5a8e8eb133f5f33fcbcd602401a.jpg", + "is_free": 0, + "aid_owner": false, + "charging_pay": 0 + }, + { + "id": 77260688, + "title": "十多年前的电脑运行Debian12的启动过程", + "aid": 1956170305, + "bvid": "BV1Ay411i7Ph", + "cid": 1607067247, + "seasonId": 3541247, + "sectionId": 3954033, + "order": 2, + "videoTitle": "", + "archiveTitle": "", + "archiveState": 0, + "rejectReason": "", + "state": 0, + "cover": "http://i0.hdslb.com/bfs/archive/0bff6624fdfcbf3326fba1837fef093d455c846a.jpg", + "is_free": 0, + "aid_owner": false, + "charging_pay": 0 + } + ] + }, + { + "season": { + "id": 3541327, + "title": "BACollect", + "desc": "", + "cover": "https://archive.biliimg.com/bfs/archive/77906db03b1eefac02613de184afad03f7bc58d7.jpg", + "isEnd": 0, + "mid": 645769214, + "isAct": 0, + "is_pay": 0, + "state": 0, + "partState": 0, + "signState": 0, + "rejectReason": "", + "ctime": 1722574656, + "mtime": 1722574658, + "no_section": 1, + "forbid": 0, + "protocol_id": "", + "ep_num": 0, + "season_price": 0, + "is_opened": 1, + "has_charging_pay": 0 + }, + "course": null, + "checkin": { + "status": 0, + "status_reason": "", + "season_status": 0 + }, + "seasonStat": { + "view": 0, + "danmaku": 0, + "reply": 0, + "fav": 0, + "coin": 0, + "share": 0, + "nowRank": 0, + "hisRank": 0, + "like": 0, + "subscription": 0, + "vt": 0 + }, + "sections": { + "sections": [ + { + "id": 3954127, + "type": 1, + "seasonId": 3541327, + "title": "正片", + "order": 1, + "state": 0, + "partState": 0, + "rejectReason": "", + "ctime": 1722574656, + "mtime": 1722574656, + "epCount": 0, + "cover": "http://static.hdslb.com/images/transparent.gif", + "has_charging_pay": 0, + "Episodes": null + } + ] + }, + "part_episodes": null + } + ], + "tip": { + "title": "", + "url": "" + }, + "total": 2, + "play_type": 1 + } +} +``` + +</details> + +## 创建合集 + +> ttps://member.bilibili.com/x2/creative/web/season/add + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +注: 有人工审核 + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| title | str | 合集标题 | 必要 | | +| desc | str | 合集简介 | 不必要 | | +| cover | str | 封面图 | 必要 | 从 [上传封面](upload.md#上传封面) 处获取 | +| season_price | num | 0 | 不必要 | 作用尚不明确 | +| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | +| data | num | 合集 ID | | + +**示例:** + +```shell +curl -X POST 'https://member.bilibili.com/x2/creative/web/season/add' \ +--data-urlencode 'title=🍥Debian' \ +--data-urlencode 'desc=这里是泽生折腾 Debian GNU/Linux 的珍贵影像记录喵~' \ +--data-urlencode 'cover=https://archive.biliimg.com/bfs/archive/ec51de61b53159c5e2430cf963f5f97e692baeaf.jpg' \ +--data-urlencode 'season_price=0' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx; bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": 3541247 +} +``` + +</details> + +## 添加视频到合集 + +> https://member.bilibili.com/x2/creative/web/season/section/episodes/add + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | + +**正文参数 (application/json):** + +根对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| episode | array | 视频列表 | 必要 | | +| section_id | num | 合集小节 ID | 必要 | | + +`episode` 数组中的对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | --- | ---- | ----- | --- | +| aid | num | 视频 aid | 必要 | | +| cid | num | 稿件 cid | 必要 | | +| title | str | 合集内单集标题 | 必要 | | +| charging_pay | num | 0 | 不必要 | 作用尚不明确 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | + +**示例:** + +假设您已经把请求有效荷载放在 `payload.json` 文件中: + +```json +{ + "sectionId": 3954033, + "episodes": [ + { + "title": "Linux小寄巧: 原地卸载内核然后尝试救活!", + "aid": 1906473802, + "cid": 1625992822, + "charging_pay": 0 + }, + { + "title": "十多年前的电脑运行Debian12的启动过程", + "aid": 1956170305, + "cid": 1607067247, + "charging_pay": 0 + } + ] +} +``` + +```shell +curl -X POST --url 'https://member.bilibili.com/x2/creative/web/season/section/episodes/add' \ +--url-query 'csrf=xxx' \ +-H 'Content-Type: application/json' \ +--data-binary @payload.json \ +-b 'SESSDATA=xxx; bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +</details> + +## 编辑合集小节 + +> https://member.bilibili.com/x2/creative/web/season/section/edit + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| csrf | str | CSRF Token (即 Cookies 中 bili_jct) | 必要 | | + +**正文参数 (application/json):** + +根对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| section | obj | 小节信息 | 必要 | | +| sorts | array | 排序列表 | 必要 | | + +`section` 对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| id | num | 小节 ID | 必要 | | +| seasonId | num | 合集 ID | 必要 | | +| title | str | 小节标题 | 必要 | | +| type | num | 1 | 必要 | | + +`sorts` 数组中的对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| id | num | 合集内视频 ID | 必要 | | +| order | num | 排序位置 | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | + +**示例:** + +假设您已经把请求有效荷载放在 `payload.json` 文件中: + +```json +{ + "section": { + "id": 3954033, + "type": 1, + "seasonId": 3541247, + "title": "正片" + }, + "sorts": [ + { + "id": 77260687, + "sort": 1 + }, + { + "id": 77260688, + "sort": 2 + } + ] +} +``` + +```shell +curl -X POST --url 'https://member.bilibili.com/x2/creative/web/season/section/edit' \ +--url-query 'csrf=xxx' \ +-H 'Content-Type: application/json' \ +--data-binary @payload.json \ +-b 'SESSDATA=xxx; bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +</details> + +## 编辑合集信息 + +> https://member.bilibili.com/x2/creative/web/season/edit + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +注: 也有人工审核 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| csrf | str | CSRF Token (即 Cookies 中 bili_jct) | 必要 | | + +**正文参数 (application/json):** + +根对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| season | obj | 合集信息 | 必要 | | +| sorts | array | 排序列表 | 必要 | | + +`season` 对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| id | num | 合集 ID | 必要 | | +| title | str | 合集标题 | 必要 | | +| cover | str | 封面图 | 必要 | 从 [上传封面](upload.md#上传封面) 处获取 | +| desc | str | 合集简介 | 不必要 | | +| season_price | num | 0 | 不必要 | 作用尚不明确 | +| isEnd | num | 是否完结 | 不必要 | 0:未完结<br />1:完结 | + +`sorts` 数组中的对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| id | num | 小节 ID | 必要 | | +| sort | num | 排序位置 | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | + +**示例:** + +假设您已经把请求有效荷载放在 `payload.json` 文件中: + +```json +{ + "season": { + "cover": "https://archive.biliimg.com/bfs/archive/77906db03b1eefac02613de184afad03f7bc58d7.jpg", + "id": 3541327, + "title": "IWILLBEDEL" + }, + "sorts": [ + { + "id": 3954127, + "sort": 1 + } + ] +} +``` + +```shell +curl -X POST --url 'https://member.bilibili.com/x2/creative/web/season/edit' \ +--url-query 'csrf=xxx' \ +-H 'Content-Type: application/json' \ +--data-binary @payload.json \ +-b 'SESSDATA=xxx; bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +</details> + +## 删除合集 + +> https://member.bilibili.com/x2/creative/web/season/del + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | --- | ---- | ----- | --- | +| id | num | 合集 ID | 必要 | | +| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | + +**示例:** + +删除合集 `id=3541327` + +```shell +curl -X POST 'https://member.bilibili.com/x2/creative/web/season/del' \ +--data-urlencode 'id=3541327' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx; bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +</details> + +## 获取合集小节中的视频 + +> https://member.bilibili.com/x2/creative/web/season/section + +*请求方法: GET* + +认证方式: Cookie (SESSDATA) + +可以在给合集排序时使用, 可以获取别人的 + +**URL 参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | --- | ---- | ----- | --- | +| id | num | 合集 ID | 必要 | | + +**JSON 回复:** + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| section | obj | 小节信息 | | +| episodes | arr | 小节中的视频 | | + +`data` 对象中的 `section` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| id | num | 小节 ID | | +| type | num | 小节类型 | | +| seasonId | num | 合集 ID | | +| title | str | 小结标题 | | +| order | str | 排序编号? | | +| isEnd | num | 是否已完结? | 0: 未完结 | +| state | num | 合集状态? | 0: 正常显示<br />-6: 正在审核 | +| partState | num | 合集分段状态? | 0 | +| rejectReason | str | 合集拒绝原因? | | +| ctime | num | 创建时间 | | +| mtime | num | 修改时间 | | +| epCount | num | 小节视频总数 | | +| cover | num | 合集封面 | | +| show | num | 是否公开? | 1: 公开 | +| has_charging_pay | num | 是否充电付费? | 0: 否 | +| Episodes | null | | | +| has_pugv_pay | num | 是否 PUGV 付费? | 0: 否 | + +`data` 对象中的 `episodes`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| id | num | 合集内视频 ID | | +| title | str | 视频标题 | | +| aid | num | 视频 aid | | +| bvid | str | 视频 bvid | | +| cid | num | 视频 cid | | +| seasonId | num | 合集 ID | | +| sectionId | num | 小节 ID | | +| order | num | 排序编号 | | +| videoTitle | str | 视频标题 | | +| archiveTitle | str | 看起来也是标题 | | +| archiveState | num | 0 | | +| rejectReason | str | 拒绝理由? | | +| state | num | 0 | | +| cover | str | 封面 URL | | +| is_free | num | 是否免费? | 0: 免费 | +| aid_owner | bool | 是否视频所有者 | true:是所有者 | +| charging_pay | num | 充电付费? | 0: 否 | + + +**示例:** + +获取合集小节 176088 的视频 + +```shell +curl -G --url 'https://member.bilibili.com/x2/creative/web/season/section' \ +--url-query 'id=176088' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +会返回全部的,由于很长,这里只保留三个作为例子 + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "section": { + "id": 176088, + "type": 1, + "seasonId": 152812, + "title": "正片", + "order": 1, + "state": 0, + "partState": 0, + "rejectReason": "", + "ctime": 1643250822, + "mtime": 1739466002, + "epCount": 112, + "cover": "http://i1.hdslb.com/bfs/archive/4439a182b142d92a169609e6e14e7217b3e14e0d.jpg", + "has_charging_pay": 0, + "Episodes": null, + "show": 1, + "has_pugv_pay": 0 + }, + "episodes": [ + { + "id": 109100674, + "title": "「开箱评测」三星Note8 EMR2笔对比公版Wacom笔 套娃笔首选 10寸 RK PX30 Wacom 电子书 天喻墨学 M2 M3", + "aid": 113997323963614, + "bvid": "BV14BNfeSE5c", + "cid": 28376042631, + "seasonId": 152812, + "sectionId": 176088, + "order": 1, + "videoTitle": "「开箱评测」三星Note8 EMR2笔对比公版Wacom笔 套娃笔首选 10寸 RK PX30 Wacom 电子书 天喻墨学 M2 M3", + "archiveTitle": "「开箱评测」三星Note8 EMR2笔对比公版Wacom笔 套娃笔首选 10寸 RK PX30 Wacom 电子书 天喻墨学 M2 M3", + "archiveState": 0, + "rejectReason": "", + "state": 0, + "cover": "", + "is_free": 0, + "aid_owner": true, + "charging_pay": 0, + "member_first": 0, + "pugv_pay": 0 + }, + { + "id": 108733886, + "title": "「开箱评测」拆解 椭圆形的第三方AirTag GRTSZ S2 Tag", + "aid": 113982291576104, + "bvid": "BV1YyNvetEbX", + "cid": 28325121446, + "seasonId": 152812, + "sectionId": 176088, + "order": 2, + "videoTitle": "「开箱评测」拆解 椭圆形的第三方AirTag GRTSZ S2 Tag", + "archiveTitle": "「开箱评测」拆解 椭圆形的第三方AirTag GRTSZ S2 Tag", + "archiveState": 0, + "rejectReason": "", + "state": 0, + "cover": "", + "is_free": 0, + "aid_owner": true, + "charging_pay": 0, + "member_first": 0, + "pugv_pay": 0 + }, + { + "id": 106045797, + "title": "「开箱评测」这帕姆怎么射不出来呢! 星穹铁道 KFC联动 财神帕姆 太可爱了", + "aid": 113892936122993, + "bvid": "BV1ZFFKeTEkr", + "cid": 28087484764, + "seasonId": 152812, + "sectionId": 176088, + "order": 3, + "videoTitle": "「开箱评测」这帕姆怎么射不出来呢! 星穹铁道 KFC联动 财神帕姆 太可爱了", + "archiveTitle": "「开箱评测」这帕姆怎么射不出来呢! 星穹铁道 KFC联动 财神帕姆 太可爱了", + "archiveState": 0, + "rejectReason": "", + "state": 0, + "cover": "", + "is_free": 0, + "aid_owner": true, + "charging_pay": 0, + "member_first": 0, + "pugv_pay": 0 + } + ] + } +} +``` + +</details> + diff --git a/creativecenter/statistics&data.md b/docs/creativecenter/statistics&data.md similarity index 81% rename from creativecenter/statistics&data.md rename to docs/creativecenter/statistics&data.md index 90a0873..bfaef6f 100644 --- a/creativecenter/statistics&data.md +++ b/docs/creativecenter/statistics&data.md @@ -1,20 +1,10 @@ # 统计与数据 -- [UP主视频状态数据](#UP主视频状态数据) -- [UP主专栏状态数据](#UP主专栏状态数据) -- [视频数据增量趋势](#视频数据增量趋势) -- [专栏数据增量趋势](#专栏数据增量趋势) -- [稿件操作来源占比情况](#稿件操作来源占比情况) -- [播放来源占比情况(平台及方式)](#播放来源占比情况(平台及方式)) -- [播放分布情况(粉丝与路人)](#播放分布情况(粉丝与路人)) - ---- - 统计与数据次日中午12刷新 ## UP主视频状态数据 -> http://member.bilibili.com/x/web/index/stat +> https://member.bilibili.com/x/web/index/stat *请求方式:GET* @@ -35,7 +25,6 @@ | 字段 | 类型 | 内容 | 备注 | | ----------------- | ---- | -------------- | ---- | -| fan_recent_thirty | obj | 粉丝数变化情况 | | | inc_coin | num | 新增投币数 | | | inc_elec | num | 新增充电数 | | | inc_fav | num | 新增收藏数 | | @@ -55,31 +44,10 @@ | total_reply | num | 总计评论数 | | | total_share | num | 总计分享数 | | -`data`中的`fan_recent_thirty`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ---- | -| follow | obj | 涨粉情况 | | -| unfollow | obj | 掉粉情况 | | - -`fan_recent_thirty`中的`follow`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------ | ---------------- | -| {YYYYMMDD} | num | 涨粉数 | 字段名为日期 | -| …… | num | …… | 近30天的涨粉情况 | - -`fan_recent_thirty`中的`unfollow`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------ | ---------------- | -| {YYYYMMDD} | num | 掉粉数 | 字段名为日期 | -| …… | num | …… | 近30天的掉粉情况 | - **示例:** ```shell -curl 'http://member.bilibili.com/x/web/index/stat' \ +curl 'https://member.bilibili.com/x/web/index/stat' \ -b 'SESSDATA=xxx' ``` @@ -88,93 +56,126 @@ curl 'http://member.bilibili.com/x/web/index/stat' \ ```json { - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "fan_recent_thirty": { - "follow": { - "20200304": 0, - "20200305": 1, - "20200307": 1, - "20200308": 0, - "20200309": 1, - "20200310": 6, - "20200311": 0, - "20200313": 0, - "20200314": 0, - "20200316": 3, - "20200317": 0, - "20200318": 1, - "20200319": 2, - "20200320": 0, - "20200321": 0, - "20200322": 2, - "20200323": 5, - "20200324": 4, - "20200325": 2, - "20200326": 2, - "20200327": 3, - "20200328": 1, - "20200329": 1, - "20200331": 1, - "20200401": 2 - }, - "unfollow": { - "20200304": 1, - "20200305": 0, - "20200307": 0, - "20200308": 0, - "20200309": 2, - "20200310": 1, - "20200311": 1, - "20200313": 2, - "20200314": 1, - "20200316": 0, - "20200317": 1, - "20200318": 1, - "20200319": 0, - "20200320": 1, - "20200321": 1, - "20200322": 1, - "20200323": 1, - "20200324": 0, - "20200325": 1, - "20200326": 0, - "20200327": 0, - "20200328": 0, - "20200329": 0, - "20200331": 0, - "20200401": 1 - } - }, - "inc_coin": 0, - "inc_elec": 0, - "inc_fav": 0, - "inc_like": 2, - "inc_share": 0, - "incr_click": 62, - "incr_dm": 1, - "incr_fans": 2, - "incr_reply": 2, - "total_click": 31059, - "total_coin": 440, - "total_dm": 522, - "total_elec": 90, - "total_fans": 390, - "total_fav": 557, - "total_like": 729, - "total_reply": 405, - "total_share": 254 - } + "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/archive_diagnose/compare + +*请求方式:GET* + +认证方式:仅可Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------ | ------ | -------------- | +| t | num | 时间戳 | 可选 | | +| size | num | 比较最近的N条视频 | 可选,默认5 | 似乎没有最大值,或者最大值很大 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功<br />-101:账号未登录 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | 作用尚不明确 | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ---------- | ---- | +| list | list | 最近的视频 | | + +`data`中的`list`项: +> [!TIP] +> 这里的数字一般都是百分比,小数点后保留两位,100代表1%,10000代表100% + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ---------- | ---- | +| aid | num | av号 | | +| bvid | str | bv号 | | +| cover | str | 封面url | | +|title| str|标题| +|pubtime|num|发布时间| +|duration|num|视频长度(秒)| +|play|num|播放数|| +|vt|num|未知 +|like|num|点赞数 +|comment|num|评论数 +|dm|num|弹幕数 +|fav|num|收藏数| +|coin|num|投币数 +|share|num|分享数 +|full_play_ratio|num|完播比,用户平均在百分之多少退出 +|play_viewer_rate|num|游客播放数,这个视频有多少是游客播放 +|active_fans_rate|num|粉丝观看率,多少粉丝看了这个视频 +|active_fans_med|num|? +|tm_rate|num|封标点击率 +|tm_rate_med|num|你自己平均封标点击率 +|tm_fan_simi_rate_med|num|同类up粉丝封标点击率 +|tm_viewer_simi_rate_med|num|同类up游客封标点击率 +|tm_fan_rate|num|粉丝封标点击率 +|tm_viewer_rate|num|游客封标点击率 +|tm_pass_rate|num|封标点击率超过n%同类稿件 +|tm_fan_pass_rate|num|粉丝封标点击率超过n%同类稿件 +|tm_viewer_pass_rate|num|游客封标点击率超过n%同类稿件 +|crash_rate|num|3秒退出率 +|crash_rate_med|num|? +|crash_fan_simi_rate_med|num|同类up粉丝3秒退出率 +|crash_viewer_simi_rate_med|num|同类up游客3秒退出率 +|crash_fan_rate|num|粉丝3秒退出率 +|crash_viewer_rate|num|游客3秒退出率 +|interact_rate|num|互动率 +|interact_rate_med|num| +|interact_fan_simi_rate_med|num|同类up粉丝互动率 +|interact_viewer_simi_rate_med|num|同类up游客互动率 +|interact_fan_rate|num|粉丝互动率 +|interact_viewer_rate|num|游客互动率 +|avg_play_time|num|平均播放时间|注意:此字段总是0,可能b站正在写代码,或者和播放量改播放时长有关? +|total_new_attention_cnt|num|涨粉 +|play_trans_fan_rate|num|播转粉率 +|play_trans_fan_rate_med|num|其他up平均播转粉率 + +**示例:** + +```shell +curl 'https://member.bilibili.com/x/web/data/archive_diagnose/compare?size=10' \ +-b 'SESSDATA=xxx' +``` + ## UP主专栏状态数据 -> http://member.bilibili.com/x/web/data/article +> https://member.bilibili.com/x/web/data/article *请求方式:GET* @@ -211,7 +212,7 @@ curl 'http://member.bilibili.com/x/web/index/stat' \ **示例:** ```shell -curl 'http://member.bilibili.com/x/web/data/article' \ +curl 'https://member.bilibili.com/x/web/data/article' \ -b 'SESSDATA=xxx' ``` @@ -244,7 +245,7 @@ curl 'http://member.bilibili.com/x/web/data/article' \ ## 视频数据增量趋势 -> http://member.bilibili.com/x/web/data/article/thirty +> https://member.bilibili.com/x/web/data/pandect *请求方式:GET* @@ -303,7 +304,7 @@ curl 'http://member.bilibili.com/x/web/data/article' \ 查询30天前的视频播放增量趋势,可知`2020-04-05`的播放增量为`46`,`2020-04-04`的播放增量为`58` ```shell -curl -G 'http://member.bilibili.com/x/web/data/pandect' \ +curl -G 'https://member.bilibili.com/x/web/data/pandect' \ --data-urlencode 'type=1' \ -b 'SESSDATA=xxx' ``` @@ -344,7 +345,7 @@ curl -G 'http://member.bilibili.com/x/web/data/pandect' \ ## 专栏数据增量趋势 -> http://member.bilibili.com/x/web/data/article/thirty +> https://member.bilibili.com/x/web/data/article/thirty *请求方式:GET* @@ -401,7 +402,7 @@ curl -G 'http://member.bilibili.com/x/web/data/pandect' \ 查询30天前的文章阅读增量趋势,可知`2020-04-05`的阅读增量为`6`,`2020-04-04`的阅读增量为`6` ```shell -curl -G 'http://member.bilibili.com/x/web/data/article/thirty' \ +curl -G 'https://member.bilibili.com/x/web/data/article/thirty' \ --data-urlencode 'type=1' \ -b 'SESSDATA=xxx' ``` @@ -439,7 +440,7 @@ curl -G 'http://member.bilibili.com/x/web/data/article/thirty' \ ## 稿件操作来源占比情况 -> http://member.bilibili.com/x/web/data/survey +> https://member.bilibili.com/x/web/data/survey *请求方式:GET* @@ -523,7 +524,7 @@ curl -G 'http://member.bilibili.com/x/web/data/article/thirty' \ 查询我的稿件来源占比情况 ```shell -curl -G 'http://member.bilibili.com/x/web/data/survey' \ +curl -G 'https://member.bilibili.com/x/web/data/survey' \ --data-urlencode 'type=1' \ -b 'SESSDATA=xxx' ``` @@ -580,7 +581,7 @@ curl -G 'http://member.bilibili.com/x/web/data/survey' \ ## 播放来源占比情况(平台及方式) -> http://member.bilibili.com/x/web/data/playsource +> https://member.bilibili.com/x/web/data/playsource *请求方式:GET* @@ -628,7 +629,7 @@ curl -G 'http://member.bilibili.com/x/web/data/survey' \ **示例:** ```shell -curl 'http://member.bilibili.com/x/web/data/playsource' \ +curl 'https://member.bilibili.com/x/web/data/playsource' \ -b 'SESSDATA=xxx' ``` @@ -664,7 +665,7 @@ curl 'http://member.bilibili.com/x/web/data/playsource' \ ## 播放分布情况(粉丝与路人) -> http://member.bilibili.com/x/web/data/base +> https://member.bilibili.com/x/web/data/base *请求方式:GET* @@ -763,7 +764,7 @@ curl 'http://member.bilibili.com/x/web/data/playsource' \ **示例:** ```shell -curl 'http://member.bilibili.com/x/web/data/base' \ +curl 'https://member.bilibili.com/x/web/data/base' \ -b 'SESSDATA=xxx' ``` diff --git a/docs/creativecenter/upload.md b/docs/creativecenter/upload.md new file mode 100644 index 0000000..42abd30 --- /dev/null +++ b/docs/creativecenter/upload.md @@ -0,0 +1,1087 @@ +# 投稿 + +## 上传封面 + +> https://member.bilibili.com/x/vu/web/cover/up + +*请求方式: POST* + +认证方式:Cookie(SESSDATA) + +注: 目前看来上传的图片似乎不会自动删除 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| ts | num | 当前时间 | 不必要 | UNIX 毫秒时间戳 | + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | +| cover | base64 | 视频封面 | 必要 | 经过 base64 编码的图片数据 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----- | +| code | num | 返回值 | 0: 成功<br />-400: 请求错误<br />-111: csrf 校验失败<br />-101: 账号未登录 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---- | +| url | str | 封面 URL | | + +**示例:** + +假设已经把需要发送的数据进行编码存放在文件 `./b64` 中: + +```text +csrf=xxxxxxxxxxxx&cover=data%3Aimage%2Fjpeg%3Bbase64%2C%2F9j%2F4AAQSkZJRgABA... +``` + +发送请求: + +```shell +curl -X POST --url "https://member.bilibili.com/x/vu/web/cover/up" \ +--url-query "ts=$(date +%s%3N)" \ +--data-binary @b64 \ +-b "SESSDATA=xxxxxx; bili_jct=xxxxxx" +``` + +JavaScript (Node.js) 请求[示例](https://gist.github.com/SessionHu/5e47a3a1a351ac5486c87e3d63930e7a) + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "url": "https://archive.biliimg.com/bfs/archive/77906db03b1eefac02613de184afad03f7bc58d7.jpg" + } +} +``` + +</details> + +## 预测稿件类型 + +> https://member.bilibili.com/x/vupre/web/archive/types/predict + +*请求方式: POST* + +认证方式: Cookie(SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| ts | num | 当前时间 | 不必要 | UNIX 毫秒时间戳 | +| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | + +**正文参数(multipart/form-data):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| filename | str | 视频文件名 | 必要 | 从视频上传接口获取, 无后缀名, 可为空 | +| title | str | 视频标题 | 不必要 || +| upload_id | str | 上传 ID | 不必要 | 如 `616368979_1723455540876_8794` | + +**JSON回复:** + +根对象: + +|字段|类型|内容|备注| +|---|-|-|---| +|code|num|返回值|0: 成功<br />-400: 请求错误<br />-111: csrf 校验失败<br />-101: 账号未登录| +|message|str|错误信息|默认为 0| +|ttl|num|1|| +|data|array|信息本体|| + +`data` 数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---- | +| 0 | obj | 视频类型 1 | | +| 1 | obj | 视频类型 2 | | +| …… | obj | …… | | +| n | obj | 视频类型 (n+1) | | + +`data` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---- | +| id | num | 子分区 ID | | +| parent | num | 总分区 ID | | +| parent_name | str | 总分区名称 | | +| name | str | 子分区名称 | | +| description | str | 子分区描述 | | +| desc | str | 子分区描述 | 同 `description` | +| intro_original | str | 原创简介说明 | | +| intro_copy | str | 转载简介说明 | | +| notice | str | 注意事项 | | +| copy_right | num | 版权信息? | 0 | +| show | bool | 是否显示? | true | +| rank | num | 排序权重? | | +| max_video_count | num | 最大视频数量? | | +| request_id | str | 空 | | + +**示例:** + +```shell +curl -X POST --url 'https://member.bilibili.com/x/vupre/web/archive/types/predict' \ +--url-query 'csrf=d51eadf05ba3bc6c5f76def7fbcc0185' \ +--data-urlencode 'filename=' \ +-b 'SESSDATA=xxx; bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "id": 122, + "parent": 36, + "parent_name": "知识", + "name": "野生技能协会", + "description": "技能展示或技能教学分享类视频", + "desc": "技能展示或技能教学分享类视频", + "intro_original": "可对视频内容进行补充说明,并对所使用的视频素材进行标明。\n如是系列,也可附带上期视频地址。\n请勿加入涉政或具较大争议性的文字简介,否则将做打回处理。", + "intro_copy": "转载稿件需标明出处,请注明原作者、原作者频道名或原作者投稿地址。\n可对相关内容进行补充说明。\n请勿加入涉政或具较大争议性的文字简介,否则将做打回处理。\n如是系列,也可附带上期视频地址。", + "notice": "清晰明了表明内容亮点的标题会更受观众欢迎哟!", + "copy_right": 0, + "show": true, + "rank": 75, + "max_video_count": 100, + "request_id": "" + }, + { + "id": 21, + "parent": 160, + "parent_name": "生活", + "name": "日常", + "description": "一般日常向的生活类视频", + "desc": "一般日常向的生活类视频", + "intro_original": "能够选择自制的必须是up主个人或工作室自己制作剪辑的视频,除此之外的搬运视频字幕制作,对于视频进行加速、慢放等简易二次创作,在视频中添加前后贴片或者打水印等行为均不被认作自制", + "intro_copy": "转载需写明请注明转载作品详细信息原作者、原标题及出处(需为该视频最原始出处,如所标注明显为非原始出处的话会被打回)", + "notice": "", + "copy_right": 0, + "show": true, + "rank": 4, + "max_video_count": 50, + "request_id": "" + }, + { + "id": 242, + "parent": 5, + "parent_name": "娱乐", + "name": "娱乐粉丝创作", + "description": "粉丝向创作视频", + "desc": "粉丝向创作视频", + "intro_original": "", + "intro_copy": "", + "notice": "清晰明了表明内容亮点的标题会更受观众欢迎哟!", + "copy_right": 0, + "show": true, + "rank": 40, + "max_video_count": 50, + "request_id": "" + }, + { + "id": 65, + "parent": 4, + "parent_name": "游戏", + "name": "网络游戏", + "description": "多人在线游戏为主要内容的相关视频", + "desc": "多人在线游戏为主要内容的相关视频", + "intro_original": "建议在简介和TAG中添加正确的游戏名,以便在分区和搜索中得到更好的展示。\n录制他人直播(包括授权转载、授权录制)不属于自制内容,请选转载。", + "intro_copy": "建议在简介和TAG中添加正确的游戏名。\n搬运转载内容请添加原作者、原链接地址信息。录制他人直播内容请添加原主播信息、直播时间。\n未添加正确转载、录播信息的稿件可能被打回。", + "notice": "【UP主/节目名】+《游戏名》+主要标题+期号", + "copy_right": 0, + "show": true, + "rank": 30, + "max_video_count": 50, + "request_id": "" + }, + { + "id": 138, + "parent": 160, + "parent_name": "生活", + "name": "搞笑", + "description": "搞笑挑战、剪辑、表演、配音以及各类日常沙雕视频", + "desc": "搞笑挑战、剪辑、表演、配音以及各类日常沙雕视频", + "intro_original": "能够选择自制的必须是up主个人或工作室自己制作剪辑的视频,除此之外的搬运视频字幕制作,对于视频进行加速、慢放等简易二次创作,在视频中添加前后贴片或者打水印等行为均不被认作自制", + "intro_copy": "转载需写明请注明转载作品详细信息原作者、原标题及出处(需为该视频最原始出处,如所标注明显为非原始出处的话会被打回)", + "notice": "", + "copy_right": 0, + "show": true, + "rank": 30, + "max_video_count": 50, + "request_id": "" + } + ] +} +``` + +</details> + +## 预测稿件标签 + +> https://member.bilibili.com/x/vupre/web/tag/recommend + +*请求方式: GET* + +认证方式: Cookie(SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| upload_id | str | 同 [预测稿件类型](#预测稿件类型) 的 `upload_id` | 不必要 | | +| subtype_id | int | 子分区 ID | 不必要 | | +| title | str | 视频标题 | 不必要 | | +| filename | str | 同 [预测稿件类型](#预测稿件类型) 的 `filename` | 不必要 | | +| description | str | 视频简介 | 不必要 | | +| cover_url | str | 视频封面 URL | 不必要 | 不含 `https:` 或 `http:` 字串 | +| t | int | 当前 UNIX 毫秒时间戳 | 不必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| code | int | 返回值 | 0: 成功<br />-101: 账号未登录 | +| data | array | 标签信息 | | +| message | str | 错误信息 | 默认为 0 | +| request_id | str | 请求 ID | | + +`data` 数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---- | +| 0 | obj | 标签 1 | | +| 1 | obj | 标签 2 | | +| …… | obj | …… | | +| n | obj | 标签 (n+1) | | + +`data` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---- | +| tag | str | 标签名称 | | +| checked | int | 0 | | +| request_id | str | 请求 ID | 同根对象 | + +**示例:** + +```shell +curl -G 'https://member.bilibili.com/x/vupre/web/tag/recommend' \ +--url-query 'subtype_id=122' \ +--url-query 'title=Telnet手打HTTP' \ +--url-query 'description=测试用 Telnet 手打 HTTP/1.x 协议访问本地服务器, 无 SSL/TLS 支持' +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "data": [ + { + "tag": "学习", + "checked": 0, + "request_id": "TAG_1723543336295_3371" + }, + { + "tag": "编程", + "checked": 0, + "request_id": "" + }, + { + "tag": "课程", + "checked": 0, + "request_id": "" + }, + { + "tag": "学习心得", + "checked": 0, + "request_id": "" + }, + { + "tag": "经验分享", + "checked": 0, + "request_id": "" + } + ], + "message": "0", + "request_id": "TAG_1723543336295_3371" +} +``` + +</details> + +## 投递视频稿件 + +> https://member.bilibili.com/x/vu/web/add/v3 + +*请求方式: POST* + +认证方式:Cookie(SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| ts | num | 当前时间 | 不必要 | UNIX 毫秒时间戳 | +| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | + +**正文参数(application/json):** + +根对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| videos | array | 视频信息 | 必要 | 若为分 P 视频, 请注意数组元素顺序 | +| cover | str | 视频封面 URL | 必要 | 参见[上传视频封面](#上传视频封面) | +| cover43 | str | 视频封面 URL (比例为 4:3) | 必要 | 可为空 | +| title | str | 视频标题 | 必要 | 最多 80 字 | +| copyright | num | 1: 自制<br />2: 转载 | 必要 | | +| tid | num | 分类 ID | 必要 | | +| tag | str | 视频标签 | 必要 | 多个标签用 `,` 分隔, 最多 10 个 | +| desc_format_id | num | 简介格式 ID? | 必要 | 9999: 纯文本 | +| desc | str | 视频简介 | 必要 | 最多 2000 字 | +| recreate | num | 是否允许二创 | 必要 | -1: 允许(默认)<br />1: 不允许 | +| dynamic | str | 粉丝动态 | 必要 | | +| interactive | num | 互动视频? | 必要 | 0: 否 | +| act_reserve_create | num | 活动预约? | 必要 | 0: 否 | +| no_disturbance | num | 勿扰模式? | 必要 | 0: 否 | +| no_reprint | num | 是否允许转载 | 必要 | 1: 允许<br />0: 不允许 | +| subtitle | obj | 字幕信息 | 必要 | | +| dolby | num | 杜比音效 | 必要 | 0: 否(默认)<br />1: 是 | +| lossless_music | num | 无损音乐 | 必要 | 0: 否(默认)<br />1: 是 | +| up_selection_reply | bool | 精选评论 | 必要 | | +| up_close_reply | bool | 关闭评论 | 必要 | | +| up_close_danmu | bool | 关闭弹幕 | 必要 | | +| web_os | num | 平台类型? | 必要 | 3 | + +`videos` 数组中的对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| filename | str | 视频文件名 | 必要 | 从视频上传接口获取, 无后缀名 | +| title | str | 分 P 标题 | 必要 | | +| desc | str | 分 P 简介 | 必要 | | +| cid | num | 分 P cid | 必要 | 从视频上传接口获取, 即 `biz_id` | + +`subtitle` 对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| open | num | 是否启用字幕投稿 | 必要 | 0: 启用(默认)<br />1: 不启用 | +| lan | str | 字幕投稿语言 | 必要 | 可为空 | + +**示例:** + +假设已经把需要发送的数据存放在文件 `./data.json` 中: + +```json +{ + "videos": [ + { + "filename": "n240728ad33h52yqhxbtw51cb06sq9gx", + "title": "Telnet手打HTTP", + "desc": "", + "cid": 500001629877726 + } + ], + "cover": "https://archive.biliimg.com/bfs/archive/85447ea20431ef799382c403c84b4bfb82a41053.jpg", + "cover43": "", + "title": "Telnet手打HTTP", + "copyright": 1, + "tid": 122, + "tag": "telnet,socket,tcp,linux,http", + "desc_format_id": 9999, + "desc": "测试用 Telnet 手打 HTTP/1.x 协议访问本地服务器, 无 SSL/TLS 支持", + "recreate": -1, + "dynamic": "for testing", + "interactive": 0, + "act_reserve_create": 0, + "no_disturbance": 0, + "no_reprint": 1, + "subtitle": { + "open": 0, + "lan": "" + }, + "dolby": 0, + "lossless_music": 0, + "up_selection_reply": false, + "up_close_reply": false, + "up_close_danmu": false, + "web_os": 3, + "csrf": "xxxxxxxxxxxxxxxxxxxxxxxx" +} +``` + +发送请求: + +```shell +curl -X POST --url "https://member.bilibili.com/x/vu/web/add/v3" \ +--url-query "ts=$(date +%s%3N)" \ +--url-query "csrf=xxxxxxxxxxxxxxxxxxxxxxxx" \ +-H "Content-Type: application/json; charset=utf-8" \ +--data @data.json \ +-b "SESSDATA=xxxxxx; bili_jct=xxxxxxxxxxxxxxxxxxxxxxxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "aid": 112861976201494, + "bvid": "BV181vnexEmB" + } +} +``` + +</details> + +## 上传视频文件 + +注: 目前看来上传的视频文件似乎不会自动删除, 而且似乎不是视频也可以上传的样子, 但是下载认证字段有效期只有 5 天 + +### 上传流程 + +整个上传流程较为复杂, 详细参见[Demo](#Demo) + +1. `GET` `preupload` 接口, [获取上传元数据](#获取上传元数据-预上传) + +2. `POST` 第 1 步得到的地址, [上传视频元数据](#上传视频元数据) + +3. `PUT` 第 1 步得到的地址, [分片上传视频文件](#分片上传视频文件) + +4. `POST` 第 1 步得到的地址, [结束上传视频文件](#结束上传视频文件) + +5. `GET` 第 1 步得到的地址, [下载已上传的视频文件](#下载已上传的视频文件) , 确认上传成功 (可选) + +### 上传接口 + +#### 获取上传元数据 (预上传) + +> https://member.bilibili.com/preupload + +*请求方式: GET* + +认证方式:Cookie(SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| name | str | 文件名 | 必要 | 会影响返回的上传地址 | +| r | str | 上传区域? | 必要 | upos | +| profile | str | 上传配置? | 必要 | 普通视频: ugcfx/bup<br />提交反馈: feedback/bup | +| probe_version | num | 上传版本? | 不必要 | 20221109 | +| upcdn | str | 上传 CDN? | 不必要 | txa | +| zone | str | 上传区域? | 不必要 | cs | +| ssl | num | 是否使用 SSL? | 不必要 | 0 | +| version | str | 上传版本? | 不必要 | 2.14.0.0 | +| build | str | 上传版本? | 不必要 | 2140000 | +| size | num | 文件大小 | 不必要 | 视频文件大小, 单位 字节 | +| webVersion | str | 上传版本? | 不必要 | 2.13.0 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----- | +| OK | num | 1 | | +| auth | str | 上传凭证 | 作为后面请求中请求头, 有效期 5 天 | +| biz_id | num | 业务 ID? | | +| chunk_retry | num | 重试次数? | | +| chunk_retry_delay | num | 重试延迟? | | +| chunk_size | num | 分块大小 | 后面要用 | +| endpoint | str | 上传节点 | 后面要用 | +| endpoints | array | 上传节点列表 | | +| expose_params | null | | | +| put_query | str | 上传参数? | | +| threads | num | 上传线程数 | | +| timeout | num | 超时时间? | | +| uip | str | 你的 IP | | +| upos_uri | str | 上传地址 | 后面要用 | + +`endpoints` 数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ----- | +| 0 | str | 上传节点1 | | +| …… | str | …… | | +| n | str | 上传节点n | | + +**示例:** + +假设视频文件名为 `2024-07-28_15-37-50.mkv`, 视频大小为 `305333744` 字节 + +```shell +curl -G "https://member.bilibili.com/preupload" \ +--data-urlencode "name=2024-07-28_15-37-50.mkv" \ +--data-urlencode "r=upos" \ +--data-urlencode "profile=ugcfx/bup" \ +-b "SESSDATA=xxxxxxxxxxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "OK": 1, + "auth": "ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=b6c5cc520a281200906aea97e190b098×tamp=1722155211.324&uid=616368979&uip=108.181.24.77&uport=52096&use_dqp=0", + "biz_id": 500001630152509, + "chunk_retry": 10, + "chunk_retry_delay": 3, + "chunk_size": 10485760, + "endpoint": "//upos-cs-upcdntxa.bilivideo.com", + "endpoints": [ + "//upos-cs-upcdntxa.bilivideo.com", + "//upos-cs-upcdnalia.bilivideo.com" + ], + "expose_params": null, + "put_query": "os=upos&profile=ugcfx%2Fbup", + "threads": 3, + "timeout": 1200, + "uip": "108.181.24.77", + "upos_uri": "upos://ugcfx2lf/n240728ad1p51if4g3ke4s3o95sznogy.mkv" +} +``` + +</details> + +#### 上传视频元数据 + +> URL 拼接格式: `"https"` + [上一个接口](#获取上传元数据-预上传)的`endpoint` + 上一个接口的`upos_uri`去掉协议名 +> JavaScript 模板字符串: `https:${preupload.endpoint}/${endpoint.upos_uri.replace("upos://", "")}` + +*请求方式: POST* + +认证方式:请求头 `X-Upos-Auth` 为上一接口得到的 `auth` + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| uploads | str | 留空 | 必要 | 留空 | +| output | str | 输出格式 | 不必要 | 默认为 json(推荐), 留空为 xml | +| profile | str | 上传配置? | 必要 | 与上一个接口保持相同 | +| filesize | num | 文件大小 | 必要 | 视频文件大小, 单位 字节<br />feedback/bup 不必要 | +| partsize | num | 分块大小 | 必要 | 上一个接口返回, 且后面要用<br />feedback/bup 不必要 | +| biz_id | num | 业务 ID? | 必要 | 上一个接口返回, 且后面要用<br />feedback/bup 不必要 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----- | +| OK | num | 1 | | +| bucket | str | 空间名? | | +| key | str | 文件名? | | +| upload_id | str | 上传 ID | 后面要用 | + +**示例:** + +假设上一接口返回的 +`auth` 为 `ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=4004b35628e982bc90b59cec86f8c441×tamp=1722173443.298&uid=616368979&uip=104.28.153.18&uport=44282&use_dqp=0`, +`biz_id` 为`500001630454700`, +`endpoint` 为 `//upos-cs-upcdntxa.bilivideo.com`, +`upos_uri` 为 `upos://ugcfx2lf/n240728adhejliqv0kqyg2s5n6huv501.mkv`, +`chunk_size` 为 `10485760`. +视频文件大小为 `305333744` 字节. + +```shell +curl -X POST --url "https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240728adhejliqv0kqyg2s5n6huv501.mkv` \ +--url-query "uploads=" \ +--url-query "output=json" \ +--url-query "profile=ugcfx/bup" \ +--url-query "filesize=305333744" \ +--url-query "partsize=10485760" \ +--url-query "biz_id=500001630454700" \ +-H "X-Upos-Auth: ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=4004b35628e982bc90b59cec86f8c441×tamp=1722173443.298&uid=616368979&uip=104.28.153.18&uport=44282&use_dqp=0" \ +-b "SESSDATA=xxxxxxxxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "OK": 1, + "bucket": "ugcfx2lf", + "key": "/n240728adhejliqv0kqyg2s5n6huv501.mkv", + "upload_id": "26c674b4-0dce-45f5-a9cd-a199d9c982bf" +} +``` + +</details> + +#### 分片上传视频文件 + +> URL 同 [上一个接口](#上传视频元数据) + +*请求方式: PUT* + +认证方式:请求头 `X-Upos-Auth` 为上上一接口得到的 `auth` + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| partNumber | num | 分块序号 | 必要 | 从 1 开始 | +| uploadId | str | 上传 ID | 必要 | 上一个接口返回 | +| chunk | num | 分块序号 | 必要 | 从 0 开始 | +| chunks | num | 分块总数 | 必要 | 自行计算: 文件大小除以分块大小并向上取整 | +| size | num | 该分块大小 | 必要 | 该实际上传字节数 | +| start | num | 该分块开始位置 | 必要 | 已实际上传字节数 | +| end | num | 该分块结束位置 | 必要 | 该分块上传结束后实际上传总字节数 | +| total | num | 总大小 | 必要 | 视频文件大小, 单位 字节 | + +**正文参数(application/octet-stream):** + +视频文件在该分块的字节流 + +**纯文本回复:** + +```text +MULTIPART_PUT_SUCCESS +``` + +**示例:** + +假设上上一接口返回的 +`auth` 为 `ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0`, +`endpoint` 为 `//upos-cs-upcdntxa.bilivideo.com`, +`upos_uri` 为 `upos://ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz`, +`chunk_size` 为 `10485760`. + +上一接口返回的 +`upload_id` 为 `8130090a-16f7-4fe6-8a29-198f5abce913`. + +视频文件名为 `20240724-remove-linux-then-install.tar.xz`, 文件大小为 `278255704` 字节. + +假设您要上传的分块序号为 `1`, +该分块大小为 `10485760`, +该分块开始位置为 `0`, +该分块结束位置为 `10485760`, +该分块实际上传字节数为 `10485760`, +您已将文件分块存放至 `part01.tar.xz`, `part02.tar.xz`, ..., `part27.tar.xz`. + +```shell +curl -X PUT --url "https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz" \ +--url-query "partNumber=1" \ +--url-query "uploadId=8130090a-16f7-4fe6-8a29-198f5abce913" \ +--url-query "chunk=0" \ +--url-query "chunks=27" \ +--url-query "size=10485760" \ +--url-query "start=0" \ +--url-query "end=10485760" \ +--url-query "total=278255704" \ +-H "X-Upos-Auth: ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0" \ +-H "Content-Type: application/octet-stream" \ +--data-binary @part01.tar.xz \ +-b "SESSDATA=xxxxxxxxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```text +MULTIPART_PUT_SUCCESS +``` + +</details> + +#### 结束上传视频文件 + +> URL 同 [上一个接口](#分片上传视频文件) + +*请求方式: POST* + +认证方式:请求头 `X-Upos-Auth` 为上上上一接口得到的 `auth` + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| output | str | 输出格式 | 不必要 | 默认为 json(推荐), 留空为 xml | +| name | str | 文件名 | 必要 | 视频文件名 | +| profile | str | 上传配置? | 必要 | 与上一个接口相同, 普通视频: ugcfx/bup | +| uploadId | str | 上传 ID | 必要 | 与上一个接口相同 | +| biz_id | num | 业务 ID? | 必要 | 与上上一个接口相同 | + +**正文参数(application/json):** + +根对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---- | ------ | ---- | +| parts | array | 各分块信息 | 必要 | 按实际上传顺序而不是分块序号顺序 | + +`parts` 数组: + +| 项 | 类型 | 内容 | 必要性 | 备注 | +| --- | ---- | ---- | ------ | ---- | +| 0 | obj | 分块信息1 | 必要 | 按实际上传顺序而不是分块序号顺序 | +| 1 | obj | 分块信息2 | 必要 | | +| …… | obj | …… | | | +| n | obj | 分块信息n | 必要 | | + +`parts` 数组中的对象: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---- | ------ | ---- | +| partNumber | num | 分块序号 | 必要 | 从 1 开始 | +| eTag | str | `etag` | 必要 | | + +**JSON回复:** + +与 [上上一个接口](#上传视频元数据) 相同 + +**示例:** + +假设上上上一接口返回的 +`auth` 为 `ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0`, +`endpoint` 为 `//upos-cs-upcdntxa.bilivideo.com`, +`upos_uri` 为 `upos://ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz`, +`biz_id` 为 `500001630826789`. + +上上一接口返回的 +`upload_id` 为 `8130090a-16f7-4fe6-8a29-198f5abce913`. + +视频文件名为 `20240724-remove-linux-then-install.tar.xz`, 文件大小为 `278255704` 字节. + +假设您已经全部上传完毕, 共上传 `27` 个分块, 本次请求上传的的内容存放在 `body.json` 文件中. + +```shell +curl -X PUT --url "https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz" \ +--url-query "output=json" \ +--url-query "name=20240724-remove-linux-then-install.tar.xz" \ +--url-query "profile=ugcfx%2Fbup" \ +--url-query "uploadId=8130090a-16f7-4fe6-8a29-198f5abce913" \ +--url-query "biz_id=500001630826789" \ +-H "X-Upos-Auth: ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0" \ +-H "Content-Type: application/json" \ +--data-binary @body.json \ +-b "SESSDATA=xxxxxxxxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "OK": 1, + "location": "ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz", + "bucket": "ugcfx2lf", + "key": "/n240729ad7gxi43yaoml312h2nbt2pnf.xz" +} +``` + +</details> + +#### 下载已上传的视频文件 + +> URL 同 [上一个接口](#结束上传视频文件) + +*请求方式: GET* + +认证方式:请求头 `X-Upos-Auth` 为上上上上一接口得到的 `auth` + +注: 由于 `X-Upos-Auth` 有效期只有 5 天, 过期请求将返回 HTTP 403 如下 + +```http +HTTP/1.1 403 Forbidden +Bili-Trace-Id: 3e3f2db61366adbf +Server: upos@hcsgw@jscs-bvc-hcsgw-public-02 +X-Bili-Trace-Id: 0d8ca1af6d3510253e3f2db61366adbf +X-Upos-Auth: AUTH_TS_GT_5DAY AUTH=ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0 Now=1722662669 DURATION=449893 +Content-Length: 0 +Connection: keep-alive +Date: Sat, 03 Aug 2024 05:24:29 GMT +EO-LOG-UUID: 4296647794590631154 +EO-Cache-Status: MISS +``` + +**字节流回复:** + +视频文件字节流 + +**示例:** + +假设请求上一接口时的 URL 为 `https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz`, +请求头的 `X-Upos-Auth` 为 `ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0`, +您想要下载到运行目录下的 `file.tar.xz` 文件 + +```shell +curl -G "https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz" \ +-H "X-Upos-Auth: ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0" \ +--output file.tar.xz +``` + +<details> +<summary>查看检查示例:</summary> + +```text + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 265M 100 265M 0 0 9493k 0 0:00:28 0:00:28 --:--:-- 10.3M +$ sha512sum file.tar.xz +abfbedf1ac4f251c81103beb4d5406af1e0b64b9d54e99bfc77d2a8a9c4913a9fd2f1751828ace8aac036f6385609d99e251437b07a0491caca2ad7069a57003 file.tar.xz +$ sha512sum ~/Documents/video-proj/20240724-remove-linux-then-install.tar.xz +abfbedf1ac4f251c81103beb4d5406af1e0b64b9d54e99bfc77d2a8a9c4913a9fd2f1751828ace8aac036f6385609d99e251437b07a0491caca2ad7069a57003 /home/sess/Documents/video-proj/20240724-remove-linux-then-install.tar.xz +``` + +</details> + +### Demo + +#### Java + +注: 需要 Gson 依赖, Java 8+, 单线程上传, 无异常处理, 仅供参考 + +```java +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.StringJoiner; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; + +/** + * A demo class for uploading videos to Bilibili. + * + * @author SessX6cf + */ +public class BiliVideoUploader { + + private static String SESSDATA; + private static File VIDEO_FILE; + + public static void main(String[] args) throws IOException { + long ts = System.currentTimeMillis(); + if (args.length < 2) { + System.out.println("Usage: java BiliVideoUploader <video_file> <sessdata>"); + return; + } else { + VIDEO_FILE = new File(args[0]); + if (!VIDEO_FILE.isFile()) { + System.out.println("It is not a file!"); + return; + } else if (!VIDEO_FILE.canRead()) { + System.out.println("Cannot read the file!"); + return; + } else if (VIDEO_FILE.isDirectory()) { + System.out.println("You can play a directory?!"); + return; + } + SESSDATA = args[1]; + } + // step 1: preupload video + System.out.println("step 1: preupload video"); + JsonObject preuploadVideo = preuploadVideo(); + // step 2: post video meta + System.out.println("step 2: post video meta"); + JsonObject postVideoMeta = postVideoMeta(preuploadVideo); + // step 3: upload video + System.out.println("step 3: upload video"); + int chunks = uploadVideo(preuploadVideo, postVideoMeta); + // step 4: end upload + System.out.println("step 4: end upload"); + endupload(preuploadVideo, postVideoMeta, chunks); + // finished + System.out.println("finished (" + (System.currentTimeMillis() - ts) + "ms)"); + } + + private static String querypart(String key, String value) throws IOException { + return key + "=" + URLEncoder.encode(value, "UTF-8"); + } + + private static HttpURLConnection conn(String url, String method) throws IOException { + HttpURLConnection conn; + try { + conn = (HttpURLConnection) new URI(url).toURL().openConnection(); + } catch (java.net.URISyntaxException e) { + throw new IOException(e); + } + conn.setRequestMethod(method); + // conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"); + if (url.contains("bilibili.com")) conn.setRequestProperty("Cookie", "SESSDATA=" + SESSDATA); + return conn; + } + + private static byte[] inputStreamToString(HttpURLConnection conn) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + InputStream in; + in = conn.getInputStream(); + int b; + while ((b = in.read()) != -1) { + baos.write(b); + } + in.close(); + return baos.toByteArray(); + } + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + private static JsonObject preuploadVideo() throws IOException { + StringJoiner url = new StringJoiner("&", "https://member.bilibili.com/preupload?", ""); + url.add(querypart("name", VIDEO_FILE.getName())); + // url.add(querypart("size", String.valueOf(VIDEO_FILE.length()))); + url.add(querypart("r", "upos")); + url.add(querypart("profile", "ugcfx/bup")); + HttpURLConnection conn = conn(url.toString(), "GET"); + System.out.println("GET " + url.toString()); + String response = new String(inputStreamToString(conn), StandardCharsets.UTF_8); + try { + JsonObject json = GSON.fromJson(response, JsonObject.class); + System.out.println(GSON.toJson(json)); + return json; + } catch (JsonSyntaxException e) { + System.out.println(response); + throw e; + } + } + + private static JsonObject postVideoMeta(JsonObject preuploadVideo) throws IOException { + String schemeandhost = "https:" + preuploadVideo.get("endpoint").getAsString(); + String path = preuploadVideo.get("upos_uri").getAsString().replaceFirst("upos:/", ""); + StringJoiner url = new StringJoiner("&", schemeandhost + path + "?", ""); + url.add(querypart("uploads", "")); // WARNING: this is not a typo, it's required, or 404 + url.add(querypart("output", "json")); + url.add(querypart("profile", "ugcfx/bup")); + url.add(querypart("filesize", String.valueOf(VIDEO_FILE.length()))); + url.add(querypart("partsize", preuploadVideo.get("chunk_size").getAsString())); + url.add(querypart("biz_id", preuploadVideo.get("biz_id").getAsString())); + HttpURLConnection conn = conn(url.toString(), "POST"); + conn.setRequestProperty("X-Upos-Auth", preuploadVideo.get("auth").getAsString()); // 403 without it + System.out.println("POST " + url.toString()); + String response = new String(inputStreamToString(conn), StandardCharsets.UTF_8); + try { + JsonObject json = GSON.fromJson(response, JsonObject.class); + System.out.println(GSON.toJson(json)); + return json; + } catch (JsonSyntaxException e) { + System.out.println(response); + throw e; + } + } + + private static int uploadVideo(JsonObject preuploadVideo, JsonObject postVideoMeta) throws IOException { + long startts = System.currentTimeMillis() - 1; + String schemeandhost = "https:" + preuploadVideo.get("endpoint").getAsString(); + String path = preuploadVideo.get("upos_uri").getAsString().replaceFirst("upos:/", ""); + String urlp = schemeandhost + path + "?"; + long length = VIDEO_FILE.length(); + byte[] buffer = new byte[preuploadVideo.get("chunk_size").getAsInt()]; + int size = 0; + int chunks = (int) Math.ceil(length / (double) buffer.length); + InputStream in = new FileInputStream(VIDEO_FILE); + for (int chunk = 0; chunk < chunks; chunk++) { + System.out.println("speed: " + (chunk * buffer.length) / (System.currentTimeMillis() - startts) + "bytes/s"); + System.out.println("chunk: " + (chunk + 1) + "/" + chunks); + size = in.read(buffer, 0, buffer.length); + if (size == -1) { + break; + } + StringJoiner url = new StringJoiner("&", urlp, ""); + url.add(querypart("partNumber", String.valueOf(chunk + 1))); + url.add(querypart("uploadId", postVideoMeta.get("upload_id").getAsString())); + url.add(querypart("chunk", String.valueOf(chunk))); + url.add(querypart("chunks", String.valueOf(chunks))); + url.add(querypart("size", String.valueOf(size))); + url.add(querypart("start", String.valueOf(chunk * buffer.length))); + url.add(querypart("end", String.valueOf((chunk) * buffer.length + size))); + url.add(querypart("total", String.valueOf(length))); + HttpURLConnection conn = conn(url.toString(), "PUT"); + conn.setRequestProperty("X-Upos-Auth", preuploadVideo.get("auth").getAsString()); + conn.setRequestProperty("Content-Type", "application/octet-stream"); + conn.setRequestProperty("Content-Length", String.valueOf(size)); + conn.setDoOutput(true); + conn.getOutputStream().write(buffer, 0, size); + System.out.println("PUT " + url.toString()); + String response = new String(inputStreamToString(conn), StandardCharsets.UTF_8); + System.out.println(response); + } + in.close(); + return chunks; + } + + private static void endupload(JsonObject preuploadVideo, JsonObject postVideoMeta, int chunks) throws IOException { + String schemeandhost = "https:" + preuploadVideo.get("endpoint").getAsString(); + String path = preuploadVideo.get("upos_uri").getAsString().replaceFirst("upos:/", ""); + StringJoiner url = new StringJoiner("&", schemeandhost + path + "?", ""); + url.add(querypart("output", "json")); + url.add(querypart("name", VIDEO_FILE.getName())); + url.add(querypart("profile", "ugcfx/bup")); + url.add(querypart("uploadId", postVideoMeta.get("upload_id").getAsString())); + url.add(querypart("biz_id", preuploadVideo.get("biz_id").getAsString())); + JsonArray parts = new JsonArray(); + for (int i = 1; i <= chunks; i++) { + JsonObject part = new JsonObject(); + part.addProperty("partNumber", i); + part.addProperty("eTag", "etag"); + parts.add(part); + } + JsonObject body = new JsonObject(); + body.add("parts", parts); + HttpURLConnection conn = conn(url.toString(), "POST"); + conn.setRequestProperty("X-Upos-Auth", preuploadVideo.get("auth").getAsString()); + conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + conn.setDoOutput(true); + conn.getOutputStream().write(body.toString().getBytes(StandardCharsets.UTF_8)); + System.out.println("POST " + url.toString()); + String response = new String(inputStreamToString(conn), StandardCharsets.UTF_8); + try { + JsonObject json = GSON.fromJson(response, JsonObject.class); + System.out.println(GSON.toJson(json)); + } catch (JsonSyntaxException e) { + System.out.println(response); + throw e; + } + } + +} +``` diff --git a/docs/creativecenter/videos.md b/docs/creativecenter/videos.md new file mode 100644 index 0000000..6a800fd --- /dev/null +++ b/docs/creativecenter/videos.md @@ -0,0 +1,555 @@ +# 视频相关杂项 + +## 获取稿件列表 + +> https://member.bilibili.com/x2/creative/web/archives/sp + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +注: 该接口返回内容大多为无实际意义的空值, 具体内容建议通过常规接口获取 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | --------- | ----------- | ----------------- | +| pn | num | 页码 | 必要 | 默认为 1 | +| ps | num | 每页数量 | 必要 | 默认为 10, 留空为 100 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ------------ | ---- | +| class | null | 作用尚不明确 | | +| arc_audits | array | 稿件列表 | | +| page | obj | 分页信息 | | +| play_type | num | 1 | | + +`arc_audits` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| Archive | obj | 稿件信息 | | +| Videos | null | | | +| stat | obj | 稿件统计信息 | | +| state_panel | num | 0 | | +| parent_tname | str | 空 | | +| typename | str | 空 | | +| open_appeal | num | 0 | | +| activity | null | | | +| season_add_state | num | 是否可加入合集 | 0: 可以<br />1: 不可以 | + +`Archive` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| aid | num | av 号 | | +| bvid | str | bv 号 | | +| mid | num | 0 | | +| tid | num | 0 | | +| tp_info | null | | | +| title | str | 稿件标题 | | +| author | str | 空 | | +| cover | str | 封面图 | 位于 bfs 需要自行拼接 URL | +| reject_reason | str | 空 | | +| reject_reason_url | str | 空 | | +| tag | str | 空 | | +| duration | num | 0 | | +| copyright | num | 0 | | +| no_reprint | num | 0 | | +| ugcpay | num | 0 | | +| order_id | num | 0 | | +| order_name | str | 空 | | +| adorder_id | num | 0 | | +| adorder_name | str | 空 | | +| adorder_no | str | 空 | | +| online_time | num | 0 | | +| new_adorder_info | null | | | +| desc | str | 稿件简介 | | +| mission_id | num | 0 | | +| mission_name | str | 空 | | +| attribute | num | 0 | | +| state | num | 0 | | +| state_desc | str | 空 | | +| state_panel | num | 0 | | +| source | str | 空 | | +| desc_format_id | num | 0 | | +| attrs | null | | | +| porder | null | | | +| dynamic | str | 空 | | +| poi_object | null | | | +| dtime | num | 0 | | +| ptime | num | 0 | | +| ctime | num | 0 | | +| ugcpay_info | null | | | +| staffs | null | | | +| vote | null | | | +| activity | null | | | +| interactive | num | 0 | | +| hl | null | | | +| no_background | num | 0 | | +| dynamic_video | num | 0 | | +| no_public | num | 0 | | +| is_360 | num | 0 | | +| is_dolby | num | 0 | | +| lossless_music | num | 0 | | +| bs_editor | num | 0 | | +| up_from | num | 0 | | +| desc_v2 | null | | | +| dynamic_v2 | null | | | +| topic_id | num | 0 | | +| topic_name | str | 空 | | +| topic_stat | num | 0 | | +| premiere | num | 0 | | +| is_ugcpay_v2 | num | 0 | | +| recreate | null | | | +| charging_pay | num | 0 | | +| neutral_mark | str | 空 | | +| preview | null | | | +| upower_level | null | | | +| cover43 | str | 空 | | +| had_passed | bool | false | | +| is_staff | num | 0 | | +| is_pugv | num | 0 | | +| upower_mode | num | 0 | | +| upower_unit_price | num | 0 | | + +`stat` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| aid | num | av 号 | | +| view | num | 播放量 | | +| danmaku | num | 弹幕数 | | +| reply | num | 评论数 | | +| favorite | num | 收藏数 | | +| coin | num | 硬币数 | | +| share | num | 分享数 | | +| now_rank | num | 0 | 当前排名 | +| his_rank | num | 0 | 历史最高排名 | +| like | num | 点赞数 | | +| dislike | num | 点踩数 | 恒为 0 | +| vt | num | 0 | | +| vv | num | 播放量 | | + +**示例:** + +```shell +curl -G "https://member.bilibili.com/x2/creative/web/archives/sp" \ +--data-urlencode "pn=1" \ +--data-urlencode "ps=3" \ +-b "SESSDATA=xxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "class": null, + "arc_audits": [ + { + "Archive": { + "aid": 1906473802, + "bvid": "BV1MU411S7iJ", + "mid": 0, + "tid": 0, + "tp_info": null, + "title": "Linux小寄巧: 原地卸载内核然后尝试救活!", + "author": "", + "cover": "/bfs/archive/b76c0b574862f5a8e8eb133f5f33fcbcd602401a.jpg", + "reject_reason": "", + "reject_reason_url": "", + "tag": "", + "duration": 0, + "copyright": 0, + "no_reprint": 0, + "ugcpay": 0, + "order_id": 0, + "order_name": "", + "adorder_id": 0, + "adorder_name": "", + "adorder_no": "", + "online_time": 0, + "new_adorder_info": null, + "desc": "", + "mission_id": 0, + "mission_name": "", + "attribute": 0, + "state": 0, + "state_desc": "", + "state_panel": 0, + "source": "", + "desc_format_id": 0, + "attrs": null, + "porder": null, + "dynamic": "", + "poi_object": null, + "dtime": 0, + "ptime": 0, + "ctime": 0, + "ugcpay_info": null, + "staffs": null, + "vote": null, + "activity": null, + "interactive": 0, + "hl": null, + "no_background": 0, + "dynamic_video": 0, + "no_public": 0, + "is_360": 0, + "is_dolby": 0, + "lossless_music": 0, + "bs_editor": 0, + "up_from": 0, + "desc_v2": null, + "dynamic_v2": null, + "topic_id": 0, + "topic_name": "", + "topic_stat": 0, + "premiere": 0, + "is_ugcpay_v2": 0, + "recreate": null, + "political_media": 0, + "political_editable": 0, + "charging_pay": 0, + "neutral_mark": "", + "preview": null, + "upower_level": null, + "cover43": "", + "had_passed": false, + "is_staff": 0, + "is_pugv": 0, + "upower_mode": 0, + "upower_unit_price": 0 + }, + "Videos": null, + "stat": { + "aid": 1906473802, + "view": 4036, + "danmaku": 8, + "reply": 56, + "favorite": 53, + "coin": 12, + "share": 8, + "now_rank": 0, + "his_rank": 0, + "like": 99, + "dislike": 0, + "vt": 0, + "vv": 4036 + }, + "state_panel": 0, + "parent_tname": "", + "typename": "", + "open_appeal": 0, + "activity": null, + "season_add_state": 0 + }, + { + "Archive": { + "aid": 1956170305, + "bvid": "BV1Ay411i7Ph", + "mid": 0, + "tid": 0, + "tp_info": null, + "title": "十多年前的电脑运行Debian12的启动过程", + "author": "", + "cover": "/bfs/archive/0bff6624fdfcbf3326fba1837fef093d455c846a.jpg", + "reject_reason": "", + "reject_reason_url": "", + "tag": "", + "duration": 0, + "copyright": 0, + "no_reprint": 0, + "ugcpay": 0, + "order_id": 0, + "order_name": "", + "adorder_id": 0, + "adorder_name": "", + "adorder_no": "", + "online_time": 0, + "new_adorder_info": null, + "desc": "", + "mission_id": 0, + "mission_name": "", + "attribute": 0, + "state": 0, + "state_desc": "", + "state_panel": 0, + "source": "", + "desc_format_id": 0, + "attrs": null, + "porder": null, + "dynamic": "", + "poi_object": null, + "dtime": 0, + "ptime": 0, + "ctime": 0, + "ugcpay_info": null, + "staffs": null, + "vote": null, + "activity": null, + "interactive": 0, + "hl": null, + "no_background": 0, + "dynamic_video": 0, + "no_public": 0, + "is_360": 0, + "is_dolby": 0, + "lossless_music": 0, + "bs_editor": 0, + "up_from": 0, + "desc_v2": null, + "dynamic_v2": null, + "topic_id": 0, + "topic_name": "", + "topic_stat": 0, + "premiere": 0, + "is_ugcpay_v2": 0, + "recreate": null, + "political_media": 0, + "political_editable": 0, + "charging_pay": 0, + "neutral_mark": "", + "preview": null, + "upower_level": null, + "cover43": "", + "had_passed": false, + "is_staff": 0, + "is_pugv": 0, + "upower_mode": 0, + "upower_unit_price": 0 + }, + "Videos": null, + "stat": { + "aid": 1956170305, + "view": 2747, + "danmaku": 13, + "reply": 37, + "favorite": 11, + "coin": 14, + "share": 4, + "now_rank": 0, + "his_rank": 0, + "like": 42, + "dislike": 0, + "vt": 0, + "vv": 2747 + }, + "state_panel": 0, + "parent_tname": "", + "typename": "", + "open_appeal": 0, + "activity": null, + "season_add_state": 0 + }, + { + "Archive": { + "aid": 910326709, + "bvid": "BV1GM4y1a7Vn", + "mid": 0, + "tid": 0, + "tp_info": null, + "title": "Minecraft终末之诗,但是谷歌翻译20遍", + "author": "", + "cover": "/bfs/archive/09b7f2542f3e66973ec7de1a3c806cdd45b95426.jpg", + "reject_reason": "", + "reject_reason_url": "", + "tag": "", + "duration": 0, + "copyright": 0, + "no_reprint": 0, + "ugcpay": 0, + "order_id": 0, + "order_name": "", + "adorder_id": 0, + "adorder_name": "", + "adorder_no": "", + "online_time": 0, + "new_adorder_info": null, + "desc": "原内容来源:Minecraft Wiki\n使用的工具:Google Translate\n视频仅供娱乐,请勿当真", + "mission_id": 0, + "mission_name": "", + "attribute": 0, + "state": 0, + "state_desc": "", + "state_panel": 0, + "source": "", + "desc_format_id": 0, + "attrs": null, + "porder": null, + "dynamic": "", + "poi_object": null, + "dtime": 0, + "ptime": 0, + "ctime": 0, + "ugcpay_info": null, + "staffs": null, + "vote": null, + "activity": null, + "interactive": 0, + "hl": null, + "no_background": 0, + "dynamic_video": 0, + "no_public": 0, + "is_360": 0, + "is_dolby": 0, + "lossless_music": 0, + "bs_editor": 0, + "up_from": 0, + "desc_v2": null, + "dynamic_v2": null, + "topic_id": 0, + "topic_name": "", + "topic_stat": 0, + "premiere": 0, + "is_ugcpay_v2": 0, + "recreate": null, + "political_media": 0, + "political_editable": 0, + "charging_pay": 0, + "neutral_mark": "", + "preview": null, + "upower_level": null, + "cover43": "", + "had_passed": false, + "is_staff": 0, + "is_pugv": 0, + "upower_mode": 0, + "upower_unit_price": 0 + }, + "Videos": null, + "stat": { + "aid": 910326709, + "view": 533, + "danmaku": 6, + "reply": 4, + "favorite": 15, + "coin": 13, + "share": 4, + "now_rank": 0, + "his_rank": 0, + "like": 29, + "dislike": 0, + "vt": 0, + "vv": 533 + }, + "state_panel": 0, + "parent_tname": "", + "typename": "", + "open_appeal": 0, + "activity": null, + "season_add_state": 0 + } + ], + "page": { + "pn": 1, + "ps": 3, + "count": 32 + }, + "play_type": 1 + } +} +``` + +</details> + +## 视频基础信息 + +> https://member.bilibili.com/x/web/archive/videos + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---- | ---- | ---- | ---- | ---- | +| aid | num | av 号 | 必要 | | + +**JSON回复:** + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| archive | obj | 稿件信息 | | +| videos | array | 视频信息 | | + +`archive` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| aid | num | av 号 | | +| bvid | str | bvid | | +| title | str | 标题 | | + +`videos` 数组: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | -- | --- | +| cid | num | 分P cid | | +| index | num | 分P 序号 | | +| title | str | 分P 标题 | | +| duration | num | 0 | | + +**示例:** + +```shell +curl -G "https://member.bilibili.com/x/web/archive/videos" \ +--data-urlencode "aid=1906473802" \ +-b "SESSDATA=xxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "archive": { + "aid": 1906473802, + "bvid": "BV1MU411S7iJ", + "title": "Linux小寄巧: 原地卸载内核然后尝试救活!" + }, + "videos": [ + { + "cid": 1625992822, + "index": 1, + "title": "Linux小寄巧: 原地卸载内核然后尝试救活!", + "duration": 0 + } + ] + } +} +``` + +</details> diff --git a/docs/customerservice/msg.md b/docs/customerservice/msg.md new file mode 100644 index 0000000..06b5645 --- /dev/null +++ b/docs/customerservice/msg.md @@ -0,0 +1,115 @@ +# 客服消息 + +## 心跳 + +> https://customerservice.bilibili.com/x/custom/session_svr/v1/heart_beat + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| shop_id | num | 0 | 非必要 | | +| shop_father_id | num | 0 | 非必要 | | +| build | num | 客户端版本 | 非必要 | web: 0 | +| mobi_app | str | 客户端类型 | 非必要 | 如 `web` | + +**JSON回复:** + +|字段|类型|内容|备注| +|-|-|-|-| +|code|num|返回值|0: 成功| +|msg|str|`ok`|失败时不存在| +|message|str|错误信息|成功时为 `ok`| +|ttl|num|1|| + +**示例:** + +```shell +curl -G "https://customerservice.bilibili.com/x/custom/session_svr/v1/heart_beat" \ +-b "SESSDATA=xxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "msg": "ok", + "message": "ok", + "ttl": 1 +} +``` + +</details> + +## 上传文件 + +> https://customerservice.bilibili.com/x/custom/msg_svr/v1/upload + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +注: 上传的文件 15 分钟内有效, 过期后下载会返回 HTTP 403 + +**正文参数 (multipart/form-data):** + +|参数名|类型|内容|必要性|备注| +|-|-|-|-|-| +|file|file|文件内容|必要|| +|filename|str|文件名|必要|| +|mid|num|用户 mid|必要|| +|csrf|str|CSRF Token (位于 Cookie 中 bili_jct)|必要|| + +**JSON回复:** + +根对象: + +|字段|类型|内容|备注| +|-|-|-|-| +|code|num|返回值|0: 成功<br />1000011: 仅支持上传300M内的文件<br />1200201: 获取用户信息失败| +|message|str|错误信息|成功时为 `ok`| +|ttl|num|1|| +|data|obj|上传结果|| + +`data` 对象: + +|字段|类型|内容|备注| +|-|-|-|-| +|key|str|文件名|| +|url|str|文件 URL|注意转义| + +**示例:** + +上传文件 `./headers/xx-out.xcf`, 文件名 `ihavenoname` + +```shell +curl -X POST "https://customerservice.bilibili.com/x/custom/msg_svr/v1/upload" \ +-F 'file=@./headers/xx-out.xcf' \ +-F 'filename=ihavenoname' \ +-F 'mid=1070915568' \ +-F 'csrf=xxx' \ +-b 'SESSDATA=xxx; bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "ok", + "ttl": 1, + "data": { + "key": "1a0c88d240852155a111e4cc6893be39.xcf", + "url": "https://jssz-boss.hdslb.com/customer-video-upload/1a0c88d240852155a111e4cc6893be39.xcf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=f9TxwsagojnE1DWM%2F20240803%2Fjssz%2Fs3%2Faws4_request&X-Amz-Date=20240803T115447Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=cef962c8e503c6ff564fd485bdef1079df1b4a7e38f4fbd9c21a5667207f406e" + } +} +``` + +</details> diff --git a/danmaku/action.md b/docs/danmaku/action.md similarity index 71% rename from danmaku/action.md rename to docs/danmaku/action.md index e1d4757..95e34c4 100644 --- a/danmaku/action.md +++ b/docs/danmaku/action.md @@ -1,21 +1,8 @@ # 弹幕操作 -- [发送视频弹幕](#发送视频弹幕) -- [发送互动弹幕](#发送互动弹幕) -- [撤回弹幕](#撤回弹幕) -- [购买高级弹幕发送权限](#购买高级弹幕发送权限) -- [检测高级弹幕发送权限](#检测高级弹幕发送权限) -- [查询弹幕点赞数](#查询弹幕点赞数) -- [点赞弹幕](#点赞弹幕) -- [举报弹幕](#举报弹幕) -- [保护&删除弹幕](#保护&删除弹幕) -- [修改字幕池](#修改字幕池) - ---- - ## 发送视频弹幕 -> http://api.bilibili.com/x/v2/dm/post +> https://api.bilibili.com/x/v2/dm/post *请求方式:POST* @@ -25,23 +12,34 @@ `mode=6`的逆向弹幕与`mode=8`的代码弹幕不可发送 +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| web_location | str | 普通视频: 1315873 | 不必要 | | +| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | Cookie 方式必要 | | +| w_rid | str | Wbi 签名 | 必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | +| wts | str | UNIX 秒级时间戳 | 必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | + **正文参数( 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 />9:BAS弹幕(`pool`必须为2) | -| rnd | num | 当前时间戳*1000000 | 非必要 | **若无此项,则发送弹幕冷却时间限制为90s**<br />若有此项,则发送弹幕冷却时间限制为5s | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------- | ---- | ------------------------- | --------------- | ------------------------------------------------------------ | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| type | num | 弹幕类选择 | 必要 | 1:视频弹幕<br />2:漫画弹幕 | +| 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 />9:BAS弹幕(`pool`必须为2) | +| rnd | num | 当前时间戳*1000000 | 非必要 | **若无此项,则发送弹幕冷却时间限制为90s**<br />若有此项,则发送弹幕冷却时间限制为5s | +| colorful | num | 彩色弹幕 | 非必要 | 60001:专属渐变彩色(需要会员) | +| checkbox_type | num | 是否带 UP 身份标识 | 非必要 | 0:普通<br />4:带有标识 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | **json回复:** @@ -49,38 +47,48 @@ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<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 />36712:level 1用户发送弹幕的最大长度为20<br />36713:稿件未付费<br />36714:弹幕发送时间不合法<br />36715:当日操作数量超过上限 | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<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 />36712:level 1用户发送弹幕的最大长度为20<br />36713:稿件未付费<br />36714:弹幕发送时间不合法<br />36715:当日操作数量超过上限<br />36718:目前您不是大会员,无法使用会员权益 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | obj | 信息本体 | | `data`对象: -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ------------ | -| action | str | 空 | 作用尚不明确 | -| dmid | num | 弹幕dmid | | -| dmid_str | str | 弹幕dmid | 字串形式 | -| visible | bool | true | 作用尚不明确 | +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---------- | ------------------ | -------------------------------- | +| action | str | (?) | | +| animation | str | 弹幕样式 Json? | | +| colorful_src | str 或 obj | 渐变彩色样式信息? | 当请求参数`colorful=60001`时有效 | +| dm_content | str | (?) | | +| dmid | num | 弹幕 dmid | | +| dmid_str | str | 弹幕 dmid | 字串形式 | +| visible | bool | (?) | | + +`data`中的`colorful_src`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------------- | ---- | +| type | num | 60001 | | +| src | str | 渐变色样式 Json? | | **示例:** -为视频`av2`/`BV1xx411c7mD`(cid为`62131`)的5000ms位置发送一条弹幕`前来考古`(颜色为#FFFFFF,字号25,普通弹幕,游动弹幕) +为视频`av2`/`BV1xx411c7mD`(cid为`62131`)的 5000ms 位置发送一条弹幕`前来考古`(颜色为 #FFFFFF,字号 25,普通弹幕,游动弹幕) ```shell -curl 'http://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' +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> @@ -104,7 +112,7 @@ curl 'http://api.bilibili.com/x/v2/dm/post' \ ## 发送互动弹幕 -> http://api.bilibili.com/x/v2/dm/command/post +> https://api.bilibili.com/x/v2/dm/command/post *请求方式:POST* @@ -211,7 +219,7 @@ curl 'http://api.bilibili.com/x/v2/dm/post' \ 为视频`av201947622`(cid为`230709860`)的5000ms位置发送一条UP主头像弹幕`test` ```shell -curl 'http://api.bilibili.com/x/v2/dm/command/post' \ +curl 'https://api.bilibili.com/x/v2/dm/command/post' \ --data-urlencode 'type=1' \ --data-urlencode 'aid=201947622' \ --data-urlencode 'cid=230709860' \ @@ -248,7 +256,7 @@ curl 'http://api.bilibili.com/x/v2/dm/command/post' \ 为视频`av201947622`(cid为`230709860`)的5000ms位置发送一条发送关联视频弹幕`测试1234`关联视频为`BV1kz4y1X7XP` ```shell -curl 'http://api.bilibili.com/x/v2/dm/command/post' \ +curl 'https://api.bilibili.com/x/v2/dm/command/post' \ --data-urlencode 'type=2' \ --data-urlencode 'aid=201947622' \ --data-urlencode 'cid=230709860' \ @@ -287,7 +295,7 @@ curl 'http://api.bilibili.com/x/v2/dm/command/post' \ 为视频`av201947622`(cid为`230709860`)的5000ms位置发送视频内嵌引导关注按钮,X坐标为118,Y坐标为82,持续时间为5000ms ```shell -curl 'http://api.bilibili.com/x/v2/dm/command/post' \ +curl 'https://api.bilibili.com/x/v2/dm/command/post' \ --data-urlencode 'type=5' \ --data-urlencode 'aid=201947622' \ --data-urlencode 'cid=230709860' \ @@ -321,10 +329,88 @@ curl 'http://api.bilibili.com/x/v2/dm/command/post' \ </details> +## 发送打分弹幕 + +> https://api.bilibili.com/x/v2/dm/command/grade/post + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +<!--{ + "gh": [220] +}--> + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---- | ------ | ---- | +| aid | num | 稿件 aid | 必要 | | +| cid | num | 分 P cid | 必要 | | +| progress | num | 播放进度 | 必要 | 单位为毫秒 | +| grade_id | num | 打分 id | 必要 | | +| grade_score | num | 分数 | 偶数, 最大 10 | +| polaris_app_id | num | 100 | 不必要 | +| polaris_platfrom | num | 5 | 不必要 | | +| spmid | str | 333.788.0.0 | 不必要 | | +| from_spmid | str | 来源 spmid | 不必要 | | +| csrf | str | CSRF Token (即 Cookie 中的 bili_jct) | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| dmid | num | 弹幕dmid | | +| dmid_str | str | 弹幕dmid | 字串形式 | +| visible | bool | 是否可见 | | +| action | str | 动作 | `"grade:"` + (请求的分数 / 2) | + +**示例:** + +```shell +curl -X POST 'https://api.bilibili.com/x/v2/dm/command/grade/post' \ +--data-urlencode 'aid=112861976201494' \ +--data-urlencode 'cid=500001629877726' \ +--data-urlencode 'progress=32000' \ +--data-urlencode 'grade_id=3651137' \ +--data-urlencode 'grade_score=10' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "dmid": 1651556419721443584, + "dmidStr": "1651556419721443584", + "visible": true, + "action": "grade:5" + } +} +``` + +</details> ## 撤回弹幕 -> http://api.bilibili.com/x/dm/recall +> https://api.bilibili.com/x/dm/recall *请求方式:POST* @@ -356,7 +442,7 @@ curl 'http://api.bilibili.com/x/v2/dm/command/post' \ 撤回`cid=168901231`下的弹幕`32310301474947077`的弹幕 ```shell -curl 'http://api.bilibili.com/x/dm/recall' \ +curl 'https://api.bilibili.com/x/dm/recall' \ --data-urlencode 'cid=168901231' \ --data-urlencode 'dmid=32310301474947077' \ --data-urlencode 'csrf=xxx' \ @@ -377,7 +463,7 @@ curl 'http://api.bilibili.com/x/dm/recall' \ ## 购买高级弹幕发送权限 -> http://api.bilibili.com/x/dm/adv/buy +> https://api.bilibili.com/x/dm/adv/buy *请求方式:POST* @@ -409,7 +495,7 @@ curl 'http://api.bilibili.com/x/dm/recall' \ 购买视频cid为`168901231`的高级弹幕发送权限 ```shell -curl 'http://api.bilibili.com/x/dm/adv/buy' \ +curl 'https://api.bilibili.com/x/dm/adv/buy' \ --data-urlencode 'cid=168901231' \ --data-urlencode 'mode=sp' \ --data-urlencode 'csrf=xxx' \ @@ -430,7 +516,7 @@ curl 'http://api.bilibili.com/x/dm/adv/buy' \ ## 检测高级弹幕发送权限 -> http://api.bilibili.com/x/dm/adv/state +> https://api.bilibili.com/x/dm/adv/state *请求方式:GET* @@ -471,7 +557,7 @@ curl 'http://api.bilibili.com/x/dm/adv/buy' \ 当前状态为已购买且同意 ```shell -curl -G 'http://api.bilibili.com/x/dm/adv/state' \ +curl -G 'https://api.bilibili.com/x/dm/adv/state' \ --data-urlencode 'cid=168901231' \ --data-urlencode 'mode=sp' \ -b 'SESSDATA=xxx' @@ -496,129 +582,49 @@ curl -G 'http://api.bilibili.com/x/dm/adv/state' \ </details> -## 查询弹幕点赞数 - -> http://api.bilibili.com/x/v2/dm/thumbup/stats - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或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 'http://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> - ## 点赞弹幕 -> http://api.bilibili.com/x/v2/dm/thumbup/add +> https://api.bilibili.com/x/v2/dm/thumbup/add *请求方式:POST* 认证方式:Cookie(SESSDATA)或APP +查询指定弹幕点赞状态参阅文档 [弹幕点赞查询](thumbup.md) + **正文参数( 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方式必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------- | --------------- | ------------------------------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| dmid | num | 目标弹幕 dmid | 必要 | | +| oid | num | 目标弹幕所在视频 cid | 必要 | | +| op | num | 操作 | 必要 | 1:点赞<br />2:取消点赞 | +| platform | str | 平台标识 | 非必要 | web_player:web 播放器<br />android:安卓端 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | **json回复:** 根对象: -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />-400:请求错误<br />65004:取消赞失败 未点赞过<br />65006:已赞过 | -| message | str | 错误信息 | 默认为0 | -| tll | num | 1 | | +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|------------------------------------------------------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />-400:请求错误<br />36106:该弹幕已被删除<br/>36805:该视频禁止点赞弹幕<br/>65004:取消赞失败 未点赞过<br />65006:已赞过 | +| message | str | 错误信息 | 默认为0 | +| tll | num | 1 | | **示例** 为`cid=145928946`下的弹幕`35600074482384899`点赞 ```shell -curl 'http://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' +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> @@ -636,7 +642,7 @@ curl 'http://api.bilibili.com/x/v2/dm/thumbup/add' \ ## 举报弹幕 -> http://api.bilibili.com/x/dm/report/add +> https://api.bilibili.com/x/dm/report/add *请求方式:POST* @@ -685,7 +691,7 @@ curl 'http://api.bilibili.com/x/v2/dm/thumbup/add' \ 举报`cid=145928946`下的弹幕`35600074482384899`,理由是`引战` ```shell -curl 'http://api.bilibili.com/x/dm/report/add' \ +curl 'https://api.bilibili.com/x/dm/report/add' \ --data-urlencode 'cid=145928946' \ --data-urlencode 'dmid=35600074482384899' \ --data-urlencode 'reason=7' \ @@ -707,7 +713,7 @@ curl 'http://api.bilibili.com/x/dm/report/add' \ ## 保护&删除弹幕 -> http://api.bilibili.com/x/v2/dm/edit/state +> https://api.bilibili.com/x/v2/dm/edit/state *请求方式:POST* @@ -741,7 +747,7 @@ curl 'http://api.bilibili.com/x/dm/report/add' \ 删除`cid=145928946`下的弹幕`35600074482384899`、`39067304918515717`、`39082777041174531` ```shell -curl 'http://api.bilibili.com/x/v2/dm/edit/state' \ +curl 'https://api.bilibili.com/x/v2/dm/edit/state' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=145928946' \ --data-urlencode 'dmids=35600074482384899,39067304918515717,39082777041174531' \ @@ -765,7 +771,7 @@ curl 'http://api.bilibili.com/x/v2/dm/edit/state' \ ## 修改字幕池 -> http://api.bilibili.com/x/v2/dm/edit/pool +> https://api.bilibili.com/x/v2/dm/edit/pool *请求方式:POST* @@ -799,7 +805,7 @@ curl 'http://api.bilibili.com/x/v2/dm/edit/state' \ 将`cid=145928946`下的弹幕`35600074482384899`、`39067304918515717`、`39082777041174531`移入字幕池 ```shell -curl 'http://api.bilibili.com/x/v2/dm/edit/state' \ +curl 'https://api.bilibili.com/x/v2/dm/edit/state' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=145928946' \ --data-urlencode 'pool=1' \ diff --git a/danmaku/buzzword.md b/docs/danmaku/buzzword.md similarity index 98% rename from danmaku/buzzword.md rename to docs/danmaku/buzzword.md index 98338c9..5f65356 100644 --- a/danmaku/buzzword.md +++ b/docs/danmaku/buzzword.md @@ -6,14 +6,9 @@ 可使用页面 https://www.bilibili.com/blackboard/activity-WroMZNunfa.html?id=1 查看名词解释详情 -- [拉取名词解释列表](#拉取名词解释列表) -- [查询名词解释详情](#查询名词解释详情) - ---- - ## 拉取名词解释列表 -> http://api.bilibili.com/x/v2/dm/buzzword/list +> https://api.bilibili.com/x/v2/dm/buzzword/list *请求方式:GET* @@ -91,7 +86,7 @@ 拉取对应`哔哩哔哩热词图鉴`的名词列表,以20项为一页拉取第1页 ```bash -curl -G 'http://api.bilibili.com/x/v2/dm/buzzword/list' \ +curl -G 'https://api.bilibili.com/x/v2/dm/buzzword/list' \ --data-urlencode 'type_id=4' \ --data-urlencode 'ps=10' \ --data-urlencode 'pn=1' @@ -241,7 +236,7 @@ curl -G 'http://api.bilibili.com/x/v2/dm/buzzword/list' \ ## 查询名词解释详情 -> http://api.bilibili.com/x/v2/dm/buzzword/detail +> https://api.bilibili.com/x/v2/dm/buzzword/detail *请求方式:GET* @@ -419,7 +414,7 @@ curl -G 'http://api.bilibili.com/x/v2/dm/buzzword/list' \ 查询名词`kksk`的详情 ```bash -curl -G 'http://api.bilibili.com/x/v2/dm/buzzword/detail' \ +curl -G 'https://api.bilibili.com/x/v2/dm/buzzword/detail' \ --data-urlencode 'id=1' ``` diff --git a/danmaku/config.md b/docs/danmaku/config.md similarity index 96% rename from danmaku/config.md rename to docs/danmaku/config.md index 4e5dbc3..9cd760f 100644 --- a/danmaku/config.md +++ b/docs/danmaku/config.md @@ -1,12 +1,8 @@ # 弹幕个人配置修改 -- [修改弹幕个人配置(web端)](#修改弹幕个人配置(web端)) - ---- - ## 修改弹幕个人配置(web端) -> http://api.bilibili.com/x/v2/dm/web/config +> https://api.bilibili.com/x/v2/dm/web/config *请求方式:POST* @@ -55,7 +51,7 @@ 关闭弹幕 ```shell -curl 'http://api.bilibili.com/x/v2/dm/web/config' \ +curl 'https://api.bilibili.com/x/v2/dm/web/config' \ --data-urlencode 'dm_switch=false' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' diff --git a/docs/danmaku/danmaku_proto.md b/docs/danmaku/danmaku_proto.md new file mode 100644 index 0000000..b21bd32 --- /dev/null +++ b/docs/danmaku/danmaku_proto.md @@ -0,0 +1,115 @@ +# protobuf弹幕 + +2020年5月23日,哔哩哔哩网页端及移动端启用了新的默认弹幕 API,网页端弹幕显示的上限变为原弹幕池上限的两倍。 + +新的 API 是以 6min 为一个单位加载,即每次加载 6min 内的弹幕 + +## 获取实时弹幕 + +> https://api.bilibili.com/x/v2/dm/web/seg.so (web端) +> +> https://api.bilibili.com/x/v2/dm/wbi/web/seg.so (web 端新接口,需要 wbi 认证) +> +> https://api.bilibili.com/x/v2/dm/list/seg.so (APP端) +> +> https://i0.hdslb.com/bfs/dm/{data}.bin (BAS/代码弹幕专包) + +*请求方式:GET* +*认证方式:半匿名(部分视频在无 Cookie: SESSDATA 时只返回部分弹幕)* + +此接口与漫画弹幕相同 + +只能返回普通弹幕(`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:视频弹幕<br />2:漫画弹幕 | +| oid | num | 视频 cid | 必要 | | +| pid | num | 稿件 avid | 非必要 | | +| segment_index | num | 分包 | 必要 | 6min 一包 | +| pull_mode | num | (?) | 非必要 | | +| ps | num | (?) | 非必要 | | +| pe | num | (?) | 非必要 | | + +**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 />9:BAS 弹幕(仅限于特殊弹幕专包) | +| 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 />唯一 可用于操作参数 | +| attr | int32 | 弹幕属性位 | bit0:保护<br />bit1:直播<br />bit2:高赞 | +| animation | string | 动画? | | + +**示例:** + +获取视频`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 +``` + diff --git a/danmaku/danmaku_view_proto.md b/docs/danmaku/danmaku_view_proto.md similarity index 92% rename from danmaku/danmaku_view_proto.md rename to docs/danmaku/danmaku_view_proto.md index 03624f0..4c761e3 100644 --- a/danmaku/danmaku_view_proto.md +++ b/docs/danmaku/danmaku_view_proto.md @@ -4,22 +4,12 @@ 详情见: -[【客户端更新】6.10版本更新!UP主支持发布关联视频弹幕]( https://www.bilibili.com/read/cv7728299 ) - - [引导关注卡片](https://www.bilibili.com/blackboard/activity-c8a0iDRQy.html ) - ---- - -- [获取弹幕个人配置与互动弹幕及BAS(代码)弹幕专包(web端)](#获取弹幕个人配置与互动弹幕及BAS(代码)弹幕专包(web端)) -- [实例](#实例) - - [获取互动弹幕](#获取互动弹幕) - - [获取BAS(代码)弹幕专包](#获取BAS(代码)弹幕专包) - ---- +- [【客户端更新】6.10版本更新!UP主支持发布关联视频弹幕]( https://www.bilibili.com/read/cv7728299 ) +- [引导关注卡片](https://www.bilibili.com/blackboard/activity-c8a0iDRQy.html ) ## 获取弹幕个人配置与互动弹幕及BAS(代码)弹幕专包(web端) -> http://api.bilibili.com/x/v2/dm/web/view +> https://api.bilibili.com/x/v2/dm/web/view *请求方式:GET* @@ -105,7 +95,7 @@ | posX | num | X坐标 | 区间:[118-549] | | posY | num | Y坐标 | 区间:[82-293] | | icon | str | 按钮图片url | 不应该是关注按钮吗,但这个是圆形的 | -| type | num | 关注按钮类型 | 0:仅关注<br />1:仅三联<br />2:关注+三联 | +| type | num | 关注按钮类型 | 0:仅关注<br />1:仅三连<br />2:关注+三连 | 消息`dmSetting`: @@ -209,7 +199,7 @@ message DmWebViewReply { 获取视频`av797164471(cid=236871317)`的弹幕元数据 ```shell -curl -G 'http://api.bilibili.com/x/v2/dm/web/view' \ +curl -G 'https://api.bilibili.com/x/v2/dm/web/view' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=236871317' \ --data-urlencode 'pid=797164471' \ @@ -231,7 +221,7 @@ import requests AVID = 797164471 CID = 236871317 -url = f'http://api.bilibili.com/x/v2/dm/web/view?type=1&oid={CID}&pid={AVID}' +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() @@ -261,7 +251,7 @@ for i in target.commandDms: ---弹幕指令=#UP# ---弹幕文字=这个视频没有恰饭!别紧张! ---弹幕出现时间=157818 ----弹幕负载数据={"icon":"http://i1.hdslb.com/bfs/face/559abe31f561f71f3106d8ee7b2065cac50c1235.jpg"} +---弹幕负载数据={"icon":"https://i1.hdslb.com/bfs/face/559abe31f561f71f3106d8ee7b2065cac50c1235.jpg"} ---弹幕ID(字串)=38469676112019463 ``` @@ -277,7 +267,7 @@ import requests AVID = 2 CID = 62131 -url = f'http://api.bilibili.com/x/v2/dm/web/view?type=1&oid={CID}&pid={AVID}' +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() @@ -292,7 +282,7 @@ for i in target.specialDms: ``` 特殊弹幕包数=1 -特殊弹幕包url=http://i0.hdslb.com/bfs/dm/b0d5f08c12be59292aa0d4e09b6dd8e54c2ba886.bin +特殊弹幕包url=https://i0.hdslb.com/bfs/dm/b0d5f08c12be59292aa0d4e09b6dd8e54c2ba886.bin ``` 使用[普通分段包弹幕](danmaku_proto.md#获取实时弹幕)的proto结构体反序列化此bin数据 diff --git a/danmaku/danmaku_xml.md b/docs/danmaku/danmaku_xml.md similarity index 65% rename from danmaku/danmaku_xml.md rename to docs/danmaku/danmaku_xml.md index 412a6d4..a5ea9ca 100644 --- a/danmaku/danmaku_xml.md +++ b/docs/danmaku/danmaku_xml.md @@ -2,17 +2,9 @@ 实时弹幕池容量有限(根据视频类型500-8000条不等),占满后再发送会使实时弹幕池底部的弹幕压入历史弹幕池(类似于堆栈) ---- - -- [获取实时弹幕1](#获取实时弹幕1) -- [获取实时弹幕2](#获取实时弹幕2) -- [弹幕格式](#弹幕格式) - ---- - ## 获取实时弹幕1 -> http://api.bilibili.com/x/v1/dm/list.so +> https://api.bilibili.com/x/v1/dm/list.so *请求方式:GET* @@ -27,14 +19,14 @@ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/v1/dm/list.so' \ +curl -G 'https://api.bilibili.com/x/v1/dm/list.so' \ --data-urlencode 'oid=144541892' \ --compressed -o 'danmaku.xml' ``` ## 获取实时弹幕2 -> http://comment.bilibili.com/{cid}.xml +> https://comment.bilibili.com/{cid}.xml *请求方式:GET* @@ -51,7 +43,7 @@ curl -G 'http://api.bilibili.com/x/v1/dm/list.so' \ **示例:** ```shell -curl 'http://comment.bilibili.com/144541892.xml' +curl 'https://comment.bilibili.com/144541892.xml' --compressed -o 'danmaku.xml' ``` @@ -118,7 +110,7 @@ curl 'http://comment.bilibili.com/144541892.xml' | 2 | 弹幕字号 | int32 | 18:小<br />25:标准<br />36:大 | | 3 | 弹幕颜色 | int32 | 十进制RGB888值 | | 4 | 弹幕发送时间 | int32 | 时间戳 | -| 5 | 弹幕池类型 | int32 | 0:普通池<br />1:字幕池<br />2:特殊池(代码/BAS弹幕) | +| 5 | 弹幕池类型 | int32 | 0: 普通池<br />1: 字幕池<br />2: 特殊池 (代码/BAS弹幕)<br />3: 互动池?| | 6 | 发送者mid的HASH | string | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户id | | 7 | 弹幕dmid | int64 | 唯一 可用于操作参数 | | 8 | 弹幕的屏蔽等级 | int32 | 0-10,低于用户设定等级的弹幕将被屏蔽<br />(新增,下方样例未包含) | @@ -135,19 +127,19 @@ curl 'http://comment.bilibili.com/144541892.xml' 弹幕的颜色属性使用**十进制RGB888**值 -| 颜色 | HEX(RGB888) | DEC(RGB888) | -| --------------------------------- | ----------------------------------- | ------------------------------------- | -| <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> | +| 颜色 | HEX(RGB888) | DEC(RGB888) | +| -------------------------------------- | ----------------------------------------- | ------------------------------------------- | +| <font v-pre color="#FE0302">红色</font> | <font v-pre color="#FE0302">FE0302</font> | <font v-pre color="#FE0302">16646914‬</font> | +| <font v-pre color="#FF7204">橘红</font> | <font v-pre color="#FF7204">FF7204</font> | <font v-pre color="#FF7204">16740868</font> | +| <font v-pre color="#FFAA02">橘黄</font> | <font v-pre color="#FFAA02">FFAA02</font> | <font v-pre color="#FFAA02">16755202</font> | +| <font v-pre color="#FFD302">淡黄</font> | <font v-pre color="#FFD302">FFD302</font> | <font v-pre color="#FFD302">16765698</font> | +| <font v-pre color="#FFFF00">黄色</font> | <font v-pre color="#FFFF00">FFFF00</font> | <font v-pre color="#FFFF00">16776960</font> | +| <font v-pre color="#A0EE00">草绿</font> | <font v-pre color="#A0EE00">A0EE00</font> | <font v-pre color="#A0EE00">10546688</font> | +| <font v-pre color="#00CD00">绿色</font> | <font v-pre color="#00CD00">00CD00</font> | <font v-pre color="#00CD00">52480</font> | +| <font v-pre color="#019899">墨绿</font> | <font v-pre color="#019899">019899</font> | <font v-pre color="#019899">104601</font> | +| <font v-pre color="#4266BE">紫色</font> | <font v-pre color="#4266BE">4266BE</font> | <font v-pre color="#4266BE">4351678</font> | +| <font v-pre color="#89D5FF">青色</font> | <font v-pre color="#89D5FF">89D5FF</font> | <font v-pre color="#89D5FF">9022215</font> | +| <font v-pre color="#CC0273">品红</font> | <font v-pre color="#CC0273">CC0273</font> | <font v-pre color="#CC0273">13369971</font> | +| <font v-pre color="#222222">黑色</font> | <font v-pre color="#222222">222222</font> | <font v-pre color="#222222">2236962</font> | +| <font v-pre color="#9B9B9B">灰色</font> | <font v-pre color="#9B9B9B">9B9B9B</font> | <font v-pre color="#9B9B9B">10197915</font> | +| <font v-pre color="#FFFFFF">白色</font> | <font v-pre color="#FFFFFF">FFFFFF</font> | <font v-pre color="#FFFFFF">16777215</font> | diff --git a/danmaku/history.md b/docs/danmaku/history.md similarity index 91% rename from danmaku/history.md rename to docs/danmaku/history.md index b69fb6a..a20f15a 100644 --- a/danmaku/history.md +++ b/docs/danmaku/history.md @@ -2,15 +2,9 @@ **注:历史弹幕的xml接口已经失效,现已改为protobuf接口** -- [查询历史弹幕日期](#查询历史弹幕日期) -- [获取历史弹幕protobuf接口](#获取历史弹幕protobuf接口) -- [~~获取历史弹幕xml接口~~](#获取历史弹幕xml接口) - ---- - ## 查询历史弹幕日期 -> http://api.bilibili.com/x/v2/dm/history/index +> https://api.bilibili.com/x/v2/dm/history/index *请求方式:GET* @@ -50,7 +44,7 @@ 查询了cid为144541892的视频位于2020年1月中有历史弹幕记录的日期 ```shell -curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \ +curl -G 'https://api.bilibili.com/x/v2/dm/history/index' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=144541892' \ --data-urlencode 'month=2020-01' \ @@ -86,7 +80,7 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \ 返回结果的 `data` 项说明这些日期有弹幕发送。若查询的月份中视频无弹幕,则 `data` 项为 `null` ```shell -curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \ +curl -G 'https://api.bilibili.com/x/v2/dm/history/index' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=144541892' \ --data-urlencode 'month=2019-12' \ @@ -109,7 +103,7 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \ ## 获取历史弹幕protobuf接口 -> http://api.bilibili.com/x/v2/dm/web/history/seg.so +> https://api.bilibili.com/x/v2/dm/web/history/seg.so *请求方式:GET* @@ -125,7 +119,7 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \ **proto回复:** -porto定义见:[bilibili.community.service.dm.v1.DmSegMobileReply](../grpc_api/bilibili/community/service/dm/v1.proto) +porto定义见:[bilibili.community.service.dm.v1.DmSegMobileReply](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/grpc_api/bilibili/community/service/dm/v1/dm.proto) 详细说明见[protobuf弹幕](danmaku_proto.md) @@ -138,7 +132,7 @@ import requests import google.protobuf.text_format as text_format import bilibili.community.service.dm.v1_pb2 as Danmaku -url = 'http://api.bilibili.com/x/v2/dm/web/history/seg.so' +url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so' params = { 'type':1, #弹幕类型 'oid':144541892, #cid @@ -175,7 +169,7 @@ idStr: "27532611677585408" <details> <summary>查看折叠内容:</summary> -> http://api.bilibili.com/x/v2/dm/history +> https://api.bilibili.com/x/v2/dm/history *请求方式:GET* @@ -200,7 +194,7 @@ idStr: "27532611677585408" 获取视频`av84271171(cid=144541892)`2020-01-21的历史弹幕 ```shell -curl -G 'http://api.bilibili.com/x/v2/dm/history' \ +curl -G 'https://api.bilibili.com/x/v2/dm/history' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=144541892' \ --data-urlencode 'date=2020-01-21' \ @@ -243,4 +237,4 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history' \ </details> -</details> \ No newline at end of file +</details> diff --git a/danmaku/snapshot.md b/docs/danmaku/snapshot.md similarity index 92% rename from danmaku/snapshot.md rename to docs/danmaku/snapshot.md index c1d88b0..69f098b 100644 --- a/danmaku/snapshot.md +++ b/docs/danmaku/snapshot.md @@ -1,12 +1,8 @@ # 弹幕快照 -- [获取弹幕快照](#获取弹幕快照) - ---- - ## 获取弹幕快照 -> http://api.bilibili.com/x/v2/dm/ajax +> https://api.bilibili.com/x/v2/dm/ajax *请求方式:GET* @@ -45,14 +41,14 @@ avid方式: ```shell -curl -G 'http://api.bilibili.com/x/v2/dm/ajax' \ +curl -G 'https://api.bilibili.com/x/v2/dm/ajax' \ --data-urlencode 'aid=43337021' ``` bvid方式: ```shell -curl -G 'http://api.bilibili.com/x/v2/dm/ajax' \ +curl -G 'https://api.bilibili.com/x/v2/dm/ajax' \ --data-urlencode 'aid=BV1rb411m7gE' ``` diff --git a/docs/danmaku/thumbup.md b/docs/danmaku/thumbup.md new file mode 100644 index 0000000..0d59ff9 --- /dev/null +++ b/docs/danmaku/thumbup.md @@ -0,0 +1,104 @@ +# 弹幕点赞查询 + +## 查询指定dmid的点赞数 + +> https://api.bilibili.com/x/v2/dm/thumbup/stats + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------------- | ------ | --------------------- | +| oid | num | 视频 cid | 必要 | | +| ids | nums | 欲查询的弹幕 dmid | 必要 | 多个 id 之间用`,`分隔 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------------------------- | --------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 弹幕 id 与之对应数据的 Map | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------------------------- | ---- | +| {弹幕 dmid} | obj | {弹幕 dmid} 对应的点赞信息 | | + +`{弹幕 dmid}`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------------- | ---- | ---------------------- | ------------------------------------------------------- | +| likes | num | 对应弹幕所获得的点赞数 | | +| user_like | num | 当前用户是否点赞 | 0:未点赞<br />1:已点赞<br />需要登录(Cookie 或 APP) | +| id_str | str | 弹幕 dmid 字符串形式 | | +| show_threshold | num | (?) | | +| reply_count | num | (?) | | +| gray_release_control | obj | (?) | | + +`gray_release_control`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------ | ---- | +| show_dm_reply | bool | (?) | | + +**示例:** + +获取视频 BV1AP411d7Qa 1P(cid=1131648710)下的几个弹幕 dmid`1318231376180646144,1318231518484950784,1318231736680887808` + +```bash +curl -G 'https://api.bilibili.com/x/v2/dm/thumbup/stats' \ + --data-urlencode 'oid=1131648710' \ + --data-urlencode 'ids=1318231376180646144,1318231518484950784,1318231736680887808' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "1318231376180646144": { + "likes": 0, + "user_like": 0, + "id_str": "1318231376180646144", + "show_threshold": 10, + "reply_count": 0, + "gray_release_control": { + "show_dm_reply": false + } + }, + "1318231518484950784": { + "likes": 0, + "user_like": 0, + "id_str": "1318231518484950784", + "show_threshold": 10, + "reply_count": 0, + "gray_release_control": { + "show_dm_reply": false + } + }, + "1318231736680887808": { + "likes": 0, + "user_like": 0, + "id_str": "1318231736680887808", + "show_threshold": 10, + "reply_count": 0, + "gray_release_control": { + "show_dm_reply": false + } + } + } +} +``` + +</details> diff --git a/docs/danmaku/webmask.md b/docs/danmaku/webmask.md new file mode 100644 index 0000000..ab0fff8 --- /dev/null +++ b/docs/danmaku/webmask.md @@ -0,0 +1,80 @@ +# 智能防挡弹幕 + +B 站部分视频提供“智能防挡弹幕”功能,其原理是提供了一个 webmask 二进制文件,其中保存了视频中各个位置的 svg 格式蒙版。 + +首先需要获取 webmask 资源的地址。 + +## 获取 webmask 资源地址 + +通过 [web 播放器资源接口](../video/player.md) 获取 webmask 二进制文件的地址。 + + +## webmask 资源 + +获取的 url 没有权鉴,不需要后面的参数也可以获取。 + +示例: + +```shell +curl -G https://upos-sz-staticcos-cmask.bilivideo.com/cmaskboss/825851971_30_0.webmask >> 825851971_30_0.webmask +``` + +下载后是二进制文件。 + + +## webmask 二进制读取 + +参考:[andrewvy/webmask-renderer](https://github.com/andrewvy/webmask-renderer) + +name | offset | length | type | desc +--- | ------ | ------ | ---- | ---- +mask | 0 | 4 | char | 'MASK' 文件头 +version| 4 | 4 | int | 是1 +vU | 8 | 4 | ? | 不知道是干什么的 +Ly | 12 | 4 | int | 后续数据的段数 +time_1 | 16 | 8 | long | 第一段对应视频开始时间 +offset_1 | 24 | 8 | long | 第一段蒙版信息开始处对应二进制偏移 +...|...|...|...|... +time_{Ly} |16+(Ly-1)*16| 8 | long | 第 `Ly` 段对应视频开始时间 +offset_{Ly} |24+(Ly-1)*16| 8 | long | 第 `Ly` 段蒙版信息开始处对应二进制偏移 +segments_1| 由前面offset_1提供 | 由 `offset_2-offset_1` 计算得到 | binary | 蒙版信息块,使用 gzip 压缩 +...|...|...|...|... + + +蒙版信息块是经过 gzip 压缩文本得到的二进制。解压缩后得到一个字节串。 + +前 16 字节是两个 long,记为 `left` 和 `right`,暂时不清楚其作用。`left` 似乎和平均每张蒙版的时间有关。`right` 总是 `i*10000`,`i` 是从 0 开始数的数据段次序。 + +后面是各个 svg 文本直接拼起来,可以直接通过 svg 格式头 `data:image/svg+xml;base64,` 分开。 + + +Python 示例: +```python +from struct import unpack +import gzip + +f = open('你的 webmask', 'rb') +buf = f.read() +_Ly = buf[12:16] +Ly = unpack('>i', _Ly)[0] # 大端序 int + +times = [] +offsets = [] +for idx in range(Ly): + op = 16 + idx * 16 # 个人习惯,我算偏移时喜欢用 `op` 和 `ed` 作为开始和结束的名字。 + time = unpack('>q', buf[op: op+8])[0] + offset = unpack('>q', buf[op+8: op+16])[0] + times.append(time) + offsets.append(offset) + +frames = [] +for idx in range(Ly): + op = offsets[idx] + if idx == Ly - 1: ed = len(buf) + else: ed = offsets[idx+1] + ba = buf[op: ed] + bad = gzip.decompress(ba) + badl = bad.split(b'data:image/svg+xml;base64,') + # badl[0]是16字节,`left` 和 `right` + frames.append(badl[1: ]) +``` diff --git a/docs/dynamic/action.md b/docs/dynamic/action.md new file mode 100644 index 0000000..66cfff1 --- /dev/null +++ b/docs/dynamic/action.md @@ -0,0 +1,113 @@ +# 动态操作 + +## 删除动态 + +> <https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(multipart/form-data):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------ | ------ | ---- | +| dynamic_id | num | 动态id | 必要 | | +| csrf_token | str | csrf | 必要 | | +| csrf | str | csrf | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------------------------------------------------------------------- | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />500404:已经删除过该动态<br />500406:动态不是自己的 | +| msg | str | 错误信息 | 成功时为空文本 | +| message | str | 错误信息 | 同`msg` | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ---- | ---------------- | +| \_gt\_ | num | 0 | **作用尚不明确** | + +**示例:** + +删除动态`dynamic_id=588320531406678918` + +```shell +curl 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic' \ + --data-urlencode 'dynamic_id=588320531406678918' \ + --data-urlencode 'csrf_token=xxx' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "msg": "", + "message": "", + "data": { + "_gt_": 0 + } +} +``` + +</details> + +## 删除定时发布动态 + +> <https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/rm_draft> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(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 | 数据本体 | 空对象,即`{}` | + +**示例:** + +删除定时发布动态`draft_id=755409289278914611` + +```shell +curl 'https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/rm_draft' \ + --data-urlencode 'draft_id=755409289278914611' \ + --data-urlencode 'csrf=xxxx' + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": {} +} +``` + +</details> diff --git a/docs/dynamic/all.md b/docs/dynamic/all.md new file mode 100644 index 0000000..c0d700e --- /dev/null +++ b/docs/dynamic/all.md @@ -0,0 +1,7949 @@ +# 获取动态列表 + +## 获取全部动态列表 + +> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 必要性 | 内容 | 备注 | +| --- | --- | --- | --- | --- | +| timezone_offset | str | 非必要 | `-480` | 新版无 | +| type | str | 非必要 | 分类 | 新版无, `all`:全部(默认)<br/>`video`:视频投稿<br/>`pgc`:追番追剧<br/>`article`:专栏 | +| host_mid | num | 非必要 | UP主UID | 仅新版, 如 `293793435` | +| offset | num | 非必要 | 分页偏移量 | 默认为空, 翻页时使用 | +| update_baseline | str | 非必要 | 更新基线 | 获取新动态时使用 | +| page | num | 非必要 | 页数 | 无效参数 | +| platform | str | 非必要 | 平台 | 仅新版, 如 `web` | +| features | str | 非必要 | 功能开关? | 旧版 `itemOpusStyle,listOnlyfans`<br />新版 `itemOpusStyle,listOnlyfans,opusBigCover,onlyfansVote,decorationCard,onlyfansAssetsV2,forwardListHidden,ugcDelete` | +| web_location | str | 非必要 | 333.1365 | 仅新版存在 | + +**JSON回复:** + +根: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 响应码 | 0:成功<br/>-101:账号未登录 | +| message | str | | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| has_more | bool | 是否有更多数据 | | +| items | array | 数据数组 | | +| offset | str | 偏移量 | 等于`items`中最后一条记录的id<br/>获取下一页时使用 | +| update_baseline | str | 更新基线 | 等于`items`中第一条记录的id | +| update_num | num | 本次获取获取到了多少条新动态 | 在更新基线以上的动态条数 | + +`data.items[n]`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| basic | obj | | | +| id_str | str | 动态id | | +| modules | obj | 动态信息 | | +| type | str | 动态类型 | [动态类型](./dynamic_enum.md#动态类型) | +| visible | bool | 是否显示 | `true`:正常显示<br/>`false`:折叠动态 | +| orig | obj | 原动态信息 | 仅动态类型为`DYNAMIC_TYPE_FORWARD`的情况下存在 | + +`data.items[n].basic`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| comment_id_str | str | 见 [动态类型](./dynamic_enum.md#动态类型) | +| comment_type | num | | 见 [动态类型](./dynamic_enum.md#动态类型) | +| like_icon | obj | | 见下 | +| rid_str | str | | 见 [动态类型](./dynamic_enum.md#动态类型) | + +`data.items[n].basic.like_icon`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| action_url | str | `空串` | | +| end_url | str | `空串` | | +| id | num | `0` | | +| start_url | str | `空串` | | + +`data.items[n].modules`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| module_author | obj | UP主信息 | | +| module_dynamic | obj | 动态内容信息 | | +| module_more | obj | 动态右上角三点菜单 | | +| module_stat | obj | 动态统计数据 | | +| module_interaction | obj | 热度评论 | | +| module_fold | obj | 动态折叠信息 | | +| module_dispute | obj | 争议小黄条 | | +| module_tag | obj | 置顶信息 | | + +`data.items[n].modules.module_author`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| avater | obj | 头像信息 | 主要用于网页渲染, 若感兴趣可参考 [图片格式化](../misc/picture.md) | +| face | str | 头像 URL | | +| face_nft | bool | 是否为NFT头像 | | +| following | bool | 是否关注此UP主 | 自己的动态为`null` | +| jump_url | str | 跳转链接 | | +| label | str | 名称前标签 | `合集`<br/>`电视剧`<br/>`番剧` | +| mid | num | UP主UID<br/>剧集SeasonId | | +| name | str | UP主名称<br/>剧集名称<br/>合集名称 | | +| official_verify | obj | UP主认证信息 | | +| pendant | obj | UP主头像框 | | +| pub_action | str | 更新动作描述 | `投稿了视频`<br/>`直播了`<br/>`投稿了文章`<br/>`更新了合集`<br/>`与他人联合创作`<br/>`发布了动态视频`<br/>`投稿了直播回放` | +| pub_location_text | str | 空 | | +| pub_time | str | 更新时间 | `x分钟前`<br/>`x小时前`<br/>`昨天` | +| pub_ts | num | 更新时间戳 | UNIX 秒级时间戳 | +| type | str | 作者类型 | [作者类型](./dynamic_enum.md#作者类型) | +| vip | obj | UP主大会员信息 | | +| decorate | obj | 装扮信息 | | +| nft_info | obj | NFT头像信息 | | + +`data.items[n].modules.module_author.official_verify`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| desc | str | 认证说明 | | +| type | num | 认证类型 | | + +`data.items[n].modules.module_author.pendant`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| expire | num | 过期时间 | 此接口返回恒为`0` | +| image | str | 头像框图片url | | +| image_enhance | str | 头像框图片url | | +| image_enhance_frame | str | 头像框图片逐帧序列url | | +| name | str | 头像框名称 | | +| pid | num | 头像框id | | +| n_pid | num | 同 pid | | + +`data.items[n].modules.module_author.vip`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| avatar_subscript | num | 是否显示角标 | 0:不显示<br/>1:显示 | +| avatar_subscript_url | str | `空串` | | +| due_date | num | 大会员过期时间戳 | UNIX 毫秒时间戳 | +| label | obj | 大会员标签 | | +| nickname_color | str | 名字显示颜色 | 大会员:`#FB7299` | +| status | num | 大会员状态 | 0:无<br />1:有<br/>2:封禁? | +| theme_type | num | `0` | | +| type | num | 大会员类型 | 0:无<br />1:月大会员<br />2:年度及以上大会员 | + +`data.items[n].modules.module_author.vip.label`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| bg_color | str | 会员标签背景颜色 | `#FB7299` | +| bg_style | num | `0` `1` | | +| border_color | str | 空 | | +| img_label_uri_hans | str | 大会员牌子图片 | 动态版 简体版 | +| img_label_uri_hans_static | str | 大会员牌子图片 | 静态版 简体版 | +| img_label_uri_hant | str | 大会员牌子图片 | 动态版 繁体版 | +| img_label_uri_hant_static | str | 大会员牌子图片 | 静态版 繁体版 | +| label_theme | str | 会员标签 | vip:大会员<br />annual_vip:年度大会员<br />ten_annual_vip:十年大会员<br />hundred_annual_vip:百年大会员<br/>fools_day_hundred_annual_vip:最强绿鲤鱼 | +| path | str | 空 | | +| text | str | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` | +| text_color | str | 用户名文字颜色 | | +| use_img_label | bool | `true` | | + +`data.items[n].modules.module_author.decorate`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| card_url | str | 动态卡片小图标图片URL | | +| fan | obj | 粉丝装扮信息 | | +| id | num | 装扮ID | | +| jump_url | str | 跳转URL | | +| name | str | 装扮名称 | | +| type | num | `1` `2` `3` | | + +`data.items[n].modules.module_author.decorate.fan`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| color | str | 编号颜色 | | +| color_format | obj | 颜色格式 | | +| is_fan | bool | 是否是粉丝装扮 | | +| num_str | str | 装扮编号前缀 | 如 `NO.` | +| number | num | 装扮编号 | | + +`data.items[n].modules.module_author.decorate.fan.color_format`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| colors | array | 颜色 | 带 `#` 前缀的 16 进制颜色代码 | +| end_point | str| 端点 | `0,100` | +| gradients | array | 渐变 | 内容 [0, 100] | +| start_point | str | 起点 | `0,0` | + +`data.items[n].modules.module_author.nft_info`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| region_icon | str | NFT头像角标URL | 类型1:https://i0.hdslb.com/bfs/activity-plat/static/20220506/334553dd7c506a92b88eaf4d59ac8b4d/j8AeXAkEul.gif <br/>类型2:https://i0.hdslb.com/bfs/activity-plat/static/20220506/334553dd7c506a92b88eaf4d59ac8b4d/IOHoVs1ebP.gif | +| region_type | num | NFT头像角标类型 | 1,2 | +| show_status | num | `1` | | + +`data.items[n].modules.module_dynamic`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| additional | obj | 相关内容卡片信息 | | +| desc | obj | 动态文字内容 |其他动态时为null | +| major | obj | 动态主体对象 |转发动态时为null | +| topic | obj | 话题信息 | | + +`data.items[n].modules.module_dynamic.additional`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| common | obj | 一般类型 | `ADDITIONAL_TYPE_COMMON`类型独有 | +| type | str | 卡片类型 | [相关内容卡片类型](./dynamic_enum.md#相关内容卡片类型) | +| reserve | obj | 预约信息 | `ADDITIONAL_TYPE_RESERVE`类型独有 | +| goods | obj | 商品内容 | `ADDITIONAL_TYPE_GOODS`类型独有 | +| vote | obj | 投票信息 | `ADDITIONAL_TYPE_VOTE`类型独有 | +| ugc | obj | 视频信息 | `ADDITIONAL_TYPE_UGC`类型独有 | + +`data.items[n].modules.module_dynamic.additional.common`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| button | obj | 按钮内容 | | +| cover | str | 左侧封面图 | | +| desc1 | str | 描述1 | | +| desc2 | str | 描述2 | | +| head_text | str | 卡片头文本 | | +| id_str | str | 相关id | | +| jump_url | str | 跳转URL | | +| style | num | `1` | | +| sub_type | str | 子类型 | `game`<br/>`decoration`<br/>`ogv` | +| title | str | 卡片标题 | | + +`data.items[n].modules.module_dynamic.additional.common.button`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| jump_style | obj | 跳转类型 | `game`和`decoration`类型特有 | +| jump_url | str | 跳转URL | | +| type | num | | 1:`game`和`decoration`类型<br/>2:`ogv`类型 | +| check | obj | | `ogv`类型特有 | +| status | num | `1` | | +| uncheck | obj | | `ogv`类型特有 | + +`data.items[n].modules.module_dynamic.additional.common.button.jump_style`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| icon_url | str | `空串` | | +| text | str | 按钮显示文案 | game:`进入`<br/>decoration:`去看看` | + +`data.items[n].modules.module_dynamic.additional.common.button.check`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| icon_url | str | 按钮图片URL | | +| text | str | 按钮显示文案 | `ogv`:已追剧 | + +`data.items[n].modules.module_dynamic.additional.common.button.uncheck`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| icon_url | str | 按钮图片URL | | +| text | str | 按钮显示文案 | `ogv`:追剧 | + +`data.items[n].modules.module_dynamic.additional.reserve`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| button | obj | 按钮信息 | | +| desc1 | obj | 预约时间 | | +| desc2 | obj | 预约观看量 | | +| jump_url | str | 跳转URL | | +| reserve_total | num | 预约人数 | | +| rid | num | | | +| state | num | `0` | | +| stype | num | `1` `2` | | +| title | str | 预约标题 | | +| up_mid | num | 预约发起人UID | | +| desc3 | obj | 预约有奖信息 | | + +`data.items[n].modules.module_dynamic.additional.reserve.button`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| check | obj | 已预约状态显示内容 | | +| status | num | 预约状态 | 1:未预约,使用`uncheck`<br/>2:已预约,使用`check` | +| type | num | 类型 | 1:视频预约,使用`jump_style`<br/>2:直播预约,使用`check`和`uncheck` | +| uncheck | obj | 未预约状态显示内容 | | +| jump_style | obj | 跳转按钮 | | +| jump_url | str | 跳转URL | | + +`data.items[n].modules.module_dynamic.additional.reserve.button.check`对象" + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| icon_url | str | `空串` | | +| text | str | 按钮显示文案 | `已预约` | + +`data.items[n].modules.module_dynamic.additional.reserve.button.uncheck`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| icon_url | str | 显示图标URL | | +| text | str | 按钮显示文案 | | +| toast | str | 预约成功显示提示文案 | | +| disable | num | 是否不可预约 | 1:是 | + +`data.items[n].modules.module_dynamic.additional.reserve.button.jump_style`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| icon_url | str | `空串` | | +| text | str | 按钮显示文案 | `去观看` | + +`data.items[n].modules.module_dynamic.additional.reserve.desc1`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| style | num | 类型 | 0:`视频预约` `11-05 20:00 直播` `预计今天 17:05发布`<br/>1:`直播中` | +| text | str | 显示文案 | | + +`data.items[n].modules.module_dynamic.additional.reserve.desc2`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| style | num | `0` | | +| text | str | 显示文案 | `2人预约`<br/>`743观看`<br/>`1.0万人看过`<br/>`2151人气` | +| visible | bool | 是否显示 | true:显示文案<br/>false:显示已结束 | + +`data.items[n].modules.module_dynamic.additional.reserve.desc3`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| jump_url | str | 开奖信息跳转URL | | +| style | num | `1` | | +| text | str | 奖品信息显示文案 | | + +`data.items[n].modules.module_dynamic.additional.goods`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| head_icon | str | `空串` | | +| head_text | str | 卡片头显示文案 | | +| items | array | 商品信息列表 | | +| jump_url | str | `空串` | | + +`data.items[n].modules.module_dynamic.additional.goods.items`数组中的: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| brief | str | 商品副标题 | | +| cover | str | 商品封面 | | +| id | str | 商品ID | | +| jump_desc | str | 跳转按钮显示文案 | | +| jump_url | str | 跳转URL | | +| name | str | 商品名称 | | +| price | str | 商品价格 | | + +`data.items[n].modules.module_dynamic.additional.vote`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| choice_cnt | num | `1` | | +| default_share | num | 是否默认勾选`同时分享至动态` | 1:勾选 | +| desc | str | 投票标题 | | +| end_time | num | 剩余时间 | 单位:秒 | +| join_num | num | 已参与人数 | | +| status | num | `1` | | +| type | null | `null` | | +| uid | num | 发起人UID | | +| vote_id | num | 投票ID | | + +`data.items[n].modules.module_dynamic.additional.ugc`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cover | str | 封面 | | +| desc_second | str | 播放量与弹幕数 | | +| duration | str | 视频长度 | | +| head_text | str | `空串` | | +| id_str | str | 视频AV号 | | +| jump_url | str | 视频跳转URL | | +| multi_line | bool | `true` | | +| title | str | 视频标题 | | + +`data.items[n].modules.module_dynamic.desc`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| rich_text_nodes | array | 富文本节点列表 | [富文本节点类型](./dynamic_enum.md#富文本节点类型) | +| text | str | 动态的文字内容 | | + +`data.items[n].modules.module_dynamic.desc.rich_text_nodes[o]`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| orig_text | str | 原始文本 | | +| text | str | 替换后的文本 | | +| type | str | 节点类型 | [富文本节点类型](./dynamic_enum.md#富文本节点类型) | +| emoji | obj | 表情信息 | | +| jump_url | str | 跳转URL | | +| rid | str | 关联id | | +| goods | obj | 商品信息 | | +| icon_name | str | 图标名称 | `taobao` | + +`data.items[n].modules.module_dynamic.desc.rich_text_nodes[o].emoji`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| icon_url | str | 表情图片URL | | +| size | num | 表情尺寸 | `1` `2` | +| text | str | 表情的文字代码 | | +| type | num | 表情类型 | `1` `2` `3` | + +`data.items[n].modules.module_dynamic.desc.rich_text_nodes[o].goods`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| jump_url | str | 跳转URL | | +| type | num | `1` | | + +`data.items[n].modules.module_dynamic.major`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| type | str | 动态主体类型 | [动态主体类型](./dynamic_enum.md#动态主体类型) | +| ugc_season | obj | 合集信息 | `MAJOR_TYPE_UGC_SEASON` | +| article | obj | 专栏类型 | `MAJOR_TYPE_ARTICLE` | +| draw | obj | 带图动态 | `MAJOR_TYPE_DRAW` | +| archive | obj | 视频信息 | `MAJOR_TYPE_ARCHIVE` | +| live_rcmd | obj | 直播状态 | `MAJOR_TYPE_LIVE_RCMD` | +| common | obj | 一般类型 | `MAJOR_TYPE_COMMON` | +| pgc | obj | 剧集信息 | `MAJOR_TYPE_PGC` | +| courses | obj | 课程信息 | `MAJOR_TYPE_COURSES` | +| music | obj | 音频信息 | `MAJOR_TYPE_MUSIC` | +| opus | obj | 图文动态 | `MAJOR_TYPE_OPUS` | +| live | obj | | | +| none | obj | 动态失效 | `MAJOR_TYPE_NONE` | + +`data.items[n].modules.module_dynamic.major.ugc_season`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| aid | num | 视频AV号 | | +| badge | obj | 角标信息 | | +| cover | str | 视频封面 | | +| desc | str | 视频简介 | | +| disable_preview | num | `0` | | +| duration_text | str | 时长 | | +| jump_url | str | 跳转URL | | +| stat | obj | 统计信息 | | +| title | str | 视频标题 | | + +`data.items[n].modules.module_dynamic.major.ugc_season.badge`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| bg_color | str | 背景颜色 | | +| color | str | 字体颜色 | | +| text | str | 角标文案 | | + +`data.items[n].modules.module_dynamic.major.ugc_season.stat`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| danmaku | str | 弹幕数 | | +| play | str | 播放数 | | + +`data.items[n].modules.module_dynamic.major.article`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| covers | array | 封面图数组 | 最多三张 | +| desc | str | 文章摘要 | | +| id | num | 文章CV号 | | +| jump_url | str | 文章跳转地址 | | +| label | str | 文章阅读量 | | +| title | str | 文章标题 | | + +`data.items[n].modules.module_dynamic.major.draw`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| id | num | 对应相簿id | | +| items | array | 图片信息列表 | | + +`data.items[n].modules.module_dynamic.major.draw.items[o]`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| height | num | 图片高度 | | +| size | num | 图片大小 | 单位KB | +| src | str | 图片URL | | +| tags | array | | | +| width | num | 图片宽度 | | + +`data.items[n].modules.module_dynamic.major.archive`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| aid | str | 视频AV号 | | +| badge | obj | 角标信息 | | +| bvid | str | 视频BVID | | +| cover | str | 视频封面 | | +| desc | str | 视频简介 | | +| disable_preview | num | `0` | | +| duration_text | str | 视频长度 | | +| jump_url | str | 跳转URL | | +| stat | obj | 统计信息 | | +| title | str | 视频标题 | | +| type | num | `1` | | + +`data.items[n].modules.module_dynamic.major.archive.badge`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| bg_color | str | 背景颜色 | | +| color | str | 字体颜色 | | +| text | str | 角标文案 | | + +`data.items[n].modules.module_dynamic.major.archive.stat`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| danmaku | str | 弹幕数 | | +| play | str | 播放数 | | + +`data.items[n].modules.module_dynamic.major.live_rcmd`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| content | str | 直播间内容JSON | | +| reserve_type | num | `0` | | + +`data.items[n].modules.module_dynamic.major.common`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| badge | obj | 角标信息 | | +| biz_type | num | `0` | | +| cover | str | 左侧图片封面 | | +| desc | str | 右侧描述信息 | | +| id | str | | | +| jump_url | str | 跳转地址 | | +| label | str | `空串` | | +| sketch_id | str | | | +| style | num | `1` | | +| title | str | 右侧标题 | | + +`data.items[n].modules.module_dynamic.major.common.badge`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| bg_color | str | `空串` | | +| color | str | `空串` | | +| text | str | `空串` | | + +`data.items[n].modules.module_dynamic.major.pgc`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| badge | obj | 角标信息 | | +| cover | str | 视频封面 | | +| epid | num | 分集EpId | | +| jump_url | str | 跳转URL | | +| season_id | num | 剧集SeasonId | | +| stat | obj | 统计信息 | | +| sub_type | num | 剧集类型 | 1:番剧<br/>2:电影<br/>3:纪录片<br/>4:国创<br/>5:电视剧<br/>6:漫画<br/>7:综艺 | +| title | str | 视频标题 | | +| type | num | `2` | | + +`data.items[n].modules.module_dynamic.major.pgc.badge`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| bg_color | str | 背景颜色 | | +| color | str | 字体颜色 | | +| text | str | 角标文案 | | + +`data.items[n].modules.module_dynamic.major.pgc.stat`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| danmaku | str | 弹幕数 | | +| play | str | 播放数 | | + +`data.items[n].modules.module_dynamic.major.courses`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| badge | obj | 角标信息 | | +| cover | str | 封面图URL | | +| desc | str | 更新状态描述 | | +| id | num | 课程id | | +| jump_url | str | 跳转URL | | +| sub_title | str | 课程副标题 | | +| title | str | 课程标题 | | + +`data.items[n].modules.module_dynamic.major.courses.badge`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| bg_color | str | 背景颜色 | | +| color | str | 字体颜色 | | +| text | str | 角标文案 | | + +`data.items[n].modules.module_dynamic.major.music`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cover | str | 音频封面 | | +| id | num | 音频AUID | | +| jump_url | str | 跳转URL | | +| label | str | 音频分类 | | +| title | str | 音频标题 | | + +`data.items[n].modules.module_dynamic.major.opus`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| fold_action | array | 展开收起 | | +| jump_url | str | 跳转URL | | +| pics | array | 图片信息 | | +| summary | obj | 动态内容 | | +| title | str | 动态标题 | 没有标题时为null | + +`data.items[n].modules.module_dynamic.major.opus.summary`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| rich_text_nodes | array | 富文本节点列表 | 和`desc`对象中的`rich_text_nodes`数组结构一样 | +| text | str | 评论内容 | | + +`data.items[n].modules.module_dynamic.major.live`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| badge | obj | 角标信息 | | +| cover | str | 直播封面 | | +| desc_first | str | 直播主分区名称 | | +| desc_second | str | 观看人数 | | +| id | num | 直播间id | | +| jump_url | str | 直播间跳转URL | | +| live_state | num | 直播状态 | 0:直播结束<br/>1:正在直播 | +| reserve_type | num | `0` | | +| title | str | 直播间标题 | | + +`data.items[n].modules.module_dynamic.major.live.badge`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| bg_color | str | 背景颜色 | | +| color | str | 字体颜色 | | +| text | str | 角标文案 | | + +`data.items[n].modules.module_dynamic.major.none`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| tips | str | 动态失效显示文案 | deprecated? | + +`data.items[n].modules.module_dynamic.topic`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| id | num | 话题id | | +| jump_url | str | 跳转URL | | +| name | str | 话题名称 | | + +`data.items[n].modules.module_more`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| three_point_items | array | 右上角三点菜单 | | + +`data.items[n].modules.module_more.three_point_items[o]`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| label | str | 显示文本 | | +| type | str | 类型 | 参见 [动态主体类型](dynamic_enum.md#动态主体类型) | +| modal | obj | 弹出框信息 | 删除动态时弹出 | +| params | obj | 参数 | 置顶/取消置顶时使用 | + +`data.items[n].modules.module_more.three_point_items[o].modal`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cancel | str | 取消按钮 | `我点错了` | +| confirm | str | 确认按钮 | `删除` | +| content | str | 提示内容 | `确定要删除此条动态吗?` | +| title | str | 标题 | `删除动态` | + +`data.items[n].modules.module_more.three_point_items[o].params`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| dynamic_id | str | 当前动态ID | deprecated? | +| status | bool | 当前动态是否处于置顶状态 | deprecated? | + +`data.items[n].modules.module_stat`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| comment | obj | 评论数据 | | +| forward | obj | 转发数据 | | +| like | obj | 点赞数据 | | + +`data.items[n].modules.module_stat.comment`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| count | num | 评论数 | | +| forbidden | bool | `false` | | +| hidden | bool | 是否隐藏 | 直播类型动态会隐藏回复功能 | + +`data.items[n].modules.module_stat.forward`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| count | num | 转发数 | | +| forbidden | bool | `false` | | + +`data.items[n].modules.module_stat.like`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| count | num | 点赞数 | | +| forbidden | bool | `false` | | +| status | bool | 当前用户是否点赞 | | + +`data.items[n].modules.module_interaction`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| items | array | 信息列表 | | + +`data.items[n].modules.module_interaction.items`数组中的: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| desc | obj | 点赞/评论信息 | | +| type | num | 类型 | 0:点赞信息<br/>1:评论信息 | + +`data.items[n].modules.module_interaction.items[o].desc`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| rich_text_nodes | array | 富文本节点列表 | [富文本节点类型](./dynamic_enum.md#富文本节点类型) | +| text | str | 评论内容 | | + +`data.items[n].modules.module_interaction.items[o].desc.rich_text_nodes`数组中的: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| orig_text | str | 原始文本 | | +| rid | str | 关联ID | 用户UID | +| text | str | 替换后文本 | | +| type | str | 富文本节点类型 | [富文本节点类型](./dynamic_enum.md#富文本节点类型) | +| emoji | obj | 表情信息 | | + +`data.items[n].modules.module_interaction.items[o].desc.rich_text_nodes[n].emoji`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| icon_url | str | 表情图片URL | | +| size | num | 表情尺寸 | `1` `2` | +| text | str | 表情的文字代码 | | +| type | num | 表情类型 | `1` `2` `3` | + +`data.items[n].modules.module_fold`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| ids | array | 被折叠的动态id列表 | | +| statement | str | 显示文案 | 例:展开x条相关动态 | +| type | num | `1` | | +| users | array | `空数组` | | + +`data.items[n].modules.module_dispute`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| desc | str | | | +| jump_url | str | | | +| title | str | 提醒文案 | 例:视频内含有危险行为,请勿模仿 | + +`data.items[n].modules.module_tag`: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| text | str | '置顶' | 置顶动态出现这个对象,否则没有 | + +**示例:** + +```shell +curl -L -X GET 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?type=all' \ +-H 'Cookie: SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "has_more": true, + "items": [ + { + "basic": { + "comment_id_str": "112981396619958", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "112981396619958" + }, + "id_str": "966887968322093078", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i2.hdslb.com/bfs/face/b1c15dd8814d79e648008815517aa5ef50a2fb9c.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "3546730050096047" + }, + "face": "https://i2.hdslb.com/bfs/face/b1c15dd8814d79e648008815517aa5ef50a2fb9c.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/3546730050096047/dynamic", + "label": "", + "mid": 3546730050096047, + "name": "青岛LUCIFER", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "刚刚", + "pub_ts": 1723959548, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 0, + "avatar_subscript_url": "", + "due_date": 0, + "label": { + "bg_color": "", + "bg_style": 0, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", + "label_theme": "", + "path": "", + "text": "", + "text_color": "", + "use_img_label": true + }, + "nickname_color": "", + "status": 0, + "theme_type": 0, + "type": 0 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "archive": { + "aid": "112981396619958", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV1oeWNebEv2", + "cover": "http://i2.hdslb.com/bfs/archive/0e3d26d90eb0642d90c7552e63ce690e2fe7f8ce.jpg", + "desc": "给老板娘贴睫毛贴了半天,老登眼皮总动,夹睫毛疼了还骂我,不开心哈哈哈。", + "disable_preview": 0, + "duration_text": "00:16", + "jump_url": "//www.bilibili.com/video/BV1oeWNebEv2/", + "stat": { + "danmaku": "0", + "play": "0" + }, + "title": "老板娘今天是可爱鬼呀!", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 0, + "forbidden": false + }, + "forward": { + "count": 0, + "forbidden": false + }, + "like": { + "count": 0, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + { + "basic": { + "comment_id_str": "1756441068", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "1756441068" + }, + "id_str": "966873782060843027", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/726060100f7b80f3ab17889aa9fb8f380a53b9da.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "266765166" + }, + "face": "https://i0.hdslb.com/bfs/face/726060100f7b80f3ab17889aa9fb8f380a53b9da.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/266765166/dynamic", + "label": "", + "mid": 266765166, + "name": "漫士沉思录", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "55分钟前", + "pub_ts": 1723956245, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 0, + "avatar_subscript_url": "", + "due_date": 0, + "label": { + "bg_color": "", + "bg_style": 0, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", + "label_theme": "", + "path": "", + "text": "", + "text_color": "", + "use_img_label": true + }, + "nickname_color": "", + "status": 0, + "theme_type": 0, + "type": 0 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "archive": { + "aid": "1756441068", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV1d4421Z7nW", + "cover": "http://i1.hdslb.com/bfs/archive/df067c178714da9b511f10bde11e1bc75ea676d9.jpg", + "desc": "使用3b1b开发的manim引擎制作", + "disable_preview": 0, + "duration_text": "14:25", + "jump_url": "//www.bilibili.com/video/BV1d4421Z7nW/", + "stat": { + "danmaku": "217", + "play": "1.4万" + }, + "title": "【漫士科普】如何最简单且本质地理解欧拉公式?", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 142, + "forbidden": false + }, + "forward": { + "count": 6, + "forbidden": false + }, + "like": { + "count": 1959, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + { + "basic": { + "comment_id_str": "325833790", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "325833790" + }, + "id_str": "966831498138222598", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "layers": [ + { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_animation": { + "webp_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp" + }, + "src_type": 1 + } + }, + "res_type": 4 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + } + ], + "mid": "233114659" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/garb/bb140043341137b879e957d09b649ce7c3257820.png", + "fan": { + "color": "#903AC2", + "color_format": { + "colors": [ + "#903AC2FF", + "#903AC2FF" + ], + "end_point": "0,100", + "gradients": [ + 0, + 100 + ], + "start_point": "0,0" + }, + "is_fan": true, + "num_prefix": "NO.", + "num_str": "000001", + "number": 1 + }, + "id": 1706163888001, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=1706163888001\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=233114659\u0026native.theme=1\u0026navhide=1", + "name": "龙腾啾跃-动态卡片粉丝", + "type": 3 + }, + "face": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/233114659/dynamic", + "label": "", + "mid": 233114659, + "name": "碧蓝航线", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png", + "image_enhance": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp", + "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/3052b412defbbc7704e887fefde8de539e8027c5.png", + "n_pid": 1987, + "name": "碧蓝航线2020", + "pid": 1987 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "3小时前", + "pub_ts": 1723946400, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1729526400000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": { + "common": { + "button": { + "jump_style": { + "icon_url": "", + "text": "进入" + }, + "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", + "type": 1 + }, + "cover": "https://i0.hdslb.com/bfs/game/b141a7690c226a0eae66518c713d3af62613b21d.png", + "desc1": "养成", + "desc2": "指挥官,欢迎回港", + "head_text": "相关游戏", + "id_str": "97", + "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", + "style": 1, + "sub_type": "game", + "title": "碧蓝航线" + }, + "type": "ADDITIONAL_TYPE_COMMON" + }, + "desc": { + "rich_text_nodes": [ + { + "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF", + "orig_text": "#碧蓝航线#", + "text": "#碧蓝航线#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": " ", + "text": " ", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF%E6%BC%AB%E5%B1%95", + "orig_text": "#碧蓝航线漫展#", + "text": "#碧蓝航线漫展#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": " ", + "text": " ", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "jump_url": "//search.bilibili.com/all?keyword=2024%E6%B8%AF%E5%8C%BA%E7%9B%9B%E5%A4%8F%E6%B8%85%E5%87%89%E8%8A%82", + "orig_text": "#2024港区盛夏清凉节#", + "text": "#2024港区盛夏清凉节#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": "\n◆ 「港区盛夏清凉节」长沙站·街区快闪 DAY1 现场直击!◆ \n\n城市街巷,专属惊喜,\n绘就绚丽夏日!\n和少女们一同记录这场特别邂逅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。", + "text": "\n◆ 「港区盛夏清凉节」长沙站·街区快闪 DAY1 现场直击!◆ \n\n城市街巷,专属惊喜,\n绘就绚丽夏日!\n和少女们一同记录这场特别邂逅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "#碧蓝航线# #碧蓝航线漫展# #2024港区盛夏清凉节#\n◆ 「港区盛夏清凉节」长沙站·街区快闪 DAY1 现场直击!◆ \n\n城市街巷,专属惊喜,\n绘就绚丽夏日!\n和少女们一同记录这场特别邂逅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。" + }, + "major": { + "draw": { + "id": 325833790, + "items": [ + { + "height": 4000, + "size": 16103.947, + "src": "http://i0.hdslb.com/bfs/new_dyn/31b32e6dcf2f1a6328552f0fa666302d233114659.jpg", + "tags": [], + "width": 6000 + }, + { + "height": 3905, + "size": 16620.71, + "src": "http://i0.hdslb.com/bfs/new_dyn/e507c60207f486824708a5850d07d1bb233114659.jpg", + "tags": [], + "width": 5858 + }, + { + "height": 4000, + "size": 16195.393, + "src": "http://i0.hdslb.com/bfs/new_dyn/7a7ef9513bb32edc3de887d787a4df43233114659.jpg", + "tags": [], + "width": 6000 + }, + { + "height": 4672, + "size": 11758.82, + "src": "http://i0.hdslb.com/bfs/new_dyn/a21461b944e10306e68672df3e92c1b9233114659.jpg", + "tags": [], + "width": 7008 + }, + { + "height": 4672, + "size": 3962.4902, + "src": "http://i0.hdslb.com/bfs/new_dyn/b2c4baa47b4999cabb9c8c338c2da36c233114659.jpg", + "tags": [], + "width": 7008 + }, + { + "height": 4672, + "size": 11276.51, + "src": "http://i0.hdslb.com/bfs/new_dyn/8cf06e142fce875d2c3b83961abbc668233114659.jpg", + "tags": [], + "width": 7008 + }, + { + "height": 3735, + "size": 13969.533, + "src": "http://i0.hdslb.com/bfs/new_dyn/c56cd277f281ba8cc4a395dbe5d9fa54233114659.jpg", + "tags": [], + "width": 5603 + }, + { + "height": 3106, + "size": 12942.339, + "src": "http://i0.hdslb.com/bfs/new_dyn/9049a5c39ebafdd1cb488b26da4f99da233114659.jpg", + "tags": [], + "width": 4659 + }, + { + "height": 3802, + "size": 18643.953, + "src": "http://i0.hdslb.com/bfs/new_dyn/564e469ba092d2381b23547da37ca3c0233114659.jpg", + "tags": [], + "width": 5703 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 151, + "forbidden": false + }, + "forward": { + "count": 31, + "forbidden": false + }, + "like": { + "count": 2827, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + { + "basic": { + "comment_id_str": "37231101", + "comment_type": 12, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "37231101" + }, + "id_str": "966827503780888593", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "407045223" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", + "fan": { + "color": "", + "color_format": null, + "is_fan": false, + "num_prefix": "", + "num_str": "", + "number": 0 + }, + "id": 28, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=407045223\u0026native.theme=1\u0026navhide=1", + "name": "2233娘", + "type": 1 + }, + "face": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/407045223/dynamic", + "label": "", + "mid": 407045223, + "name": "二次元的中科院物理所", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了文章", + "pub_location_text": "", + "pub_time": "3小时前", + "pub_ts": 1723945470, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1745769600000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "article": { + "covers": [ + "https://i0.hdslb.com/bfs/article/f59f635a3784c49eb174da7d589c4e75407045223.jpg" + ], + "desc": "西游记中,孙悟空为了保护师傅,在地上画了一个圈,由此便可限制住妖怪。今天小编带大家布置法术场地,只需在上面画出图案,便可控制水滴的行动!实验器材火柴、蜡烛、空易拉罐、所标杯、细竹签实验步骤安全提示:本实验有明火,请小朋友在家长的陪同下完成,或在空旷的地方进行,避免着火,注意安全。第一步:首先布置施法场地,通过蜡烛将易拉罐底部附着满炭黑。注意此步骤中应保持易拉罐内含一定水分,否则会产生烫伤等风险!第二步:向施法场地滴入水滴,观察场地效果。可以看到水滴在场地内不收约束,自由滑行第三步:当用细竹签等在场地中画出", + "id": 37231101, + "jump_url": "//www.bilibili.com/read/cv37231101/", + "label": "12万阅读", + "title": "带你在家里学会孙悟空的“画地为牢” 丨正经玩" + }, + "type": "MAJOR_TYPE_ARTICLE" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 9, + "forbidden": false + }, + "forward": { + "count": 2, + "forbidden": false + }, + "like": { + "count": 583, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_ARTICLE", + "visible": true + }, + { + "basic": { + "comment_id_str": "1306462278", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "1306462278" + }, + "id_str": "966792134707380227", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_animation": { + "webp_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" + }, + "src_type": 1 + } + }, + "res_type": 4 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "686127" + }, + "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/686127/dynamic", + "label": "", + "mid": 686127, + "name": "籽岷", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", + "image_enhance": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", + "image_enhance_frame": "", + "n_pid": 2066, + "name": "百年大会员", + "pid": 2066 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "6小时前", + "pub_ts": 1723937235, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 4845196800000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/c16005a5b39164b3536cbd45618a5edd597a1c51.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/Pzrd8zmpQD.png", + "label_theme": "hundred_annual_vip", + "path": "", + "text": "百年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "archive": { + "aid": "1306462278", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV14M4m1175k", + "cover": "http://i1.hdslb.com/bfs/archive/7f8060fe1669b1a0a980844bb90e8150a859499c.jpg", + "desc": "https://www.curseforge.com/minecraft/mc-mods/desert-behemoths-sandworms/", + "disable_preview": 0, + "duration_text": "04:24", + "jump_url": "//www.bilibili.com/video/BV14M4m1175k/", + "stat": { + "danmaku": "297", + "play": "10.1万" + }, + "title": "我的世界 巨大沙虫", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + }, + "module_interaction": { + "items": [ + { + "desc": { + "rich_text_nodes": [ + { + "orig_text": "bili_49990770610:", + "rid": "3546583341730698", + "text": "bili_49990770610:", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "emoji": { + "icon_url": "https://i0.hdslb.com/bfs/emote/1597302b98827463f5b75c7cac1f29ea6ce572c4.png", + "size": 1, + "text": "[给心心]", + "type": 1 + }, + "orig_text": "[给心心]", + "text": "[给心心]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + } + ], + "text": "[给心心]" + }, + "type": 1 + } + ] + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 248, + "forbidden": false + }, + "forward": { + "count": 10, + "forbidden": false + }, + "like": { + "count": 10276, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + { + "basic": { + "comment_id_str": "325813964", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "325813964" + }, + "id_str": "966695334756483089", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 1, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "layers": [ + { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_animation": { + "webp_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp" + }, + "src_type": 1 + } + }, + "res_type": 4 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 1, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + } + ], + "mid": "293793435" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/garb/item/c0cf2235089ed314d92f30efa855c9b5611fa2cd.png", + "fan": { + "color": "#07b6d5", + "color_format": { + "colors": [ + "#07b6d5FF", + "#07b6d5FF" + ], + "end_point": "0,100", + "gradients": [ + 0, + 100 + ], + "start_point": "0,0" + }, + "is_fan": true, + "num_prefix": "NO.", + "num_str": "005638", + "number": 5638 + }, + "id": 2513, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=2513\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=293793435\u0026native.theme=1\u0026navhide=1", + "name": "初音未来粉丝专属", + "type": 3 + }, + "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/293793435/dynamic", + "label": "", + "mid": 293793435, + "name": "社会易姐QwQ", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", + "image_enhance": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", + "image_enhance_frame": "https://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png", + "n_pid": 2511, + "name": "初音未来13周年", + "pid": 2511 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "12小时前", + "pub_ts": 1723914697, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1739116800000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "非常好冰箱贴,爱来自硬先生😋😋", + "text": "非常好冰箱贴,爱来自硬先生😋😋", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@硬核拆解 ", + "rid": "427494870", + "text": "@硬核拆解 ", + "type": "RICH_TEXT_NODE_TYPE_AT" + } + ], + "text": "非常好冰箱贴,爱来自硬先生😋😋@硬核拆解 " + }, + "major": { + "draw": { + "id": 325813964, + "items": [ + { + "height": 1277, + "size": 98.36, + "src": "http://i0.hdslb.com/bfs/new_dyn/60d92e9e0d89a5394a2da69aba6f9710293793435.jpg", + "tags": [], + "width": 958 + }, + { + "height": 1080, + "size": 905.82, + "src": "http://i0.hdslb.com/bfs/new_dyn/0f9bff1938d824ce206a569d539455df293793435.jpg", + "tags": [], + "width": 1440 + }, + { + "height": 1080, + "size": 693.59, + "src": "http://i0.hdslb.com/bfs/new_dyn/ab3332061b793361ec08901ace1782db293793435.jpg", + "tags": [], + "width": 1440 + }, + { + "height": 1080, + "size": 988.15, + "src": "http://i0.hdslb.com/bfs/new_dyn/8e62512db6d04b381dae3814adb95d5e293793435.jpg", + "tags": [], + "width": 1440 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 0, + "forbidden": false + }, + "forward": { + "count": 0, + "forbidden": false + }, + "like": { + "count": 11, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + { + "basic": { + "comment_id_str": "966692349750018048", + "comment_type": 17, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "966692349750018048" + }, + "id_str": "966692349750018048", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/78cdc5ba930ab171ebfe1ecc848cabcd4b0e0974.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "36081646" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/garb/item/684f6dc32decd32fe9db901b81b83b9a1fe39574.png", + "fan": { + "color": "", + "color_format": null, + "is_fan": false, + "num_prefix": "", + "num_str": "", + "number": 0 + }, + "id": 49922, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=49922\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=36081646\u0026native.theme=1\u0026navhide=1", + "name": "古色花香洛天依", + "type": 1 + }, + "face": "https://i1.hdslb.com/bfs/face/78cdc5ba930ab171ebfe1ecc848cabcd4b0e0974.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/36081646/dynamic", + "label": "", + "mid": 36081646, + "name": "洛天依", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png", + "image_enhance": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png", + "image_enhance_frame": "", + "n_pid": 1720437918001, + "name": "洛天依心律共鸣头像框", + "pid": -1843967695 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "12小时前", + "pub_ts": 1723914002, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1764777600000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "恭喜", + "text": "恭喜", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@从一到无穷大Infinity", + "rid": "697565874", + "text": "@从一到无穷大Infinity", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "@qwq啊啊啊啊啊噜", + "rid": "189799722", + "text": "@qwq啊啊啊啊啊噜", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "@有时名字不能取太长", + "rid": "3546388151405126", + "text": "@有时名字不能取太长", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "等5位同学中奖,已私信通知,详情请点击抽奖查看。", + "text": "等5位同学中奖,已私信通知,详情请点击抽奖查看。", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "恭喜@从一到无穷大Infinity@qwq啊啊啊啊啊噜@有时名字不能取太长等5位同学中奖,已私信通知,详情请点击抽奖查看。" + }, + "major": null, + "topic": null + }, + "module_interaction": { + "items": [ + { + "desc": { + "rich_text_nodes": [ + { + "orig_text": "明ちゃん王:", + "rid": "1280664625", + "text": "明ちゃん王:", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "哇,非常不错呢,跟天依挺搭配的", + "text": "哇,非常不错呢,跟天依挺搭配的", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "emoji": { + "icon_url": "https://i0.hdslb.com/bfs/emote/63c9d1a31c0da745b61cdb35e0ecb28635675db2.png", + "size": 1, + "text": "[星星眼]", + "type": 1 + }, + "orig_text": "[星星眼]", + "text": "[星星眼]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + } + ], + "text": "哇,非常不错呢,跟天依挺搭配的[星星眼]" + }, + "type": 1 + } + ] + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 88, + "forbidden": false + }, + "forward": { + "count": 12, + "forbidden": false + }, + "like": { + "count": 3088, + "forbidden": false, + "status": false + } + } + }, + "orig": { + "basic": { + "comment_id_str": "", + "comment_type": 0, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "" + }, + "id_str": "939874290505875465", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/78cdc5ba930ab171ebfe1ecc848cabcd4b0e0974.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "36081646" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/garb/item/684f6dc32decd32fe9db901b81b83b9a1fe39574.png", + "fan": { + "color": "", + "color_format": null, + "is_fan": false, + "num_prefix": "", + "num_str": "", + "number": 0 + }, + "id": 49922, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=49922\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=36081646\u0026native.theme=1\u0026navhide=1", + "name": "古色花香洛天依", + "type": 1 + }, + "face": "https://i1.hdslb.com/bfs/face/78cdc5ba930ab171ebfe1ecc848cabcd4b0e0974.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/36081646/dynamic", + "label": "", + "mid": 36081646, + "name": "洛天依", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png", + "image_enhance": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png", + "image_enhance_frame": "", + "n_pid": 1720437918001, + "name": "洛天依心律共鸣头像框", + "pid": -1843967695 + }, + "pub_action": "", + "pub_time": "", + "pub_ts": 1717669936, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1764777600000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": { + "goods": { + "head_icon": "", + "head_text": "UP主的推荐", + "items": [ + { + "brief": "", + "cover": "https://i0.hdslb.com/bfs/mall/mall/ef/9d/2cb00b3649bcb232f62b3169be95407d.png", + "id": "901140704120020992", + "jump_desc": "去看看", + "jump_url": "https://mall.bilibili.com/neul-next/detailuniversal/detail.html?isMerchant=1\u0026page=detailuniversal_detail\u0026saleType=0\u0026itemsId=10406556\u0026loadingShow=1\u0026noTitleBar=1\u0026msource=cps_Mdynamic_36081646\u0026from=\u0026contentId=\u0026track_id=__BGMT__", + "name": "天羽川 洛天依 短袖水手服纯色裙长短袜套装", + "price": "¥49" + } + ], + "jump_url": "" + }, + "type": "ADDITIONAL_TYPE_GOODS" + }, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "​互动抽奖", + "rid": "301330", + "text": "​互动抽奖", + "type": "RICH_TEXT_NODE_TYPE_LOTTERY" + }, + { + "orig_text": "洛天依X", + "text": "洛天依X", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@天羽川JK ", + "rid": "394187581", + "text": "@天羽川JK ", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "联名水手服\u0026长短袜套装 新品预售即将开启啦!\n转发关注天依,揪5位小伙伴送出联名款长短袜1双~", + "text": "联名水手服\u0026长短袜套装 新品预售即将开启啦!\n转发关注天依,揪5位小伙伴送出联名款长短袜1双~", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "emoji": { + "icon_url": "http://i0.hdslb.com/bfs/emote/9826fb4f77944387767a37552143fbec40159fa5.png", + "size": 2, + "text": "[洛天依_礼物]", + "type": 3 + }, + "orig_text": "[洛天依_礼物]", + "text": "[洛天依_礼物]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + }, + { + "orig_text": "\n\n❀联名服饰\n-洛天依联名款水手服\n-洛天依还原款长短袜\n\n❀预售时间\n6月8日20:00 起\n\n日常\u0026cos皆宜,大家有没有发现结合了天依的哪些元素呀?", + "text": "\n\n❀联名服饰\n-洛天依联名款水手服\n-洛天依还原款长短袜\n\n❀预售时间\n6月8日20:00 起\n\n日常\u0026cos皆宜,大家有没有发现结合了天依的哪些元素呀?", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "emoji": { + "icon_url": "https://i0.hdslb.com/bfs/emote/8034b3cb55370d19b1683eb38e7747c5c6c5dba6.png", + "size": 2, + "text": "[洛天依蝶变_星星眼]", + "type": 3 + }, + "orig_text": "[洛天依蝶变_星星眼]", + "text": "[洛天依蝶变_星星眼]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + }, + { + "orig_text": "\n", + "text": "\n", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "​互动抽奖洛天依X@天羽川JK 联名水手服\u0026长短袜套装 新品预售即将开启啦!\n转发关注天依,揪5位小伙伴送出联名款长短袜1双~[洛天依_礼物]\n\n❀联名服饰\n-洛天依联名款水手服\n-洛天依还原款长短袜\n\n❀预售时间\n6月8日20:00 起\n\n日常\u0026cos皆宜,大家有没有发现结合了天依的哪些元素呀?[洛天依蝶变_星星眼]\n" + }, + "major": { + "draw": { + "id": 318324614, + "items": [ + { + "height": 1280, + "size": 662.59, + "src": "http://i0.hdslb.com/bfs/new_dyn/1f23b61786eadb8c3e3f4c137730715036081646.jpg", + "tags": [], + "width": 904 + }, + { + "height": 1280, + "size": 614.83, + "src": "http://i0.hdslb.com/bfs/new_dyn/7d679216308bb7c65aeba38b4eafdd8936081646.jpg", + "tags": [], + "width": 904 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": { + "id": 1156147, + "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1156147\u0026topic_name=%E5%A4%A9%E4%BE%9D%E7%9A%84%E5%91%A8%E8%BE%B9", + "name": "天依的周边" + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + "type": "DYNAMIC_TYPE_FORWARD", + "visible": true + }, + { + "basic": { + "comment_id_str": "325807840", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "325807840" + }, + "id_str": "966677390370537527", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "485703766" + }, + "face": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/485703766/dynamic", + "label": "", + "mid": 485703766, + "name": "英伟达GeForce", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "13小时前", + "pub_ts": 1723910520, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 2000563200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", + "label_theme": "ten_annual_vip", + "path": "", + "text": "十年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "直面天命,还有 2 天!\nRTX. ON!\n\n投稿来自于:Bilibili", + "text": "直面天命,还有 2 天!\nRTX. ON!\n\n投稿来自于:Bilibili", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@祗殁", + "rid": "12299496", + "text": "@祗殁", + "type": "RICH_TEXT_NODE_TYPE_AT" + } + ], + "text": "直面天命,还有 2 天!\nRTX. ON!\n\n投稿来自于:Bilibili@祗殁" + }, + "major": { + "draw": { + "id": 325807840, + "items": [ + { + "height": 1073, + "size": 66.29785, + "src": "https://i0.hdslb.com/bfs/new_dyn/b47b271135c7c496923d76c6b794e596485703766.png", + "tags": [], + "width": 1213 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 105, + "forbidden": false + }, + "forward": { + "count": 7, + "forbidden": false + }, + "like": { + "count": 872, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + { + "basic": { + "comment_id_str": "1606450518", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "1606450518" + }, + "id_str": "966647978674618373", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/bb23fb77a033759a145f8eda7b5e3a15386f637c.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "1503187" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/archive/e495de36cab75f9a610fb6f2d0ba29a87b794cc6.png", + "fan": { + "color": "#BFC8D2", + "color_format": { + "colors": [ + "#B8C7D0FF", + "#A2A7B0FF" + ], + "end_point": "100,100", + "gradients": [ + 0, + 100 + ], + "start_point": "0,0" + }, + "is_fan": true, + "num_prefix": "NO.", + "num_str": "002484", + "number": 2484 + }, + "id": 66898, + "jump_url": "https://www.bilibili.com/h5/mall/digital-card/home?act_id=108\u0026from=post\u0026f_source=garb\u0026-Abrowser=live\u0026hybrid_set_header=2\u0026navhide=1\u0026anchor_task=1", + "name": "BLG 信念干杯勋章", + "type": 3 + }, + "face": "https://i1.hdslb.com/bfs/face/bb23fb77a033759a145f8eda7b5e3a15386f637c.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/1503187/dynamic", + "label": "", + "mid": 1503187, + "name": "和谐号舰长", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "昨天 22:07", + "pub_ts": 1723903670, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1732204800000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "archive": { + "aid": "1606450518", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV152421Z7bV", + "cover": "http://i1.hdslb.com/bfs/archive/e87786447779ff1a4fb2d941a3321f9750a65300.jpg", + "desc": "多来点这样的更新,太快乐了", + "disable_preview": 0, + "duration_text": "03:39", + "jump_url": "//www.bilibili.com/video/BV152421Z7bV/", + "stat": { + "danmaku": "406", + "play": "6.6万" + }, + "title": "官方:矿车怎么就不能是飞船?", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + }, + "module_interaction": { + "items": [ + { + "desc": { + "rich_text_nodes": [ + { + "orig_text": "吉吉国民开水儿:", + "rid": "43514654", + "text": "吉吉国民开水儿:", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "致敬传奇宰人航空大师张泰玩", + "text": "致敬传奇宰人航空大师张泰玩", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "致敬传奇宰人航空大师张泰玩" + }, + "type": 1 + } + ] + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 218, + "forbidden": false + }, + "forward": { + "count": 15, + "forbidden": false + }, + "like": { + "count": 5694, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + { + "basic": { + "comment_id_str": "1506427569", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "1506427569" + }, + "id_str": "966629209415876628", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "407045223" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", + "fan": { + "color": "", + "color_format": null, + "is_fan": false, + "num_prefix": "", + "num_str": "", + "number": 0 + }, + "id": 28, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=407045223\u0026native.theme=1\u0026navhide=1", + "name": "2233娘", + "type": 1 + }, + "face": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/407045223/dynamic", + "label": "", + "mid": 407045223, + "name": "二次元的中科院物理所", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "昨天 20:55", + "pub_ts": 1723899301, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1745769600000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "光是什么?光是我们看到的五彩斑斓的世界,光是自然界能量的来源,光是一种电磁波。我们利用光可以做些什么?如何收集太阳的能量?如何产生光?让我们在本集课程中寻找这些问题的答案~ 错过直播的小伙伴可以来这里补课~", + "text": "光是什么?光是我们看到的五彩斑斓的世界,光是自然界能量的来源,光是一种电磁波。我们利用光可以做些什么?如何收集太阳的能量?如何产生光?让我们在本集课程中寻找这些问题的答案~ 错过直播的小伙伴可以来这里补课~", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "光是什么?光是我们看到的五彩斑斓的世界,光是自然界能量的来源,光是一种电磁波。我们利用光可以做些什么?如何收集太阳的能量?如何产生光?让我们在本集课程中寻找这些问题的答案~ 错过直播的小伙伴可以来这里补课~" + }, + "major": { + "archive": { + "aid": "1506427569", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV1uS42197b5", + "cover": "http://i1.hdslb.com/bfs/archive/e13db3349cdc91a00041be9730bbbe42c3e8df55.jpg", + "desc": "光是什么?光是我们看到的五彩斑斓的世界,光是自然界能量的来源,光是一种电磁波。我们利用光可以做些什么?如何收集太阳的能量?如何产生光?让我们在本集课程中寻找这些问题的答案~", + "disable_preview": 0, + "duration_text": "44:45", + "jump_url": "//www.bilibili.com/video/BV1uS42197b5/", + "stat": { + "danmaku": "1", + "play": "3364" + }, + "title": "光照下多姿多彩的世界——光化学和我们的生活【中国科学院科学公开课S06E15】", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": { + "id": 1073121, + "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1073121\u0026topic_name=%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E9%99%A2%E7%A7%91%E5%AD%A6%E5%85%AC%E5%BC%80%E8%AF%BE", + "name": "中国科学院科学公开课" + } + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 3, + "forbidden": false + }, + "forward": { + "count": 2, + "forbidden": false + }, + "like": { + "count": 741, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + { + "basic": { + "comment_id_str": "325765582", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "325765582" + }, + "id_str": "966583356402696224", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "946974" + }, + "face": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/946974/dynamic", + "label": "", + "mid": 946974, + "name": "影视飓风", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "昨天 17:57", + "pub_ts": 1723888625, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1975248000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png", + "label_theme": "ten_annual_vip", + "path": "", + "text": "十年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": { + "reserve": { + "button": { + "check": { + "icon_url": "", + "text": "已预约" + }, + "status": 1, + "type": 2, + "uncheck": { + "icon_url": "https://i0.hdslb.com/bfs/album/1d6af68e116985828780dd843ef435ccd6307e63.png", + "text": "预约" + } + }, + "desc1": { + "style": 0, + "text": "今天 20:00 直播" + }, + "desc2": { + "style": 0, + "text": "4153人预约", + "visible": true + }, + "jump_url": "", + "reserve_total": 4153, + "rid": 4003487, + "state": 0, + "stype": 2, + "title": "直播预约:飓风商店夏促来了!", + "up_mid": 946974 + }, + "type": "ADDITIONAL_TYPE_RESERVE" + }, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "飓风商店夏季活动来啦!\n8月18日周日晚20:00,直播间每15分钟天选抽送【热升华键帽】!\n\n👇新品看这边\n呼声超高的mini托特挂件、防泼水拎包、新版车贴,首发好价!\n👇福利看这边\n经典热销款全场9折,夏秋两季可穿,硬件同享折扣!\n\n总之,记得预约!", + "text": "飓风商店夏季活动来啦!\n8月18日周日晚20:00,直播间每15分钟天选抽送【热升华键帽】!\n\n👇新品看这边\n呼声超高的mini托特挂件、防泼水拎包、新版车贴,首发好价!\n👇福利看这边\n经典热销款全场9折,夏秋两季可穿,硬件同享折扣!\n\n总之,记得预约!", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "飓风商店夏季活动来啦!\n8月18日周日晚20:00,直播间每15分钟天选抽送【热升华键帽】!\n\n👇新品看这边\n呼声超高的mini托特挂件、防泼水拎包、新版车贴,首发好价!\n👇福利看这边\n经典热销款全场9折,夏秋两季可穿,硬件同享折扣!\n\n总之,记得预约!" + }, + "major": { + "draw": { + "id": 325765582, + "items": [ + { + "height": 9829, + "size": 5198.785, + "src": "http://i0.hdslb.com/bfs/new_dyn/9d690134c84c03f6bacf83cf4d21bd73946974.jpg", + "tags": [], + "width": 2251 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 3104, + "forbidden": false + }, + "forward": { + "count": 154, + "forbidden": false + }, + "like": { + "count": 4703, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + { + "basic": { + "comment_id_str": "325753910", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "325753910" + }, + "id_str": "966552037496979456", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_animation": { + "webp_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" + }, + "src_type": 1 + } + }, + "res_type": 4 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "686127" + }, + "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/686127/dynamic", + "label": "", + "mid": 686127, + "name": "籽岷", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", + "image_enhance": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", + "image_enhance_frame": "", + "n_pid": 2066, + "name": "百年大会员", + "pid": 2066 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "昨天 15:55", + "pub_ts": 1723881333, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 4845196800000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/c16005a5b39164b3536cbd45618a5edd597a1c51.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/Pzrd8zmpQD.png", + "label_theme": "hundred_annual_vip", + "path": "", + "text": "百年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": { + "type": "ADDITIONAL_TYPE_UPOWER_LOTTERY", + "upower_lottery": { + "button": { + "jump_style": { + "icon_url": "", + "text": "6元充电" + }, + "jump_url": "https://www.bilibili.com/h5/upower/index?mid=686127\u0026default_level=10\u0026levels=10\u0026navhide=1\u0026lotteryId=313280\u0026businessId=966552037496979456\u0026prePage=lotteryCard", + "type": 1 + }, + "desc": { + "jump_url": "https://www.bilibili.com/h5/lottery/result?business_id=966552037496979456\u0026business_type=12", + "style": 1, + "text": "【籽岷定制手偶】*10份" + }, + "hint": { + "style": 0, + "text": "加入当前UP主的「6元档包月充电」即可参与" + }, + "jump_url": "https://www.bilibili.com/h5/lottery/result?business_id=966552037496979456\u0026business_type=12", + "rid": 313280, + "state": 0, + "title": "石粒专属抽奖", + "up_mid": 686127, + "upower_action_state": 2, + "upower_level": 10 + } + }, + "desc": { + "rich_text_nodes": [ + { + "emoji": { + "icon_url": "https://i0.hdslb.com/bfs/garb/ebeae1235fa9397e6e5598ce1e5e2955bb345a8b.png", + "size": 2, + "text": "[UPOWER_686127_闪亮登场]", + "type": 11 + }, + "orig_text": "[UPOWER_686127_闪亮登场]", + "text": "[UPOWER_686127_闪亮登场]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + }, + { + "orig_text": "今天给大家奉上一波新福利,抽10人(籽岷定制手偶)~\n感谢一直为我包月充电的观众们~\n活动开奖时间为8月21日23点59分,大家快来抽奖吧~", + "text": "今天给大家奉上一波新福利,抽10人(籽岷定制手偶)~\n感谢一直为我包月充电的观众们~\n活动开奖时间为8月21日23点59分,大家快来抽奖吧~", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "[UPOWER_686127_闪亮登场]今天给大家奉上一波新福利,抽10人(籽岷定制手偶)~\n感谢一直为我包月充电的观众们~\n活动开奖时间为8月21日23点59分,大家快来抽奖吧~" + }, + "major": { + "draw": { + "id": 325753910, + "items": [ + { + "height": 800, + "size": 596.8096, + "src": "http://i0.hdslb.com/bfs/new_dyn/1b03b7888b105765d985f3093e5d6e4a686127.png", + "tags": [], + "width": 800 + }, + { + "height": 800, + "size": 393.75098, + "src": "http://i0.hdslb.com/bfs/new_dyn/b69ee39531bf8864471ec9fbc7de4402686127.png", + "tags": [], + "width": 800 + }, + { + "height": 800, + "size": 364.8711, + "src": "http://i0.hdslb.com/bfs/new_dyn/0c3fb5268abe60023b0053902bccde66686127.png", + "tags": [], + "width": 800 + }, + { + "height": 800, + "size": 198.65234, + "src": "http://i0.hdslb.com/bfs/new_dyn/693a40f83d2ac6a4952c9541365e1265686127.png", + "tags": [], + "width": 800 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": { + "id": 1006239, + "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1006239\u0026topic_name=%E7%B1%BD%E5%B2%B7%E5%93%81%E9%89%B4%E5%9B%A2", + "name": "籽岷品鉴团" + } + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 28, + "forbidden": false + }, + "forward": { + "count": 2, + "forbidden": false + }, + "like": { + "count": 2686, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + { + "basic": { + "comment_id_str": "1456450441", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "1456450441" + }, + "id_str": "966513421411418114", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/94183796acd85f2e80f3dca740bc1c3d5cae6410.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 1, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "3493131246897478" + }, + "face": "https://i1.hdslb.com/bfs/face/94183796acd85f2e80f3dca740bc1c3d5cae6410.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/3493131246897478/dynamic", + "label": "", + "mid": 3493131246897478, + "name": "电解碳酸钠", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "昨天 13:25", + "pub_ts": 1723872342, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1744732800000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "给脚专用的“按键” 我觉得他不应该这么贵", + "text": "给脚专用的“按键” 我觉得他不应该这么贵", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "给脚专用的“按键” 我觉得他不应该这么贵" + }, + "major": { + "archive": { + "aid": "1456450441", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV1Yi421a7FC", + "cover": "http://i1.hdslb.com/bfs/archive/b56700e0a1d28ecff2ff135a7cc51e9b09cace79.jpg", + "desc": "用到的配件:\n·带有热插拔轴体功能的任何全新\u0026二手键盘 只要功能正常即可\n·追求极致性价比的 可以直接买剪线键盘进行改造\n·TFS-1脚踏脚踩开关(我买的3.2一个)\n要注意这些脚踏开关有可能是3线 分为常闭和常开\n对于这个型号的开关 我接的是红线+白线 为踩下触发\n·焊油(推荐针管式单手操作)", + "disable_preview": 0, + "duration_text": "06:01", + "jump_url": "//www.bilibili.com/video/BV1Yi421a7FC/", + "stat": { + "danmaku": "149", + "play": "2.7万" + }, + "title": "商家别看!脚踩键盘DIY超值方案?市场售价凭啥那么贵!", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 161, + "forbidden": false + }, + "forward": { + "count": 17, + "forbidden": false + }, + "like": { + "count": 2699, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + { + "basic": { + "comment_id_str": "966495069003579398", + "comment_type": 17, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "966495069003579398" + }, + "id_str": "966495069003579398", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "946974" + }, + "face": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/946974/dynamic", + "label": "", + "mid": 946974, + "name": "影视飓风", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "昨天 12:14", + "pub_ts": 1723868069, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1975248000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png", + "label_theme": "ten_annual_vip", + "path": "", + "text": "十年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "周末啦,希望大家喜欢这期科普分享!我们的官网也加上了电影节的科普和信息汇总,欢迎大家取用~", + "text": "周末啦,希望大家喜欢这期科普分享!我们的官网也加上了电影节的科普和信息汇总,欢迎大家取用~", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "周末啦,希望大家喜欢这期科普分享!我们的官网也加上了电影节的科普和信息汇总,欢迎大家取用~" + }, + "major": null, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 101, + "forbidden": false + }, + "forward": { + "count": 7, + "forbidden": false + }, + "like": { + "count": 5247, + "forbidden": false, + "status": false + } + } + }, + "orig": { + "basic": { + "comment_id_str": "", + "comment_type": 0, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "" + }, + "id_str": "966197633939931139", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "946974" + }, + "face": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/946974/dynamic", + "label": "", + "mid": 946974, + "name": "影视飓风", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_time": "", + "pub_ts": 1723798817, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1975248000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png", + "label_theme": "ten_annual_vip", + "path": "", + "text": "十年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "挺久没有更新的看懂电影系列!", + "text": "挺久没有更新的看懂电影系列!", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "挺久没有更新的看懂电影系列!" + }, + "major": { + "archive": { + "aid": "1506437840", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV13S42197ja", + "cover": "http://i1.hdslb.com/bfs/archive/50d4705b2d804a76f3c19af269dd7804479aa94e.jpg", + "desc": "国内外总共有3000多个大大小小的电影节。那么,短片可以参加电影节吗?什么时候投递获奖概率才大一些?这次我们想和你分享一些投递和参加电影节的门道。我们还整理了一份有关电影节的科普文档,可以来我们的官网看看:https://filmfestival.ysjf.com/。\n如果你喜欢这期视频,请多多支持我们,并将视频分享给其他朋友一起看看!", + "disable_preview": 0, + "duration_text": "10:55", + "jump_url": "//www.bilibili.com/video/BV13S42197ja/", + "stat": { + "danmaku": "2067", + "play": "64.1万" + }, + "title": "全世界3000多个电影节,都在办些啥?", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + "type": "DYNAMIC_TYPE_FORWARD", + "visible": true + }, + { + "basic": { + "comment_id_str": "37185041", + "comment_type": 12, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "37185041" + }, + "id_str": "966484129969340422", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "407045223" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", + "fan": { + "color": "", + "color_format": null, + "is_fan": false, + "num_prefix": "", + "num_str": "", + "number": 0 + }, + "id": 28, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=407045223\u0026native.theme=1\u0026navhide=1", + "name": "2233娘", + "type": 1 + }, + "face": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/407045223/dynamic", + "label": "", + "mid": 407045223, + "name": "二次元的中科院物理所", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了文章", + "pub_location_text": "", + "pub_time": "昨天 11:32", + "pub_ts": 1723865522, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1745769600000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "article": { + "covers": [ + "https://i0.hdslb.com/bfs/article/708ab38ac38df8fe7851a63c0258fa64407045223.jpg" + ], + "desc": "经历过密码解锁和手势解锁后 真感慨指纹解锁是天才的创造 可惜遇到湿手油手经常失效 甚至擦干了还是这样 这是为什么呢问答导航Q1 鸡蛋在母鸡体内有气室吗?Q2 为什么弹簧是螺旋型的?Q3 闪电为什么总是自上而下,有没有自下而上的闪电呢?Q4 当一束光使电子发生了能级跃迁,原先的光子去哪儿了,消失了吗?Q5 为什么有茶叶的水在转时茶叶会趋向中间而不是两边呢?Q6 为什么塑料相比于其它物质,更容易起静电?Q7 为什么会有空集?空集的存在有什么物理意义? Q8 为什么有纹理的木擦了木蜡油之后会纹理变深,更容易被看", + "id": 37185041, + "jump_url": "//www.bilibili.com/read/cv37185041/", + "label": "16.3万阅读", + "title": "手指沾水擦干但是指纹识别还是失败,这是什么原因?| No.422" + }, + "type": "MAJOR_TYPE_ARTICLE" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 23, + "forbidden": false + }, + "forward": { + "count": 7, + "forbidden": false + }, + "like": { + "count": 727, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_ARTICLE", + "visible": true + }, + { + "basic": { + "comment_id_str": "966475883631083553", + "comment_type": 17, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "966475883631083553" + }, + "id_str": "966475883631083553", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "layers": [ + { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_animation": { + "webp_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp" + }, + "src_type": 1 + } + }, + "res_type": 4 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + } + ], + "mid": "233114659" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/garb/bb140043341137b879e957d09b649ce7c3257820.png", + "fan": { + "color": "#903AC2", + "color_format": { + "colors": [ + "#903AC2FF", + "#903AC2FF" + ], + "end_point": "0,100", + "gradients": [ + 0, + 100 + ], + "start_point": "0,0" + }, + "is_fan": true, + "num_prefix": "NO.", + "num_str": "000001", + "number": 1 + }, + "id": 1706163888001, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=1706163888001\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=233114659\u0026native.theme=1\u0026navhide=1", + "name": "龙腾啾跃-动态卡片粉丝", + "type": 3 + }, + "face": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/233114659/dynamic", + "label": "", + "mid": 233114659, + "name": "碧蓝航线", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png", + "image_enhance": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp", + "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/3052b412defbbc7704e887fefde8de539e8027c5.png", + "n_pid": 1987, + "name": "碧蓝航线2020", + "pid": 1987 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "昨天 11:00", + "pub_ts": 1723863602, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1729526400000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "恭喜", + "text": "恭喜", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@两百斤的橘猫猫0w0", + "rid": "8391364", + "text": "@两百斤的橘猫猫0w0", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "@一位隐身的Z23厨", + "rid": "382382091", + "text": "@一位隐身的Z23厨", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "@默涛默随波", + "rid": "230373473", + "text": "@默涛默随波", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "等8位同学中奖,已私信通知,详情请点击抽奖查看。", + "text": "等8位同学中奖,已私信通知,详情请点击抽奖查看。", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "恭喜@两百斤的橘猫猫0w0@一位隐身的Z23厨@默涛默随波等8位同学中奖,已私信通知,详情请点击抽奖查看。" + }, + "major": null, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 227, + "forbidden": false + }, + "forward": { + "count": 20, + "forbidden": false + }, + "like": { + "count": 3126, + "forbidden": false, + "status": false + } + } + }, + "orig": { + "basic": { + "comment_id_str": "", + "comment_type": 0, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "" + }, + "id_str": "963893770559946786", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "layers": [ + { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_animation": { + "webp_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp" + }, + "src_type": 1 + } + }, + "res_type": 4 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + } + ], + "mid": "233114659" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/garb/bb140043341137b879e957d09b649ce7c3257820.png", + "fan": { + "color": "#903AC2", + "color_format": { + "colors": [ + "#903AC2FF", + "#903AC2FF" + ], + "end_point": "0,100", + "gradients": [ + 0, + 100 + ], + "start_point": "0,0" + }, + "is_fan": true, + "num_prefix": "NO.", + "num_str": "000001", + "number": 1 + }, + "id": 1706163888001, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=1706163888001\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=233114659\u0026native.theme=1\u0026navhide=1", + "name": "龙腾啾跃-动态卡片粉丝", + "type": 3 + }, + "face": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/233114659/dynamic", + "label": "", + "mid": 233114659, + "name": "碧蓝航线", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png", + "image_enhance": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp", + "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/3052b412defbbc7704e887fefde8de539e8027c5.png", + "n_pid": 1987, + "name": "碧蓝航线2020", + "pid": 1987 + }, + "pub_action": "", + "pub_time": "", + "pub_ts": 1723262407, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1729526400000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": { + "common": { + "button": { + "jump_style": { + "icon_url": "", + "text": "进入" + }, + "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", + "type": 1 + }, + "cover": "https://i0.hdslb.com/bfs/game/b141a7690c226a0eae66518c713d3af62613b21d.png", + "desc1": "养成", + "desc2": "指挥官,欢迎回港", + "head_text": "相关游戏", + "id_str": "97", + "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", + "style": 1, + "sub_type": "game", + "title": "碧蓝航线" + }, + "type": "ADDITIONAL_TYPE_COMMON" + }, + "desc": { + "rich_text_nodes": [ + { + "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF", + "orig_text": "#碧蓝航线#", + "text": "#碧蓝航线#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": " ", + "text": " ", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "互动抽奖", + "rid": "312103", + "text": "互动抽奖", + "type": "RICH_TEXT_NODE_TYPE_LOTTERY" + }, + { + "orig_text": " \n兰夜放灯祈相守,\n纤手弄糕思今宵。\n\n关注", + "text": " \n兰夜放灯祈相守,\n纤手弄糕思今宵。\n\n关注", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@碧蓝航线", + "rid": "233114659", + "text": "@碧蓝航线", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": " 并转发该内容,我们将于8月17日抽取3位指挥官送出【JUUs时间 花园Q版手办】,抽取5位指挥官送出【心智魔方-系列浴球(随机一款)】。\n\n金风玉露,值此良宵,愿与君共度~", + "text": " 并转发该内容,我们将于8月17日抽取3位指挥官送出【JUUs时间 花园Q版手办】,抽取5位指挥官送出【心智魔方-系列浴球(随机一款)】。\n\n金风玉露,值此良宵,愿与君共度~", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "#碧蓝航线# 互动抽奖 \n兰夜放灯祈相守,\n纤手弄糕思今宵。\n\n关注@碧蓝航线 并转发该内容,我们将于8月17日抽取3位指挥官送出【JUUs时间 花园Q版手办】,抽取5位指挥官送出【心智魔方-系列浴球(随机一款)】。\n\n金风玉露,值此良宵,愿与君共度~" + }, + "major": { + "draw": { + "id": 324938558, + "items": [ + { + "height": 3038, + "size": 2025.2646, + "src": "http://i0.hdslb.com/bfs/new_dyn/b0068d1603aee2849ca46a58642fa99e233114659.jpg", + "tags": [], + "width": 5400 + }, + { + "height": 5063, + "size": 7377.1143, + "src": "http://i0.hdslb.com/bfs/new_dyn/c047aafcf90a48b578a63c3e1b86c1de233114659.jpg", + "tags": [], + "width": 9000 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + "type": "DYNAMIC_TYPE_FORWARD", + "visible": true + }, + { + "basic": { + "comment_id_str": "1456253104", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "1456253104" + }, + "id_str": "966374603744083976", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_animation": { + "webp_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" + }, + "src_type": 1 + } + }, + "res_type": 4 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "686127" + }, + "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/686127/dynamic", + "label": "", + "mid": 686127, + "name": "籽岷", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", + "image_enhance": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", + "image_enhance_frame": "", + "n_pid": 2066, + "name": "百年大会员", + "pid": 2066 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "昨天 04:27", + "pub_ts": 1723840021, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 4845196800000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/c16005a5b39164b3536cbd45618a5edd597a1c51.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/Pzrd8zmpQD.png", + "label_theme": "hundred_annual_vip", + "path": "", + "text": "百年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "archive": { + "aid": "1456253104", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV1ai421h7nT", + "cover": "http://i1.hdslb.com/bfs/archive/0245f30593e2963b883cd5953881034ad033fbd5.jpg", + "desc": "https://www.minecraft.net/en-us/article/minecraft-snapshot-24w33a", + "disable_preview": 0, + "duration_text": "16:22", + "jump_url": "//www.bilibili.com/video/BV1ai421h7nT/", + "stat": { + "danmaku": "2149", + "play": "24.5万" + }, + "title": "收纳袋、红石、矿车大改 我的世界新版本介绍 1.21.2 24w33a", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": { + "id": 1028161, + "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1028161\u0026topic_name=%E6%95%B4%E7%82%B9%E7%94%B5%E5%AD%90%E6%A6%A8%E8%8F%9C", + "name": "整点电子榨菜" + } + }, + "module_interaction": { + "items": [ + { + "desc": { + "rich_text_nodes": [ + { + "orig_text": "名字永远是个谜:", + "rid": "2022349482", + "text": "名字永远是个谜:", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "我们轨道交通圈有福了啊啊啊啊啊啊啊!", + "text": "我们轨道交通圈有福了啊啊啊啊啊啊啊!", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "我们轨道交通圈有福了啊啊啊啊啊啊啊!" + }, + "type": 1 + } + ] + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 921, + "forbidden": false + }, + "forward": { + "count": 51, + "forbidden": false + }, + "like": { + "count": 23138, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + { + "basic": { + "comment_id_str": "325694432", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "325694432" + }, + "id_str": "966306597269667840", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "485703766" + }, + "face": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/485703766/dynamic", + "label": "", + "mid": 485703766, + "name": "英伟达GeForce", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "昨天 00:03", + "pub_ts": 1723824187, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 2000563200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", + "label_theme": "ten_annual_vip", + "path": "", + "text": "十年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "直面天命,还有 3 天!\nRTX. ON!\n\n投稿来自于:Bilibili", + "text": "直面天命,还有 3 天!\nRTX. ON!\n\n投稿来自于:Bilibili", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@祗殁 ", + "rid": "12299496", + "text": "@祗殁 ", + "type": "RICH_TEXT_NODE_TYPE_AT" + } + ], + "text": "直面天命,还有 3 天!\nRTX. ON!\n\n投稿来自于:Bilibili@祗殁 " + }, + "major": { + "draw": { + "id": 325694432, + "items": [ + { + "height": 1280, + "size": 59.246094, + "src": "http://i0.hdslb.com/bfs/new_dyn/2e42c52d5e1383fe443f0984a41a9624485703766.jpg", + "tags": [], + "width": 1282 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 115, + "forbidden": false + }, + "forward": { + "count": 3, + "forbidden": false + }, + "like": { + "count": 876, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + { + "basic": { + "comment_id_str": "325690655", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "325690655" + }, + "id_str": "966298866306515029", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.375, + "width": 1.375 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "layers": [ + { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.787, + "width": 0.787 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.6875, + "axis_y": 0.6875, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1.375, + "width": 1.375 + } + }, + "layer_config": { + "tags": { + "PENDENT_LAYER": {} + } + }, + "resource": { + "res_animation": { + "webp_src": { + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp" + }, + "src_type": 1 + } + }, + "res_type": 4 + }, + "visible": true + } + ] + }, + { + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.7560000000000001, + "axis_y": 0.7726666666666667, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + } + ], + "mid": "233114659" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/garb/bb140043341137b879e957d09b649ce7c3257820.png", + "fan": { + "color": "#903AC2", + "color_format": { + "colors": [ + "#903AC2FF", + "#903AC2FF" + ], + "end_point": "0,100", + "gradients": [ + 0, + 100 + ], + "start_point": "0,0" + }, + "is_fan": true, + "num_prefix": "NO.", + "num_str": "000001", + "number": 1 + }, + "id": 1706163888001, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=1706163888001\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=233114659\u0026native.theme=1\u0026navhide=1", + "name": "龙腾啾跃-动态卡片粉丝", + "type": 3 + }, + "face": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/233114659/dynamic", + "label": "", + "mid": 233114659, + "name": "碧蓝航线", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png", + "image_enhance": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp", + "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/3052b412defbbc7704e887fefde8de539e8027c5.png", + "n_pid": 1987, + "name": "碧蓝航线2020", + "pid": 1987 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "2天前", + "pub_ts": 1723822387, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1729526400000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": { + "common": { + "button": { + "jump_style": { + "icon_url": "", + "text": "进入" + }, + "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", + "type": 1 + }, + "cover": "https://i0.hdslb.com/bfs/game/b141a7690c226a0eae66518c713d3af62613b21d.png", + "desc1": "养成", + "desc2": "指挥官,欢迎回港", + "head_text": "相关游戏", + "id_str": "97", + "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", + "style": 1, + "sub_type": "game", + "title": "碧蓝航线" + }, + "type": "ADDITIONAL_TYPE_COMMON" + }, + "desc": { + "rich_text_nodes": [ + { + "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF", + "orig_text": "#碧蓝航线#", + "text": "#碧蓝航线#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": " ", + "text": " ", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF%E6%BC%AB%E5%B1%95", + "orig_text": "#碧蓝航线漫展#", + "text": "#碧蓝航线漫展#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": " ", + "text": " ", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "jump_url": "//search.bilibili.com/all?keyword=2024%E6%B8%AF%E5%8C%BA%E7%9B%9B%E5%A4%8F%E6%B8%85%E5%87%89%E8%8A%82", + "orig_text": "#2024港区盛夏清凉节#", + "text": "#2024港区盛夏清凉节#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": "\n◆ 「港区盛夏清凉节」长沙站·街区快闪 到达!◆ \n\n碧蓝夏日,映照专属的街景~\n街区快闪即将开启,\n与少女们一同踏上这场特别的城市漫步之旅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。", + "text": "\n◆ 「港区盛夏清凉节」长沙站·街区快闪 到达!◆ \n\n碧蓝夏日,映照专属的街景~\n街区快闪即将开启,\n与少女们一同踏上这场特别的城市漫步之旅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "#碧蓝航线# #碧蓝航线漫展# #2024港区盛夏清凉节#\n◆ 「港区盛夏清凉节」长沙站·街区快闪 到达!◆ \n\n碧蓝夏日,映照专属的街景~\n街区快闪即将开启,\n与少女们一同踏上这场特别的城市漫步之旅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。" + }, + "major": { + "draw": { + "id": 325690655, + "items": [ + { + "height": 6000, + "size": 2737.6729, + "src": "http://i0.hdslb.com/bfs/new_dyn/722dc5e7eba3c3f6861b294f6bf3020c233114659.jpg", + "tags": [], + "width": 4000 + }, + { + "height": 4000, + "size": 4852.4023, + "src": "http://i0.hdslb.com/bfs/new_dyn/b04110f894184880666ee8b204000846233114659.jpg", + "tags": [], + "width": 6000 + }, + { + "height": 4000, + "size": 3941.9678, + "src": "http://i0.hdslb.com/bfs/new_dyn/8ce3c1e6f2d33a47d42f35193b9e5f55233114659.jpg", + "tags": [], + "width": 6000 + }, + { + "height": 4000, + "size": 4461.9707, + "src": "http://i0.hdslb.com/bfs/new_dyn/ab9a5bf2215f88fed6026d67d98ec901233114659.jpg", + "tags": [], + "width": 6000 + }, + { + "height": 4000, + "size": 3137.0205, + "src": "http://i0.hdslb.com/bfs/new_dyn/18e62cf8ebc7c07b99e042ac4cdeeaaa233114659.jpg", + "tags": [], + "width": 6000 + }, + { + "height": 4000, + "size": 9561.615, + "src": "http://i0.hdslb.com/bfs/new_dyn/1036f447fcbec195e717e2a5b3091a73233114659.jpg", + "tags": [], + "width": 6000 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + }, + "module_interaction": { + "items": [ + { + "desc": { + "rich_text_nodes": [ + { + "orig_text": "豌豆羹:", + "rid": "3493280973064560", + "text": "豌豆羹:", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "大帝皮肤加彩蛋!", + "text": "大帝皮肤加彩蛋!", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "大帝皮肤加彩蛋!" + }, + "type": 1 + } + ] + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 446, + "forbidden": false + }, + "forward": { + "count": 47, + "forbidden": false + }, + "like": { + "count": 4352, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + { + "basic": { + "comment_id_str": "966281785469042740", + "comment_type": 17, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "966281785469042740" + }, + "id_str": "966281785469042740", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i1.hdslb.com/bfs/face/21426275f3d3149b96b88783275205ba574c09e3.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 3, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "178429408" + }, + "face": "https://i1.hdslb.com/bfs/face/21426275f3d3149b96b88783275205ba574c09e3.jpg", + "face_nft": false, + "following": true, + "jump_url": "//space.bilibili.com/178429408/dynamic", + "label": "", + "mid": 178429408, + "name": "老弟一号", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "2天前", + "pub_ts": 1723818410, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1728576000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/0DFy9BHgwE.gif", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d7e624d13d3e134251e4174a7318c19a8edbd71.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/uckjAv3Npy.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "不管怎么样,我先把香槟开了", + "text": "不管怎么样,我先把香槟开了", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "emoji": { + "icon_url": "https://i0.hdslb.com/bfs/emote/bf7e00ecab02171f8461ee8cf439c73db9797748.png", + "size": 1, + "text": "[脱单doge]", + "type": 1 + }, + "orig_text": "[脱单doge]", + "text": "[脱单doge]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + }, + { + "orig_text": "要是褒姒,直播抽一百个爵柏电源", + "text": "要是褒姒,直播抽一百个爵柏电源", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "不管怎么样,我先把香槟开了[脱单doge]要是褒姒,直播抽一百个爵柏电源" + }, + "major": null, + "topic": null + }, + "module_interaction": { + "items": [ + { + "desc": { + "rich_text_nodes": [ + { + "orig_text": "芊芊老猫的日常:", + "rid": "1284100140", + "text": "芊芊老猫的日常:", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "还是好人多啊", + "text": "还是好人多啊", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "emoji": { + "icon_url": "https://i0.hdslb.com/bfs/emote/4683fd9ffc925fa6423110979d7dcac5eda297f4.png", + "size": 1, + "text": "[OK]", + "type": 1 + }, + "orig_text": "[OK]", + "text": "[OK]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + } + ], + "text": "还是好人多啊[OK]" + }, + "type": 1 + } + ] + }, + "module_more": { + "three_point_items": [ + { + "label": "取消关注", + "type": "THREE_POINT_FOLLOWING" + }, + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 156, + "forbidden": false + }, + "forward": { + "count": 1, + "forbidden": false + }, + "like": { + "count": 1367, + "forbidden": false, + "status": false + } + } + }, + "orig": { + "basic": { + "comment_id_str": "", + "comment_type": 0, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "" + }, + "id_str": "966274874613956608", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i2.hdslb.com/bfs/face/4c9095a6fc7d6ef7bf97ee1c65767f537763c60c.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + }, + { + "general_spec": { + "pos_spec": { + "axis_x": 0.8000000000000002, + "axis_y": 0.8000000000000002, + "coordinate_pos": 1 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 0.41666666666666663, + "width": 0.41666666666666663 + } + }, + "layer_config": { + "tags": { + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "background-color": "rgb(255,255,255)", + "border": "2px solid rgba(255,255,255,1)", + "borderRadius": "50%", + "boxSizing": "border-box" + } + } + }, + "ICON_LAYER": {} + } + }, + "resource": { + "res_image": { + "image_src": { + "local": 4, + "src_type": 2 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "652239032" + }, + "face": "https://i2.hdslb.com/bfs/face/4c9095a6fc7d6ef7bf97ee1c65767f537763c60c.jpg", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/652239032/dynamic", + "label": "", + "mid": 652239032, + "name": "IGN中国", + "official_verify": { + "desc": "", + "type": 1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_time": "", + "pub_ts": 1723816801, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 0, + "avatar_subscript_url": "", + "due_date": 0, + "label": { + "bg_color": "", + "bg_style": 0, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", + "label_theme": "", + "path": "", + "text": "", + "text_color": "", + "use_img_label": true + }, + "nickname_color": "", + "status": 0, + "theme_type": 0, + "type": 0 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "《黑神话:悟空》绝对可以说是一座中国游戏行业的里程碑,它所呈现的优秀品质对得起这四年来它背负的所有期待,这是真正意义上放在全球市场也是极具竞争力的国产游戏,而游戏科学也将在此役之后毫无疑问成为全球顶尖ARPG游戏开发商之一。", + "text": "《黑神话:悟空》绝对可以说是一座中国游戏行业的里程碑,它所呈现的优秀品质对得起这四年来它背负的所有期待,这是真正意义上放在全球市场也是极具竞争力的国产游戏,而游戏科学也将在此役之后毫无疑问成为全球顶尖ARPG游戏开发商之一。", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "《黑神话:悟空》绝对可以说是一座中国游戏行业的里程碑,它所呈现的优秀品质对得起这四年来它背负的所有期待,这是真正意义上放在全球市场也是极具竞争力的国产游戏,而游戏科学也将在此役之后毫无疑问成为全球顶尖ARPG游戏开发商之一。" + }, + "major": { + "archive": { + "aid": "1456400345", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "icon_url": null, + "text": "投稿视频" + }, + "bvid": "BV1Ti421a7dv", + "cover": "http://i2.hdslb.com/bfs/archive/fd87a4e75738b0de1388df60f5e4ce5011b1367a.jpg", + "desc": "《黑神话:悟空》绝对可以说是一座中国游戏行业的里程碑,它所呈现的优秀品质对得起这四年来它背负的所有期待,这是真正意义上放在全球市场也是极具竞争力的国产游戏,我相信它会成为今年年度游戏的有力竞争者,而游戏科学也将在此役之后毫无疑问成为全球顶尖ARPG游戏开发商之一。", + "disable_preview": 0, + "duration_text": "10:00", + "jump_url": "//www.bilibili.com/video/BV1Ti421a7dv/", + "stat": { + "danmaku": "4.6万", + "play": "595.1万" + }, + "title": "【IGN】10分,《黑神话:悟空》评测:踏平坎坷成大道", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + "type": "DYNAMIC_TYPE_FORWARD", + "visible": true + } + ], + "offset": "966281785469042740", + "update_baseline": "966888011247648768", + "update_num": 5 + } +} +``` + +</details> + +## 检测是否有新动态 + +> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all/update + +*请求方式:GET* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| - | - | - | - | - | +| type | str | 动态类型 | 不必要 | 默认为 `all` | +| update_baseline | id | 更新基线 | 必要 | 用于检测是否有新动态, 默认为上次请求 [获取全部动态列表](#获取全部动态列表) 返回的 `update_baseline`, 实测填 `0` 也可正常获取 | +| web_location | str | 333.1365 | 不必要 | | + +**JSON回复:** + +根: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| code | num | 返回值 | 0: 成功<br />-101: 账号未登录<br />-400: 请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` : + +| 字段 | 类型 | 内容 | 备注 | +| - | - | - | - | +| update_num | num | 有新动态的数量 | | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all/update' \ +--data-urlencode 'update_baseline=114514' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "update_num": 9 + } +} +``` + +</details> \ No newline at end of file diff --git a/docs/dynamic/atlist.md b/docs/dynamic/atlist.md new file mode 100644 index 0000000..a73734f --- /dev/null +++ b/docs/dynamic/atlist.md @@ -0,0 +1,238 @@ +# 根据关键字搜索用户 (at别人时的填充列表) + +**注意关键字不一定顺序匹配,如最后示例** + +> https://api.bilibili.com/x/polymer/web-dynamic/v1/mention/search + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ---------- | ------ | ---------------------------------- | +| keyword | str | 搜索关键字 | 非必要 | 若无此项,则返回所有关注用户的信息 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功<br />-101:账号未登录 | +| message | str | 错误信息 | 成功时为 `0` | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ----- | -------- | ---------------------------------------------- | +| groups | array | 用户分组 | 根据是否关注该用户来分组,未找到用户时为空数组 | + +`groups`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 分组1 | | +| n | obj | 分组(n+1) | | +| …… | obj | …… | …… | + +`groups`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | ---------------- | ------------------------ | +| group_name | str | 分组名称 | `我的关注`或`其他` | +| group_type | num | 分组类型 | 2:我的关注<br />4:其他 | +| items | array | 搜索到的用户信息 | 按照认证状态与粉丝数排序 | + +`items`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 用户1 | | +| n | obj | 用户(n+1) | | +| …… | obj | …… | …… | + +`items`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------------- | ---- | ------------ | ---------------------------------------- | +| face | str | 用户头像url | | +| fans | num | 用户粉丝数 | | +| name | str | 用户昵称 | | +| official_verify_type | num | 用户认证状态 | -1:无<br />0:个人认证<br />1:机构认证 | +| uid | str | 用户mid | | + +**示例:** + +搜索关键字为`社会易`的用户 + +```shell +curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/mention/search' \ +--data-urlencode 'keyword=社会易' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "groups": [ + { + "group_name": "我的关注", + "group_type": 2, + "items": [ + { + "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "fans": 3613, + "name": "社会易姐QwQ", + "official_verify_type": -1, + "uid": "293793435" + } + ] + }, + { + "group_name": "其他", + "group_type": 4, + "items": [ + { + "face": "https://i0.hdslb.com/bfs/face/dbc456bdec5e7a4806c9d0311d95ebcc6be674cf.jpg", + "fans": 23464, + "name": "社会易老师", + "official_verify_type": -1, + "uid": "484031754" + }, + { + "face": "https://i1.hdslb.com/bfs/face/5497859a550a017d0a51c640d232c539c2f48991.jpg", + "fans": 11, + "name": "栄禧貿易株式会社", + "official_verify_type": -1, + "uid": "4991467" + }, + { + "face": "https://i2.hdslb.com/bfs/face/311cecf9298158b8a5f47ed3e641328ab5c0cfcd.jpg", + "fans": 10, + "name": "社会李易儒", + "official_verify_type": -1, + "uid": "442101413" + }, + { + "face": "https://i2.hdslb.com/bfs/face/2dad05e4748b5e91e1ec5d3c5d4f0904a5bcdaf0.jpg", + "fans": 8, + "name": "日本国立貿易株式会社", + "official_verify_type": -1, + "uid": "3546589855484501" + }, + { + "face": "http://i0.hdslb.com/bfs/face/2ae12d7f71173baa8e00c4cfe97acb5a3de31566.jpg", + "fans": 6, + "name": "社会小伙肖子易", + "official_verify_type": -1, + "uid": "250129011" + }, + { + "face": "https://i2.hdslb.com/bfs/face/1ebb0d4aa8e2c4b532f82983503ec38b62a1820f.jpg", + "fans": 4, + "name": "社会主义接班人小易", + "official_verify_type": -1, + "uid": "486568790" + }, + { + "face": "http://i0.hdslb.com/bfs/face/dccb52f3c15ba1bb99aac3c86e9825842cc95295.jpg", + "fans": 2, + "name": "社会你易易", + "official_verify_type": -1, + "uid": "497214639" + }, + { + "face": "https://i1.hdslb.com/bfs/face/1902cc0b07ab4a5de6110f5adb2691cbf7051f2b.jpg", + "fans": 1, + "name": "社会打工不容易", + "official_verify_type": -1, + "uid": "3546742186314202" + }, + { + "face": "https://i0.hdslb.com/bfs/face/19ee1b5975969a47ba085cd1f628d86a479b9950.jpg", + "fans": 0, + "name": "社会交易", + "official_verify_type": -1, + "uid": "3493291412687622" + }, + { + "face": "https://i0.hdslb.com/bfs/face/de6afbda484e114b7cedeb621c3cbbaef7800988.jpg", + "fans": 0, + "name": "不谦易会社恐", + "official_verify_type": -1, + "uid": "1602175830" + }, + { + "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", + "fans": 8, + "name": "社会易总", + "official_verify_type": -1, + "uid": "155817540" + }, + { + "face": "https://i0.hdslb.com/bfs/face/member/noface.jpg", + "fans": 0, + "name": "社会存在与社会易逝", + "official_verify_type": -1, + "uid": "3546578331634371" + }, + { + "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", + "fans": 0, + "name": "社会易姐QAQ", + "official_verify_type": -1, + "uid": "1983403996" + }, + { + "face": "http://i1.hdslb.com/bfs/face/510cde8f4e3eb27aa50177d619a4200bb501797b.jpg", + "fans": 0, + "name": "社会易大佬人狠话不多", + "official_verify_type": -1, + "uid": "408471763" + }, + { + "face": "http://i1.hdslb.com/bfs/face/7324adb53362527a1bf5f20141a6ae4307011ea7.jpg", + "fans": 0, + "name": "社会易轩", + "official_verify_type": -1, + "uid": "384672256" + }, + { + "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", + "fans": 0, + "name": "社会易哥", + "official_verify_type": -1, + "uid": "284984452" + }, + { + "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", + "fans": 0, + "name": "社会易姐", + "official_verify_type": -1, + "uid": "249112673" + }, + { + "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", + "fans": 0, + "name": "社会易大佬", + "official_verify_type": -1, + "uid": "167967213" + } + ] + } + ] + } +} +``` + +</details> \ No newline at end of file diff --git a/docs/dynamic/basicInfo.md b/docs/dynamic/basicInfo.md new file mode 100644 index 0000000..b4b836a --- /dev/null +++ b/docs/dynamic/basicInfo.md @@ -0,0 +1,1581 @@ +# 动态基本信息 + +## 动态转发列表 + +> https://api.vc.bilibili.com/dynamic_repost/v1/dynamic_repost/repost_detail + +请求方式:GET + +==Attention: 转发列表总计超过550部分继续获取可能被限制。== + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| :--------: | :--: | :----: | :----: | :--: | +| dynamic_id | id | 动态id | 必要 | | +| offset | - | - | 非必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | -------- | +| code | num | 返回值 | 0:成功 | +| data | obj | 信息本体 | | +| message | str | 错误信息 | 默认为空 | +| msg | num | 空 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | -------------- | ------------ | +| has_more | bool | 是否还有下一页 | 每页最多20条 | +| total | int | 总计包含 | 不超过20条 | +| _gt_ | num | 0 | 作用尚不明确 | + +`data`中的`items`对象: + +由于参数过多,这里不一一列举,请自行参阅其他文件理解。 + +**示例:** + +获取`哔哩哔哩弹幕网`的动态id为`669016644742283288`动态 + +```shell +curl -G 'https://api.vc.bilibili.com/dynamic_repost/v1/dynamic_repost/repost_detail' \ +--data-urlencode 'dynamic_id=669016644742283288' +``` + +<details> +<summary>查看响应示例</summary> + +```json +{ + "code": 0, + "msg": "", + "message": "", + "data": { + "has_more": 0, + "total": 3, + "items": [ + { + "desc": { + "uid": 478909651, + "type": 1, + "rid": 669023160171702063, + "acl": 0, + "view": 0, + "repost": 0, + "like": 0, + "is_liked": 0, + "dynamic_id": 669023160201379864, + "timestamp": 1654607493, + "pre_dy_id": 669016644742283288, + "orig_dy_id": 669007814298959974, + "orig_type": 2, + "user_profile": { + "info": { + "uid": 478909651, + "uname": "-牛马之玉", + "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", + "face_nft": 0 + }, + "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": 2 + } + }, + "uid_type": 1, + "stype": 0, + "r_type": 1, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669023160201379864", + "pre_dy_id_str": "669016644742283288", + "orig_dy_id_str": "669007814298959974", + "rid_str": "669023160171702063", + "origin": { + "uid": 392836434, + "type": 2, + "rid": 196658860, + "acl": 1024, + "view": 46111, + "repost": 1446, + "like": 0, + "dynamic_id": 669007814298959974, + "timestamp": 1654603920, + "pre_dy_id": 0, + "orig_dy_id": 0, + "uid_type": 1, + "stype": 0, + "r_type": 0, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669007814298959974", + "pre_dy_id_str": "0", + "orig_dy_id_str": "0", + "rid_str": "196658860" + }, + "previous": { + "uid": 9617619, + "type": 1, + "rid": 669016644698939384, + "acl": 1024, + "view": 1381, + "repost": 3, + "like": 0, + "dynamic_id": 669016644742283288, + "timestamp": 1654605976, + "pre_dy_id": 669007814298959974, + "orig_dy_id": 669007814298959974, + "uid_type": 1, + "stype": 0, + "r_type": 1, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669016644742283288", + "pre_dy_id_str": "669007814298959974", + "orig_dy_id_str": "669007814298959974", + "rid_str": "669016644698939384" + } + }, + "card": "{ \"user\": { \"uid\": 478909651, \"uname\": \"-牛马之玉\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/member\\/noface.jpg\" }, \"item\": { \"rp_id\": 669023160171702063, \"uid\": 478909651, \"content\": \"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品...\", \"ctrl\": \"[{\\\"location\\\":2,\\\"length\\\":7,\\\"data\\\":\\\"9617619\\\",\\\"type\\\":1}]\", \"orig_dy_id\": 669007814298959974, \"pre_dy_id\": 669016644742283288, \"timestamp\": 0, \"at_uids\": [ 9617619 ], \"orig_type\": 2 }, \"origin\": \"{\\\"item\\\":{\\\"at_control\\\":\\\"[{\\\\\\\"location\\\\\\\":0,\\\\\\\"length\\\\\\\":4,\\\\\\\"data\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"type\\\\\\\":2}]\\\",\\\"category\\\":\\\"daily\\\",\\\"description\\\":\\\"互动抽奖 【上B站,看KPL】\\\\r\\\\nKPL首届夏季赛即将来袭,6月8日15:00B站55官方直播间等你来看!你最期待哪场对决呢?更有多位明星主播陪你观赛,趣味吐槽花式解说开赛首日~\\\\r\\\\n\\\\r\\\\n55直播间马超-无双飞将皮肤助力金撒不停,赛事全程天选好礼每局掉落,观赛还能领取游戏内道具!APP端参与直播间【热议】讨论,更有机会获超多奖励。\\\\r\\\\n\\\\r\\\\nKPL赛事征稿开赛日同步上线,带#KPL激励计划#话题投稿,瓜分30万奖金~\\\\r\\\\n战火将燃,谁将勇夺开门红,让我们拭目以待! [打call]\\\\n\\\\n直播间TP:https:\\\\\\/\\\\\\/live.bilibili.com\\\\\\/55 \\\\n赛事预测:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/competition?spm_id_from=444.42.0.0 \\\\n更多比赛:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/schedule?mid=0&gid=0&tid=0&time=1639785600000&spm_id_from=444.42.0.0\\\",\\\"id\\\":196658860,\\\"is_fav\\\":0,\\\"pictures\\\":[{\\\"img_height\\\":6758,\\\"img_size\\\":4693.3251953125,\\\"img_src\\\":\\\"https:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/album\\\\\\/d4fd33fe00c80938daf6f14641f15901bc4a0d17.jpg\\\",\\\"img_tags\\\":null,\\\"img_width\\\":1080}],\\\"pictures_count\\\":1,\\\"reply\\\":128,\\\"role\\\":[],\\\"settings\\\":{\\\"copy_forbidden\\\":\\\"0\\\"},\\\"source\\\":[],\\\"title\\\":\\\"\\\",\\\"upload_time\\\":1654603920},\\\"user\\\":{\\\"head_url\\\":\\\"http:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/face\\\\\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\\\",\\\"name\\\":\\\"哔哩哔哩王者荣耀赛事\\\",\\\"uid\\\":392836434,\\\"vip\\\":{\\\"avatar_subscript\\\":1,\\\"due_date\\\":1661097600000,\\\"label\\\":{\\\"label_theme\\\":\\\"annual_vip\\\",\\\"path\\\":\\\"\\\",\\\"text\\\":\\\"年度大会员\\\"},\\\"nickname_color\\\":\\\"#FB7299\\\",\\\"status\\\":1,\\\"theme_type\\\":0,\\\"type\\\":2,\\\"vip_pay_type\\\":0}}}\", \"origin_extension\": { \"lott\": \"{\\\"lottery_id\\\":96074}\" }, \"origin_extend_json\": \"{\\\"ctrl\\\":[{\\\"data\\\":\\\"4\\\",\\\"length\\\":4,\\\"location\\\":0,\\\"type\\\":2}],\\\"from\\\":{\\\"emoji_type\\\":1,\\\"from\\\":\\\"create.dynamic.web\\\",\\\"verify\\\":{\\\"aegis_enable\\\":true,\\\"asw\\\":{},\\\"cc\\\":{},\\\"csw\\\":{},\\\"dc\\\":{},\\\"gc\\\":{},\\\"ra\\\":{},\\\"sp\\\":{},\\\"sw\\\":{},\\\"ur\\\":{},\\\"verify_first\\\":true}},\\\"like_icon\\\":{\\\"action\\\":\\\"\\\",\\\"action_url\\\":\\\"\\\",\\\"end\\\":\\\"\\\",\\\"end_url\\\":\\\"\\\",\\\"start\\\":\\\"\\\",\\\"start_url\\\":\\\"\\\"},\\\"lott\\\":{\\\"lottery_id\\\":96074},\\\"topic\\\":{\\\"is_attach_topic\\\":1}}\", \"origin_user\": { \"info\": { \"uid\": 392836434, \"uname\": \"哔哩哔哩王者荣耀赛事\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\", \"face_nft\": 0 }, \"card\": { \"official_verify\": { \"type\": 1, \"desc\": \"哔哩哔哩王者荣耀赛事官方帐号\" } }, \"vip\": { \"vipType\": 2, \"vipDueDate\": 1661097600000, \"vipStatus\": 1, \"themeType\": 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\": \"\" }, \"rank\": \"10000\", \"sign\": \"哔哩哔哩王者荣耀赛事官方账号\", \"level_info\": { \"current_level\": 6 } } }", + "extend_json": "{\"\":{\"at_mids\":[{\"at_type\":2,\"mid_list\":[9617619]}],\"content\":\"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品...\",\"data_type\":2,\"need_send_msg\":true,\"publisher\":478909651},\"ctrl\":[{\"data\":\"9617619\",\"length\":7,\"location\":2,\"type\":1}],\"from\":{\"emoji_type\":1,\"from\":\"create.fast_repost\",\"verify\":{\"aegis_enable\":true,\"asw\":{},\"cc\":{},\"csw\":{},\"dc\":{},\"gc\":{},\"ra\":{},\"sp\":{},\"sw\":{},\"ur\":{}}},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"}}", + "display": { + "origin": { + "emoji_info": { + "emoji_details": [ + { + "emoji_name": "[打call]", + "id": 510, + "package_id": 1, + "state": 0, + "type": 1, + "attr": 0, + "text": "[打call]", + "url": "http://i0.hdslb.com/bfs/emote/431432c43da3ee5aab5b0e4f8931953e649e9975.png", + "meta": { + "size": 1 + }, + "mtime": 1648834168 + } + ] + }, + "relation": { + "status": 1, + "is_follow": 0, + "is_followed": 0 + } + }, + "relation": { + "status": 1, + "is_follow": 0, + "is_followed": 0 + } + } + }, + { + "desc": { + "uid": 37906788, + "type": 1, + "rid": 669022472968542526, + "acl": 0, + "view": 0, + "repost": 0, + "like": 0, + "is_liked": 0, + "dynamic_id": 669022473022341136, + "timestamp": 1654607333, + "pre_dy_id": 669016644742283288, + "orig_dy_id": 669007814298959974, + "orig_type": 2, + "user_profile": { + "info": { + "uid": 37906788, + "uname": "整天就想吃桃子", + "face": "http://i0.hdslb.com/bfs/face/388f29bb0e426d625378b99eec690775467ebb00.jpg", + "face_nft": 0 + }, + "card": { + "official_verify": { + "type": -1, + "desc": "" + } + }, + "vip": { + "vipType": 2, + "vipDueDate": 1712073600000, + "vipStatus": 1, + "themeType": 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": "" + }, + "rank": "10000", + "sign": "", + "level_info": { + "current_level": 5 + } + }, + "uid_type": 1, + "stype": 0, + "r_type": 1, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669022473022341136", + "pre_dy_id_str": "669016644742283288", + "orig_dy_id_str": "669007814298959974", + "rid_str": "669022472968542526", + "origin": { + "uid": 392836434, + "type": 2, + "rid": 196658860, + "acl": 1024, + "view": 46111, + "repost": 1446, + "like": 0, + "dynamic_id": 669007814298959974, + "timestamp": 1654603920, + "pre_dy_id": 0, + "orig_dy_id": 0, + "uid_type": 1, + "stype": 0, + "r_type": 0, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669007814298959974", + "pre_dy_id_str": "0", + "orig_dy_id_str": "0", + "rid_str": "196658860" + }, + "previous": { + "uid": 9617619, + "type": 1, + "rid": 669016644698939384, + "acl": 1024, + "view": 1381, + "repost": 3, + "like": 0, + "dynamic_id": 669016644742283288, + "timestamp": 1654605976, + "pre_dy_id": 669007814298959974, + "orig_dy_id": 669007814298959974, + "uid_type": 1, + "stype": 0, + "r_type": 1, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669016644742283288", + "pre_dy_id_str": "669007814298959974", + "orig_dy_id_str": "669007814298959974", + "rid_str": "669016644698939384" + } + }, + "card": "{ \"user\": { \"uid\": 37906788, \"uname\": \"整天就想吃桃子\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/388f29bb0e426d625378b99eec690775467ebb00.jpg\" }, \"item\": { \"rp_id\": 669022472968542526, \"uid\": 37906788, \"content\": \"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品不定时掉...\", \"ctrl\": \"[{\\\"location\\\":2,\\\"length\\\":7,\\\"data\\\":\\\"9617619\\\",\\\"type\\\":1}]\", \"orig_dy_id\": 669007814298959974, \"pre_dy_id\": 669016644742283288, \"timestamp\": 0, \"at_uids\": [ 9617619 ], \"orig_type\": 2 }, \"origin\": \"{\\\"item\\\":{\\\"at_control\\\":\\\"[{\\\\\\\"location\\\\\\\":0,\\\\\\\"length\\\\\\\":4,\\\\\\\"data\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"type\\\\\\\":2}]\\\",\\\"category\\\":\\\"daily\\\",\\\"description\\\":\\\"互动抽奖 【上B站,看KPL】\\\\r\\\\nKPL首届夏季赛即将来袭,6月8日15:00B站55官方直播间等你来看!你最期待哪场对决呢?更有多位明星主播陪你观赛,趣味吐槽花式解说开赛首日~\\\\r\\\\n\\\\r\\\\n55直播间马超-无双飞将皮肤助力金撒不停,赛事全程天选好礼每局掉落,观赛还能领取游戏内道具!APP端参与直播间【热议】讨论,更有机会获超多奖励。\\\\r\\\\n\\\\r\\\\nKPL赛事征稿开赛日同步上线,带#KPL激励计划#话题投稿,瓜分30万奖金~\\\\r\\\\n战火将燃,谁将勇夺开门红,让我们拭目以待! [打call]\\\\n\\\\n直播间TP:https:\\\\\\/\\\\\\/live.bilibili.com\\\\\\/55 \\\\n赛事预测:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/competition?spm_id_from=444.42.0.0 \\\\n更多比赛:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/schedule?mid=0&gid=0&tid=0&time=1639785600000&spm_id_from=444.42.0.0\\\",\\\"id\\\":196658860,\\\"is_fav\\\":0,\\\"pictures\\\":[{\\\"img_height\\\":6758,\\\"img_size\\\":4693.3251953125,\\\"img_src\\\":\\\"https:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/album\\\\\\/d4fd33fe00c80938daf6f14641f15901bc4a0d17.jpg\\\",\\\"img_tags\\\":null,\\\"img_width\\\":1080}],\\\"pictures_count\\\":1,\\\"reply\\\":128,\\\"role\\\":[],\\\"settings\\\":{\\\"copy_forbidden\\\":\\\"0\\\"},\\\"source\\\":[],\\\"title\\\":\\\"\\\",\\\"upload_time\\\":1654603920},\\\"user\\\":{\\\"head_url\\\":\\\"http:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/face\\\\\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\\\",\\\"name\\\":\\\"哔哩哔哩王者荣耀赛事\\\",\\\"uid\\\":392836434,\\\"vip\\\":{\\\"avatar_subscript\\\":1,\\\"due_date\\\":1661097600000,\\\"label\\\":{\\\"label_theme\\\":\\\"annual_vip\\\",\\\"path\\\":\\\"\\\",\\\"text\\\":\\\"年度大会员\\\"},\\\"nickname_color\\\":\\\"#FB7299\\\",\\\"status\\\":1,\\\"theme_type\\\":0,\\\"type\\\":2,\\\"vip_pay_type\\\":0}}}\", \"origin_extension\": { \"lott\": \"{\\\"lottery_id\\\":96074}\" }, \"origin_extend_json\": \"{\\\"ctrl\\\":[{\\\"data\\\":\\\"4\\\",\\\"length\\\":4,\\\"location\\\":0,\\\"type\\\":2}],\\\"from\\\":{\\\"emoji_type\\\":1,\\\"from\\\":\\\"create.dynamic.web\\\",\\\"verify\\\":{\\\"aegis_enable\\\":true,\\\"asw\\\":{},\\\"cc\\\":{},\\\"csw\\\":{},\\\"dc\\\":{},\\\"gc\\\":{},\\\"ra\\\":{},\\\"sp\\\":{},\\\"sw\\\":{},\\\"ur\\\":{},\\\"verify_first\\\":true}},\\\"like_icon\\\":{\\\"action\\\":\\\"\\\",\\\"action_url\\\":\\\"\\\",\\\"end\\\":\\\"\\\",\\\"end_url\\\":\\\"\\\",\\\"start\\\":\\\"\\\",\\\"start_url\\\":\\\"\\\"},\\\"lott\\\":{\\\"lottery_id\\\":96074},\\\"topic\\\":{\\\"is_attach_topic\\\":1}}\", \"origin_user\": { \"info\": { \"uid\": 392836434, \"uname\": \"哔哩哔哩王者荣耀赛事\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\", \"face_nft\": 0 }, \"card\": { \"official_verify\": { \"type\": 1, \"desc\": \"哔哩哔哩王者荣耀赛事官方帐号\" } }, \"vip\": { \"vipType\": 2, \"vipDueDate\": 1661097600000, \"vipStatus\": 1, \"themeType\": 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\": \"\" }, \"rank\": \"10000\", \"sign\": \"哔哩哔哩王者荣耀赛事官方账号\", \"level_info\": { \"current_level\": 6 } } }", + "extend_json": "{\"\":{\"at_mids\":[{\"at_type\":2,\"mid_list\":[9617619]}],\"content\":\"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品不定时掉...\",\"data_type\":2,\"need_send_msg\":true,\"publisher\":37906788},\"ctrl\":[{\"data\":\"9617619\",\"length\":7,\"location\":2,\"type\":1}],\"from\":{\"emoji_type\":1,\"from\":\"create.fast_repost\",\"verify\":{\"aegis_enable\":true,\"asw\":{},\"cc\":{},\"csw\":{},\"dc\":{},\"gc\":{},\"ra\":{},\"sp\":{},\"sw\":{},\"ur\":{}}},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"}}", + "display": { + "origin": { + "emoji_info": { + "emoji_details": [ + { + "emoji_name": "[打call]", + "id": 510, + "package_id": 1, + "state": 0, + "type": 1, + "attr": 0, + "text": "[打call]", + "url": "http://i0.hdslb.com/bfs/emote/431432c43da3ee5aab5b0e4f8931953e649e9975.png", + "meta": { + "size": 1 + }, + "mtime": 1648834168 + } + ] + }, + "relation": { + "status": 1, + "is_follow": 0, + "is_followed": 0 + } + }, + "relation": { + "status": 1, + "is_follow": 0, + "is_followed": 0 + } + } + }, + { + "desc": { + "uid": 586724890, + "type": 1, + "rid": 669019754258423810, + "acl": 0, + "view": 0, + "repost": 0, + "like": 0, + "is_liked": 0, + "dynamic_id": 669019754292314181, + "timestamp": 1654606700, + "pre_dy_id": 669016644742283288, + "orig_dy_id": 669007814298959974, + "orig_type": 2, + "user_profile": { + "info": { + "uid": 586724890, + "uname": "雪羽枭白", + "face": "http://i1.hdslb.com/bfs/face/a270f0df9a621d6d7f05a0ff94c64bad5fcb6964.jpg", + "face_nft": 0 + }, + "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": 4 + } + }, + "uid_type": 1, + "stype": 0, + "r_type": 1, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669019754292314181", + "pre_dy_id_str": "669016644742283288", + "orig_dy_id_str": "669007814298959974", + "rid_str": "669019754258423810", + "origin": { + "uid": 392836434, + "type": 2, + "rid": 196658860, + "acl": 1024, + "view": 46111, + "repost": 1446, + "like": 0, + "dynamic_id": 669007814298959974, + "timestamp": 1654603920, + "pre_dy_id": 0, + "orig_dy_id": 0, + "uid_type": 1, + "stype": 0, + "r_type": 0, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669007814298959974", + "pre_dy_id_str": "0", + "orig_dy_id_str": "0", + "rid_str": "196658860" + }, + "previous": { + "uid": 9617619, + "type": 1, + "rid": 669016644698939384, + "acl": 1024, + "view": 1381, + "repost": 3, + "like": 0, + "dynamic_id": 669016644742283288, + "timestamp": 1654605976, + "pre_dy_id": 669007814298959974, + "orig_dy_id": 669007814298959974, + "uid_type": 1, + "stype": 0, + "r_type": 1, + "inner_id": 0, + "status": 1, + "dynamic_id_str": "669016644742283288", + "pre_dy_id_str": "669007814298959974", + "orig_dy_id_str": "669007814298959974", + "rid_str": "669016644698939384" + } + }, + "card": "{ \"user\": { \"uid\": 586724890, \"uname\": \"雪羽枭白\", \"face\": \"http:\\/\\/i1.hdslb.com\\/bfs\\/face\\/a270f0df9a621d6d7f05a0ff94c64bad5fcb6964.jpg\" }, \"item\": { \"rp_id\": 669019754258423810, \"uid\": 586724890, \"content\": \"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品不定时掉落,记得好好蹲守哦~明天15点,2022KPL夏季赛我们不见不散>>>网页链接\", \"ctrl\": \"[{\\\"location\\\":2,\\\"length\\\":7,\\\"data\\\":\\\"9617619\\\",\\\"type\\\":1}]\", \"orig_dy_id\": 669007814298959974, \"pre_dy_id\": 669016644742283288, \"timestamp\": 0, \"at_uids\": [ 9617619 ], \"orig_type\": 2 }, \"origin\": \"{\\\"item\\\":{\\\"at_control\\\":\\\"[{\\\\\\\"location\\\\\\\":0,\\\\\\\"length\\\\\\\":4,\\\\\\\"data\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"type\\\\\\\":2}]\\\",\\\"category\\\":\\\"daily\\\",\\\"description\\\":\\\"互动抽奖 【上B站,看KPL】\\\\r\\\\nKPL首届夏季赛即将来袭,6月8日15:00B站55官方直播间等你来看!你最期待哪场对决呢?更有多位明星主播陪你观赛,趣味吐槽花式解说开赛首日~\\\\r\\\\n\\\\r\\\\n55直播间马超-无双飞将皮肤助力金撒不停,赛事全程天选好礼每局掉落,观赛还能领取游戏内道具!APP端参与直播间【热议】讨论,更有机会获超多奖励。\\\\r\\\\n\\\\r\\\\nKPL赛事征稿开赛日同步上线,带#KPL激励计划#话题投稿,瓜分30万奖金~\\\\r\\\\n战火将燃,谁将勇夺开门红,让我们拭目以待! [打call]\\\\n\\\\n直播间TP:https:\\\\\\/\\\\\\/live.bilibili.com\\\\\\/55 \\\\n赛事预测:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/competition?spm_id_from=444.42.0.0 \\\\n更多比赛:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/schedule?mid=0&gid=0&tid=0&time=1639785600000&spm_id_from=444.42.0.0\\\",\\\"id\\\":196658860,\\\"is_fav\\\":0,\\\"pictures\\\":[{\\\"img_height\\\":6758,\\\"img_size\\\":4693.3251953125,\\\"img_src\\\":\\\"https:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/album\\\\\\/d4fd33fe00c80938daf6f14641f15901bc4a0d17.jpg\\\",\\\"img_tags\\\":null,\\\"img_width\\\":1080}],\\\"pictures_count\\\":1,\\\"reply\\\":128,\\\"role\\\":[],\\\"settings\\\":{\\\"copy_forbidden\\\":\\\"0\\\"},\\\"source\\\":[],\\\"title\\\":\\\"\\\",\\\"upload_time\\\":1654603920},\\\"user\\\":{\\\"head_url\\\":\\\"http:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/face\\\\\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\\\",\\\"name\\\":\\\"哔哩哔哩王者荣耀赛事\\\",\\\"uid\\\":392836434,\\\"vip\\\":{\\\"avatar_subscript\\\":1,\\\"due_date\\\":1661097600000,\\\"label\\\":{\\\"label_theme\\\":\\\"annual_vip\\\",\\\"path\\\":\\\"\\\",\\\"text\\\":\\\"年度大会员\\\"},\\\"nickname_color\\\":\\\"#FB7299\\\",\\\"status\\\":1,\\\"theme_type\\\":0,\\\"type\\\":2,\\\"vip_pay_type\\\":0}}}\", \"origin_extension\": { \"lott\": \"{\\\"lottery_id\\\":96074}\" }, \"origin_extend_json\": \"{\\\"ctrl\\\":[{\\\"data\\\":\\\"4\\\",\\\"length\\\":4,\\\"location\\\":0,\\\"type\\\":2}],\\\"from\\\":{\\\"emoji_type\\\":1,\\\"from\\\":\\\"create.dynamic.web\\\",\\\"verify\\\":{\\\"aegis_enable\\\":true,\\\"asw\\\":{},\\\"cc\\\":{},\\\"csw\\\":{},\\\"dc\\\":{},\\\"gc\\\":{},\\\"ra\\\":{},\\\"sp\\\":{},\\\"sw\\\":{},\\\"ur\\\":{},\\\"verify_first\\\":true}},\\\"like_icon\\\":{\\\"action\\\":\\\"\\\",\\\"action_url\\\":\\\"\\\",\\\"end\\\":\\\"\\\",\\\"end_url\\\":\\\"\\\",\\\"start\\\":\\\"\\\",\\\"start_url\\\":\\\"\\\"},\\\"lott\\\":{\\\"lottery_id\\\":96074},\\\"topic\\\":{\\\"is_attach_topic\\\":1}}\", \"origin_user\": { \"info\": { \"uid\": 392836434, \"uname\": \"哔哩哔哩王者荣耀赛事\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\", \"face_nft\": 0 }, \"card\": { \"official_verify\": { \"type\": 1, \"desc\": \"哔哩哔哩王者荣耀赛事官方帐号\" } }, \"vip\": { \"vipType\": 2, \"vipDueDate\": 1661097600000, \"vipStatus\": 1, \"themeType\": 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\": \"\" }, \"rank\": \"10000\", \"sign\": \"哔哩哔哩王者荣耀赛事官方账号\", \"level_info\": { \"current_level\": 6 } } }", + "extend_json": "{\"\":{\"at_mids\":[{\"at_type\":2,\"mid_list\":[9617619]}],\"content\":\"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品不定时掉落,记得好好蹲守哦~明天15点,2022KPL夏季赛我们不见不散>>>网页链接\",\"data_type\":2,\"need_send_msg\":true,\"publisher\":586724890},\"ctrl\":[{\"data\":\"9617619\",\"length\":7,\"location\":2,\"type\":1}],\"from\":{\"emoji_type\":1,\"from\":\"create.dynamic.web\",\"verify\":{\"aegis_enable\":true,\"asw\":{},\"cc\":{},\"csw\":{},\"dc\":{},\"gc\":{},\"ra\":{},\"sp\":{},\"sw\":{},\"ur\":{}}},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"}}", + "display": { + "origin": { + "emoji_info": { + "emoji_details": [ + { + "emoji_name": "[打call]", + "id": 510, + "package_id": 1, + "state": 0, + "type": 1, + "attr": 0, + "text": "[打call]", + "url": "http://i0.hdslb.com/bfs/emote/431432c43da3ee5aab5b0e4f8931953e649e9975.png", + "meta": { + "size": 1 + }, + "mtime": 1648834168 + } + ] + }, + "relation": { + "status": 1, + "is_follow": 0, + "is_followed": 0 + } + }, + "relation": { + "status": 1, + "is_follow": 0, + "is_followed": 0 + } + } + } + ], + "_gt_": 0 + } +} +``` +</details> + + +## 动态点赞列表 + +> https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/spec_item_likes + +请求方式:GET + +==Attention: 点赞列表总计超过25K部分继续获取可能被限制。== + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------- | ---- | ------ | ------- | ---- | +|dynamic_id|int64 | 动态id | 必须 | | +|pn|int64 | 页码 | 非必须 | | +|ps|int64 | 每页数量 | 非必须 |该值不得大于20 | + +**json回复:** +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | -------- | +| code | num | 返回值 | 0:成功 | +| data | obj | 信息本体 | | +| message | str | 错误信息 | 默认为空 | +| msg | num | 空 | | + +`data`对象: + +| 字段 | 类型 | 用途 | 备注 | +| -------- | ---- | -------------- | ------------ | +|item_likes|list |点赞信息列表主体 | | +| has_more | bool | 是否还有下一页 | 每页最多20条 | +| total_count | int | 总计点赞数 | | +| _gt_ | num | 0 | 作用尚不明确 | + +`data`中的`item_likes`对象: + +由于参数过多,这里不一一列举,请自行参阅其他文件理解。 + +**示例:** + +获取`哔哩哔哩弹幕网`的动态id为`669016644742283288`动态 +```shell +curl -G 'https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/spec_item_likes' \ +--data-urlencode 'dynamic_id=669016644742283288' +``` + +<details> +<summary>查看响应示例</summary> + +```json +{ + "code": 0, + "msg": "", + "message": "", + "data": { + "item_likes": [ + { + "uid": 660169578, + "time": 1654946013, + "face_url": "http://i0.hdslb.com/bfs/face/346ce28e99cc0a7d9cc05b0c0951957445cbcb61.jpg", + "uname": "空蓝奇观", + "user_info": { + "uid": 660169578, + "uname": "空蓝奇观", + "face": "http://i0.hdslb.com/bfs/face/346ce28e99cc0a7d9cc05b0c0951957445cbcb61.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1656604800000, + "vipStatus": 1, + "themeType": 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": "" + }, + "sign": "。。。", + "level_info": { + "current_level": 4 + } + }, + "attend": 0 + }, + { + "uid": 522318130, + "time": 1654901839, + "face_url": "http://i1.hdslb.com/bfs/face/3159660d82bf0ffc878265cd11f7bb55122848a8.jpg", + "uname": "114514号饼干机器人", + "user_info": { + "uid": 522318130, + "uname": "114514号饼干机器人", + "face": "http://i1.hdslb.com/bfs/face/3159660d82bf0ffc878265cd11f7bb55122848a8.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1655740800000, + "vipStatus": 1, + "themeType": 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": "" + }, + "sign": "", + "level_info": { + "current_level": 4 + } + }, + "attend": 0 + }, + { + "uid": 473098535, + "time": 1654874055, + "face_url": "http://i2.hdslb.com/bfs/face/ae37c4c8a7512322186eaf1c1cb170362c604215.jpg", + "uname": "花式送人头的感觉", + "user_info": { + "uid": 473098535, + "uname": "花式送人头的感觉", + "face": "http://i2.hdslb.com/bfs/face/ae37c4c8a7512322186eaf1c1cb170362c604215.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1626451200000, + "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": 32446, + "name": "EDG战队", + "image": "http://i2.hdslb.com/bfs/garb/item/422c8bd354989845bd9ed64bd00cfa1048e92580.png", + "expire": 0, + "image_enhance": "http://i2.hdslb.com/bfs/garb/item/422c8bd354989845bd9ed64bd00cfa1048e92580.png", + "image_enhance_frame": "" + }, + "sign": "", + "level_info": { + "current_level": 4 + } + }, + "attend": 0 + }, + { + "uid": 297957406, + "time": 1654870870, + "face_url": "http://i1.hdslb.com/bfs/face/c28b431177fa6faffc4b928b9506a7057f002f73.jpg", + "uname": "冷水ensq", + "user_info": { + "uid": 297957406, + "uname": "冷水ensq", + "face": "http://i1.hdslb.com/bfs/face/c28b431177fa6faffc4b928b9506a7057f002f73.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1657036800000, + "vipStatus": 1, + "themeType": 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": "" + }, + "sign": "这个人很神秘,只写了这么点东西", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 384080149, + "time": 1654869742, + "face_url": "http://i1.hdslb.com/bfs/face/74efb9ca3fc68679cb3ddbf331ceffc246f13929.jpg", + "uname": "嵇獬", + "user_info": { + "uid": 384080149, + "uname": "嵇獬", + "face": "http://i1.hdslb.com/bfs/face/74efb9ca3fc68679cb3ddbf331ceffc246f13929.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1583942400000, + "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": "" + }, + "sign": "这个人很懒,也不知道写什么\n我会一直做自己", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 666484726, + "time": 1654867375, + "face_url": "http://i1.hdslb.com/bfs/face/8e7c02c5d98d8ee52d0643227aed59b4fca1420d.jpg", + "uname": "未未成年累月", + "user_info": { + "uid": 666484726, + "uname": "未未成年累月", + "face": "http://i1.hdslb.com/bfs/face/8e7c02c5d98d8ee52d0643227aed59b4fca1420d.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1626624000000, + "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": "" + }, + "sign": "", + "level_info": { + "current_level": 3 + } + }, + "attend": 0 + }, + { + "uid": 298557818, + "time": 1654865058, + "face_url": "http://i2.hdslb.com/bfs/face/b3bea3c029e4a35788625228a8ffbcec6c00eaea.jpg", + "uname": "爱吃星河的饼干", + "user_info": { + "uid": 298557818, + "uname": "爱吃星河的饼干", + "face": "http://i2.hdslb.com/bfs/face/b3bea3c029e4a35788625228a8ffbcec6c00eaea.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1603209600000, + "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": "" + }, + "sign": "规矩,既是束缚,也是保护。", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 431901641, + "time": 1654845296, + "face_url": "http://i2.hdslb.com/bfs/face/88bf1a1c0cbbdf39032fa766e0b2324716b5315e.jpg", + "uname": "水粉墨殇", + "user_info": { + "uid": 431901641, + "uname": "水粉墨殇", + "face": "http://i2.hdslb.com/bfs/face/88bf1a1c0cbbdf39032fa766e0b2324716b5315e.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1655740800000, + "vipStatus": 1, + "themeType": 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": 5305, + "name": "明日方舟音律系列", + "image": "http://i2.hdslb.com/bfs/garb/item/615a1653281141ddf64cbb98c792ddaee78f7f40.png", + "expire": 0, + "image_enhance": "http://i2.hdslb.com/bfs/garb/item/516ecdf2d495a62f1bac31497c831b711823140c.webp", + "image_enhance_frame": "http://i2.hdslb.com/bfs/garb/item/c0751afbf950373c260254d02768eabf30ff3906.png" + }, + "sign": "", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 670417135, + "time": 1654833667, + "face_url": "http://i1.hdslb.com/bfs/face/f8fddf339016be034736c45714b52fbb148d5252.jpg", + "uname": "阿布不喜欢我", + "user_info": { + "uid": 670417135, + "uname": "阿布不喜欢我", + "face": "http://i1.hdslb.com/bfs/face/f8fddf339016be034736c45714b52fbb148d5252.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1626451200000, + "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": "" + }, + "sign": "", + "level_info": { + "current_level": 4 + } + }, + "attend": 0 + }, + { + "uid": 339203848, + "time": 1654798783, + "face_url": "http://i1.hdslb.com/bfs/face/6bead07c483681db51d519aed8b8d00de265e8ae.jpg", + "uname": "XD君233", + "user_info": { + "uid": 339203848, + "uname": "XD君233", + "face": "http://i1.hdslb.com/bfs/face/6bead07c483681db51d519aed8b8d00de265e8ae.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1620748800000, + "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": "" + }, + "sign": "大爱火柴人,我的世界和一些求生枪战游戏", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 199624899, + "time": 1654792330, + "face_url": "http://i0.hdslb.com/bfs/face/59526a5bfbe6985a0741ddaacffaee3c90c5e34a.jpg", + "uname": "猛Pink", + "user_info": { + "uid": 199624899, + "uname": "猛Pink", + "face": "http://i0.hdslb.com/bfs/face/59526a5bfbe6985a0741ddaacffaee3c90c5e34a.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1598112000000, + "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": "" + }, + "sign": "这个人很神秘,什么都看不了=●ω●=", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 451151619, + "time": 1654791995, + "face_url": "http://i0.hdslb.com/bfs/face/9322b5a5802b5c831b2382afed073f5290be6e38.jpg", + "uname": "七城关", + "user_info": { + "uid": 451151619, + "uname": "七城关", + "face": "http://i0.hdslb.com/bfs/face/9322b5a5802b5c831b2382afed073f5290be6e38.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1655827200000, + "vipStatus": 1, + "themeType": 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": 6249, + "name": "星座系列:处女座", + "image": "http://i0.hdslb.com/bfs/garb/item/cd82b1c35fe0ea221c4fd56525893bc58ec53300.png", + "expire": 0, + "image_enhance": "http://i0.hdslb.com/bfs/garb/item/cd82b1c35fe0ea221c4fd56525893bc58ec53300.png", + "image_enhance_frame": "" + }, + "sign": "强迫症", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 375385022, + "time": 1654785903, + "face_url": "http://i2.hdslb.com/bfs/face/fbdfa7917e8f874382f4b42fcccd9c7296461cb9.jpg", + "uname": "想变成魔法少女的笙绘", + "user_info": { + "uid": 375385022, + "uname": "想变成魔法少女的笙绘", + "face": "http://i2.hdslb.com/bfs/face/fbdfa7917e8f874382f4b42fcccd9c7296461cb9.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1643472000000, + "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": "" + }, + "sign": "希望自己的原创作品可以成为自活过的证明", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 291506521, + "time": 1654782383, + "face_url": "http://i1.hdslb.com/bfs/face/887f13f658cfbee23e3e200fe61755f1a8d5823c.jpg", + "uname": "星が落ちた日", + "user_info": { + "uid": 291506521, + "uname": "星が落ちた日", + "face": "http://i1.hdslb.com/bfs/face/887f13f658cfbee23e3e200fe61755f1a8d5823c.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1673884800000, + "vipStatus": 1, + "themeType": 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": 4104, + "name": "良辰美景·不问天", + "image": "http://i1.hdslb.com/bfs/garb/item/4dbf08aae75f9479a21db2bb289229b8d71631e1.png", + "expire": 0, + "image_enhance": "http://i1.hdslb.com/bfs/garb/item/253bf41272ddef301c1f6a0361abd49d772bfafc.webp", + "image_enhance_frame": "http://i1.hdslb.com/bfs/garb/item/c4934a1ffdb3865fe79b319de439af3973b53ec9.png" + }, + "sign": "一时摸鱼一时爽,一直摸鱼一直爽!", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 179333519, + "time": 1654780391, + "face_url": "http://i2.hdslb.com/bfs/face/89a58c10bf500fb7c9530ba8f28f73208c510d22.jpg", + "uname": "纳眉兹www", + "user_info": { + "uid": 179333519, + "uname": "纳眉兹www", + "face": "http://i2.hdslb.com/bfs/face/89a58c10bf500fb7c9530ba8f28f73208c510d22.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1646496000000, + "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": "" + }, + "sign": "人生", + "level_info": { + "current_level": 4 + } + }, + "attend": 0 + }, + { + "uid": 497821251, + "time": 1654780363, + "face_url": "http://i0.hdslb.com/bfs/face/a7bf301db14cb7fa094dba5f68d13faa7c5798d2.jpg", + "uname": "不器用な・ジョゼ", + "user_info": { + "uid": 497821251, + "uname": "不器用な・ジョゼ", + "face": "http://i0.hdslb.com/bfs/face/a7bf301db14cb7fa094dba5f68d13faa7c5798d2.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1683216000000, + "vipStatus": 1, + "themeType": 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": 299, + "name": "梦塔·雪谜城", + "image": "http://i0.hdslb.com/bfs/face/c93e1eeb77b1bb0753eff243d49c006bf18d69c5.png", + "expire": 0, + "image_enhance": "http://i0.hdslb.com/bfs/face/c93e1eeb77b1bb0753eff243d49c006bf18d69c5.png", + "image_enhance_frame": "" + }, + "sign": "・花无凋零之日,爱无传达之时,爱情亘古不变,紫罗兰永世长存\n・人活着就是为了樱岛麻衣\nキャ━━━━(゚∀゚)━━━━!!", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + }, + { + "uid": 1054063538, + "time": 1654779485, + "face_url": "http://i2.hdslb.com/bfs/face/bc60a7b5c3b5fd624043050a3ab15e2c4c871803.jpg", + "uname": "贪吃的ZZ", + "user_info": { + "uid": 1054063538, + "uname": "贪吃的ZZ", + "face": "http://i2.hdslb.com/bfs/face/bc60a7b5c3b5fd624043050a3ab15e2c4c871803.jpg", + "rank": "10000", + "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": "" + }, + "sign": "(ฅ>ω<*ฅ)", + "level_info": { + "current_level": 3 + } + }, + "attend": 0 + }, + { + "uid": 305663999, + "time": 1654777857, + "face_url": "http://i2.hdslb.com/bfs/face/3a2b2f84990ec182af8380ef97db8256c6ecec25.jpg", + "uname": "qw夕颜", + "user_info": { + "uid": 305663999, + "uname": "qw夕颜", + "face": "http://i2.hdslb.com/bfs/face/3a2b2f84990ec182af8380ef97db8256c6ecec25.jpg", + "rank": "10000", + "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": "" + }, + "sign": "", + "level_info": { + "current_level": 4 + } + }, + "attend": 0 + }, + { + "uid": 436616802, + "time": 1654776381, + "face_url": "http://i0.hdslb.com/bfs/face/e1ddfcdac95b39217e4710f3605005abfecb53a1.jpg", + "uname": "桐影映江边", + "user_info": { + "uid": 436616802, + "uname": "桐影映江边", + "face": "http://i0.hdslb.com/bfs/face/e1ddfcdac95b39217e4710f3605005abfecb53a1.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1664208000000, + "vipStatus": 1, + "themeType": 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": 1990, + "name": "明日方舟", + "image": "http://i0.hdslb.com/bfs/garb/item/0c8e7d627a35c378b757f39419889ef1fcc0ed9b.png", + "expire": 0, + "image_enhance": "http://i0.hdslb.com/bfs/garb/item/1815c81da71069ea3db4553cad7d233f782da2f2.webp", + "image_enhance_frame": "http://i0.hdslb.com/bfs/garb/item/ed2b4ef1da228c0b937753542b33af8f04d1d70c.png" + }, + "sign": "追寻着你的身影,从迷失的世界起航,直到深海的尽头~", + "level_info": { + "current_level": 4 + } + }, + "attend": 0 + }, + { + "uid": 266536964, + "time": 1654775142, + "face_url": "http://i2.hdslb.com/bfs/face/b15e60d6e5403075f212d5bd3d30dc0fb3016088.jpg", + "uname": "君九j", + "user_info": { + "uid": 266536964, + "uname": "君九j", + "face": "http://i2.hdslb.com/bfs/face/b15e60d6e5403075f212d5bd3d30dc0fb3016088.jpg", + "rank": "10000", + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1683648000000, + "vipStatus": 1, + "themeType": 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": 1293, + "name": "碧蓝航线", + "image": "http://i2.hdslb.com/bfs/face/2508daec59b2aaada2784f26f9c1c28069f28e43.png", + "expire": 0, + "image_enhance": "http://i2.hdslb.com/bfs/face/2508daec59b2aaada2784f26f9c1c28069f28e43.png", + "image_enhance_frame": "" + }, + "sign": "", + "level_info": { + "current_level": 5 + } + }, + "attend": 0 + } + ], + "has_more": 1, + "total_count": 2367, + "_gt_": 0 + } +} +``` + +</details> + +## 获取草稿列表 + +> https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/get_drafts + +请求方式:GET + +认证方式:Cookie(SESSDATA) + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------- | +| code | num | 返回值 | 0:成功 | +| data | obj | 信息本体 | | +| message | str | 错误信息 | 正常为"0" | +| ttl | num | 1 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ----- | -------- | ---- | +| drafts | array | 草稿列表 | | + +`drafts`列表的每一项: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | -------------------- | ------------------------------------------------------------ | +| draft_id | str | 草稿id | | +| publish_time | num | 定时发送的秒级时间戳 | | +| type | num | 动态类型 | 请参考[获取特定动态卡片信息](get_dynamic_detail.md) | +| uid | num | 自己的mid | | +| user_profile | obj | 自己的用户信息 | 请参考[用户基本信息](../user/info.md) | +| request | str | 动态内容 | 该项为json转成str,内容请参考[发表纯文本动态](publish.md#发表纯文本动态) | diff --git a/dynamic/card_info.md b/docs/dynamic/card_info.md similarity index 91% rename from dynamic/card_info.md rename to docs/dynamic/card_info.md index 0b7c8d8..d0ff84c 100644 --- a/dynamic/card_info.md +++ b/docs/dynamic/card_info.md @@ -13,12 +13,13 @@ 需注意账号转发视频投稿,其他用户的动态以及分享收藏夹等均为转发类内容,并不属于type=4300的收藏类动态等。 在type=1的转发类动态中,解析出的对象包含以下内容: -| 字段 | 类型 | 内容 | 备注 | + +| 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------- | -| user | obj | 转发者用户信息 | 包含用户名,用户id和头像 | -| item | obj | 转发相关信息 | `content`字段为转发附言 | | -| origin | str | 被转发动态信息 | 即本文档所描述的动态详细信息字段。</br>动态类型为`item`对象的`orig_type`字段 | -| origin_extend_json | str | 被转发动态补充信息 | | +| user | obj | 转发者用户信息 | 包含用户名,用户id和头像 | +| item | obj | 转发相关信息 | `content`字段为转发附言 | | +| origin | str | 被转发动态信息 | 即本文档所描述的动态详细信息字段。<br/>动态类型为`item`对象的`orig_type`字段 | +| origin_extend_json | str | 被转发动态补充信息 | | | origin_user | obj | 被转发用户信息 | | | activity_infos | obj | 被转发动态参与的活动 | | @@ -106,10 +107,11 @@ ## 在图片动态中(type=2) 在type=2的图片动态中,解析出的对象包含以下内容: -| 字段 | 类型 | 内容 | 备注 | + +| 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------- | -| item | obj | 图片动态内容 | `description`字段为文字内容</br>`pictures`字段图片 | | -| user | obj | 发布者用户信息 | 包含用户名,用户id和头像 | +| item | obj | 图片动态内容 | `description`字段为文字内容<br/>`pictures`字段图片 | | +| user | obj | 发布者用户信息 | 包含用户名,用户id和头像 | <details> @@ -166,14 +168,14 @@ </details> - ## 在文字动态中(type=4) 在type=4的文字动态中,解析出的对象包含以下内容: -| 字段 | 类型 | 内容 | 备注 | + +| 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------- | -| item | obj | 文字动态内容 | `description`字段为文字内容 | | -| user | obj | 发布者用户信息 | 包含用户名,用户id和头像 | +| item | obj | 文字动态内容 | `description`字段为文字内容 | | +| user | obj | 发布者用户信息 | 包含用户名,用户id和头像 | <details> @@ -204,9 +206,10 @@ ## 在视频投稿动态中(type=8) 在type=8的视频投稿动态中,解析出的对象包含以下内容: -| 字段 | 类型 | 内容 | 备注 | + +| 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------- | -| aid | num | 视频avid | | +| aid | num | 视频avid | | | attribute | num | `0` | [可能已弃用](https://shakaianee.top/archives/9/) | | cid | num | 视频cid | | | copyright | num | 原创信息 | 1为原创,2为转载 | @@ -215,7 +218,7 @@ | duration | num | 视频时长 | 单位秒 | | dynamic | str | 动态文字内容 | | | first_frame | str | 视频第一帧图片 | 图片链接 | -| jump_url | str | 视频跳转链接 | | +| jump_url | str | 视频跳转链接 | | | mission_id | num | 稿件参与的活动id | | | owner | obj | 动态作者信息 | 即up主 | | pic | str | 视频封面 | | @@ -223,7 +226,7 @@ | pubdate | num | 发布时间 | 时间戳 | | rights | obj | 联合投稿,是否付费等信息 | 可能用来代替原`attribute`字段 | | stat | obj | 视频数据 | 点赞投币等 | -| state | num | 视频状态 | 详情见**属性数据文档** | +| state | num | 视频状态 | 详情见**属性数据文档** | | tid | num | 视频分区编号 | | | title | str | 视频标题 | | | tname | str | 视频分区名称 | | @@ -302,7 +305,8 @@ ## 在专栏投稿动态中(type=64) 在type=64的专栏投稿动态中,解析出的对象包含以下内容: -| 字段 | 类型 | 内容 | 备注 | + +| 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------- | | id | num | 专栏的id,即cv号 | | | category | obj | 分类号和分类名称 | | @@ -313,10 +317,10 @@ | template_id | num | 模板信息 | | | state | num | 专栏状态 | | | author | obj | 作者信息 | 包含了头像挂件和勋章等 | -| reprint | num | 可能是转载 | | +| reprint | num | 可能是转载 | | | image_urls | obj | 图片链接 | | -| publish_time | num | 发布时间 | 时间戳,应该指专栏 | -| ctime | num | 发布时间 | 时间戳,应该指动态 | +| publish_time | num | 发布时间 | 时间戳,应该指专栏 | +| ctime | num | 发布时间 | 时间戳,应该指动态 | | stats | obj | 专栏数据,点赞之类 | 有点踩字段,但并未实装此功能 | | words | num | 字数 | | | origin_image_urls | obj | 源图片地址 | | @@ -448,7 +452,8 @@ ## 在音频投稿动态中(type=256) 在type=256的音频投稿动态中,解析出的对象包含以下内容: -| 字段 | 类型 | 内容 | 备注 | + +| 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------- | | id | num | 投稿编号 | 即au号 | | upId | num | 音乐人id | 与用户uid不同 | @@ -456,7 +461,7 @@ | upper | str | 上传者名称 | | | cover | str | 封面图链接 | | | author | str | 作者名称 | | -| ctime | num | 上传时间 | 时间戳的后面加了三个0 | +| ctime | num | 上传时间 | 时间戳的后面加了三个0 | | playCnt | num | 播放量 | | | intro | str | 音频介绍 | | | schema | str | 跳转链接 | 似乎并不只是url | diff --git a/dynamic/content.md b/docs/dynamic/content.md similarity index 98% rename from dynamic/content.md rename to docs/dynamic/content.md index aaef5e8..5164f4b 100644 --- a/dynamic/content.md +++ b/docs/dynamic/content.md @@ -1,13 +1,8 @@ # 动态信息 -- [获取正在直播的已关注者](#获取正在直播的已关注者) -- [获取发布新动态的已关注者](#获取发布新动态的已关注者) - ---- - ## 获取正在直播的已关注者 -> http://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users +> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users *请求方式:GET* @@ -60,7 +55,7 @@ **示例:** ```shell -curl -G 'http://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users' \ +curl -G 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users' \ --data-urlencode 'size=10' \ -b 'SESSDATA=xxx' ``` @@ -115,7 +110,7 @@ curl -G 'http://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users' \ ## 获取发布新动态的已关注者 -> http://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist +> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist *请求方式:GET* @@ -157,7 +152,7 @@ curl -G 'http://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users' \ **示例:** ```shell -curl -G 'http://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist' \ +curl -G 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist' \ -b 'SESSDATA=xxx' ``` diff --git a/docs/dynamic/detail.md b/docs/dynamic/detail.md new file mode 100644 index 0000000..a0bb866 --- /dev/null +++ b/docs/dynamic/detail.md @@ -0,0 +1,743 @@ +# 获取动态详情 + +## 动态详情 + +> https://api.bilibili.com/x/polymer/web-dynamic/v1/detail + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) (非必要) + +鉴权方式: Cookie (User-Agent) (必要), [Wbi 签名](../misc/sign/wbi.md) (非必要) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| id | num | 动态 ID | 必要 | | +| timezone_offset | num | -480 | 非必要 | | +| platform | str | 平台 | 非必要 | `web` | +| gaia_source | str | 来源 | 非必要 | `main_web` | +| features | str | 功能 | 必要 | `itemOpusStyle,opusBigCover,onlyfansVote,endFooterHidden,decorationCard,onlyfansAssetsV2,ugcDelete,onlyfansQaCard,commentsNewVersion` | +| web_location | str | `333.1368` | 非必要 | | +| x-bili-device-req-json | obj | 设备信息? | 非必要 | `{"platform":"web","device":"pc"}` | +| x-bili-web-req-json | obj | 请求信息? | 非必要 | `{"spm_id":"333.1368"}` | +| w_rid | str | Wbi 签名 | 不必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | +| wts | num | UNIX 秒级时间戳 | 不必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | + +**JSON回复:** + +根对象: + +| 字段名 | 类型 | 内容 | 备注 | +|---------|-----|------|--------------------------| +| code | num | 响应码 | 0: 成功<br/>-352: 风控校验失败<br />4101139: 4101139 | +| message | str | | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段名 | 类型 | 内容 | 备注 | +|------|-----|-----|-----| +| item | obj | | | + +`data.item`对象: + +参照 [获取动态列表](./all.md#获取动态列表) + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/detail' \ + -A 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' \ + -b 'SESSDATA=xxxxxx' \ + --url-query 'id=967717348014293017' \ + --url-query 'w_rid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ + --url-query 'wts=1724986186' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "item": { + "basic": { + "comment_id_str": "326122895", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "326122895" + }, + "id_str": "967717348014293017", + "modules": { + "module_author": { + "avatar": { + "container_size": { + "height": 1.35, + "width": 1.35 + }, + "fallback_layers": { + "is_critical_group": true, + "layers": [ + { + "general_spec": { + "pos_spec": { + "axis_x": 0.675, + "axis_y": 0.675, + "coordinate_pos": 2 + }, + "render_spec": { + "opacity": 1 + }, + "size_spec": { + "height": 1, + "width": 1 + } + }, + "layer_config": { + "is_critical": true, + "tags": { + "AVATAR_LAYER": {}, + "GENERAL_CFG": { + "config_type": 1, + "general_config": { + "web_css_style": { + "borderRadius": "50%" + } + } + } + } + }, + "resource": { + "res_image": { + "image_src": { + "placeholder": 6, + "remote": { + "bfs_style": "widget-layer-avatar", + "url": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg" + }, + "src_type": 1 + } + }, + "res_type": 3 + }, + "visible": true + } + ] + }, + "mid": "645769214" + }, + "decorate": { + "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", + "fan": { + "color": "", + "color_format": null, + "is_fan": false, + "num_prefix": "", + "num_str": "", + "number": 0 + }, + "id": 28, + "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28&isdiy=0&part=card&from=post&f_source=garb&vmid=645769214&native.theme=1&navhide=1", + "name": "2233娘", + "type": 1 + }, + "face": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/645769214/dynamic", + "label": "", + "mid": 645769214, + "name": "Session小胡", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0, + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "2024年08月20日 19:17", + "pub_ts": 1724152653, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 0, + "avatar_subscript_url": "", + "due_date": 1665158400000, + "label": { + "bg_color": "", + "bg_style": 0, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", + "label_theme": "", + "path": "", + "text": "", + "text_color": "", + "use_img_label": true + }, + "nickname_color": "", + "status": 0, + "theme_type": 0, + "type": 1 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "今天因为Linux被骂, 决定放弃支持 Windows. 而且明天要开始军训了, 将停更若干时间, 遂发此动态, 望不知.", + "text": "今天因为Linux被骂, 决定放弃支持 Windows. 而且明天要开始军训了, 将停更若干时间, 遂发此动态, 望不知.", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "今天因为Linux被骂, 决定放弃支持 Windows. 而且明天要开始军训了, 将停更若干时间, 遂发此动态, 望不知." + }, + "major": { + "draw": { + "id": 326122895, + "items": [ + { + "height": 1080, + "size": 1005.29, + "src": "http://i0.hdslb.com/bfs/new_dyn/0f6f939334104ddc347566514fa4bfa7645769214.jpg", + "tags": [], + "width": 1440 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "删除", + "modal": { + "cancel": "取消", + "confirm": "确认删除", + "content": "动态删除后将无法恢复,请谨慎操作", + "title": "要删除动态吗?" + }, + "params": { + "dyn_id_str": "967717348014293017", + "dyn_type": 2, + "rid_str": "326122895" + }, + "type": "THREE_POINT_DELETE" + } + ] + }, + "module_stat": { + "comment": { + "count": 34, + "forbidden": false + }, + "forward": { + "count": 2, + "forbidden": false + }, + "like": { + "count": 65, + "forbidden": false, + "status": true + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + } + } +} +``` + +</details> + +## 动态赞与转发列表 + +> https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/reaction + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +注: 登录任意账号即可, 若不登录则返回数为 0 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| id | num | 动态 id | 必要 | | +| offset | obj | 偏移量 | 非必要 | 用于翻页, 即响应的 `data.offset` | +| web_location | str | 333.1369 | 非必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| has_more | bool | 是否有更多 | | +| items | array | 赞与转发列表 | | +| offset | str | 偏移量 | 套了一层字符串的 JSON 对象, 用于下次请求 | +| total | num | 总数 | | + +`data` 对象中的 `items` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| action | str | 操作类型 | 赞了/转发了 | +| attend | num | 参与数 | 1: 对方仅关注了发送者<br />2: 发送者关注了对方 | +| desc | str | 描述 | | +| face | str | 头像 URL | | +| mid | num | 用户 mid | | +| name | str | 用户名 | | + +**示例:** + +获取动态 `967717348014293017` 的赞与转发列表 + +```shell +curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/reaction' \ +--url-query 'id=967717348014293017' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "has_more": true, + "items": [ + { + "action": "赞了", + "attend": 2, + "desc": "", + "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "mid": "293793435", + "name": "社会易姐QwQ" + }, + { + "action": "转发了", + "attend": 2, + "desc": "", + "face": "https://i1.hdslb.com/bfs/face/a8c0d532c19085ff14385abb51450d9c32afe93f.jpg", + "mid": "662407339", + "name": "XhuOffice" + }, + { + "action": "赞了", + "attend": 2, + "desc": "", + "face": "https://i1.hdslb.com/bfs/face/a8c0d532c19085ff14385abb51450d9c32afe93f.jpg", + "mid": "662407339", + "name": "XhuOffice" + }, + { + "action": "转发了", + "attend": 2, + "desc": "", + "face": "https://i1.hdslb.com/bfs/face/2c506dcf0b6507041b0bfafea7505cb1badf6ccd.jpg", + "mid": "616368979", + "name": "淡紫玲儿" + }, + { + "action": "赞了", + "attend": 2, + "desc": "", + "face": "https://i1.hdslb.com/bfs/face/2c506dcf0b6507041b0bfafea7505cb1badf6ccd.jpg", + "mid": "616368979", + "name": "淡紫玲儿" + }, + { + "action": "赞了", + "attend": 2, + "desc": "", + "face": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg", + "mid": "645769214", + "name": "Session小胡" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了3个Up主", + "face": "https://i0.hdslb.com/bfs/face/2ac46bacfdedebf9aecf6415b95dd58636b1e22a.jpg", + "mid": "340463550", + "name": "折耳喵之心" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i1.hdslb.com/bfs/face/ec855a27a42e174521399d7508cece6c0c02c6ff.jpg", + "mid": "628114249", + "name": "at白日梦想家" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了3个Up主", + "face": "https://i1.hdslb.com/bfs/face/81362ba3f99b2702b9746ca7fe67ffc76d3a97c4.jpg", + "mid": "198175", + "name": "傲娇金发黑丝双马尾" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i2.hdslb.com/bfs/face/df1c9bc7d79c84b7227486a944d7a748093fbb31.jpg", + "mid": "1007349302", + "name": "用户9420594" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i0.hdslb.com/bfs/face/f17befd18cab5e157844ab986bd6c60d58d74738.jpg", + "mid": "1180456113", + "name": "人工智能小冰_yoyo" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了2个Up主", + "face": "https://i0.hdslb.com/bfs/face/f1b0ebdf19c2f4b768c5a3e57cbd50e404ad9549.jpg", + "mid": "273008643", + "name": "LV1渡劫失败降到" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i0.hdslb.com/bfs/face/a7732df2624c6a0b6e5856ceb27f3c96598a2fd4.jpg", + "mid": "452290620", + "name": "评论永远比视频精彩" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i0.hdslb.com/bfs/face/cc2ea9088f066b33f24d39434d23aa68cb8ab761.png", + "mid": "91671246", + "name": "樱樱之雪" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了3个Up主", + "face": "http://i1.hdslb.com/bfs/face/d20eae4d6339cef2267b36c1c262ae6466395b64.jpg", + "mid": "340632388", + "name": "天神永恒hb" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了21个Up主", + "face": "https://i0.hdslb.com/bfs/face/368b2a33eed5dc146bd9ab8bf62bc9667653a350.jpg", + "mid": "38120922", + "name": "vgwik" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了2个Up主", + "face": "https://i2.hdslb.com/bfs/face/efbd8bb841ea6340f39854b82d9741f47cb3351e.jpg", + "mid": "691494413", + "name": "熬夜肝不好" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i1.hdslb.com/bfs/face/c46fe783ac7a5291dac4773744b3d35d7cebd77f.jpg", + "mid": "1486540726", + "name": "o_90" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i1.hdslb.com/bfs/face/fece6f971d14fddbddcede65a42edc63d01884d4.jpg", + "mid": "34474963", + "name": "Neko_vecter" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了8个Up主", + "face": "https://i0.hdslb.com/bfs/face/e1d66345bdb6f8c75b782ed5c4b93440860c894d.jpg", + "mid": "88466370", + "name": "没有钱的首富" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了15个Up主", + "face": "https://i0.hdslb.com/bfs/face/f8a6e77e5839e64a7448ddeb7112af86eb47aa48.jpg", + "mid": "14625981", + "name": "龙凌洛" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i2.hdslb.com/bfs/face/18c0bb87fbc8f9fde0d7f92ab88917e517e53df1.jpg", + "mid": "36708269", + "name": "alcoholmole" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i0.hdslb.com/bfs/face/39f0e0ec39e6828b01afc28ad001471d1efa8c66.jpg", + "mid": "52874964", + "name": "黑暗战师" + }, + { + "action": "赞了", + "attend": 1, + "desc": "对方关注了你", + "face": "https://i0.hdslb.com/bfs/face/07d73f7d01c8e8cfb9173d8fe6e40a0c8cb5713d.jpg", + "mid": "702368712", + "name": "-御帝哥哥-" + }, + { + "action": "赞了", + "attend": 0, + "desc": "共同关注了22个Up主", + "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", + "mid": "398095475", + "name": "meipeter" + }, + { + "action": "赞了", + "attend": 0, + "desc": "", + "face": "https://i1.hdslb.com/bfs/face/a4a1566d7218307839345a079651bf58a69a028f.jpg", + "mid": "101358808", + "name": "香香软软的小阿芙" + } + ], + "offset": "{\"page\":2,\"like\":101358808,\"repost\":-1}", + "total": 65 + } +} +``` + +</details> + +## 动态抽奖详情 + +> https://api.vc.bilibili.com/lottery_svr/v1/lottery_svr/lottery_notice + +*请求方法: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | ---- | -------- | ------ | ---- | +| business_id | num | 动态 id | 必要 | | +| bussiness_type | num | 业务类型? | 必要 | 1: 动态抽奖 | +| csrf | str | CSRF Token (即 Cookie 中 bili_jct 字段) | 不必要 | | +| web_location | str | 333.1330 | 不必要 | | + +<details> +<summary>旧版参数:</summary> + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | ---- | -------- | ------ | ---- | +| dynamic_id | num | 动态 id | 必要 | | + +</details> + +**JSON回复:** + +根对象: + +| 字段名 | 类型 | 内容 | 备注 | +| - | - | - | - | +| code | num | 返回值 | 0: 成功<br />-9999: 服务系统错误 | +| message | str | 错误信息 | 无则为空串 | +| msg | str | 错误信息 | 无则为空串 | +| data | obj | 信息本体 | 错误时为空对象 | + +`data`对象: + +| 字段名 | 类型 | 内容 | 备注 | +| - | - | - | - | +| lottery_id | num | 抽奖 id | | +| sender_uid | num | 发送者 mid | | +| business_type | num | 业务类型 | 1: 动态抽奖 | +| business_id | num | 业务 id | 可能与请求参数不同 | +| status | num | 抽奖状态 | 0: 未开奖<br />2: 已开奖 | +| lottery_time | num | 开奖时间 | UNIX 秒级时间戳 | +| lottery_at_num | num | at 人数? | | +| lottery_feed_limit | num | 转发限制? | | +| need_post | num | 是否需要发布? | | +| pay_status | num | 支付状态? | | +| first_prize | num | 一等奖数量 | | +| second_prize | num | 二等奖数量 | | +| third_prize | num | 三等奖数量 | | +| ts | num | 发布时间 | UNIX 秒级时间戳 | +| participants | num | 参与人数 | | +| has_charge_right | bool | 是否有充值权? | | +| participated | bool | 是否参与过? | | +| followed | bool | 是否关注过 | | +| reposted | bool | 是否转发过 | | +| lottery_detail_url | str | 抽奖详情页 URL? | | +| first_prize_cmt | str | 一等奖奖品名称 | | +| third_prize_cmt | str | 三等奖奖品名称 | | +| first_prize_pic | str | 一等奖奖品图片 URL | | +| second_prize_pic | str | 二等奖奖品图片 URL | | +| third_prize_pic | str | 三等奖奖品图片 URL | | +| vip_batch_sign | str | ? | | +| prize_type_first | obj | 一等奖奖品类型 | | +| prize_type_second | obj | 二等奖奖品类型 | 无则不存在 | +| prize_type_third | obj | 三等奖奖品类型 | 无则不存在 | +| lottery_result | obj | 抽奖结果 | 无则不存在 | + +`data`对象中的`prize_type_first`对象: + +| 字段名 | 类型 | 内容 | 备注 | +| - | - | - | - | +| type | num | 奖品类型? | 0 | +| value | obj | 奖品价值? | | + +`prize_type_first`对象中的`value`对象: + +| 字段名 | 类型 | 内容 | 备注 | +| - | - | - | - | +| stype | num | 子奖品类型? | 0 | + +`data`对象中的`prize_type_second`对象: + +与 `prize_type_first` 格式相同 + +`data`对象中的`prize_type_third`对象: + +与 `prize_type_first` 格式相同 + +`data`对象中的`lottery_result`对象: + +| 字段名 | 类型 | 内容 | 备注 | +| - | - | - | - | +| first_prize_result | array | 一等奖结果 | | +| second_prize_result | array | 二等奖结果 | 无则不存在 | +| third_prize_result | array | 三等奖结果 | 无则不存在 | + +`lottery_result`对象中的`first_prize_result`数组: + +| 项名 | 类型 | 内容 | 备注 | +| - | - | - | - | +| uid | num | 中奖者 mid | | +| name | str | 中奖者名称 | | +| face | str | 中奖者头像 URL | | +| hongbao_money | num | 奖品金额? | | + +`lottery_result`对象中的`second_prize_result`数组: + +与 `first_prize_result` 格式相同 + +`lottery_result`对象中的`third_prize_result`数组: + +与 `first_prize_result` 格式相同 + +**示例:** + +```shell +curl -G 'https://api.vc.bilibili.com/lottery_svr/v1/lottery_svr/lottery_notice' \ +--url-query 'business_id=969916293954142214' \ +--url-query 'business_type=1' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "data": { + "lottery_id": 314834, + "sender_uid": 36081646, + "business_type": 1, + "business_id": 969916293954142214, + "status": 2, + "lottery_time": 1724860800, + "lottery_at_num": 0, + "lottery_feed_limit": 1, + "need_post": 0, + "pay_status": 0, + "first_prize": 1, + "second_prize": 0, + "third_prize": 0, + "ts": 1724922650, + "participants": 9230, + "has_charge_right": false, + "participated": false, + "followed": false, + "reposted": false, + "lottery_detail_url": "", + "first_prize_cmt": "S档门票", + "third_prize_cmt": "", + "first_prize_pic": "", + "second_prize_pic": "", + "third_prize_pic": "", + "vip_batch_sign": "", + "prize_type_first": { + "type": 0, + "value": { + "stype": 0 + } + }, + "lottery_result": { + "first_prize_result": [ + { + "uid": 1014634854, + "name": "lty世界第一吃货殿下", + "face": "https://i0.hdslb.com/bfs/face/c746083b15f6761ea75c602661123e68784c6b1c.jpg", + "hongbao_money": 0 + } + ] + } + }, + "message": "", + "msg": "" +} +``` + +</details> diff --git a/docs/dynamic/dynamic_enum.md b/docs/dynamic/dynamic_enum.md new file mode 100644 index 0000000..ae563d6 --- /dev/null +++ b/docs/dynamic/dynamic_enum.md @@ -0,0 +1,224 @@ +# 动态类型对照 + +## 动态类型 + +| 类型 | 说明 | comment_id_str | comment_type |rid_str| 示例 | +| --- | --- | --- | --- | --- | --- | +| DYNAMIC_TYPE_NONE | 无效动态 |||| [716510857084796964](https://t.bilibili.com/716510857084796964) | +| DYNAMIC_TYPE_FORWARD | 动态转发 |动态本身id|17||| +| DYNAMIC_TYPE_AV | 投稿视频 |视频AV号| 1 |视频AV号|| +| DYNAMIC_TYPE_PGC | 剧集(番剧、电影、纪录片) |剧集分集AV号| 1 |剧集分集EP号|| +| DYNAMIC_TYPE_COURSES | ||| || +| DYNAMIC_TYPE_WORD | 纯文字动态 |动态本身id|17|| [718377531474968613](https://t.bilibili.com/718377531474968613) | +| DYNAMIC_TYPE_DRAW | 带图动态 |相簿id|11|相簿id| [718384798557536290](https://t.bilibili.com/718384798557536290) | +| DYNAMIC_TYPE_ARTICLE | 投稿专栏 |专栏cv号|12|专栏cv号| [718372214316990512](https://t.bilibili.com/718372214316990512) | +| DYNAMIC_TYPE_MUSIC | 音乐 ||| || +| DYNAMIC_TYPE_COMMON_SQUARE | 装扮<br/>剧集点评<br/>普通分享 ||17|| [551309621391003098](https://t.bilibili.com/551309621391003098)<br/>[716503778995470375](https://t.bilibili.com/716503778995470375)<br/>[716481612656672789](https://t.bilibili.com/716481612656672789) | +| DYNAMIC_TYPE_COMMON_VERTICAL | ||| || +| DYNAMIC_TYPE_LIVE | 直播间分享 |动态本身id||直播间id| [216042859353895488](https://t.bilibili.com/216042859353895488) | +| DYNAMIC_TYPE_MEDIALIST | 收藏夹 |收藏夹ml号|19|收藏夹ml号| [534428265320147158](https://t.bilibili.com/534428265320147158) | +| DYNAMIC_TYPE_COURSES_SEASON | 课程 |||| [717906712866062340](https://t.bilibili.com/717906712866062340) | +| DYNAMIC_TYPE_COURSES_BATCH | |||| | +| DYNAMIC_TYPE_AD | ||| || +| DYNAMIC_TYPE_APPLET | ||| || +| DYNAMIC_TYPE_SUBSCRIPTION | ||| || +| DYNAMIC_TYPE_LIVE_RCMD | 直播开播 |动态本身id|17|live_id| [718371505648435205](https://t.bilibili.com/718371505648435205) | +| DYNAMIC_TYPE_BANNER | ||| || +| DYNAMIC_TYPE_UGC_SEASON | 合集更新 |视频AV号|1|视频AV号| [718390979031203873](https://t.bilibili.com/718390979031203873) | +| DYNAMIC_TYPE_SUBSCRIPTION_NEW | ||| || + +## 富文本节点类型 + +| 类型 | 说明 | 示例 | +|---------------------------------|------|-----------------------------------------------------------------| +| RICH_TEXT_NODE_TYPE_NONE | | | +| RICH_TEXT_NODE_TYPE_TEXT | 文字节点 | [721295772787671059](https://t.bilibili.com/721295772787671059) | +| RICH_TEXT_NODE_TYPE_AT | @用户 | [721296515797090324](https://t.bilibili.com/721296515797090324) | +| RICH_TEXT_NODE_TYPE_LOTTERY | 互动抽奖 | [720907383182721040](https://t.bilibili.com/720907383182721040) | +| RICH_TEXT_NODE_TYPE_VOTE | 投票 | [721203899129659408](https://t.bilibili.com/721203899129659408) | +| RICH_TEXT_NODE_TYPE_TOPIC | 话题 | [721188862459641879](https://t.bilibili.com/721188862459641879) | +| RICH_TEXT_NODE_TYPE_GOODS | 商品链接 | [721282703208480790](https://t.bilibili.com/721282703208480790) | +| RICH_TEXT_NODE_TYPE_BV | 视频链接 | [716752002311258165](https://t.bilibili.com/716752002311258165) | +| RICH_TEXT_NODE_TYPE_AV | | | +| RICH_TEXT_NODE_TYPE_EMOJI | 表情 | [716751108968546393](https://t.bilibili.com/716751108968546393) | +| RICH_TEXT_NODE_TYPE_USER | | | +| RICH_TEXT_NODE_TYPE_CV | | | +| RICH_TEXT_NODE_TYPE_VC | | | +| RICH_TEXT_NODE_TYPE_WEB | 网页链接 | [716751027361022055](https://t.bilibili.com/716751027361022055) | +| RICH_TEXT_NODE_TYPE_TAOBAO | | | +| RICH_TEXT_NODE_TYPE_MAIL | 邮箱地址 | [721314095109767220](https://t.bilibili.com/721314095109767220) | +| RICH_TEXT_NODE_TYPE_OGV_SEASON | 剧集信息 | [721282046064853080](https://t.bilibili.com/721282046064853080) | +| RICH_TEXT_NODE_TYPE_OGV_EP | | | +| RICH_TEXT_NODE_TYPE_SEARCH_WORD | | | + +## 作者类型 + +| 类型 | 说明 | 示例 | +|------------------------|------|-----| +| AUTHOR_TYPE_NONE | | | +| AUTHOR_TYPE_NORMAL | 普通更新 | | +| AUTHOR_TYPE_PGC | 剧集更新 | | +| AUTHOR_TYPE_UGC_SEASON | 合集更新 | | + +| 类型 | 说明 | 示例 | +|-----------------|-----|-----| +| EMOJI_TYPE_NONE | | | +| EMOJI_TYPE_OLD | | | +| EMOJI_TYPE_NEW | | | +| EMOJI_TYPE_VIP | | | + +## 相关内容卡片类型 + +| 类型 | 说明 | 示例 | +|-------------------------|------|--------------------------------------------------------------------------| +| ADDITIONAL_TYPE_NONE | | | +| ADDITIONAL_TYPE_PGC | | | +| ADDITIONAL_TYPE_GOODS | 商品信息 | | +| ADDITIONAL_TYPE_VOTE | 投票 | [716365292050055176](https://t.bilibili.com/716365292050055176) | +| ADDITIONAL_TYPE_COMMON | 一般类型 | 游戏<br/>[716357878942793745](https://t.bilibili.com/716357878942793745) | +| ADDITIONAL_TYPE_MATCH | | | +| ADDITIONAL_TYPE_UP_RCMD | | | +| ADDITIONAL_TYPE_UGC | 视频跳转 | [716489253410832401](https://t.bilibili.com/716489253410832401) | +| ADDITIONAL_TYPE_RESERVE | | 直播预约<br/>[716524987542929443](https://t.bilibili.com/716524987542929443) | + +| 类型 | 说明 | 示例 | +|-------------------------------|-----|-----| +| ADDITIONAL_BUTTON_TYPE_NONE | | | +| ADDITIONAL_BUTTON_TYPE_JUMP | | | +| ADDITIONAL_BUTTON_TYPE_BUTTON | | | + +| 类型 | 说明 | 示例 | +|----------------------------------|-----|-----| +| ADDITIONAL_BUTTON_STATUS_NONE | | | +| ADDITIONAL_BUTTON_STATUS_UNCHECK | | | +| ADDITIONAL_BUTTON_STATUS_CHECK | | | + +| 类型 | 说明 | 示例 | +|-------------------------------|-----|-----| +| ADD_BUTTON_CLICK_TYPE_NONE | | | +| ADD_BUTTON_CLICK_TYPE_RESERVE | | | + +| 类型 | 说明 | 示例 | +|-------------------------|-----|-----| +| DISABLE_STATE_HIGHLIGHT | | | +| DISABLE_STATE_GRAY | | | + +| 类型 | 说明 | 示例 | +|----------------------------|-----|-----| +| ADD_BUTTON_BG_STYLE_FILL | | | +| ADD_BUTTON_BG_STYLE_STROKE | | | +| ADD_BUTTON_BG_STYLE_GRAY | | | + +| 类型 | 说明 | 示例 | +|----------------------------------|-----|-----| +| HIGHLIGHT_TEXT_STYLE_TYPE_NONE | | | +| HIGHLIGHT_TEXT_STYLE_TYPE_ACTIVE | | | + +## 动态主体类型 + +| 类型 | 说明 | 示例 | +|-----------------------------|-------|-----------------------------------------------------------------| +| MAJOR_TYPE_NONE | 动态失效 | [716510857084796964](https://t.bilibili.com/716510857084796964) | +| MAJOR_TYPE_NONE | 转发动态 | [866756840240709701](https://www.bilibili.com/opus/866756840240709701) | +| MAJOR_TYPE_OPUS | 图文动态 | [870176712256651305](https://www.bilibili.com/opus/870176712256651305) | +| MAJOR_TYPE_ARCHIVE | 视频 | [716526237365829703](https://t.bilibili.com/716526237365829703) | +| MAJOR_TYPE_PGC | 剧集更新 | [645981661420322824](https://t.bilibili.com/645981661420322824) | +| MAJOR_TYPE_COURSES | | | +| MAJOR_TYPE_DRAW | 带图动态 | [716358050743582725](https://t.bilibili.com/716358050743582725) | +| MAJOR_TYPE_ARTICLE | | | +| MAJOR_TYPE_MUSIC | 音频更新 | | +| MAJOR_TYPE_COMMON | 一般类型 | [716481612656672789](https://t.bilibili.com/716481612656672789) | +| MAJOR_TYPE_LIVE | 直播间分享 | [267505569812738175](https://t.bilibili.com/267505569812738175) | +| MAJOR_TYPE_MEDIALIST | | | +| MAJOR_TYPE_APPLET | | | +| MAJOR_TYPE_SUBSCRIPTION | | | +| MAJOR_TYPE_LIVE_RCMD | 直播状态 | | +| MAJOR_TYPE_UGC_SEASON | 合计更新 | [716509100448415814](https://t.bilibili.com/716509100448415814) | +| MAJOR_TYPE_SUBSCRIPTION_NEW | | | + +| 类型 | 说明 | 示例 | +|-----------------|-----|-----| +| MEDIA_TYPE_NONE | | | +| MEDIA_TYPE_UGC | | | +| MEDIA_TYPE_PGC | | | +| MEDIA_TYPE_LIVE | | | + +| 类型 | 说明 | 示例 | +|--------------------------|-----|-----| +| PGC_SUB_TYPE_NONE | | | +| PGC_SUB_TYPE_BANGUMI | | | +| PGC_SUB_TYPE_MOVIE | | | +| PGC_SUB_TYPE_DOCUMENTARY | | | +| PGC_SUB_TYPE_DOMESTIC | | | +| PGC_SUB_TYPE_TV | | | + +| 类型 | 说明 | 示例 | +|----------------------|-----|-----| +| DRAW_TAG_TYPE_NONE | | | +| DRAW_TAG_TYPE_COMMON | | | +| DRAW_TAG_TYPE_GOODS | | | +| DRAW_TAG_TYPE_USER | | | +| DRAW_TAG_TYPE_TOPIC | | | +| DRAW_TAG_TYPE_LBS | | | + +| 类型 | 说明 | 示例 | +|----------------------------------|-----|-----| +| MAJOR_COMMON_STYLE_TYPE_NONE | | | +| MAJOR_COMMON_STYLE_TYPE_SQUARE | | | +| MAJOR_COMMON_STYLE_TYPE_VERTICAL | | | + +| 类型 | 说明 | 示例 | +|---------------------|-----|-----| +| RESERVE_TYPE_NONE | | | +| RESERVE_TYPE_RECALL | | | + +| 类型 | 说明 | 示例 | +|--------------------------|-----|-----| +| LIVE_STATE_TYPE_NONE | | | +| LIVE_STATE_TYPE_LIVE | | | +| LIVE_STATE_TYPE_ROTATION | | | + +| 类型 | 说明 | 示例 | +|----------------------------------|-----|-----| +| SUBSCRIPTION_NEW_STYLE_TYPE_NONE | | | +| SUBSCRIPTION_NEW_STYLE_TYPE_DRAW | | | +| SUBSCRIPTION_NEW_STYLE_TYPE_LIVE | | | + +| 类型 | 说明 | 示例 | +|------------------------------|---------|-----| +| THREE_POINT_DELETE | 删除 | | +| THREE_POINT_REPORT | 举报 | | +| THREE_POINT_FOLLOWING | 关注/取消关注 | | +| THREE_POINT_TOP | 置顶/取消置顶 | | +| THREE_POINT_UNFAV | | | +| THREE_POINT_UNSUBS | | | +| THREE_POINT_TOPIC_REPORT | | | +| THREE_POINT_TOPIC_IRRELEVANT | | | +| THREE_POINT_RCMD_RESOURCE | | | +| THREE_POINT_RCMD_FEEDBACK | | | + +| 类型 | 说明 | 示例 | +|--------------------|-----|-----| +| FOLD_TYPE_NONE | | | +| FOLD_TYPE_PUBLISH | | | +| FOLD_TYPE_FREQUENT | | | +| FOLD_TYPE_UNITE | | | +| FOLD_TYPE_LIMIT | | | + +| 类型 | 说明 | 示例 | +|------------------------------|-----|-----| +| DYN_STATUS_TYPE_NONE | | | +| DYN_STATUS_TYPE_NORMAL | | | +| DYN_STATUS_TYPE_AUDITING | | | +| DYN_STATUS_TYPE_SELF_VISIBLE | | | +| DYN_STATUS_TYPE_DELETED | | | + +| 类型 | 说明 | 示例 | +|---------------|-----|-----| +| SCENE_DETAIL | | | +| SCENE_HOT | | | +| SCENE_GENERAL | | | +| SCENE_SPACE | | | +| SCENE_TOPIC | | | + + diff --git a/docs/dynamic/get_dynamic_detail.md b/docs/dynamic/get_dynamic_detail.md new file mode 100644 index 0000000..e6182ab --- /dev/null +++ b/docs/dynamic/get_dynamic_detail.md @@ -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 | 认证类型 | 见[用户认证类型一览](../user/official_role.md) | +| 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> diff --git a/docs/dynamic/nav.md b/docs/dynamic/nav.md new file mode 100644 index 0000000..6500d11 --- /dev/null +++ b/docs/dynamic/nav.md @@ -0,0 +1,1167 @@ +# 获取导航栏动态 + +## 获取导航栏动态列表 + +> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/nav + +*请求方式: GET* + +认证方式:Cookie(SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------------- | ---- | ---------- | ------ | ----------------------- | +| update_baseline | num | 更新基线 | 非必要 | 获取新动态时使用 | +| offset | num | 分页偏移量 | 非必要 | 翻页时使用 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | -------------------------- | +| code | num | 返回值 | 0: 成功 <br />-101: 未登录 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ----- | ---------------------------- | -------------------------------------------------- | +| has_more | bool | 是否有更多数据 | | +| items | array | 数据数组 | | +| offset | str | 偏移量 | 等于`items`中最后一条记录的id<br/>获取下一页时使用 | +| update_baseline | str | 更新基线 | 等于`items`中第一条记录的id_str | +| update_num | num | 本次获取获取到了多少条新动态 | 在更新基线以上的动态条数 | + +`data`对象中`items`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | -------- | ---------------------------- | +| author | obj | UP主 | 参见[module_author对象](all.md#data对象---items数组中的对象---modules对象---module_author对象) | +| cover | str | 封面URL | | +| id_str | str | 动态id | | +| pub_time | str | 发布时间 | 文字表述的相对时间 | +| rid | num | 关联id | 视频即aid | +| title | str | 标题 | | +| type | num | 动态类型 | 8: 视频 | +| visible | bool | 是否可见 | true:可见<br/>false:不可见 | + +**示例:** + +获取导航栏动态列表 + +```shell +curl "https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/nav" \ + -b "SESSDATA=xxx" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "has_more": true, + "items": [ + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg", + "jump_url": "//space.bilibili.com/485703766/dynamic", + "mid": 485703766, + "name": "英伟达GeForce", + "official": { + "desc": "", + "role": 3, + "title": "英伟达GeForce官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 2000563200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", + "label_theme": "ten_annual_vip", + "path": "", + "text": "十年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 7, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 1 + } + }, + "cover": "http://i2.hdslb.com/bfs/archive/d38b239af580eb199b4bbe55d2388cb603f6e917.jpg", + "id_str": "954636836111646759", + "jump_url": "//www.bilibili.com/video/BV181421k7bu/", + "pub_time": "1小时前", + "rid": 1556082150, + "title": "《异环》首曝丨即将支持 NVIDIA DLSS & 光线追踪技术", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i2.hdslb.com/bfs/archive/a220f26856924287c9dc4fa59c67ff38a2fcd20c.jpg", + "id_str": "954616624230433048", + "jump_url": "//www.bilibili.com/video/BV1RW421R7pE/", + "pub_time": "2小时前", + "rid": 1856122369, + "title": "【夏色祭×可波】《カタオモイ》请感受这份传达给你的心意【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/1b7e4eaf6696038bb96ff38c6d13a6b3778d6a7c.jpg", + "id_str": "954616624230432996", + "jump_url": "//www.bilibili.com/video/BV15Z421u7MX/", + "pub_time": "2小时前", + "rid": 1156047704, + "title": "Ready for my show!中日16位实力舞见高燃开场《唱》【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/5f22e930d0683b5e8d7a81f75b48fdb0c3a0f2e7.jpg", + "id_str": "954616624229384275", + "jump_url": "//www.bilibili.com/video/BV1hz421q7xP/", + "pub_time": "2小时前", + "rid": 1356132445, + "title": "阿梓×尔东和小明倾情演出《暁の車》带你重温高达经典旋律【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i2.hdslb.com/bfs/archive/04b46154e833ea1349c3302f9b9c188a45b016e9.jpg", + "id_str": "954616624228335667", + "jump_url": "//www.bilibili.com/video/BV1LS421R7sr/", + "pub_time": "2小时前", + "rid": 1506089543, + "title": "【Vox Akuma】声之恶魔低音爵士,深情演绎世界名曲【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i0.hdslb.com/bfs/archive/819d73ca191235e89a03c62889073d526b552fc2.jpg", + "id_str": "954616624033300612", + "jump_url": "//www.bilibili.com/video/BV1qM4m127wD/", + "pub_time": "2小时前", + "rid": 1306194854, + "title": "【RAB】全 部 逮 捕!萝 莉 控 的 末 日【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i2.hdslb.com/bfs/archive/01dd21a65db17705479ee4ee550a79856847264e.jpg", + "id_str": "954616624020717623", + "jump_url": "//www.bilibili.com/video/BV1rZ421K7yT/", + "pub_time": "2小时前", + "rid": 1156076206, + "title": "【可波×夏色祭】对你一见钟情啦!《5201314》开启绝赞告白【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/d79b28afc3273d5edb211d03ddc70c45999d57f7.jpg", + "fold": { + "ids": [ + "954616624019669009" + ], + "statement": "展开1条相关动态", + "type": 3, + "users": [] + }, + "id_str": "954616624019669032", + "jump_url": "//www.bilibili.com/video/BV1oE421c7XV/", + "pub_time": "2小时前", + "rid": 1656233700, + "title": "【洛天依】来自2024的《霜雪千年》还记否这一曲喜悲霜雪【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/93b809e050e639c9d8e8e379da96a4c2216ae755.jpg", + "jump_url": "//space.bilibili.com/36081646/dynamic", + "mid": 36081646, + "name": "洛天依", + "official": { + "desc": "", + "role": 2, + "title": "2023年度原创音乐、洛天依官方账号", + "type": 0 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1764777600000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/d79b28afc3273d5edb211d03ddc70c45999d57f7.jpg", + "id_str": "954616624019669009", + "jump_url": "//www.bilibili.com/video/BV1oE421c7XV/", + "pub_time": "2小时前", + "rid": 1656233700, + "title": "【洛天依】来自2024的《霜雪千年》还记否这一曲喜悲霜雪【BML2024单品】", + "type": 8, + "visible": false + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/cbbbb6e35c7680261a8a1fb3f582e04de14cbb50.jpg", + "id_str": "954616624002891844", + "jump_url": "//www.bilibili.com/video/BV1Fb421H7YQ/", + "pub_time": "2小时前", + "rid": 1806140865, + "title": "【ChiliChill】《我的悲伤是水做的》,描绘雨天的淡蓝色心情【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/b1f8744db9bad8a4a89bd9fa3fab0d128b347edb.jpg", + "id_str": "954616623998697505", + "jump_url": "//www.bilibili.com/video/BV12m421g759/", + "pub_time": "2小时前", + "rid": 1606234911, + "title": "成为挣脱《Cage》的小鸟,露米Lumi深情吟唱人类希望之歌【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i2.hdslb.com/bfs/archive/52e82dc68f3cbbb598d27437c33e996718e07924.jpg", + "id_str": "954616623995552002", + "jump_url": "//www.bilibili.com/video/BV181421k74U/", + "pub_time": "2小时前", + "rid": 1556081716, + "title": "型月组曲优雅串烧《若能看到明月》🌙🌙🌙【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i0.hdslb.com/bfs/archive/8558fe6746c43182b25f6a590f47b9673d47ba67.jpg", + "id_str": "954616623994503209", + "jump_url": "//www.bilibili.com/video/BV1jW421d7ce/", + "pub_time": "2小时前", + "rid": 1856192192, + "title": "Finana Ryugu超甜演绎童年回忆《プレパレード》最清纯的恋爱预演~【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i2.hdslb.com/bfs/archive/1ebd8cbd38eb9db9451df9978b20bee445d8fea0.jpg", + "id_str": "954616623993454708", + "jump_url": "//www.bilibili.com/video/BV1cw4m1Y7Zs/", + "pub_time": "2小时前", + "rid": 1106145687, + "title": "元气补给站《MORE!JUMP!MORE!》在BML舞台起跳!【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/bc1de2b7e27a5385e3e913fc552b86b744b49fb8.jpg", + "id_str": "954616623990308904", + "jump_url": "//www.bilibili.com/video/BV1QH4y1w7hC/", + "pub_time": "2小时前", + "rid": 1056107813, + "title": "【星瞳】华丽演绎《迷宮バタフライ》🦋一曲重温童年之梦【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i0.hdslb.com/bfs/archive/63617f9210ab2e996f75e8e2fb46c5dc73aeed35.jpg", + "id_str": "954616623980871832", + "jump_url": "//www.bilibili.com/video/BV1L1421b7XJ/", + "pub_time": "2小时前", + "rid": 1556117158, + "title": "奏响《葬送的破阵曲》,按捺不住战斗的心了!【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", + "jump_url": "//space.bilibili.com/403748305/dynamic", + "mid": 403748305, + "name": "BML制作指挥部", + "official": { + "desc": "", + "role": 3, + "title": "Bilibili Macro Link官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1750176000000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i0.hdslb.com/bfs/archive/c3c470e309acef1d8c8f2ce79ed753f9bca50879.jpg", + "id_str": "954616623979823254", + "jump_url": "//www.bilibili.com/video/BV1uy411B7Ca/", + "pub_time": "2小时前", + "rid": 1956028036, + "title": "【猫MEME】转生成只能用MEME讲话的平凡上班族【BML2024单品】", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg", + "jump_url": "//space.bilibili.com/407045223/dynamic", + "mid": 407045223, + "name": "二次元的中科院物理所", + "official": { + "desc": "", + "role": 6, + "title": "中国科学院物理研究所官方账号", + "type": 1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1745769600000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 3, + "status": 1, + "theme_type": 0, + "tv_due_date": 1626364800, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 0 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/056db2ac79801d853bebcd41c247788d8ccdb795.jpg", + "id_str": "954609313946533894", + "jump_url": "//www.bilibili.com/video/BV1Wz421q7n5/", + "pub_time": "3小时前", + "rid": 1356075945, + "title": "暑期不失约!第六季《科学公开课》震撼来袭!", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", + "jump_url": "//space.bilibili.com/686127/dynamic", + "mid": 686127, + "name": "籽岷", + "official": { + "desc": "", + "role": 1, + "title": "2023百大UP主、知名游戏UP主", + "type": 0 + }, + "vip": { + "avatar_icon": { + "icon_resource": {}, + "icon_type": 1 + }, + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 4845196800000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/c16005a5b39164b3536cbd45618a5edd597a1c51.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/Pzrd8zmpQD.png", + "label_theme": "hundred_annual_vip", + "path": "", + "text": "百年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "role": 15, + "status": 1, + "theme_type": 0, + "tv_due_date": 1692288000, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 2, + "vip_pay_type": 1 + } + }, + "cover": "http://i1.hdslb.com/bfs/archive/170237c4589a086afd7d62823765de1cc7306555.jpg", + "id_str": "954478850029387784", + "jump_url": "//www.bilibili.com/video/BV1Jz421q7JH/", + "pub_time": "11小时前", + "rid": 1356097140, + "title": "我的世界 冷门原版生物娘化 材质包", + "type": 8, + "visible": true + }, + { + "author": { + "face": "https://i0.hdslb.com/bfs/face/22e6b4f3c9199b6f4397f0d8df916872d677557b.jpg", + "jump_url": "//space.bilibili.com/625267185/dynamic", + "mid": 625267185, + "name": "零度解说", + "official": { + "desc": "", + "role": 0, + "title": "", + "type": -1 + }, + "vip": { + "avatar_icon": { + "icon_resource": {} + }, + "avatar_subscript": 0, + "avatar_subscript_url": "", + "due_date": 0, + "label": { + "bg_color": "", + "bg_style": 0, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", + "label_theme": "", + "path": "", + "text": "", + "text_color": "", + "use_img_label": true + }, + "nickname_color": "", + "role": 0, + "status": 0, + "theme_type": 0, + "tv_due_date": 0, + "tv_vip_pay_type": 0, + "tv_vip_status": 0, + "type": 0, + "vip_pay_type": 0 + } + }, + "cover": "http://i0.hdslb.com/bfs/archive/6f0397b546ba4da15fcd9a2e06cbcc1f68e5545c.jpg", + "id_str": "954376956212674594", + "jump_url": "//www.bilibili.com/video/BV141421b7sf/", + "pub_time": "昨天 20:30", + "rid": 1556122058, + "title": "快速提升上网速度!免费又好用,适用 Windows 10 /11,非常简单!!(2024) | 零度解说", + "type": 8, + "visible": true + } + ], + "offset": "954376956212674594", + "update_baseline": "954659517801431040", + "update_num": 0 + } +} +``` + +</details> diff --git a/docs/dynamic/publish.md b/docs/dynamic/publish.md new file mode 100644 index 0000000..e55101b --- /dev/null +++ b/docs/dynamic/publish.md @@ -0,0 +1,872 @@ +# 发布动态 + +## 为图片动态上传图片 + +> https://api.bilibili.com/x/dynamic/feed/draw/upload_bfs + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +注意:非日常类型像素宽高必须大于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* + +认证方式:Cookie(SESSDATA) + +注意: 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:成功<br />-101:账号未登录<br />4126021:你没有绑定手机,无法发布动态 | +| 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* + +认证方式:Cookie(SESSDATA) + +**正文参数 (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> + diff --git a/docs/dynamic/space.md b/docs/dynamic/space.md new file mode 100644 index 0000000..0a150f9 --- /dev/null +++ b/docs/dynamic/space.md @@ -0,0 +1,1143 @@ +# 获取用户空间动态 + +> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space + +请求方式:`GET` + +认证方式:Cookie(SESSDATA) + +## URL参数 + +| 参数名 | 类型 | 必填 | 内容 | 备注 | +|-----------------|-----|-----|--------|-----| +| offset | str | | 分页偏移量 | | +| host_mid | str | √ | 用户UID | | +| timezone_offset | num | | `-480` | | +| features | str | | itemOpusStyle | | + +## Json回复 + +参照 [获取动态列表](./all.md#获取动态列表) + +## 请求示例 + +```shell +curl -L -X GET 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=1' +``` + +## 响应示例 + +<details> +<summary>点击查看</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "has_more": false, + "items": [ + { + "basic": { + "comment_id_str": "463864834570585963", + "comment_type": 17, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "463864834566075427" + }, + "id_str": "463864834570585963", + "modules": { + "module_author": { + "face": "http://i0.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/1/dynamic", + "label": "", + "mid": 1, + "name": "bishi", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "2020-12-02", + "pub_ts": 1606840348, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1816099200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "好家伙", + "text": "好家伙", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "好家伙" + }, + "major": null, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 979, + "forbidden": false + }, + "forward": { + "count": 81, + "forbidden": false + }, + "like": { + "count": 7694, + "forbidden": false, + "status": false + } + } + }, + "orig": { + "basic": { + "comment_id_str": "", + "comment_type": 0, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "" + }, + "id_str": "459720423056997502", + "modules": { + "module_author": { + "decorate": { + "card_url": "http://i0.hdslb.com/bfs/garb/item/3fc3f5914f0bcbefac9e9fa96aec454cf347287a.png", + "fan": { + "color": "#ec3d3d", + "is_fan": true, + "num_str": "004156", + "number": 4156 + }, + "id": 1418, + "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/1431?navhide=1&mid=249608727&from=dynamic&isdiy=0", + "name": "2020拜年祭粉丝专属", + "type": 3 + }, + "face": "https://i0.hdslb.com/bfs/face/e422a095e58305218e2745714ceb4c9754e752a7.jpg", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/249608727/dynamic", + "label": "", + "mid": 249608727, + "name": "杨可爱Ukulele", + "official_verify": { + "desc": "全民音乐UP主年度30强", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "https://i0.hdslb.com/bfs/face/c93e1eeb77b1bb0753eff243d49c006bf18d69c5.png", + "image_enhance": "https://i0.hdslb.com/bfs/face/c93e1eeb77b1bb0753eff243d49c006bf18d69c5.png", + "image_enhance_frame": "", + "name": "梦塔·雪谜城", + "pid": 299 + }, + "pub_action": "投稿了视频", + "pub_time": "", + "pub_ts": 1605875402, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1793462400000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "jump_url": "//search.bilibili.com/all?keyword=%23%E9%87%91%E7%A7%8B%E9%9F%B3%E4%B9%90%E5%AD%A3%23", + "orig_text": "#金秋音乐季#", + "text": "#金秋音乐季#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": "\n大家推荐给我很多神曲 一直没机会做\n这不\n杨同学带着《酒醉的蝴蝶》《爱河》《黑人抬棺》《最炫民族风》..等10余位选手来了\n改编成中国风之后 好像 有点 串味儿了\n大家三连之后再细细观看可好?", + "text": "\n大家推荐给我很多神曲 一直没机会做\n这不\n杨同学带着《酒醉的蝴蝶》《爱河》《黑人抬棺》《最炫民族风》..等10余位选手来了\n改编成中国风之后 好像 有点 串味儿了\n大家三连之后再细细观看可好?", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "#金秋音乐季#\n大家推荐给我很多神曲 一直没机会做\n这不\n杨同学带着《酒醉的蝴蝶》《爱河》《黑人抬棺》《最炫民族风》..等10余位选手来了\n改编成中国风之后 好像 有点 串味儿了\n大家三连之后再细细观看可好?" + }, + "major": { + "archive": { + "aid": "970285943", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "text": "投稿视频" + }, + "bvid": "BV12p4y167Kq", + "cover": "http://i0.hdslb.com/bfs/archive/20c86c66df71770a7a91cc0871b455d1c582094b.jpg", + "desc": "大家好,今天想要跟大家分享我的快乐源泉,以及去KTV的必点神曲\n大家如果觉得十首看了还不过瘾的话\n这样\n点赞过十万 热评第一说出啥改编我就出啥 (前提是我做得来...\n\n(“土味”只是一个外号,它们其实不土,它们只是快乐的传递者\n 大部分的填词都是根据原版歌曲填哒,偶尔有些小发挥,大家当看娱乐视频就好啦)\n--------------------\n原唱:崔伟立、凤凰传奇、Vicetone&Tony Igy、神马乐团、筷子兄弟、慕容晓晓、李佳璐\n改编编曲/演唱/尤克里里:杨可爱\n改编填词:不迟等\n混音:", + "disable_preview": 0, + "duration_text": "06:12", + "jump_url": "//www.bilibili.com/video/BV12p4y167Kq", + "stat": { + "danmaku": "3519", + "play": "153万" + }, + "title": "没内味儿?我把十五年最火的10首土味神曲做成了一首中国风..", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + "type": "DYNAMIC_TYPE_FORWARD", + "visible": true + }, + { + "basic": { + "comment_id_str": "269459814293507419", + "comment_type": 17, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "269459814290043403" + }, + "id_str": "269459814293507419", + "modules": { + "module_author": { + "face": "http://i0.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/1/dynamic", + "label": "", + "mid": 1, + "name": "bishi", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "2019-06-27", + "pub_ts": 1561576902, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1816099200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "来一锄头!", + "text": "来一锄头!", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "来一锄头!" + }, + "major": null, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 1233, + "forbidden": false + }, + "forward": { + "count": 32, + "forbidden": false + }, + "like": { + "count": 8428, + "forbidden": false, + "status": false + } + } + }, + "orig": { + "basic": { + "comment_id_str": "", + "comment_type": 0, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "" + }, + "id_str": 4038269986840689, + "modules": { + "module_author": { + "face": "http://i0.hdslb.com/bfs/face/210cac322eb3a689f63f3a19d59ea641347c3c52.jpg", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/10410/dynamic", + "label": "", + "mid": 10410, + "name": "hotfloor", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_time": "", + "pub_ts": 1327584664, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1700150400000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "archive": { + "aid": "205419", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "text": "投稿视频" + }, + "bvid": "BV1bx411w7SF", + "cover": "http://i1.hdslb.com/bfs/archive/5607be9a736a426ae21e3e59fad664296f91df8e.png", + "desc": "原创 拖到今天才做完了……总之祝各位新年快乐,做这个只是为了感谢这一年陪伴我们的各种新番,与新番一起成长的UP主们,和浪费我们大半人生的bili,谢谢你们带给我们的欢笑和泪水,即使是世界末日也不会忘记…… PS.感谢哦拖拖帮忙取标题 下载:http://pan.baidu.com/s/1c0ImLva 密码:8xb4 原曲MV联动av210810 自己的MADlist-->mylist27438", + "disable_preview": 0, + "duration_text": "04:49", + "jump_url": "//www.bilibili.com/video/BV1bx411w7SF", + "stat": { + "danmaku": "2.4万", + "play": "54.6万" + }, + "title": "【MAD】[送给所有热爱bili的各位]干杯", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + "type": "DYNAMIC_TYPE_FORWARD", + "visible": true + }, + { + "basic": { + "comment_id_str": "26050777", + "comment_type": 11, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "26050777" + }, + "id_str": "269003035929570655", + "modules": { + "module_author": { + "face": "http://i0.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/1/dynamic", + "label": "", + "mid": 1, + "name": "bishi", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "2019-06-25", + "pub_ts": 1561470550, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1816099200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "jump_url": "//search.bilibili.com/all?keyword=%23%E5%B9%B2%E6%9D%AF%E5%8D%81%E5%91%A8%E5%B9%B4%23", + "orig_text": "#干杯十周年#", + "text": "#干杯十周年#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": "Yo,My Friend,Nice to see you again.", + "text": "Yo,My Friend,Nice to see you again.", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "jump_url": "https://www.bilibili.com/blackboard/bilibili2009.html", + "orig_text": "https://www.bilibili.com/blackboard/bilibili2009.html", + "text": "网页链接", + "type": "RICH_TEXT_NODE_TYPE_WEB" + } + ], + "text": "#干杯十周年#Yo,My Friend,Nice to see you again.https://www.bilibili.com/blackboard/bilibili2009.html" + }, + "major": { + "draw": { + "id": 26050777, + "items": [ + { + "height": 1360, + "size": 500, + "src": "https://i0.hdslb.com/bfs/active/1ddb2cb9a1edb74ba7c4f0e15c1bbef9dc3ce548.jpg", + "tags": [], + "width": 935 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 1515, + "forbidden": false + }, + "forward": { + "count": 214, + "forbidden": false + }, + "like": { + "count": 11041, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + { + "basic": { + "comment_id_str": "264471510427272642", + "comment_type": 17, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "264471510424746690" + }, + "id_str": "264471510427272642", + "modules": { + "module_author": { + "face": "http://i0.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/1/dynamic", + "label": "", + "mid": 1, + "name": "bishi", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "name": "", + "pid": 0 + }, + "pub_action": "", + "pub_location_text": "", + "pub_time": "2019-06-13", + "pub_ts": 1560415472, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1816099200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "圈错号了", + "text": "圈错号了", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "emoji": { + "icon_url": "http://i0.hdslb.com/bfs/emote/33ad6000d9f9f168a0976bc60937786f239e5d8c.png", + "size": 1, + "text": "[呆]", + "type": 1 + }, + "orig_text": "[呆]", + "text": "[呆]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + }, + { + "orig_text": "//", + "text": "//", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@柴刀娘木木", + "rid": "9", + "text": "@柴刀娘木木", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": ":", + "text": ":", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "orig_text": "@bishi", + "rid": "1", + "text": "@bishi", + "type": "RICH_TEXT_NODE_TYPE_AT" + }, + { + "orig_text": "我来组成分母,测试欧气,我要是中了再抽人送出", + "text": "我来组成分母,测试欧气,我要是中了再抽人送出", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "emoji": { + "icon_url": "http://i0.hdslb.com/bfs/emote/6c49d226e76c42cd8002abc47b3112bc5a92f66a.png", + "size": 1, + "text": "[偷笑]", + "type": 1 + }, + "orig_text": "[偷笑]", + "text": "[偷笑]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + } + ], + "text": "圈错号了[呆]//@柴刀娘木木:@bishi我来组成分母,测试欧气,我要是中了再抽人送出[偷笑]" + }, + "major": null, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 1013, + "forbidden": false + }, + "forward": { + "count": 109, + "forbidden": false + }, + "like": { + "count": 4751, + "forbidden": false, + "status": false + } + } + }, + "orig": { + "basic": { + "comment_id_str": "", + "comment_type": 0, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "" + }, + "id_str": "264180341709040397", + "modules": { + "module_author": { + "decorate": { + "card_url": "http://i0.hdslb.com/bfs/garb/item/fe745063c05881face209a772d17bb056a4034f1.png", + "fan": { + "color": "#6857ea", + "is_fan": true, + "num_str": "001647", + "number": 1647 + }, + "id": 5203, + "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/5235?navhide=1&mid=12&from=dynamic&isdiy=0", + "name": "BML2021粉丝专属", + "type": 3 + }, + "face": "http://i2.hdslb.com/bfs/face/4f640086bc17e180faf8ad6b86b5bf4be24eb9f1.jpg", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/12/dynamic", + "label": "", + "mid": 12, + "name": "MagicBear", + "official_verify": { + "desc": "", + "type": 0 + }, + "pendant": { + "expire": 0, + "image": "https://i0.hdslb.com/bfs/face/a959c72407b2ac553d4328fd76d55d0134e20f65.png", + "image_enhance": "https://i0.hdslb.com/bfs/face/a959c72407b2ac553d4328fd76d55d0134e20f65.png", + "image_enhance_frame": "", + "name": "异常生物", + "pid": 460 + }, + "pub_action": "", + "pub_time": "", + "pub_ts": 1560347679, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1761580800000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/0DFy9BHgwE.gif", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d7e624d13d3e134251e4174a7318c19a8edbd71.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/uckjAv3Npy.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": { + "rich_text_nodes": [ + { + "orig_text": "​互动抽奖", + "text": "​互动抽奖", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "jump_url": "//search.bilibili.com/all?keyword=%23%E8%BD%AC%E5%8F%91%E6%8A%BD%E5%A5%96%23", + "orig_text": "#转发抽奖#", + "text": "#转发抽奖#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "jump_url": "//search.bilibili.com/all?keyword=%23PC%E7%A1%AC%E4%BB%B6%23", + "orig_text": "#PC硬件#", + "text": "#PC硬件#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "jump_url": "//search.bilibili.com/all?keyword=%23%E6%97%A7%E8%B4%A7%E6%B8%85%E7%90%86%E8%AE%A1%E5%88%92%23", + "orig_text": "#旧货清理计划#", + "text": "#旧货清理计划#", + "type": "RICH_TEXT_NODE_TYPE_TOPIC" + }, + { + "orig_text": " 很久以前购入然后一直沒用上的SSD一枚 型号:PX-G512M6e ", + "text": " 很久以前购入然后一直沒用上的SSD一枚 型号:PX-G512M6e ", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + }, + { + "emoji": { + "icon_url": "http://i0.hdslb.com/bfs/emote/6ea59c827c414b4a2955fe79e0f6fd3dcd515e24.png", + "size": 1, + "text": "[tv_doge]", + "type": 1 + }, + "orig_text": "[tv_doge]", + "text": "[tv_doge]", + "type": "RICH_TEXT_NODE_TYPE_EMOJI" + }, + { + "orig_text": " 关注并转发抽奖送出", + "text": " 关注并转发抽奖送出", + "type": "RICH_TEXT_NODE_TYPE_TEXT" + } + ], + "text": "​互动抽奖#转发抽奖##PC硬件##旧货清理计划# 很久以前购入然后一直沒用上的SSD一枚 型号:PX-G512M6e [tv_doge] 关注并转发抽奖送出" + }, + "major": { + "draw": { + "id": 24303852, + "items": [ + { + "height": 1242, + "size": 150.93652, + "src": "https://i0.hdslb.com/bfs/album/cd767602a291a5b7d4deebd8c65ebeeb0dfce1a2.jpg", + "tags": [], + "width": 2688 + } + ] + }, + "type": "MAJOR_TYPE_DRAW" + }, + "topic": null + } + }, + "type": "DYNAMIC_TYPE_DRAW", + "visible": true + }, + "type": "DYNAMIC_TYPE_FORWARD", + "visible": true + }, + { + "basic": { + "comment_id_str": "55", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "55" + }, + "id_str": 76690937085980, + "modules": { + "module_author": { + "face": "http://i0.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/1/dynamic", + "label": "", + "mid": 1, + "name": "bishi", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "2009-07-13", + "pub_ts": 1247496094, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1816099200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "archive": { + "aid": "55", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "text": "投稿视频" + }, + "bvid": "BV1xx411c7Ug", + "cover": "http://i0.hdslb.com/bfs/archive/c392288c19bbdf3762919774bce01c76dc346344.jpg", + "desc": "没有听过这首歌的话会是人参的一大遗憾呢..(望天", + "disable_preview": 0, + "duration_text": "01:38", + "jump_url": "//www.bilibili.com/video/BV1xx411c7Ug", + "stat": { + "danmaku": "2965", + "play": "116.6万" + }, + "title": "【天哥版】最春哥", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 20434, + "forbidden": false + }, + "forward": { + "count": 585, + "forbidden": false + }, + "like": { + "count": 27958, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + }, + { + "basic": { + "comment_id_str": "16", + "comment_type": 1, + "like_icon": { + "action_url": "", + "end_url": "", + "id": 0, + "start_url": "" + }, + "rid_str": "16" + }, + "id_str": 55783037337604, + "modules": { + "module_author": { + "face": "http://i0.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", + "face_nft": false, + "following": null, + "jump_url": "//space.bilibili.com/1/dynamic", + "label": "", + "mid": 1, + "name": "bishi", + "official_verify": { + "desc": "", + "type": -1 + }, + "pendant": { + "expire": 0, + "image": "", + "image_enhance": "", + "image_enhance_frame": "", + "name": "", + "pid": 0 + }, + "pub_action": "投稿了视频", + "pub_location_text": "", + "pub_time": "2009-07-09", + "pub_ts": 1247073333, + "type": "AUTHOR_TYPE_NORMAL", + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": 1816099200000, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", + "label_theme": "annual_vip", + "path": "", + "text": "年度大会员", + "text_color": "#FFFFFF", + "use_img_label": true + }, + "nickname_color": "#FB7299", + "status": 1, + "theme_type": 0, + "type": 2 + } + }, + "module_dynamic": { + "additional": null, + "desc": null, + "major": { + "archive": { + "aid": "16", + "badge": { + "bg_color": "#FB7299", + "color": "#FFFFFF", + "text": "投稿视频" + }, + "bvid": "BV1xx411c7mi", + "cover": "http://i1.hdslb.com/bfs/archive/ef521697c031bd2b0aab5c8aab3abe1ea0ca63b9.jpg", + "desc": "CRUCIS FATAL FAKE : Fate Stay Night的同人格斗游戏. MV制作 : yaomenghua 天下格斗之同人堂", + "disable_preview": 0, + "duration_text": "09:43", + "jump_url": "//www.bilibili.com/video/BV1xx411c7mi", + "stat": { + "danmaku": "6205", + "play": "141.8万" + }, + "title": "【FATE相关】CRUCIS FATAL FAKE MV 《Faker》", + "type": 1 + }, + "type": "MAJOR_TYPE_ARCHIVE" + }, + "topic": null + }, + "module_more": { + "three_point_items": [ + { + "label": "举报", + "type": "THREE_POINT_REPORT" + } + ] + }, + "module_stat": { + "comment": { + "count": 13354, + "forbidden": false + }, + "forward": { + "count": 473, + "forbidden": false + }, + "like": { + "count": 39657, + "forbidden": false, + "status": false + } + } + }, + "type": "DYNAMIC_TYPE_AV", + "visible": true + } + ], + "offset": "", + "update_baseline": "", + "update_num": 0 + } +} +``` + +</details> diff --git a/dynamic/tag_dynamics.md b/docs/dynamic/tag_dynamics.md similarity index 99% rename from dynamic/tag_dynamics.md rename to docs/dynamic/tag_dynamics.md index d6c9697..e4d8dcc 100644 --- a/dynamic/tag_dynamics.md +++ b/docs/dynamic/tag_dynamics.md @@ -1,11 +1,8 @@ # 话题下特定动态信息 -- [获取包含置顶及热门的动态列表](#获取包含置顶及热门的动态列表) -- [获取历史动态列表](#获取历史动态列表) ---- ## 获取包含置顶及热门的动态列表 -> http://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics +> https://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics *请求方式:GET* @@ -59,12 +56,12 @@ topic_name方式: ```shell -curl -G 'http://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics' \ +curl -G 'https://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics' \ --data-urlencode 'topic_name=哔哩哔哩漫画&sortby=2' ``` topic_id方式: ```shell -curl -G 'http://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics' \ +curl -G 'https://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics' \ --data-urlencode 'topic_id=7539944&sortby=2' ``` @@ -3344,7 +3341,7 @@ curl -G 'http://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics' \ </details> ## 获取历史动态列表 -> http://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_history +> https://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_history *请求方式:GET* @@ -3396,12 +3393,12 @@ curl -G 'http://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics' \ topic_name方式: ```shell -curl -G 'http://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_history' \ +curl -G 'https://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_history' \ --data-urlencode 'topic_name=哔哩哔哩漫画&offset_dynamic_id=0' ``` topic_id方式: ```shell -curl -G 'http://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_history' \ +curl -G 'https://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_history' \ --data-urlencode 'topic_id=7539944&offset_dynamic_id=0' ``` diff --git a/docs/dynamic/topic.md b/docs/dynamic/topic.md new file mode 100644 index 0000000..570367d --- /dev/null +++ b/docs/dynamic/topic.md @@ -0,0 +1,202 @@ +# 话题搜索 + +## 搜索发布话题 + +> https://app.bilibili.com/x/topic/pub/search +> https://api.bilibili.com/x/topic/pub/search + +*请求方法: GET* + +注: 该接口可能存在传入页面大小与返回数量不匹配的问题, 可能与访问权限有关 + +<!--{ + "from": { + "url": "https://t.bilibili.com/" + "selector": ".bili-topic-search__input__inner" + } +}--> + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| keywords | str | 关键词 | 不必要 | | +| content | str | 空 | 不必要 | | +| upload_id | str | 上传 id? | 不必要 | 页面刷新第一次请求时为空, 后均非空<br />似乎为固定值, 格式: `${your_mid}_${login_or_last_refresh_or_cookie_ts}_${dig4}`, 如 `616368979_1722652786_2534` | +| page_size | int | 页大小 | 不必要 | 默认为 20 | +| page_num | int | 1 | 不必要 | 不用于翻页 | +| offset | int | 偏移 | 不必要 | 可从响应 `data.page_info.offset` 中获取 | +| web_location | str | 333.1365 | 不必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功<br />-400: 请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| new_topic | obj | 新建话题? | | +| has_create_jurisdiction | bool | false | 是否有创建权限? | +| topic_items | array | 话题列表 | | +| request_id | str | 请求 id | | +| page_info | obj | 页信息 | | + +`data` 中的 `new_topic` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| name | str | 请求参数中的 `keywords` | | + +`data` 中的 `topic_items` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| id | num | 话题 id | | +| name | str | 话题名 | | +| view | num | 观看数 | | +| discuss | num | 讨论数 | | +| stat_desc | str | 状态描述 | | +| description | str | 话题描述 | | +| show_interact_data | bool | false | 是否显示互动数据? | + +`data` 中的 `page_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| offset | num | 下次请求可用的偏移 | 请求参数中的 `offset` + `page_size` | +| has_more | bool | 是否有更多数据 | 当没有更多时可能不存在该字段 | + +**示例:** + +注: 该示例就是解释开头所注的问题的一个示例 + +```shell +curl -G 'https://app.bilibili.com/x/topic/pub/search' \ +--url-query 'keywords=2233' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "new_topic": { + "name": "2233" + }, + "has_create_jurisdiction": false, + "topic_items": [ + { + "id": 1101122, + "name": "2233异世集", + "view": 2502, + "discuss": 11, + "stat_desc": "2502浏览·11讨论", + "description": "分享数字周边", + "show_interact_data": false + }, + { + "id": 1050671, + "name": "2233生日倒计时", + "view": 21149, + "discuss": 130, + "stat_desc": "2.1万浏览·130讨论", + "description": "2233生日倒计时", + "show_interact_data": false + }, + { + "id": 1057129, + "name": "2233手办可可爱爱", + "view": 836, + "discuss": 14, + "stat_desc": "836浏览·14讨论", + "description": "喜欢2233,", + "show_interact_data": false + } + ], + "request_id": "1$0$1723796266$7f515d4e26b7bd5007fb8ca4b066bf0b", + "page_info": { + "offset": 4, + "has_more": true + } + } +} +``` + +</details> + +## 推荐搜索话题? + +> https://app.bilibili.com/x/topic/pub/rcmd/search +> https://api.bilibili.com/x/topic/pub/rcmd/search + +*请求方法: GET* + +注: 该接口啥也不返回, 但是网页端会请求该接口 + +<!--{ + "from": { + "url": "https://t.bilibili.com/" + }, + "gh": [1083] +}--> + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| keywords | str | 空 | 不必要 | | +| upload_id | str | 上传 id? | 不必要 | 同上 | +| web_location | str | 333.1365 | 不必要 | 有时请求不带该参数 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | str | 数据本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | -- | --- | +| topic_items | array | 空 | | +| request_id | str | 请求 id | 当传入 `keywords` 时不为空| + +**示例:** + +```shell +curl -G 'https://app.bilibili.com/x/topic/pub/rcmd/search' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "topic_items": [], + "request_id": "" + } +} +``` + +</details> diff --git a/electric/Bcoin.md b/docs/electric/Bcoin.md similarity index 78% rename from electric/Bcoin.md rename to docs/electric/Bcoin.md index 887d0f3..970d1bc 100644 --- a/electric/Bcoin.md +++ b/docs/electric/Bcoin.md @@ -1,22 +1,14 @@ # B币方式充电 -<img src="/imgs/battery-100.png" width="100" height="100"/> +<img src="../../assets/img/battery-100.png" width="100" height="100"/> -**注:以前充电是电池的概念,1B币折合10电池,一般地充电10电池可获得1经验** +**注**:以前充电是电池的概念,1B币折合10电池,一般地充电10电池可获得1经验 **目前(2020/12/02后)则是贝壳的概念,1B币折合1贝壳、1经验(如果存在小数点,则经验值向下取整,即2.5B币获得2经验)** ---- - -- [B币方式充电](#b币方式充电) - - [新版本B币充电](#新版本b币充电) - - [老版本B币充电](#老版本b币充电) - ---- - ## 新版本B币充电 -> http://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick +> https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick *请求方式:POST* @@ -26,7 +18,7 @@ | 参数名 | 类型 | 内容 | 必要性 | 备注 | | -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | -| bp_num | num | 贝壳数量 | 必要 | 必须在20-99990之间 | +| bp_num | num | 贝壳数量 | 必要 | 必须在2-9999之间 | | is_bp_remains_prior | bool | 是否优先扣除B币余额 | 必要 | [true,false],B币充电请选择true | | up_mid | num | 充电对象用户mid | 必要 | | | otype | str | 充电来源 | 必要 | up:空间充电<br />archive:视频充电 | @@ -39,7 +31,7 @@ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功(并不代表充电成功) <br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误 | +| code | num | 返回值 | 0:成功(并不代表充电成功) <br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />-500:服务器错误 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | obj | 信息本体 | | @@ -51,7 +43,7 @@ | mid | num | 本用户mid | | | up_mid | num | 目标用户mid | | | order_no | str | 留言token | 用于添加充电留言 | -| bp_num | num | 充电贝壳数 | | +| bp_num | str | 充电贝壳数 | | | exp | num | 获得经验数 | | | status | num | 返回结果 | 4:成功<br />-2:低于20电池下限<br />-4:B币不足 | | msg | str | 错误信息 | 默认为空 | @@ -80,17 +72,17 @@ curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \ ```json { - "code":0, - "message":"0", - "ttl":1, - "data":{ - "mid":293793435, - "up_mid":293793435, - "order_no":"BPRG5CEC3VUPOOANA540", - "bp_num":2, - "exp":2, - "status":4, - "msg":"" + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "mid": 293793435, + "up_mid": 293793435, + "order_no": "BPRG5CEC3VUPOOANA540", + "bp_num": 2, + "exp": "2", + "status": 4, + "msg": "" } } ``` @@ -116,17 +108,17 @@ curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \ ```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" + "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" } } ``` @@ -153,17 +145,17 @@ curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \ ```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 币余额不足" + "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 币余额不足" } } ``` @@ -178,7 +170,7 @@ curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \ <details> <summary>查看折叠内容</summary> -> http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick +> https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick *请求方式:POST* @@ -226,7 +218,7 @@ curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \ ~~再次自己冲自己QAQ~~ ```shell -curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ +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' \ @@ -240,17 +232,17 @@ curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ ```json { - "code":0, - "message":"0", - "ttl":1, - "data":{ - "mid":293793435, - "up_mid":293793435, - "order_no":"BPRG5CEC3VUPOOANA540", - "elec_num":20, - "exp":2, - "status":4, - "msg":"" + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "mid": 293793435, + "up_mid": 293793435, + "order_no": "BPRG5CEC3VUPOOANA540", + "elec_num": 20, + "exp": 2, + "status": 4, + "msg": "" } } ``` @@ -262,7 +254,7 @@ curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ 此时`data`.`status`=`-2` ```shell -curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ +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' \ @@ -276,17 +268,17 @@ curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ ```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" + "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" } } ``` @@ -298,7 +290,7 @@ curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ 此时`data`.`status`=`-4` ```shell -curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ +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' \ @@ -312,17 +304,17 @@ curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ ```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 币余额不足" + "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 币余额不足" } } ``` diff --git a/electric/WeChat&Alipay.md b/docs/electric/WeChat&Alipay.md similarity index 73% rename from electric/WeChat&Alipay.md rename to docs/electric/WeChat&Alipay.md index 3ecb018..2d2e193 100644 --- a/electric/WeChat&Alipay.md +++ b/docs/electric/WeChat&Alipay.md @@ -1,26 +1,17 @@ # 微信&支付宝方式充电 -<img src="/imgs/battery-100.png" width="100" height="100"/> - -- [申请充电二维码及扫码秘钥](#申请充电二维码及扫码秘钥) - -- [检查扫码支付结果](#检查扫码支付结果) - ---- +<img src="../../assets/img/battery-100.png" width="100" height="100"/> 操作流程: -1.申请充电二维码及扫码秘钥,秘钥临时保存备用 - -2.使用`qr_code_url`中的值生成二维码 - -3.用支付宝或微信扫描 - -4.以扫码秘钥作为参数轮询检查扫码支付结果 +1. 申请充电二维码及扫码秘钥,秘钥临时保存备用 +2. 使用`qr_code_url`中的值生成二维码 +3. 用支付宝或微信扫描 +4. 以扫码秘钥作为参数轮询检查扫码支付结果 ## 申请充电二维码及扫码秘钥 -> http://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/qr_code/create +> https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/qr_code/create *请求方式:POST* @@ -32,9 +23,9 @@ | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ------------------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| bp_num | num | 充电B币数量 | 必要 | 必须在2-9999之间 | -| up_mid | num | 充电对象用户mid | 必要 | | +| bp_num | num | 充电B币数量 | 必要 | 必须在2-9999之间 | | is_bp_remains_prior | bool | 是否优先扣除B币 | 必要 | true:是<br />false:否<br />在B币不足时剩余的部分利用支付平台支付 | +| up_mid | num | 充电对象用户mid | 必要 | | | otype | str | 充电来源 | 必要 | up:空间充电<br />archive:视频充电 | | oid | num | 充电来源代码 | 必要 | 空间充电:充电对象用户mid<br />视频充电:稿件avid | | csrf | str | CSRF Token(位于cookie) | 必要 | | @@ -63,7 +54,7 @@ 申请空间的方式向用户23215368充电10电池且不使用B币的支付二维码 ```shell -curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/create' \ +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' \ @@ -82,7 +73,7 @@ curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/create' \ "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_code_url": "https://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/gateway?mid=293793435&token=c1cb1d95d2194ba58df6bb0f24ae1aaa", "qr_token": "c1cb1d95d2194ba58df6bb0f24ae1aaa", "exp": 1 } @@ -93,7 +84,7 @@ curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/create' \ ## 检查扫码支付结果 -> http://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status +> https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status *请求方式:GET* @@ -127,10 +118,10 @@ curl 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/create' \ **示例:** -当申请到的支付二维码未被扫描时,`data`.`ststus`的值为`2` +当申请到的支付二维码未被扫描时,`data`.`status`的值为`2` ```shell -curl -G 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ +curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ --data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \ -b 'SESSDATA=xxx' ``` @@ -140,23 +131,23 @@ curl -G 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ ```json { - "code":0, - "message":"0", - "ttl":1, - "data":{ - "qr_token":"c7cbdc47fc424cd18f2146db653597b8", - "mid":293793435, - "status":2 + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "qr_token": "c7cbdc47fc424cd18f2146db653597b8", + "mid": 293793435, + "status": 2 } } ``` </details> -当申请到的支付二维码已扫描但未确认时,`data`.`ststus`的值为`3` +当申请到的支付二维码已扫描但未确认时,`data`.`status`的值为`3` ```shell -curl -G 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ +curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ --data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \ -b 'SESSDATA=xxx' ``` @@ -166,23 +157,23 @@ curl -G 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ ```json { - "code":0, - "message":"0", - "ttl":1, - "data":{ - "qr_token":"c7cbdc47fc424cd18f2146db653597b8", - "mid":293793435, - "status":3 + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "qr_token": "c7cbdc47fc424cd18f2146db653597b8", + "mid": 293793435, + "status": 3 } } ``` </details> -成功支付后,`data`.`ststus`的值为`1`,且`data`.`order_no`存在留言token +成功支付后,`data`.`status`的值为`1`,且`data`.`order_no`存在留言token ```shell -curl -G 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ +curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ --data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \ -b 'SESSDATA=xxx' ``` @@ -192,14 +183,14 @@ curl -G 'http://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ ```json { - "code":0, - "message":"0", - "ttl":1, - "data":{ - "qr_token":"bd649c836c524550bfe22a369334fc05", - "order_no":"BPTD36U3KP82I31RSSLG", - "mid":293793435, - "status":1 + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "qr_token": "bd649c836c524550bfe22a369334fc05", + "order_no": "BPTD36U3KP82I31RSSLG", + "mid": 293793435, + "status": 1 } } ``` diff --git a/docs/electric/charge_list.md b/docs/electric/charge_list.md new file mode 100644 index 0000000..6bd2cdd --- /dev/null +++ b/docs/electric/charge_list.md @@ -0,0 +1,542 @@ +# 充电列表 + +## 获取空间充电公示列表 + +> <https://api.bilibili.com/x/ugcpay-rank/elec/month/up> + +*请求方式:GET* + +本接口需要在请求标头中提供有效的浏览器 UA,如 `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36` + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| up_mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误<br />88214:up主未开通充电 | +| message | str | 错误信息 | | +| ttl | num | 0 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ----- | ---------------- | --------------- | +| count | num | 本月充电人数 | | +| list | array | 本月充电用户列表 | | +| total_count | num | 总计充电次数 | | +| total | num | 总计充电次数 | 同`total_count` | +| special_day | num | 0 | 作用尚不明确 | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | ---------------- | +| 0 | obj | 充电用户1 | | +| n | obj | 充电用户(n+1) | 按照充电排名排列 | +| …… | obj | …… | …… | + +`data`中的`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ---------------- | ---------------- | +| uname | str | 充电用户昵称 | | +| avatar | str | 充电用户头像url | | +| mid | num | 充电对象mid | | +| pay_mid | num | 充电用户mid | | +| rank | num | 充电用户排名 | 取决于充电的多少 | +| trend_type | num | 0 | 作用尚不明确 | +| vip_info | obj | 充电用户会员信息 | | +| message | str | 充电留言 | 无为空 | +| msg_hidden | num | 0 | 作用尚不明确 | + +`list`数组中的对象中的`vip_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | -------------- | ----- | +| vipDueMsec | num | 大会员过期时间 | 恒为0 | +| vipStatus | num | 大会员状态 | 包月充电时恒为0<br />自定义充电:<br />0:无<br />1:有 | +| vipType | num | 大会员类型 | 包月充电时恒为0<br />自定义充电:<br />0:无<br />1:月大会员<br />2:年度及以上大会员 | + +**示例:** + +查询用户`mid=53456`的充电公示列表 + +```shell +curl -G 'https://api.bilibili.com/x/ugcpay-rank/elec/month/up' \ + -A 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36' \ + --data-urlencode 'up_mid=53456' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "", + "ttl": 0, + "data": { + "count": 8521, + "list": [ + { + "uname": "云梦澡堂", + "avatar": "https://i1.hdslb.com/bfs/face/6589df5fdac0f80593f6a86e4d88dc08e25df3d2.jpg", + "mid": 53456, + "pay_mid": 1555775947, + "rank": 1, + "trend_type": 0, + "vip_info": { "vipDueMsec": 0, "vipStatus": 0, "vipType": 0 }, + "message": "", + "message_hidden": 0 + }, + { + "uname": "在下小天子", + "avatar": "https://i1.hdslb.com/bfs/face/a3bfbe6186889bb50dcd87c1156d07a70227a25b.jpg", + "mid": 53456, + "pay_mid": 508630801, + "rank": 2, + "trend_type": 0, + "vip_info": { "vipDueMsec": 0, "vipStatus": 0, "vipType": 0 }, + "message": "", + "message_hidden": 0 + } + ], + "total_count": 41919, + "total": 41919, + "special_day": 0 + } +} +``` + +</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 | 作用尚不明确 | +| cnt_priv_type | num | 0 | 作用尚不明确 | +| list | array | 本月充电用户列表 | | + +`data`中的`show_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ------------------------ | ---------------- | +| show | bool | 是否展示视频充电鸣谢名单 | | +| state | num | 充电功能开启状态 | -1:未开通充电功能<br />1:已开通自定义充电<br />2:已开通包月、自定义充电<br />3:已开通包月高档、自定义充电 | +| title | str | 充电按钮显示文字 | 空字符串或 `充电` 或 `充电中` | +| jump_url | str | 跳转url | | +| icon | str | 充电图标 | | +| high_level | obj | 充电专属视频信息 | | +| with_qa_id | num | 充电问答id | | + +`show_info`中的`high_level`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ---- | ------------------------------ | ---------------- | +| privilege_type | num | 解锁视频所需最低定价档位的代码 | 见[充电档位代码与定价](../electric/monthly.md#充电档位代码privilege_type与定价) | +| title | str | 提示标题 | `该视频为「{充电档位名称}」专属视频` | +| sub_title | str | 提示子标题 | `开通「{充电档位定价}元档包月充电」即可观看` | +| show_button | bool | 是否显示按钮 | | +| button_text | str | 按钮文本 | `去开通` | +| jump_url | obj | 跳转url信息 | 详细信息有待补充 | +| intro | str | 充电介绍语 | | +| open | bool | (?) | | +| new | bool | (?) | | +| question_text | str | (?) | | +| qa_detail_link | str | (?) | | + +`high_level`中的`jump_url`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | ----------------------- | ---- | +| up_link | str | UP主包月充电购买页面url | | +| paywall_link | str | 视频试看后的提示页面url | | +| previewbar_link | str | 视频预览页面url | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | ---------------- | +| 0 | obj | 充电用户1 | | +| n | obj | 充电用户(n+1) | 按照充电排名排列 | +| …… | obj | …… | …… | + +`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 />自定义充电:<br />0:无<br />1:月大会员<br />2:年度及以上大会员 | +| vipDueMsec | num | 大会员过期时间 | 恒为0 | +| vipStatus | num | 大会员状态 | 包月充电时恒为0<br />自定义充电:<br />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": 2, + "title": "充电", + "jump_url": "https://www.bilibili.com/h5/upower/index?mid=53456&navhide=1&prePage=video&oid=967773538", + "icon": "https://i0.hdslb.com/bfs/garb/item/33e2e72d9a0c855f036b4cb55448f44af67a0635.png", + "high_level": { + "privilege_type": 0, + "title": "", + "sub_title": "", + "show_button": false, + "button_text": "", + "jump_url": { "up_link": "", "paywall_link": "", "previewbar_link": "" }, + "intro": "", + "open": false, + "new": false + } + }, + "av_count": 0, + "count": 0, + "total_count": 41919, + "special_day": 0, + "display_num": 0, + "cnt_priv_type": 0, + "list": [ + { + "mid": 53456, + "pay_mid": 1555775947, + "rank": 1, + "uname": "云梦澡堂", + "avatar": "https://i1.hdslb.com/bfs/face/6589df5fdac0f80593f6a86e4d88dc08e25df3d2.jpg", + "message": "", + "msg_deleted": 0, + "vip_info": { "vipType": 0, "vipDueMsec": 0, "vipStatus": 0 }, + "trend_type": 0 + }, + { + "mid": 53456, + "pay_mid": 508630801, + "rank": 2, + "uname": "在下小天子", + "avatar": "https://i1.hdslb.com/bfs/face/a3bfbe6186889bb50dcd87c1156d07a70227a25b.jpg", + "message": "", + "msg_deleted": 0, + "vip_info": { "vipType": 0, "vipDueMsec": 0, "vipStatus": 0 }, + "trend_type": 0 + } + ] + } +} +``` + +</details> + +## 查询我收到的充电列表 + +> <https://pay.bilibili.com/bk/brokerage/listForCustomerRechargeRecord> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**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 />800501007:user not login<br />800501008:内部错误<br />800501011:请求参数有误 | +| errno | num | | | +| msg | str | | | +| showMsg | str | | | +| data | obj | 信息本体 | | +| success | bool | | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ----- | ------------ | ---- | +| page | obj | 分页信息 | | +| result | array | 充电信息本体 | | +| config | array | (?) | | + +`page`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ------------ | ---- | +| currentPage | num | 当前页数 | | +| pageSize | num | 当前分页大小 | | +| totalCount | num | 记录总数 | | +| totalPage | num | 总页数 | | + +`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 | + +`config`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | ---- | ---------- | +| mid | null | | 总是为null | +| name | null | | 总是为null | +| avatar | null | | 总是为null | +| originalThirdCoin | null | | 总是为null | +| brokerage | null | | 总是为null | +| remark | null | | 总是为null | +| ctime | null | | 总是为null | + +**示例:** + +```shell +curl -G 'https://pay.bilibili.com/bk/brokerage/listForCustomerRechargeRecord' \ + --data-urlencode 'currentPage=1' \ + --data-urlencode 'pageSize=2' \ + --data-urlencode 'customerId=10026' \ + -b '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* + +认证方式:Cookie(SESSDATA) + +**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 -G 'https://member.bilibili.com/x/h5/elec/rank/recent' \ + -b '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> diff --git a/docs/electric/charge_msg.md b/docs/electric/charge_msg.md new file mode 100644 index 0000000..534fe9f --- /dev/null +++ b/docs/electric/charge_msg.md @@ -0,0 +1,298 @@ +# 充电留言 + +## 发送充电留言 + +> https://api.bilibili.com/x/ugcpay/trade/elec/message + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ------------------------ | ------ | ---- | +| order_id | str | 留言token | 必要 | | +| message | str | 留言内容 | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功 <br />-101:账号未登录<br />-111:csrf校验失败<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* + +认证方式:Cookie(SESSDATA) + +**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`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ----- | -------- | ---- | +| list | array | 信息本体 | | +| pager | obj | 分页信息 | | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ---------------------- | ---- | +| aid | num | | | +| bvid | str | | | +| id | num | 留言记录id | | +| mid | num | 0 | | +| 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 | | + +`pager`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ------------ | ---- | +| current | num | 当前页数 | | +| size | num | 当前分页大小 | | +| total | num | 记录总数 | | + +**示例:** + +```shell +curl 'https://member.bilibili.com/x/web/elec/remark/list?begin=2016-01-01&end=2050-01-01&pn=1&ps=10' \ + -b '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 + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**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 | 留言者mid(充电用户) | | +| reply_mid | num | UP主mid | | +| 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 'https://member.bilibili.com/x/web/elec/remark/detail?id=6507563' \ + -b '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* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| csrf | str | csrf | 必要 | | +| id | num | 留言id | 必要 | | +| msg | str | 回复信息 | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />-400:请求错误<br />20004:充电服务异常 | +| message | str | 错误信息 | | +| ttl | num | 1 | | +| data | num | 数据本体 | 1:成功<br />2:失败 | + +**示例:** + +```shell +curl 'https://member.bilibili.com/x/web/elec/remark/reply' \ + -b 'SESSDATA=xxx' \ + --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> diff --git a/docs/electric/monthly.md b/docs/electric/monthly.md new file mode 100644 index 0000000..21dc3ef --- /dev/null +++ b/docs/electric/monthly.md @@ -0,0 +1,746 @@ +# 包月充电 + +<img src="../../assets/img/battery-100.png" width="100" height="100"/> + +## 常量说明 + +### 充电档位代码(`privilege_type`)与定价 + +| 代码 | 定价(单位:元人民币) | +| :--: | :--------------------: | +| 10 | 6 | +| 20 | 30 | +| 30 | 50 | +| 40 | 88 | +| 50 | 128 | +| 60 | 288 | +| 70 | 588 | +| 80 | 998 | +| 100 | 18 | +| 110 | 238 | +| 130 | 68 | + +## 获取包月充电列表 + +> <https://api.live.bilibili.com/xlive/revenue/v1/guard/getChargeRecord> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ------------------------ | +| page | num | 页码 | 必要 | | +| type | num | 充电状态 | 必要 | 1:使用中<br />2:已过期 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------------------- | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误<br />25100004:参数错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | ---------------- | ---------------- | +| list | 有内容时:array<br />无内容时:null | 包月充电UP主列表 | 最多10个 | +| page | num | 当前页数 | | +| page_size | num | 当前分页大小 | 一般为10 | +| total_page | num | 总页数 | | +| total_num | num | 用户总数 | | +| is_more | num | 是否有更多用户 | 0:否<br />1:是 | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---------------- | +| 0 | obj | 用户1 | | +| n | obj | 用户(n+1) | | +| …… | obj | …… | …… | + +数组`list`中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------- | ----- | ------------------------ | ---------- | +| up_uid | num | 充电UP主mid | | +| user_name | str | 充电UP主昵称 | | +| user_face | str | 充电UP主头像url | | +| item | array | 充电详情 | | +| start | num | 开始充电时间 | 秒级时间戳 | +| high_level_state | num | 是否可对UP主进行高档充电 | | +| elec_reply_state | num | 是否可对UP主进行专属问答 | 0:否<br />1:是<br />2:状态未知 | + +数组`list`中的对象中的`item`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | -------- | +| 0 | obj | 充电档位1 | | +| n | obj | 充电档位(n+1) | | +| …… | obj | …… | …… | + +数组`item`中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | --------------------------------------------- | ---------------- | ---------------- | +| privilege_type | num | 充电档位代码 | 详见[充电档位代码与定价](#充电档位代码privilege_type与定价) | +| icon | str | 充电图标 | | +| name | str | 充电档位名称 | | +| expire_time | num | 该档位过期时间 | 秒级时间戳 | +| renew | 开启自动续费时:obj<br />关闭自动续费时:null | 充电自动续费详情 | | +| start_time | num | 该档位生效时间 | 秒级时间戳 | +| renew_list | 开启自动续费时:array<br />关闭自动续费时:null | 充电自动续费列表 | | + +`renew`对象、`renew_list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | ------------ | ------------------------------------------------- | +| uid | num | 自己的mid | | +| ruid | num | UP主的mid | | +| goods_id | num | 充电类型 | 172:一个月<br />173:连续包月<br />174:连续包年 | +| status | num | 充电状态 | 1 | +| next_execute_time | num | 下次续费时间 | 秒级时间戳 | +| signed_time | num | 签约时间 | 秒级时间戳 | +| signed_price | num | 下次续费金额 | 单位为千分之一元人民币 | +| pay_channel | num | 签约平台 | 2:微信支付<br />4:支付宝 | +| period | num | 下次充电天数 | | +| mobile_app | str | 充电渠道 | 可为`android`等 | + +**示例:** + +获取自己正在使用的包月充电的列表 + +```shell +curl 'https://api.live.bilibili.com/xlive/revenue/v1/guard/getChargeRecord' \ + --data-urlencode 'page=1' \ + --data-urlencode 'type=1' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "up_uid": 2233, + "user_name": "2233", + "user_face": "https://i0.hdslb.com/bfs/face/noface.jpg", + "item": [ + { + "privilege_type": 10, + "icon": "https://s1.hdslb.com/bfs/templar/york-static/lightning_icon@2x.png", + "name": "为TA充电", + "expire_time": 1703519999, + "renew": { + "uid": 425503913, + "ruid": 2233, + "goods_id": 174, + "status": 1, + "next_execute_time": 1703174400, + "signed_time": 1671618921, + "signed_price": 36000, + "pay_channel": 2, + "period": 366, + "mobile_app": "android" + }, + "start_time": 1671618921, + "renew_list": [ + { + "uid": 425503913, + "ruid": 2233, + "goods_id": 174, + "status": 1, + "next_execute_time": 1703174400, + "signed_time": 1671618921, + "signed_price": 36000, + "pay_channel": 2, + "period": 366, + "mobile_app": "android" + } + ] + } + ], + "start": 1669183804, + "high_level_state": 1, + "elec_reply_state": 1 + }, + { + "up_uid": 293793435, + "user_name": "社会易姐QwQ", + "user_face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "item": [ + { + "privilege_type": 10, + "icon": "https://s1.hdslb.com/bfs/templar/york-static/lightning_icon@2x.png", + "name": "为TA充电", + "expire_time": 1681401599, + "renew": { + "uid": 425503913, + "ruid": 293793435, + "goods_id": 173, + "status": 1, + "next_execute_time": 1680364800, + "signed_time": 1677760921, + "signed_price": 5000, + "pay_channel": 4, + "period": 31, + "mobile_app": "android" + }, + "start_time": 1677760921, + "renew_list": [ + { + "uid": 425503913, + "ruid": 293793435, + "goods_id": 173, + "status": 1, + "next_execute_time": 1680364800, + "signed_time": 1677760921, + "signed_price": 5000, + "pay_channel": 4, + "period": 31, + "mobile_app": "android" + } + ] + } + ], + "start": 1676033795, + "high_level_state": 1, + "elec_reply_state": 1 + } + ], + "page": 1, + "page_size": 10, + "total_page": 3, + "total_num": 22, + "is_more": 1 + } +} +``` + +</details> + +表示自己从2022-11-23 14:10:04开始给“2233”包月充电,并且在2022-12-21 18:35:21在微信开通了连续包年充电,在2023-12-22 00:00:00的时候会自动续费36元,并继续充电366天; + +自己从2023-02-10 20:56:35开始给“社会易姐QwQ”包月充电,并且在2023-03-02 20:42:01在支付宝开通了连续包月充电,在2023-04-02 00:00:00的时候会自动续费5元,并继续充电31天。 + +## UP主包月充电详情 + +> <https://api.bilibili.com/x/upower/item/detail> + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| up_mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------ | ---- | -------------------------- | ------------------------------ | +| upower_rank | obj | 充电详情 | | +| item | obj | 充电欢迎语信息 | | +| user_card | obj | UP主信息 | | +| upower_level | num | UP主开通的充电等级 | 1:非高档充电<br />2:高档充电 | +| elec_reply_state | num | 是否可对UP主进行专属问答 | | +| voucher_state | obj | 包月充电券信息 | **详细信息有待补充** | +| upower_right_count | obj | 不同充电档位下的充电权益数 | | +| only_contain_medal | bool | 享有的权益仅为粉丝勋章 | | +| privilege_type | num | 当前给该UP主包月充电的档位 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价),若从未给该UP主包月充电过则为0 | + +`data`中的`upower_rank`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | ---------------- | ------------ | +| total | num | 充电用户总数 | | +| total_desc | str | 充电总数文字说明 | 示例:“1+” | +| list | array | 充电用户列表 | 最多展示30个 | + +`upower_rank`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | -------------------------- | +| 0 | obj | 用户1 | | +| n | obj | 用户(n+1) | 按照最初充电时间排序(?) | +| …… | obj | …… | …… | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | --------------- | ---- | +| rank | num | 充电用户索引 | | +| mid | num | 充电用户mid | | +| nickname | str | 充电用户昵称 | | +| avatar | str | 充电用户头像url | | + +`data`中的`item`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | ---------------- | ---- | +| intro_video_aid | str | 充电介绍视频AV号 | | +| welcomes | str | 充电介绍语 | | + +`data`中的`user_card`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ----------- | ---- | +| avatar | str | UP主头像url | | +| nickname | str | UP主昵称 | | + +`data`中的`upower_right_count`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ---- | -------------------- | ---- | +| {充电档位代码} | num | 该档位下的充电权益数 | | + +**示例:** + +获取`mid=1265680561`的包月充电详情 + +```shell +curl 'https://api.bilibili.com/x/upower/item/detail' \ + --data-urlencode 'up_mid=1265680561' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "upower_rank": { + "total": 5082, + "total_desc": "5000+", + "list": [ + { + "rank": 1, + "mid": 1476475459, + "nickname": "一只屑椒", + "avatar": "https://i1.hdslb.com/bfs/face/dc721da215f4651e0472d566b146ee8fdf198dbe.jpg" + }, + { + "rank": 2, + "mid": 275365317, + "nickname": "-陪我去看海吧i", + "avatar": "https://i0.hdslb.com/bfs/face/dd7547b13020e7f47549ad7908fd3fc58efadefc.jpg" + }, + { + "rank": 3, + "mid": 401909111, + "nickname": "Vege5able", + "avatar": "https://i2.hdslb.com/bfs/face/46b1fdc94c7851ec0c47817adeec13e3225da559.jpg" + } + ] + }, + "item": { + "intro_video_aid": "", + "welcomes": "哈喽b站的小伙伴们,我的充电计划升级啦! 感兴趣就多多支持我吧~(゜-゜)つロ" + }, + "user_card": { + "avatar": "https://i1.hdslb.com/bfs/face/5ddddba98f0265265662a8f7d5383e528a98412b.jpg", + "nickname": "永雏塔菲" + }, + "upower_level": 1, + "elec_reply_state": 1, + "voucher_state": { + "voucher_order_id": "95843e812210c455d1ea6e4714bf105a00", + "user_voucher_state": 2, + "vip_action": 0, + "voucher_name": "包月充电券(6元档)", + "validate_price": 0, + "validate_level": 0, + "activity": "", + "common_time": 0, + "high_level_time": 0, + "specify_up": 0, + "specify_level": 0 + }, + "upower_right_count": { + "10": 3 + }, + "only_contain_medal": false, + "privilege_type": 0 + } +} +``` + +</details> + +## 与UP主的包月充电关系 + +> <https://api.bilibili.com/x/upower/charge/follow/info> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| up_mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------ | ---- | ------------------------------ | ------------------------------------------- | +| days | num | 已保持多少天包月充电状态 | | +| up_card | obj | UP主信息 | | +| user_card | obj | 自己的信息 | | +| remain_days | num | 剩余天数 | 未处于包月充电状态为-1 | +| remain_less_1day | num | 剩余的天数是否小于1天 | 0:否<br />1:是<br />未处于包月充电状态为0 | +| upower_rank | obj | 充电详情 | | +| upower_icon | str | 充电图标url | 仅在处于包月充电状态时有内容 | +| upower_right_count | obj | 当前自己享有该UP主的充电权益数 | | +| only_contain_medal | bool | 享有的权益仅为粉丝勋章 | | +| privilege_type | num | 当前给该UP主包月充电的档位代码 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价),若未处于包月充电状态为0 | +| challenge_info | obj | 充电挑战信息 | **详细信息有待补充** | + +`data`中的`up_card`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ---- | ------------ | ---- | +| mid | num | UP主mid | | +| nickname | str | UP主昵称 | | +| official_title | str | UP主认证信息 | | +| avatar | str | UP主头像url | | + +`data`中的`user_card`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ----------- | ---- | +| avatar | str | 用户头像url | | +| nickname | str | 用户昵称 | | + +`data`中的`upower_rank`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | ---------------- | ----------- | +| total | num | 充电用户总数 | | +| total_desc | str | 充电总数文字说明 | 示例:“1+” | +| list | array | 充电用户列表 | 最多展示6个 | + +`upower_rank`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---------------- | +| 0 | obj | 用户1 | | +| n | obj | 用户(n+1) | 按照充电时间排序 | +| …… | obj | …… | …… | + +数组`list`中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | --------------- | ---- | +| rank | num | 充电用户索引 | | +| mid | num | 充电用户mid | | +| nickname | str | 充电用户昵称 | | +| avatar | str | 充电用户头像url | | + +**示例:** + +获取与`mid=293793435`的包月充电关系 + +```shell +curl 'https://api.bilibili.com/x/upower/charge/follow/info' \ + --data-urlencode 'up_mid=293793435' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "days": 17, + "up_card": { + "mid": 293793435, + "nickname": "社会易姐QwQ", + "official_title": "", + "avatar": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" + }, + "user_card": { + "avatar": "https://i2.hdslb.com/bfs/face/540ed71e2fb2ddd8967c21b392026c34fc15673e.jpg", + "nickname": "晨叶梦春" + }, + "remain_days": 15, + "remain_less_1day": 0, + "upower_rank": { + "total": 1, + "total_desc": "1+", + "list": [ + { + "rank": 1, + "mid": 425503913, + "nickname": "晨叶梦春", + "avatar": "https://i2.hdslb.com/bfs/face/540ed71e2fb2ddd8967c21b392026c34fc15673e.jpg" + } + ] + }, + "upower_icon": "https://i0.hdslb.com/bfs/garb/item/33e2e72d9a0c855f036b4cb55448f44af67a0635.png", + "upower_right_count": 2, + "only_contain_medal": false, + "privilege_type": 10, + "challenge_info": { + "challenge_id": "", + "description": "", + "challenge_type": 0, + "remaining_days": 0, + "end_time": "", + "progress": 0, + "targets": [], + "state": 0, + "end_time_unix": 0, + "pub_dyn": 0, + "dyn_content": "" + } + } +} +``` + +</details> + +表示自己已保持17天对“社会易姐QwQ”的包月充电,剩余15天过期。 + +## 包月充电用户排名 + +> <https://api.bilibili.com/x/upower/up/member/rank/v2> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------------- | ---- | ------------ | ------ | --------- | +| up_mid | num | 目标用户mid | 必要 | | +| ps | num | 每页项数 | 必要 | 最大为101 | +| pn | num | 页码 | 必要 | | +| privilege_type | num | 充电档位代码 | 非必要 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价),默认为可以显示排名的档位中**最高定价**的档位 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ----- | ------------------------------ | -------- | +| up_info | obj | UP主信息 | | +| rank_info | array | 当前档位的充电用户排名 | | +| user_info | obj | 自己在该档位下与UP主的充电关系 | | +| member_total | num | 当前档位的充电用户总数 | | +| privilege_type | num | 当前充电档位代码 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价) | +| is_charge | bool | 自己是否给该UP主包月充电过 | 无论档位 | +| tabs | array | 可显示排名的充电档位代码列表 | | +| level_info | array | 可显示排名的充电档位信息 | | + +`data`中的`up_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | -------------------- | ---------------------------------------- | +| mid | num | UP主mid | | +| nickname | str | UP主昵称 | | +| avatar | str | UP主头像url | | +| type | num | UP主认证类型 | -1:无<br />0:UP主认证<br />1:机构认证 | +| title | str | UP主认证文字 | | +| upower_state | num | UP主充电功能开启状态 | 0:未开通充电功能<br />1:已开通自定义充电<br />2:已开通包月、自定义充电<br />3:已开通包月高档、自定义充电 | + +`data`中的`rank_info`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---------------- | +| 0 | obj | 用户1 | | +| n | obj | 用户(n+1) | 按照充电排名排列 | +| …… | obj | …… | …… | + +`rank_info`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ---------------- | ----- | +| mid | num | 充电用户mid | | +| nickname | str | 充电用户昵称 | | +| avatar | str | 充电用户头像url | | +| rank | num | 充电用户排名 | | +| day | num | 包月充电天数 | | +| expire_at | num | 包月充电过期时间 | 恒为0 | +| remain_days | num | 剩余天数 | 恒为0 | + +`data`中的`user_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ---------------- | ------------------------------- | +| mid | num | 用户mid | | +| nickname | str | 用户昵称 | | +| avatar | str | 用户头像url | | +| rank | num | 包月充电排名 | 不在该充电档位用户列表里为-1 | +| day | num | 包月充电天数 | | +| expire_at | num | 包月充电过期时间 | 秒级时间戳,若从未给UP主在该档位下包月充电过为0 | +| remain_days | num | 剩余天数 | 若该档位充电状态已失效为0 | + +`data`中的`tabs`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | ---------------- | +| 0 | num | 档位代码1 | | +| n | num | 档位代码(n+1) | | +| …… | num | …… | …… | + +`data`中的`level_info`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---------------- | +| 0 | obj | 档位1 | | +| n | obj | 档位(n+1) | | +| …… | obj | …… | …… | + +`level_info`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ---- | -------------------- | ---------------------- | +| privilege_type | num | 当前充电档位代码 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价) | +| name | str | 档位名称 | | +| price | num | 档位价格 | 单位为百分之一元人民币 | +| member_total | num | 当前档位的用户总数 | | + +**示例:** + +获取给`mid=686127`包月充电的用户排名 + +```shell +curl 'https://api.bilibili.com/x/upower/up/member/rank/v2' \ + --data-urlencode 'up_mid=686127' \ + --data-urlencode 'ps=3' \ + --data-urlencode 'pn=1' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "up_info": { + "mid": 686127, + "nickname": "籽岷", + "avatar": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", + "type": 0, + "title": "2024百大UP主、知名游戏UP主", + "upower_state": 3 + }, + "rank_info": [ + { + "mid": 187012867, + "nickname": "是我灬不配", + "avatar": "https://i1.hdslb.com/bfs/face/ad4d2ce0705fd766a0ade315f5a6a5984ce479f4.jpg", + "rank": 1, + "day": 682, + "expire_at": 0, + "remain_days": 0 + }, + { + "mid": 20135495, + "nickname": "和平时一样鸽", + "avatar": "https://i2.hdslb.com/bfs/face/0eef725964105f39b1f000a59f232d9094017544.jpg", + "rank": 2, + "day": 620, + "expire_at": 0, + "remain_days": 0 + }, + { + "mid": 490065730, + "nickname": "乔治Y-GYhaha", + "avatar": "https://i1.hdslb.com/bfs/face/e1753e1e43d7a7df5333c5a2f4d3ec1d0334ebe6.jpg", + "rank": 3, + "day": 527, + "expire_at": 0, + "remain_days": 0 + } + ], + "user_info": { + "mid": 425503913, + "nickname": "晨叶梦春", + "avatar": "https://i2.hdslb.com/bfs/face/540ed71e2fb2ddd8967c21b392026c34fc15673e.jpg", + "rank": -1, + "day": 0, + "expire_at": 0, + "remain_days": 0 + }, + "member_total": 46881, + "privilege_type": 50, + "is_charge": false, + "tabs": [50, 10], + "level_info": [ + { + "privilege_type": 50, + "name": "审稿", + "price": 12800, + "member_total": 1082 + }, + { + "privilege_type": 10, + "name": "石粒", + "price": 600, + "member_total": 46158 + } + ] + } +} +``` + +</details> diff --git a/emoji/action.md b/docs/emoji/action.md similarity index 91% rename from emoji/action.md rename to docs/emoji/action.md index 954ed86..d5bc0bd 100644 --- a/emoji/action.md +++ b/docs/emoji/action.md @@ -1,13 +1,8 @@ # 表情操作 -- [添加表情包](#添加表情包) -- [移除表情包](#移除表情包) - ---- - ## 添加表情包 -> http://api.bilibili.com/x/emote/package/add +> https://api.bilibili.com/x/emote/package/add *请求方式:POST* @@ -38,7 +33,7 @@ 添加id为`25`的表情包,使用场景为评论区 ```shell -curl 'http://api.bilibili.com/x/emote/package/add' \ +curl 'https://api.bilibili.com/x/emote/package/add' \ --data-urlencode 'package_id=25' \ --data-urlencode 'business=reply' \ --data-urlencode 'csrf=xxx' \ @@ -60,7 +55,7 @@ curl 'http://api.bilibili.com/x/emote/package/add' \ ## 移除表情包 -> http://api.bilibili.com/x/emote/package/remove +> https://api.bilibili.com/x/emote/package/remove *请求方式:POST* @@ -89,7 +84,7 @@ curl 'http://api.bilibili.com/x/emote/package/add' \ 移除id为`25`的表情包,使用场景为评论区 ```shell -curl 'http://api.bilibili.com/x/emote/package/remove' \ +curl 'https://api.bilibili.com/x/emote/package/remove' \ --data-urlencode 'package_id=25' \ --data-urlencode 'business=reply' \ --data-urlencode 'csrf=xxx' \ diff --git a/emoji/list.md b/docs/emoji/list.md similarity index 97% rename from emoji/list.md rename to docs/emoji/list.md index e47e792..1435982 100644 --- a/emoji/list.md +++ b/docs/emoji/list.md @@ -1,15 +1,8 @@ # 表情列表 -- [获取我的表情列表](#获取我的表情列表) -- [取指定的表情包明细](#取指定的表情包明细) -- [获取所有表情包列表](#获取所有表情包列表) -- [附表-表情包对象](#附表-表情包对象) - ---- - ## 获取我的表情列表 -> http://api.bilibili.com/x/emote/user/panel/web +> https://api.bilibili.com/x/emote/user/panel/web *请求方式:GET* @@ -51,7 +44,7 @@ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/emote/user/panel/web' \ +curl -G 'https://api.bilibili.com/x/emote/user/panel/web' \ --data-urlencode 'business=reply' \ -b 'SESSDATA=xxx' ``` @@ -225,7 +218,7 @@ curl -G 'http://api.bilibili.com/x/emote/user/panel/web' \ ## 获取指定的表情包明细 -> http://api.bilibili.com/x/emote/package +> https://api.bilibili.com/x/emote/package *请求方式:GET* @@ -266,7 +259,7 @@ curl -G 'http://api.bilibili.com/x/emote/user/panel/web' \ 获取表情包id为`93`的表情包明细 ```shell -curl -G 'http://api.bilibili.com/x/emote/package' \ +curl -G 'https://api.bilibili.com/x/emote/package' \ --data-urlencode 'ids=93' \ --data-urlencode 'business=reply' ``` @@ -518,7 +511,7 @@ curl -G 'http://api.bilibili.com/x/emote/package' \ ## 获取所有表情包列表 -> http://api.bilibili.com/x/emote/setting/panel +> https://api.bilibili.com/x/emote/setting/panel *请求方式:GET* @@ -575,7 +568,7 @@ curl -G 'http://api.bilibili.com/x/emote/package' \ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/emote/setting/panel' \ +curl -G 'https://api.bilibili.com/x/emote/setting/panel' \ --data-urlencode 'business=reply' \ -b 'SESSDATA=xxx' ``` diff --git a/fav/action.md b/docs/fav/action.md similarity index 89% rename from fav/action.md rename to docs/fav/action.md index 7e90c99..1672164 100644 --- a/fav/action.md +++ b/docs/fav/action.md @@ -1,20 +1,10 @@ # 收藏夹操作 -- [管理收藏夹](#管理收藏夹) - - [新建收藏夹](#新建收藏夹) - - [修改收藏夹](#修改收藏夹) - - [删除收藏夹](#删除收藏夹) -- [管理收藏内容](#管理收藏内容) - - [批量复制内容](#批量复制内容) - - [清空所有失效内容](#清空所有失效内容) - ---- - ## 管理收藏夹 ### 新建收藏夹 -> http://api.bilibili.com/x/v3/fav/folder/add +> https://api.bilibili.com/x/v3/fav/folder/add *请求方式:POST* @@ -36,7 +26,7 @@ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | +| code | num | 返回值 | 0:成功<br />-102:账号被封停 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | obj | 信息本体 | | @@ -49,14 +39,14 @@ **示例:** -创建一个叫`test`,简介是`2333`,封面`http://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png`,的公开收藏夹: +创建一个叫`test`,简介是`2333`,封面`https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png`,的公开收藏夹: ```shell -curl 'http://api.bilibili.com/x/v3/fav/folder/add' \ +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=http://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png' \ +--data-urlencode 'cover=https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png' \ --data-urlencode 'csrf=xxxx' \ -b 'SESSDATA=xxxx' ``` @@ -75,7 +65,7 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/add' \ "mid": 470310172, "attr": 6, "title": "test", - "cover": "http://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", + "cover": "https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", "upper": { "mid": 0, "name": "", @@ -107,7 +97,7 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/add' \ ### 修改收藏夹 -> http://api.bilibili.com/x/v3/fav/folder/edit +> https://api.bilibili.com/x/v3/fav/folder/edit *请求方式:POST* @@ -130,7 +120,7 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/add' \ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | +| code | num | 返回值 | 0:成功<br />-102:账号被封停 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | obj | 信息本体 | | @@ -143,15 +133,15 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/add' \ **示例:** -修改id为`1182306172`的名字为`test`,简介为`2333`,封面为`http://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png`,公开收藏夹: +修改id为`1182306172`的名字为`test`,简介为`2333`,封面为`https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png`,公开收藏夹: ```shell -curl 'http://api.bilibili.com/x/v3/fav/folder/edit' \ +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=http://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png' \ +--data-urlencode 'cover=https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png' \ --data-urlencode 'csrf=xxxx' \ -b 'SESSDATA=xxxx' ``` @@ -170,7 +160,7 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/edit' \ "mid": 470310172, "attr": 6, "title": "test", - "cover": "http://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", + "cover": "https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", "upper": { "mid": 0, "name": "", @@ -202,7 +192,7 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/edit' \ ### 删除收藏夹 -> http://api.bilibili.com/x/v3/fav/folder/del +> https://api.bilibili.com/x/v3/fav/folder/del *请求方式:POST* @@ -231,7 +221,7 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/edit' \ 删除id为`1182306172`的收藏夹: ```shell -curl 'http://api.bilibili.com/x/v3/fav/folder/del' \ +curl 'https://api.bilibili.com/x/v3/fav/folder/del' \ --data-urlencode 'media_ids=1182306172' \ --data-urlencode 'csrf=xxxx' \ -b 'SESSDATA=xxxx' @@ -255,7 +245,7 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/del' \ ### 批量复制内容 -> http://api.bilibili.com/x/v3/fav/resource/copy +> https://api.bilibili.com/x/v3/fav/resource/copy *请求方式:POST* @@ -288,7 +278,7 @@ curl 'http://api.bilibili.com/x/v3/fav/folder/del' \ 将id为`1288061499`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`复制到id为`1178751999`的收藏夹中 ```shell -curl 'http://api.bilibili.com/x/v3/fav/resource/copy' \ +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' \ @@ -315,7 +305,7 @@ curl 'http://api.bilibili.com/x/v3/fav/resource/copy' \ ### 批量移动内容 -> http://api.bilibili.com/x/v3/fav/resource/move +> https://api.bilibili.com/x/v3/fav/resource/move *请求方式:POST* @@ -348,7 +338,7 @@ curl 'http://api.bilibili.com/x/v3/fav/resource/copy' \ 将id为`1288061499`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`移动到id为`1178751999`的收藏夹中 ```shell -curl 'http://api.bilibili.com/x/v3/fav/resource/move' \ +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' \ @@ -375,7 +365,7 @@ curl 'http://api.bilibili.com/x/v3/fav/resource/move' \ ### 批量删除内容 -> http://api.bilibili.com/x/v3/fav/resource/batch-del +> https://api.bilibili.com/x/v3/fav/resource/batch-del *请求方式:POST* @@ -406,7 +396,7 @@ curl 'http://api.bilibili.com/x/v3/fav/resource/move' \ 将id为`1178751999`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`取消收藏 ```shell -curl 'http://api.bilibili.com/x/v3/fav/resource/batch-del' \ +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' \ @@ -431,7 +421,7 @@ curl 'http://api.bilibili.com/x/v3/fav/resource/batch-del' \ ### 清空所有失效内容 -> http://api.bilibili.com/x/v3/fav/resource/clean +> https://api.bilibili.com/x/v3/fav/resource/clean *请求方式:POST* @@ -460,7 +450,7 @@ curl 'http://api.bilibili.com/x/v3/fav/resource/batch-del' \ 清理id为`1161340172`的收藏夹 ```shell -curl 'http://api.bilibili.com/x/v3/fav/resource/clean' \ +curl 'https://api.bilibili.com/x/v3/fav/resource/clean' \ --data-urlencode 'media_id=1161340172' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' diff --git a/docs/fav/info.md b/docs/fav/info.md new file mode 100644 index 0000000..fe02478 --- /dev/null +++ b/docs/fav/info.md @@ -0,0 +1,571 @@ +# 收藏夹基本信息 + +<img src="../../assets/img/collect.svg" width="100" height="100" /> + +## 获取收藏夹元数据 + +> https://api.bilibili.com/x/v3/fav/folder/info + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) 或 APP + +**注:查询权限收藏夹时需要相应用户登录** + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------------- | ------ | ---- | +| media_id | num | 目标收藏夹id(完整id) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----------------------------- | -------- | --------------------------------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-403:访问权限不足<br />11010: 内容不存在 | +| 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 | 收藏夹内容数量 | | + +`data`中的`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:有 | + +`data`中的`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 (SESSDATA) 或 APP + +若欲查看相应用户的私密收藏夹需要登录 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| up_mid | num | 目标用户mid | 必要 | | +| type | num | 目标内容属性 | 非必要 | 默认为全部<br />0:全部<br />2:视频稿件 | +| rid | num | 目标内容id | 非必要 | 视频稿件:视频稿件avid | +| web_location | str | 333.1387 | 非必要| | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----------------------------- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功<br />-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 隐藏时:null<br />公开时:obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | --------------------------------------- | -------------- | ---- | +| count | num | 创建的收藏夹数 | | +| list | 无收藏夹时:null<br />有收藏夹时:array | 收藏夹列表 | | +| season | null | (?) | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | --------------------- | +| 0 | obj | 收藏夹1 | | +| n | obj | 收藏夹(n+1) | 项数取决于`count`的值 | +| …… | obj | …… | | + +`data`中的`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ------------------------ | ------------------------------------------ | +| id | num | 收藏夹mlid(完整id) | 收藏夹原始id+创建者mid尾号2位 | +| fid | num | 收藏夹原始id | | +| mid | num | 创建者mid | | +| attr | num | 收藏夹属性 | 二进制位属性<br />详细说明见下表 | +| title | str | 收藏夹标题 | | +| fav_state | num | 目标id是否存在于该收藏夹 | 存在于该收藏夹:1<br />不存在于该收藏夹:0 | +| media_count | num | 收藏夹内容数量 | | + +`attr`属性位二进制值表: + +| 位 | 内容 | 备注 | +| --------------- | ---------------- | -------------------------------- | +| 0 | 私有收藏夹 | 0:公开<br />1:私有 | +| 1 | 是否为默认收藏夹 | 0:默认收藏夹<br />1:其他收藏夹 | +| 其他有待补充... | | | + +**示例:** + +查询用户`mid=7792521`的收藏夹列表 + +```shell +curl -G 'https://api.bilibili.com/x/v3/fav/folder/created/list-all' \ +--data-urlencode 'up_mid=7792521' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "count": 5, + "list": [{ + "id": 44233921, + "fid": 442339, + "mid": 7792521, + "attr": 0, + "title": "默认收藏夹", + "fav_state": 0, + "media_count": 85 + }, { + "id": 936347621, + "fid": 9363476, + "mid": 7792521, + "attr": 22, + "title": "放假君的鬼畜私房歌", + "fav_state": 0, + "media_count": 2 + }, { + "id": 845218621, + "fid": 8452186, + "mid": 7792521, + "attr": 22, + "title": "♪一言不合就开唱♪", + "fav_state": 0, + "media_count": 4 + }, { + "id": 844998121, + "fid": 8449981, + "mid": 7792521, + "attr": 22, + "title": "个人作品精选", + "fav_state": 0, + "media_count": 25 + }, { + "id": 381779121, + "fid": 3817791, + "mid": 7792521, + "attr": 22, + "title": "鬼畜小课堂", + "fav_state": 0, + "media_count": 25 + }] + } +} +``` + +</details> + +## 查询用户收藏的视频收藏夹 + +> https://api.bilibili.com/x/v3/fav/folder/collected/list + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| ps | num | 每页项数 | 必要 | 定义域 1 - 大于70 | +| pn | num | 页码 | 必要 | | +| up_mid | num | 目标用户mid | 必要 | | +| platform | str | 平台类型 | 非必要 | 填写web 返回值才会包含用户收藏的视频合集 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />40022:签名过长 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 隐藏时:null<br />公开时:obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | --------------------------------------- | -------------- | ---- | +| count | num | 创建的收藏夹数 | | +| list | 无收藏夹时:null<br />有收藏夹时:array | 收藏夹列表 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | --------------------- | +| 0 | obj | 收藏夹1 | | +| n | obj | 收藏夹(n+1) | 项数取决于`count`的值 | +| …… | obj | …… | | + +`data`中的`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ------------------ | ----------------------------------------- | +| id | num | 收藏夹ml | | +| fid | num | 原始收藏夹mlid | 去除两位mid尾号 | +| mid | num | 创建用户mid | | +| attr | num | 收藏夹属性 | [同上 attr](#获取指定用户创建的所有收藏夹信息) | +| title | str | 收藏夹标题 | | +| cover | str | 收藏夹封面图片url | | +| upper | obj | 收藏夹创建用户信息 | | +| cover_type | num | 2 | 作用尚不明确 | +| intro | str | 空 | 作用尚不明确 | +| ctime | num | 创建时间 | 时间戳 | +| mtime | num | 审核时间 | 时间戳 | +| state | num | 0, 1 | 0: 正常;1:收藏夹已失效 | +| fav_state | num | 0 | 作用尚不明确 | +| media_count | num | 收藏夹总计视频数 | | + +`data`中的`list`数组中的对象中的`upper`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------- | ------------ | +| mid | num | 创建人mid | | +| name | str | 创建人昵称 | | +| face | str | 空 | 作用尚不明确 | + +**示例:** + +查询用户`mid=293793435`的收藏夹收藏列表 + +```shell +curl -G 'https://api.bilibili.com/x/v3/fav/folder/collected/list' \ +--data-urlencode 'up_mid=293793435' \ +--data-urlencode 'ps=20' \ +--data-urlencode 'pn=1' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "count": 2, + "list": [{ + "id": 496307088, + "fid": 4963070, + "mid": 412466388, + "attr": 22, + "title": "入站必刷", + "cover": "http://i0.hdslb.com/bfs/archive/baae2b4050363c0ab45465b7cf696b8304fdaca8.jpg", + "upper": { + "mid": 412466388, + "name": "热门菌", + "face": "" + }, + "cover_type": 2, + "intro": "", + "ctime": 1563394571, + "mtime": 1563394571, + "state": 0, + "fav_state": 0, + "media_count": 55 + }, { + "id": 381779121, + "fid": 3817791, + "mid": 7792521, + "attr": 22, + "title": "鬼畜小课堂", + "cover": "http://i2.hdslb.com/bfs/archive/09a668cfdb38fb3a85f905c10f48a2947e36a695.jpg", + "upper": { + "mid": 7792521, + "name": "还有一天就放假了", + "face": "" + }, + "cover_type": 2, + "intro": "", + "ctime": 1553700224, + "mtime": 1557291666, + "state": 0, + "fav_state": 0, + "media_count": 25 + }] + } +} +``` + +</details> + +## 批量获取指定收藏id的内容 + +> https://api.bilibili.com/x/v3/fav/resource/infos + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | -------------- | ------ | ------------------------------------------------------------ | +| resources | strs | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2:视频稿件<br />12:音频<br />内容id:<br />视频稿件:视频稿件avid<br />音频:音频auid | +| 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 | +| type | num | 内容类型 | 2:视频稿件<br />12:音频 | +| 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-音频-`au15664` + +```shell +curl -G 'https://api.bilibili.com/x/v3/fav/resource/infos' \ +--data-urlencode 'resources=583785685:2,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> diff --git a/fav/list.md b/docs/fav/list.md similarity index 97% rename from fav/list.md rename to docs/fav/list.md index e1e7534..60408d9 100644 --- a/fav/list.md +++ b/docs/fav/list.md @@ -1,13 +1,8 @@ # 收藏夹内容 -- [获取收藏夹内容明细列表](#获取收藏夹内容明细列表) -- [获取收藏夹全部内容id](#获取收藏夹全部内容id) - ---- - ## 获取收藏夹内容明细列表 -> http://api.bilibili.com/x/v3/fav/resource/list +> https://api.bilibili.com/x/v3/fav/resource/list *请求方式:GET* @@ -24,7 +19,7 @@ | keyword | str | 搜索关键字 | 非必要 | | | order | str | 排序方式 | 非必要 | 按收藏时间:mtime<br />按播放量: view<br />按投稿时间:pubtime | | type | num | 查询范围 | 非必要 | 0:当前收藏夹(对应media_id)<br /> 1:全部收藏夹 | -| ps | num | 每页数量 | 必要 | | +| ps | num | 每页数量 | 必要 | 定义域:1-20 | | pn | num | 页码 | 非必要 | 默认为1 | | platform | str | 平台标识 | 非必要 | 可为web(影响内容列表类型) | @@ -44,6 +39,8 @@ | ------ | ----- | ------------ | ---- | | info | obj | 收藏夹元数据 | | | medias | array | 收藏夹内容 | | +| has_more | bool | 收藏夹是否有下一页 | | +| ttl | num | 接口返回时间 | 时间戳 | `data`中的`info`对象: @@ -108,7 +105,7 @@ | page | num | 视频分P数 | | | duration | num | 音频/视频时长 | | | upper | obj | UP主信息 | | -| attr | num | 属性位(?) | | +| attr | num | 失效 | 0: 正常;9: up自己删除;1: 其他原因删除 | | cnt_info | obj | 状态数 | | | link | str | 跳转uri | | | ctime | num | 投稿时间 | 时间戳 | @@ -139,7 +136,7 @@ 查询收藏夹`id=1052622027`,每页5个视频,第`1`页的内容明细 ```shell -curl -G 'http://api.bilibili.com/x/v3/fav/resource/list' \ +curl -G 'https://api.bilibili.com/x/v3/fav/resource/list' \ --data-urlencode 'media_id=1052622027' \ --data-urlencode 'platform=web' \ --data-urlencode 'pn=1' \ @@ -324,7 +321,8 @@ curl -G 'http://api.bilibili.com/x/v3/fav/resource/list' \ "season": null } ], - "has_more": true + "has_more": true, + "ttl": 1703349018 } } ``` @@ -333,7 +331,7 @@ curl -G 'http://api.bilibili.com/x/v3/fav/resource/list' \ ## 获取收藏夹全部内容id -> http://api.bilibili.com/x/v3/fav/resource/ids +> https://api.bilibili.com/x/v3/fav/resource/ids *请求方式:GET* @@ -380,7 +378,7 @@ curl -G 'http://api.bilibili.com/x/v3/fav/resource/list' \ 查询收藏夹`id=1052622027`的全部内容id ```shell -curl -G 'http://api.bilibili.com/x/v3/fav/resource/ids' \ +curl -G 'https://api.bilibili.com/x/v3/fav/resource/ids' \ --data-urlencode 'media_id=1052622027' \ --data-urlencode 'platform=web' \ -b 'SESSDATA=xxx' diff --git a/garb/color.md b/docs/garb/color.md similarity index 96% rename from garb/color.md rename to docs/garb/color.md index f391ddb..c27c16b 100644 --- a/garb/color.md +++ b/docs/garb/color.md @@ -1,13 +1,8 @@ # 主题色 -- [获取主题色基本信息1](#获取主题色基本信息1) -- [获取主题色基本信息2](#获取主题色基本信息2) - ---- - ## 获取主题色基本信息1 -> http://club.bilibili.com/api/query.skin.list.do +> https://club.bilibili.com/api/query.skin.list.do *请求方式:GET* @@ -60,7 +55,7 @@ **示例:** ```shell -curl -G 'http://club.bilibili.com/api/query.skin.list.do' \ +curl -G 'https://club.bilibili.com/api/query.skin.list.do' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'appkey=1d8b6e7d45233436' \ --data-urlencode 'build=6082000' \ @@ -149,7 +144,7 @@ curl -G 'http://club.bilibili.com/api/query.skin.list.do' \ ## 获取主题色基本信息2 -> http://api.bilibili.com/x/garb/skin/color/list +> https://api.bilibili.com/x/garb/skin/color/list *请求方式:GET* @@ -198,7 +193,7 @@ curl -G 'http://club.bilibili.com/api/query.skin.list.do' \ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/garb/skin/color/list' \ +curl -G 'https://api.bilibili.com/x/garb/skin/color/list' \ --data-urlencode 'mobi_app=android' \ --data-urlencode 'build=6082000' \ -b 'SESSDATA=xxx' diff --git a/docs/garb/lottery.md b/docs/garb/lottery.md new file mode 100644 index 0000000..5b22d56 --- /dev/null +++ b/docs/garb/lottery.md @@ -0,0 +1,1196 @@ +# 装扮/收藏集 + +由 [#1080](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1080) 提供 + +## 装扮/收藏集搜索API + +> https://api.bilibili.com/x/garb/v2/mall/home/search + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|----- |--- |------- |----- |--- | +| key_word | str | 关键词 | 不必要 | | +| ps | int | 每页返回数据的最大值 | 不必要 | | +| pn | int | 当前页数 | 不必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|-- |-- |-- |-- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 返回数据 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +|-|---|--|--| +| list | array | 返回数据 | 若无则为 null | +| ps | int | 每页返回数据的最大值 | 默认为20 | +| pn | int | 当前页数 | 默认为1 | +| total | int | 查询到数据的总个数 | | + +`data` 中的 `list` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|-|---|--|--| +| item_id | int | 装扮对应的id | 收藏集均为0,需要在properties获取 | +| name | str | 装扮/收藏集名称 | | +| group_id | int | ?分类的id | | +| group_name | str | ?分类的名称 | | +| part_id | int | 类型id | 装扮为6 收藏集为0 | +| state | str | 当前状态 | 默认为“active” | +| properties | obj | 见下方 | | +| current_activity | obj | 见下方 | | +| next_activity | int | ?下次活动的时间 | | +| current_sources | int | ?活动开始时间 | | +| finish_sources | int | ?活动结束时间 | | +| sale_left_time | int | ?销售剩余时间 | | +| sale_time_end | int | ?销售结束时间 | | +| sale_surplus | int | 未知 | | +| sale_count_desc | str | 销售量显示文本 | | +| total_count_desc | str | 总量显示文本 | | +| tag | str | 当前状态标签 | | +| jump_link | str | 跳转链接 | | +| sales_mode | int | ?销售状态 | | + +`list` 数组中的对象中的 `properties` 对象: + +共有字段: + +| 字段 | 类型 | 内容 | 备注| +|-|---|--|--| +| image_cover | str | 图片封面 | | +| sale_bp_forever_raw | str | 价格 | 以0.01B币为单位| +| type | str | 类型 | 收藏集为dlc_act, 装扮为ip| + +装扮特有: + +| 字段 | 类型 | 内容 | 备注| +| - | - | ---- | ----- | +| desc | str | 介绍文本 | 仅装扮| +| fan_desc | str | 装扮名称 | 仅装扮| +| fan_item_ids | str | 未知 | 仅装扮| +| fan_mid | str | 该up的uid | 仅装扮| +| fan_no_color | str | 十六进制颜色 | 仅装扮| +| fan_recommend_desc | str | 装备说明 | 仅装扮| +| fan_recommend_jump_type | str | 跳转类型 | 仅装扮| +| fan_recommend_jump_value | str | 跳转值 | 仅装扮| +| fan_share_image | str | 分享时的背景图 | 仅装扮| +| gray_rule | str | 未知 | 仅装扮| +| gray_rule_type | str | 未知 | 仅装扮| +| image_cover_color | str | ?图片封面纯色背景 | 仅装扮| +| is_hide | str | 是否隐藏 | 仅装扮| +| item_id_card | str | 装扮背景卡片id | 仅装扮| +| item_id_emoji | str | 装扮表情包id | 仅装扮| +| item_id_thumbup | str | 装扮点赞动画id | 仅装扮| +| open_platform_vip_discount | str | 是否有大会员减免 | 仅装扮| +| owner_uid | str | UID | 默认为虚拟主播衍生品小货架, 仅装扮| +| rank_investor_show | str | 未知 | 仅装扮| +| realname_auth | str | ?是否需要实名认证 | 仅装扮| +| sale_bp_pm_raw | str | 该装扮基础套餐价格 | 以0.01B币为单位, 仅装扮| +| sale_buy_num_limit | str | 购买限额 | 仅装扮| +| sale_quantity | str | 该装扮粉丝专属套餐限额 | 仅装扮| +| sale_quantity_limit | str | 该装扮粉丝专属套餐是否限额 | 仅装扮| +| sale_region_ip_limit | str | 该装扮限制购买地区 | 仅装扮| +| sale_reserve_switch | str | 未知 | 仅装扮| +| sale_time_begin | str | 开始售卖时的时间戳 | 仅装扮| +| sale_type | str | 售卖类型 | 默认为pay, 仅装扮| +| suit_card_type | str | 仅装扮 | | + +收藏集特有: + +| 字段 | 类型 | 内容 | 备注 | +| - | ---- | - | --------- | +| book_amount | str | 购买总数 | 仅收藏集 | +| dlc_act_id | str | 收藏集活动id | 仅收藏集 | +| dlc_act_status | str | 收藏集活动状态 | 仅收藏集 | +| dlc_is_free | str | 收藏集抽奖是否免费 | 仅收藏集 | +| dlc_lottery_id | str | 收藏集抽奖id | 仅收藏集 | +| dlc_lottery_sale_quantity | str | 购买总数 | 仅收藏集 | +| dlc_lottery_type | str | ?抽奖类型 | 仅收藏集 | +| dlc_sale_end_time | str | 收藏集抽奖结束时间 | 仅收藏集 | +| dlc_sale_mode | str | 未知 | 仅收藏集 | +| dlc_sale_start_time | str | 收藏集抽奖开始时间 | 仅收藏集 | +| dlc_surplus_stock | str | 未知 | 仅收藏集 | + +`list` 数组中的对象中的 `current_activity` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | --- | --- | - | +| type | str | 当前永久价格活动类型 | 装扮一般是open_platform_vip_discount, 收藏集一般是first_draw_discount | +| time_limit | bool | 是否存在时间限制 | | +| time_left | int | 剩余时间 | | +| tag | str | 显示标签 | | +| price_bp_forever | int | 永久价格 | 以0.01B币为单位 | +| price_bp_month | int | 一个月的价格 | 以0.01B币为单位 | +| type_month | str | 当前一个月的价格活动类型 | 仅装扮 | +| tag_month | str | 显示标签 | 仅装扮 | +| time_limit_month | bool | 是否存在时间限制 | 仅装扮 | +| time_left_month | int | 剩余时间 | 仅装扮 | + +**示例:** + +搜索关键词为 `2233`: + +```shell +curl -G 'https://api.bilibili.com/x/garb/v2/mall/home/search' \ +--data-urlencode 'key_word=2233' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "item_id": 0, + "name": "2024拜年纪-2233拜年画册", + "group_id": 70, + "group_name": "2024拜年纪-2233拜年画册", + "part_id": 0, + "state": "active", + "properties": { + "book_amount": "1395313", + "dlc_act_id": "279", + "dlc_act_status": "2", + "dlc_is_free": "0", + "dlc_lottery_id": "256", + "dlc_lottery_sale_quantity": "313028", + "dlc_lottery_type": "1", + "dlc_sale_end_time": "2114406245", + "dlc_sale_mode": "1", + "dlc_sale_start_time": "1707458400", + "dlc_surplus_stock": "0", + "image_cover": "http://i0.hdslb.com/bfs/archive/f96a8cf6866ccef8f54de4773acf0cb07b915ac6.png", + "sale_bp_forever_raw": "990", + "type": "dlc_act" + }, + "current_activity": null, + "next_activity": { + "type": "first_draw_discount", + "time_limit": false, + "time_left": -1728418723, + "tag": "大会员首抽", + "price_bp_month": 490, + "price_bp_forever": 490, + "type_month": "", + "tag_month": "", + "time_limit_month": false, + "time_left_month": 0 + }, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -1728418723, + "sale_time_end": -1728418723, + "sale_surplus": 0, + "sale_count_desc": "31万+", + "total_count_desc": "已售31万+份", + "tag": "", + "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=279\u0026hybrid_set_header=2\u0026lottery_id=256", + "sales_mode": 0 + }, + { + "item_id": 0, + "name": "2024 BML\u0026BW 2233收藏集-2233福利卡池", + "group_id": 70, + "group_name": "2024 BML\u0026BW 2233收藏集-2233福利卡池", + "part_id": 0, + "state": "active", + "properties": { + "book_amount": "4376", + "dlc_act_id": "102962", + "dlc_act_status": "2", + "dlc_is_free": "1", + "dlc_lottery_id": "102966", + "dlc_lottery_sale_quantity": "2677", + "dlc_lottery_type": "2", + "dlc_sale_end_time": "1729828800", + "dlc_sale_mode": "2", + "dlc_sale_start_time": "1721876400", + "dlc_surplus_stock": "0", + "image_cover": "https://i0.hdslb.com/bfs/garb/4a374316b1e9a07cffeccbdeff585c472dcdcc26.png", + "sale_bp_forever_raw": "0", + "type": "dlc_act" + }, + "current_activity": null, + "next_activity": null, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -1728418723, + "sale_time_end": -1728418723, + "sale_surplus": 0, + "sale_count_desc": "2千+", + "total_count_desc": "已发放2千+份", + "tag": "限时DLC", + "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=102962\u0026hybrid_set_header=2\u0026lottery_id=102966", + "sales_mode": 0 + }, + { + "item_id": 0, + "name": "2233·幻境序曲-长夜", + "group_id": 70, + "group_name": "2233·幻境序曲-长夜", + "part_id": 0, + "state": "active", + "properties": { + "book_amount": "228065", + "dlc_act_id": "102161", + "dlc_act_status": "2", + "dlc_is_free": "0", + "dlc_lottery_id": "103087", + "dlc_lottery_sale_quantity": "71200", + "dlc_lottery_type": "2", + "dlc_sale_end_time": "2114406245", + "dlc_sale_mode": "1", + "dlc_sale_start_time": "1722139200", + "dlc_surplus_stock": "0", + "image_cover": "https://i0.hdslb.com/bfs/garb/f7e4f434ba6b93434b9e60df3c57a07552af4ca1.png", + "sale_bp_forever_raw": "990", + "type": "dlc_act" + }, + "current_activity": null, + "next_activity": { + "type": "first_draw_discount", + "time_limit": false, + "time_left": -1728418723, + "tag": "大会员首抽", + "price_bp_month": 490, + "price_bp_forever": 490, + "type_month": "", + "tag_month": "", + "time_limit_month": false, + "time_left_month": 0 + }, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -1728418723, + "sale_time_end": -1728418723, + "sale_surplus": 0, + "sale_count_desc": "7万+", + "total_count_desc": "已售7万+份", + "tag": "DLC池", + "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=102161\u0026hybrid_set_header=2\u0026lottery_id=103087", + "sales_mode": 0 + }, + { + "item_id": 0, + "name": "2233·群星闪耀时-双子座", + "group_id": 70, + "group_name": "2233·群星闪耀时-双子座", + "part_id": 0, + "state": "active", + "properties": { + "book_amount": "1164544", + "dlc_act_id": "113", + "dlc_act_status": "2", + "dlc_is_free": "0", + "dlc_lottery_id": "16", + "dlc_lottery_sale_quantity": "572712", + "dlc_lottery_type": "1", + "dlc_sale_end_time": "2114406245", + "dlc_sale_mode": "1", + "dlc_sale_start_time": "1686196800", + "dlc_surplus_stock": "0", + "image_cover": "http://i0.hdslb.com/bfs/archive/ed35d12a3dce7764d6cb5b02cb4a459373472522.jpg", + "sale_bp_forever_raw": "990", + "type": "dlc_act" + }, + "current_activity": null, + "next_activity": { + "type": "first_draw_discount", + "time_limit": false, + "time_left": -1728418723, + "tag": "大会员首抽", + "price_bp_month": 90, + "price_bp_forever": 90, + "type_month": "", + "tag_month": "", + "time_limit_month": false, + "time_left_month": 0 + }, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -1728418723, + "sale_time_end": -1728418723, + "sale_surplus": 0, + "sale_count_desc": "57万+", + "total_count_desc": "已售57万+份", + "tag": "", + "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=113\u0026hybrid_set_header=2\u0026lottery_id=16", + "sales_mode": 0 + }, + { + "item_id": 39389, + "name": "2233人生百戏-花木兰", + "group_id": 70, + "group_name": "2233人生百戏-花木兰", + "part_id": 6, + "state": "active", + "properties": { + "desc": "为从军设妙计女扮男装,涉千山越万水亲赴戎机。2233人生百戏·花木兰装扮上线啦!本套装包括动态卡片、点赞动效和表情包,永久购买还能成为认证粉丝,领取粉丝专属装扮!", + "fan_desc": "人生百戏-花木兰", + "fan_id": "人生百戏-花木兰", + "fan_item_ids": "39335,39384,39353,39354", + "fan_mid": "35365327", + "fan_no_color": "#eb3d3e", + "fan_recommend_desc": "为从军设妙计女扮男装,涉千山越万水亲赴戎机。", + "fan_recommend_jump_type": "url", + "fan_recommend_jump_value": "https://space.bilibili.com/35365327?spm_id_from=333.337.0.0", + "fan_share_image": "https://i0.hdslb.com/bfs/garb/item/5ddd3f72ef2a938e9125851f488068012b841ad4.jpg", + "gray_rule": "true", + "gray_rule_type": "all", + "image_cover": "https://i0.hdslb.com/bfs/garb/item/e21ec12047bcd93e6afb8e52a68eb9835cd54a23.jpg", + "image_cover_color": "#d8b796", + "is_hide": "false", + "item_id_card": "39334", + "item_id_emoji": "39352", + "item_id_thumbup": "39336", + "open_platform_vip_discount": "true", + "owner_uid": "647193094", + "rank_investor_show": "false", + "realname_auth": "false", + "sale_bp_forever_raw": "5000", + "sale_bp_pm_raw": "800", + "sale_buy_num_limit": "100", + "sale_quantity": "20000", + "sale_quantity_limit": "true", + "sale_region_ip_limit": "全球", + "sale_reserve_switch": "false", + "sale_time_begin": "1666868400", + "sale_type": "pay", + "suit_card_type": "big_img", + "type": "ip" + }, + "current_activity": null, + "next_activity": { + "type": "open_platform_vip_discount", + "time_limit": true, + "time_left": 417469277, + "tag": "大会员平台折扣", + "price_bp_month": 640, + "price_bp_forever": 4000, + "type_month": "open_platform_vip_discount", + "tag_month": "大会员平台折扣", + "time_limit_month": true, + "time_left_month": 417469277 + }, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -61550323, + "sale_time_end": -1728418723, + "sale_surplus": 8650, + "sale_count_desc": "1万+", + "total_count_desc": "已售1万+份", + "tag": "", + "jump_link": "https://www.bilibili.com/h5/mall/suit/detail?navhide=1\u0026id=39389", + "sales_mode": 0 + }, + { + "item_id": 4259, + "name": "2233白色情人节", + "group_id": 70, + "group_name": "2233白色情人节", + "part_id": 6, + "state": "active", + "properties": { + "desc": "shot你的心——无论是谁都拥有爱的权利,快换上白色情人节专属装扮来遇见心里的那个ta吧!本套装包括头像挂件、动态卡片、点赞动效和表情包,永久购买还能成为认证粉丝,领取粉丝专属装扮!", + "fan_desc": "白色情人节", + "fan_id": "2233白色情人节", + "fan_item_ids": "4257,4230,4256,4255,4253,4254", + "fan_mid": "174501086", + "fan_no_color": "#f85574", + "fan_recommend_desc": "平淡日常中迎来浪漫的节日,象征爱情的丘比特们悄悄来到少女们身边,用爱之箭觉醒了懵懂悸动的心。新鲜的玫瑰,闪耀光泽的草莓,白色情人节这天为你准备不一样的惊喜。", + "fan_recommend_jump_type": "url", + "fan_recommend_jump_value": "https://b23.tv/54WVWS", + "fan_share_image": "https://i0.hdslb.com/bfs/garb/item/30e3f1b234dd33a2a5446dd7d05b31835ac74d4b.jpg", + "gray_rule": "true", + "gray_rule_type": "all", + "image_cover": "https://i0.hdslb.com/bfs/garb/item/a8d60a7d4f1f5a5de667b307736f701cb39c0741.jpg", + "image_cover_color": "#a3a8ec", + "image_cover_long": "https://i0.hdslb.com/bfs/garb/item/5ac3bb024d42ff0f26de07ce974351d62587c6ea.jpg", + "image_desc": "https://i0.hdslb.com/bfs/garb/item/cfe753a010d124a95fb311c372a5be69d82c8e13.jpg", + "is_hide": "false", + "item_id_card": "4231", + "item_id_emoji": "4252", + "item_id_pendant": "4229", + "item_id_thumbup": "4232", + "open_platform_vip_discount": "true", + "owner_uid": "647193094", + "rank_investor_show": "true", + "realname_auth": "false", + "sale_bp_forever_raw": "5900", + "sale_bp_pm_raw": "800", + "sale_buy_num_limit": "100", + "sale_quantity": "52000", + "sale_quantity_limit": "true", + "sale_region_ip_limit": "全球", + "sale_reserve_switch": "false", + "sale_time_begin": "1615694400", + "sale_type": "pay", + "suit_card_type": "big_img", + "type": "ip" + }, + "current_activity": null, + "next_activity": { + "type": "open_platform_vip_discount", + "time_limit": true, + "time_left": 417469277, + "tag": "大会员平台折扣", + "price_bp_month": 640, + "price_bp_forever": 4720, + "type_month": "open_platform_vip_discount", + "tag_month": "大会员平台折扣", + "time_limit_month": true, + "time_left_month": 417469277 + }, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -112724323, + "sale_time_end": -1728418723, + "sale_surplus": 0, + "sale_count_desc": "5万+", + "total_count_desc": "已售5万+份", + "tag": "粉丝套装已售罄", + "jump_link": "https://www.bilibili.com/h5/mall/suit/detail?navhide=1\u0026id=4259", + "sales_mode": 0 + }, + { + "item_id": 0, + "name": "2233·少女日记-蔚蓝幻想曲", + "group_id": 70, + "group_name": "2233·少女日记-蔚蓝幻想曲", + "part_id": 0, + "state": "active", + "properties": { + "book_amount": "100310", + "dlc_act_id": "103244", + "dlc_act_status": "2", + "dlc_is_free": "0", + "dlc_lottery_id": "103885", + "dlc_lottery_sale_quantity": "16563", + "dlc_lottery_type": "2", + "dlc_sale_end_time": "2114406245", + "dlc_sale_mode": "1", + "dlc_sale_start_time": "1727236800", + "dlc_surplus_stock": "0", + "image_cover": "http://i0.hdslb.com/bfs/archive/a04b3e9ef354493a0890a9197412f1c77e01ba0f.jpg", + "sale_bp_forever_raw": "990", + "type": "dlc_act" + }, + "current_activity": null, + "next_activity": { + "type": "first_draw_discount", + "time_limit": false, + "time_left": -1728418723, + "tag": "大会员首抽", + "price_bp_month": 490, + "price_bp_forever": 490, + "type_month": "", + "tag_month": "", + "time_limit_month": false, + "time_left_month": 0 + }, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -1728418723, + "sale_time_end": -1728418723, + "sale_surplus": 0, + "sale_count_desc": "1万+", + "total_count_desc": "已售1万+份", + "tag": "DLC池", + "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=103244\u0026hybrid_set_header=2\u0026lottery_id=103885", + "sales_mode": 0 + }, + { + "item_id": 0, + "name": "2233·少女日记-十四岁生日", + "group_id": 70, + "group_name": "2233·少女日记-十四岁生日", + "part_id": 0, + "state": "active", + "properties": { + "book_amount": "100310", + "dlc_act_id": "103244", + "dlc_act_status": "2", + "dlc_is_free": "0", + "dlc_lottery_id": "103247", + "dlc_lottery_sale_quantity": "83747", + "dlc_lottery_type": "1", + "dlc_sale_end_time": "2114406245", + "dlc_sale_mode": "1", + "dlc_sale_start_time": "1723780800", + "dlc_surplus_stock": "0", + "image_cover": "https://i0.hdslb.com/bfs/garb/9c338eb4841cad917665140cc08c7d14b5c7e0bf.png", + "sale_bp_forever_raw": "990", + "type": "dlc_act" + }, + "current_activity": null, + "next_activity": { + "type": "first_draw_discount", + "time_limit": false, + "time_left": -1728418723, + "tag": "大会员首抽", + "price_bp_month": 490, + "price_bp_forever": 490, + "type_month": "", + "tag_month": "", + "time_limit_month": false, + "time_left_month": 0 + }, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -1728418723, + "sale_time_end": -1728418723, + "sale_surplus": 0, + "sale_count_desc": "8万+", + "total_count_desc": "已售8万+份", + "tag": "", + "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=103244\u0026hybrid_set_header=2\u0026lottery_id=103247", + "sales_mode": 0 + }, + { + "item_id": 0, + "name": "2024 BML\u0026BW 2233收藏集-BML\u0026BW2024", + "group_id": 70, + "group_name": "2024 BML\u0026BW 2233收藏集-BML\u0026BW2024", + "part_id": 0, + "state": "active", + "properties": { + "book_amount": "4376", + "dlc_act_id": "102962", + "dlc_act_status": "2", + "dlc_is_free": "0", + "dlc_lottery_id": "102963", + "dlc_lottery_sale_quantity": "1699", + "dlc_lottery_type": "1", + "dlc_sale_end_time": "2114406245", + "dlc_sale_mode": "1", + "dlc_sale_start_time": "1721876400", + "dlc_surplus_stock": "0", + "image_cover": "https://i0.hdslb.com/bfs/garb/6c2d68faf143c33b484b110e2221ab15a0a1f85c.png", + "sale_bp_forever_raw": "990", + "type": "dlc_act" + }, + "current_activity": null, + "next_activity": { + "type": "first_draw_discount", + "time_limit": false, + "time_left": -1728418723, + "tag": "大会员首抽", + "price_bp_month": 490, + "price_bp_forever": 490, + "type_month": "", + "tag_month": "", + "time_limit_month": false, + "time_left_month": 0 + }, + "current_sources": null, + "finish_sources": null, + "sale_left_time": -1728418723, + "sale_time_end": -1728418723, + "sale_surplus": 0, + "sale_count_desc": "1千+", + "total_count_desc": "已售1千+份", + "tag": "", + "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=102962\u0026hybrid_set_header=2\u0026lottery_id=102963", + "sales_mode": 0 + } + ], + "pn": 1, + "ps": 20, + "total": 187 + } +} +``` + +</details> + +## 收藏集信息API + +> https://api.bilibili.com/x/vas/dlc_act/lottery_home_detail + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | ---- | ---- | ---- | ---- | +| act_id | int | 收藏集活动id | 必要 | | +| lottery_id | int | 收藏集抽奖id|不必要| 但缺了不返回数据 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 返回数据 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +|-|-|-|-| +| lottery_id | int | 收藏集抽奖id | | +| name | str | 收藏集抽奖名称 | | +| item_list | array | 可抽出的物品列表 | | +| collect_list | obj | 见下方 | | +| button_bubble | null | 未知 | | +| guide_info | null | 未知 | | +| is_booked | int | 未知 | | +| total_book_cnt | int | 未知 | | +| is_fission | int | 未知 | | +| physical_exchange | int | 未知 | | + +`data` 中的 `item_list` 数组中的对象: + +|字段 | 类型 | 内容 | 备注| +|-|-|-|-| +|item_type | int | 物品类型 | 目前只拿到个1, 其他值未知| +|card_info | obj | 见下方 | | + +`item_list` 数组中的对象中的 `card_info` 对象: + +|字段 | 类型 | 内容 | 备注 | +|-|-|-|-| +|card_type_id | int | 该卡片id | | +|card_name | str | 该卡片名称 | | +|card_img | str | 该卡片图片 | 无水印| +|card_type | int | int | 未知| +|video_list | array | 该卡片动态视频 | 无水印| +|is_physical_orientation | int | 该卡片旋转方向 | | +|card_scarcity | int | 该卡片稀有度 | | +|is_mute | int | 该卡片是否静音 | | +|width | int | 该卡片像素宽度 | | +|height | int | 该卡片像素高度 | | +|card_ext_text | str | ?该卡片文件名字符串 | | +|card_img_download | str | 该卡片图片 | 有水印| +|video_list_download | array | 该卡片动态视频 | 有水印| +|subtitles_url | 未知 | | | +|play | null | 未知 | | +|tag | null | 未知 | | +|card_sub_type | int | 未知 | | +|is_new_tag | int | 未知 | | +|is_up_tag | int | 未知 | | +|is_limited_card | int | 未知 | | +|stock_info | null | 未知 | | + +`data` 中的 `collect_list` 对象: + +| 字段 | 类型 | 内容 | 备注| +|-|-|-|-| +| collect_infos | array | 见下方 | | +| collect_chain | null | 未知 | | + +`collect_list` 中的 `collect_infos` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|-|-|-|-| +| collect_id | int | 收集品id | | +| start_time | int | 开始时间 | | +| end_time | int | 结束时间 | | +| redeem_text | str | 兑换条件 | | +| redeem_item_type | int | 兑换物类型 | | +| redeem_item_id | str | 兑换物id | | +| redeem_item_name | str | 兑换物名称 | | +| redeem_item_image | str | 兑换物预览图片 | | +| owned_item_amount | int | 拥有的数量 | | +| require_item_amount | int | 需要的数量 | | +| has_redeemed_cnt | int | 兑换次数 | | +| effective_forever | int | 是否永久有效 | | +| redeem_item_image_download | str | 未知 | | +| card_item | obj | 见下方 | 有时为 null | +| jump_url | str | ?跳转链接 | | +| redeem_cond_type | str | 当前兑换状态 | | +| remain_stock | int | 当前库存 | | +| total_stock | int | 总库存 | | +| lottery_id | int | 抽奖id | | +| reward_tag | str | 奖励显示标签 | | +| redeem_detail_image | str | 兑换详情图片 | | +| redeem_detail_videos | null | 未知 | | +| sort | int | 排序 | | +| redeem_items_optional | null | 未知 | | +| unlock_condition | obj | 见下方 | | + +`collect_infos` 数组中的对象中的 `card_item` 对象: + +| 字段 | 类型 | 内容 | 备注| +|-|-|-|-| +| card_type_info | null | | | +| card_asset_info | null | | | +| play | null | | | +| tag | null | | | + +`collect_infos` 数组中的对象中的 `unlock_condition` 对象: + +|字段 | 类型 | 内容 | 备注| +|-|-|-|-| +|unlocked | bool | 是否解锁 | | +|lock_type | int | 解锁类型 | | +|expire_at | int | 过期与 | | +|unlocked_at | int | 解锁于 | | +|unlock_threshold | int | ?解锁起点 | | +|current_threshold | int | ?当前起点 | | + +**示例:** + +```shell +curl -G --url 'https://api.bilibili.com/x/vas/dlc_act/lottery_home_detail' \ +--url-query 'act_id=111' \ +--url-query 'lottery_id=15' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "lottery_id": 15, + "name": "夏日萌菜", + "item_list": [ + { + "item_type": 1, + "card_info": { + "card_type_id": 700903, + "card_name": "水中嬉戏·隐藏", + "card_img": "https://i0.hdslb.com/bfs/baselabs/d41acfc3bfcc9032a9759fbd9e64147a6d9a24b0.png", + "card_type": 2, + "video_list": [ + "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/2b/y2/_000008vnv2ddoooah248hqoyz2gy22b-1-152111110023.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=cos&upsig=d22ca6102adb9ffe257f702047be6ef2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=753ff946c9e4b3813eb72c744ed3a399ba9a225fe4767a7a03835890fcbe4b8a&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" + ], + "is_physical_orientation": 0, + "card_scarcity": 40, + "is_mute": 0, + "width": 1242, + "height": 1862, + "card_ext_text": "", + "card_img_download": "https://i0.hdslb.com/bfs/garb/d38c42b6f1151298888da5902bca5a41e14f67e1.png", + "video_list_download": [ + "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/digital_watermark/ib/30/_00003d7cuie74gr9z2322d7js5b30ib-teaser.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=hw&upsig=24512302cfa3b1f762f3ad08a0a2f5fe&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=5dc3cdfca31fca94c29a2ec945589ff319e97c3291dec2685184ec4083616cc2&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" + ], + "subtitles_url": "", + "play": null, + "tag": null, + "card_sub_type": 0, + "is_new_tag": 0, + "is_up_tag": 0, + "is_limited_card": 0, + "stock_info": null + } + }, + { + "item_type": 1, + "card_info": { + "card_type_id": 700902, + "card_name": "轻纱花语·隐藏", + "card_img": "https://i0.hdslb.com/bfs/baselabs/e4721d06a5c435be216b5011f0604c9e07d5e4af.png", + "card_type": 2, + "video_list": [ + "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/jb/4u/_00001f04wekkvpmr92osvwpej1e4ujb-1-152111110023.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=cos&upsig=ad574839c71e5327783acf248b552b3d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=49276ec1afce1a8f571e257fb6d2ab7488f623aa50c2c3b7252258be72315c5e&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" + ], + "is_physical_orientation": 0, + "card_scarcity": 30, + "is_mute": 0, + "width": 1242, + "height": 1862, + "card_ext_text": "", + "card_img_download": "https://i0.hdslb.com/bfs/garb/0e49e7c8108a98944a96bfa594cf7f74c72398cf.png", + "video_list_download": [ + "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/digital_watermark/nb/58/_000007ovzgblf574s1ywvm7inwx58nb-teaser.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=cos&upsig=ec9de21147240e94494d736f277dfb64&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=2370473349a25fae0ea023f65f1e09c70b45d086831eef5f4727b8443acdf9f5&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" + ], + "subtitles_url": "", + "play": null, + "tag": null, + "card_sub_type": 0, + "is_new_tag": 0, + "is_up_tag": 0, + "is_limited_card": 0, + "stock_info": null + } + }, + { + "item_type": 1, + "card_info": { + "card_type_id": 700904, + "card_name": "甜心女仆", + "card_img": "https://i0.hdslb.com/bfs/baselabs/e1f9c56a8f49910d07852f2bd648fee910f36ff6.png", + "card_type": 2, + "video_list": [ + "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/gb/j6/_000015vmteklku8oj1ypmp1yjijj6gb-1-152111110023.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=cos&upsig=c7412fe7b155deecbfea939f7c3d1b21&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=8989673c367aa0ffbe747cdc66129a6d1698f1c2b60ace24861ad62127cdd6da&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" + ], + "is_physical_orientation": 0, + "card_scarcity": 20, + "is_mute": 0, + "width": 1242, + "height": 1862, + "card_ext_text": "", + "card_img_download": "https://i0.hdslb.com/bfs/garb/e6c69329d843603166fac8d41682c3489fd137d4.png", + "video_list_download": [ + "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/digital_watermark/zb/eq/_000018oi0e68wv4id2vkrk9ovpteqzb-teaser.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=hw&upsig=f972e8cd996d058deb4e0ffb1d57671e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=99054c626717b4ba61c01bbb0fe59f67feac394b89e19e4bbf95290d3a425f94&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" + ], + "subtitles_url": "", + "play": null, + "tag": null, + "card_sub_type": 0, + "is_new_tag": 0, + "is_up_tag": 0, + "is_limited_card": 0, + "stock_info": null + } + }, + { + "item_type": 1, + "card_info": { + "card_type_id": 700901, + "card_name": "约会憧憬", + "card_img": "https://i0.hdslb.com/bfs/baselabs/924ef9a71bf39010935b4a43845bec13c8a2022c.png", + "card_type": 1, + "video_list": null, + "is_physical_orientation": 0, + "card_scarcity": 10, + "is_mute": 0, + "width": 1242, + "height": 1863, + "card_ext_text": "", + "card_img_download": "https://i0.hdslb.com/bfs/garb/40a9ff949ca7a50dbce146ad28fbb567c2583261.png", + "video_list_download": null, + "subtitles_url": "", + "play": null, + "tag": null, + "card_sub_type": 0, + "is_new_tag": 0, + "is_up_tag": 0, + "is_limited_card": 0, + "stock_info": null + } + }, + { + "item_type": 1, + "card_info": { + "card_type_id": 700900, + "card_name": "夏日小憩", + "card_img": "https://i0.hdslb.com/bfs/baselabs/0eddbfc70200f16bef06acc88ef132eb25ede52d.png", + "card_type": 1, + "video_list": null, + "is_physical_orientation": 0, + "card_scarcity": 10, + "is_mute": 0, + "width": 1242, + "height": 1863, + "card_ext_text": "", + "card_img_download": "https://i0.hdslb.com/bfs/garb/61e26e17705e06ecdfdb9ff97befb19c702cf81e.png", + "video_list_download": null, + "subtitles_url": "", + "play": null, + "tag": null, + "card_sub_type": 0, + "is_new_tag": 0, + "is_up_tag": 0, + "is_limited_card": 0, + "stock_info": null + } + }, + { + "item_type": 1, + "card_info": { + "card_type_id": 700899, + "card_name": "微风校园", + "card_img": "https://i0.hdslb.com/bfs/baselabs/bbeaf7993566684e328e74d8ef7c47e6242869a2.png", + "card_type": 1, + "video_list": null, + "is_physical_orientation": 0, + "card_scarcity": 10, + "is_mute": 0, + "width": 1242, + "height": 1863, + "card_ext_text": "", + "card_img_download": "https://i0.hdslb.com/bfs/garb/8ac61045334699d621363ccac87153a7128ef0c3.png", + "video_list_download": null, + "subtitles_url": "", + "play": null, + "tag": null, + "card_sub_type": 0, + "is_new_tag": 0, + "is_up_tag": 0, + "is_limited_card": 0, + "stock_info": null + } + }, + { + "item_type": 1, + "card_info": { + "card_type_id": 700898, + "card_name": "萌宠幻想", + "card_img": "https://i0.hdslb.com/bfs/baselabs/f93f200ec862b4520b30e8f03219fbaca91a2089.png", + "card_type": 1, + "video_list": null, + "is_physical_orientation": 0, + "card_scarcity": 10, + "is_mute": 0, + "width": 1242, + "height": 1863, + "card_ext_text": "", + "card_img_download": "https://i0.hdslb.com/bfs/garb/93e59f3080f6b8070b0d0621496e4ed6cb20cf8f.png", + "video_list_download": null, + "subtitles_url": "", + "play": null, + "tag": null, + "card_sub_type": 0, + "is_new_tag": 0, + "is_up_tag": 0, + "is_limited_card": 0, + "stock_info": null + } + }, + { + "item_type": 1, + "card_info": { + "card_type_id": 700897, + "card_name": "空中环游", + "card_img": "https://i0.hdslb.com/bfs/baselabs/fc0c020091c0a9fb1778c420bc4f9773a72ea7ba.png", + "card_type": 1, + "video_list": null, + "is_physical_orientation": 0, + "card_scarcity": 10, + "is_mute": 0, + "width": 1242, + "height": 1863, + "card_ext_text": "", + "card_img_download": "https://i0.hdslb.com/bfs/garb/c1c6c9ca84b584bf5f2b0e1ec7d239eb935e4d44.png", + "video_list_download": null, + "subtitles_url": "", + "play": null, + "tag": null, + "card_sub_type": 0, + "is_new_tag": 0, + "is_up_tag": 0, + "is_limited_card": 0, + "stock_info": null + } + } + ], + "collect_list": { + "collect_infos": [ + { + "collect_id": 0, + "start_time": 1685372400, + "end_time": 2114406245, + "redeem_text": "1抽必得勋章,可应用为评论背景&动态卡片", + "redeem_item_type": 1001, + "redeem_item_id": "", + "redeem_item_name": "夏日萌菜勋章", + "redeem_item_image": "http://i0.hdslb.com/bfs/archive/b3d915c6ad88609fb658393585f018459a7e620d.png", + "owned_item_amount": 0, + "require_item_amount": 1, + "has_redeemed_cnt": 0, + "effective_forever": 1, + "redeem_item_image_download": "", + "card_item": null, + "jump_url": "", + "redeem_cond_type": "", + "remain_stock": 0, + "total_stock": -1, + "lottery_id": 0, + "reward_tag": "", + "redeem_detail_image": "", + "redeem_detail_videos": null, + "sort": 0, + "redeem_items_optional": null, + "unlock_condition": { + "unlocked": true, + "lock_type": 0, + "expire_at": 0, + "unlocked_at": 0, + "unlock_threshold": 0, + "current_threshold": 0 + } + }, + { + "collect_id": 172, + "start_time": 1691640000, + "end_time": 2114406245, + "redeem_text": "抽出任意5张不同卡牌,即可领取,单UID仅可领取一次", + "redeem_item_type": 5, + "redeem_item_id": "56658", + "redeem_item_name": "夏日萌菜个性主题", + "redeem_item_image": "https://i0.hdslb.com/bfs/garb/48f755d6d08d96bfebcadee0be4bc34ce42421de.jpg", + "owned_item_amount": 0, + "require_item_amount": 5, + "has_redeemed_cnt": 0, + "effective_forever": 1, + "redeem_item_image_download": "", + "card_item": { + "card_type_info": null, + "play": null, + "tag": null, + "card_asset_info": null + }, + "jump_url": "", + "redeem_cond_type": "scarcity", + "remain_stock": -1, + "total_stock": -1, + "lottery_id": 0, + "reward_tag": "任务奖励限定", + "redeem_detail_image": "https://i0.hdslb.com/bfs/garb/48f755d6d08d96bfebcadee0be4bc34ce42421de.jpg", + "redeem_detail_videos": null, + "sort": 0, + "redeem_items_optional": null, + "unlock_condition": { + "unlocked": true, + "lock_type": 0, + "expire_at": 0, + "unlocked_at": 0, + "unlock_threshold": 0, + "current_threshold": 0 + } + }, + { + "collect_id": 51, + "start_time": 1685372400, + "end_time": 2114406245, + "redeem_text": "抽出任意1张隐藏卡牌,即可领取,单UID仅可领取一次", + "redeem_item_type": 3, + "redeem_item_id": "53199", + "redeem_item_name": "夏日萌菜头像框", + "redeem_item_image": "https://i0.hdslb.com/bfs/garb/item/9fcb99ccfd057c5eac165832d71fb63f07f26097.png", + "owned_item_amount": 0, + "require_item_amount": 1, + "has_redeemed_cnt": 0, + "effective_forever": 1, + "redeem_item_image_download": "", + "card_item": { + "card_type_info": null, + "play": null, + "tag": null, + "card_asset_info": null + }, + "jump_url": "", + "redeem_cond_type": "scarcity", + "remain_stock": -1, + "total_stock": -1, + "lottery_id": 0, + "reward_tag": "任务奖励限定", + "redeem_detail_image": "https://i0.hdslb.com/bfs/garb/item/9fcb99ccfd057c5eac165832d71fb63f07f26097.png", + "redeem_detail_videos": null, + "sort": 0, + "redeem_items_optional": null, + "unlock_condition": { + "unlocked": true, + "lock_type": 0, + "expire_at": 0, + "unlocked_at": 0, + "unlock_threshold": 0, + "current_threshold": 0 + } + }, + { + "collect_id": 50, + "start_time": 1685372400, + "end_time": 2114406245, + "redeem_text": "抽出任意3张不同卡牌,即可领取,单UID仅可领取一次", + "redeem_item_type": 2, + "redeem_item_id": "53178", + "redeem_item_name": "夏日萌菜表情包", + "redeem_item_image": "https://i0.hdslb.com/bfs/garb/462ae9b5735fef4bb9ed87a6d6467a4768b06006.png", + "owned_item_amount": 0, + "require_item_amount": 3, + "has_redeemed_cnt": 0, + "effective_forever": 1, + "redeem_item_image_download": "", + "card_item": { + "card_type_info": null, + "play": null, + "tag": null, + "card_asset_info": null + }, + "jump_url": "", + "redeem_cond_type": "scarcity", + "remain_stock": -1, + "total_stock": -1, + "lottery_id": 0, + "reward_tag": "任务奖励限定", + "redeem_detail_image": "https://i0.hdslb.com/bfs/garb/462ae9b5735fef4bb9ed87a6d6467a4768b06006.png", + "redeem_detail_videos": null, + "sort": 0, + "redeem_items_optional": null, + "unlock_condition": { + "unlocked": true, + "lock_type": 0, + "expire_at": 0, + "unlocked_at": 0, + "unlock_threshold": 0, + "current_threshold": 0 + } + }, + { + "collect_id": 366, + "start_time": 1694768400, + "end_time": 1696953600, + "redeem_text": "抽齐全部8张卡牌领取,直接获得全图鉴进度条标记,10月28日前人工发放头像", + "redeem_item_type": 5, + "redeem_item_id": "59374", + "redeem_item_name": "水中嬉戏·隐藏出框头像", + "redeem_item_image": "https://i0.hdslb.com/bfs/garb/ff981dbdca5c6b539e22596674265ef1cb110c9c.png", + "owned_item_amount": 0, + "require_item_amount": 8, + "has_redeemed_cnt": 0, + "effective_forever": 0, + "redeem_item_image_download": "", + "card_item": { + "card_type_info": null, + "play": null, + "tag": null, + "card_asset_info": null + }, + "jump_url": "", + "redeem_cond_type": "scarcity", + "remain_stock": -1, + "total_stock": -1, + "lottery_id": 0, + "reward_tag": "任务奖励限定", + "redeem_detail_image": "https://i0.hdslb.com/bfs/garb/ff981dbdca5c6b539e22596674265ef1cb110c9c.png", + "redeem_detail_videos": null, + "sort": 0, + "redeem_items_optional": null, + "unlock_condition": { + "unlocked": true, + "lock_type": 0, + "expire_at": 0, + "unlocked_at": 0, + "unlock_threshold": 0, + "current_threshold": 0 + } + } + ], + "collect_chain": null + }, + "button_bubble": null, + "guide_info": null, + "is_booked": 0, + "total_book_cnt": 0, + "is_fission": 0, + "physical_exchange": 0 + } +} +``` + +</details> diff --git a/garb/skin.md b/docs/garb/skin.md similarity index 64% rename from garb/skin.md rename to docs/garb/skin.md index 8e4213e..c91d5d5 100644 --- a/garb/skin.md +++ b/docs/garb/skin.md @@ -1,13 +1,8 @@ # APP主题 -- [获取主题及加载动画](#获取主题及加载动画) -- [主题包结构](#主题包结构) - ---- - ## 获取主题及加载动画 -> http://app.bilibili.com/x/resource/show/skin +> https://app.bilibili.com/x/resource/show/skin *请求方式:GET* @@ -57,16 +52,23 @@ `user_equip`中的`data`对象: -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | -------------- | --------------------------- | -| color_mode | str | 颜色模式 | light:亮色<br />dark:暗色 | -| color | str | 前景色? | | -| color_second_page | str | 背景色? | | -| side_bg_color | str | ? | | -| tail_color | str | 底边栏颜色? | | -| tail_color_selected | str | ? | | -| tail_icon_ani | bool | 有无底边栏动画 | false:无<br />true:有 | -| tail_icon_ani_mode | str | once | 作用尚不明确 | +| 字段 | 类型 | 内容 | 必要性 | 备注 | +| ------------------- | ---- | ----------------- | -------- | --------------------------- | +| 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`数组: @@ -103,7 +105,7 @@ **示例:** ```shell -curl -G 'http://app.bilibili.com/x/resource/show/skin' \ +curl -G 'https://app.bilibili.com/x/resource/show/skin' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'appkey=1d8b6e7d45233436' \ --data-urlencode 'build=6082000' \ @@ -201,32 +203,38 @@ curl -G 'http://app.bilibili.com/x/resource/show/skin' \ 主题包为app端付费主题(套装)的整合包,以zip格式通过url分发 -包内的图片文件为app对应的资源替换 +包内的图片文件为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 | 【发布】按钮(选中状态) | -| 文件名 | 说明 | -| ------------------------------ | -------------------------- | -| tail_icon_selected_myself.png | 【我的】按钮(选中状态) | -| head_bg.jpg | 首页顶部栏背景 | -| head_tab_bg.jpg | 顶部栏背景 | -| side_bg.jpg | 侧边栏背景 | -| side_bg_bottom.jpg | 侧边栏底部背景 | -| tail_bg.png | 底部栏背景 | -| tail_icon_main.png | 【首页】按钮 | -| tail_icon_selected_main.png | 【首页】按钮(选中状态) | -| tail_icon_selected_channel.png | 【频道】按钮(选中状态) | -| head_myself_squared_bg.jpg | 【我的】页面头图(大) | -| tail_icon_channel.png | 【频道】按钮 | -| tail_icon_selected_dynamic.png | 【动态】按钮(选中状态) | -| head_myself_bg.jpg | 【我的】页面头图(小) | -| tail_icon_dynamic.png | 【动态】按钮 | -| tail_icon_shop.png | 【会员购】按钮 | -| tail_icon_selected_shop.png | 【会员购】按钮(选中状态) | -| tail_icon_myself.png | 【我的】按钮 | 以`id=2529(初音未来-日版)`的资源为例 ```shell -wget http://i0.hdslb.com/bfs/garb/zip/9c393edea0c7b7b59685a20cd655363ef573a325.zip +wget https://i0.hdslb.com/bfs/garb/zip/9c393edea0c7b7b59685a20cd655363ef573a325.zip unzip -l 9c393edea0c7b7b59685a20cd655363ef573a325.zip ``` diff --git a/history&toview/history.md b/docs/historytoview/history.md similarity index 76% rename from history&toview/history.md rename to docs/historytoview/history.md index aee1cfe..ddecbcf 100644 --- a/history&toview/history.md +++ b/docs/historytoview/history.md @@ -1,32 +1,26 @@ # 历史记录 -<img src="/imgs/history.png" width="25" height="20"/> +## 获取历史记录列表_web端 -- [获取历史记录列表(视频、直播、专栏)](#获取历史记录列表(视频、直播、专栏)) -- [获取全部视频历史记录(旧)](#获取全部视频历史记录(旧)) -- [删除历史记录](#删除历史记录) -- [清空历史记录](#清空历史记录) -- [停用历史记录](#停用历史记录) -- [查询历史记录停用状态](#查询历史记录停用状态) - ---- - -## 获取历史记录列表(视频、直播、专栏) - ->http://api.bilibili.com/x/web-interface/history/cursor +> https://api.bilibili.com/x/web-interface/history/cursor *请求方式:GET* -认证方式:Cookie(SESSDATA) +认证方式:Cookie (SESSDATA) + +注:`max`、`business`、`view_at`参数用于历史记录列表的 IFS (无限滚动),其用法类似链表的 next 指针 + +本接口也可以返回已失效稿件的信息 **url参数:** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------------- | ------ | ------------------------------------------------------------ | -| max | num | 历史记录截止目标id | 非必要 | 默认为0<br />稿件:稿件avid<br />番剧(影视):剧集ssid<br />直播:直播间id<br />文集:文集rlid<br />文章:文章cvid | -| business | num | 历史记录截止目标id类型 | 非必要 | 默认为空<br />archive:稿件<br />pgc:番剧(影视)<br />live:直播<br />article-list:文集<br />article:文章 | -| view_at | num | 历史记录截止时间 | 非必要 | 时间戳<br />默认为0<br />0为当前时间 | -| ps | num | 每页项数 | 非必要 | 默认为20,最大30 | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | +| 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回复:** @@ -35,7 +29,7 @@ | 字段 | 类型 | 内容 | 备注 | | ------- | ----- | ------------ | ------------------------------------------------- | | code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为 0 | | ttl | num | 1 | | | data | array | 历史记录列表 | | @@ -49,20 +43,20 @@ `data`中的`cursor`对象: -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------------ | ------------------ | -| max | num | 最后一项目标id | **详细内容见参数** | -| view_at | num | 最后一项时间节点 | 时间戳 | -| business | str | 最后一项目标id类型 | **详细内容见参数** | -| ps | num | 每页项数 | | +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ---------------- | -------------- | +| max | num | 最后一项目标 id | **见请求参数** | +| view_at | num | 最后一项时间节点 | 时间戳 | +| business | str | 最后一项业务类型 | **见请求参数** | +| ps | num | 每页项数 | | `data`中的`tab`数组: -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ---- | -| 0 | obj | 历史记录筛选类型1 | | -| 1 | obj | 历史记录筛选类型2 | | -| 2 | obj | 历史记录筛选类型3 | | +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------------ | ---- | +| 0 | obj | 历史记录筛选类型 1 | | +| 1 | obj | 历史记录筛选类型 2 | | +| 2 | obj | 历史记录筛选类型 3 | | `tab`数组中的对象: @@ -71,69 +65,69 @@ | type | str | 类型 | | | name | str | 类型名 | | -`data`中的`tab`数组: +`data`中的`list`数组: -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---------------- | -| 0 | obj | 历史记录1 | | -| n | obj | 历史记录(n+1) | 按照查看顺序排列 | -| …… | obj | | | +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---------------- | +| 0 | obj | 历史记录 1 | | +| n | obj | 历史记录 (n+1) | 按照查看顺序排列 | +| …… | obj | | | -`tab`数组中的对象: +`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:已开播 | +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ------------------------------- | ------------------------ | ---------------------------------------- | +| 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:已开播 | -`tab`数组中的对象中的`covers`数组: +`list`数组中的对象中的`covers`数组: -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | str | 封面图片1 | | -| n | str | 封面图片(n+1) | | -| …… | str | …… | | +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| 0 | str | 封面图片 1 | | +| n | str | 封面图片 (n+1) | | +| …… | str | …… | | -`tab`数组中的对象中的`history`对象: +`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 />2:web端<br />4 6:pad端<br />33:TV端<br />0:其他 | +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | --------------------- | ------------------------------------------------------------ | +| 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 />2:web端<br />4 6:pad端<br />9: 智能音箱/游戏机33:TV端<br />0:其他 | **示例:** 获取当前时间截止的5条历史记录 ```shell -curl -G 'http://api.bilibili.com/x/web-interface/history/cursor' \ +curl -G 'https://api.bilibili.com/x/web-interface/history/cursor' \ --data-urlencode 'ps=5' \ -b 'SESSDATA=xxx' ``` @@ -349,13 +343,15 @@ curl -G 'http://api.bilibili.com/x/web-interface/history/cursor' \ </details> -## 获取全部视频历史记录(旧) +## 获取视频观看历史记录_web端旧版 -> http://api.bilibili.com/x/v2/history +> https://api.bilibili.com/x/v2/history *请求方式:GET* -认证方式:Cookie(SESSDATA) +认证方式:Cookie (SESSDATA) + +本接口也可以返回已失效稿件的信息 **url参数:** @@ -397,15 +393,15 @@ curl -G 'http://api.bilibili.com/x/web-interface/history/cursor' \ | pubdate | num | 稿件发布时间 | 时间戳 | | ctime | num | 用户提交稿件的时间 | 时间戳 | | desc | str | 视频简介 | | -| state | num | 视频状态 | 略,见[获取视频详细信息(web端)](/video/info.md#获取视频详细信息(web端))中的`state`备注 | -| ~~attribute~~(仅做历史性保留) | ~~num~~ | ~~稿件属性位配置~~ | 本字段已被删除<br />~~略,见[获取视频详细信息(web端)](/video/info.md#获取视频详细信息(web端))中的`attribute`备注~~ | +| 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`对象 | +| 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`对象 | +| dimension | obj | 视频1P分辨率 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`dimension`对象 | | bangumi | obj | 番剧/影视信息 | 非番剧/影视无此项 | | cheese | obj | 课程信息 | 非课程无此项 | | favorite | bool | 是否已收藏 | true:已收藏<br />false:未收藏 | @@ -461,7 +457,7 @@ curl -G 'http://api.bilibili.com/x/web-interface/history/cursor' \ 查询当前视频历史记录列表 ```shell -curl -G 'http://api.bilibili.com/x/v2/history' \ +curl -G 'https://api.bilibili.com/x/v2/history' \ --data-urlencode 'ps=5' \ --data-urlencode 'pn=1' \ -b 'SESSDATA=xxx' @@ -661,18 +657,18 @@ curl -G 'http://api.bilibili.com/x/v2/history' \ ## 删除历史记录 -> http://api.bilibili.com/x/v2/history/delete +> https://api.bilibili.com/x/v2/history/delete *请求方式:POST* -认证方式:Cookie(SESSDATA) +认证方式:Cookie (SESSDATA) **正文参数( application/x-www-form-urlencoded ):** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| kid | str | 删除的目标记录 | 必要 | 视频:archive\_{稿件avid}<br />直播:live_{直播间id}<br />专栏:article\_{专栏cvid}<br />剧集:pgc\_{剧集ssid}<br />文集:article-list\_{文集rlid} | -| csrf | str | CSRF Token(位于cookie) | 必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | --------------------------------------------------- | ------ | ------------------------------------------------------------ | +| kid | str | 删除的目标记录,格式为`{业务类型}_{目标id}`详见备注 | 必要 | 视频:archive\_{稿件avid}<br />直播:live_{直播间id}<br />专栏:article\_{专栏cvid}<br />剧集:pgc\_{剧集ssid}<br />文集:article-list\_{文集rlid} | +| csrf | str | CSRF Token(位于cookie) | 必要 | | **json回复:** @@ -689,7 +685,7 @@ curl -G 'http://api.bilibili.com/x/v2/history' \ 删除视频`av540580868`的观看历史记录 ```shell -curl 'http://api.bilibili.com/x/v2/history/delete' \ +curl 'https://api.bilibili.com/x/v2/history/delete' \ --data-urlencode 'kid=archive_540580868' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' @@ -710,11 +706,11 @@ curl 'http://api.bilibili.com/x/v2/history/delete' \ ## 清空历史记录 -> http://api.bilibili.com/x/v2/history/clear +> https://api.bilibili.com/x/v2/history/clear *请求方式:POST* -认证方式:Cookie(SESSDATA) +认证方式:Cookie (SESSDATA) **正文参数( application/x-www-form-urlencoded ):** @@ -737,7 +733,7 @@ curl 'http://api.bilibili.com/x/v2/history/delete' \ 清空历史记录 ```shell -curl 'http://api.bilibili.com/x/v2/history/clear' \ +curl 'https://api.bilibili.com/x/v2/history/clear' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ``` @@ -757,11 +753,11 @@ curl 'http://api.bilibili.com/x/v2/history/clear' \ ## 停用历史记录 -> http://api.bilibili.com/x/v2/history/shadow/set +> https://api.bilibili.com/x/v2/history/shadow/set *请求方式:POST* -认证方式:Cookie(SESSDATA) +认证方式:Cookie (SESSDATA) 该操作不会影响原有历史记录 @@ -787,7 +783,7 @@ curl 'http://api.bilibili.com/x/v2/history/clear' \ 停用历史记录功能 ```shell -curl 'http://api.bilibili.com/x/v2/history/shadow/set' \ +curl 'https://api.bilibili.com/x/v2/history/shadow/set' \ --data-urlencode 'switch=true' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' @@ -808,11 +804,11 @@ curl 'http://api.bilibili.com/x/v2/history/shadow/set' \ ## 查询历史记录停用状态 -> http://api.bilibili.com/x/v2/history/shadow +> https://api.bilibili.com/x/v2/history/shadow *请求方式:GET* -认证方式:Cookie(SESSDATA) +认证方式:Cookie (SESSDATA) **json回复:** @@ -830,7 +826,7 @@ curl 'http://api.bilibili.com/x/v2/history/shadow/set' \ 当前状态为未停用视频历史记录 ```shell -curl 'http://api.bilibili.com/x/v2/history/shadow' \ +curl 'https://api.bilibili.com/x/v2/history/shadow' \ -b 'SESSDATA=xxx' ``` diff --git a/history&toview/toview.md b/docs/historytoview/toview.md similarity index 91% rename from history&toview/toview.md rename to docs/historytoview/toview.md index c23cf8a..4ff78ef 100644 --- a/history&toview/toview.md +++ b/docs/historytoview/toview.md @@ -1,18 +1,10 @@ # 稍后再看 -<img src="/imgs/toview.png" width="25" height="20"/> - -- [视频添加稍后再看](#视频添加稍后再看) -- [添加频道中所有视频到稍后再看](#添加频道中所有视频到稍后再看) -- [获取稍后再看视频列表](#获取稍后再看视频列表) -- [删除稍后再看视频](#删除稍后再看视频) -- [清空稍后再看视频列表](#清空稍后再看视频列表) - ---- +<img src="../../assets/img/toview.png" width="25" height="20"/> ## 视频添加稍后再看 ->http://api.bilibili.com/x/v2/history/toview/add +> https://api.bilibili.com/x/v2/history/toview/add *请求方式:POST* @@ -45,7 +37,7 @@ avid方式: ```shell -curl 'http://api.bilibili.com/x/v2/history/toview/add' \ +curl 'https://api.bilibili.com/x/v2/history/toview/add' \ --data-urlencode 'aid=41687433' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' @@ -54,7 +46,7 @@ curl 'http://api.bilibili.com/x/v2/history/toview/add' \ bvid方式: ```shell -curl 'http://api.bilibili.com/x/v2/history/toview/add' \ +curl 'https://api.bilibili.com/x/v2/history/toview/add' \ --data-urlencode 'bvid=BV1ht41147kj' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' @@ -75,7 +67,7 @@ curl 'http://api.bilibili.com/x/v2/history/toview/add' \ ## 添加频道中所有视频到稍后再看 -> http://space.bilibili.com/ajax/channel/addAllToView +> https://space.bilibili.com/ajax/channel/addAllToView *请求方式:POST* @@ -109,7 +101,7 @@ curl 'http://api.bilibili.com/x/v2/history/toview/add' \ 添加用户`mid=282994`下的频道`4693`中所有视频到稍后再看 ```shell -curl 'http://space.bilibili.com/ajax/channel/addAllToView' \ +curl 'https://space.bilibili.com/ajax/channel/addAllToView' \ --data-urlencode 'cid=4693' \ --data-urlencode 'mid=282994' \ --data-urlencode 'csrf=xxx' \ @@ -131,7 +123,7 @@ curl 'http://space.bilibili.com/ajax/channel/addAllToView' \ ## 获取稍后再看视频列表 -> http://api.bilibili.com/x/v2/history/toview +> https://api.bilibili.com/x/v2/history/toview *请求方式:GET* @@ -178,14 +170,14 @@ curl 'http://space.bilibili.com/ajax/channel/addAllToView' \ | pubdate | num | 稿件发布时间 | 时间戳 | | ctime | num | 用户提交稿件的时间 | 时间戳 | | desc | str | 视频简介 | | -| state | num | 视频状态 | 略,见[获取视频详细信息(web端)](/video/info.md#获取视频详细信息(web端))中的`state`备注 | -| ~~attribute~~(仅做历史性保留) | ~~num~~ | ~~稿件属性位配置~~ | 本字段已被删除~~略,见[获取视频详细信息(web端)](/video/info.md#获取视频详细信息(web端))中的`attribute`备注~~ | +| 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`对象 | +| 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`对象 | +| dimension | obj | 稿件1P分辨率 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`dimension`对象 | | count | num | 稿件分P数 | 非投稿视频无此项 | | cid | num | 视频cid | | | progress | num | 观看进度时间 | 单位为秒 | @@ -197,7 +189,7 @@ curl 'http://space.bilibili.com/ajax/channel/addAllToView' \ 获取稍后再看视频列表 ```shell -curl 'http://api.bilibili.com/x/v2/history/toview' \ +curl 'https://api.bilibili.com/x/v2/history/toview' \ -b 'SESSDATA=xxx' ``` @@ -352,7 +344,7 @@ curl 'http://api.bilibili.com/x/v2/history/toview' \ ## 删除稍后再看视频 -> http://api.bilibili.com/x/v2/history/toview/del +> https://api.bilibili.com/x/v2/history/toview/del *请求方式:POST* @@ -381,7 +373,7 @@ curl 'http://api.bilibili.com/x/v2/history/toview' \ 删除视频`av540580868`的稍后再看记录 ```shell -curl 'http://api.bilibili.com/x/v2/history/toview/del' \ +curl 'https://api.bilibili.com/x/v2/history/toview/del' \ --data-urlencode 'aid=540580868' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' @@ -403,7 +395,7 @@ curl 'http://api.bilibili.com/x/v2/history/toview/del' \ 删除所有已观看的视频 ```shell -curl 'http://api.bilibili.com/x/v2/history/toview/del' \ +curl 'https://api.bilibili.com/x/v2/history/toview/del' \ --data-urlencode 'viewed=true' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' @@ -424,7 +416,7 @@ curl 'http://api.bilibili.com/x/v2/history/toview/del' \ ## 清空稍后再看视频列表 -> http://api.bilibili.com/x/v2/history/toview/clear +> https://api.bilibili.com/x/v2/history/toview/clear *请求方式:POST* @@ -451,7 +443,7 @@ curl 'http://api.bilibili.com/x/v2/history/toview/del' \ 清空稍后再看视频列表 ```shell -curl 'http://api.bilibili.com/x/v2/history/toview/clear' \ +curl 'https://api.bilibili.com/x/v2/history/toview/clear' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ``` diff --git a/docs/live/danmaku.md b/docs/live/danmaku.md new file mode 100644 index 0000000..68b8309 --- /dev/null +++ b/docs/live/danmaku.md @@ -0,0 +1,507 @@ +# 直播间弹幕 + +## 获取当前用户对应直播间可发弹幕配置 + +> https://api.live.bilibili.com/xlive/web-room/v1/dM/GetDMConfigByGroup + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +未登录也可以获取,但颜色只有白色可用,模式只有滚动。 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---- | --- | --- | ---- | --- | +| room_id | num | 直播间id | 必要 | | +| web_location | str | (?) | 非必要 | 作用尚不明确 | +| w_rid | str | wbi签名 | 非必要 | 不强制需要 | +| wts | num | 秒时间戳 | 非必要 | 不强制需要 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功<br />-400: 参数错误 | +| data | obj | 信息本体 | | +| message | str | 错误信息 | | +| msg | str | 信息 | 成功时存在,为`""`(空字符串) | +| ttl | num | `1` | 成功时不存在 | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| group | arr | 弹幕颜色组 | | +| mode | arr | 弹幕显示模式 | | + +`data.group` 数组中对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| name | str | 显示名称 | | +| sort | num | 用于排序 | | +| color | arr | 该组颜色列表 | | + +`data.group[i].color` 数组中对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| name | str | 颜色名 | | +| color | str | 十进制颜色值 | 发送弹幕用 | +| color\_hex | str | 十六进制颜色值 | 发送弹幕用 | +| status | num | 可用状态 | 0: 不可用<br />1: 可用 | +| weight | num | (?) | 作用尚不明确 | +| color\_id | num | 颜色id? | | +| origin | num | (?) | | + +`data.mode` 数组中对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| name | str | 模式名称 | | +| mode | num | 模式值 | 发送弹幕用 | +| type | str | 模式类型 | | +| status | num | 可用状态 | 0: 不可用<br />1: 可用 | + +**示例:** + +获取未登录用户在直播间 `1` 的弹幕配置可用情况 + +```shell +curl 'https://api.live.bilibili.com/xlive/web-room/v1/dM/GetDMConfigByGroup?room_id=1' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "data": { + "group": [ + { + "name": "普", + "sort": 0, + "color": [ + { + "name": "白色", + "color": "16777215", + "color_hex": "ffffff", + "status": 1, + "weight": -9999, + "color_id": -9999, + "origin": 0 + } + ] + }, + { + "name": "航", + "sort": 100, + "color": [ + { + "name": "紫色", + "color": "14893055", + "color_hex": "e33fff", + "status": 0, + "weight": 0, + "color_id": 6, + "origin": 1 + } + ] + }, + { + "name": "粉", + "sort": 200, + "color": [ + { + "name": "松石绿", + "color": "5566168", + "color_hex": "54eed8", + "status": 0, + "weight": 99, + "color_id": 66, + "origin": 2 + }, + { + "name": "雨后蓝", + "color": "5816798", + "color_hex": "58c1de", + "status": 0, + "weight": 98, + "color_id": 67, + "origin": 2 + }, + { + "name": "星空蓝", + "color": "4546550", + "color_hex": "455ff6", + "status": 0, + "weight": 97, + "color_id": 68, + "origin": 2 + }, + { + "name": "紫罗兰", + "color": "9920249", + "color_hex": "975ef9", + "status": 0, + "weight": 96, + "color_id": 69, + "origin": 2 + }, + { + "name": "梦境红", + "color": "12802438", + "color_hex": "c35986", + "status": 0, + "weight": 95, + "color_id": 70, + "origin": 2 + }, + { + "name": "热力橙", + "color": "16747553", + "color_hex": "ff8c21", + "status": 0, + "weight": 94, + "color_id": 71, + "origin": 2 + }, + { + "name": "香槟金", + "color": "16774434", + "color_hex": "fff522", + "status": 0, + "weight": 93, + "color_id": 72, + "origin": 2 + } + ] + }, + { + "name": "爷", + "sort": 300, + "color": [ + { + "name": "红色", + "color": "16738408", + "color_hex": "ff6868", + "status": 0, + "weight": 0, + "color_id": 8, + "origin": 3 + }, + { + "name": "蓝色", + "color": "6737151", + "color_hex": "66ccff", + "status": 0, + "weight": 0, + "color_id": 7, + "origin": 3 + } + ] + }, + { + "name": "活", + "sort": 400, + "color": [ + { + "name": "盛典金", + "color": "16766720", + "color_hex": "ffd700", + "status": 0, + "weight": 100, + "color_id": 44, + "origin": 4 + }, + { + "name": "升腾蓝", + "color": "4286945", + "color_hex": "4169e1", + "status": 0, + "weight": 100, + "color_id": 43, + "origin": 4 + }, + { + "name": "青色", + "color": "65532", + "color_hex": "fffc", + "status": 0, + "weight": 0, + "color_id": 5, + "origin": 4 + }, + { + "name": "绿色", + "color": "8322816", + "color_hex": "7eff00", + "status": 0, + "weight": 0, + "color_id": 4, + "origin": 4 + }, + { + "name": "黄色弹幕", + "color": "16772431", + "color_hex": "ffed4f", + "status": 0, + "weight": 0, + "color_id": 3, + "origin": 4 + }, + { + "name": "橙色", + "color": "16750592", + "color_hex": "ff9800", + "status": 0, + "weight": 0, + "color_id": 2, + "origin": 4 + }, + { + "name": "粉色", + "color": "16741274", + "color_hex": "ff739a", + "status": 0, + "weight": 0, + "color_id": 1, + "origin": 4 + } + ] + } + ], + "mode": [ + { + "name": "滚动", + "mode": 1, + "type": "scroll", + "status": 1 + }, + { + "name": "底部", + "mode": 4, + "type": "bottom", + "status": 0 + }, + { + "name": "顶部", + "mode": 5, + "type": "top", + "status": 0 + } + ] + }, + "message": "", + "msg": "" +} +``` + +</details> + +## 设置弹幕样式 + +> https://api.live.bilibili.com/xlive/web-room/v1/dM/AjaxSetConfig + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---- | --- | --- | ---- | --- | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| csrf\_token | str | 同csrf | 非必要 | | +| room\_id | num | 直播间id | 必要 | | +| color | str | 颜色值 | 必要(可选) | color和mode任选一个 | +| mode | num | 弹幕模式 | 必要(可选) | color和mode任选一个 | + +注1: 抓取到的color格式是`"0x"+六位十六进制小写颜色值`,实际不需要`0x`,且不区分大小写。 + +注2: 若color和mode同时存在将只处理color,mode将被忽略。(见[#1236(comment)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1236#issuecomment-2849019923)) + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功<br />-101: 账号未登录<br />-500: 未达到使用条件<br />10064002: 参数错误<br />10065107: 颜色不存在 | +| message | str | 错误信息 | | +| ttl | num | `1` | | +| data | obj | 信息本体 | 部分情况不存在,10064002时为`null` | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| status | num | 同code | | +| msg | str | 提示信息 | 成功时有内容 | +| roomid | num | 直播间id | | + +**示例:** + +更改直播间 `1017` 的弹幕颜色为白色 + +```shell +curl 'https://api.live.bilibili.com/xlive/web-room/v1/dM/AjaxSetConfig' \ + --data-urlencode 'room_id=1017' \ + --data-urlencode 'color=0xffffff' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx;bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code":0, + "message":"0", + "ttl":1, + "data":{ + "status":0, + "msg":"设置成功~", + "roomid":1017 + } +} +``` + +</details> + +## 发送直播弹幕 + +> https://api.live.bilibili.com/msg/send + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | ---- | --- | ----- | --- | +| w_rid | str | wbi签名 | 非必要 | 不强制需要 | +| wts | num | Unix 秒时间戳 | 非必要 | 不强制需要 | + +**正文参数 (`application/x-www-form-urlencoded`或`multipart/form-data`):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---- | --- | --- | ---- | --- | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| roomid | num | 直播间id | 必要 | | +| msg | str | 弹幕内容 | 必要 | | +| rnd | num | 当前 Unix 秒时间戳 | 必要 | | +| fontsize | num | 字体大小 | 必要 | 默认为`25` | +| color | num | 十进制颜色值 | 必要 | 实际无效果 | +| mode | num | 展示模式 | 非必要 | 默认为`1` | +| bubble | num | (?) | 非必要 | 值为`0` | +| room\_type | num | (?) | 非必要 | `0` | +| jumpfrom | num | (?) | 非必要 | `0` | +| reply\_mid | num | (?) | 非必要 | `0` | +| reply\_attr | num | (?) | 非必要 | `0` | +| reply\_uname | str | (?) | 非必要 | `""` | +| replay\_dmid | str | (?) | 非必要 | `""` | +| statistics | str | (?) | 非必要 | `{"appId":100,"platform":5}` | +| csrf_token | str | 同csrf | 非必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | `-101`:账号未登录<br />`-111`:csrf 校验失败<br />`-400`:请求错误,带有必须参数的信息<br />`1003212`:超出限制长度<br />`10031`:发送频率过快 | +| message | str | 错误信息 | | +| msg | str | 同`message` | | +| data | obj | 信息本体 | | +| ttl | num | `1` | 在小于0的code中存在 | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| mode_info | obj | 弹幕信息 | | +| dm_v2 | null | v2弹幕 | | + +`data.mode_info` 对象: + +基本上与[直播间信息流#弹幕 (DANMU_MSG)](message_stream.md#弹幕-danmu_msg)的`info[0][15]`对象相同。 + +**示例:** + +给直播间 `1899237171` 发送内容为 `QwQ` 的弹幕 + +```shell +curl 'https://api.live.bilibili.com/msg/send' \ + --data-urlencode 'roomid=1899237171' \ + --data-urlencode 'msg=QwQ' \ + --data-urlencode 'rnd=1744956003' \ + --data-urlencode 'fontsize=25' + --data-urlencode 'color=16777215' + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx;bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code":0, + "data":{ + "mode_info":{ + "mode":0, + "show_player_type":0, + "extra":"{\"send_from_me\":true,\"master_player_hidden\":false,\"mode\":0,\"color\":16777215,\"dm_type\":0,\"font_size\":25,\"player_mode\":1,\"show_player_type\":0,\"content\":\"QwQ\",\"user_hash\":\"2402762465\",\"emoticon_unique\":\"\",\"bulge_display\":0,\"recommend_score\":7,\"main_state_dm_color\":\"\",\"objective_state_dm_color\":\"\",\"direction\":0,\"pk_direction\":0,\"quartet_direction\":0,\"anniversary_crowd\":0,\"yeah_space_type\":\"\",\"yeah_space_url\":\"\",\"jump_to_url\":\"\",\"space_type\":\"\",\"space_url\":\"\",\"animation\":{},\"emots\":null,\"is_audited\":false,\"id_str\":\"4e3ed8ede9409b234b5e1d64c06801ea3119\",\"icon\":null,\"show_reply\":true,\"reply_mid\":0,\"reply_uname\":\"\",\"reply_uname_color\":\"\",\"reply_is_mystery\":false,\"reply_type_enum\":0,\"hit_combo\":0,\"esports_jump_url\":\"\"}", + "user":{ + "uid":438160221, + "base":{ + "name":"weatfe", + "face":"https://i0.hdslb.com/bfs/face/member/noface.jpg", + "name_color":0, + "is_mystery":false, + "risk_ctrl_info":null, + "origin_info":{ + "name":"weatfe", + "face":"https://i0.hdslb.com/bfs/face/member/noface.jpg" + }, + "official_info":{ + "role":0, + "title":"", + "desc":"", + "type":-1 + }, + "name_color_str":"" + }, + "medal":null, + "wealth":null, + "title":{ + "old_title_css_id":"", + "title_css_id":"" + }, + "guard":null, + "uhead_frame":null, + "guard_leader":{ + "is_guard_leader":false + } + } + }, + "dm_v2":null + }, + "message":"", + "msg":"" +} +``` + +</details> diff --git a/docs/live/emoticons.md b/docs/live/emoticons.md new file mode 100644 index 0000000..75ee998 --- /dev/null +++ b/docs/live/emoticons.md @@ -0,0 +1,927 @@ +# 直播间表情 + +## 获取直播间的表情包 + +> https://api.live.bilibili.com/xlive/web-ucenter/v2/emoticon/GetEmoticons + +*请求方法: GET* + +认证方式: Cookie (SESSDATA) + +**URL 参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ------ | ---------- | ------ | ---- | +| platform | string | 平台 | 必要 | 已知: `pc``android` `ios` | +| room_id | number | 直播间长号 | 必要 | 只支持 `room_id` 不支持 `short_id` | + +**JSON 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | -------- | ---- | +| code | number | 返回值 | 0: 成功 | +| message | string | 错误消息 | 默认为 0 | +| ttl | number | 1 | | +| data | object | 信息本体 | 见下 | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | -------- | ---------- | ---- | +| data | object[] | 表情包数据 | 套了个娃 | +| fans_brand | number | 品牌标识? | | +| purchase_url | null? | 购买链接? | | + +`data.data[]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------------- | -------- | --------- | ---- | +| current_cover | string | 封面 URL | | +| emoticons | object[] | 表情列表 | | +| pkg_descript | string | 文字描述 | | +| pkg_id | number | 包 ID | | +| pkg_name | string | 包名称 | | +| pkg_perm | number | 使用权限? | | +| pkg_type | number | 包类型 | | +| recently_used_emoticons | unknown[] | 最近使用的表情 | | +| top_show | object | 顶部展示信息? | | +| top_show_recent | object | 最近使用的顶部展示信息? | | +| unlock_identity | number | 解锁所需身份标识? | | +| unlock_need_gift | number | 解锁所需礼物? | | + +`data.data[].emoticons[]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ------ | ---- | ---- | +| bulge_display | number | 突出展示? | | +| descript | string | 描述 | | +| emoji | string | 触发关键词? | | +| emoticon_id | number | 表情 ID | | +| emoticon_unique | string | 表情唯一标识 | | +| emoticon_value_type | number | 表情值类型? | | +| height | number | 表情图片高度 | | +| identity | number | 身份限制标识? | | +| in_player_area | number | 播放器区域内展示? | | +| is_dynamic | number | 是否为动态表情? | | +| perm | number | 使用权限? | | +| unlock_need_gift | number | 解锁需求礼物? | | +| unlock_need_level | number | 解锁需求等级? | | +| unlock_show_color | string | 解锁展示颜色? | | +| unlock_show_image | string | 解锁展示图片? | | +| unlock_show_text | string | 解锁展示文字? | | +| url | string | 表情图片 URL | | +| width | number | 表情图片宽度 | | + +`data.data[].top_show` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ------ | ---- | ---- | +| top_left | object | | 左上 | +| top_right | object | | 右上 | + +`data.data[].top_show.top_left` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ------ | ----- | ---- | +| image | string | 图片? | | +| text | string | 文字 | | + +`data.data[].top_show.top_right` 对象: + +同 `data.data[].top_show.top_left` 对象 + +`data.data[].top_show_recent` 对象: + +同 `data.data[].top_show` 对象 + +`data.data[].top_show_recent.top_left` 对象: + +同 `data.data[].top_show.top_left` 对象 + +`data.data[].top_show_recent.top_right` 对象: + +同 `data.data[].top_show.top_left` 对象 + +**示例:** + +获取直播间 `14047` 的表情包, 平台为 `android` + +```shell +curl -G 'https://api.live.bilibili.com/xlive/web-ucenter/v2/emoticon/GetEmoticons' \ +--url-query 'room_id=14047' \ +--url-query 'platform=android' \ +-b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "data": { + "data": [ + { + "current_cover": "http://i0.hdslb.com/bfs/live/39b7667c2601e4da8019472f5e3df1f2278278b6.png", + "emoticons": [ + { + "bulge_display": 0, + "descript": "", + "emoji": "啊", + "emoticon_id": 331, + "emoticon_unique": "official_331", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/cbf2746062242e77bdcb9eb08edbf9b151fe0c2e.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "冲鸭", + "emoticon_id": 332, + "emoticon_unique": "official_332", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/dea7fbbc1c3d3c80f4c7b27263e13460f21874e4.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "upup", + "emoticon_id": 348, + "emoticon_unique": "official_348", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/38d84a4cd2f40069202ee13bbdca5b23d29710fb.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "星星向龙", + "emoticon_id": 343, + "emoticon_unique": "official_343", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/a69423be39b0f2a87dc74f2e44ead70de0eb0d4f.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "欧皇驾到", + "emoticon_id": 335, + "emoticon_unique": "official_335", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/650399e68d0d93df4b3f9e95e7437e83be7fbb1a.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "这个好耶", + "emoticon_id": 345, + "emoticon_unique": "official_345", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/2ce08b31618d3ad0d34877bf949ef0089a0438b7.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "泰裤辣", + "emoticon_id": 339, + "emoticon_unique": "official_339", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/82c38fc930ae764b4c6215f544bf8e1dba73b51c.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "闪避技能", + "emoticon_id": 337, + "emoticon_unique": "official_337", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/fa3febe6c62f3bcd042953141930d96fb8451e60.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "稳住能赢", + "emoticon_id": 342, + "emoticon_unique": "official_342", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/b3495aaa935b045bfc2e1d52738ea7b124e0d552.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "中奖喷雾", + "emoticon_id": 346, + "emoticon_unique": "official_346", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/c3cfa182d16564301d39e4c7e4c186dfb9fabf96.png", + "width": 200 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "赞", + "emoticon_id": 147, + "emoticon_unique": "official_147", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/bbd9045570d0c022a984c637e406cb0e1f208aa9.png", + "width": 150 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "妙啊", + "emoticon_id": 109, + "emoticon_unique": "official_109", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/7b7a2567ad1520f962ee226df777eaf3ca368fbc.png", + "width": 138 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "有点东西", + "emoticon_id": 113, + "emoticon_unique": "official_113", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/39e518474a3673c35245bf6ef8ebfff2c003fdc3.png", + "width": 186 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "很有精神", + "emoticon_id": 150, + "emoticon_unique": "official_150", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/e91cbe30b2db1e624bd964ad1f949661501f42f8.png", + "width": 201 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "泪目", + "emoticon_id": 103, + "emoticon_unique": "official_103", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/aa93b9af7ba03b50df23b64e9afd0d271955cd71.png", + "width": 144 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "赢麻了", + "emoticon_id": 128, + "emoticon_unique": "official_128", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/1d4c71243548a1241f422e90cd8ba2b75c282f6b.png", + "width": 156 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "钝角", + "emoticon_id": 133, + "emoticon_unique": "official_133", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/38cf68c25d9ff5d364468a062fc79571db942ff3.png", + "width": 153 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "干杯", + "emoticon_id": 149, + "emoticon_unique": "official_149", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/8fedede4028a72e71dae31270eedff5f706f7d18.png", + "width": 162 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "2333", + "emoticon_id": 124, + "emoticon_unique": "official_124", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/a98e35996545509188fe4d24bd1a56518ea5af48.png", + "width": 183 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "打call", + "emoticon_id": 146, + "emoticon_unique": "official_146", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/fa1eb4dce3ad198bb8650499830560886ce1116c.png", + "width": 195 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "多谢款待", + "emoticon_id": 148, + "emoticon_unique": "official_148", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/4609dad97c0dfa61f8da0b52ab6fff98e0cf1e58.png", + "width": 207 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "awsl", + "emoticon_id": 102, + "emoticon_unique": "official_102", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/328e93ce9304090f4035e3aa7ef031d015bbc915.png", + "width": 162 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "鸡汤来咯", + "emoticon_id": 137, + "emoticon_unique": "official_137", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/b371151503978177b237afb85185b0f5431d0106.png", + "width": 198 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "雀食", + "emoticon_id": 118, + "emoticon_unique": "official_118", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/7251dc7df587388a3933743bf38394d12a922cd7.png", + "width": 159 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "禁止套娃", + "emoticon_id": 108, + "emoticon_unique": "official_108", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/6a644577437d0bd8a314990dd8ccbec0f3b30c92.png", + "width": 204 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "暗中观察", + "emoticon_id": 104, + "emoticon_unique": "official_104", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/18af5576a4582535a3c828c3ae46a7855d9c6070.png", + "width": 156 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "保熟吗", + "emoticon_id": 105, + "emoticon_unique": "official_105", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/0e28444c8e2faef3169e98e1a41c487144d877d4.png", + "width": 162 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "比心", + "emoticon_id": 106, + "emoticon_unique": "official_106", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/1ba5126b10e5efe3e4e29509d033a37f128beab2.png", + "width": 132 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "咸鱼翻身", + "emoticon_id": 110, + "emoticon_unique": "official_110", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/7db4188c050f55ec59a1629fbc5a53661e4ba780.png", + "width": 180 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "mua", + "emoticon_id": 111, + "emoticon_unique": "official_111", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/08f1aebaa4d9c170aa79cbafe521ef0891bdf2b5.png", + "width": 165 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "来了来了", + "emoticon_id": 115, + "emoticon_unique": "official_115", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/61e790813c51eab55ebe0699df1e9834c90b68ba.png", + "width": 168 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "贴贴", + "emoticon_id": 116, + "emoticon_unique": "official_116", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/88b49dac03bfd5d4cb49672956f78beb2ebd0d0b.png", + "width": 162 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "牛牛牛", + "emoticon_id": 117, + "emoticon_unique": "official_117", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/343f7f7e87fa8a07df63f9cba6b776196d9066f0.png", + "width": 168 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "颠个勺", + "emoticon_id": 119, + "emoticon_unique": "official_119", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/625989e78079e3dc38d75cb9ac392fe8c1aa4a75.png", + "width": 195 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "好家伙", + "emoticon_id": 122, + "emoticon_unique": "official_122", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/c2650bf9bbc79b682a4b67b24df067fdd3e5e9ca.png", + "width": 165 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "下次一定", + "emoticon_id": 125, + "emoticon_unique": "official_125", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/cc2652cef69b22117f1911391567bd2957f27e08.png", + "width": 177 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "不上Ban", + "emoticon_id": 126, + "emoticon_unique": "official_126", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/eff44c1fc03311573e8817ca8010aca72404f65c.png", + "width": 231 + }, + { + "bulge_display": 0, + "descript": "", + "emoji": "上热榜", + "emoticon_id": 134, + "emoticon_unique": "official_134", + "emoticon_value_type": 0, + "height": 60, + "identity": 99, + "in_player_area": 1, + "is_dynamic": 1, + "perm": 1, + "unlock_need_gift": 0, + "unlock_need_level": 0, + "unlock_show_color": "", + "unlock_show_image": "", + "unlock_show_text": "", + "url": "http://i0.hdslb.com/bfs/live/83d5b9cdaaa820c2756c013031d34dac1fd4156b.png", + "width": 168 + } + ], + "pkg_descript": "官方表情(系统)", + "pkg_id": 1, + "pkg_name": "通用表情", + "pkg_perm": 1, + "pkg_type": 1, + "recently_used_emoticons": [], + "top_show": { + "top_left": { + "image": "", + "text": "通用表情" + }, + "top_right": { + "image": "", + "text": "" + } + }, + "top_show_recent": { + "top_left": { + "image": "", + "text": "" + }, + "top_right": { + "image": "", + "text": "" + } + }, + "unlock_identity": 0, + "unlock_need_gift": 0 + } + ], + "fans_brand": 1, + "purchase_url": null + }, + "message": "0", + "ttl": 1 +} +``` +</details> diff --git a/docs/live/follow_up_live.md b/docs/live/follow_up_live.md new file mode 100644 index 0000000..5e88da5 --- /dev/null +++ b/docs/live/follow_up_live.md @@ -0,0 +1,161 @@ +# 关注UP直播情况 + +## 用户关注的所有UP的直播情况 + +> https://api.live.bilibili.com/xlive/web-ucenter/user/following + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|---------|-----|------|-----|-------| +| page | num | 页码 | 非必要 | 默认为`1` | +| page_size | num | 每页的数据数量 | 非必要 | 有效值`1`-`10`, 默认为`10` | +| ignoreRecord | num | | | **尚不明确**<br />一般为`1` | +| hit_ab | bool | | | **尚不明确**<br />建议用`true`, 不填为`false` | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|-----------------| +| code | num | 返回值 | `0`:成功<br />`-101`:错误 | +| message | str | 错误信息 | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|-----------------| +| title | str | 标题 | | +| pageSize | num | 每页的数据数量 | | +| totalPage | num | 分页数量 | | +| list | obj | UP直播情况列表 | | +| count | num | 曾直播过的UP数量 | | +| never_lived_count | num | 未直播过的UP数量 | | +| live_count | num | 正在直播的UP数量 | | +| never_lived_faces | list | | **尚不明确** | + +`list`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------|-----|-----|-----------| +| roomid | num | 房间号 | | +| uid | num | 主播uid | | +| uname | str | 主播名 | | +| title | str | 直播标题 | | +| face | str | 主播头像 | | +| live_status | num | 是否正在直播 | `0`: 未直播<br />`1`: 正在直播 | +| record_num | num | | **尚不明确**<br />一般为0 | +| recent_record_id | str | | **尚不明确**<br />一般为空 | +| is_attention | num | | **尚不明确**<br />一般为1 | +| clipnum | num | | **尚不明确**<br />一般为0 | +| fans_num | num | | **尚不明确**<br />一般为0 | +| area_name | str | | **尚不明确**<br />一般为空 | +| area_value | str | | **尚不明确**<br />一般为空 | +| tags | str | | **尚不明确**<br />一般为空 | +| recent_record_id_v2 | str | | **尚不明确**<br />一般为空 | +| record_num_v2 | num | | **尚不明确**<br />一般为0 | +| record_live_time | num | 主播上一次直播结束的时间戳 | 正在直播时, 值为`0` | +| area_name_v2 | str | 频道的名称 | | +| room_news | str | 房间公告 | | +| switch | bool | | **尚不明确** | +| watch_icon | str | | **尚不明确** | +| text_small | str | | **尚不明确**<br />当主播正在直播时, 为在线人数(可能) | +| room_cover | str | 房间封面图片的URL | | +| parent_area_id | num | 父分区id | | +| area_id | num | 分区id | | + +**示例:** + +```shell +curl -G 'https://api.live.bilibili.com/xlive/web-ucenter/user/following' \ + -b 'SESSDATA=xxx' \ + --data-urlencode 'page=1' \ + --data-urlencode 'page_size=2' \ + --data-urlencode 'ignoreRecord=1' \ + --data-urlencode 'hit_ab=true' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "title": "哔哩哔哩直播 - 我的关注", + "pageSize": 2, + "totalPage": 26, + "list": [ + { + "roomid": 544853, + "uid": 686127, + "uname": "籽岷", + "title": "尝试双机位", + "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", + "live_status": 0, + "record_num": 0, + "recent_record_id": "", + "is_attention": 1, + "clipnum": 0, + "fans_num": 0, + "area_name": "", + "area_value": "", + "tags": "", + "recent_record_id_v2": "", + "record_num_v2": 0, + "record_live_time": 1720011626, + "area_name_v2": "新游推荐", + "room_news": "", + "switch": true, + "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "text_small": "10.9万", + "room_cover": "http://i0.hdslb.com/bfs/live/new_room_cover/6c89c41d7695a080d31ae21c128f7759a7f419e5.jpg", + "parent_area_id": 6, + "area_id": 889 + }, + { + "roomid": 21686237, + "uid": 456664753, + "uname": "央视新闻", + "title": "央视新闻的直播间", + "face": "https://i1.hdslb.com/bfs/face/38a8db1c187b64a1412fafffbf350f8a3f436371.jpg", + "live_status": 0, + "record_num": 0, + "recent_record_id": "", + "is_attention": 1, + "clipnum": 0, + "fans_num": 0, + "area_name": "", + "area_value": "", + "tags": "", + "recent_record_id_v2": "", + "record_num_v2": 0, + "record_live_time": 1720001717, + "area_name_v2": "社科法律心理", + "room_news": "", + "switch": false, + "watch_icon": "https://i0.hdslb.com/bfs/live/0b265af1af0a77abc47aa3b8f1a5c0769d8bd23b.png", + "text_small": "0", + "room_cover": "http://i0.hdslb.com/bfs/live/d650d0e6e49397ea71d630be0a0e686679df16d8.jpg", + "parent_area_id": 11, + "area_id": 376 + } + ], + "count": 52, + "never_lived_count": 30, + "live_count": 0, + "never_lived_faces": [] + } +} + +``` + +</details> \ No newline at end of file diff --git a/docs/live/info.md b/docs/live/info.md new file mode 100644 index 0000000..2106b00 --- /dev/null +++ b/docs/live/info.md @@ -0,0 +1,2559 @@ +# 直播间基本信息 + +## 获取直播间信息 + +> 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=2`的主播信息 + +```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/xlive/web-room/v1/index/getRoomBaseInfo + +*请求方式: GET* + +注: 亦可用于批量获取 + +<!--{ + "gh": [745] +}--> + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | ---- | --- | - | - | +| req_biz | str | `web_room_componet` | 必要 | | +| room_ids | num | 直播间短ID | 不必要 | 多个重复该参数即可 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功<br />-400: 请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| by_uids | obj | 空 | | +| by_room_ids | obj | 直播间信息 | | + +`data`中的`by_room_ids`对象: + +以直播间长ID为键, 直播间信息为值的, 按键名降序排序 + +`by_room_ids`中的值对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| room_id | num | 直播间长ID | | +| uid | num | 主播用户mid | | +| area_id | num | 直播间分区ID | | +| live_status | num | 直播状态 | 0: 未开播<br />1: 直播中<br />2: 轮播中 | +| live_url | str | 直播间网页url | | +| parent_area_id | num | 直播间父分区ID | | +| title | str | 直播间标题 | | +| parent_area_name | str | 直播间父分区名称 | | +| area_name | str | 直播间分区名称 | | +| live_time | str | 开播时间 | `yyyy-MM-dd HH:mm:ss` | +| description | str | 直播间简介 | | +| tags | str | 直播间标签 | 以 `,` 分隔 | +| attention | num | 关注数 | | +| online | num | 在线人数 | | +| short_id | num | 直播间短ID | 为0是无短号 | +| uname | str | 主播用户名 | | +| cover | str | 直播间封面url | | +| background | str | 直播间背景url | | +| join_slide | num | 1 | | +| live_id | num | 0 | | +| live_id_str | str | "0" | | + +**示例:** + +```shell +curl -G 'https://api.live.bilibili.com/xlive/web-room/v1/index/getRoomBaseInfo' \ +--url-query 'req_biz=web_room_componet' \ +--url-query 'room_ids=1' \ +--url-query 'room_ids=3 +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "by_uids": {}, + "by_room_ids": { + "23058": { + "room_id": 23058, + "uid": 11153765, + "area_id": 190, + "live_status": 0, + "live_url": "https://live.bilibili.com/23058", + "parent_area_id": 5, + "title": "哔哩哔哩音悦台", + "parent_area_name": "电台", + "area_name": "唱见电台", + "live_time": "0000-00-00 00:00:00", + "description": "<p>这里是哔哩哔哩官方音乐台喔!</p><p>一起来听音乐吧ε=ε=(ノ≧∇≦)ノ</p><p>没想到蒸汽配圣诞下装,意外的很暴露呢=3=</p>\n", + "tags": "", + "attention": 225431, + "online": 0, + "short_id": 3, + "uname": "3号直播间", + "cover": "", + "background": "https://i0.hdslb.com/bfs/live/2836bb7b84c792e2c6aadfd4d1cce13484775fa3.jpg", + "join_slide": 1, + "live_id": 0, + "live_id_str": "0" + }, + "5440": { + "room_id": 5440, + "uid": 9617619, + "area_id": 701, + "live_status": 2, + "live_url": "https://live.bilibili.com/5440", + "parent_area_id": 11, + "title": "华为nova Flip新生之夜", + "parent_area_name": "知识", + "area_name": "科技·科学", + "live_time": "0000-00-00 00:00:00", + "description": "<p>华为novaFlip新生之夜正在直播中!备案号:Z0910417240818001<br></p>", + "tags": "", + "attention": 17848313, + "online": 0, + "short_id": 1, + "uname": "哔哩哔哩直播", + "cover": "http://i0.hdslb.com/bfs/live/1a862058e4211a5e73a8a1bf0635953ea08a4091.jpg", + "background": "http://i0.hdslb.com/bfs/live/ec518ede15d4c2547c83cb59f14752450c0889b0.jpg", + "join_slide": 1, + "live_id": 0, + "live_id_str": "0" + } + } + } +} +``` + +</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 />-111:csrf校验失败 | +| 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 | 开播时间戳,单位秒,未开播时为0 | | +| 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> + +## 获取直播间最近历史弹幕 + +> https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory + +<!--{ + "from": { + "url": "https://www.bilibili.com/read/cv8186413/" + } +}--> + +*请求方式: GET* + +注: 该接口部分返回信息不明, 仅供参考, 来源 [cv8186413](https://www.bilibili.com/read/cv8186413/) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | ---- | --- | - | - | +| roomid | num | 直播间短ID | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功<br />-400: 请求错误 | +| message | str | 错误信息 | 默认为空 | +| msg | str | 空 | 仅请求成功时存在 | +| ttl | num | 1 | 仅请求失败时存在 | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| admin | array | 管理员最新的10条弹幕消息 | 格式与`room`相同 | +| room | array | 普通用户的10条弹幕信息 | 格式与`admin`相同 | + +`data`中的任意数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| text | str | 弹幕内容 | | +| dm_type | num | 弹幕类型 | | +| uid | num | 弹幕发送者的UID | | +| nickname | str | 弹幕发送者的昵称 | | +| uname_color | str | 弹幕发送者的颜色? | | +| timeline | str | 弹幕发送时间 | 格式为`yyyy-MM-dd HH:mm:ss` | +| isadmin | num | 是否为管理员 | | +| vip | num | 是否为VIP? || +| svip | num | 是否为SVIP? || +| medal | array | 粉丝勋章信息? | 格式不明 | +| title | array | 标题? | 格式不明 | +| user_level | array | 用户等级信息? | 格式不明 | +| rank | num | 排名? | [用户空间详细信息](../user/info.md#获取用户详细信息) | +| teamid | num | | | +| rnd | str | 发送时间? | UNIX 秒级时间戳 | +| user_title | 用户标题? | 格式不明 | +| guard_level | | | | +| bubble | | | | +| bubble_color | | | | +| lpl | | | | +| yeah_space_url | | | | +| jump_to_url | | | | +| check_info | obj | 弹幕审核信息? | | +| voice_dm_info | obj | 语音弹幕信息? | | +| emoticon | obj | 表情信息? | | +| emots | null | | | +| id_str | str | 弹幕ID? | | +| wealth_level | num | 财富等级? | | +| bubble_id_v2 | num | | | +| reply | obj | | | +| group_medal | null | | | +| user | obj | 该用户信息 || + +`data`对象中的`user`对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | --- | --- | +| uid | num | 用户 mid || +| base | obj | 用户基本信息 || +| medal | null | || +| wealth | null | || +| title | obj | 用户标题? || +| guard | null | || +| uhead_frame | null | || +| guard_leader | obj | | | + +`data`对象中的`user`对象中的`base`对象: + +| 字段 | 类型 | 内容 | 备注 | +| - | - | --- | --- | +| name | str | 用户名 || +| face | str | 用户头像 url || +| name_color | num | 用户名颜色? || +| is_mystery | bool | 是否为神秘用户? || +| risk_ctrl_info | null | | | +| origin_info | obj | 原始信息? | | +| official_info | obj | 认证信息 | | +| name_color_str | str | | | + +**示例:** + +```shell +curl -G 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory' \ +--url-query 'roomid=1' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "data": { + "admin": [], + "room": [ + { + "text": "‫", + "dm_type": 0, + "uid": 20276964, + "nickname": "咸菜拉面", + "uname_color": "", + "timeline": "2024-08-15 05:05:06", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [ + 27, + "小孩梓", + "阿梓从小就很可爱", + 80397, + 398668, + "", + 0, + 6809855, + 398668, + 6850801, + 3, + 1, + 7706705 + ], + "title": [ + "title-86-1", + "title-86-1" + ], + "user_level": [ + 59, + 0, + 16752445, + 931 + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723669505", + "user_title": "title-86-1", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723669506, + "ct": "18434F3D" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "74368f428dfaec806cd205e62866bd1c45", + "wealth_level": 37, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 20276964, + "base": { + "name": "咸菜拉面", + "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "咸菜拉面", + "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": { + "name": "小孩梓", + "level": 27, + "color_start": 398668, + "color_end": 6850801, + "color_border": 6809855, + "color": 398668, + "id": 13139, + "typ": 0, + "is_light": 1, + "ruid": 7706705, + "guard_level": 3, + "score": 50112778, + "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", + "honor_icon": "", + "v2_medal_color_start": "#4775EFCC", + "v2_medal_color_end": "#4775EFCC", + "v2_medal_color_border": "#58A1F8FF", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + }, + "wealth": null, + "title": { + "old_title_css_id": "title-86-1", + "title_css_id": "title-86-1" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "‫", + "dm_type": 0, + "uid": 20276964, + "nickname": "咸菜拉面", + "uname_color": "", + "timeline": "2024-08-16 05:05:06", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [ + 27, + "小孩梓", + "阿梓从小就很可爱", + 80397, + 398668, + "", + 0, + 6809855, + 398668, + 6850801, + 3, + 1, + 7706705 + ], + "title": [ + "title-86-1", + "title-86-1" + ], + "user_level": [ + 59, + 0, + 16752445, + 931 + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723755905", + "user_title": "title-86-1", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723755906, + "ct": "F65D229F" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "7f3bb90826ad642012a31368f266be6d2", + "wealth_level": 37, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 20276964, + "base": { + "name": "咸菜拉面", + "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "咸菜拉面", + "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": { + "name": "小孩梓", + "level": 27, + "color_start": 398668, + "color_end": 6850801, + "color_border": 6809855, + "color": 398668, + "id": 13139, + "typ": 0, + "is_light": 1, + "ruid": 7706705, + "guard_level": 3, + "score": 50112778, + "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", + "honor_icon": "", + "v2_medal_color_start": "#4775EFCC", + "v2_medal_color_end": "#4775EFCC", + "v2_medal_color_border": "#58A1F8FF", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + }, + "wealth": null, + "title": { + "old_title_css_id": "title-86-1", + "title_css_id": "title-86-1" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "好帅", + "dm_type": 0, + "uid": 3546708493469870, + "nickname": "aodun1", + "uname_color": "", + "timeline": "2024-08-16 22:33:28", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [], + "title": [ + "", + "" + ], + "user_level": [ + 0, + 0, + 9868950, + ">50000" + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723811729", + "user_title": "", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723818808, + "ct": "1B75FB" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "088336a59eb277942ee353dd6666bf6347", + "wealth_level": 0, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 3546708493469870, + "base": { + "name": "aodun1", + "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "aodun1", + "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": null, + "wealth": null, + "title": { + "old_title_css_id": "", + "title_css_id": "" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "好帅", + "dm_type": 0, + "uid": 3546708493469870, + "nickname": "aodun1", + "uname_color": "", + "timeline": "2024-08-16 22:35:16", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [], + "title": [ + "", + "" + ], + "user_level": [ + 0, + 0, + 9868950, + ">50000" + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723811729", + "user_title": "", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723818916, + "ct": "D6ABF2E7" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "6f421255746f5d8e4731fdadac66bf6356", + "wealth_level": 0, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 3546708493469870, + "base": { + "name": "aodun1", + "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "aodun1", + "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": null, + "wealth": null, + "title": { + "old_title_css_id": "", + "title_css_id": "" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "好帅", + "dm_type": 0, + "uid": 3546708493469870, + "nickname": "aodun1", + "uname_color": "", + "timeline": "2024-08-16 22:36:51", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [], + "title": [ + "", + "" + ], + "user_level": [ + 0, + 0, + 9868950, + ">50000" + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723811729", + "user_title": "", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723819011, + "ct": "1B6978C1" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "270f5a2ac69c5904617873cc4666bf640", + "wealth_level": 0, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 3546708493469870, + "base": { + "name": "aodun1", + "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "aodun1", + "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": null, + "wealth": null, + "title": { + "old_title_css_id": "", + "title_css_id": "" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "好帅", + "dm_type": 0, + "uid": 3546708493469870, + "nickname": "aodun1", + "uname_color": "", + "timeline": "2024-08-16 22:39:01", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [], + "title": [ + "", + "" + ], + "user_level": [ + 0, + 0, + 9868950, + ">50000" + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723811729", + "user_title": "", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723819141, + "ct": "143613AF" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "002ebbdc402b3d625052865f7b66bf6469", + "wealth_level": 0, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 3546708493469870, + "base": { + "name": "aodun1", + "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "aodun1", + "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": null, + "wealth": null, + "title": { + "old_title_css_id": "", + "title_css_id": "" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "赚麻了 哈哈", + "dm_type": 0, + "uid": 243082910, + "nickname": "可人的樱花", + "uname_color": "", + "timeline": "2024-08-17 01:00:49", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [], + "title": [ + "", + "" + ], + "user_level": [ + 0, + 0, + 9868950, + ">50000" + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723379161", + "user_title": "", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723827649, + "ct": "3917D4D7" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "03f3261e144366383c49c6b5d166bf8563", + "wealth_level": 7, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 243082910, + "base": { + "name": "可人的樱花", + "face": "http://i2.hdslb.com/bfs/face/5faa9bef952f831236b740932c559476658f88e5.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "可人的樱花", + "face": "http://i2.hdslb.com/bfs/face/5faa9bef952f831236b740932c559476658f88e5.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": null, + "wealth": null, + "title": { + "old_title_css_id": "", + "title_css_id": "" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "‫", + "dm_type": 0, + "uid": 20276964, + "nickname": "咸菜拉面", + "uname_color": "", + "timeline": "2024-08-17 05:05:07", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [ + 27, + "小孩梓", + "阿梓从小就很可爱", + 80397, + 398668, + "", + 0, + 6809855, + 398668, + 6850801, + 3, + 1, + 7706705 + ], + "title": [ + "title-86-1", + "title-86-1" + ], + "user_level": [ + 59, + 0, + 16752445, + 931 + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723842307", + "user_title": "title-86-1", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723842307, + "ct": "8B947ABC" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "1a928b968afaa7825ea506ffe566bfbf16", + "wealth_level": 37, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 20276964, + "base": { + "name": "咸菜拉面", + "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "咸菜拉面", + "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": { + "name": "小孩梓", + "level": 27, + "color_start": 398668, + "color_end": 6850801, + "color_border": 6809855, + "color": 398668, + "id": 13139, + "typ": 0, + "is_light": 1, + "ruid": 7706705, + "guard_level": 3, + "score": 50112778, + "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", + "honor_icon": "", + "v2_medal_color_start": "#4775EFCC", + "v2_medal_color_end": "#4775EFCC", + "v2_medal_color_border": "#58A1F8FF", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + }, + "wealth": null, + "title": { + "old_title_css_id": "title-86-1", + "title_css_id": "title-86-1" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "下播啦~ 感谢大家的陪伴~ 下次见哦~", + "dm_type": 0, + "uid": 3546614675278489, + "nickname": "机器人管家_鱼", + "uname_color": "", + "timeline": "2024-08-18 00:07:36", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [ + 21, + "赴神明", + "Mr_钟明", + 27751673, + 1725515, + "", + 0, + 12632256, + 12632256, + 12632256, + 0, + 0, + 3493291261692485 + ], + "title": [ + "", + "" + ], + "user_level": [ + 11, + 0, + 6406234, + ">50000" + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723910862", + "user_title": "", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723910856, + "ct": "9BD05026" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "2ee6101973eeb69931eb86ac7e66c0ca17", + "wealth_level": 23, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 3546614675278489, + "base": { + "name": "机器人管家_鱼", + "face": "https://i1.hdslb.com/bfs/face/de737cd746a96742c07ced6c213aa25cf0429d90.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "机器人管家_鱼", + "face": "https://i1.hdslb.com/bfs/face/de737cd746a96742c07ced6c213aa25cf0429d90.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": { + "name": "赴神明", + "level": 21, + "color_start": 12632256, + "color_end": 12632256, + "color_border": 12632256, + "color": 1725515, + "id": 1231122, + "typ": 0, + "is_light": 0, + "ruid": 3493291261692485, + "guard_level": 0, + "score": 50001573, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#919298CC", + "v2_medal_color_end": "#919298CC", + "v2_medal_color_border": "#919298CC", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#6C6C7299", + "user_receive_count": 0 + }, + "wealth": null, + "title": { + "old_title_css_id": "", + "title_css_id": "" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + }, + { + "text": "‫", + "dm_type": 0, + "uid": 20276964, + "nickname": "咸菜拉面", + "uname_color": "", + "timeline": "2024-08-18 05:05:05", + "isadmin": 0, + "vip": 0, + "svip": 0, + "medal": [ + 27, + "小孩梓", + "阿梓从小就很可爱", + 80397, + 398668, + "", + 0, + 6809855, + 398668, + 6850801, + 3, + 1, + 7706705 + ], + "title": [ + "title-86-1", + "title-86-1" + ], + "user_level": [ + 59, + 0, + 16752445, + 931 + ], + "rank": 10000, + "teamid": 0, + "rnd": "1723928706", + "user_title": "title-86-1", + "guard_level": 0, + "bubble": 0, + "bubble_color": "", + "lpl": 0, + "yeah_space_url": "", + "jump_to_url": "", + "check_info": { + "ts": 1723928705, + "ct": "8A379FF4" + }, + "voice_dm_info": { + "voice_url": "", + "file_format": "", + "text": "", + "file_duration": 0, + "file_id": "" + }, + "emoticon": { + "id": 0, + "emoticon_unique": "", + "text": "", + "perm": 0, + "url": "", + "in_player_area": 0, + "bulge_display": 0, + "is_dynamic": 0, + "height": 0, + "width": 0 + }, + "emots": null, + "id_str": "41e8b55dea381d494cfe60ba3466c11064", + "wealth_level": 37, + "bubble_id_v2": 0, + "reply": { + "show_reply": true, + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false + }, + "group_medal": null, + "user": { + "uid": 20276964, + "base": { + "name": "咸菜拉面", + "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg", + "name_color": 0, + "is_mystery": false, + "risk_ctrl_info": null, + "origin_info": { + "name": "咸菜拉面", + "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg" + }, + "official_info": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "name_color_str": "" + }, + "medal": { + "name": "小孩梓", + "level": 27, + "color_start": 398668, + "color_end": 6850801, + "color_border": 6809855, + "color": 398668, + "id": 13139, + "typ": 0, + "is_light": 1, + "ruid": 7706705, + "guard_level": 3, + "score": 50112778, + "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", + "honor_icon": "", + "v2_medal_color_start": "#4775EFCC", + "v2_medal_color_end": "#4775EFCC", + "v2_medal_color_border": "#58A1F8FF", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + }, + "wealth": null, + "title": { + "old_title_css_id": "title-86-1", + "title_css_id": "title-86-1" + }, + "guard": null, + "uhead_frame": null, + "guard_leader": { + "is_guard_leader": false + } + } + } + ] + }, + "message": "", + "msg": "" +} +``` + +</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 | 直播协议 | 必要 | 0:http_stream<br/>1:http_hls<br/>可多选, 使用英文逗号分隔 | +| format | str | 格式 | 必要 | 0:flv<br/>1:ts<br/>2:fmp4<br/>可多选, 使用英文逗号分隔 | +| codec | str | 编码格式 | 必要 | 0:AVC<br/>1:HEVC<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> + + + + + +## 获取直播间主播信息 + +> https://api.live.bilibili.com/live_user/v1/UserInfo/get_anchor_in_room + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|---------|-----|------|-----|-------| +| roomid | num | 直播间号 | 必要 | 可以为短号 | + + +**json回复:** + + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|-----------------| +| code | num | 返回值 | 0:成功 (直播间不存在也为0) | +| message | str | 错误信息 | | +| msg | str | 错误信息 | | +| data | obj | 信息本体 | | + + + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------------------|-----------|--------|-----------------------------| +| info | obj | 主播信息 | | +| level | obj | 直播等级 | | +| san | num | 主播san值 | 12满分 | + + +`info`对象: + + +| 字段 | 类型 | 内容 | 备注 | +|-------------------|------|------------------|----------| +| uid | num | 主播mid | | +| uname | str | 主播用户名 | | +| face | str | 主播头像URL | | +| rank | str | 主播排名 | | +| platform_user_level | num | 平台用户等级 | | +| mobile_verify | num | 手机验证状态 | | +| identification | num | 身份认证状态 | | +| official_verify | obj | 认证信息 | | +| vip_type | num | VIP类型 | | +| gender | num | 主播性别 | -1:保密<br />0:女<br />1:男 | + + +`info`中的`official_verify`对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|------|----------|-----| +| type | num | 主播认证类型 | -1:无<br />0:个人认证<br />1:机构认证 | +| desc | str | 主播认证信息 | | +| role | num | 未知 | | + +`level`对象: + + + +| 字段 | 类型 | 内容 | 备注 | +|--------------|------|------------------|----------| +| uid | num | 用户ID | | +| cost | num | 消费金额 | | +| rcost | num | 充值金额 | | +| user_score | str | 用户积分 | | +| vip | num | VIP状态 | | +| vip_time | str | VIP到期时间 | | +| svip | num | SVIP状态 | | +| svip_time | str | SVIP到期时间 | | +| update_time | str | 更新时间 | | +| master_level | obj | 主播等级 | | +| user_level | num | 用户等级 | | +| color | num | 颜色值 | | +| anchor_score | num | 主播积分 | | + + + +`level` 中的 `master_level`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------------|------|------------------|----------| +| level | num | 主播等级 | | +| color | num | 颜色值 | | +| current | list | 当前积分 | | +| next | list | 下一等级积分 | | +| anchor_score | num | 主播积分 | | +| upgrade_score | num | 升级积分 | | +| master_level_color | num | 主播等级颜色值 | | +| sort | str | 排名 | | + + +**示例:** + +查询`roomid=1`的直播间主播信息 + +```shell +curl -G 'https://api.live.bilibili.com/live_user/v1/UserInfo/get_anchor_in_room' \ +--data-urlencode 'roomid=1' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "msg": "success", + "message": "success", + "data": { + "info": { + "uid": 9617619, + "uname": "哔哩哔哩直播", + "face": "https://i0.hdslb.com/bfs/face/8f6a614a48a3813d90da7a11894ae56a59396fcd.jpg", + "rank": "10000", + "platform_user_level": 6, + "mobile_verify": 1, + "identification": 1, + "official_verify": { + "type": 1, + "desc": "哔哩哔哩直播官方账号", + "role": 3 + }, + "vip_type": 2, + "gender": -1 + }, + "level": { + "uid": 9617619, + "cost": 7782673656, + "rcost": 20199200291, + "user_score": "0", + "vip": 0, + "vip_time": "0000-00-00 00:00:00", + "svip": 0, + "svip_time": "0000-00-00 00:00:00", + "update_time": "2024-08-08 17:13:12", + "master_level": { + "level": 40, + "color": 16746162, + "current": [0, 147013810], + "next": [0, 147013810], + "anchor_score": 201992002, + "upgrade_score": 0, + "master_level_color": 16746162, + "sort": "\u003E10000" + }, + "user_level": 60, + "color": 16752445, + "anchor_score": 201992002 + }, + "san": 12 + } +} +``` + +</details> diff --git a/live/live_area.md b/docs/live/live_area.md similarity index 97% rename from live/live_area.md rename to docs/live/live_area.md index 4b4cee1..4f86ef9 100644 --- a/live/live_area.md +++ b/docs/live/live_area.md @@ -1,12 +1,8 @@ # 直播间分区 -- [获取全部直播间分区列表](#获取全部直播间分区列表) - ---- - ## 获取全部直播间分区列表 -> http://api.live.bilibili.com/room/v1/Area/getList +> https://api.live.bilibili.com/room/v1/Area/getList *请求方式:GET* @@ -68,7 +64,7 @@ 如想在`网游`父分区下的`英雄联盟`分区开播,则查到子分区id为`86` ```shell -curl 'http://api.live.bilibili.com/room/v1/Area/getList' +curl 'https://api.live.bilibili.com/room/v1/Area/getList' ``` <details> diff --git a/live/live_stream.md b/docs/live/live_stream.md similarity index 95% rename from live/live_stream.md rename to docs/live/live_stream.md index 584f61b..7b8a50c 100644 --- a/live/live_stream.md +++ b/docs/live/live_stream.md @@ -1,12 +1,8 @@ # 直播间视频流 -- [根据真实直播间号获取直播视频流](#根据真实直播间号获取直播视频流) - ---- - ## 根据真实直播间号获取直播视频流 -> http://api.live.bilibili.com/room/v1/Room/playUrl +> https://api.live.bilibili.com/room/v1/Room/playUrl *请求方式:GET* @@ -17,7 +13,7 @@ | cid | num | 目标真实直播间号 | 必要 | 直播间的`room_id`(非短号) | | platform | str | 直播流格式 | 非必要 | h5:hls方式<br />web:http-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:原画 | +| qn | str | 画质 | 非必要 | `qn`与`quality`任选其一<br />80:流畅<br />150:高清<br />400:蓝光<br />10000:原画<br />20000:4K<br />30000:杜比 | **json回复:** @@ -87,7 +83,7 @@ 查询直播间`cid=14073662`的直播间信息 ```shell -curl -G 'http://api.live.bilibili.com/room/v1/Room/playUrl' \ +curl -G 'https://api.live.bilibili.com/room/v1/Room/playUrl' \ --data-urlencode 'cid=14073662' \ --data-urlencode 'qn=10000' \ --data-urlencode 'platform=web' @@ -157,4 +153,4 @@ curl -G 'http://api.live.bilibili.com/room/v1/Room/playUrl' \ } ``` -</details> \ No newline at end of file +</details> diff --git a/docs/live/manage.md b/docs/live/manage.md new file mode 100644 index 0000000..8150b28 --- /dev/null +++ b/docs/live/manage.md @@ -0,0 +1,541 @@ +# 直播间管理 + +## 开通直播间 + +> https://api.live.bilibili.com/xlive/app-blink/v1/preLive/CreateRoom + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 + +**正文参数( application/x-www-form-urlencoded ):** +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ------------------------ | ------ | -------------------- | +| platform | str | 客户端? | 必要 | 默认值web | +| visit_id | str | 未知 | | 默认空 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| csrf_token | str | CSRF Token(位于 cookie) | | | + + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | -------- | ------------------------------------------------------ | +| code | num | 返回值 | 0:成功<br />1531193016:已经创建直播间~<br />-400:请求错误 | +| ttl | str | 错误信息 | 默认为1 | +| message | str | 错误信息 | 默认为0 | +| data | array | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | ---------------- | ---------------------- | +| roomID | str | 直播间房间号 | 创建成功返回直播间号 | + +**示例:** + +开通直播间 + +```shell +curl 'https://api.live.bilibili.com/xlive/app-blink/v1/preLive/CreateRoom' \ +--data-urlencode 'platform=web' \ +--data-urlencode 'visit_id=' \ +--data-urlencode 'csrf=xxx' \ +--data-urlencode 'csrf_token=xxx' \ +-b 'SESSDATA=xxx;bili_jct=xx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "roomID": "1234" + } +} +``` + +```json +{ + "code": 1531193016, + "message": "已经创建直播间~", + "ttl": 1, + "data": { + "roomID": "" + } +} +``` + +</details> + + + +## 更新直播间信息 + +> https://api.live.bilibili.com/room/v1/Room/update + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ------------------------ | ------ | -------------------- | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| csrf_token | str | CSRF Token(位于 cookie) | 非必要 | | +| platform | str | 平台标识 | 非必要 | | +| visit_id | str | (?) | 非必要 | 某种标识? | +| room_id | num | 直播间id | 必要 | 必须为自己的直播间id | +| title | str | 直播间标题 | 非必要 | 上限40个字符 | +| area\_id | num | 直播分区id(子分区id) | 非必要 | 详见[直播分区](live_area.md) | +| add\_tag | str | 要添加的标签 | 非必要 | 开播设置界面上限10个字符 | +| del\_tag | str | 要删除的标签 | 非必要 | 若存在`add_tag`时不起作用 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | -------- | ------------------------------------------------------ | +| code | num | 返回值 | 0:成功<br />-1:操作太频繁<br />1:错误<br />3:未登录或鉴权失败<br />405:不允许的请求方法<br />60009:分区已下线<br />65530:token错误(登录错误)<br /> | +| msg | str | 错误信息 | 默认为ok | +| message | str | 错误信息 | 默认为ok | +| data | obj | 信息本体 | 部分失败情况下是`[]`(空数组) | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | ---- | ---- | +| sub_session_key | str | 信息变动标识 | | +| audit_info | obj | 标题审核信息 | | + +`data`中的`audit_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------ | ---- | ---- | ---- | +| audit_title_reason | str | 标题审核提示 | | +| audit_title_status | num | 标题审核状态 | | +| audit_title | str | 被审核的标题 | 更新标题时存在 | +| update_title | str | `""` | 作用尚不明确 | + +**示例:** + +修改直播间`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":{ + "sub_session_key":"", + "audit_info":{ + "audit_title_reason":"先发后审", + "update_title":"", + "audit_title_status":2, + "audit_title":"测试" + } + } +} +``` + +</details> + +修改直播间`10352053`分区为`40` + +```shell +curl 'https://api.live.bilibili.com/room/v1/Room/update' \ + --data-urlencode 'room_id=10352053' \ + --data-urlencode 'area_id=40' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx;bili_jct=xx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "msg": "ok", + "message": "ok", + "data": { + "sub_session_key": "", + "audit_info": { + "audit_title_reason": "", + "update_title": "", + "audit_title_status": 0 + } + } +} +``` + +</details> + +给直播间`11996900`添加一个标签为`测试标签` + +```shell +curl 'https://api.live.bilibili.com/room/v1/Room/update' \ + --data-urlencode 'room_id=11996900' \ + --data-urlencode 'add_tag=测试标签' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx;bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "msg": "ok", + "message": "ok", + "data": { + "sub_session_key": "", + "audit_info": { + "audit_title_reason": "", + "update_title": "", + "audit_title_status": 0 + } + } +} +``` + +</details> + +给直播间`11996900`删除内容为`测试标签`的标签 + +```shell +curl 'https://api.live.bilibili.com/room/v1/Room/update' \ + --data-urlencode 'room_id=11996900' \ + --data-urlencode 'del_tag=测试标签' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx;bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "msg": "ok", + "message": "ok", + "data": { + "sub_session_key": "", + "audit_info": { + "audit_title_reason": "", + "update_title": "", + "audit_title_status": 0 + } + } +} +``` + +</details> + +## 开始直播 + +> https://api.live.bilibili.com/room/v1/Room/startLive + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 + +开播时必须有分区选择,开播后返回推流地址 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ------------------------ | ------ | ----------------------------------- | +| room_id | num | 直播间id | 必要 | 必须为自己的直播间id | +| area_v2 | num | 直播分区id(子分区id) | 必要 | 详见[直播分区](live_area.md) | +| platform | str | 直播平台 | 必要 | 直播姬(pc):pc_link<br />web在线直播:web_link<br />bililink:android_link | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功<br />65530:token错误(登录错误)<br />1:错误<br />60009:分区不存在<br />60024: 目标分区需要人脸认证<br />60013:非常抱歉,您所在的地区受实名认证限制无法开播<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 | 标记直播场次的key | | +| sub_session_key | str | 信息变动标识 | | +| notice | obj | ??? | 作用尚不明确 | +| qr | str | `""` | 作用尚不明确 | +| need_face_auth | bool | 需要人脸识别? | 作用尚不明确 | +| service_source | str | ??? | 作用尚不明确 | +| rtmp\_backup | null | ??? | 作用尚不明确 | +| up_stream_extra | 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 | 空 | 作用尚不明确 | + +`data`中的`up_stream_extra`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| isp | 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, + "data":{ + "change": 1, + "status": "LIVE", + "try_time": "0000-00-00 00:00:00", + "room_type": 0, + "live_key": "608336837537435443", + "sub_session_key": "608336837537435443sub_time:1747292297", + "rtmp":{ + "type": 1, + "addr": "rtmp://live-push.bilivideo.com/live-bvc/", + "code": "?streamname=live_348892132_32373699\u0026key=e03061d4a7529d8eaa322dc4d330ca1c\u0026schedule=rtmp\u0026pflag=11", + "new_link": "https://core.bilivideo.com/video/uplinkcore/selfbuild/schedule?up_rtmp=live-push.bilivideo.com%2Flive-bvc%2F%3Fstreamname%3Dlive_348892132_32373699%26key%3De73061d8a7539d8eaa233dc4d880ca1c%26schedule%3Drtmp%26pflag%3D11\u0026edge=edge", + "provider": "live" + }, + "protocols":[ + { + "protocol": "rtmp", + "addr": "rtmp://live-push.bilivideo.com/live-bvc/","code":"?streamname=live_348892132_32373699\u0026key=e73061d4a1002d8eaa322dc4d880ca1c\u0026schedule=rtmp\u0026pflag=11", + "new_link": "https://core.bilivideo.com/video/uplinkcore/selfbuild/schedule?up_rtmp=live-push.bilivideo.com%2Flive-bvc%2F%3Fstreamname%3Dlive_348892132_32373699%26key%3De10298d4a7539d8eaa322dc4d220ca1c%26schedule%3Drtmp%26pflag%3D11\u0026edge=edge", + "provider": "txy" + } + ], + "notice":{ + "type": 1, + "status": 0, + "title": "", + "msg": "", + "button_text": "", + "button_url": "" + }, + "qr": "", + "need_face_auth": false, + "service_source": "live-streaming", + "rtmp_backup": null, + "up_stream_extra":{ + "isp": "电信" + } + }, + "message": "", + "msg": "" +} +``` + +</details> + +## 关闭直播 + +> https://api.live.bilibili.com/room/v1/Room/stopLive + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ------------------------ | ------ | -------------------- | +| room_id | num | 直播间id | 必要 | 必须为自己的直播间id | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功<br />65530:token错误(登录错误)<br />-400:没有权限<br />**(其他错误码有待补充)** | +| msg | str | 错误信息 | 默认为空 | +| message | str | 错误信息 | 默认为空 | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ------------ | ---------------------- | +| change | num | 是否改变状态 | 0:未改变<br />1:改变 | +| status | str | 直播间状态 | `PREPARING`、`ROUND` | + +**示例:** + +关闭直播间`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> + + +## 更新直播间公告 + +> https://api.live.bilibili.com/xlive/app-blink/v1/index/updateRoomNews + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ------------------------ | ------ | --------------------- | +| room_id | num | 直播间id | 必要 | 必须为自己的直播间id | +| uid | num | 用户id | 必要 | | +| content | str | 公告内容 | 必要 | 最大60个字符,可以为空 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| csrf_token | str | CSRF Token(位于 cookie) | | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----- | -------- | ------------------------------------------------------ | +| code | num | 返回值 | 0:成功<br />65530:token错误(登录错误)<br />1:错误 | +| data | array | 空 | | +| message | str | 错误信息 | 默认为ok | +| ttl | num | 1 | 作用尚不明确 | + +**示例:** + +修改直播间`11996900`公告为`测试修改公告` + +```shell +curl 'https://api.live.bilibili.com/xlive/app-blink/v1/index/updateRoomNews' \ +--data-urlencode 'room_id=11996900' \ +--data-urlencode 'uid=306903238' \ +--data-urlencode 'content=测试修改公告' \ +--data-urlencode 'csrf_token=xxx' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx;bili_jct=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": {} +} +``` + +</details> diff --git a/docs/live/message_stream.md b/docs/live/message_stream.md new file mode 100644 index 0000000..7d106df --- /dev/null +++ b/docs/live/message_stream.md @@ -0,0 +1,4792 @@ +# 直播间信息流 + +## 获取信息流认证秘钥 + +> https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo + +*请求方法: GET* + +认证方式: Cookie(SESSDATA) + +可以选择进行认证,若未认证视作未登录,将会受到限制,详见后续内容。 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------ | ------ | ---- | +| id | num | 直播间真实id | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0: 成功<br />65530: token 错误 (登录错误)<br />1: 错误<br />60009: 分区不存在<br />**(其他错误码有待补充)** | +| message | str | 错误信息 | 默认为空 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------ | ----- | -------------------- | ---- | +| group | str | live | | +| business_id | num | 0 | | +| refresh_row_factor | num | 0.125 | | +| refresh_rate | num | 100 | | +| max_delay | num | 5000 | | +| token | str | 认证秘钥 | | +| host_list | array | 信息流服务器节点列表 | | + +`data.host_list[n]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ---------- | ---- | +| host | str | 服务器域名 | | +| port | num | TCP 端口 | | +| wss_port | num | WSS 端口 | | +| ws_port | num | WS 端口 | | + +**示例:** + +获得直播间 `14047` 的信息流认证秘钥 + +```shell +curl -G 'https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo' \ +--url-query 'id=14047' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "group": "live", + "business_id": 0, + "refresh_row_factor": 0.125, + "refresh_rate": 100, + "max_delay": 5000, + "token": "IFfrzJxUd-K6mBPLGCpu-Z9QAz1V3KzIxde_-tCzvah05fYgfXjBWyuqRywF8Ov2w-MGQWt7l80pLiZEsfx3OPEDsXSRaJlzihV0hTXYwkiJvRmzMH3JjfAjdzlvI8sytUCrIbezBgbr_grGPd4ENTEknvu165L-ocW_cyql1e-L_EE=", + "host_list": [ + { + "host": "hw-sg-live-comet-02.chat.bilibili.com", + "port": 2243, + "wss_port": 443, + "ws_port": 2244 + }, + { + "host": "hw-sg-live-comet-01.chat.bilibili.com", + "port": 2243, + "wss_port": 443, + "ws_port": 2244 + }, + { + "host": "broadcastlv.chat.bilibili.com", + "port": 2243, + "wss_port": 443, + "ws_port": 2244 + } + ] + } +} +``` + +</details> + +## 数据包格式 + +数据包为 MQ (Message Queue, 消息队列) 使用 WebSocket 或 TCP 连接作为通道, 具体格式为 头部数据 + 正文数据 + +**注: 特别的**, WS 与 WSS 连接地址带有路径 `/sub`, 如 `wss://broadcastlv.chat.bilibili.com:443/sub`. + +**再注:** B 站更新了隐私政策, 连接建立后, 若该连接认证时传入信息来自未登录用户, 会提示 `为保护用户隐私,未注册登陆用户将无法查看他人昵称`, 随后部分数据包(如“弹幕”、“进场或关注消息”)的用户 mid 都为 `0`, 用户名部分也使用 `*` 保护, 部分房间受到豁免, 参见 [#732](https://github.com/SocialSisterYi/bilibili-API-collect/issues/732) + +操作流程 (伪代码): + +```javascript +const s = new Socket(uri); +// 认证包 +s.send('verify_hello'); +s.receive('verfiy_reply'); +// 心跳包 +setInterval(() => { + s.send('heartbeat'); + s.receive('heartbeat_reply'); +}, 30000); +// 接收普通包 +while (!s.isclosed()) { + s.receive('normal_package'); +} +``` + +头部格式: + +| 偏移量 | 长度 | 类型 | 含义 | +| ------ | ---- | ------ | ------------------------------------ | +| 0 | 4 | uint32 | 封包总大小 (头部大小 + 正文大小) | +| 4 | 2 | uint16 | 头部大小 (一般为 0x0010, 即 16 字节) | +| 6 | 2 | uint16 | 协议版本:<br />0: 普通包 (正文不使用压缩)<br />1: 心跳及认证包 (正文不使用压缩)<br />2: 普通包 (正文使用 zlib 压缩)<br/>3: 普通包 (使用 brotli 压缩的多个带文件头的普通包) | +| 8 | 4 | uint32 | 操作码 (封包类型) | +| 12 | 4 | uint32 | sequence, 每次发包时向上递增 | + +操作码: + +| 代码 | 含义 | +| ---- | ------------------- | +| 2 | 心跳包 | +| 3 | 心跳包回复 (人气值) | +| 5 | 普通包 (命令) | +| 7 | 认证包 | +| 8 | 认证包回复 | + +*普通包可能包含多条命令, 每个命令有一个头部, 指示该条命令的长度等信息* + +## 数据包 + +### 认证包 + +*方向: 上行* + +注: 连接成功后 5 秒内发送, 否则强制断开连接 + +再注: 若`uid`字段填写的是用户mid,则通过`获取信息流认证密钥`接口使用的认证信息所属用户mid必须与`uid`字段相同,并正确传递认证密钥,否则强制断开连接。 + +**JSON正文:** + +根对象: + +| 字段 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ------------ | ------ | --------------------------- | +| uid | num | 用户mid | 非必要 | 0 即为游客登录 | +| roomid | num | 加入房间的id | 必要 | 直播间真实id | +| protover | num | 协议版本 | 非必要 | 3, 与数据包头部协议版本无关 | +| platform | str | 平台标识 | 非必要 | `web` | +| type | num | 2 | 非必要 | | +| key | str | 认证秘钥 | 非必要 | | + +**示例:** + +```text +00000000: 0000 00ff 0010 0001 0000 0007 0000 0001 ................ +00000001: 7b22 7569 6422 3a31 3630 3134 3836 3234 {"uid":160148624 +00000002: 2c22 726f 6f6d 6964 223a 3232 3630 3831 ,"roomid":226081 +00000003: 3132 2c22 7072 6f74 6f76 6572 223a 332c 12,"protover":3, +00000004: 2270 6c61 7466 6f72 6d22 3a22 7765 6222 "platform":"web" +00000005: 2c22 7479 7065 223a 322c 226b 6579 223a ,"type":2,"key": +00000006: 2230 7670 5448 5737 7757 556e 6c6f 5270 "0vpTHW7wWUnloRp +00000007: 5251 6b47 764e 626e 7776 7364 6d2d 7159 RQkGvNbnwvsdm-qY +00000008: 4777 4243 5875 2d59 5164 6e57 7653 5547 GwBCXu-YQdnWvSUG +00000009: 7373 4139 7962 4b68 7932 6a78 3952 6f63 ssA9ybKhy2jx9Roc +0000000a: 4150 4651 6d54 4f6b 5277 6b4b 687a 4479 APFQmTOkRwkKhzDy +0000000b: 4839 5054 756f 5468 6834 4630 7562 584c H9PTuoThh4F0ubXL +0000000c: 4964 6e69 3734 5539 304b 4242 6972 3248 Idni74U90KBBir2H +0000000d: 7451 3941 3777 674b 3438 4b7a 495f 5a5a tQ9A7wgK48KzI_ZZ +0000000e: 3838 7557 4e59 6652 4f48 6964 4e6a 3732 88uWNYfROHidNj72 +0000000f: 7061 796e 3479 3071 4268 513d 3d22 7d payn4y0qBhQ=="} +``` + +### 认证包回复 + +*方向: 下行* + +注: 在认证包发送成功后就会收到 JSON 正文, 若失败则返回 HTTP/0.9 的 403 + +**JSON正文:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | ----------- | +| code | num | 返回值 | 0: 认证成功 | + +**示例:** + +```text +00000000: 0000 001a 0010 0001 0000 0008 0000 0001 ................ +00000001: 7b22 636f 6465 223a 307d {"code":0} +``` + +### 心跳包 + +*方向: 上行* + +注: 30 秒左右发送一次, 否则 60 秒后会被强制断开连接 + +**正文:** + +可以为空或任意字符 + +**示例:** + +```text +00000000: 0000 001f 0010 0001 0000 0002 0000 0001 ................ +00000001: 5b6f 626a 6563 7420 4f62 6a65 6374 5d [object Object] +``` + +### 心跳包回复 (人气值) + +*方向: 下行* + +注: 在心跳包发送成功后就会收到 + +**正文:** + +正文分为两个部分 + +- 第一部分: uint32 整数代表的房间当前的人气值 + +- 第二部分: 心跳包正文内容 + +**示例:** + +示例房间内人气值为 2466 (0x000009a2) + +```text +00000000: 0000 0014 0010 0001 0000 0003 0000 0000 ................ +00000001: 0000 09a2 5b6f 626a 6563 7420 4f62 6a65 ....[object Obje +00000002: 6374 5d ct] +``` + +### 普通包 + +*方向: 下行* + +**正文:** + +一般为普通 JSON 数据 + +大多数普通包都经过 zlib 或 brotli 压缩 + +**示例:** + +```text +00000000: 0000 0086 0010 0003 0000 0005 0000 0000 ................ +00000001: 8b38 8000 0000 7200 1000 0000 0000 0500 .8....r......... +00000002: 0000 007b 2263 6d64 223a 2257 4154 4348 ...{"cmd":"WATCH +00000003: 4544 5f43 4841 4e47 4522 2c22 6461 7461 ED_CHANGE","data +00000004: 223a 7b22 6e75 6d22 3a32 3230 3937 2c22 ":{"num":22097," +00000005: 7465 7874 5f73 6d61 6c6c 223a 2232 2e32 text_small":"2.2 +00000006: e4b8 8722 2c22 7465 7874 5f6c 6172 6765 ...","text_large +00000007: 223a 2232 2e32 e4b8 87e4 baba e79c 8be8 ":"2.2.......... +00000008: bf87 227d 7d03 .."}}. +``` + +<!-- 2 年前的索引, 留作纪念, 不会增加新的内容 + +- [弹幕](#弹幕) +- [进场或关注消息](#进场或关注消息) +- [送礼](#送礼) +- [礼物星球点亮](#礼物星球点亮) +- [礼物连击](#礼物连击) +- [通知消息](#通知消息) +- [主播准备中](#主播准备中) +- [直播开始](#直播开始) +- [主播信息更新](#主播信息更新) +- [直播间高能榜](#直播间高能榜) +- [直播间高能用户数量](#直播间高能用户数量) +- [用户到达直播间高能榜前三名的消息](#用户到达直播间高能榜前三名的消息) +- [直播间用户点赞](#直播间用户点赞) +- [直播间点赞数](#直播间点赞数) +- [直播间发红包弹幕](#直播间发红包弹幕) +- [直播间红包](#直播间红包) +- [直播间抢到红包的用户](#直播间抢到红包的用户) +- [直播间看过人数](#直播间看过人数) +- [用户进场特效](#用户进场特效) +- [直播间在所属分区的排名改变](#直播间在所属分区的排名改变) +- [直播间在所属分区排名提升的祝福](#直播间在所属分区排名提升的祝福) +- [直播间信息更改](#直播间信息更改) +- [醒目留言按钮](#醒目留言按钮) +- [顶部横幅](#顶部横幅) +- [下播的直播间](#下播的直播间) +- [未知消息](#未知消息) + +--> + +#### 弹幕 (DANMU_MSG) + +注: 当收到弹幕时接收到此条消息, 10 进制转 16 进制若位数不足则在左侧补 `0` + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ----- | ----------- | ---- | +| cmd | str | `DANMU_MSG` | | +| dm_v2 | str | 空串? | | +| info | array | 弹幕信息 | 感谢 [#1084](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1084) 补充 | + +`info` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ----- | ------------------ | ---- | +| 0 | array | 弹幕信息 | 大部分信息可从 `info[0][15].extra` 获取 | +| 1 | str | 弹幕文本 | | +| 2 | array | 发送者信息 | 大部分信息可从 `info[0][15].user` 获取 | +| 3 | array | 发送者粉丝勋章信息 | 若无则为空 | +| 4 | array | 发送者UL等级信息 | | +| 5 | array | ? | | +| 6 | num | 0? | | +| 7 | num | 0? | | +| 8 | null | | | +| 9 | obj | 发送时间戳 | | +| 10 | num | 0? | | +| 11 | num | 0? | | +| 12 | null | | | +| 13 | null | | | +| 14 | num | 0? | | +| 15 | num | ? | | +| 16 | array | ? | | + +`info[0]` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ------------------------ | ---- | +| 0 | num | | | +| 1 | num | 弹幕模式 | 弹幕的 mode 字段 | +| 2 | num | 弹幕字体大小 | 弹幕的 fontsize 字段 | +| 3 | num | 弹幕颜色 | 弹幕的 color 字段<br />十六进制颜色值的十进制数字 | +| 4 | num | 发送时的 UNIX 毫秒时间戳 | 弹幕的 rnd 字段 | +| 5 | num | | 一个负整数 | +| 6 | num | 0? | | +| 7 | str | 可能为颜色? | 一个 16 进制数 | +| 8 | num | 0? | | +| 9 | num | 0? | | +| 10 | num | 0? | | +| 11 | str | 空串? | | +| 12 | num | 0? | | +| 13 | str | 字符串表示的 JSON Object | 空? | +| 14 | str | 字符串表示的 JSON Object | 空? | +| 15 | obj | 弹幕补充信息 | | +| 16 | obj | 活动相关信息? | | +| 17 | num | 0? | | +| 18 | null | | | + +`info[0][15]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------- | ---- | ------------ | ---- | +| extra | str | 弹幕信息 | 字符串表示的 JSON | +| mode | num | 弹幕模式? | | +| show_player_type | num | 0? | | +| user | obj | 用户相关信息 | | + +`info[0][15].extra` 表示的对象: + +见下方 JSONC + +```json +{ + "send_from_me": false, // 是否由该接收消息的用户发送 + "mode": 0, // 弹幕模式 (info[0][1]) + "color": 9920249, // 弹幕颜色 (info[0][3]) + "dm_type": 0, + "font_size": 25, // 弹幕字体大小 (info[0][2]) + "player_mode": 1, + "show_player_type": 0, + "content": "白花300块[热]", // 弹幕文本 (info[1]) + "user_hash": "197700816", + "emoticon_unique": "", + "bulge_display": 0, + "recommend_score": 3, + "main_state_dm_color": "", + "objective_state_dm_color": "", + "direction": 0, // 弹幕方向? + "pk_direction": 0, + "quartet_direction": 0, + "anniversary_crowd": 0, + "yeah_space_type": "", + "yeah_space_url": "", + "jump_to_url": "", + "space_type": "", + "space_url": "", + "animation": {}, + "emots": { // 表情相关信息 (用于文本替换) + "[热]": { + "count": 1, + "descript": "[热]", + "emoji": "[热]", + "emoticon_id": 278, + "emoticon_unique": "emoji_278", + "height": 20, + "url": "http://i0.hdslb.com/bfs/live/6df760280b17a6cbac8c1874d357298f982ba4cf.png", + "width": 20 + } + }, + "is_audited": false, + "id_str": "364b06e3c561af3d5921f1253d66c1d575", + "icon": { + "prefix": { + "type": 1, + "resource": "ChronosWealth_4.png" + } + }, + "show_reply": true, // 显示回复? + "reply_mid": 0, + "reply_uname": "", + "reply_uname_color": "", + "reply_is_mystery": false, + "hit_combo": 0 +} +``` + +`info[0][15].user` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ---------- | ---- | +| base | obj | 基本信息 | | +| guard | null | | | +| guard_leader | obj | ? | | +| medal | obj | 粉丝排信息 | 参见 [指定用户的所有粉丝勋章信息](../user/medals.md#指定用户的所有粉丝勋章信息) `data.list[n].uinfo_medal` | +| title | obj | ? | | +| uhead_frame | null | | | +| uid | num | 发送者 mid | | +| wealth | null | | | + +`info[0][15].user.base` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ---- | ---------------- | ------- | +| face | str | 发送者头像 URL | | +| is_mystery | bool | 是否是神秘用户? | | +| name | str | 发送者用户名 | | +| name_color | num | 用户名颜色 | 10 进制 | +| name_color_str | num | 字符串表示的颜色 | | +| offical_info | obj | 认证信息 | 参见 [用户空间详细信息](../user/info.md#用户空间详细信息) `data.official` | +| origin_info | obj | 同 `face` `name` | | +| risk_ctrl_info | null | | | + +`info[0][15].user.title` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------- | ---- | ----- | ---- | +| old_title_css_id | str | 空串? | | +| title_css_id | str | 空串? | | + +`info[0][16]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | ----- | ---- | +| activity_identity | str | 空串? | | +| activity_source | num | 0? | | +| not_show | num | 0? | | + +`info[2]` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ------------- | ---- | +| 0 | num | 发送者 mid | 同 `info[0][15].user.uid` | +| 1 | str | 发送者用户名 | 同 `info[0][15].user.base.name` | +| 2 | num | 0? | | +| 3 | num | 0? | | +| 4 | num | 0? | | +| 5 | num | 用户权限等级? | 参见 [用户空间详细信息](../user/info.md#用户空间详细信息) `data.rank` | +| 6 | num | ? | | + +`info[3]` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ---------------------------------------- | ---- | +| 0 | num | 同 `info[0][15].user.medal.level` | | +| 1 | str | 同 `info[0][15].user.medal.name` | | +| 2 | str | 粉丝牌创建主播名称 | | +| 3 | num | ? | | +| 4 | num | 同 `info[0][15].user.medal.color` | | +| 5 | str | 空串? | | +| 6 | num | 0? | | +| 7 | num | 同 `info[0][15].user.medal.color_border` | | +| 8 | num | 同 `info[0][15].user.medal.color_start` | | +| 9 | num | 同 `info[0][15].user.medal.color_end` | | +| 10 | num | 同 `info[0][15].user.medal.guard_level` | | +| 11 | num | 同 `info[0][15].user.medal.is_light` | | +| 12 | num | 同 `info[0][15].user.medal.ruid` | | + +`info[4]` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ---- | ---- | +| 0 | num | ? | | +| 1 | num | ? | | +| 2 | num | ? | | +| 3 | num | ? | | +| 4 | num | ? | | + +`info[5]` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ----- | ---- | +| 0 | str | 空串? | | +| 1 | str | 空串? | | + +`info[9]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | --------------- | +| ct | str | ? | 16 进制 | +| ts | num | 发送时间 | UNIX 秒级时间戳 | + +`info[16]` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ---- | ---- | +| 0 | num | ? | | + +**示例:** + +<details> +<summary>查看消息示例(带注释):</summary> + +```jsonc +{ + "cmd": "DANMU_MSG", + "dm_v2": "", + "info": [ + [ + 0, + 1, + 25, //字体大小 + 9920249, //弹幕颜色代码(10进制)#975ef9 + 1723979200649, + -1312973962, + 0, + "0bc8acd0", + 0, + 0, + 0, + "", + 0, + "{}", + "{}", + { + "extra": "{\"send_from_me\":false,\"mode\":0,\"color\":9920249,\"dm_type\":0,\"font_size\":25,\"player_mode\":1,\"show_player_type\":0,\"content\":\"白花300块[热]\",\"user_hash\":\"197700816\",\"emoticon_unique\":\"\",\"bulge_display\":0,\"recommend_score\":3,\"main_state_dm_color\":\"\",\"objective_state_dm_color\":\"\",\"direction\":0,\"pk_direction\":0,\"quartet_direction\":0,\"anniversary_crowd\":0,\"yeah_space_type\":\"\",\"yeah_space_url\":\"\",\"jump_to_url\":\"\",\"space_type\":\"\",\"space_url\":\"\",\"animation\":{},\"emots\":{\"[热]\":{\"count\":1,\"descript\":\"[热]\",\"emoji\":\"[热]\",\"emoticon_id\":278,\"emoticon_unique\":\"emoji_278\",\"height\":20,\"url\":\"http://i0.hdslb.com/bfs/live/6df760280b17a6cbac8c1874d357298f982ba4cf.png\",\"width\":20}},\"is_audited\":false,\"id_str\":\"364b06e3c561af3d5921f1253d66c1d575\",\"icon\":{\"prefix\":{\"type\":1,\"resource\":\"ChronosWealth_4.png\"}},\"show_reply\":true,\"reply_mid\":0,\"reply_uname\":\"\",\"reply_uname_color\":\"\",\"reply_is_mystery\":false,\"hit_combo\":0}", + "mode": 0, + "show_player_type": 0, + "user": { + "base": { + "face": "https://i1.hdslb.com/bfs/face/5a9bb9cac3afbb58347c808ae76aaa41ca967d07.jpg", //弹幕发送用户头像 + "is_mystery": false, + "name": "tim1997", //弹幕发送用户名称 + "name_color": 0, + "name_color_str": "", + "official_info": { + "desc": "", + "role": 0, + "title": "", + "type": -1 + }, + "origin_info": { + "face": "https://i1.hdslb.com/bfs/face/5a9bb9cac3afbb58347c808ae76aaa41ca967d07.jpg", + "name": "tim1997" + }, + "risk_ctrl_info": null + }, + "guard": null, + "guard_leader": { + "is_guard_leader": false + }, + "medal": { + "color": 2951253, //粉丝牌颜色(10进制)#2d0855 + "color_border": 16771156, //粉丝牌边框颜色(10进制)#ffe854 + "color_end": 10329087, //粉丝牌渐变颜色结束(10进制)#9d9bff + "color_start": 2951253, //粉丝牌渐变颜色开始(10进制)#2d0855 + "guard_icon": "https://i0.hdslb.com/bfs/live/1d16bf0fcc3b1b768d1179d60f1fdbabe6ab4489.png", //粉丝牌左边的图标 + "guard_level": 1, //类型 1.总督 2.提督 3,舰长 + "honor_icon": "", + "id": 1279130, + "is_light": 1, + "level": 29, //粉丝牌等级 + "name": "果咩吖", //粉丝牌名称 + "ruid": 3546569288714792, //粉丝牌创建者UID + "score": 50427312, + "typ": 0, + "user_receive_count": 0, + "v2_medal_color_border": "#D47AFFFF", //粉丝牌边框颜色(APP) + "v2_medal_color_end": "#9660E5CC", //粉丝牌渐变颜色结束(APP) + "v2_medal_color_level": "#6C00A099", //粉丝牌右边等级数字颜色(APP) + "v2_medal_color_start": "#9660E5CC", //粉丝牌渐变颜色开始(APP) + "v2_medal_color_text": "#FFFFFFFF" //粉丝牌右边圆形颜色(APP) + }, + "title": { + "old_title_css_id": "", + "title_css_id": "" + }, + "uhead_frame": null, + "uid": 6088969, //弹幕发送用户UID + "wealth": null + } + }, + { + "activity_identity": "", + "activity_source": 0, + "not_show": 0 + }, + 0 + ], + "白花300块[热]", //弹幕内容 + [ + 6088969, //同info[0][15].user.uid + "tim1997", //同info[0][15].user.base.name + 0, + 0, + 0, + 10000, + 1, + "" + ], + [ + 29, //同info[0][15].user.medal.level + "果咩吖", //同info[0][15].user.medal.name + "果宝Official", //粉丝牌创建主播名称 + 31180317, + 2951253, //同info[0][15].user.medal.color + "", + 0, + 16771156, //同info[0][15].user.medal.color_border + 2951253, //同info[0][15].user.medal.color_start + 10329087, //同info[0][15].user.medal.color_end + 1, //同info[0][15].user.medal.guard_level + 1, //同info[0][15].user.medal.is_light + 3546569288714792 //同info[0][15].user.medal.ruid + ], + [ + 39, + 0, + 10512625, + 42523, + 2 + ], + [ + "", + "" + ], + 0, + 0, + null, + { + "ct": "AFFF4206", + "ts": 1723979200 //时间戳(秒级) + }, + 0, + 0, + null, + null, + 0, + 1040, + [ + 49 + ], + null + ] +} +``` + +</details> + +#### 交互信息合并 (DM_INTERACTION) + +注: 连续多条相同弹幕时触发 + +**JSON正文:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------------- | ---- | +| cmd | str | `DM_INTERACTION` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | -------- | ---- | +| id | num | 事件 ID | | +| status | num | 状态 | | +| type | num | 事件类型 | 102:弹幕<br />103:<br />104:送礼<br />105:分享<br />106:点赞 | +| data | str | 事件数据 | 一个JSON字符串 | +| dmsource | num | | | + +`data.data` 字符串对象: + +内容格式取决于`data.type`的类型,下面将按照`data.data(类型)`进行区分标记。 + +温馨提示: 要记得先解析`data.data`内的JSON字符串,不要直接使用哦。 + +`data.data(102)` 对象: (弹幕) + +| 字段 | 类型 | 内容 | 备注 | +| -------------------- | ----- | -------------------- | ---- | +| combo | array | 连续发送弹幕事件信息 | | +| merge_interval | num | 合并弹幕时间间隔 | | +| card_appear_interval | num | 弹窗出现时间间隔 | | +| send_interval | num | 发送时间间隔 | | + +`data.data(102).combo[n]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | -------------- | ------------- | +| id | num | 标识 ID | | +| status | num | 状态 | | +| content | str | 重复的弹幕内容 | | +| cnt | num | 重复数量 | | +| guide | str | 标题词 | "他们都在说:" | +| left_duration | num | 左移时长 | | +| fade_duration | num | 淡化时长 | | + +`data.data(104)` 对象: (送礼) + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| fade\_duration | num | | | +| cnt | num | 投喂计数 | | +| card_appear_interval | num | | | +| suffix\_text | str | 提示文本 | `人在投喂` | +| reset\_cnt | num | | | +| display\_flag | num | | | +| gift\_id | num | 礼物 ID | | +| gift_alert_message | str | | | + +`data.data(105)` 对象: (分享) + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| fade\_duration | num | | | +| cnt | num | 分享计数 | | +| card_appear_interval | num | | | +| suffix\_text | str | 提示文本 | `人分享了直播间` | +| reset\_cnt | num | | | +| display\_flag | num | | | + +`data.data(106)` 对象: (点赞) + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| fade\_duration | num | | | +| cnt | num | 点赞计数 | | +| card_appear_interval | num | | | +| suffix\_text | str | 提示文本 | `人正在点赞` | +| reset\_cnt | num | | | +| display\_flag | num | | | + +**示例:** + +<details> +<summary>查看正文示例:</summary> + +type===102 + +```json +{ + "cmd": "DM_INTERACTION", + "data": { + "id": 6785480089600, + "status": 4, + "type": 102, + "data": { + "combo": [ + { + "id": 6785480089600, + "status": 4, + "content": "晚安", + "cnt": 3, + "guide": "他们都在说:", + "left_duration": 20000, + "fade_duration": 60000 + } + ], + "merge_interval": 1000, + "card_appear_interval": 1000, + "send_interval": 1000 + } + } +} +``` + +type===104 + +```json +{ + "cmd": "DM_INTERACTION", + "data": { + "data": "{\"fade_duration\":10000,\"cnt\":5,\"card_appear_interval\":0,\"suffix_text\":\"人在投喂\",\"reset_cnt\":0,\"display_flag\":1,\"gift_id\":33988,\"gift_alert_message\":\"投喂一个%s支持主播\"}", + "dmscore": 36, + "id": 85744481752576, + "status": 5, + "type": 104 + } +} +``` + +type===105 + +```json +{ + "cmd": "DM_INTERACTION", + "data": { + "data": "{\"fade_duration\":10000,\"cnt\":1,\"card_appear_interval\":0,\"suffix_text\":\"人分享了直播间\",\"reset_cnt\":0,\"display_flag\":1}", + "dmscore": 36, + "id": 85743053669888, + "status": 4, + "type": 105 + } +} +``` + +type===106 + +```json +{ + "cmd": "DM_INTERACTION", + "data": { + "data": "{\"fade_duration\":10000,\"cnt\":11,\"card_appear_interval\":0,\"suffix_text\":\"人正在点赞\",\"reset_cnt\":1,\"display_flag\":1}", + "dmscore": 36, + "id": 66159395305984, + "status": 5, + "type": 106 + } +} +``` + +</details> + +#### 进场或关注消息 (INTERACT_WORD) + +注: 有用户进入直播间或关注主播时触发 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `INTERACT_WORD` | | +| data | obj | 进入直播间的用户的信息 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| contribution | obj | 待调查 | | +| dmscore | num | 待调查 | | +| fans_medal | obj | 粉丝勋章 | | +| identities | num | 待调查 | | +| is_spread | num | 待调查 | | +| msg_type | num | 1为进场,2为关注,3为分享 | | +| roomid | num | 房间号 | | +| is_spread | num | 待调查 | | +| is_spread | num | 待调查 | | +| score | num | 待调查 | | +| spread_desc | str | 待调查 | | +| spread_info | str | 待调查 | | +| tail_icon | num | 待调查 | | +| timestamp | num | 时间戳 | | +| trigger_time | num | 触发时间 | | +| uid | num | 用户ID | | +| uname | str | 用户名称 | | +| uname_color | str | 用户名称颜色 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "INTERACT_WORD", + "data": { + "contribution": { + "grade": 0 + }, + "dmscore": 4, + "fans_medal": { + "anchor_roomid": 890976, + "guard_level": 0, + "icon_id": 0, + "is_lighted": 0, + "medal_color": 6067854, + "medal_color_border": 12632256, + "medal_color_end": 12632256, + "medal_color_start": 12632256, + "medal_level": 1, + "medal_name": "小豆皮", + "score": 134, + "special": "", + "target_id": 6574487 + }, + "identities": [ + 1 + ], + "is_spread": 0, + "msg_type": 1, + "roomid": 24143902, + "score": 1644563948936, + "spread_desc": "", + "spread_info": "", + "tail_icon": 0, + "timestamp": 1644563948, + "trigger_time": 1644563947876475000, + "uid": 335979315, + "uname": "TIM_Init", + "uname_color": "" + } +} +``` + +</details> + +#### 上舰通知 (GUARD_BUY) + +注: 当有用户购买 舰长 / 提督 / 总督 时 + +**JSON消息:** + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | ---- | +| cmd | str | `GUARD_BUY` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- |-----|--------------------------|-----| +| uid | num | 用户ID | | +| username | str | 用户名称 | | +| guard_level | num | 大航海等级 | 1: 总督<br />2: 提督<br />3:舰长 | +| num | num | 数量 | | +| price | num | 原金瓜子标价 | 即 CNY\*1000 | +| gift_id | num | 礼物id | | +| gift_name | str | 礼物名称 | | +| start_time | num | 待调查 | | +| end_time | num | 待调查 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "GUARD_BUY", + "data": { + "uid": 14225357, + "username": "妙妙喵喵妙妙喵O_O", + "guard_level": 3, + "num": 1, + "price": 198000, + "gift_id": 10003, + "gift_name": "舰长", + "start_time": 1677069316, + "end_time": 1677069316 + } +} +``` + +</details> + +#### 用户庆祝消息 (USER_TOAST_MSG) + +注: 用户购买 舰长 / 提督 / 总督 后的庆祝消息, 内容包含用户陪伴天数 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------------- | ---- | +| cmd | str | `USER_TOAST_MSG` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- |-----|--------------------------|-----| +| anchor_show | bool | 是否显示 | | +| color | str | 颜色 | | +| dmscore | num | 待调查 | | +| effect_id | num | 待调查 | | +| face_effect_id | num | 待调查 | | +| gift_id | num | 礼物id | | +| group_name | str | 待调查 | | +| group_op_type | num | 待调查 | | +| group_role_name | str | 待调查 | | +| guard_level | num | 大航海等级 | 1: 总督<br />2:<br />提督<br />3:舰长 | +| is_group | num | 待调查 | | +| is_show | num | 待调查 | | +| num | num | 上舰个数 | | +| op_type | num | 待调查 | | +| payflow_id | str | 待调查 | | +| price | num | 实际金瓜子标价 | 即 CNY\*1000 | +| role_name | str | 身份名称 | | +| room_effect_id | num | 待调查 | | +| room_group_effect_id | num | 待调查 | | +| start_time | num | 待调查 | | +| svga_block | num | 待调查 | | +| target_guard_count | str | 庆祝消息正文 | | +| toast_msg | num | 待调查 | | +| uid | num | 上舰人UID | | +| unit | str | 购买身份时间单位 | | +| user_show | bool | 待调查 | | +| username | str | 上舰人用户名 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "USER_TOAST_MSG", + "data": { + "anchor_show": true, + "color": "#00D1F1", + "dmscore": 90, + "effect_id": 397, + "end_time": 1702580687, + "face_effect_id": 44, + "gift_id": 10003, + "group_name": "", + "group_op_type": 0, + "group_role_name": "", + "guard_level": 3, + "is_group": 0, + "is_show": 0, + "num": 1, + "op_type": 1, + "payflow_id": "2312150304155852173446521", + "price": 138000, + "role_name": "舰长", + "room_effect_id": 590, + "room_group_effect_id": 1337, + "start_time": 1702580687, + "svga_block": 0, + "target_guard_count": 146, + "toast_msg": "<%无光之日%> 在主播Mia米娅-的直播间开通了舰长,今天是TA陪伴主播的第1天", + "uid": 79667344, + "unit": "月", + "user_show": true, + "username": "无光之日" + } +} +``` + +</details> + +#### 醒目留言 (SUPER_CHAT_MESSAGE) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | --------------------- | ---- | +| cmd | str | `SUPER_CHAT_MESSAGE` | | +| data | obj | 信息本体 | | +| roomid | num | 直播间房间号 (非短号) | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- |-----|----------------| --------- | +| background_bottom_color | str | 待调查 | | +| background_color | str | 待调查 | | +| background_color_end | str | 待调查 | | +| background_color_start | str | 待调查 | | +| background_icon | str | 待调查 | | +| background_image | str | 待调查 | | +| background_price_color | str | 待调查 | | +| color_point | num | 待调查 | | +| dmscore | num | 待调查 | | +| end_time | num | 待调查 | | +| gift | obj | 礼物信息 | | +| id | num | 醒目留言 ID | | +| is_ranked | num | 待调查 | | +| is_send_audit | num | 待调查 | | +| medal_info | obj | SC发送用户佩戴的粉丝牌信息 | | +| message | str | sc内容 | | +| message_font_color | str | SC文本颜色 | | +| message_trans | str | 机翻sc内容 | | +| price | num | sc金额 | 为 CNY 价值 | +| rate | num | 待调查 | | +| start_time | num | 待调查 | | +| time | num | sc持续时间 | | +| token | num | 待调查 | | +| trans_mark | num | 待调查 | | +| ts | num | 待调查 | | +| uid | num | 发送用户uid | | +| user_info | obj | 发送用户信息 | | + +`data.gift` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- |-----|------|------| +| gift_id | num | 礼物id | | +| gift_name | str | 礼物名称 | 一般均为"醒目留言" | +| num | num | 数量 | | + +`data.medal_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- |-----|-------------|------| +| anchor_roomid | num | 房间号 | 包含短号 | +| anchor_uname | str | 主播昵称 | | +| guard_level | num | 大航海等级 | 1: 总督<br/>2: 提督<br />3: 舰长 | +| icon_id | num | 待调查 | | +| is_lighted | num | 待调查 | | +| medal_color | str | 待调查 | | +| medal_color_border | num | 待调查 | | +| medal_color_end | num | 待调查 | | +| medal_color_start | num | 待调查 | | +| medal_level | num | 粉丝牌等级 | | +| medal_name | str | 粉丝牌名称 | | +| special | str | 待调查 | | +| target_id | num | 粉丝牌对应的主播mid | | + +`data.user_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- |-----|-------|------| +| face | num | 用户头像 | | +| face_frame | num | 头像边框 | | +| guard_level | num | 大航海等级 | 1: 总督<br />2: 提督<br />3: 舰长 | +| is_main_vip | num | 待调查 | | +| is_svip | num | 待调查 | | +| is_vip | num | 待调查 | | +| level_color | str | 待调查 | | +| manager | num | 待调查 | | +| name_color | str | 待调查 | | +| title | str | 待调查 | | +| uname | str | 用户名称 | | +| user_level | num | 待调查 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "SUPER_CHAT_MESSAGE", + "data": { + "background_bottom_color": "#2A60B2", + "background_color": "#EDF5FF", + "background_color_end": "#405D85", + "background_color_start": "#3171D2", + "background_icon": "", + "background_image": "https://i0.hdslb.com/bfs/live/a712efa5c6ebc67bafbe8352d3e74b820a00c13e.png", + "background_price_color": "#7497CD", + "color_point": 0.7, + "dmscore": 120, + "end_time": 1677069095, + "gift": { + "gift_id": 12000, + "gift_name": "醒目留言", + "num": 1 + }, + "id": 6522809, + "is_ranked": 1, + "is_send_audit": 0, + "medal_info": { + "anchor_roomid": 732, + "anchor_uname": "Asaki大人", + "guard_level": 3, + "icon_id": 0, + "is_lighted": 1, + "medal_color": "#1a544b", + "medal_color_border": 6809855, + "medal_color_end": 5414290, + "medal_color_start": 1725515, + "medal_level": 21, + "medal_name": "ASAKI", + "special": "", + "target_id": 194484313 + }, + "message": "猪播完美预测自己第一个死,这就是鹅鸭杀高玩吗", + "message_font_color": "#A3F6FF", + "message_trans": "", + "price": 30, + "rate": 1000, + "start_time": 1677069035, + "time": 60, + "token": "7BED5681", + "trans_mark": 0, + "ts": 1677069035, + "uid": 294094150, + "user_info": { + "face": "https://i1.hdslb.com/bfs/face/7a11b48e0a3055e220fa8b4c7d938cd4bcac2577.jpg", + "face_frame": "https://i0.hdslb.com/bfs/live/80f732943cc3367029df65e267960d56736a82ee.png", + "guard_level": 3, + "is_main_vip": 1, + "is_svip": 0, + "is_vip": 0, + "level_color": "#969696", + "manager": 0, + "name_color": "#00D1F1", + "title": "0", + "uname": "界原虚", + "user_level": 6 + } + }, + "roomid": 6154037 +} +``` + +</details> + +#### 醒目留言日语 (SUPER_CHAT_MESSAGE_JPN) + +基本同 [醒目留言 (SUPER_CHAT_MESSAGE)](#醒目留言-super_chat_message), 但多了 `message_jpn` 字段 + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "SUPER_CHAT_MESSAGE_JPN", + "data": { + "id": "3790747", + "uid": "394060741", + "price": 30, + "rate": 1000, + "message": "棉花!!转盘中了武器后,上号30抽3武器,救命!!!", + "message_jpn": "", + "is_ranked": 1, + "background_image": "https://i0.hdslb.com/bfs/live/a712efa5c6ebc67bafbe8352d3e74b820a00c13e.png", + "background_color": "#EDF5FF", + "background_icon": "", + "background_price_color": "#7497CD", + "background_bottom_color": "#2A60B2", + "ts": 1650363318, + "token": "24655ABF", + "medal_info": { + "icon_id": 0, + "target_id": 1871001, + "special": "", + "anchor_uname": "棉花大哥哥", + "anchor_roomid": 103, + "medal_level": 24, + "medal_name": "棉花花", + "medal_color": "#1a544b" + }, + "user_info": { + "uname": "改了名真的能中吗", + "face": "http://i1.hdslb.com/bfs/face/e2391f132cd981fb70468a8ce9418513e959eb10.jpg", + "face_frame": "https://i0.hdslb.com/bfs/live/80f732943cc3367029df65e267960d56736a82ee.png", + "guard_level": 3, + "user_level": 11, + "level_color": "#61c05a", + "is_vip": 0, + "is_svip": 0, + "is_main_vip": 1, + "title": "0", + "manager": 0 + }, + "time": 60, + "start_time": 1650363318, + "end_time": 1650363378, + "gift": { + "num": 1, + "gift_id": 12000, + "gift_name": "醒目留言" + } + }, + "roomid": "34348" +} +``` + +</details> + +#### 醒目留言删除 (SUPER_CHAT_MESSAGE_DELETE) + +<!--{ + "gh": [360] +}--> + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `SUPER_CHAT_MESSAGE_DELETE` | | +| data | obj | 消息本体 | | +| roomid | num | 直播间号 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| ids | arr | 待删除的醒目留言 ID 列表 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "SUPER_CHAT_MESSAGE_DELETE", + "data": { + "ids": [ + 3897503 + ] + }, + "roomid": 23708804 +} +``` + +</details> + +#### 送礼 (SEND_GIFT) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | ---- | +| cmd | str | `SEND_GIFT` | | +| data | obj | 消息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | -------- | ------ | --------- | +| action | str | 礼物操作,一般为"投喂" | | +| batch_combo_id | str | 待调查 | 有时为空字符串 | +| batch_combo_send | obj | 待调查 | 有时为null | +| beatId | str | 待调查 | | +| biz_source | str | 待调查 | | +| blind_gift | | 待调查 | | +| broadcast_id | num | 待调查 | | +| coin_type | str | 标识金银瓜子礼物对应是否付费? | | +| combo_resources_id | num | 待调查 | | +| combo_send | | 待调查 | | +| comber_stay_time | num | 待调查 | | +| combo_total_coin | num | 待调查 | | +| crit_prob | num | 待调查 | | +| demarcation | num | 待调查 | | +| discount_price | num | 待调查 | | +| dmscore | num | 待调查 | | +| draw | num | 待调查 | | +| effect | num | 待调查 | | +| effect_block | num | 待调查 | | +| face | str | 礼物投喂者的头像URL | | +| face_effect_id | num | 待调查 | | +| face_effect_type | num | 待调查 | | +| float_sc_resource_id | num | 待调查 | | +| giftId | num | 礼物ID | | +| giftName | str | 礼物名称 | | +| giftType | num | 待调查 | | +| gold | number | 待调查 | | +| guard_level | num | 待调查 | | +| is_first | bool | 待调查 | | +| is_join_receiver | bool | 待调查 | | +| is_naming | bool | 待调查 | | +| is_special_batch | num | 待调查 | | +| magnification | num | 待调查 | | +| medal_info | obj | 礼物投喂者粉丝奖牌信息 | | +| name_color | str | 待调查 | | +| num | num | 该次投喂的礼物数量 | | +| original_gift_name | str | 待调查 | | +| price | num | 价值 | | +| rcost | num | 待调查 | | +| receive_user_info | obj | 礼物接收者信息,一般是主播 | | +| remain | num | 待调查 | | +| rnd | num | 礼物发送时的时间戳,以及后面9位未知数字 | | +| send_master | | 待调查 | | +| silver | num | 待调查 | | +| super | num | 待调查 | | +| super_batch_gift_num | num | 待调查 | | +| super_gift_num | num | 待调查 | | +| svga_block | num | 待调查 | | +| switch | bool | 待调查 | | +| tag_image | str | 待调查 | | +| tid | num | 礼物发送时的时间戳,以及后面9位未知数字 | 似乎与rnd字段相同 | +| timestamp | num | 礼物发送时的时间戳 | | +| top_list | | 待调查 | | +| total_coin | num | 实际金银瓜子总价值 | 不是总等于 num*price | +| uid | num | 礼物投喂者的UID | | +| uname | str | 礼物投喂者的名称 | | + +`data.batch_combo_send` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | -------- | ------ | --------- | +| action | str | 礼物操作,一般为"投喂" | | +| batch_combo_id | str | 待调查 | | +| batch_combo_num | num | 待调查 | | +| blind_gift | | 待调查 | | +| gift_id | num | 待调查 | | +| gift_name | str | 投喂的礼物名称 | 待调查 | +| gift_num | num | 投喂礼物数量 | 待调查 | +| send_master | | 待调查 | | +| uid | num | 礼物投喂者的UID | | +| uname | str | 礼物投喂者的名称 | | + +`data.medal_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | -------- | ------ | --------- | +| anchor_roomid | num | 待调查 | | +| anchor_uname | str | 待调查 | | +| guard_level | num | 待调查 | | +| icon_id | num | 待调查 | | +| is_lighted | num | 待调查 | | +| medal_color | num | 礼物投喂者的粉丝奖牌颜色 | 十六进制颜色值转为了十进制表示 | +| medal_border_color | num | 礼物投喂者的粉丝奖牌边框颜色 | 十六进制颜色值的十进制表示 | +| medal_color_end | num | 待调查 | | +| medal_color_start | num | 待调查 | | +| medal_level | num | 礼物投喂者的粉丝奖牌等级 | | +| medal_name | str | 礼物投喂者的粉丝奖牌名称 | | +| special | str | 待调查 | | +| target_id | num | 待调查 | | + +`data.receive_user_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | -------- | ------ | --------- | +| uid | num | 礼物接收者的UID | 一般为主播的UID | +| uname | str | 礼物接收者的名称 | 一般为主播的名称 | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "SEND_GIFT", + "data": { + "action": "投喂", + "batch_combo_id": "batch:gift:combo_id:510149209:36047134:31036:1673622464.8445", + "batch_combo_send": { + "action": "投喂", + "batch_combo_id": "batch:gift:combo_id:510149209:36047134:31036:1673622464.8445", + "batch_combo_num": 1, + "blind_gift": null, + "gift_id": 31036, + "gift_name": "小花花", + "gift_num": 1, + "send_master": null, + "uid": 510149209, + "uname": "12138额83121" + }, + "beatId": "", + "biz_source": "live", + "blind_gift": null, + "broadcast_id": 0, + "coin_type": "gold", + "combo_resources_id": 1, + "combo_send": { + "action": "投喂", + "combo_id": "gift:combo_id:510149209:36047134:31036:1673622464.8434", + "combo_num": 1, + "gift_id": 31036, + "gift_name": "小花花", + "gift_num": 1, + "send_master": null, + "uid": 510149209, + "uname": "12138额83121" + }, + "combo_stay_time": 3, + "combo_total_coin": 100, + "crit_prob": 0, + "demarcation": 1, + "discount_price": 100, + "dmscore": 8, + "draw": 0, + "effect": 0, + "effect_block": 0, + "face": "https://i1.hdslb.com/bfs/face/fb79103e8b33547023e2010030b6889bba2b49bf.jpg", + "face_effect_id": 0, + "face_effect_type": 0, + "float_sc_resource_id": 0, + "giftId": 31036, + "giftName": "小花花", + "giftType": 0, + "gold": 0, + "guard_level": 0, + "is_first": true, + "is_join_receiver": false, + "is_naming": false, + "is_special_batch": 0, + "magnification": 1, + "medal_info": { + "anchor_roomid": 0, + "anchor_uname": "", + "guard_level": 0, + "icon_id": 0, + "is_lighted": 0, + "medal_color": 0, + "medal_color_border": 0, + "medal_color_end": 0, + "medal_color_start": 0, + "medal_level": 0, + "medal_name": "", + "special": "", + "target_id": 0 + }, + "name_color": "", + "num": 1, + "original_gift_name": "", + "price": 100, + "rcost": 164536872, + "receive_user_info": { + "uid": 36047134, + "uname": "小霖QL" + }, + "remain": 0, + "rnd": "1673622464121900003", + "send_master": null, + "silver": 0, + "super": 0, + "super_batch_gift_num": 1, + "super_gift_num": 1, + "svga_block": 0, + "switch": true, + "tag_image": "", + "tid": "1673622464121900003", + "timestamp": 1673622464, + "top_list": null, + "total_coin": 100, + "uid": 510149209, + "uname": "12138额83121" + } +} +``` + +</details> + +#### 礼物星球点亮 (GIFT_STAR_PROCESS) + +注: 主播的礼物星球其一点亮之后 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `GIFT_STAR_PROCESS` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | -------- | ------ | --------- | +| status | num | 待调查 | | +| tip | str | 点亮礼物星球的消息文本 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "GIFT_STAR_PROCESS", + "data": { + "status": 1, + "tip": "情书已点亮" + } +} +``` + +</details> + +#### 礼物连击 (COMBO_SEND) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `COMBO_SEND` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | -------- | ------ | --------- | +| action | str | 礼物操作,一般为"投喂" | | +| batch_combo_id | str | 待调查 | | +| batch_combo_num | num | 连击礼物数量 | | +| combo_id | str | 待调查 | | +| combo_num | str | 连击礼物数量 | | +| combo_total_coin | num | 待调查 | | +| dmscore | num | 待调查 | | +| gift_id | num | 待调查 | | +| gift_name | str | 连击礼物的名称 | | +| gift_num | num | 0 | | +| is_join_receiver | bool | 待调查 | | +| is_naming | bool | 待调查 | | +| is_show | num | 待调查 | | +| medal_info | obj | 礼物投喂者的粉丝勋章信息 | | +| name_color | str | 待调查 | | +| r_uname | str | 主播的名称 | | +| receive_user_info | obj | 主播的UID和名称 | | +| ruid | num | 主播的UID | | +| send_master | | 待调查 | | +| total_num | num | 连击礼物数量 | | +| uid | num | 礼物投喂者的UID | | +| uname | str | 礼物投喂者的名称 | | + +`data.receive_user_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | -------- | ------ | --------- | +| uid | number | 礼物接收者的UID | 一般为主播的UID | +| uname | string | 礼物接收者的名称 | 一般为主播的名称 | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "COMBO_SEND", + "data": { + "action": "投喂", + "batch_combo_id": "batch:gift:combo_id:3493090830584635:29857468:31036:1673774515.6190", + "batch_combo_num": 2, + "combo_id": "gift:combo_id:3493090830584635:29857468:31036:1673774515.6180", + "combo_num": 2, + "combo_total_coin": 200, + "dmscore": 112, + "gift_id": 31036, + "gift_name": "小花花", + "gift_num": 0, + "is_join_receiver": false, + "is_naming": false, + "is_show": 1, + "medal_info": { + "anchor_roomid": 0, + "anchor_uname": "", + "guard_level": 0, + "icon_id": 0, + "is_lighted": 1, + "medal_color": 6067854, + "medal_color_border": 6067854, + "medal_color_end": 6067854, + "medal_color_start": 6067854, + "medal_level": 3, + "medal_name": "爱珞珞", + "special": "", + "target_id": 3493076559465366 + }, + "name_color": "", + "r_uname": "露萌不要雨草", + "receive_user_info": { + "uid": 29857468, + "uname": "露萌不要雨草" + }, + "ruid": 29857468, + "send_master": null, + "total_num": 2, + "uid": 3493090830584635, + "uname": "DOC-Neo" + } +} +``` + +</details> + +#### 特殊礼物 (SPECIAL_GIFT) + +<!--{ + "gh": [360] +}--> + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| cmd | str | `SPECIAL_GIFT` | | +| data | obj | 信息本体 | | + +`data` 对象: + +以 数字 为键, JSON Object 为值的表 + +`data['?']` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| action | str | 操作? | | +| content | str | 内容 | | +| hadJoin | num | 是否加入? | | +| id | str | ? | 字符串表示的数字 | +| num | str | 数量 | | +| storm_gif | str | GIF 动画 URL | | +| time | str | 持续时间? | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "SPECIAL_GIFT", + "data": { + "39": { + "action": "start", + "content": "可爱即正义~~", + "hadJoin": 0, + "id": "3306976431489", + "num": 1, + "storm_gif": "http://static.hdslb.com/live-static/live-room/images/gift-section/mobilegift/2/jiezou.gif?2017011901", + "time": 90 + } + } +} +``` + +</details> + +<!-- +#### 欢迎加入房间 + +#### 欢迎房管加入房间 +--> + +#### 通知消息 (NOTICE_MSG) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `NOTICE_MSG` | | +| id | num | 待调查 | | +| name | str | 通知名 | | +| full | obj | 完整显示信息? | | +| half | obj | 半部显示信息? | | | +| side | obj | 边缘显示信息? | | +| roomid | num | 目标直播间短号 | | +| real_roomid | num | 目标直播间真实ID | | +| msg_common | str | 显示的消息内容 | | +| msg_self | str | 消息内容本身 | 剔除额外文本 | +| link_url | str | 通知消息跳转的URL | | +| msg_type | num | 待调查 | | +| shield_uid | num | 待调查 | | +| business_id | str | 待调查 | | +| scatter | obj | 待调查 | | +| marquee_id | str | 待调查 | | +| notice_type | num | 待调查 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "NOTICE_MSG", + "id": 804, + "name": "人气榜第一名", + "full": { + "head_icon": "https://i0.hdslb.com/bfs/live/f74b09c7fb83123a0dd66c536b6d5b143d271b08.png", + "tail_icon": "https://i0.hdslb.com/bfs/live/822da481fdaba986d738db5d8fd469ffa95a8fa1.webp", + "head_icon_fa": "https://i0.hdslb.com/bfs/live/f74b09c7fb83123a0dd66c536b6d5b143d271b08.png", + "tail_icon_fa": "https://i0.hdslb.com/bfs/live/38cb2a9f1209b16c0f15162b0b553e3b28d9f16f.png", + "head_icon_fan": 1, + "tail_icon_fan": 4, + "background": "#FFE6BD", + "color": "#9D5412", + "highlight": "#FF6933", + "time": 20 + }, + "half": { + "head_icon": "https://i0.hdslb.com/bfs/live/f74b09c7fb83123a0dd66c536b6d5b143d271b08.png", + "tail_icon": "https://i0.hdslb.com/bfs/live/822da481fdaba986d738db5d8fd469ffa95a8fa1.webp", + "background": "#FFE6BD", + "color": "#9D5412", + "highlight": "#FF6933", + "time": 0 + }, + "side": { + "head_icon": "", + "background": "", + "color": "", + "highlight": "", + "border": "" + }, + "roomid": 23919301, + "real_roomid": 23919301, + "msg_common": "恭喜主播<%AG超玩会王者荣耀一诺%>荣获上小时人气榜第<%1%>名!点击传送查看精彩内容!", + "msg_self": "恭喜主播<%AG超玩会王者荣耀一诺%>荣获上小时人气榜第<%1%>名!", + "link_url": "https://live.bilibili.com/23919301?broadcast_type=0&is_room_feed=1&from=28003&extra_jump_from=28003", + "msg_type": 1, + "shield_uid": -1, + "business_id": "", + "scatter": { + "min": 0, + "max": 0 + }, + "marquee_id": "", + "notice_type": 0 +} +``` + +```json +{ + "cmd": "NOTICE_MSG", + "id": 814, + "name": "幻影飞船专用", + "full": { + "head_icon": "https://i0.hdslb.com/bfs/live/08978f1721200e11328d1f7d6231b21bcca20488.gif", + "tail_icon": "https://i0.hdslb.com/bfs/live/822da481fdaba986d738db5d8fd469ffa95a8fa1.webp", + "head_icon_fa": "https://i0.hdslb.com/bfs/live/08978f1721200e11328d1f7d6231b21bcca20488.gif", + "tail_icon_fa": "https://i0.hdslb.com/bfs/live/38cb2a9f1209b16c0f15162b0b553e3b28d9f16f.png", + "head_icon_fan": 1, + "tail_icon_fan": 4, + "background": "#F09153", + "color": "#FFFFFF", + "highlight": "#FFE600", + "time": 15 + }, + "half": { + "head_icon": "https://i0.hdslb.com/bfs/live/08978f1721200e11328d1f7d6231b21bcca20488.gif", + "tail_icon": "", + "background": "#F09153", + "color": "#FFFFFFFF", + "highlight": "#FFE600", + "time": 15 + }, + "side": { + "head_icon": "", + "background": "", + "color": "", + "highlight": "", + "border": "" + }, + "roomid": 25207004, + "real_roomid": 25207004, + "msg_common": "<%咖啡_ミシェル%>投喂<%夜月瓜瓜sukuyi%>1个幻影飞船,向着浩瀚星辰出发!", + "msg_self": "<%咖啡_ミシェル%>投喂<%夜月瓜瓜sukuyi%>1个幻影飞船,向着浩瀚星辰出发!", + "link_url": "https://live.bilibili.com/25207004?broadcast_type=0&is_room_feed=1&from=28003&extra_jump_from=28003&live_lottery_type=1", + "msg_type": 2, + "shield_uid": -1, + "business_id": "32356", + "scatter": { + "min": 0, + "max": 0 + }, + "marquee_id": "", + "notice_type": 0 +} +``` + +</details> + +#### 主播准备中 (PREPARING) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `PREPARING` | | +| round | num | 轮播状态:<br/>1正在轮播<br/>0未轮播 | 开启轮播时存在 | +| roomid | str | 直播间ID | 未知是真实ID还是短号 | 类型似乎从num改为str | +| msg\_id | str | 信息id? | | +| p\_is\_ack | bool | | 未知 | +| p\_msg\_type | num | `1` | 未知 | +| send\_time | num | 发送时间 | UNIX 毫秒时间戳 | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +有启用轮播: + +```json +{ + "cmd": "PREPARING", + "msg_id": "26964930181741056:1000:1000", + "p_is_ack": true, + "p_msg_type": 1, + "roomid": "1899237171", + "round": 1, + "send_time": 1739985402716 +} +``` + +未启用轮播: + +```json +{ + "cmd": "PREPARING", + "msg_id": "27040425357932032:1000:1000", + "p_is_ack": true, + "p_msg_type": 1, + "roomid": "1017", + "send_time": 1740129398337 +} +``` + +</details> + +#### 直播开始 (LIVE) + +注:请求了开始直播接口、开始向服务器推流时下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `LIVE` | | +| live_key | str | 标记直播场次的key | 与开始直播接口获得的live_key相同 | +| voice_background | str | ? | | +| sub_session_key | str | ? | | +| live_platform | str | 开播平台? | 推测由开播接口决定 | +| live_model | num | ? | | +| live_time | num | 开播时间 | UNIX 秒级时间戳,只有请求了开始直播后立刻下发的那个数据包里存在 | +| roomid | num | 直播间号 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "LIVE", + "live_key": "234304209915761953", + "voice_background": "", + "sub_session_key": "234304209915761953sub_time:1651036923", + "live_platform": "pc", + "live_model": 0, + "live_time": 1651036923, + "roomid": 23614753 +} +``` + +</details> + +#### 主播信息更新 (ROOM_REAL_TIME_MESSAGE_UPDATE) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `ROOM_REAL_TIME_MESSAGE_UPDATE` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| roomid | num | 直播间ID | 未知是真实ID还是短号 | +| fans | num | 主播当前粉丝数 | | +| red_notice | num | 待调查 | | +| fans_club | num | 主播粉丝团人数 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ROOM_REAL_TIME_MESSAGE_UPDATE", + "data": { + "roomid": 8618057, + "fans": 136, + "red_notice": -1, + "fans_club": 8 + } +} +``` + +</details> + +#### 直播间高能榜 (ONLINE_RANK_V2) + +注: 直播间高能用户数据刷新 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `ONLINE_RANK_V2` | | +| data | obj | 直播间高能用户数据 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| list | array | 在直播间高能用户中的用户信息 | | +| rank_type | str | 待调查 | | + +`data.list[n]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| uid | num | 用户 mid | | +| face | str | 用户头像 URL | | +| score | str | 该用户的贡献值 | | +| uname | str | 用户名称 | | +| rank | num | 该用户在高能榜中的排名 | | +| guard_level | num | 大航海等级? | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ONLINE_RANK_V2", + "data": { + "list": [ + { + "uid": 2082621455, + "face": "https://i2.hdslb.com/bfs/face/9de6050277fa13d830eb97e3453d89843de46a31.jpg", + "score": "20", + "uname": "8级萌新_小华", + "rank": 1, + "guard_level": 0 + }, + { + "uid": 50500335, + "face": "https://i0.hdslb.com/bfs/face/ca722209251478ef0ffb45c3adeafb9dab283c57.jpg", + "score": "20", + "uname": "属官一号", + "rank": 2, + "guard_level": 0 + }, + { + "uid": 29857468, + "face": "https://i1.hdslb.com/bfs/face/7b4ae2e7e950f2dfb2bd969859c813487ce3b64c.jpg", + "score": "12", + "uname": "露萌不要雨草", + "rank": 3, + "guard_level": 0 + } + ], + "rank_type": "gold-rank" + } +} +``` + +</details> + +#### 直播间高能用户数量 (ONLINE_RANK_COUNT) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `ONLINE_RANK_COUNT` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| count | num | 直播间高能用户数量 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ONLINE_RANK_COUNT", + "data": { + "count": 4 + } +} +``` + +</details> + +#### 未登录通知 (LOG_IN_NOTICE) + +注:未使用认证信息进行登录将会下发此数据包,通常于认证包回复后下发,在后续时间里也有可能会下发;部分受到豁免的直播间不会下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `LOG_IN_NOTICE` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| notice\_msg | str | 通知内容 | | +| image\_web | str | 在网页端使用的通知图片 | | +| image\_app | str | 在app端使用的图片 | (未确认) | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "LOG_IN_NOTICE", + "data": { + "notice_msg": "为保护用户隐私,未登录无法查看他人昵称", + "image_web": "http://i0.hdslb.com/bfs/dm/75e7c16b99208df259fe0a93354fd3440cbab412.png", + "image_app": "http://i0.hdslb.com/bfs/dm/b632f7dcd3acf47deffb5f9ccc9546ae97a3415b.png" + } +} +``` + +</details> + +#### 用户到达直播间高能榜前三名的消息 (ONLINE_RANK_TOP3) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `ONLINE_RANK_TOP3` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| dmscore | num | 待调查 | | +| list | array | 消息内容和高能榜排名 | | + +`data.list[n]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| msg | str | 消息内容 | | +| rank | num | 该用户的高能榜排名 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ONLINE_RANK_TOP3", + "data": { + "dmscore": 112, + "list": [ + { + "msg": "恭喜 <%你干嘛哈哈哎哟%> 成为高能用户", + "rank": 1 + } + ] + } +} +``` + +</details> + +#### 直播间在人气榜的排名改变 (POPULAR_RANK_CHANGED) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `POPULAR_RANK_CHANGED` | | +| data | obj | 直播间的人气榜排名信息 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| uid | num | 主播 mid | | +| rank | num | 人气榜排名 | | +| countdown | num | 人气榜下轮结算剩余时长 | | +| timestamp | num | 触发时的Unix时间戳 | | +| cache_key | str | 待调查 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "POPULAR_RANK_CHANGED", + "data": { + "uid": 780791, + "rank": 36, + "countdown": 1927, + "timestamp": 1702578474, + "cache_key": "rank_change:91a4e81ba3034ae894d61e432aa13081" + } +} +``` + +</details> + +#### 直播间限时热门榜排名改变 (HOT_RANK_CHANGED) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `HOT_RANK_CHANGED` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| rank | num | 排名 | | +| trend | num | 趋势? | | +| countdown | num | 剩余时间? | | +| timestamp | num | 当前时间? | UNIX 秒级时间戳 | +| web_url | str | 排行榜 URL | | +| live_url | str | 排行榜 URL | | +| blink_url | str | 排行榜 URL | | +| live_link_url | str | 排行榜 URL | | +| pc_link_url | str | 排行榜 URL | | +| icon | str | 图标 URL | | +| area_name | str | 分区名称 | | +| rank_desc | str | 空? | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "HOT_RANK_CHANGED", + "data": { + "rank": 31, + "trend": 1, + "countdown": 1440, + "timestamp": 1651037760, + "web_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=2&area_id=9&parent_area_id=9&second_area_id=0", + "live_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=1&area_id=9&parent_area_id=9&second_area_id=0&is_live_half_webview=1&hybrid_rotate_d=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,12,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,12,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", + "blink_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=3&area_id=9&parent_area_id=9&second_area_id=0&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", + "live_link_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=5&area_id=9&parent_area_id=9&second_area_id=0&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", + "pc_link_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=4&is_live_half_webview=1&area_id=9&parent_area_id=9&second_area_id=0&pc_ui=338,465,f4eefa,0", + "icon": "https://i0.hdslb.com/bfs/live/63217712edb588864b2c714225992e7f46b0b917.png", + "area_name": "虚拟", + "rank_desc": "" + } +} +``` + +</details> + +#### 当前直播间限时热门榜排名改变V2 (HOT_RANK_CHANGED_V2) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `HOT_RANK_CHANGED_V2` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| rank | num | 排名 | | +| trend | num | 趋势? | | +| countdown | num | 剩余时间? | | +| timestamp | num | 当前时间? | UNIX 秒级时间戳 | +| web_url | str | 排行榜 URL | | +| live_url | str | 排行榜 URL | | +| blink_url | str | 排行榜 URL | | +| live_link_url | str | 排行榜 URL | | +| pc_link_url | str | 排行榜 URL | | +| icon | str | 图标 URL | | +| area_name | str | 分区名称 | | +| rank_desc | str | 排行榜说明 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "HOT_RANK_CHANGED_V2", + "data": { + "rank": 31, + "trend": 0, + "countdown": 1440, + "timestamp": 1651037760, + "web_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=2&area_id=9&parent_area_id=9&second_area_id=371", + "live_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=1&area_id=9&parent_area_id=9&second_area_id=371&is_live_half_webview=1&hybrid_rotate_d=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,12,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,12,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", + "blink_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=3&area_id=9&parent_area_id=9&second_area_id=371&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", + "live_link_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=5&area_id=9&parent_area_id=9&second_area_id=371&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", + "pc_link_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=4&is_live_half_webview=1&area_id=9&parent_area_id=9&second_area_id=371&pc_ui=338,465,f4eefa,0", + "icon": "https://i0.hdslb.com/bfs/live/cb2e160ac4f562b347bb5ae6e635688ebc69580f.png", + "area_name": "虚拟主播", + "rank_desc": "虚拟主播top50" + } +} +``` + +</details> + +#### 限时热门榜上榜信息 (HOT_RANK_SETTLEMENT) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `HOT_RANK_SETTLEMENT` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| area_name | str | 分区名称 | | +| cache_key | str | ? | | +| dm_msg | str | 弹幕提示信息 | | +| dmscore | num | ? | | +| face | str | 主播头像 URL | | +| icon | str | 图标 URL | | +| rank | num | 排名 | | +| timestamp | num | 时间 | UNIX 秒级时间戳 | +| uname | str | 主播用户名 | | +| url | str | 排行榜 URL | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "HOT_RANK_SETTLEMENT", + "data": { + "area_name": "虚拟主播", + "cache_key": "2f8baf923a6b7df5a045df6c7181984c", + "dm_msg": "恭喜主播 <% 白黑卡扣 %> 荣登限时热门榜虚拟主播榜top9! 即将获得热门流量推荐哦!", + "dmscore": 144, + "face": "http://i0.hdslb.com/bfs/face/ddfcd696213e07884ce227c6ba6d23a007a08c02.jpg", + "icon": "https://i0.hdslb.com/bfs/live/63217712edb588864b2c714225992e7f46b0b917.png", + "rank": 9, + "timestamp": 1651041000, + "uname": "白黑卡扣", + "url": "https://live.bilibili.com/p/html/live-app-hotrank/result.html?is_live_half_webview=1&hybrid_half_ui=1,5,250,200,f4eefa,0,30,0,0,0;2,5,250,200,f4eefa,0,30,0,0,0;3,5,250,200,f4eefa,0,30,0,0,0;4,5,250,200,f4eefa,0,30,0,0,0;5,5,250,200,f4eefa,0,30,0,0,0;6,5,250,200,f4eefa,0,30,0,0,0;7,5,250,200,f4eefa,0,30,0,0,0;8,5,250,200,f4eefa,0,30,0,0,0&areaId=9&cache_key=2f8baf923a6b7df5a045df6c7181984c" + } +} +``` + +</details> + +#### 限时热门榜上榜信息V2 (HOT_RANK_SETTLEMENT_V2) + +**JSON消息:** + +基本同 [限时热门榜上榜信息](#限时热门榜上榜信息-hot_rank_settlement), 但没有 `data.dmscore` 字段 + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "HOT_RANK_SETTLEMENT_V2", + "data": { + "rank": 9, + "uname": "白黑卡扣", + "face": "http://i0.hdslb.com/bfs/face/ddfcd696213e07884ce227c6ba6d23a007a08c02.jpg", + "timestamp": 1651040700, + "icon": "https://i0.hdslb.com/bfs/live/cb2e160ac4f562b347bb5ae6e635688ebc69580f.png", + "area_name": "虚拟主播", + "url": "https://live.bilibili.com/p/html/live-app-hotrank/result.html?is_live_half_webview=1&hybrid_half_ui=1,5,250,200,f4eefa,0,30,0,0,0;2,5,250,200,f4eefa,0,30,0,0,0;3,5,250,200,f4eefa,0,30,0,0,0;4,5,250,200,f4eefa,0,30,0,0,0;5,5,250,200,f4eefa,0,30,0,0,0;6,5,250,200,f4eefa,0,30,0,0,0;7,5,250,200,f4eefa,0,30,0,0,0;8,5,250,200,f4eefa,0,30,0,0,0&areaId=371&cache_key=693b7b029b66976a399cf4e3485d265a", + "cache_key": "693b7b029b66976a399cf4e3485d265a", + "dm_msg": "恭喜主播 <% 白黑卡扣 %> 荣登限时热门榜虚拟主播榜top9! 即将获得热门流量推荐哦!" + } +} +``` + +</details> + +#### 直播间用户点赞 (LIKE_INFO_V3_CLICK) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `LIKE_INFO_V3_CLICK` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| show_area | num | 待调查 | | +| msg_type | num | 待调查 | | +| like_icon | str | 点赞图标的URL | | +| uid | num | 点赞的用户的UID | | +| like_text | str | 点赞文本 | | +| uname | str | 点赞的用户的名称 | | +| uname_color | str | 点赞的用户的名称颜色 | | +| identities | array | 待调查 | | +| fans_medal | obj | 点赞的用户的粉丝勋章信息 | | +| contribution_info | obj | 待调查 | | +| dmscore | num | 待调查 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "LIKE_INFO_V3_CLICK", + "data": { + "show_area": 0, + "msg_type": 6, + "like_icon": "https://i0.hdslb.com/bfs/live/23678e3d90402bea6a65251b3e728044c21b1f0f.png", + "uid": 32174213, + "like_text": "为主播点赞了", + "uname": "MeiDngS", + "uname_color": "", + "identities": [ + 1 + ], + "fans_medal": { + "target_id": 0, + "medal_level": 0, + "medal_name": "", + "medal_color": 0, + "medal_color_start": 12632256, + "medal_color_end": 12632256, + "medal_color_border": 12632256, + "is_lighted": 0, + "guard_level": 0, + "special": "", + "icon_id": 0, + "anchor_roomid": 0, + "score": 0 + }, + "contribution_info": { + "grade": 0 + }, + "dmscore": 20 + } +} +``` + +</details> + +#### 直播间点赞数更新 (LIKE_INFO_V3_UPDATE) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `LIKE_INFO_V3_UPDATE` | | +| data | obj | 直播间点赞数 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| click_count | num | 直播间点赞数 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "LIKE_INFO_V3_UPDATE", + "data": { + "click_count": 3227 + } +} +``` + +</details> + +#### 直播间发红包弹幕 (POPULARITY_RED_POCKET_START) + +注: 开始抽取红包 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `POPULARITY_RED_POCKET_START` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | --- | ------ | --------- | +| lot_id | num | 发送的红包的ID | | +| sender_uid | num | 发送者的UID | | +| sender_name | str | 发送者的名称 | | +| sender_face | str | 发送者的头像的URL | | +| join_requirement | num | 待调查 | | +| danmu | str | 用户参与红包时自动发送的弹幕内容 | | +| current_time | num | 服务器发送数据包的Unix时间戳 | | +| start_time | num | 可以开始抢红包的Unix时间戳 | | +| end_time | num | 抢红包的结束时间Unix时间戳 | | +| last_time | num | 红包的持续时间(秒) | start_time - end_time | +| remove_time | num | 待调查 | | +| replace_time | num | 待调查 | | +| lot_status | num | 待调查 | | +| h5_url | str | 红包页面的URL | | +| user_status | num | 用户参与状态,但是不知道是哪个用户 | 1已参与<br />2未参与 | +| awards | array | 红包内包含的礼物的信息 | | +| lot_config_id | num | 待调查 | | +| total_price | num | 内含抽取奖品金瓜子总价值 | 目前红包的 20% 会直接交给主播, 所以 20 电池 (2 CNY) 对应 2000 金瓜子的 80% 是 1600 金瓜子 | +| wait_num | num | 待调查 | | + +`data.awards[n]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | --- | ------ | --------- | +| gift_id | num | 礼物ID | | +| gift_name | str | 礼物名称 | | +| gift_pic | str | 礼物图标URL | | +| num | num | 该礼物的数量 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "POPULARITY_RED_POCKET_START", + "data": { + "lot_id": 2062329, + "sender_uid": 181851309, + "sender_name": "毒瘤老肥仔", + "sender_face": "http://i0.hdslb.com/bfs/face/fed3871b01976ddd35fd3f772ffc2d4949f1391d.jpg", + "join_requirement": 1, + "danmu": "老板大气!点点红包抽礼物!", + "current_time": 1650425344, + "start_time": 1650425343, + "end_time": 1650425523, + "last_time": 180, + "remove_time": 1650425538, + "replace_time": 1650425533, + "lot_status": 1, + "h5_url": "https://live.bilibili.com/p/html/live-app-red-envelope/popularity.html?is_live_half_webview=1&hybrid_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&hybrid_rotate_d=1&hybrid_biz=popularityRedPacket&lotteryId=2062329", + "user_status": 2, + "awards": [ + { + "gift_id": 31212, + "gift_name": "打call", + "gift_pic": "https://s1.hdslb.com/bfs/live/f75291a0e267425c41e1ce31b5ffd6bfedc6f0b6.png", + "num": 2 + }, + { + "gift_id": 31214, + "gift_name": "牛哇", + "gift_pic": "https://s1.hdslb.com/bfs/live/b8a38b4bd3be120becddfb92650786f00dffad48.png", + "num": 3 + }, + { + "gift_id": 31216, + "gift_name": "i了i了", + "gift_pic": "https://s1.hdslb.com/bfs/live/1157a445487b39c0b7368d91b22290c60fa665b2.png", + "num": 3 + } + ], + "lot_config_id": 3, + "total_price": 1600, + "wait_num": 0 + } +} +``` + +</details> + +#### 直播间红包 (POPULARITY_RED_POCKET_NEW) + +注: 与 [直播间发红包弹幕](#直播间发红包弹幕-popularity_red_pocket_start) 不同, 那个是发红包的弹幕信息, 这个则和 [送礼](#送礼-send_gift) 的信息相似, 但也有前者的一些字段 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------------------- | ---- | +| cmd | str | `POPULARITY_RED_POCKET_NEW` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ------------ | ---- | +| lot_id | num | 红包 ID | | +| start_time | num | 开抢时间 | UNIX 秒级时间戳 | +| current_time | num | 当前时间 | UNIX 秒级时间戳 | +| wait_num | num | 0? | | +| uname | str | 发送者用户名 | | +| uid | num | 发送者的 mid | | +| action | str | 礼物操作 | | +| num | num | 礼物数量 | | +| gift_name | str | `红包` | | +| gift_id | num | 礼物 ID? | | +| price | num | 电池标价 | | +| name_color | str | 用户名颜色 | | +| medal_info | obj | 发送者粉丝牌 | | + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "POPULARITY_RED_POCKET_NEW", + "data": { + "lot_id": 2062329, + "start_time": 1650425343, + "current_time": 1650425343, + "wait_num": 0, + "uname": "毒瘤老肥仔", + "uid": 181851309, + "action": "送出", + "num": 1, + "gift_name": "红包", + "gift_id": 13000, + "price": 20, + "name_color": "#00D1F1", + "medal_info": { + "target_id": 11909915, + "special": "", + "icon_id": 0, + "anchor_uname": "", + "anchor_roomid": 0, + "medal_level": 22, + "medal_name": "伊克拉", + "medal_color": 1725515, + "medal_color_start": 1725515, + "medal_color_end": 5414290, + "medal_color_border": 6809855, + "is_lighted": 1, + "guard_level": 3 + } + } +} +``` + +</details> + +#### 直播间抢到红包的用户 (POPULARITY_RED_POCKET_WINNER_LIST) + +注: 红包中奖列表 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------------------------------- | ---- | +| cmd | str | `POPULARITY_RED_POCKET_WINNER_LIST` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ----- | -------- | ---- | +| lot_id | num | 红包 ID | | +| total_num | num | 礼物总数 | | +| winner_info | array | 中奖信息 | | +| awards | obj | 礼物信息 | | +| version | num | | | + +`data.winner_info` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ----- | ------------ | ---- | +| 0 | array | 中奖者 1 | | +| …… | array | …… | | +| n | array | 中奖者 (n+1) | | + +`data.winner_info[n]` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ---------------------- | ---- | +| 0 | num | 该抢到红包的用户的 mid | | +| 1 | str | 该抢到红包的用户的名称 | | +| 2 | num | bag_id? | | +| 3 | num | 该用户抢到的礼物的 ID | | + +`data.awards` 对象: + +以 礼物 ID 为键, JSON Object 为值的表 + +`data.awards['?']` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------ | ---- | +| award_type | num | 奖品类型? | | +| award_name | str | 礼物名称 | | +| award_pic | str | 礼物图标 URL | | +| award_big_pic | str | 礼物大图 URL | | +| award_price | num | 礼物价值 | | + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "POPULARITY_RED_POCKET_WINNER_LIST", + "data": { + "lot_id": 8445764, + "total_num": 8, + "winner_info": [ + [ + 38554435, + "我的0019", + 4581509, + 31212 + ], + [ + 516174930, + "云来海遛鸟大爷", + 4606389, + 31212 + ] + ], + "awards": { + "31212": { + "award_type": 1, + "award_name": "打call", + "award_pic": "https://s1.hdslb.com/bfs/live/461be640f60788c1d159ec8d6c5d5cf1ef3d1830.png", + "award_big_pic": "https://i0.hdslb.com/bfs/live/9e6521c57f24c7149c054d265818d4b82059f2ef.png", + "award_price": 500 + }, + "31214": { + "award_type": 1, + "award_name": "牛哇", + "award_pic": "https://s1.hdslb.com/bfs/live/91ac8e35dd93a7196325f1e2052356e71d135afb.png", + "award_big_pic": "https://i0.hdslb.com/bfs/live/3b74c117b4f265edcea261bc5608a58d3a7c300a.png", + "award_price": 100 + }, + "31216": { + "award_type": 1, + "award_name": "i了i了", + "award_pic": "https://s1.hdslb.com/bfs/live/1157a445487b39c0b7368d91b22290c60fa665b2.png", + "award_big_pic": "https://i0.hdslb.com/bfs/live/cfb9c3d9bdd2c25c95b7d859ebaa590ca9362adb.png", + "award_price": 100 + } + }, + "version": 1 + } +} +``` + +</details> + +#### 直播间看过人数 (WATCHED_CHANGE) + +注: 当前直播历史观众数量, 可替代人气 + +**正文:** + +数据包的正文, 前19字节的信息未知: + +```text +00000001: 8b38 8000 0000 7200 1000 0000 0000 0500 .8....r......... +00000002: 0000 00 ... +``` + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------------- | ---- | +| cmd | str | `WATCHED_CHANGE` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ------------- | ---- | +| num | num | 看过人数 | | +| text_small | str | 显示文字 (小) | | +| text_large | str | 显示文字 (大) | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "WATCHED_CHANGE", + "data": { + "num": 17903, + "text_small": "1.7万", + "text_large": "1.7万人看过" + } +} +``` + +</details> + +#### 用户进场特效 (ENTRY_EFFECT) + +注: 有进场特效的用户进入直播间 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| cmd | str | `ENTRY_EFFECT` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------------- | ----- | ---------------- | ---- | +| id | num | ? | | +| uid | num | 进场用户 mid | | +| target_id | num | 主播 mid? | | +| mock_effect | num | ? | | +| face | str | 进场用户头像 URL | | +| privilege_type | num | ? | | +| copy_writing | str | 进场欢迎文本 | | +| copy_color | str | 进场欢迎文本颜色 | 16 进制 | +| highlight_color | str | 高亮颜色? | 16 进制 | +| priority | num | 优先级? | | +| basemap_url | str | 进场特效背景 URL | APP 端 | +| show_avatar | num | 是否显示用户头像 | 1: 显示<br/>0: 不显示 | +| web_basemap_url | str | 进场特效背景 URL | 网页端 | +| web_effective_time | num | 进场特效生存时间 | 网页端 | +| web_effect_close | num | ? | | +| web_close_time | num | ? | | +| business | num | ? | | +| copy_writing_v2 | str | 进场欢迎文本 | APP 端? | +| icon_list | array | 空? | | +| max_delay_time | num | 最大等待时间? | | +| trigger_time | num | 触发时间戳 | UNIX 纳秒时间戳 | +| identities | num | 标识符? | | +| effect_silent_time | num | ? | | +| effective_time_new | num | ? | | +| web_dynamic_url_webp | str | ? | | +| web_dynamic_url_apng | str | ? | | +| mobile_dynamic_url_webp | str | ? | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ENTRY_EFFECT", + "data": { + "id": 4, + "uid": 489893482, + "target_id": 27717502, + "mock_effect": 0, + "face": "https://i0.hdslb.com/bfs/face/member/noface.jpg", + "privilege_type": 3, + "copy_writing": "欢迎舰长 <%天使雨晰%> 进入直播间", + "copy_color": "#ffffff", + "highlight_color": "#E6FF00", + "priority": 1, + "basemap_url": "https://i0.hdslb.com/bfs/live/mlive/11a6e8eb061c3e715d0a6a2ac0ddea2faa15c15e.png", + "show_avatar": 1, + "effective_time": 2, + "web_basemap_url": "https://i0.hdslb.com/bfs/live/mlive/11a6e8eb061c3e715d0a6a2ac0ddea2faa15c15e.png", + "web_effective_time": 2, + "web_effect_close": 0, + "web_close_time": 0, + "business": 1, + "copy_writing_v2": "欢迎舰长 <%天使雨晰%> 进入直播间", + "icon_list": [], + "max_delay_time": 7, + "trigger_time": 1673625604373633300, + "identities": 6, + "effect_silent_time": 0, + "effective_time_new": 0, + "web_dynamic_url_webp": "", + "web_dynamic_url_apng": "", + "mobile_dynamic_url_webp": "" + } +} +``` + +</details> + +#### 全屏特效 (FULL_SCREEN_SPECIAL_EFFECT) + +**示例:** + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "cmd": "FULL_SCREEN_SPECIAL_EFFECT", + "data": { + "type": 2, + "ids": [ + 514 + ], + "queue": 2, + "platform_in": [ + 1, + 2 + ] + } +} +``` + +</details> + +#### 直播间在所属分区的排名改变 (AREA_RANK_CHANGED) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `AREA_RANK_CHANGED` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------------ | ---- | +| conf_id | num | 配置 ID? | | +| rank_name | str | 排行榜名称 | | +| uid | num | 主播 mid | | +| rank | num | 直播间在分区的排名 | 没有上榜则为 0 | +| icon_url_blue | str | 蓝色排名图标 URL | | +| icon_url_pink | str | 粉色排名图标 URL | | +| icon_url_grey | str | 灰色排名图标 URL | | +| action_type | num | ? | | +| timestamp | num | 当前时间 | UNIX 秒级时间戳 | +| msg_id | str | ? | 一串 UUID | +| jump_url_link | str | 排行榜跳转链接 | | +| jump_url_pc | str | 排行榜跳转链接 | | +| jump_url_pink | str | 排行榜跳转链接 | | +| jump_url_web | str | 排行榜跳转链接 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "AREA_RANK_CHANGED", + "data": { + "conf_id": 23, + "rank_name": "手游航海", + "uid": 27717502, + "rank": 4, + "icon_url_blue": "https://i0.hdslb.com/bfs/live/18e2990a546d33368200f9058f3d9dbc4038eb5c.png", + "icon_url_pink": "https://i0.hdslb.com/bfs/live/a6c490c36e88c7b191a04883a5ec15aed187a8f7.png", + "icon_url_grey": "https://i0.hdslb.com/bfs/live/cb7444b1faf1d785df6265bfdc1fcfc993419b76.png", + "action_type": 1, + "timestamp": 1673625610, + "msg_id": "e93c7860-b901-41ca-aad8-fe538a5fac9c", + "jump_url_link": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=3&ruid=27717502&conf_id=23&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0#/area-rank", + "jump_url_pc": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=4&ruid=27717502&conf_id=23&pc_ui=338,465,f4eefa,0#/area-rank", + "jump_url_pink": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=1&ruid=27717502&conf_id=23&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0#/area-rank", + "jump_url_web": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=2&ruid=27717502&conf_id=23#/area-rank" + } +} +``` + +</details> + +#### 广播通知弹幕信息 (COMMON_NOTICE_DANMAKU) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `COMMON_NOTICE_DANMAKU` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | --- | ------ | --------- | +| biz_id | num | 待调查 | | +| content_segments | array | 文本分段 | | +| danmaku_style | obj | 文本样式信息 | | +| danmaku_url | str | 待调查 | | +| dmscore | num | 待调查 | | +| terminals | array | 待调查 | | + +`data.content_segments[n]` 数组中的对象 + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | --- | ------ | --------- | +| font_color | str | text 字段的十六进制颜色值 | | +| font_color_dark | str | text 字段的十六进制颜色值 | APP端设置为深色模式时使用 | +| text | str | 文本 | | +| type | num | 待调查 | | + +`data.danmaku_style` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | --- | ------ | --------- | +| background_color | str | 文本背景颜色的十六进制颜色值 | | +| background_color_dark | str | 文本背景颜色的十六进制颜色值 | APP端设置为深色模式时使用 | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "COMMON_NOTICE_DANMAKU", + "data": { + "content_segments": [ + { + "font_color": "#FB7299", + "text": "春日限时任务:任务即将结束,抓紧完成获取3元红包奖励吧!未完成任务进度将重置", + "type": 1 + } + ], + "dmscore": 144, + "terminals": [ + 1, + 2, + 3, + 4, + 5 + ] + } +} +``` + +```json +{ + "cmd": "COMMON_NOTICE_DANMAKU", + "data": { + "biz_id": 0, + "content_segments": [ + { + "font_color": "#CCCCCC", + "font_color_dark": "#CCCCCC", + "text": "恭喜主播 时雨ioo ", + "type": 1 + }, + { + "font_color": "#F494AF", + "font_color_dark": "#F494AF", + "text": "成为手游航海当前第5名", + "type": 1 + } + ], + "danmaku_style": { + "background_color": null, + "background_color_dark": null + }, + "danmaku_uri": "", + "dmscore": 144, + "terminals": [ + 1, + 2, + 3 + ] + } +} +``` + +</details> + +#### 直播间信息更改 (ROOM_CHANGE) + +注: 例如直播间标题更改、直播间分区更改 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `ROOM_CHANGE` | | +| data | obj | | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | --- | ------ | --------- | +| title | str | 直播间标题 | | +| area_id | num | 当前直播间所属二级分区的ID | | +| parent_area_id | num | 当前直播间所属一级分区的ID | | +| area_name | str | 当前直播间所属二级分区的名称 | | +| parent_area_name | str | 当前直播间所属一级分区名称 | | +| live_key | str | 标记直播场次的key | 未开播更新直播间信息时为`"0"` | +| sub_session_key | str | 待调查 | 未开播更新直播间信息时为`""`(空字符串) | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +已开播: + +```json +{ + "cmd": "ROOM_CHANGE", + "data": { + "title": "开始白给CS", + "area_id": 371, + "parent_area_id": 9, + "area_name": "虚拟主播", + "parent_area_name": "虚拟主播", + "live_key": "320830629635915849", + "sub_session_key": "320830629635915849sub_time:1673690546" + } +} +``` + +未开播: + +```json +{ + "cmd": "ROOM_CHANGE", + "data": { + "title": "随缘", + "area_id": 216, + "parent_area_id": 6, + "area_name": "我的世界", + "parent_area_name": "单机游戏", + "live_key": "0", + "sub_session_key": "" + } +} +``` + +</details> + +#### 直播间内容审核报告 (ROOM_CONTENT_AUDIT_REPORT) + +注:这个数据包需要更新直播间标题且使用主播的登录信息才会下发,更新直播间标题后一般不会立刻下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ROOM_CONTENT_AUDIT_REPORT` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| audit_content_type | num | 审核内容类型? | | +| room\_id | num | 直播间ID | 未知是真实ID还是短号 | +| anchor\_uid | num | 主播的用户mid | | +| audit\_status | num | 审核状态? | | +| audit\_title | str | 被审核的直播间标题 | | +| audit\_reason | str | 审核结果 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ROOM_CONTENT_AUDIT_REPORT", + "data": { + "audit_content_type": 1, + "room_id": 1899237171, + "anchor_uid": 438160221, + "audit_status": 2, + "audit_title": "崩坏学园2", + "audit_reason": "一审通过" + } +} +``` + +</details> + +#### 醒目留言按钮 (SUPER_CHAT_ENTRANCE) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `SUPER_CHAT_ENTRANCE` | | +| data | obj | 醒目留言按钮的信息 | | +| roomid | num | 直播间ID | 未知是短号还是真实ID | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | --- | ------ | --------- | +| status | num | 待调查 | | +| jump_url | str | 按下“醒目留言”按钮后弹出小窗的页面URL | | +| icon | str | “醒目留言”按钮图标的URL | | +| broadcast_type | num | 待调查 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "SUPER_CHAT_ENTRANCE", + "data": { + "status": 1, + "jump_url": "https://live.bilibili.com/p/html/live-app-superchat2/index.html?is_live_half_webview=1&hybrid_half_ui=1,3,100p,70p,ffffff,0,30,100;2,2,375,100p,ffffff,0,30,100;3,3,100p,70p,ffffff,0,30,100;4,2,375,100p,ffffff,0,30,100;5,3,100p,60p,ffffff,0,30,100;6,3,100p,60p,ffffff,0,30,100;7,3,100p,60p,ffffff,0,30,100", + "icon": "https://i0.hdslb.com/bfs/live/0a9ebd72c76e9cbede9547386dd453475d4af6fe.png", + "broadcast_type": 1 + }, + "roomid": "8618057" +} +``` + +</details> + +#### 顶部横幅 (WIDGET_BANNER) + +注: 网页端在直播间标题下面的横幅, 例如 限时任务 等 + +**JSON消息:** + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `WIDGET_BANNER` | | +| data | obj | 横幅信息 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| timestamp | num | 服务器发送数据包时的Unix时间戳 | | +| widget_list | obj | 横幅信息 | 待调查 | + +`data.widget_list` 对象: + +以 横幅 ID 为键, JSON Object 为值的表 + +`data.widget_list['?']` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| id | num | 横幅ID | | +| title | str | 待调查 | | +| cover | str | 待调查 | | +| web_cover | str | 待调查 | | +| tip_text | str | 待调查 | | +| tip_text_color | str | 待调查 | | +| tip_bottom_color | str | 待调查 | | +| jump_url | str | 点击横幅后出现小窗的页面的URL | | +| url | str | 待调查 | | +| stay_time | num | 待调查 | | +| site | num | 待调查 | | +| platform_in | array | 待调查 | | +| type | num | 待调查 | | +| band_id | num | 待调查 | | +| sub_key | str | 待调查 | | +| sub_data | str | 横幅数据 | | +| is_add | bool | 待调查 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "WIDGET_BANNER", + "data": { + "timestamp": 1673684868, + "widget_list": { + "308": { + "id": 308, + "title": "一月限时任务", + "cover": "", + "web_cover": "", + "tip_text": "限时任务", + "tip_text_color": "", + "tip_bottom_color": "", + "jump_url": "https://live.bilibili.com/activity/live-activity-battle/index.html?app_name=time_limited_task_jan_2023&is_live_half_webview=1&hybrid_rotate_d=1&hybrid_half_ui=1,3,100p,70p,0,0,0,0,12,0;2,2,375,100p,0,0,0,0,12,0;3,3,100p,70p,0,0,0,0,12,0;4,2,375,100p,0,0,0,0,12,0;5,3,100p,70p,0,0,0,0,12,0;6,3,100p,70p,0,0,0,0,12,0;7,3,100p,70p,0,0,0,0,12,0;8,3,100p,70p,0,0,0,0,12,0&room_id=8618057&uid=29857468#/", + "url": "", + "stay_time": 5, + "site": 1, + "platform_in": [ + "live", + "blink", + "live_link", + "web", + "pc_link" + ], + "type": 1, + "band_id": 101558, + "sub_key": "", + "sub_data": "%7B%22task_status%22%3A0%2C%22current_val%22%3A10%2C%22target_val%22%3A1200%2C%22timeout%22%3A1673687024%2C%22reward_price%22%3A8%2C%22reward_type%22%3A1%7D", + "is_add": true + } + } + } +} +``` + +</details> + +#### 礼物心愿单进度 (WIDGET_WISH_LIST) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `WIDGET_WISH_LIST` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| wish | array | 礼物心愿单信息 | | +| wish_status | num | ? | | +| sid | num | ? | | +| wish_status_info | array | ? | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "WIDGET_WISH_LIST", + "data": { + "wish": [ + { + "type": 3, + "gift_id": 10003, + "gift_name": "舰长", + "gift_img": "https://i0.hdslb.com/bfs/live/f1be2a2d5b227ce72641de1ad64bcc7f9e4111c3.png", + "gift_price": 198000, + "target_num": 5, + "current_num": 0 + }, + { + "type": 2, + "gift_id": 3, + "gift_name": "B坷垃", + "gift_img": "https://s1.hdslb.com/bfs/live/cc8bfcbc24c8b65937f62ce0d16b31ab987dce47.png", + "gift_price": 9900, + "target_num": 5, + "current_num": 0 + }, + { + "type": 2, + "gift_id": 31039, + "gift_name": "牛哇牛哇", + "gift_img": "https://s1.hdslb.com/bfs/live/b8a38b4bd3be120becddfb92650786f00dffad48.png", + "gift_price": 100, + "target_num": 10, + "current_num": 0 + } + ], + "wish_status": 1, + "sid": 477, + "wish_status_info": [ + { + "wish_status_msg": "设定心 愿", + "wish_status_img": "https://i0.hdslb.com/bfs/live/38f82bac32794e79776f7371269453652bd58a87.png", + "wish_status": 0 + }, + { + "wish_status_msg": "达成", + "wish_status_img": "https://i0.hdslb.com/bfs/live/1dae635924437239fc69e561a1a9467508521249.png", + "wish_status": 2 + }, + { + "wish_status_msg": "收集失败", + "wish_status_img": "https://i0.hdslb.com/bfs/live/3bbd30fdd32d085cc90e9ccd98c65a886dca9a8f.png", + "wish_status": 3 + } + ], + "wish_name": "心愿" + } +} +``` + +</details> + +#### 下播的直播间 (STOP_LIVE_ROOM_LIST) + +注: 估计是更新关注的主播直播状态的 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| cmd | str | `STOP_LIVE_ROOM_LIST` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | --------- | +| room_id_list | array | 下播的直播间ID | | + +`data.room_id_list` 数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ---- | ---- | +| 0 | num | 第 1 个下播的直播间 ID | | +| 1 | num | 第 2 个下播的直播间 ID | | +| …… | num | …… | | +| n | num | 第 (n+1) 个下播的直播间 ID | | + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "STOP_LIVE_ROOM_LIST", + "data": { + "room_id_list": [ + 14507570, 23963084, 24370437, 24380902, 24889494, + 22735090, 24268758, 24668544, 38325, 24762357, + 3222966, 6684395, 24199566, 24864470, 10224194, + 14953052, 6198131, 898214, 10412034, 22506883, + 23932516, 6768714, 24392281, 1799500, 22392518, + 22976729, 21557043, 24896092, 11718936, 21612704, + 21778117, 24145539, 23178318, 23575414, 24842462, + 22245210, 24895499, 3133873, 1298898, 22175308, + 3600684, 2053035, 270652, 24877480, 3854611, + 21512488, 24393104, 24756457, 4630683, 6955412, + 23199465, 2880481, 23868339, 717791, 24068307, + 24875243, 22777819, 24896061, 24619665 + ] + } +} +``` + +</details> + +#### 系统信息 (SYS_MSG) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `SYS_MSG` | | +| msg | str | 提示信息 | | +| url | str | 跳转 URL | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "SYS_MSG", + "msg": "争夺开启,时间周五20点至周日20点,逾期不候哟!", + "url": "" +} +``` + +</details> + +#### 警告 (WARNING) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `WARNING` | | +| msg | str | 警告信息 | | +| roomid | num | 直播间 ID | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "WARNING", + "msg": "图片内容不适宜,请立即调整", + "roomid": 22195814 +} +``` + +</details> + +#### 切断 (CUT_OFF) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `CUT_OFF` | | +| msg | str | 切断原因 | | +| roomid | num | 直播间 ID | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "CUT_OFF", + "msg": "违反直播言论规范,请立即调整", + "roomid": 23993070 +} +``` + +</details> + +#### 切断V2 (CUT_OFF_V2) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `CUT_OFF_V2` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cut_off_scene | num | | | +| timestamp | num | 操作时间戳 | UNIX 秒时间戳 | +| cut_off_version | num | 切断提示信息版本? | | +| cut_off_data | obj | 切断提示信息 | | + +`data.cut_off_data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cut_off_title | str | 对话框窗口标题 | | +| cut\_off\_message\_list | array | 对话框正文列表 | | +| cut\_off\_tip\_list | array | 对话框提示信息列表 | | +| cut\_off\_button\_list | array | 对话框按钮列表 | | + +`data.cut_off_data.cut_off_message_list` 数组: + +| 索引 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| 0 | obj | 首个正文信息 | | +| … | obj | 单个正文信息 | | +| i | obj | 最后正文信息 | | + +`data.cut_off_data.cut_off_message_list[i]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| type | num | 显示类别 | `1`:一个“`label`:`content`”格式的信息 | +| label | str | 标签 | | +| content | str | 内容 | | + +`data.cut_off_data.cut_off_tip_list` 数组: + +| 索引 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| 0 | obj | 首个提示行信息 | | +| … | obj | 单个提示行信息 | | +| i | obj | 最后提示行信息 | | + +`data.cut_off_data.cut_off_tip_list[i]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| show\_platform | array | 要在哪个客户端显示的指代 | | +| message_list | array | 提示信息列表 | | + +`data.cut_off_data.cut_off_tip_list[i].message_list` 数组: + +| 索引 | 类型 | 内容 | 备注 | +|:---:| --- | --- | --- | +| 0 | obj | 首个提示组件信息 | | +| … | obj | 单个提示组件信息 | | +| i1 | obj | 最后提示组件信息 | | + +`data.cut_off_data.cut_off_tip_list[i].message_list[i1]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| type | num | 显示类型 | `1`:纯文本<br />`2`:链接 | +| content | str | 显示文本 | | +| link_url | str | 链接 | type为2时有内容 | + +`data.cut_off_data.cut_off_button_list` 数组: + +| 索引 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| 0 | obj | 首个按钮信息 | | +| … | obj | 单个按钮信息 | | +| i | obj | 最后按钮信息 | | + +`data.cut_off_data.cut_off_button_list[i]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| show_platform | array | 要在那个客户端显示的指代 | `1`和`2`可能是手机直播姬<br />`3`和`4`可能是pc直播姬或网页直播姬 | +| button\_text | str | 按钮文本 | | +| button\_action | num | 按钮操作 | `1`:关闭窗口?<br />`2`:跳转到链接? | +| button_link_url | str | 跳转链接 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "CUT_OFF_V2", + "data": { + "cut_off_scene": 1, + "timestamp": 1731590280, + "cut_off_version": 1, + "cut_off_data": { + "cut_off_title": "违规提示", + "cut_off_message_list": [ + { + "type": 1, + "label": "处罚结果", + "content": "切断本场直播" + }, + { + "type": 1, + "label": "违规原因", + "content": "您本场直播存在挂机、录播等消极直播行为,因此直播被切断,请您及时整改" + }, + { + "type": 1, + "label": "处罚时间", + "content": "2024年11月14日21时17分" + } + ], + "cut_off_tip_list": [ + { + "show_platform": [ + 3, + 4 + ], + "message_list": [ + { + "type": 1, + "content": "请在", + "link_url": "" + }, + { + "type": 2, + "content": "【处罚中心】", + "link_url": "https://link.bilibili.com/p/center/index?my-room/violation-records#/my-room/violation-records" + }, + { + "type": 1, + "content": "查看你的违规记录", + "link_url": "" + } + ] + } + ], + "cut_off_button_list": [ + { + "show_platform": [ + 1, + 2 + ], + "button_text": "了解详情", + "button_action": 2, + "button_link_url": "https://live.bilibili.com/p/html/live-anchor-galaxy/violation_records/mobile.html?-Abrowser=live&is_live_webview=1" + }, + { + "show_platform": [ + 3, + 4 + ], + "button_text": "我知道了", + "button_action": 1, + "button_link_url": "" + } + ] + } + } +} +``` + +</details> + +#### 直播对话框 (ANCHOR_ECOLOGY_LIVING_DIALOG) + +注:推测在自动检测到画面不怎么变化且没人聊天时警告下发,见[#1139(issue正文)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1139#issue-2657488653)。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ANCHOR_ECOLOGY_LIVING_DIALOG` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| dialog\_scene | num | | | +| timestamp | num | 触发时间戳 | UNIX 秒时间戳 | +| valid_timestamp | num | | | +| dialog\_top\_vertical\_img | str | | | +| dialog\_top\_landscape_img | str | | | +| dialog\_title | str | 对话框标题 | | +| dialog_message_list | array | 对话框正文列表 | 参见`CUT_OFF_V2` | +| dialog_tip_list | array | 对话框提示信息列表 | 参见`CUT_OFF_V2` | +| dialog_button_list | array | 对话框按钮列表 | 参见`CUT_OFF_V2` | + +`data.dialog_message_list` 数组: + +同`CUT_OFF_V2`的`data.cut_off_data.cut_off_message_list`数组。 + +`data.dialog_tip_list` 数组: + +同`CUT_OFF_V2`的`data.cut_off_data.cut_off_tip_list`数组。 + +`data.dialog_button_list` 数组: + +同`CUT_OFF_V2`的`data.cut_off_data.cut_off_button_list`数组。 + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ANCHOR_ECOLOGY_LIVING_DIALOG", + "data": { + "dialog_scene": 1, + "timestamp": 1731504845, + "valid_timestamp": 0, + "dialog_top_vertical_img": "https://i0.hdslb.com/bfs/live/ee359d3e89bb044914f72a557a4ac2d3b5ba4004.png", + "dialog_top_landscape_img": "https://i0.hdslb.com/bfs/live/ee359d3e89bb044914f72a557a4ac2d3b5ba4004.png", + "dialog_title": "直播间违规", + "dialog_message_list": [ + { + "type": 1, + "label": "处罚结果", + "content": "警告" + }, + { + "type": 1, + "label": "违规原因", + "content": "您本场直播存在挂机、录播等消极直播行为,请及时整改" + }, + { + "type": 1, + "label": "处罚时间", + "content": "2024年11月13日21时34分" + } + ], + "dialog_tip_list": [ + { + "show_platform": [ + 1, + 2 + ], + "message_list": [ + { + "type": 1, + "content": "请在", + "link_url": "" + }, + { + "type": 2, + "content": "【处罚中心】", + "link_url": "https://live.bilibili.com/p/html/live-anchor-galaxy/violation_records/mobile.html?is_live_half_webview=1u0026hybrid_rotate_d=1u0026is_cling_player=1u0026hybrid_half_ui=1,3,100p,70p,0,1,30,100;2,2,375,100p,0,1,30,100;3,3,100p,70p,0,1,30,100;4,2,375,100p,0,1,30,100;5,3,100p,70p,0,1,30,100;6,3,100p,70p,0,1,30,100;7,3,100p,70p,0,1,30,100;8,3,100p,70p,0,1,30,100#/" + }, + { + "type": 1, + "content": "查看你的违规记录", + "link_url": "" + } + ] + }, + { + "show_platform": [ + 3, + 4 + ], + "message_list": [ + { + "type": 1, + "content": "请在", + "link_url": "" + }, + { + "type": 2, + "content": "【处罚中心】", + "link_url": "https://link.bilibili.com/#/my-room/violation-records?jump_type=browser&app_common=open" + }, + { + "type": 1, + "content": "查看你的违规记录", + "link_url": "" + } + ] + } + ], + "dialog_button_list": [ + { + "show_platform": [ + 1, + 2, + 3, + 4 + ], + "button_text": "我知道了", + "button_action": 1, + "button_link_url": "" + } + ] + } +} +``` + +</details> + +#### 直播间背景图片修改 (CHANGE_ROOM_INFO) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `CHANGE_ROOM_INFO` | | +| background | str | 背景图 URL | | +| roomid | num | 直播间 ID | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "CHANGE_ROOM_INFO", + "background": "https://i0.hdslb.com/bfs/live/2388faed3728f3396052273ad4c3c9af21c411fc.jpg", + "roomid": 23993070 +} +``` + +</details> + +#### 直播间皮肤变更 (ROOM_SKIN_MSG) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ROOM_SKIN_MSG` | | +| skin_id | num | 皮肤 ID | | +| status | num | 状态? | | +| end_time | num | 皮肤结束时间? | UNIX 秒级时间戳 | +| current_time | num | 当前时间 | UNIX 秒级时间戳 | +| only_local | bool | 仅在本地显示? | | +| scatter | obj | ? | | +| skin_config | obj | 皮肤配置 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ROOM_SKIN_MSG", + "skin_id": 353, + "status": 1, + "end_time": 1652620669, + "current_time": 1652015870, + "only_local": false, + "scatter": { + "min": 1, + "max": 200 + }, + "skin_config": { + "android": { + "1": { + "zip": "https://i0.hdslb.com/bfs/live/fab943a5d7eeb871ecf06413283d17536e67ab91.zip", + "md5": "011EBB3E14192212FD50852245DC74FA" + } + }, + "ios": { + "1": { + "zip": "https://i0.hdslb.com/bfs/live/e7d8768dcb3975d82d794fe6b39756317916a7fe.zip", + "md5": "B1223577FE9C5C248EC1326CDACF8379" + } + }, + "ipad": { + "1": { + "zip": "https://i0.hdslb.com/bfs/live/0856e17be073d75b70098609ae26572ba1534605.zip", + "md5": "481AE75FFD0E0DE91EAFB5B6E0F8936B" + } + }, + "web": { + "1": { + "zip": "https://i0.hdslb.com/bfs/live/0b3770980e600f23629c8445fd211d4a12ec4b6f.zip", + "md5": "8F98F79F02DEFE8B69EE2F6DE7416DFF", + "platform": "web", + "version": "1", + "headInfoBgPic": "https://i0.hdslb.com/bfs/live/d293e69b70af34df0fef086a86552b1761a33a75.jpg", + "giftControlBgPic": "https://i0.hdslb.com/bfs/live/1a124c5547c784f41dc3d7f65f446c56c4cbb73e.jpg", + "rankListBgPic": "https://i0.hdslb.com/bfs/live/af8580a956d0eac6ea1d2cc97ea743d435a86874.jpg", + "mainText": "#FFffffff", + "normalText": "#FFffffff", + "highlightContent": "#FFffd119", + "border": "#FFaec2ff", + "buttonText": "#FF123ab2" + } + } + } +} +``` + +</details> + +#### 开启等级禁言 (ROOM_SILENT_ON) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| data | obj | 信息本体 | | +| cmd | str | `ROOM_SILENT_ON` | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| type | str | 类型? | | +| level | num | 等级? | | +| second | num | 时间? | UNIX 秒级时间戳 | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "data": { + "type": "member", + "level": 1, + "second": 1651000426 + }, + "cmd": "ROOM_SILENT_ON" +} +``` + +</details> + +#### 关闭等级禁言 (ROOM_SILENT_OFF) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| data | obj | 信息本体 | | +| cmd | str | `ROOM_SILENT_OFF` | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| type | str | 空 | | +| level | num | 0 | | +| second | num | 0 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "data": { + "type": "", + "level": 0, + "second": 0 + }, + "cmd": "ROOM_SILENT_OFF" +} +``` + +</details> + +#### 指定观众禁言 (ROOM_BLOCK_MSG) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ROOM_BLOCK_MSG` | | +| data | obj | 详细信息 | | +| uid | num | 禁言用户 mid | | +| uname | str | 禁言用户名 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| dmscore | num | 弹幕分数? | | +| operator | num | 操作者? | | +| uid | num | 禁言用户 mid | | +| uname | str | 禁言用户名 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ROOM_BLOCK_MSG", + "data": { + "dmscore": 30, + "operator": 2, + "uid": 37903025, + "uname": "玉麟珑" + }, + "uid": "37903025", + "uname": "玉麟珑" +} +``` + +</details> + +#### 房管列表 (ROOM_ADMINS) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ROOM_ADMINS` | | +| uids | array | 房管 mid 列表 | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + cmd: "ROOM_ADMINS", + uids: [ 898424, 384203692, 1309513, 30816752, 23931549, 223134 ] +} +``` + +</details> + +#### 设立房管 (room_admin_entrance) + +注: 此处 cmd 内容为小写 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `room_admin_entrance` | | +| dmscore | num | 弹幕分数? | | +| level | num | 等级? | | +| msg | str | 提示信息 | | +| uid | num | 用户 mid | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "room_admin_entrance", + "dmscore": 45, + "level": 1, + "msg": "系统提示:你已被主播设为房管", + "uid": 223134 +} +``` + +</details> + +#### 撤销房管 (ROOM_ADMIN_REVOKE) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ROOM_ADMIN_REVOKE` | | +| msg | str | 提示信息 | | +| uid | num | 用户 mid | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ROOM_ADMIN_REVOKE", + "msg": "撤销房管", + "uid": 6791627 +} +``` + +</details> + +#### 天选时刻合法检查 (ANCHOR_LOT_CHECKSTATUS) + +**示例:** + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "cmd": "ANCHOR_LOT_CHECKSTATUS", + "data": { + "id": 2553641, + "reject_reason": "由于奖品格式不合格,请仔细检查后再提交哦", + "status": 5, + "uid": 1827176970 + } +} +``` + +</details> + +#### 天选时刻开始 (ANCHOR_LOT_START) + +**示例:** + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "cmd": "ANCHOR_LOT_START", + "data": { + "asset_icon": "https://i0.hdslb.com/bfs/live/627ee2d9e71c682810e7dc4400d5ae2713442c02.png", + "award_image": "", + "award_name": "艺术头像绘制", + "award_num": 1, + "cur_gift_num": 0, + "current_time": 1651037946, + "danmu": "卡宝下午好", + "gift_id": 3, + "gift_name": "B坷垃", + "gift_num": 1, + "gift_price": 9900, + "goaway_time": 180, + "goods_id": 15, + "id": 2553648, + "is_broadcast": 1, + "join_type": 1, + "lot_status": 0, + "max_time": 600, + "require_text": "当前主播粉丝勋章至少1级", + "require_type": 2, + "require_value": 1, + "room_id": 23614753, + "send_gift_ensure": 0, + "show_panel": 1, + "start_dont_popup": 0, + "status": 1, + "time": 599, + "url": "https://live.bilibili.com/p/html/live-lottery/anchor-join.html?is_live_half_webview=1&hybrid_biz=live-lottery-anchor&hybrid_half_ui=1,5,100p,100p,000000,0,30,0,0,1;2,5,100p,100p,000000,0,30,0,0,1;3,5,100p,100p,000000,0,30,0,0,1;4,5,100p,100p,000000,0,30,0,0,1;5,5,100p,100p,000000,0,30,0,0,1;6,5,100p,100p,000000,0,30,0,0,1;7,5,100p,100p,000000,0,30,0,0,1;8,5,100p,100p,000000,0,30,0,0,1", + "web_url": "https://live.bilibili.com/p/html/live-lottery/anchor-join.html" + } +} +``` + +</details> + +#### 天选时刻结束 (ANCHOR_LOT_END) + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ANCHOR_LOT_END", + "data": { + "id": 2553648 + } +} +``` + +</details> + +#### 天选时刻中奖者 (ANCHOR_LOT_AWARD) + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ANCHOR_LOT_AWARD", + "data": { + "award_dont_popup": 1, + "award_image": "", + "award_name": "艺术头像绘制", + "award_num": 1, + "award_users": [ + { + "uid": 8318700, + "uname": "桥下念喬", + "face": "http://i0.hdslb.com/bfs/face/dfde2ffc6286c2c5189592cc84fd70bcf977b143.jpg", + "level": 21, + "color": 5805790 + } + ], + "id": 2553648, + "lot_status": 2, + "url": "https://live.bilibili.com/p/html/live-lottery/anchor-join.html?is_live_half_webview=1&hybrid_biz=live-lottery-anchor&hybrid_half_ui=1,5,100p,100p,000000,0,30,0,0,1;2,5,100p,100p,000000,0,30,0,0,1;3,5,100p,100p,000000,0,30,0,0,1;4,5,100p,100p,000000,0,30,0,0,1;5,5,100p,100p,000000,0,30,0,0,1;6,5,100p,100p,000000,0,30,0,0,1;7,5,100p,100p,000000,0,30,0,0,1;8,5,100p,100p,000000,0,30,0,0,1", + "web_url": "https://live.bilibili.com/p/html/live-lottery/anchor-join.html" + } +} +``` + +</details> + +#### 天选时刻通知 (ANCHOR_LOT_NOTICE) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ANCHOR_LOT_NOTICE` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| notice\_type | num | 通知卡片类型? | | +| lottery\_card | obj | 通知卡片内容 | | + +`data.lottery_card` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| show\_time | num | 显示时间? | | +| button\_text | str | 按钮文本? | | +| icon | str | 图标 | | +| title | str | 标题? | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "data": { + "notice_type": 1, + "lottery_card": { + "show_time": 30, + "button_text": "去发奖", + "icon": "https://i0.hdslb.com/bfs/live/95970204111233f181fc28622502aaf1a9359b9a.png", + "title": "发天选有助于人气累积" + } + }, + "cmd": "ANCHOR_LOT_NOTICE" +} +``` + +</details> + +#### 邀请视频连线 (VIDEO_CONNECTION_JOIN_START) + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "VIDEO_CONNECTION_JOIN_START", + "data": { + "status": 1, + "invited_uid": 351686170, + "channel_id": "72057594038132685", + "invited_uname": "小妹睡不醒", + "invited_face": "http://i1.hdslb.com/bfs/face/828562203e620f711fb4c786f05996357857ed4d.jpg", + "start_at": 1651237440, + "current_time": 1651237440 + }, + "roomid": 12401854 +} +``` + +</details> + +#### 视频连线信息 (VIDEO_CONNECTION_MSG) + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "VIDEO_CONNECTION_MSG", + "data": { + "channel_id": "72057594038132685", + "current_time": 1651237440, + "dmscore": 4, + "toast": "主播发起了视频连线" + } +} +``` + +</details> + +#### 结束视频连线 (VIDEO_CONNECTION_JOIN_END) + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "VIDEO_CONNECTION_JOIN_END", + "data": { + "channel_id": "72057594038132685", + "start_at": 1651238384, + "toast": "主播 结束了与小妹睡不醒的连线.", + "current_time": 1651238384 + }, + "roomid": 22195814 +} +``` + +</details> + +#### 重连直播间? (REENTER_LIVE_ROOM) + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "REENTER_LIVE_ROOM", + "data": { + "room_id": 22195814, + "request_random_sec_range": 10, + "reason": 1 + }, + "roomid": 22195814 +} +``` + +</details> + +#### ??? (PLAY_TOGETHER) + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "PLAY_TOGETHER", + "data": { + "ruid": 29857468, + "roomid": 8618057, + "action": "switch_off", + "uid": 0, + "timestamp": 1673690546, + "message": "", + "message_type": 0, + "jump_url": "", + "web_url": "", + "apply_number": 0, + "refresh_tool": false, + "cur_fleet_num": 0, + "max_fleet_num": 0 + } +} +``` + +```json +{ + "cmd": "PLAY_TOGETHER", + "data": { + "ruid": 29857468, + "roomid": 8618057, + "action": "switch_off", + "uid": 0, + "timestamp": 1673690549, + "message": "系统提示:主播已切换分区", + "message_type": 3, + "jump_url": "", + "web_url": "", + "apply_number": 0, + "refresh_tool": true, + "cur_fleet_num": 0, + "max_fleet_num": 0 + } +} +``` + +</details> + +#### 直播小助手? (ANCHOR_BROADCAST) + +第一次达到了某种条件下发。 + +已知当在一个分区(中途不能切换)开播时长达到150、180、200、300分钟可能下发,直播间初次被分享1~2次时下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ANCHOR_BROADCAST` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| sender | str | 标题? | `直播小助手` | +| msg | str | 提示消息 | | +| platform | num | 平台标识? | `0` | +| button\_info | obj | 按钮信息? | | +| milestone\_type | str | 里程碑类型? | `session_livetime`,`first_share`,`session_share` | +| milestone\_value | num | 里程值? | | +| milestone\_index | num | 里程碑类型的索引? | `1`,`5`,`6`,`7` | + +`data.button_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| button\_name | str | | | +| blink_button_type | str | | | +| blink_button_target | str | | | +| blink_button_extra | str | | | +| blink_button_label | num | | | +| hime_button_type | str | | | +| hime_button_target | str | | | +| hime_button_extra | str | | | +| hime\_button\_h5\_type | str | | | +| hime_button_label | num | | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ANCHOR_BROADCAST", + "data": { + "sender": "直播小助手", + "msg": "恭喜你,开播时长达到180分钟!", + "platform": 0, + "button_info": { + "button_name": "", + "blink_button_type": "", + "blink_button_target": "", + "blink_button_extra": "", + "blink_button_label": 0, + "hime_button_type": "", + "hime_button_target": "", + "hime_button_extra": "", + "hime_button_h5_type": "", + "hime_button_label": 0 + }, + "milestone_type": "session_livetime", + "milestone_value": 10800, + "milestone_index": 6 + } +} +``` + +</details> + +#### 直播小助手? (ANCHOR_HELPER_DANMU) + +几乎与`ANCHOR_BROADCAST`一同下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ANCHOR_HELPER_DANMU` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| sender | str | 标题? | `直播小助手` | +| msg | str | 提示消息 | | +| platform | num | 平台标识? | | +| button\_platform | num | | | +| button\_name | str | | | +| button\_target | str | | | +| button\_label | num | | | +| report\_type | str | 上报类型? | | +| report | str | | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "ANCHOR_HELPER_DANMU", + "data": { + "sender": "直播小助手", + "msg": "恭喜你,开播时长达到150分钟!", + "platform": 3, + "button_platform": 0, + "button_name": "", + "button_target": "", + "button_label": 0, + "report_type": "milestone", + "report": "session_livetime:5:9000" + } +} +``` + +</details> + +#### 直播进度条节点标签 (PLAY_TAG) + +注: 在特定直播间的特定情况下发。 + +例如: 在[直播间6](https://live.bilibili.com/6)内,有人打出了某种操作。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `PLAY_TAG` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| tag\_id | num | 标签 ID | | +| pic | str | 标签图标 | 通常显示于进度条之上 | +| timestamp | num | UNIX 秒时间戳 | | +| type | str | 操作类型 | `ADD`:添加 | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "PLAY_TAG", + "data": { + "tag_id": 367751, + "pic": "https://i0.hdslb.com/bfs/live/0e04525fee9ea6ea6973e8bd1116d9f1f6501d37.png", + "timestamp": 1740319807, + "type": "ADD" + } +} +``` + +</details> + +#### ??? (RECALL_DANMU_MSG) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `RECALL_DANMU_MSG` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| recall_type | num | 类型? | `2` | +| target_id | num | | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "RECALL_DANMU_MSG", + "data": { + "recall_type": 2, + "target_id": 525503743 + } +} +``` + +</details> + +#### 直播剪辑 (OTHER_SLICE_LOADING_RESULT) + +注: 点击剪辑按钮后的几秒内下发,目前只有网页端有这个按钮,且部分直播间可用(2025-02-20记录)。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `OTHER_SLICE_LOADING_RESULT` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| data | array | 剪辑片段数据 | | +| live_key | str | 标记直播场次的key | 未验证真实性 | + +`data.data` 数组: + +| 索引 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| 0 | obj | 单个片段数据 | | + +`data.data[i]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| start\_time | num | 片段开始时间时间戳 | UNIX 秒时间戳 | +| end\_time | num | 片段结束时间时间戳 | UNIX 秒时间戳 | +| stream | str | 从开始时间到结束时间内的直播视频片段 | 需要使用浏览器用户代理字符串,特别是m3u文件内的视频链接 | +| type | num | 类型? | | +| ban\_ec | bool | ? | | + +**示例:** + +<details> +<summary>查看消息示例:</summary> + +```json +{ + "cmd": "OTHER_SLICE_LOADING_RESULT", + "data": { + "data": [ + { + "start_time": 1740037738, + "end_time": 1740038916, + "stream": "https://jssz-boss.hdslb.com/live2arc_anchor_video/vod_579433011406177273.m3u?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=y4zI4XTQzlOkmSKg%2F20250220%2Fjssz%2Fs3%2Faws4_request&X-Amz-Date=20250220T080858Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=52be315e8e7def8e11f86d3c6d4952362725c3c087a433780926bc0e8c88c2e1", + "type": 0, + "ban_ec": false + } + ], + "live_key": "579433011406177273" + } +} +``` + +</details> diff --git a/docs/live/recommend.md b/docs/live/recommend.md new file mode 100644 index 0000000..edbf016 --- /dev/null +++ b/docs/live/recommend.md @@ -0,0 +1,717 @@ +# 直播推荐 + +## 主页获取直播推荐 + +> https://api.live.bilibili.com/xlive/web-interface/v1/webMain/getMoreRecList + +*请求方法: GET* + +**URL 参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------ | ------ | ---------- | ------ | ---- | +| platform | string | 平台类型 | 必要 | 默认为 `web`, 实测可为任意非空串 | +| web_location | string | `333.1007` | 非必要 | | + +**JSON 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | -------- | ---- | +| code | number | 返回值 | 0: 成功 | +| message | string | 错误信息 | 默认为 `0` | +| ttl | number | 1 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------- | ------ | ------------- | -------- | +| recommend_room_list | Array | 推荐房间列表 | 套了个娃 | +| top_room_id | number | 置顶直播间号? | | + +`data` 对象中 `recommend_room_list` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------------- | -------------- | ---------------- | ---- | +| head_box | object \| null | 头像框 | 无则为 `null` | +| area_v2_id | number | 分区 ID | | +| area_v2_parent_id | number | 父分区 ID | | +| area_v2_name | string | 分区名称 | | +| area_v2_parent_name | string | 父分区名称 | | +| broadcast_type | number | 广播类型? | | +| cover | string | 封面 URL | | +| link | string | 直播间链接 | 仅 `pathname` 与 `query` 部分 | +| online | number | 观看人数 | | +| pendant_Info | object | ??? | 作用尚不明确 | +| roomid | number | 直播间 ID | | +| title | string | 直播间标题 | | +| uname | string | 主播用户名 | | +| face | string | 主播头像 URL | | +| verify | object | 认证信息 | 参见 [用户基本信息](../user/info.md) | +| uid | number | 主播用户 mid | | +| keyframe | string | 关键帧 URL | | +| is_auto_play | number | 是否自动播放? | | +| head_box_type | number | 头像框类型? | | +| flag | number | 标记? | 作用尚不明确 | +| session_id | string | 会话 ID? | 格式为: 本次请求相同的小写无分隔 UUID + 下划线 + 大写以连字符分隔的 UUID | +| show_callback | string | 展示回调 URL? | | +| click_callback | string | 点击回调 URL? | | +| special_id | number | 特殊 ID? | 作用尚不明确 | +| watched_show | object | 观看展示 | 见下 | +| is_nft | number | 是否为 NFT 头像? | | +| nft_dmark | string | ??? | 作用尚不明确 | +| is_ad | boolean | 是否为广告 | | +| ad_transparent_content | unknown | ??? | 作用尚不明确 | +| show_ad_icon | boolean | 显示广告图标 | | +| status | boolean | 状态? | 作用尚不明确 | +| followers | number | 0 | 作用尚不明确 | + +`recommend_room_list` 数组中的对象中的 `watched_show` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ------- | -------- | ---- | +| switch | boolean | ??? | 作用尚不明确 | +| num | number | 看过人数 | | +| text_small | string | 小文本 | xxx | +| text_large | string | 大文本 | xxx人看过 | +| icon | string | 图标 URL | 浅色线条眼睛图标 | +| icon_location | number | 0 | | +| icon_web | string | 图标 URL | 深色线条眼睛图标 (Web 端) | + +**示例:** + +```shell +curl -G 'https://api.live.bilibili.com/xlive/web-interface/v1/webMain/getMoreRecList' \ +--url-query 'platform=web' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "recommend_room_list": [ + { + "head_box": null, + "area_v2_id": 237, + "area_v2_parent_id": 6, + "area_v2_name": "怀旧游戏", + "area_v2_parent_name": "单机游戏", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/34aedc9409c0abaf622fdb9c6137896b8a9f95d0.jpg", + "link": "/923833?hotRank=0", + "online": 262700, + "pendant_Info": {}, + "roomid": 923833, + "title": "融合版斗蛐蛐s3.5赛季!", + "uname": "沉默寡言白河愁", + "face": "https://i0.hdslb.com/bfs/face/14169798ca31108e4441e790c14b24706def67a3.jpg", + "verify": { + "role": 1, + "desc": "bilibili 知名游戏UP主、直播高能主播", + "type": 0 + }, + "uid": 34646754, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071535000000923833okbn8y.jpg", + "is_auto_play": 1, + "head_box_type": 0, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_9A44BEBD-CAEB-46AD-8FD7-B91BA8471EAA", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_9A44BEBD-CAEB-46AD-8FD7-B91BA8471EAA&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=923833&parent_id=6&area_id=237&page=0&position=1&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_9A44BEBD-CAEB-46AD-8FD7-B91BA8471EAA&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=923833&parent_id=6&area_id=237&page=0&position=1&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 30460, + "text_small": "3.0万", + "text_large": "3.0万人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": { + "name": "大乱斗乱斗之王", + "value": "https://i0.hdslb.com/bfs/live/fc28a2a4123154012e0ce3da1273de5f17e81b24.png", + "desc": "" + }, + "area_v2_id": 817, + "area_v2_parent_id": 5, + "area_v2_name": "男声电台", + "area_v2_parent_name": "电台", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/b15e3a1045321a7ffa7da08a47a276ca37557ef1.jpg", + "link": "/32190922?hotRank=0", + "online": 45487, + "pendant_Info": { + "2": { + "type": "mobile_index_badge", + "name": "福佑嘉年", + "position": 2, + "text": "省级亚军", + "bg_color": "#FB9E60", + "bg_pic": "http://i0.hdslb.com/bfs/live/13819a59895263cb25cc2ead3fecfaa3e864aac8.png", + "pendant_id": 1750, + "priority": 200, + "created_at": 1738512313 + } + }, + "roomid": 32190922, + "title": "我想我们会幸福美满", + "uname": "黑羊Klein", + "face": "https://i2.hdslb.com/bfs/face/307c62a8b30a6dcfc02e9670e5dc10d0ecec6921.jpg", + "verify": { + "role": 0, + "desc": "", + "type": -1 + }, + "uid": 1989648419, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071536000032190922ma6cnx.jpg", + "is_auto_play": 0, + "head_box_type": 1, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_178A3B8F-86C1-4831-9DBB-9788C2445752", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_178A3B8F-86C1-4831-9DBB-9788C2445752&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=32190922&parent_id=5&area_id=817&page=0&position=2&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_178A3B8F-86C1-4831-9DBB-9788C2445752&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=32190922&parent_id=5&area_id=817&page=0&position=2&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 491, + "text_small": "491", + "text_large": "491人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": null, + "area_v2_id": 654, + "area_v2_parent_id": 2, + "area_v2_name": "诛仙世界", + "area_v2_parent_name": "网游", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/fdad2cfb408510df56a01af66254f630ee4b86b8.jpg", + "link": "/25959685?hotRank=0", + "online": 2151, + "pendant_Info": {}, + "roomid": 25959685, + "title": "免费接所有职业,死灵渊!只要收益", + "uname": "哦-是大一啊", + "face": "https://i1.hdslb.com/bfs/face/f83290ab5667f9c1ed778fb9c7c9cf6bf7624d4e.jpg", + "verify": { + "role": 0, + "desc": "", + "type": -1 + }, + "uid": 361517464, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071535000025959685tx1grb.jpg", + "is_auto_play": 1, + "head_box_type": 0, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_FB0DABE2-6A09-4EB7-8D2B-A4F892243A96", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_FB0DABE2-6A09-4EB7-8D2B-A4F892243A96&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=25959685&parent_id=2&area_id=654&page=0&position=3&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_FB0DABE2-6A09-4EB7-8D2B-A4F892243A96&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=25959685&parent_id=2&area_id=654&page=0&position=3&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 269, + "text_small": "269", + "text_large": "269人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": { + "name": "钻石传说", + "value": "https://i0.hdslb.com/bfs/live/2007dc239982e909a3c9971c27968e5c0a872917.png", + "desc": "" + }, + "area_v2_id": 192, + "area_v2_parent_id": 5, + "area_v2_name": "聊天电台", + "area_v2_parent_name": "电台", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/22f1fcac8d9764901005ae5867a8c6b589b93ac5.jpg", + "link": "/31169918?hotRank=0", + "online": 27764, + "pendant_Info": {}, + "roomid": 31169918, + "title": "东北最后的温柔", + "uname": "关关-苏苏冠", + "face": "https://i2.hdslb.com/bfs/face/14f5102417107a6535c11ec9ad99050f7d712a17.jpg", + "verify": { + "role": 0, + "desc": "", + "type": -1 + }, + "uid": 3537120278874479, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071532000031169918qep44l.jpg", + "is_auto_play": 0, + "head_box_type": 1, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_3E272538-AA76-4953-BF21-5BB19ECFEE28", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_3E272538-AA76-4953-BF21-5BB19ECFEE28&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=31169918&parent_id=5&area_id=192&page=0&position=4&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_3E272538-AA76-4953-BF21-5BB19ECFEE28&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=31169918&parent_id=5&area_id=192&page=0&position=4&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 297, + "text_small": "297", + "text_large": "297人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": null, + "area_v2_id": 82, + "area_v2_parent_id": 2, + "area_v2_name": "剑网3", + "area_v2_parent_name": "网游", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/user_cover/9551fbb571b35bac3702c47e955177f17cab5cd2.jpg", + "link": "/2849730?hotRank=0", + "online": 4008, + "pendant_Info": {}, + "roomid": 2849730, + "title": "午间陪伴花间刷币", + "uname": "o诡墨o", + "face": "https://i1.hdslb.com/bfs/face/43ab308f836eb352aa4d541b55aafab2fa4435aa.jpg", + "verify": { + "role": 0, + "desc": "", + "type": -1 + }, + "uid": 71574442, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071535000002849730qo0792.jpg", + "is_auto_play": 1, + "head_box_type": 0, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_4BAFD91A-DDED-4655-BE47-064A6152BF9B", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_4BAFD91A-DDED-4655-BE47-064A6152BF9B&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=2849730&parent_id=2&area_id=82&page=0&position=5&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_4BAFD91A-DDED-4655-BE47-064A6152BF9B&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=2849730&parent_id=2&area_id=82&page=0&position=5&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 204, + "text_small": "204", + "text_large": "204人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": { + "name": "迷梦幻境头像框", + "value": "https://i0.hdslb.com/bfs/garb/open/d272c8cdb2ab737f5aa3c1cf5a27db274e0ce034.png", + "desc": "" + }, + "area_v2_id": 744, + "area_v2_parent_id": 9, + "area_v2_name": "虚拟Singer", + "area_v2_parent_name": "虚拟主播", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/6e68e5c4f3d720e6f14952174be848383b879dad.jpg", + "link": "/21603945?hotRank=0", + "online": 10606, + "pendant_Info": {}, + "roomid": 21603945, + "title": "听歌碎碎念!~", + "uname": "Minicatty", + "face": "https://i0.hdslb.com/bfs/face/812d9ea6f3420d5c58ff455408275563f03fb861.jpg", + "verify": { + "role": 7, + "desc": "bilibili 直播高能主播", + "type": 0 + }, + "uid": 423902976, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071535000021603945pekr70.jpg", + "is_auto_play": 0, + "head_box_type": 2, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_56778C3F-4B14-4C78-8DF8-53721196E8D8", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_56778C3F-4B14-4C78-8DF8-53721196E8D8&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21603945&parent_id=9&area_id=744&page=0&position=6&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_56778C3F-4B14-4C78-8DF8-53721196E8D8&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21603945&parent_id=9&area_id=744&page=0&position=6&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 235, + "text_small": "235", + "text_large": "235人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": null, + "area_v2_id": 80, + "area_v2_parent_id": 2, + "area_v2_name": "吃鸡行动", + "area_v2_parent_name": "网游", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/fa7292a8741a40a612a1c466da58b7f9cc08f363.jpg", + "link": "/22976905?hotRank=0", + "online": 8536, + "pendant_Info": {}, + "roomid": 22976905, + "title": "全是细节!", + "uname": "菠萝鸽", + "face": "https://i1.hdslb.com/bfs/face/f073d24cbb992b4589825896de3fb9bc559ba180.jpg", + "verify": { + "role": 1, + "desc": "bilibili 知名游戏UP主、直播高能主播", + "type": 0 + }, + "uid": 1849164526, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715350000229769056wy0mu.jpg", + "is_auto_play": 1, + "head_box_type": 0, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_CE3B32EC-E84D-4545-A693-97882454E0ED", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_CE3B32EC-E84D-4545-A693-97882454E0ED&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22976905&parent_id=2&area_id=80&page=0&position=7&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_CE3B32EC-E84D-4545-A693-97882454E0ED&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22976905&parent_id=2&area_id=80&page=0&position=7&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 919, + "text_small": "919", + "text_large": "919人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": null, + "area_v2_id": 646, + "area_v2_parent_id": 10, + "area_v2_name": "生活杂谈", + "area_v2_parent_name": "生活", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/833e4d5449bcb4e425eb6399e0ef71f06903d083.jpg", + "link": "/21291747?hotRank=0", + "online": 38125, + "pendant_Info": {}, + "roomid": 21291747, + "title": "哪吒抢了封神票房?", + "uname": "陈哥惜命天涯", + "face": "https://i1.hdslb.com/bfs/face/d2c7e9c9b918ec969b2e15a5f2194bae3acd966e.jpg", + "verify": { + "role": 0, + "desc": "", + "type": -1 + }, + "uid": 286563388, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe0207153000002129174742tpke.jpg", + "is_auto_play": 0, + "head_box_type": 0, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_63BEC7F6-172E-46FC-BBAD-8CD3547AE6C1", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_63BEC7F6-172E-46FC-BBAD-8CD3547AE6C1&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21291747&parent_id=10&area_id=646&page=0&position=8&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_63BEC7F6-172E-46FC-BBAD-8CD3547AE6C1&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21291747&parent_id=10&area_id=646&page=0&position=8&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 3107, + "text_small": "3107", + "text_large": "3107人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": { + "name": "Lirin兔耳娘 收藏集", + "value": "https://i2.hdslb.com/bfs/garb/open/41e2a2e3693f49e0b721c443fd784aa533456c49.png", + "desc": "" + }, + "area_v2_id": 745, + "area_v2_parent_id": 9, + "area_v2_name": "虚拟Gamer", + "area_v2_parent_name": "虚拟主播", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/b444bc87fbe1b346184f061efaffff21b24371f1.jpg", + "link": "/23797026?hotRank=0", + "online": 13294, + "pendant_Info": {}, + "roomid": 23797026, + "title": "日v 萌新玩玩三角洲♡", + "uname": "樱咲奈央_Official", + "face": "https://i2.hdslb.com/bfs/face/163330968a4a5fc8f31e9da9e919bbc258ecf40c.jpg", + "verify": { + "role": 7, + "desc": "bilibili直播高能主播", + "type": 0 + }, + "uid": 1880188304, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715310000237970260gnmn1.jpg", + "is_auto_play": 0, + "head_box_type": 2, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_691E1F11-4960-4707-92EF-0F0D996E434C", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_691E1F11-4960-4707-92EF-0F0D996E434C&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=23797026&parent_id=9&area_id=745&page=0&position=9&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_691E1F11-4960-4707-92EF-0F0D996E434C&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=23797026&parent_id=9&area_id=745&page=0&position=9&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 999, + "text_small": "999", + "text_large": "999人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": null, + "area_v2_id": 624, + "area_v2_parent_id": 10, + "area_v2_name": "电子榨菜", + "area_v2_parent_name": "生活", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/user_cover/a8a7681eaf20e43e16444e502106a436eb0e454c.jpg", + "link": "/1831473323?hotRank=0", + "online": 6510, + "pendant_Info": {}, + "roomid": 1831473323, + "title": "粤语片-法证1", + "uname": "曦曦每天都开心呀", + "face": "https://i1.hdslb.com/bfs/face/aa2112252080ec2298ea51b129c842fea7ed58f5.jpg", + "verify": { + "role": 0, + "desc": "", + "type": -1 + }, + "uid": 1434707683, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715350018314733230k1dhu.jpg", + "is_auto_play": 0, + "head_box_type": 0, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_947BC1A4-E0F4-4ECE-AE40-9D9817848F9A", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_947BC1A4-E0F4-4ECE-AE40-9D9817848F9A&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=1831473323&parent_id=10&area_id=624&page=0&position=10&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_947BC1A4-E0F4-4ECE-AE40-9D9817848F9A&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=1831473323&parent_id=10&area_id=624&page=0&position=10&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 1446, + "text_small": "1446", + "text_large": "1446人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": { + "name": "帕里", + "value": "https://i0.hdslb.com/bfs/garb/item/7c9cd30bfab66e9490d8a03fc48754cdb12b4901.png", + "desc": "" + }, + "area_v2_id": 745, + "area_v2_parent_id": 9, + "area_v2_name": "虚拟Gamer", + "area_v2_parent_name": "虚拟主播", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/bd898138564a7e892e05dd1ff9cf9c34bdd9cb5b.jpg", + "link": "/42512?hotRank=0", + "online": 11612, + "pendant_Info": {}, + "roomid": 42512, + "title": "【文明7】使臣,你去死一下,然后我发兵", + "uname": "优礼子Ghaast", + "face": "https://i0.hdslb.com/bfs/face/e3f05d5b7bf56c57f55026676da71cc487d93988.jpg", + "verify": { + "role": 7, + "desc": "bilibili直播高能主播", + "type": 0 + }, + "uid": 6141432, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715350000000425126wxphk.jpg", + "is_auto_play": 0, + "head_box_type": 2, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_0517EBF3-EE5C-4967-A77A-9DB3F89A58A8", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_0517EBF3-EE5C-4967-A77A-9DB3F89A58A8&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=42512&parent_id=9&area_id=745&page=0&position=11&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_0517EBF3-EE5C-4967-A77A-9DB3F89A58A8&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=42512&parent_id=9&area_id=745&page=0&position=11&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 1998, + "text_small": "1998", + "text_large": "1998人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + }, + { + "head_box": { + "name": "百人舰队主播头像", + "value": "https://i0.hdslb.com/bfs/vc/071eb10548fe9bc482ff69331983d94192ce9507.png", + "desc": "" + }, + "area_v2_id": 102, + "area_v2_parent_id": 2, + "area_v2_name": "最终幻想14", + "area_v2_parent_name": "网游", + "broadcast_type": 0, + "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/9370e1bbda854c8ac3b9a2a9a6e960106f307580.jpg", + "link": "/1897222?hotRank=0", + "online": 80052, + "pendant_Info": { + "1": { + "type": "mobile_index_badge", + "name": "百人成就", + "position": 1, + "text": "", + "bg_color": "#FB9E60", + "bg_pic": "https://i0.hdslb.com/bfs/live/539ce26c45cd4019f55b64cfbcedc3c01820e539.png", + "pendant_id": 426, + "priority": 1, + "created_at": 1738857680 + } + }, + "roomid": 1897222, + "title": "鸟区pvp", + "uname": "猫姐姐nya", + "face": "https://i1.hdslb.com/bfs/face/acc5559db9494af780b05fbf05c158995c48d023.jpg", + "verify": { + "role": 1, + "desc": "bilibili 知名游戏UP主", + "type": 0 + }, + "uid": 41377819, + "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715360000018972225sqtbh.jpg", + "is_auto_play": 1, + "head_box_type": 1, + "flag": 0, + "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_93F5FBE6-4F84-40C9-AEA1-149E9D5D366E", + "group_id": 1000217, + "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_93F5FBE6-4F84-40C9-AEA1-149E9D5D366E&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=1897222&parent_id=2&area_id=102&page=0&position=12&platform=web", + "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_93F5FBE6-4F84-40C9-AEA1-149E9D5D366E&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=1897222&parent_id=2&area_id=102&page=0&position=12&platform=web", + "special_id": 0, + "watched_show": { + "switch": true, + "num": 2930, + "text_small": "2930", + "text_large": "2930人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": 0, + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + }, + "is_nft": 0, + "nft_dmark": "", + "is_ad": false, + "ad_transparent_content": null, + "show_ad_icon": false, + "status": false, + "followers": 0 + } + ], + "top_room_id": 0 + } +} +``` + +</details> diff --git a/docs/live/redpocket.md b/docs/live/redpocket.md new file mode 100644 index 0000000..aafb1ff --- /dev/null +++ b/docs/live/redpocket.md @@ -0,0 +1,126 @@ +# 直播间人气红包 + +## 获取指定直播间的红包信息 + +> https://api.live.bilibili.com/xlive/lottery-interface/v1/lottery/getLotteryInfoWeb + +*请求方式:GET* + +认证方式(可选):Cookie(SESSDATA) + +如果不携带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> diff --git a/docs/live/report.md b/docs/live/report.md new file mode 100644 index 0000000..0dd3ec5 --- /dev/null +++ b/docs/live/report.md @@ -0,0 +1,66 @@ +# 直播心跳上报 + +## 直播心跳 (Web端) + +> https://live-trace.bilibili.com/xlive/rdata-interface/v1/heartbeat/webHeartBeat + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | --------- | ----------- | ----------------- | +| hb | str | heartbeat 正文 | 不必要 | 使用 base64 编码 | +| pf | str | 平台名称 | 不必要 | 可为 `web` | + +`hb` 解码参数: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ---- | ---- | +| 0 | num | 上次返回的 next_interval 值 | 默认 60 | +| 1 | num | 真实直播间号 | | +| 2 | num | 1 | 作用尚不明确 | +| 3 | num | 0 | 作用尚不明确 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| code | num | 返回值 | | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| next_interval | num | 下次心跳间隔 | | + +**示例:** + +上报直播间 26863308 的心跳 + +```shell +curl -G "https://live-trace.bilibili.com/xlive/rdata-interface/v1/heartbeat/webHeartBeat" \ +--data-urlencode "hb=$(echo "60|26863308|1|0" | base64 -)" \ +--data-urlencode "pf=web" +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "next_interval": 60 + } +} +``` + +</details> diff --git a/docs/live/silent_user_manage.md b/docs/live/silent_user_manage.md new file mode 100644 index 0000000..59502de --- /dev/null +++ b/docs/live/silent_user_manage.md @@ -0,0 +1,219 @@ +# 直播间禁言相关 API + +## 禁言观众 + +> https://api.live.bilibili.com/xlive/web-ucenter/v1/banned/AddSilentUser + +*请求方式:post* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | --- | ---------- | --- | ------------------ | +| room_id | str | 直播间Id | 必要 | | +| tuid | str | 要禁言的uid | 必要 | | +| msg | str | 要禁言的弹幕内容 | 非必要 | | +| mobile_app | str | web | 必要 | 定值"web"即可 | +| hour | num | 禁言时长 | 必要 | -1为永久,0为本场直播 | +| csrf_token | str | CSRF Token | 必要 | cookie中的bili_jct字段 | +| csrf | str | CSRF Token | 必要 | cookie中的bili_jct字段 | +| visit_id | str | 不明 | 非必要 | | + +**json 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | --- | ---- | ------- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为 "0" | +| ttl | str | 1 | | +| data | obj | 信息本体 | 成功为空 | + +**示例:** + +```shell +curl -X POST 'https://api.live.bilibili.com/xlive/web-ucenter/v1/banned/AddSilentUser' \ +--data-urlencode 'room_id=xxxxxx' \ +--data-urlencode 'tuid=xxx' \ +--data-urlencode 'msg=xxxx' \ +--data-urlencode 'mobile_app=web' \ +--data-urlencode 'csrf_token=xx' \ +--data-urlencode 'csrf=xx' \ +--data-urlencode 'visit_id=' \ +-H 'Content-Type:application/x-www-form-urlencoded' \ +-b 'SESSDATA=xxx; bili_jct=xx;' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{"code":0,"message":"0","ttl":1,"data":{}} +``` + +</details> + +## 查询直播间禁言列表 + +> https://api.live.bilibili.com/xlive/web-ucenter/v1/banned/GetSilentUserList + +*请求方式:post* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | --- | ---------- | --- | ------------------ | +| room_id | str | 直播间Id | 必要 | | +| ps | str | 列表页码 | 必要 | | +| csrf_token | str | CSRF Token | 必要 | cookie中的bili_jct字段 | +| csrf | str | CSRF Token | 必要 | cookie中的bili_jct字段 | +| visit_id | str | 不明 | 非必要 | | + +**json 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | --- | ---- | ------- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为 "0" | +| ttl | str | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | ------ | ------- | +| data | array | 禁言列表 | 数组中为obj | +| total | int | 禁言观众数量 | | +| total_page | int | 页码总数量 | | + +`data`对象中`data`数组的元素对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | --- | ------ | --------- | +| tuid | num | 禁言者uid | | +| tname | str | 禁言者昵称 | | +| uid | num | 发起者uid | | +| name | str | 发起者昵称 | | +| ctime | str | 禁言时间 | | +| id | num | 禁言记录Id | 解除禁言时用到 | +| is_anchor | num | 不明 | | +| face | str | 禁言者头像 | | +| admin_level | num | 发起者权限 | 0:主播,1:房管 | + +**示例:** + +```shell +curl -X POST 'https://api.live.bilibili.com/xlive/web-ucenter/v1/banned/GetSilentUserList' \ +--data-urlencode 'room_id=xxxxxxx' \ +--data-urlencode 'ps=1' \ +--data-urlencode 'csrf_token=xxx' \ +--data-urlencode 'csrf=xxx' \ +--data-urlencode 'visit_id=' \ +-H 'Content-Type:application/x-www-form-urlencoded' \ +-b 'SESSDATA=xxxx; bili_jct=xxx;' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code":0, + "message":"0", + "ttl":1, + "data":{ + "data":[ + { + "tuid":123456, + "tname":"xxxxx", + "uid":123456, + "name":"xxxx", + "ctime":"2023-12-15 16:32:46", + "id":13493921, + "is_anchor":0, + "face":"https://i1.hdslb.com/bfs/face/xxxxx.jpg", + "admin_level":1 + }, + { + "tuid":123456, + "tname":"xx", + "uid":123456, + "name":"xxxx", + "ctime":"2021-08-23 22:26:06", + "id":8018136, + "is_anchor":1, + "face":"https://i1.hdslb.com/bfs/face/xxxxxx.jpg", + "admin_level":0 + } + ], + "total":2, + "total_page":1 + } +} +``` + +</details> + +## 解除禁言 + +> https://api.live.bilibili.com/banned_service/v1/Silent/del_room_block_user + +*请求方式:post* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | --- | ---------- | --- | ---------------------- | +| roomid | str | 直播间Id | 必要 | 注意该接口名称没有“_” | +| id | str | 禁言记录Id | 必要 | GetSilentUserList 接口获取 | +| csrf_token | str | CSRF Token | 必要 | cookie中的bili_jct字段 | +| csrf | str | CSRF Token | 必要 | cookie中的bili_jct字段 | +| visit_id | str | 不明 | 非必要 | | + +**json 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | --- | ---- | ---- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 成功为空 | +| ttl | str | 1 | | +| data | obj | 信息本体 | 成功为空 | + +**示例:** + +```shell +curl -X POST 'https://api.live.bilibili.com/banned_service/v1/Silent/del_room_block_user' \ +--data-urlencode 'roomid=xxxxxxxxx' \ +--data-urlencode 'id=xxxxx' \ +--data-urlencode 'csrf_token=xxx' \ +--data-urlencode 'csrf=xxx' \ +--data-urlencode 'visit_id=' \ +-H 'Content-Type:application/x-www-form-urlencoded' \ +-b 'SESSDATA=xxxxxx; bili_jct=xxx;' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{"code":0,"msg":"","message":"","data":[]} +``` + +</details> diff --git a/live/user.md b/docs/live/user.md similarity index 54% rename from live/user.md rename to docs/live/user.md index 18f49f0..9a6fb5f 100644 --- a/live/user.md +++ b/docs/live/user.md @@ -1,19 +1,11 @@ # 直播间用户实用 API -- [直播间用户实用 API](#直播间用户实用-api) - - [获取用户持有的粉丝勋章信息](#获取用户持有的粉丝勋章信息) - - [佩戴勋章](#佩戴勋章) - - [直播签到](#直播签到) - ---- - ## 获取用户持有的粉丝勋章信息 -> ~~http://api.live.bilibili.com/fans_medal/v5/live_fans_medal/iApiMedal~~ -> +> ~~https://api.live.bilibili.com/fans_medal/v5/live_fans_medal/iApiMedal~~ (旧) > https://api.live.bilibili.com/xlive/app-ucenter/v1/user/GetMyMedals -_请求方式:GET_ +*请求方式:GET* 认证方式:Cookie(SESSDATA)或 APP @@ -30,9 +22,9 @@ _请求方式:GET_ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br>-1002002:参数异常<br>-500:服务器异常 | +| code | num | 返回值 | 0:成功<br />-1002002:参数异常<br />-500:服务器异常 | | message | str | 错误信息 | 默认为 "0" | -| ttl | str | 1 | | +| ttl | num | 1 | | | data | obj | 信息本体 | | `data`对象: @@ -43,7 +35,7 @@ _请求方式:GET_ | items | array | 粉丝勋章信息本体 | | | page_info | obj | 页码信息 | | -`items 数组内`对象: +`items`数组中的对象: | 字段 | 类型 | 内容 | 备注 | | ------------------ | ------ | -------------------- | -------------------------------------- | @@ -52,7 +44,7 @@ _请求方式:GET_ | guard_level | num | | | | guard_medal_title | str | 加成状态 | | | intimacy | num | 当前已得亲密度 | | -| is_lighted | num | 是否点亮 | 0:未点亮<br>1:点亮 | +| is_lighted | num | 是否点亮 | 0:未点亮<br />1:点亮 | | level | num | 勋章等级 | | | medal_name | str | 勋章名 | | | medal_color_border | num | 勋章边框颜色信息 | 颜色数值为 10 进制的 16 进制值(下同) | @@ -126,9 +118,9 @@ curl https://api.live.bilibili.com/xlive/app-ucenter/v1/user/GetMyMedals?page=1& ## 佩戴勋章 -> http://api.live.bilibili.com/xlive/web-room/v1/fansMedal/wear +> https://api.live.bilibili.com/xlive/web-room/v1/fansMedal/wear -_请求方式:POST_ +*请求方式:POST* **表单参数:** @@ -145,7 +137,7 @@ _请求方式:POST_ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | -------------- | | code | num | 返回值 | 0:成功 | -| ttl | str | 1 | | +| ttl | num | 1 | | | message | str | 错误信息 | 默认为佩戴成功 | | data | obj | 信息本体 | 默认为无 | @@ -189,9 +181,9 @@ $.ajax({ </details> -## 直播签到 +## ~~直播签到(已下线)~~ -> http://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign +> https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign _请求方式:GET_ @@ -203,7 +195,176 @@ _请求方式:GET_ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ---------------------- | -| code | num | 返回值 | 0:成功<br>1:参数错误 | -| ttl | str | 1 | | +| code | num | 返回值 | 0:成功<br />1:参数错误 | +| ttl | num | 1 | | | message | str | 错误信息 | 默认为当日签到奖励内容 | | data | obj | 信息本体 | 默认为空 | + +(目前已下线) + +<details> +<summary>查看响应示例(下线后):</summary> + +```json +{ + "code": 1, + "message": "签到活动已下线,无法使用。", + "ttl": 1, + "data": null +} +``` + +</details> + + +## 本月直播签到信息 + +> https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/WebGetSignInfo + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**json 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------- | +| code | num | 返回值 | 0:成功 | +| ttl | num | 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* + +认证方式:Cookie(SESSDATA)或 APP + +**json 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------- | +| code | num | 返回值 | 0:成功 | +| ttl | num | 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> diff --git a/docs/login/cookie_refresh.md b/docs/login/cookie_refresh.md new file mode 100644 index 0000000..e1b22fa --- /dev/null +++ b/docs/login/cookie_refresh.md @@ -0,0 +1,574 @@ +# Web端Cookie刷新 + +自从 2023 以来,社区反馈似乎 Web 端的 Cookie 会随着一些敏感接口的访问逐渐失效,而在 Web 页面上会判断 Cookie 是否需要刷新,如需刷新则会以动态加载 iframe 方式实现,同时登录(二维码 / 密码 / 短信验证码等)接口也会返回`refresh_token`字段,需要持久化保存,是一种官方的风控机制实现 + +感谢 [#524](https://github.com/SocialSisterYi/bilibili-API-collect/issues/524) 提供相关研究报告以及逆向工程结果 + +> cookie 不会主动刷新的,只要他没有调用下面的刷新接口就不会刷新。也就是说,你只要不再打开浏览器,或者直接把 localStorage 的 ac_time_value 字段删除了。那么 cookie 在真的失效前(登录过期、账号风控等强制下线)都是不变化的。 + +## 刷新步骤(伪代码) + +```python +cookie, refresh_token = 进行登录操作() # can be 二维码 / 密码 / 短信验证码 + +while True: + if 每日第一次访问接口: + if 检查是否需要刷新(cookie): + CorrespondPath = 生成CorrespondPath(当前毫秒时间戳) + refresh_csrf = 获取refresh_csrf(CorrespondPath, cookie) + refresh_token_old = refresh_token # 这一步必须保存旧的 refresh_token 备用 + cookie, refresh_token = 刷新Cookie(refresh_token, refresh_csrf, cookie) + 确认更新(refresh_token_old, cookie) # 这一步需要新的 Cookie 以及旧的 refresh_token + SSO站点跨域登录(cookie) + do_somethings(cookie) # 其他业务逻辑处理 +``` + +## 检查是否需要刷新 + +> https://passport.bilibili.com/x/passport-login/web/cookie/info + +*请求方式:GET* + +鉴权方式:Cookie + +**url 参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------- | ------ | ---- | +| csrf | str | CSRF Token(位于 Cookie) | 非必要 | 位于 Cookie 中的bili_jct字段 | + +**json 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功<br />-101:账号未登录 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------------- | ----------------------------------------------------- | +| refresh | bool | 是否应该刷新 Cookie | `true`:需要刷新 Cookie<br />`false`:无需刷新 Cookie | +| timestamp | num | 当前毫秒时间戳 | 用于获取 refresh_csrf | + +**示例:** + +```bash +curl -G 'https://passport.bilibili.com/x/passport-login/web/cookie/info' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +<details> +<summary>查看响应示例:</summary> + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "refresh": false, + "timestamp": 1684466082562 + } +} +``` + +</details> + +## 生成CorrespondPath算法 + +该算法逆向于以下 wasm 以及 JavaScript bind 接口,抓取于官方 Web 首页中,感谢 [#524](https://github.com/SocialSisterYi/bilibili-API-collect/issues/524) 提供 + +https://s1.hdslb.com/bfs/static/jinkela/long/wasm/wasm_rsa_encrypt_bg.wasm + +https://s1.hdslb.com/bfs/static/jinkela/long/wasm/wasm_ras_umd.js + +### 算法细节 + +将`refresh_${timestamp}`作为消息体(参数`timestamp`为当前毫秒时间戳),用下方 PubKey 进行 [RSA-OAEP](https://datatracker.ietf.org/doc/html/rfc3447#section-7.1) 算法加密,之后密文通过小写 Base16 编码为字符串 + +JWK 格式: + +> { +> "kty": "RSA", +> "n": "y4HdjgJHBlbaBN04VERG4qNBIFHP6a3GozCl75AihQloSWCXC5HDNgyinEnhaQ_4-gaMud_GF50elYXLlCToR9se9Z8z433U3KjM-3Yx7ptKkmQNAMggQwAVKgq3zYAoidNEWuxpkY_mAitTSRLnsJW-NCTa0bqBFF6Wm1MxgfE", +> "e": "AQAB" +> } + +PEM 格式: + +> -----BEGIN PUBLIC KEY----- +> MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg +> Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71 +> nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40 +> JNrRuoEUXpabUzGB8QIDAQAB +> -----END PUBLIC KEY----- + +### 相关Demo + +该 Demo 提供 [JavaScript](#javascript) [Python](#python) [Kotlin](#kotlin) [Java](#java) [Go](#go) 以及 [Vercel 云函数](#vercel云函数),感谢 [#524](https://github.com/SocialSisterYi/bilibili-API-collect/issues/524) 提供 + +#### JavaScript + +```javascript +const publicKey = await crypto.subtle.importKey( + "jwk", + { + kty: "RSA", + n: "y4HdjgJHBlbaBN04VERG4qNBIFHP6a3GozCl75AihQloSWCXC5HDNgyinEnhaQ_4-gaMud_GF50elYXLlCToR9se9Z8z433U3KjM-3Yx7ptKkmQNAMggQwAVKgq3zYAoidNEWuxpkY_mAitTSRLnsJW-NCTa0bqBFF6Wm1MxgfE", + e: "AQAB", + }, + { name: "RSA-OAEP", hash: "SHA-256" }, + true, + ["encrypt"], +) + +async function getCorrespondPath(timestamp) { + const data = new TextEncoder().encode(`refresh_${timestamp}`); + const encrypted = new Uint8Array(await crypto.subtle.encrypt({ name: "RSA-OAEP" }, publicKey, data)) + return encrypted.reduce((str, c) => str + c.toString(16).padStart(2, "0"), "") +} + +const ts = Date.now() +console.log(await getCorrespondPath(ts)) +``` + +```text +b77f21ab5b7ce7879c410b2311dd6e7ea1a2cd1cd941073db067f4c3279fdabca3a06dfa744168ee14ad050b9f4889bd4edb8e76eb597fdd18c16804d82566b55c6dba8e225d838aa93d8e5b31cf7c56720db8244d92373f4944e0561f6ca5bf721a36ac079786060fc853605ccd1ddcb33f54617de6aedd44e3b9850d13b45f +``` + +#### Python + +需要`pycryptodome`依赖 + +```python +from Crypto.Cipher import PKCS1_OAEP +from Crypto.PublicKey import RSA +from Crypto.Hash import SHA256 +import binascii +import time + +key = RSA.importKey('''\ +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg +Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71 +nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40 +JNrRuoEUXpabUzGB8QIDAQAB +-----END PUBLIC KEY-----''') + +def getCorrespondPath(ts): + cipher = PKCS1_OAEP.new(key, SHA256) + encrypted = cipher.encrypt(f'refresh_{ts}'.encode()) + return binascii.b2a_hex(encrypted).decode() + +ts = round(time.time() * 1000) +print(getCorrespondPath(ts)) +``` + +```text +47bbd615f333d6a2c597bbb46ad47a6e59752a305a2f545d3ba5d49ca055309347796f80d257613696d36170c57443a0e9dea2b47f83b0b4224d431e46124fadd9a24c8fa468147e8bf2d2501eaacae43310e19bf58fc4a728d80c90b9401afcfc1536ba9a2f6438ea53c0b2652f8b8d01c87355dd5a5da51de998b1a35d519a +``` + +### Kotlin + +```kotlin +import java.security.KeyFactory +import java.security.spec.MGF1ParameterSpec +import java.security.spec.X509EncodedKeySpec +import java.util.* +import javax.crypto.Cipher +import javax.crypto.spec.OAEPParameterSpec +import javax.crypto.spec.PSource + + +fun main() { + println(getCorrespondPath(System.currentTimeMillis())) +} + +fun getCorrespondPath(timestamp: Long): String { + val publicKeyPEM = """ + -----BEGIN PUBLIC KEY----- + MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg + Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71 + nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40 + JNrRuoEUXpabUzGB8QIDAQAB + -----END PUBLIC KEY----- + """.trimIndent() + + val publicKey = KeyFactory.getInstance("RSA").generatePublic( + X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyPEM + .replace("-----BEGIN PUBLIC KEY-----", "") + .replace("-----END PUBLIC KEY-----", "") + .replace("\n", "") + .trim())) + ) + + val cipher = Cipher.getInstance("RSA/ECB/OAEPPadding").apply { + init(Cipher.ENCRYPT_MODE, + publicKey, + OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT) + ) + } + + return cipher.doFinal("refresh_$timestamp".toByteArray()).joinToString("") { "%02x".format(it) } +} +``` + +```text +1428cbd14605ae42a0b42e22662cfe51d8e5034eeaffb36a46db46bd2f93216cbfd4d150cca2de44395add7c664b40acf44424ee8d634fc821b909423665a34d18bd7f4e77ea5388a2b612daf875e2fe8df62990e14b64a465898b0707bc1288586b68f9f4f2f20bea5cb1cada296beb8009e91bc8fb57a4b81b8923299b6eb7 +``` + +### Go + +```go +package main + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/hex" + "encoding/pem" + "fmt" + "time" +) + +func main() { + result, err := getCorrespondPath(time.Now().UnixMilli()) + if err != nil { + panic(err) + } + fmt.Println(result) +} + +func getCorrespondPath(ts int64) (string, error) { + const publicKeyPEM = ` +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg +Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71 +nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40 +JNrRuoEUXpabUzGB8QIDAQAB +-----END PUBLIC KEY----- +` + pubKeyBlock, _ := pem.Decode([]byte(publicKeyPEM)) + hash := sha256.New() + random := rand.Reader + msg := []byte(fmt.Sprintf("refresh_%d", ts)) + var pub *rsa.PublicKey + pubInterface, parseErr := x509.ParsePKIXPublicKey(pubKeyBlock.Bytes) + if parseErr != nil { + return "", parseErr + } + pub = pubInterface.(*rsa.PublicKey) + encryptedData, encryptErr := rsa.EncryptOAEP(hash, random, pub, msg, nil) + if encryptErr != nil { + return "", encryptErr + } + return hex.EncodeToString(encryptedData), nil +} +``` + +```text +97759947aa357ed5d88cf9bf1172737570b7bba2d6788d39006f082b2b25ddf53b581f1f0c61ed8573317485ef525d2789faa25a277b4602a4b9cbf837681093a03e96cb9773a11df4bb1e20f1587180b3e958194de922d7dd94d0a2f0b9b0ef74e426e8041f99b99e7c02407ef4ab38040e61be81e4fdfbdb73461e3a2ad810 +``` + +### Java + +```Java +import javax.crypto.Cipher; +import javax.crypto.spec.OAEPParameterSpec; +import javax.crypto.spec.PSource; +import java.math.BigInteger; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.MGF1ParameterSpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; + +public class CookieRefresh { + private static final String PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\n" + + "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg\n" + + "Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71\n" + + "nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40\n" + + "JNrRuoEUXpabUzGB8QIDAQAB\n" + + "-----END PUBLIC KEY-----"; + + public static void main(String[] args) { + try { + String correspondPath = getCorrespondPath(String.format("refresh_%d", System.currentTimeMillis()), PUBLIC_KEY); + System.out.println(correspondPath); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static String getCorrespondPath(String plaintext, String publicKeyStr) throws Exception { + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + publicKeyStr = publicKeyStr + .replace("-----BEGIN PUBLIC KEY-----", "") + .replace("-----END PUBLIC KEY-----", "") + .replace("\n", "") + .trim(); + byte[] publicBytes = Base64.getDecoder().decode(publicKeyStr); + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicBytes); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); + + String algorithm = "RSA/ECB/OAEPPadding"; + Cipher cipher = Cipher.getInstance(algorithm); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + + // Encode the plaintext to bytes + byte[] plaintextBytes = plaintext.getBytes("UTF-8"); + + // Add OAEP padding to the plaintext bytes + OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT); + cipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParams); + // Encrypt the padded plaintext bytes + byte[] encryptedBytes = cipher.doFinal(plaintextBytes); + // Convert the encrypted bytes to a Base64-encoded string + return new BigInteger(1, encryptedBytes).toString(16); + } +} +``` + +```text +f87666152da692735123f4e49053e5a98c16854673b2e632f31a3ff0c029640772873661a9a8412db6be447a0bfa03a295d15548cbfd2bb35634e98ba5f25b1205519d6e6119b483f4c516c1e106d45b04ff98c73560949d379d3edaf3c0ecd10a1d46134fb9ca443122ab33c16d1dd48280496f949ed960a2fbcd65f10935e +``` + +#### vercel云函数 + +```bash +curl -G 'https://wasm-rsa.vercel.app/api/rsa' \ + --data-urlencode "t=$((`date '+%s'`*1000+`date '+%N'`/1000000))" +``` + +```json +{ + "timestamp": "1684468084078", + "hash": "a768efe5114ef8610f9ed9ebc28c00827375f4a3448ec4ab17958cacc4fde9898e5b7aa27f649426bba1acae4aa222aafaff7d528669b15249de0b2b60d86618557d8dc90684db4ec68e8d98e41d94f1c97d1d431c288e595ceb522d033822442a9e1ee150b32771a83fbf65c13329e9fda080fbe3bc85c49c1de7ab148d228f", + "code": 0 +} +``` + +## 获取refresh_csrf + +> https://www.bilibili.com/correspond/1/{correspondPath} + +*请求方式:GET* + +鉴权方式:Cookie + +**path 参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------------- | ---- | ---------------------------- | ------ | ------------------------------------------------------------ | +| correspondPath | str | 使用当前毫秒时间戳生成的签名 | 必要 | 由 [生成CorrespondPath算法](#生成CorrespondPath算法) 加密获得 | + +将参数`correspondPath`拼接在 https://www.bilibili.com/correspond/1/ 后进行请求,例如 + +> https://www.bilibili.com/correspond/1/0248397e5139a8b878894cae46f8d6742ef7c728e46403706452b5dda90fe248e58e73bd6c2da0dba515c53af107dc1ecda757ce843579bcf197fcd7800586126e9b896b646cc94c23183a5a067642e96f7b6e803880e1d3cceabc9f1dc52a121b5e3ba5619e008f6b6dcb65a09d7864084ac114f4ec9ccf6218776fe4f2fa95 + +请求该 url 会返回一个 html 页面,通常由 iframe 方式加载,它通过 SSR 方式返回一个实时刷新口令`refresh_csrf`存放于 html 标签中,并在 Client 端通过 js 请求 RestAPI 完成一些列的提交刷新、确认、SSO 站点登录等操作 + +若参数`correspondPath`错误或过期,则返回一个 404 Page + +以下为返回的参数: + +| 标签 id | 内容 | xpath | 备注 | +| ------- | ------------ | ------------------------- | --------------------------------- | +| 1-name | refresh_csrf | //div[id='1-name']/text() | 实时刷新口令<br />用于更新 Cookie | + +**示例:** + +```bash +correspondPath='0248397e5139a8b878894cae46f8d6742ef7c728e46403706452b5dda90fe248e58e73bd6c2da0dba515c53af107dc1ecda757ce843579bcf197fcd7800586126e9b896b646cc94c23183a5a067642e96f7b6e803880e1d3cceabc9f1dc52a121b5e3ba5619e008f6b6dcb65a09d7864084ac114f4ec9ccf6218776fe4f2fa95' + +curl -G "https://www.bilibili.com/correspond/1/$correspondPath" \ + -b 'SESSDATA=xxx' +``` + +```html +<!DOCTYPE html> +<html lang="zh-Hans"> + +<head> + <meta name="spm_prefix" content="333.1193"> + <link + href="//s1.hdslb.com/bfs/static/jinkela/token-iframe/css/token-iframe.1.a035e81c3bee5fa1a05633ad534ad1f44b05e54d.css" + rel="stylesheet"> +</head> +<title>Correspond + + + +
b0cc8411ded2f9db2cff2edb3123acac
+
+ + + + + + +``` + +所以当前账号的实时刷新口令`refresh_csrf`为`b0cc8411ded2f9db2cff2edb3123acac` + +## 刷新Cookie + +> https://passport.bilibili.com/x/passport-login/web/cookie/refresh + +*请求方式:POST* + +鉴权方式:Cookie + +刷新成功后会设置以下 Cookie 项: + +`sid`、`DedeUserID`、`DedeUserID__ckMd5`、`SESSDATA`、`bili_jct` + +**正文参数 (application/x-www-form-urlencoded)或 url 参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------- | ---- | -------------- | ------ | ------------------------------------------------------------ | +| csrf | str | CSRF Token | 必要 | 位于 Cookie 中的`bili_jct`字段 | +| refresh_csrf | str | 实时刷新口令 | 必要 | 通过 [获取refresh_csrf](#获取refresh_csrf) 获得 | +| source | str | 访问来源? | 必要 | 一般为`main_web` | +| refresh_token | str | 持久化刷新口令 | 必要 | localStorage 中的`ac_time_value`字段,在登录成功后返回并保存 | + +**json 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf 校验失败
86095:refresh_csrf 错误或 refresh_token 与 cookie 不匹配 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------------ | ----------------------------------------------------------- | +| status | num | 0 | | +| message | str | 空 | | +| refresh_token | str | 新的持久化刷新口令 | 将存储于 localStorage 中的`ac_time_value`字段,以便下次使用 | + +**示例:** + +```bash +curl -i 'https://passport.bilibili.com/x/passport-login/web/cookie/refresh' \ + --data-urlencode 'csrf=f610640a37f51f6266f6b83cfc5eedbb' \ + --data-urlencode 'refresh_csrf=b0cc8411ded2f9db2cff2edb3123acac' \ + --data-urlencode 'source=main_web' \ + --data-urlencode 'refresh_token=45240a041836905fe953e3b98b83d751' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +http 响应(关键信息已做脱敏处理): + +```http +HTTP/2 200 +date: Fri, 19 May 2023 07:34:11 GMT +content-type: application/json; charset=utf-8 +content-length: 116 +bili-status-code: 0 +bili-trace-id: 17f4251365646726 +set-cookie: SESSDATA=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT; HttpOnly; Secure +set-cookie: bili_jct=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT +set-cookie: DedeUserID=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT +set-cookie: DedeUserID__ckMd5=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT +set-cookie: sid=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT +x-bili-trace-id: 3f6f6174aaa087b517f4251365646726 +expires: Fri, 19 May 2023 07:34:10 GMT +cache-control: no-cache +x-cache-webcdn: BYPASS from blzone03 + +{"code":0,"message":"0","ttl":1,"data":{"status":0,"message":"","refresh_token":"ae1bd1149b56af9743ffe7bbbeff3e51"}} +``` + +JSON Payload: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "status": 0, + "message": "", + "refresh_token": "ae1bd1149b56af9743ffe7bbbeff3e51" + } +} +``` + +
+ +## 确认更新 + +> https://passport.bilibili.com/x/passport-login/web/confirm/refresh + +*请求方式:POST* + +鉴权方式:Cookie + +该步操作将让旧的`refresh_token`对应的 Cookie 失效 + +**正文参数 (application/x-www-form-urlencoded)或 url 参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------- | ---- | ------------------------- | ------ | ------------------------------------------------------------ | +| csrf | str | CSRF Token(位于 cookie) | 必要 | 从新的 cookie 中获取,位于 Cookie 中的`bili_jct`字段 | +| refresh_token | str | 旧的持久化刷新口令 | 必要 | 在刷新前 localStorage 中的`ac_time_value`获取,**并非刷新后返回的值** | + +**json 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf 校验失败
-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | + +**示例:** + +```bash +curl 'https://passport.bilibili.com/x/passport-login/web/confirm/refresh' \ + --data-urlencode 'csrf=1e9658858e6da76be64bd92cdc0fa324' \ + --data-urlencode 'refresh_token=45240a041836905fe953e3b98b83d751' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
diff --git a/docs/login/exit.md b/docs/login/exit.md new file mode 100644 index 0000000..8ba5e14 --- /dev/null +++ b/docs/login/exit.md @@ -0,0 +1,68 @@ +# 退出账号登录 + +## 退出登录(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:成功
2202:csrf 请求非法 | +| 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' +``` + +
+查看响应示例: + +```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" + } +} +``` +
\ No newline at end of file diff --git a/docs/login/login_action/QR.md b/docs/login/login_action/QR.md new file mode 100644 index 0000000..ecee7fd --- /dev/null +++ b/docs/login/login_action/QR.md @@ -0,0 +1,652 @@ +# 二维码登录 + + + +## 扫码登录流程(伪代码) + +```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' +``` + +
+查看响应示例: + +```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" + } +} +``` + +
+ +### 扫码登录(web端) + +> https://passport.bilibili.com/x/passport-login/web/qrcode/poll + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|------------|-----|--------|-----|-----| +| qrcode_key | str | 扫码登录秘钥 | 必要 | | + + +密钥超时为180秒 + +验证登录成功后会进行设置以下cookie项: + +`DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct` + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|------| +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | | +| data | obj | 信息本体 | | + +data 对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------------|-----|----------------------------------------------------------------|------------------------| +| url | str | 游戏分站跨域登录 url | 未登录为空 | +| refresh_token | str | 刷新`refresh_token` | 未登录为空 | +| timestamp | num | 登录时间 | 未登录为`0`
时间戳 单位为毫秒 | +| code | num | 0:扫码登录成功
86038:二维码已失效
86090:二维码已扫码未确认
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` + +
+查看响应示例: + + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "url": "", + "refresh_token": "", + "timestamp": 0, + "code": 86101, + "message": "未扫码" + } +} +``` + +
+ +扫描成功但手机端未确认时`code`为`86090` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "url": "", + "refresh_token": "", + "timestamp": 0, + "code": 86090, + "message": "二维码已扫码未确认" + } +} +``` + +
+ +扫描成功手机端确认登录后,`code`为`0`,并向浏览器写入cookie + +
+查看响应示例: + +```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": "" + } +} +``` + +
+ +**响应头部抓包信息:** + +可明显看见设置了几个cookie + +
+查看响应示例: + +```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 +``` + +
+ +二维码失效时`code`为`86038` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "url": "", + "refresh_token": "", + "timestamp": 0, + "code": 86038, + "message": "二维码已失效" + } +} +``` + +
+ +## 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' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "status": true, + "ts": 1583314311, + "data": { + "url": "https://passport.bilibili.com/qrcode/h5/login?oauthKey=c3bd5286a2b40a822f5f60e9bf3f602e", + "oauthKey": "c3bd5286a2b40a822f5f60e9bf3f602e" + } +} +``` + +
+ +### 扫码登录(web端-旧版) + +**接口已失效,请求结果始终为 `{ code: 20000, message: '该版本已不支持当前功能,请升级新版本!' }`** + +> ~~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:成功,
20000:该版本已不支持当前功能,请升级新版本! | +| message | str | | 正确无 | +| ts | num | 扫码时间 | 错误无 | +| status | bool | 扫码是否成功 | true:成功
false:未成功 | +| data | 正确时:obj
错误时:num | 正确时:游戏分站url
错误时:错误代码 | 未成功时:
-1:密钥错误
-2:密钥超时
-4:未扫描
-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` + +
+查看响应示例: + +```json +{ + "status":false, + "data":-4, + "message":"Can't scan~" +} +``` + +
+ +扫描成功但手机端未确认时`status`为`false`,`data`为`-5` + +
+查看响应示例: + +```json +{ + "status":false, + "data":-5, + "message":"Can't confirm~" +} +``` + +
+ +扫描成功手机端确认登录后,`status`为`true`,`data`为对象,并向浏览器写入cookie + +
+查看响应示例: + +```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" + } +} +``` + +
+ +**响应头部抓包信息:** + +可明显看见设置了几个cookie + +
+查看响应示例: + +```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 +``` + +
+ +
+ +## 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 方式必要 | [可用](#appkey-可用列表) | +| local_id | num | TV 端 id | TV 端必要 | 可为`0` | +| ts | num | 当前时间戳 | APP 方式必要 | | +| sign | str | APP 签名 | APP 方式必要 | | +| mobi_app | str | 平台标识 | 非必要 | 会被拼接到返回的 url query | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|---------------------------------------| +| code | num | 返回值 | 0:成功
-3:API校验密匙错误
-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' +``` + +
+查看响应示例: + +```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" + } +} +``` + +
+ +### 扫码登录(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方式必要 |[可用](#appkey-可用列表) | +| auth_code | str | 扫码秘钥 | 必要 | | +| local_id | num | TV端id | TV端必要 | 可为0 | +| ts | num | 当前时间戳 | APP方式必要 | | +| sign | str | APP签名 | APP方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----------------------|------|--------------------------------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功
-3:API校验密匙错误
-400:请求错误
-404:啥都木有
86038:二维码已失效
86039:二维码尚未确认
86090:二维码已扫码未确认 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 有效时:obj
无效时: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' +``` + +
+查看响应示例: + +```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" + ] + } +} +``` + +
+ +### appkey 可用列表 + +**仅覆盖 [docs/misc/sign/APPKey](../../misc/sign/APPKey.md) 中包含的 appkey** + +| APPKEY | APPSEC | platform | APP类型 | neuronAppId | mobi_app2 | 备注 | +| :--------------: | :------------------------------: | :------------------: | :----------------: | :---------------------: | :------------------: | :----------------------------------------: | +| 783bbb7264451d82 | 2653583c8873dea268ab9386918b1d65 | `android` | 粉版 | `1` | `android` | 仅获取用户信息时使用(7.X及更新版本) | +| 8d23902c1688a798 | 710f0212e62bd499b8d3ac6e1db9302a | `android` | AndroidBiliThings | ? | ? | | +| bca7e84c2d947ac6 | 60698ba2f68e01ce44738920a0ffe768 | ? | login | - | ? | | +| 27eb53fc9058f8c3 | c2ed53a74eeefe3cf99fbd01d8c9c375 | `web`/`ios`? | - | - | - | 第三方授权使用 | +| 4409e2ce8ffd12b8 | 59b43e04ad6965f34319062b478f83dd | `android` | 云视听小电视(TV版) | `9`? | `android_tv_yst`? | | +| dfca71928277209b | b5475a8825547a4fc26c7d518eaaa02e | `android` | HD 版 | `5` | `android_hd` | | + +**注意:** + +通过某一组 APPKEY/APPSEC 获取到的 access_token,当接口需要 `sign` 签名时也只能使用该组 APPKEY/APPSEC,否则出现 `{ code: -663, message: '鉴权失败,请联系账号组', ttl: 1 }` 错误。 + +**例外:** + +`783bbb7264451d82`/`2653583c8873dea268ab9386918b1d65` 获取到的 access_token 可配合 `1d8b6e7d45233436`/`560c52ccd288fed045859ed18bffd973` 使用。 diff --git a/docs/login/login_action/SMS.md b/docs/login/login_action/SMS.md new file mode 100644 index 0000000..21a8d53 --- /dev/null +++ b/docs/login/login_action/SMS.md @@ -0,0 +1,453 @@ +# 短信登录 + +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' +``` + +
+查看响应示例: + +```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" + }, + ………… + ] + } +} +``` + +
+ + +## 发送短信验证码_app端 + +> https://passport.bilibili.com/x/passport-login/sms/send + +*请求方式:POST* + +同手机号短信发送 CD 时间为 60s + +短信验证码 timeout 为 5min + +验证内容由第一次返回进行处理,解析recaptcha_url的params传到极验进行验证后取到验证结果入参后再次调用即可 + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| cid | num | 国际冠字码 | 必要 | 可以从[获取国际冠字码](#获取国际冠字码(web端))获取 | +| tel | num | 手机号码 | 必要 | | +| login_session_id | str | 登录标识 | 必要 | uuid去掉'-'后得到 +| recaptcha_token | str | 登录 API token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | +| gee_challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | +| gee_validate | str | 极验 result | 必要 | 极验验证后得到 | +| gee_seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 | +| channel | str | 通道? | 必要 | 一般固定值为"bili" | +| buvid | str | buvid | 必要 | 参考如下方法生成 | +| local_id | str | 同上 | 必要 | 同上 | +| statistics | str | ? | 必要 | 一般固定为{"appId":1,"platform":3,"version":"7.27.0","abtest":""},非key-value入参需要转URL编码 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | -------- | --------- | +| code | num | 返回值 | 0:成功
-400:请求错误
1002:手机号格式错误
86203:短信发送次数已达上限
1003:验证码已经发送
1025:该手机号在哔哩哔哩有过永久封禁记录,无法再次注册或绑定新账号
2400:登录秘钥错误
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/sms/send' \ +--data-urlencode 'tel=13888888888' \ +--data-urlencode 'cid=1' \ +--data-urlencode 'login_session_id=669900' \ +--data-urlencode 'recaptcha_token=aabbccdd' \ +--data-urlencode 'gee_challenge=2333' \ +--data-urlencode 'gee_validate=666666' \ +--data-urlencode 'gee_seccode=666666|jordan' \ +--data-urlencode 'channel=bili' \ +--data-urlencode 'buvid=999999' \ +--data-urlencode 'local_id=999999' \ +--data-urlencode 'statistics=%7B%22appId%22%3A1%2C%22platform%22%3A3%2C%22version%22%3A%227.27.0%22%2C%22abtest%22%3A%22%22%7D' +``` + +生成buvid方法 +``` javascript +static buvid() : string { + var mac = []; + for (let i = 0; i < 6; i++) { + var min = Math.min(0, 0xff) + var max = Math.max(0, 0xff) + var num = parseInt((Math.random() * (min - max + 1) + max).toString()).toString(16) + mac.push(num) + } + var md5 = this.md5(mac.join(':')); + var md5Arr = md5.split(''); + return "XY${md5Arr[2]}${md5Arr[12]}${md5Arr[22]}${md5}" +} +``` + +
+查看响应示例: + +```json +{"code":0, + "message":"0", + "ttl":1, + "data":{ + "captcha_key":"7542f109c3318d74847626495c68c321", + "recaptcha_url":"...." + } +} +``` + +
+ +## 发送短信验证码_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`:独立登录页
`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:成功
-400:请求错误
1002:手机号格式错误
86203:短信发送次数已达上限
1003:验证码已经发送
1025:该手机号在哔哩哔哩有过永久封禁记录,无法再次注册或绑定新账号
2400:登录秘钥错误
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' +``` + +
+查看响应示例: + +```json +{"code":0, + "message":"0", + "ttl":1, + "data":{ + "captcha_key":"7542f109c3318d74847626495c68c321" + } +} +``` + +
+ +## 使用短信验证码登录_app端 + +> https://passport.bilibili.com/x/passport-login/login/sms + +*请求方式:POST* + +验证登录成功后会返回实体内容: + + `mid` `expires_in` `access_token` `refresh_token` + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| cid | num | 国际冠字码 | 必要 | 可以从[获取国际冠字码](#获取国际冠字码(web端))获取 | +| tel | num | 手机号码 | 必要 | | +| login_session_id | str | 登录标识 | 必要 | 必须与上述login_session_id保持一致 +| code | num | 短信验证码 | 必要 | timeout 为 5min | +| captcha_key | str | 短信登录 token | 必要 | 从[上述API](#发送短信验证码(web端))请求成功后返回 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0:成功
-400:请求错误
1006:请输入正确的短信验证码
1007:短信验证码已过期 | +| message | str | 错误信息 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| mid | str | 用户uid | | +| expires_in | str | 过时时间 | | +| access_token | str | 登录 token | | +| refresh_token | str | 刷新 token | | +| cookie_info | Array | cookie集合 | | + +**示例:** + +使用手机号`13888888888`,短信验证码为`123456`,进行验证登录操作 + +```shell +curl 'https://passport.bilibili.com/x/passport-login/login/sms' +--data-urlencode 'cid=1' \ +--data-urlencode 'tel=13888888888' \ +--data-urlencode 'code=123456' \ +--data-urlencode 'captcha_key=999999' \ +--data-urlencode 'login_session_id=669900' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "data": { + "token_info": { + "mid": "...", + "expires_in": "114514", + "access_token": "", + "refresh_token": "" + //... + }, + "cookie_info":[ + //... + ], + "message": "0" + } +} +``` + +
+ +**响应头部抓包信息:** + +可明显看见设置了几个cookie(填入浏览器即可成功登录) + +
+查看响应示例: + +```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 + +``` + +
+ + +## 使用短信验证码登录_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`:独立登录页
`main_mini`:小窗登录 | +| captcha_key | str | 短信登录 token | 必要 | 从[上述API](#发送短信验证码(web端))请求成功后返回 | +| go_url | str | 跳转url | 非必要 | 默认为 https://www.bilibili.com | +| keep | bool | 是否记住登录 | 非必要 | `true`:记住登录
`false`:不记住登录 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0:成功
-400:请求错误
1006:请输入正确的短信验证码
1007:短信验证码已过期 | +| message | str | 错误信息 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| is_new | bool | 是否为新注册用户 | false:非新注册用户
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' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "data": { + "is_new": false, + "status": 0, + "url": "https://space.bilibili.com" + } +} +``` + +
+ +**响应头部抓包信息:** + +可明显看见设置了几个cookie(填入浏览器即可成功登录) + +
+查看响应示例: + +```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 + +``` + +
diff --git a/docs/login/login_action/password.md b/docs/login/login_action/password.md new file mode 100644 index 0000000..ffc3d01 --- /dev/null +++ b/docs/login/login_action/password.md @@ -0,0 +1,788 @@ +# 密码登录 + +## 密码登录流程(伪代码) + +```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
恒为 16 字符
需要拼接在明文密码之前 | +| key | str | rsa 公钥 | PEM 格式编码
加密密码时需要使用 | + +**示例:** + +```shell +curl 'https://passport.bilibili.com/x/passport-login/web/key' +``` + +
+查看响应示例: + + +```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" + } +} +``` + +
+ +### 登录操作(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`:独立登录页
`main_mini`:小窗登录 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----------------------|------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功
-105:验证码错误
-400:请求错误
-629:账号或密码错误
-653:用户名或密码不能为空
-662:提交超时,请重新提交
-2001:缺少必要的的参数
-2100:需验证手机号或邮箱
2400:登录秘钥错误
2406:验证极验服务出错
86000:RSA解密失败 | +| message | str | 错误信息 | | +| data | 成功时:obj
失败时:null | 数据本体 | | + +data 对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------------|-----|-------------------|------------------------| +| message | str | 扫码状态信息 | 若提示 `本次登录环境存在风险, 需使用手机号进行验证或绑定`, 参见 [手机号验证](#手机号验证) | +| refresh_token | str | 刷新`refresh_token` | | +| status | num | 0 | | +| timestamp | num | 登录时间 | 未登录为`0`
时间戳 单位为毫秒 | +| 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' +``` + +
+查看响应示例: + + +```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 + } +} + +``` + +
+ +**响应头部抓包信息:** + +可明显看见设置了几个 cookie + +
+查看响应示例: + +```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 +``` + +
+ +## web端密码登录-旧版 + +以下为密码扫码登录 API,尚可正常访问 + +### 获取公钥&盐(web端-旧版) + +> https://passport.bilibili.com/login?act=getkey + +*请求方式:GET* + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|-----|--------|------------------------------------------| +| hash | str | 密码盐值 | 有效时间为 20s
恒为 16 字符
需要拼接在明文密码之前 | +| key | str | rsa 公钥 | PEM 格式编码
加密密码时需要使用 | + +**示例:** + +```shell +curl 'https://passport.bilibili.com/login?act=getkey' +``` + +
+查看响应示例: + +```json +{ + "hash":"07c6501690c1af85", + "key":"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n" +} +``` + +
+ +### 登录操作(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`:记住登录
`false`:不记住登录 | +| key | str | 登录 token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | +| challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | +| validate | str | 极验 result | 必要 | 极验验证后得到 | +| seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|-------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功
-400:请求错误
-629:账号或密码错误
-653:用户名或密码不能为空
-662:提交超时,请重新提交
-2001:缺少必要的的参数
-2100:需验证手机号或邮箱
2400:登录秘钥错误
2406:验证极验服务出错
86000:RSA解密失败 | +| 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' +``` + +
+查看响应示例: + + +```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" + } +} +``` + +
+ +**响应头部抓包信息:** + +可明显看见设置了几个 cookie + +
+查看响应示例: + +```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 +``` + +
+ +## 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
恒为 16 字符
需要拼接在明文密码之前 | +| key | str | rsa 公钥 | PEM 格式编码
加密密码时需要使用 | + +**示例:** + +```shell +curl 'https://passport.bilibili.com/api/oauth2/getKey' \ +--data-urlencode 'appkey=1d8b6e7d45233436' \ +--data-urlencode 'sign=17004c193f688f0b5665c1068e733aff' +``` + +
+查看响应示例: + +```json +{ + "hash": "07c6501690c1af85", + "key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n" +} +``` + +
+ +### 登录操作(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); + } +} + +``` + +## 手机号验证 + +### 简述 + +有时使用密码登录时, 无论使用网页端还是手机端接口, 由于 请求头缺失/请求频率高/请求IP 等原因, 会返回如下内容, 此时需要进行手机号验证或绑定 + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "is_new": false, + "status": 2, + "message": "本次登录环境存在风险, 需使用手机号进行验证或绑定", + "url": "https://passport.bilibili.com/h5-app/passport/risk/verify?tmp_token=imtmptk&request_id=imreqid&source=risk", + "refresh_token": "", + "timestamp": 0, + "hint": "", + "in_reg_audit": 0 + } +} +``` + +### 获取 captcha + +> https://passport.bilibili.com/x/safecenter/captcha/pre + +*请求方法: POST* + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | ---- | ---- | ---- | ---- | +| source | str | risk | 不必要 | | + +**JSON 回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| recaptcha_type | str | 验证码类型 | 目前仅 `geetest` | +| recaptcha_token | str | 验证码 token | | +| gee_challenge | str | 极验 challenge | | +| gee_gt | str | 极验 gt | | + +**示例:** + +```shell +curl -X POST 'https://passport.bilibili.com/x/safecenter/captcha/pre' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "recaptcha_type": "geetest", + "recaptcha_token": "8a418aa9eebe411599d759fc318d55e1", + "gee_challenge": "4e5353e7ab9f9aef0c97fa5a5b1ad101", + "gee_gt": "ac597a4506fee079629df5d8b66dd4fe" + } +} +``` + +
+ +### 发送验证码 + +> https://passport.bilibili.com/x/safecenter/common/sms/send + +*请求方法: POST* + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | - | ---- | ---- | ---- | +| tmp_code| str | url query 中的 tmp_code | 必要 | 参见 [简述](#简述) 中 JSON 示例中的 `url` | +| sms_type | str | `loginTelCheck` | 必要 | | +| recaptcha_token | str | 验证码 token | 必要 | 参见 [获取 captcha](#获取-captcha) | +| gee_challenge | str | 极验 challenge | 必要 | 参见 [获取 captcha](#获取-captcha) | +| gee_validate | str | 极验 validate | 必要 | 验证后获得 | +| gee_seccode | str | 极验 seccode | 必要 | 验证后获得 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | -- | - | +| captcha_key | str | 验证码 key | | + +**示例:** + +假设 `tmp_code` 为 `imtmptk`, +`recaptcha_token` 为 `kfc`, +`gee_challenge` 为 `crazythursday`, +`gee_validate` 为 `vivo50`, +`gee_seccode` 为 `vivo50|jordan` + +```shell +curl -X POST 'https://passport.bilibili.com/x/safecenter/common/sms/send' \ +--data-urlencode 'tmp_code=imtmptk' \ +--data-urlencode 'sms_type=loginTelCheck' \ +--data-urlencode 'recaptcha_token=kfc' \ +--data-urlencode 'gee_challenge=crazythursday' \ +--data-urlencode 'gee_validate=vivo50' \ +--data-urlencode 'gee_seccode=vivo50|jordan' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "captcha_key": "42403fb08ed2cd97afff14edefbae482" + } +} +``` + +
+ +### 验证手机验证码 + +> https://passport.bilibili.com/x/safecenter/login/tel/verify + +*请求方法: POST* + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | - | ---- | ---- | ---- | +| tmp_code | str | url query 中的 tmp_code | 必要 | 参见 [简述](#简述) 中 JSON 示例中的 `url` | +| captcha_key | str | 验证码 key | 必要 | 参见 [发送验证码](#发送验证码) | +| type | str | `loginTelCheck` | 必要 | | +| code | num | 接收到的验证码 | 必要 | | +| request_id | str | url query 中的 request_id | 必要 | 参见 [简述](#简述) 中 JSON 示例中的 `url` | +| source | str | risk | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | str | 交换代码 | 用于后面 [交换 Cookie](#交换-cookie) | + +**示例:** + +假设 `tmp_code` 为 `imtmptk`, +`captcha_key` 为 `42403fb08ed2cd97afff14edefbae482`, +`code` 为 `114514`, +`request_id` 为 `imreqid` + +```shell +curl -X POST 'https://passport.bilibili.com/x/safecenter/login/tel/verify' \ +--data-urlencode 'tmp_code=imtmptk' \ +--data-urlencode 'captcha_key=42403fb08ed2cd97afff14edefbae482' \ +--data-urlencode 'type=loginTelCheck' \ +--data-urlencode 'code=114514' \ +--data-urlencode'request_id=imreqid' \ +--data-urlencode'source=risk' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "code": "6eadf783c55a387b143773282b217682" + } +} +``` + +
+ +### 交换 Cookie + +> https://passport.bilibili.com/x/passport-login/web/exchange_cookie + +*请求方法: POST* + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | - | ---- | ---- | ---- | +| source | str | risk | 必要 | | +| code | str | 交换代码 | 必要 | 参见 [验证手机验证码](#验证手机验证码) | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | - | - | +| url | str | 游戏分站跨域登录 url | | +| refresh_token | str | 刷新 token | | + +**示例:** + +假设 `code` 为 `6eadf783c55a387b143773282b217682` + +```shell +curl -X POST 'https://passport.bilibili.com/x/passport-login/web/exchange_cookie' \ +--data-urlencode 'code=6eadf783c55a387b143773282b217682' \ +--data-urlencode'source=risk' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "url": "https://passport.biligame.com/x/passport-login/web/crossDomain?DedeUserID=645769214&DedeUserID__ckMd5=653409864bf9e200&Expires=1739265009&SESSDATA=11d97d2a,1739265009,928d7*82CjCKOhDRm5gROpSfgQ7B2axGVMWm5LuwNTkNDK2vjeGl7xvAsfsCINKmczXvO_Z45FsSVlJ1NHdlYlpSei1lYjdqUXRMaUpuRk9GbjVPS0psc3ZTcDFGRjhnNGhIbHRlZ0ZQRWQ1MUlUY2pnQ0lkTVRYNjlabmlUWGxHcVdkV3hrcElpa0ZEZEZRIIEC&bili_jct=3cdee5b84eb48d4f08bcfd57b58cf40b&gourl=https%3A%2F%2Fwww.bilibili.com%2F&first_domain=.bilibili.com", + "refresh_token": "43de156ad241864640f9d9721656a682" + } +} +``` + +
+ +
+查看响应头部示例: + +```http +HTTP/2 200 OK +date: Thu, 15 Aug 2024 09:10:09 GMT +content-type: application/json; charset=utf-8 +access-control-allow-credentials: true +access-control-allow-methods: GET,POST,PUT,DELETE +access-control-allow-origin: https://passport.bilibili.com +bili-status-code: 0 +bili-trace-id: 175262647666bdc5 +set-cookie: SESSDATA=xxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT; HttpOnly; Secure +set-cookie: bili_jct=xxxxxxxxxxxxxxxxxxxxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT +set-cookie: DedeUserID=114514191; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT +set-cookie: DedeUserID__ckMd5=0123456789abcdef; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT +set-cookie: sid=xxxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT +vary: Origin +x-bili-trace-id: 60f0305e2abc511d175262647666bdc5 +access-control-allow-headers: Origin,No-Cache,X-Requested-With,If-Modified-Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,Access-Control-Allow-Credentials,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Cache-Webcdn,x-bilibili-key-real-ip,x-backend-bili-real-ip,x-risk-header +cross-origin-resource-policy: cross-origin +access-control-expose-headers: X-Bili-Gaia-Vvoucher,X-Bili-Trace-Id +expires: Thu, 15 Aug 2024 09:10:08 GMT +cache-control: no-cache +x-cache-webcdn: BYPASS from blzone01 +content-encoding: br +X-Firefox-Spdy: h2 +``` + +
diff --git a/login/login_action/readme.md b/docs/login/login_action/readme.md similarity index 51% rename from login/login_action/readme.md rename to docs/login/login_action/readme.md index 05fb8aa..f891531 100644 --- a/login/login_action/readme.md +++ b/docs/login/login_action/readme.md @@ -1,6 +1,6 @@ # 登录操作 -人机验证方式登录包含**账号密码登录**与手**机短信验证码登录** +人机验证方式登录包含**账号密码登录**与**手机短信验证码登录** **注:扫码登录**不需要进行**人机验证**,故**不使用**以下接口 @@ -16,13 +16,14 @@ 2. 进行滑动or点击验证 3. 返回验证结果`validate`与`seccode`,进行短信或密码登录 - -### 申请验证码参数 +### 申请captcha验证码 > https://passport.bilibili.com/x/passport-login/captcha?source=main_web *请求方式:GET* +注: 另外参见 [密码登录-手机号验证-获取 captcha](password.md#获取-captcha) + **json回复:** 根对象: @@ -31,17 +32,17 @@ | ------ | ---- | -------- | --------- | | code | num | 返回值 | 0:成功 | | message | str | 返回信息 | | -| ttl | num | 1 | **作用尚不明确** | +| ttl | num | 1 | | | data | obj | 信息本体 | | `data`对象: | 字段 | 类型 | 内容 | 备注 | | -------- | ----- | ------ | -------- | -| geetest | obj | 套了个娃 | | -| tencent | obj | 套了个娃 | **作用尚不明确** | -| token | str | 极验token | 与人机验证无关,与登录接口有关 | -| type | str | 验证方式 | 用于判断使用哪一种验证方式,目前所见只有极验 | +| geetest | obj | 极验captcha数据 | | +| tencent | obj | (?) | **作用尚不明确** | +| token | str | 登录 API token | 与 captcha 无关,与登录接口有关 | +| type | str | 验证方式 | 用于判断使用哪一种验证方式,目前所见只有极验
geetest:极验 | `geetest`对象: @@ -80,9 +81,74 @@ curl 'https://passport.bilibili.com/x/passport-login/captcha?source=main_web' +### 申请captcha验证码 (旧版) + +> http://passport.bilibili.com/web/captcha/combine + +*请求方式:GET* + +该接口曾从文档移除过, 经过测试仍可正常使用 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------ | ------ | ---- | +| plat | num | 平台类型 | 必要 | 默认为 6 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | -------- | --------- | +| code | num | 返回值 | 0:成功 | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ----- | ------ | -------- | +| result | obj | 套了个娃 | | +| type | num | 1 | **作用尚不明确** | + +`result`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ----- | ------ | -------- | +| success | num | 1 | **作用尚不明确** | +| gt | str | 极验id | 一般为固定值 | +| challenge | str | 极验KEY | 由B站后端产生用于人机验证 | +| key | str | 登录秘钥 | 与 captcha 无关, 与登录接口有关, 亦作 token | + +**示例:** + +```shell +curl 'https://passport.bilibili.com/web/captcha/combine?plat=6' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "data": { + "result": { + "success": 1, + "gt": "bd111e81eda1cbb9f54425aafc0908ac", + "challenge": "2903a8eb967a1d990444cb23ea42f417", + "key": "76fb59fbd83a4d9d816162c5156fc964" + }, + "type": 1 + } +} +``` + +
+ ### 进行验证 -本文档为Bilibili文档,验证码为geetest极验提供,故不提供api +本文档为 Bilibili 文档,验证码为 [geetest 极验](https://docs.geetest.com/sensebot/start/) 提供,故不提供相关 API 附: [手动验证器](https://kuresaru.github.io/geetest-validator/) [及其源码](https://github.com/kuresaru/geetest-validator) @@ -92,7 +158,6 @@ curl 'https://passport.bilibili.com/x/passport-login/captcha?source=main_web' 3. 验证完成后,点击按钮5生成验证结果 4. 使用最开始获得到的`key`、`challenge`和刚获得到的`validate`、`seccode`继续之后的登录操作 - ### 继续登录 - [短信登录](SMS.md) diff --git a/login/login_info.md b/docs/login/login_info.md similarity index 70% rename from login/login_info.md rename to docs/login/login_info.md index 05d2b67..c87c4b5 100644 --- a/login/login_info.md +++ b/docs/login/login_info.md @@ -1,18 +1,10 @@ # 登录基本信息 -- [导航栏用户信息](#导航栏用户信息) -- [~~登录用户信息仅部分(已弃用)~~](#~~登录用户信息仅部分(已弃用)~~) -- [登录用户信息(APP端)](#登录用户信息(APP端)) -- [登录用户状态数(双端)](#登录用户状态数(双端)) -- [获取硬币数](#获取硬币数) - ---- - ## 导航栏用户信息 -> http://api.bilibili.com/nav(带有转义) +> ~~https://api.bilibili.com/nav(带有转义)~~ (已失效) > -> http://api.bilibili.com/x/web-interface/nav(原始数据) +> https://api.bilibili.com/x/web-interface/nav(原始数据) *请求方式:GET* @@ -35,30 +27,33 @@ | -------------------- | ---- | ---------------- | ------------------------------------------------- | | isLogin | bool | 是否已登录 | false:未登录
true:已登录 | | email_verified | num | 是否验证邮箱地址 | 0:未验证
1:已验证 | -| face | str | 用户头像url | | +| face | str | 用户头像 url | | | level_info | obj | 等级信息 | | -| mid | num | 用户mid | | +| mid | num | 用户 mid | | | mobile_verified | num | 是否验证手机号 | 0:未验证
1:已验证 | | money | num | 拥有硬币数 | | | moral | num | 当前节操值 | 上限为70 | | official | obj | 认证信息 | | -| officialVerify | obj | 认证信息2 | | +| officialVerify | obj | 认证信息 2 | | | pendant | obj | 头像框信息 | | -| scores | num | 0 | 作用尚不明确 | +| scores | num | (?) | | | uname | str | 用户昵称 | | | vipDueDate | num | 会员到期时间 | 毫秒 时间戳 | | vipStatus | num | 会员开通状态 | 0:无
1:有 | | vipType | num | 会员类型 | 0:无
1:月度大会员
2:年度及以上大会员 | | vip_pay_type | num | 会员开通状态 | 0:无
1:有 | -| vip_theme_type | num | 0 | 作用尚不明确 | +| vip_theme_type | num | (?) | | | vip_label | obj | 会员标签 | | | vip_avatar_subscript | num | 是否显示会员图标 | 0:不显示
1:显示 | | vip_nickname_color | str | 会员昵称颜色 | 颜色码 | | wallet | obj | B币钱包信息 | | | has_shop | bool | 是否拥有推广商品 | false:无
true:有 | -| shop_url | str | 商品推广页面url | | -| allowance_count | num | 0 | 作用尚不明确 | -| answer_status | num | 0 | 作用尚不明确 | +| shop_url | str | 商品推广页面 url | | +| allowance_count | num | (?) | | +| answer_status | num | (?) | | +| is_senior_member | num | 是否硬核会员 | 0:非硬核会员
1:硬核会员 | +| wbi_img | obj | Wbi 签名实时口令 | 该字段即使用户未登录也存在 | +| is_jury | bool | 是否风纪委员 | true:风纪委员
false:非风纪委员 | `data`中的`level_info`对象: @@ -73,7 +68,7 @@ | 字段 | 类型 | 内容 | 备注 | | ----- | ---- | -------- | ------------------------------------------------- | -| role | num | 认证类型 | 0:无
1 2 7:个人认证
3 4 5 6:机构认证 | +| role | num | 认证类型 | 见[用户认证类型一览](../user/official_role.md) | | title | str | 认证信息 | 无为空 | | desc | str | 认证备注 | 无为空 | | type | num | 是否认证 | -1:无
0:认证 | @@ -87,35 +82,44 @@ `data`中的`pendant`对象: -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ----------- | ------------ | -| pid | num | 挂件id | | -| name | str | 挂件名称 | | -| image | str | 挂件图片url | | -| expire | num | 0 | 作用尚不明确 | +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ----------- | ---- | +| pid | num | 挂件id | | +| name | str | 挂件名称 | | +| image | str | 挂件图片url | | +| expire | num | (?) | | `data`中的`vip_label`对象: | 字段 | 类型 | 内容 | 备注 | | ----------- | ---- | -------- | ------------------------------------------------------------ | -| path | str | 空 | 作用尚不明确 | +| path | str | (?) | | | text | str | 会员名称 | | | label_theme | str | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员 | `data`中的`wallet`对象: -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------- | ------------ | -| mid | num | 登录用户mid | | -| bcoin_balance | num | 拥有B币数 | | -| coupon_balance | num | 每月奖励B币数 | | -| coupon_due_time | num | 0 | 作用尚不明确 | +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | ------------- | ---- | +| mid | num | 登录用户mid | | +| bcoin_balance | num | 拥有B币数 | | +| coupon_balance | num | 每月奖励B币数 | | +| coupon_due_time | num | (?) | | + +`data`中的`wbi_img`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ------------------------------- | ---------------------------------------- | +| img_url | str | Wbi 签名参数 `imgKey`的伪装 url | 详见文档 [Wbi 签名](../misc/sign/wbi.md) | +| sub_url | str | Wbi 签名参数 `subKey`的伪装 url | 详见文档 [Wbi 签名](../misc/sign/wbi.md) | **示例:** +**登录状态:** + ```shell -curl 'http://api.bilibili.com/nav' \ --b 'SESSDATA=xxx' +curl 'https://api.bilibili.com/x/web-interface/nav' \ + -b 'SESSDATA=xxx' ```
@@ -123,64 +127,136 @@ curl 'http://api.bilibili.com/nav' \ ```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 + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "isLogin": true, + "email_verified": 1, + "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "face_nft": 0, + "face_nft_type": 0, + "level_info": { + "current_level": 6, + "current_min": 28800, + "current_exp": 52689, + "next_exp": "--" }, - "mid":293793435, - "mobile_verified":1, - "money":33.4, - "moral":70, - "official":{ - "role":0, - "title":"", - "desc":"", - "type":-1 + "mid": 293793435, + "mobile_verified": 1, + "money": 172.4, + "moral": 70, + "official": { + "role": 0, + "title": "", + "desc": "", + "type": -1 }, - "officialVerify":{ - "type":-1, - "desc":"" + "officialVerify": { + "type": -1, + "desc": "" }, - "pendant":{ - "pid":0, - "name":"", - "image":"", - "expire":0, - "image_enhance":"" + "pendant": { + "pid": 2511, + "name": "初音未来13周年", + "image": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", + "expire": 0, + "image_enhance": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", + "image_enhance_frame": "https://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png" }, - "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" + "scores": 0, + "uname": "社会易姐QwQ", + "vipDueDate": 1707494400000, + "vipStatus": 1, + "vipType": 2, + "vip_pay_type": 0, + "vip_theme_type": 0, + "vip_label": { + "path": "", + "text": "年度大会员", + "label_theme": "annual_vip", + "text_color": "#FFFFFF", + "bg_style": 1, + "bg_color": "#FB7299", + "border_color": "", + "use_img_label": true, + "img_label_uri_hans": "", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png" }, - "vip_avatar_subscript":1, - "vip_nickname_color":"#FB7299", - "wallet":{ - "mid":293793435, - "bcoin_balance":8, - "coupon_balance":5, - "coupon_due_time":0 + "vip_avatar_subscript": 1, + "vip_nickname_color": "#FB7299", + "vip": { + "type": 2, + "status": 1, + "due_date": 1707494400000, + "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": "", + "use_img_label": true, + "img_label_uri_hans": "", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png" + }, + "avatar_subscript": 1, + "nickname_color": "#FB7299", + "role": 3, + "avatar_subscript_url": "", + "tv_vip_status": 0, + "tv_vip_pay_type": 0, + "tv_due_date": 1640793600 + }, + "wallet": { + "mid": 293793435, + "bcoin_balance": 5, + "coupon_balance": 5, + "coupon_due_time": 0 + }, + "has_shop": true, + "shop_url": "https://gf.bilibili.com?msource=main_station", + "allowance_count": 0, + "answer_status": 0, + "is_senior_member": 1, + "wbi_img": { + "img_url": "https://i0.hdslb.com/bfs/wbi/653657f524a547ac981ded72ea172057.png", + "sub_url": "https://i0.hdslb.com/bfs/wbi/6e4909c702f846728e64f6007736a338.png" + }, + "is_jury": false + } +} +``` + +
+ +**未登录状态:** + +```shell +curl 'https://api.bilibili.com/x/web-interface/nav' +``` + +
+查看响应示例: + +```json +{ + "code": -101, + "message": "账号未登录", + "ttl": 1, + "data": { + "isLogin": false, + "wbi_img": { + "img_url": "https://i0.hdslb.com/bfs/wbi/653657f524a547ac981ded72ea172057.png", + "sub_url": "https://i0.hdslb.com/bfs/wbi/6e4909c702f846728e64f6007736a338.png" }, - "has_shop":false, - "shop_url":"", - "allowance_count":0, - "answer_status":0 } } ``` @@ -192,7 +268,7 @@ curl 'http://api.bilibili.com/nav' \
查看折叠内容 -> http://account.bilibili.com/home/userInfo +> https://account.bilibili.com/home/userInfo *请求方式:GET* @@ -242,7 +318,7 @@ curl 'http://api.bilibili.com/nav' \ **示例:** ```shell -curl 'http://account.bilibili.com/home/userInfo' \ +curl 'https://account.bilibili.com/home/userInfo' \ -b 'SESSDATA=xxx;DedeUserID=1;' ``` @@ -281,7 +357,7 @@ curl 'http://account.bilibili.com/home/userInfo' \ ## 登录用户信息(APP端) -> http://app.bilibili.com/x/v2/account/myinfo +> https://app.bilibili.com/x/v2/account/myinfo *请求方式:GET* @@ -372,7 +448,7 @@ curl 'http://account.bilibili.com/home/userInfo' \ **示例:** ```shell -curl -G 'http://app.bilibili.com/x/v2/account/myinfo' \ +curl -G 'https://app.bilibili.com/x/v2/account/myinfo' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'appkey=4409e2ce8ffd12b8' \ --data-urlencode 'ts=0' \ @@ -436,7 +512,7 @@ curl -G 'http://app.bilibili.com/x/v2/account/myinfo' \ ## 登录用户状态数(双端) -> http://api.bilibili.com/x/web-interface/nav/stat +> https://api.bilibili.com/x/web-interface/nav/stat *请求方式:GET* @@ -472,7 +548,7 @@ curl -G 'http://app.bilibili.com/x/v2/account/myinfo' \ Cookie方式: ```shell -curl 'http://api.bilibili.com/x/web-interface/nav/stat' \ +curl 'https://api.bilibili.com/x/web-interface/nav/stat' \ -b 'SESSDATA=xxx' ``` @@ -497,7 +573,7 @@ curl 'http://api.bilibili.com/x/web-interface/nav/stat' \ APP方式: ```shell -curl -G 'http://api.bilibili.com/x/web-interface/nav/stat' \ +curl -G 'https://api.bilibili.com/x/web-interface/nav/stat' \ --data-urlencode 'access_key=d907f51122c59599d580ade2315af971' ``` @@ -521,7 +597,7 @@ curl -G 'http://api.bilibili.com/x/web-interface/nav/stat' \ ## 获取硬币数 -> http://account.bilibili.com/site/getCoin +> https://account.bilibili.com/site/getCoin *请求方式:GET* @@ -548,7 +624,7 @@ curl -G 'http://api.bilibili.com/x/web-interface/nav/stat' \ **示例:** ```shell -curl 'http://account.bilibili.com/site/getCoin' \ +curl 'https://account.bilibili.com/site/getCoin' \ -b 'SESSDATA=xxx;DedeUserID=1;' ``` @@ -566,4 +642,4 @@ curl 'http://account.bilibili.com/site/getCoin' \ } ``` -
\ No newline at end of file +
diff --git a/docs/login/login_notice.md b/docs/login/login_notice.md new file mode 100644 index 0000000..720c0a2 --- /dev/null +++ b/docs/login/login_notice.md @@ -0,0 +1,269 @@ +# 登录记录 + +## 查询登录记录 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---------- | ------ | ------------------------------------------------------------ | +| mid | num | 用户mid | 必要 | 必须为自己的mid | +| buvid | str | 设备虚拟id | 非必要 | web端为操作登录接口时Cookie中的`buvid3`
若登录设备无`buvid`则留空 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
-403:访问权限不足 | +| 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' +``` + +
+查看响应示例: + +```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.***.**" + } +} +``` + +
+ +## 最近一周的登录情况 + +> + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---------- | ------ | -------- | +| jsonp | str | 回调函数名? | 非必要 | 默认 jsonp | +| web_location | str | 网页位置? | 非必要 | 默认 333.33 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ------------ | ----- | +| count | num | 记录总数 | | +| list | arr | 登录记录列表 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| 0 | obj | 登录记录1 | | +| …… | obj | …… | | +| n | obj | 登录记录(n+1) | | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | -------------- | ---- | +| ip | str | 登录 IP | IPv4:末 2 位以 `*` 打码
IPv6:末 5 位以 `*` 打码 | +| time | num | 登录时间 | UNIX 秒级时间戳 | +| time_at | str | 登录时间 | 格式为 `yyyy-MM-dd HH:mm:ss` | +| status | bool | 是否登录成功? | | +| type | num | 登录方式? | | +| geo | str | 登录地理位置 | | + +**示例:** + +查询本用户最近一周的登录情况 + +```shell +curl -G "https://api.bilibili.com/x/member/web/login/log" \ + -b "SESSDATA=xxx" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "count": 15, + "list": [ + { + "ip": "240e:*:*:*:*:*:*:*", + "time": 1746038055, + "time_at": "2025-05-01 02:34:15", + "status": true, + "type": 0, + "geo": "中国广西梧州电信" + }, + { + "ip": "108.181.*.*", + "time": 1722036741, + "time_at": "2024-07-27 07:32:21", + "status": true, + "type": 0, + "geo": "美国加利福尼亚州洛杉矶telus.com" + }, + { + "ip": "104.28.*.*", + "time": 1722040653, + "time_at": "2024-07-27 08:37:33", + "status": true, + "type": 0, + "geo": "巴西" + }, + { + "ip": "104.28.*.*", + "time": 1721950332, + "time_at": "2024-07-26 07:32:12", + "status": true, + "type": 0, + "geo": "新加坡cloudflare.com" + }, + { + "ip": "104.28.*.*", + "time": 1721964627, + "time_at": "2024-07-26 11:30:27", + "status": true, + "type": 0, + "geo": "美国弗吉尼亚州雷斯顿cloudflare.com" + }, + { + "ip": "143.92.*.*", + "time": 1721861861, + "time_at": "2024-07-25 06:57:41", + "status": true, + "type": 0, + "geo": "中国香港特别行政区" + }, + { + "ip": "143.92.*.*", + "time": 1721861855, + "time_at": "2024-07-25 06:57:35", + "status": true, + "type": 0, + "geo": "中国香港特别行政区" + }, + { + "ip": "104.28.*.*", + "time": 1721709514, + "time_at": "2024-07-23 12:38:34", + "status": true, + "type": 0, + "geo": "日本千叶县成田市cloudflare.com" + }, + { + "ip": "104.28.*.*", + "time": 1721709618, + "time_at": "2024-07-23 12:40:18", + "status": true, + "type": 0, + "geo": "日本千叶县成田市cloudflare.com" + }, + { + "ip": "143.92.*.*", + "time": 1721636125, + "time_at": "2024-07-22 16:15:25", + "status": true, + "type": 0, + "geo": "中国香港特别行政区" + }, + { + "ip": "143.92.*.*", + "time": 1721636111, + "time_at": "2024-07-22 16:15:11", + "status": true, + "type": 0, + "geo": "中国香港特别行政区" + }, + { + "ip": "104.28.*.*", + "time": 1721539870, + "time_at": "2024-07-21 13:31:10", + "status": true, + "type": 0, + "geo": "美国加利福尼亚州东洛杉矶cloudflare.com" + }, + { + "ip": "104.28.*.*", + "time": 1721539965, + "time_at": "2024-07-21 13:32:45", + "status": true, + "type": 0, + "geo": "美国加利福尼亚州东洛杉矶cloudflare.com" + }, + { + "ip": "42.2.*.*", + "time": 1721477962, + "time_at": "2024-07-20 20:19:22", + "status": true, + "type": 0, + "geo": "中国香港特别行政区pccw.com" + }, + { + "ip": "42.2.*.*", + "time": 1721477960, + "time_at": "2024-07-20 20:19:20", + "status": true, + "type": 0, + "geo": "中国香港特别行政区pccw.com" + } + ] + } +} +``` + +
diff --git a/login/member_center.md b/docs/login/member_center.md similarity index 77% rename from login/member_center.md rename to docs/login/member_center.md index 1d3685a..226d8d2 100644 --- a/login/member_center.md +++ b/docs/login/member_center.md @@ -1,20 +1,8 @@ # 个人中心 -- [获取我的信息](#获取我的信息) -- [查询每日奖励状态](#查询每日奖励状态) -- [查询每日投币获得经验数](#查询每日投币获得经验数) -- [查询大会员状态](#查询大会员状态) -- [查询账号安全情况](#查询账号安全情况) -- [查询账号实名认证状态](#查询账号实名认证状态) -- [查询实名认证详细信息](#查询实名认证详细信息) -- [查询硬币变化情况](#查询硬币变化情况) -- [修改个人签名](#修改个人签名) - ---- - ## 获取我的信息 -> http://api.bilibili.com/x/member/web/account +> https://api.bilibili.com/x/member/web/account *请求方式:GET* @@ -53,7 +41,7 @@ **示例:** ```shell -curl 'http://api.bilibili.com/x/member/web/account' \ +curl 'https://api.bilibili.com/x/member/web/account' \ -b 'SESSDATA=xxx' ``` @@ -82,7 +70,7 @@ curl 'http://api.bilibili.com/x/member/web/account' \ ## 查询每日奖励状态 -> http://api.bilibili.com/x/member/web/exp/reward +> https://api.bilibili.com/x/member/web/exp/reward *请求方式:GET* @@ -113,15 +101,15 @@ curl 'http://api.bilibili.com/x/member/web/account' \ | watch | bool | 每日观看 | false:未完成
true:已完成
完成奖励5经验 | | coins | num | 每日投币所奖励的经验 | 上限为50
注:该值更新存在延迟
[另外一个专门API](#查询每日投币获得经验数) | | share | bool | 每日分享 | false:未完成
true:已完成
完成奖励5经验 | -| email | bool | 绑定邮箱 | false:未完成
true:已完成 | -| tel | bool | 绑定手机号 | false:未完成
true:已完成
首次完成完成奖励100经验 | -| safe_question | bool | 设置密保问题 | false:未完成
true:已完成 | +| email | bool | 绑定邮箱 | false:未完成
true:已完成
首次完成奖励20经验 | +| tel | bool | 绑定手机号 | false:未完成
true:已完成
首次完成奖励100经验 | +| safe_question | bool | 设置密保问题 | false:未完成
true:已完成
首次完成奖励30经验 | | identify_card | bool | 实名认证 | false:未完成
true:已完成
首次完成奖励50经验 | **示例:** ```shell -curl 'http://api.bilibili.com/x/member/web/exp/reward' \ +curl 'https://api.bilibili.com/x/member/web/exp/reward' \ -b 'SESSDATA=xxx' ``` @@ -150,14 +138,14 @@ curl 'http://api.bilibili.com/x/member/web/exp/reward' \ ## 查询每日投币获得经验数 ->http://www.bilibili.com/plus/account/exp.php +> ~~https://www.bilibili.com/plus/account/exp.php~~ (已失效) +> +> https://api.bilibili.com/x/web-interface/coin/today/exp *请求方式:GET* 认证方式:仅可Cookie(SESSDATA) -鉴权方式:Cookie中`DedeUserID`存在且不为0 - 该接口实时更新,未发现延迟 **json回复:** @@ -168,13 +156,13 @@ curl 'http://api.bilibili.com/x/member/web/exp/reward' \ | ------- | ---- | -------------------- | ----------- | | code | num | 返回值 | 0:成功 | | message | str | 错误信息 | 默认为0 | -| number | num | 每日投币所奖励的经验 | 上限为50
@@ -184,7 +172,8 @@ curl 'http://www.bilibili.com/plus/account/exp.php' \ { "code": 0, "message": "0", - "number": 20 + "ttl": 1, + "data": 20 } ``` @@ -192,7 +181,7 @@ curl 'http://www.bilibili.com/plus/account/exp.php' \ ## 查询大会员状态 -> http://api.bilibili.com/x/vip/web/user/info +> https://api.bilibili.com/x/vip/web/user/info *请求方式:GET* @@ -223,7 +212,7 @@ curl 'http://www.bilibili.com/plus/account/exp.php' \ **示例:** ```shell -curl 'http://api.bilibili.com/x/vip/web/user/info' \ +curl 'https://api.bilibili.com/x/vip/web/user/info' \ -b 'SESSDATA=xxx' ``` @@ -250,7 +239,7 @@ curl 'http://api.bilibili.com/x/vip/web/user/info' \ ## 查询账号安全情况 -> http://passport.bilibili.com/web/site/user/info +> https://passport.bilibili.com/web/site/user/info *请求方式:GET* @@ -295,7 +284,7 @@ curl 'http://api.bilibili.com/x/vip/web/user/info' \ | tel_verify | bool | 是否验证手机号 | false:未验证
true:已验证 | | mail_verify | bool | 是否验证邮箱 | false:未验证
true:已验证 | | unneeded_check | bool | 是否未设置密码 | false:已设置
true:未设置 | -| realname_certified | bool | 是否实名认证 | false:已认证
true:未认证 | +| realname_certified | bool | 是否实名认证 | false:未认证
true:已认证 | `data`中的`account_safe`对象: @@ -323,7 +312,7 @@ curl 'http://api.bilibili.com/x/vip/web/user/info' \ **示例:** ```shell -curl 'http://passport.bilibili.com/web/site/user/info' \ +curl 'https://passport.bilibili.com/web/site/user/info' \ -b 'SESSDATA=xxx;DedeUserID=1;' ``` @@ -366,7 +355,7 @@ curl 'http://passport.bilibili.com/web/site/user/info' \ ## 查询账号实名认证状态 -> http://api.bilibili.com/x/member/realname/status +> https://api.bilibili.com/x/member/realname/status *请求方式:GET* @@ -400,7 +389,7 @@ curl 'http://passport.bilibili.com/web/site/user/info' \ 当前状态为已认证 ```shell -curl 'http://api.bilibili.com/x/member/realname/status' \ +curl 'https://api.bilibili.com/x/member/realname/status' \ -b 'SESSDATA=xxx' ``` @@ -422,7 +411,7 @@ curl 'http://api.bilibili.com/x/member/realname/status' \ ## 查询实名认证详细信息 -> http://api.bilibili.com/x/member/realname/apply/status +> https://api.bilibili.com/x/member/realname/apply/status *请求方式:GET* @@ -456,7 +445,7 @@ curl 'http://api.bilibili.com/x/member/realname/status' \ | card_type | num | 证件类型代码 | 0:身份证
2:港澳居民来往内地通行证
3:台湾居民来往大陆通行证
4:护照(中国签发)
5:外国人永久居留证
6:其他国家或地区身份证明 | ```shell -curl 'http://api.bilibili.com/x/member/realname/apply/status' \ +curl 'https://api.bilibili.com/x/member/realname/apply/status' \ -b 'SESSDATA=xxx' ``` @@ -482,7 +471,7 @@ curl 'http://api.bilibili.com/x/member/realname/apply/status' \ ## 查询硬币变化情况 -> http://api.bilibili.com/x/member/web/coin/log +> https://api.bilibili.com/x/member/web/coin/log *请求方式:GET* @@ -533,7 +522,7 @@ curl 'http://api.bilibili.com/x/member/realname/apply/status' \ **示例:** ```shell -curl 'http://api.bilibili.com/x/member/web/coin/log' \ +curl 'https://api.bilibili.com/x/member/web/coin/log' \ -b 'SESSDATA=xxx' ``` @@ -622,7 +611,7 @@ curl 'http://api.bilibili.com/x/member/web/coin/log' \ ## 修改个人签名 -> http://api.bilibili.com/x/member/web/sign/update +> https://api.bilibili.com/x/member/web/sign/update *请求方式:POST* @@ -653,7 +642,7 @@ curl 'http://api.bilibili.com/x/member/web/coin/log' \ 更新个人标签为`高中技术宅一枚,爱好MC&电子&8-bit音乐&数码&编程,资深猿厨,粉丝群:1136462265` ```shell -curl 'http://api.bilibili.com/x/member/web/sign/update' \ +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' @@ -672,4 +661,197 @@ curl 'http://api.bilibili.com/x/member/web/sign/update' \ +## 最近一周的经验记录 +> https://api.bilibili.com/x/member/web/exp/log + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---------- | ------ | -------- | +| jsonp | str | 回调函数名? | 非必要 | 默认 jsonp | +| web_location | str | 网页位置? | 非必要 | 默认 333.33 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0: 成功
-101: 账号未登录 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ------ | ---------------- | ---- | +| list | array | 经验记录条目列表 | | +| count | num | 经验记录条目数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----- | ---- | +| 0 | obj | 记录1 | | +| …… | obj | …… | …… | +| n | obj | 记录(n+1) | | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | -------- | ---- | +| delta | num | 经验值 | | +| time | str | 记录时间 | 格式为 yyyy-MM-dd HH:mm:ss | +| reason | str | 记录原因 | | + +**示例:** + +```shell +curl -G "https://api.bilibili.com/x/member/web/exp/log" \ +-b "SESSDATA=xxx +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "delta": 5, + "time": "2024-07-27 15:08:23", + "reason": "分享视频奖励" + }, + { + "delta": 5, + "time": "2024-07-27 08:28:21", + "reason": "登录奖励" + }, + { + "delta": 5, + "time": "2024-07-27 08:28:21", + "reason": "观看视频奖励" + }, + { + "delta": 5, + "time": "2024-07-26 12:44:19", + "reason": "登录奖励" + }, + { + "delta": 5, + "time": "2024-07-26 12:44:19", + "reason": "观看视频奖励" + }, + { + "delta": 20, + "time": "2024-07-25 06:58:49", + "reason": "视频投币奖励" + }, + { + "delta": 5, + "time": "2024-07-25 06:58:30", + "reason": "观看视频奖励" + }, + { + "delta": 5, + "time": "2024-07-25 06:58:30", + "reason": "登录奖励" + }, + { + "delta": 5, + "time": "2024-07-23 18:47:48", + "reason": "观看视频奖励" + }, + { + "delta": 5, + "time": "2024-07-23 18:47:48", + "reason": "登录奖励" + } + ], + "count": 10 + } +} +``` + +
+ +## 最近一周的节操记录 + +> https://api.bilibili.com/x/member/web/moral/log + +*请求方式: GET* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---------- | ------ | -------- | +| jsonp | str | 回调函数名? | 非必要 | 默认 jsonp | +| web_location | str | 网页位置? | 非必要 | 默认 333.33 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| code | num | 返回值 | 0: 成功
-101: 账号未登录 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ------ | ---------------- | ---- | +| moral | num | 节操值 | | +| list | array | 记录条目列表 | | +| count | num | 记录条目数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----- | ---- | +| 0 | obj | 记录1 | | +| …… | obj | …… | …… | +| n | obj | 记录(n+1) | | + +`list`数组中的对象: + +*表现良好暂时没有记录, 欢迎封号斗罗前来补充* + +**示例:** + +```shell +curl -G "https://api.bilibili.com/x/member/web/moral/log" \ +-b "SESSDATA=xxx +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "moral": 70, + "list": [], + "count": 0 + } +} +``` + +
diff --git a/docs/manga/Activity.md b/docs/manga/Activity.md new file mode 100644 index 0000000..6a3d812 --- /dev/null +++ b/docs/manga/Activity.md @@ -0,0 +1,76 @@ +# 漫画任务操作 + +## 分享漫画 + +> https://manga.bilibili.com/twirp/activity.v1.Activity/ShareComic + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ 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' +``` + +
+分享成功: + +```json +{ + "code": 0, + "msg": "", + "data": { + "point": 5 + } +} +``` + +
+ +
+今日已分享: + +```json +{ + "code": 0, + "msg": "今日已分享" +} +``` + +
diff --git a/docs/manga/ClockIn.md b/docs/manga/ClockIn.md new file mode 100644 index 0000000..36681ed --- /dev/null +++ b/docs/manga/ClockIn.md @@ -0,0 +1,217 @@ +# 签到 + +> https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ APP + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|----------|-----|----|-----|---------| +| platform | str | 平台 | 必要 | android | +| device | str | 平台 | 非必要 | h5 | + +**正文参数( application/json ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|------|-----|------|-----|-------| +| type | num | | 非必要 | 补签时使用 | +| date | str | 补签日期 | 必要 | 补签时使用 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|-----------|------|--------------------------------------------| +| code | num / str | 返回值 | 0:成功
invalid_argument:今日已签到 | +| msg | str | 错误信息 | 成功:空
已签到: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' +``` + +
+签到成功: + +```json +{ + "code": 0, + "msg": "", + "data": {} +} +``` + +
+ +
+今日已签到: + +```json +{ + "code": "invalid_argument", + "msg": "clockin clockin is duplicate", + "meta": { + "argument": "clockin" + } +} +``` + +
+ +补签: + +```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"}' +``` + +
+补签成功: + +```json +{ + "code": 0, + "msg": "", + "data": {} +} +``` + +
+ +# 查询签到状态 + +> https://manga.bilibili.com/twirp/activity.v1.Activity/GetClockInInfo + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ APP + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|-----|------|------| +| code | num | 返回值 | 0:成功 | +| msg | str | 错误信息 | 空 | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------------|-------|------------------|------------------| +| day_count | num | 连续签到天数 | | +| status | num | 今日是否已签到 | 0:未签到
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' +``` + +
+成功: + +```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" + } +} +``` + +
\ No newline at end of file diff --git a/docs/manga/Comic.md b/docs/manga/Comic.md new file mode 100644 index 0000000..af9d4bb --- /dev/null +++ b/docs/manga/Comic.md @@ -0,0 +1,4223 @@ +# 购买漫画章节 + +> https://manga.bilibili.com/twirp/comic.v1.Comic/BuyEpisode + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ 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 ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | +| epId | num | 章节id | 必要 | | +| buyMethod | num | 购买方式 | 必要 | 2:漫读券
4:新人等免
5:通用券 | +| couponId | num | 漫读券id | 必要 | | +| comicId | num | 漫画id | 可选 | buyMethod:4为必要| +| autoPayGoldStatus | num | 2 | 可选 | buyMethod:2,5 为必要
buyMethod:4为不必要 | +| isPresale | num | 0 | 可选 | buyMethod:2,5 为必要
buyMethod:4为不必要 | + +漫读券购买 + +``` +{ + "epId": 484366, + "buyMethod": 2, + "couponId": 7461430, + "autoPayGoldStatus": 2, + "isPresale": 0 +} +``` + +等就免费(新人等免) +``` +{ + "ep_id": 321913, + "comic_id": 26564, + "buy_method": 4 +} +``` + +通用券购买 + +``` +{ + "epId": 484366, + "buyMethod": 5, + "couponId": 0, + "autoPayGoldStatus": 2, + "payAmount": 1, + "isPresale": 0 +} +``` + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
0:本话无需购买
1:没有足够的卡券使用次数
| +| msg | str | 错误信息 | | + +**示例:** + +```bash +curl -L -X POST 'https://manga.bilibili.com/twirp/comic.v1.Comic/BuyEpisode?platform=android' \ +-H 'Cookie: SESSDATA=xxx;' \ +-H 'Content-Type: application/json' \ +--data-raw '{ + "epId": 484366, + "buyMethod": 2, + "couponId": 7461430, + "autoPayGoldStatus": 2, + "isPresale": 0 +}' +``` + +
+购买成功: + +```json +{ + "code": 0, + "msg": "", + "data": { + "auto_use_item": "" + } +} +``` + +
+ +# 获取漫画详情 + +> https://manga.bilibili.com/twirp/comic.v1.Comic/ComicDetail + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ APP + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | +| access_key | str | APP登录凭证 | 非必要 | 可不登录访问 | +| appkey | str | cc8617fd6961e070 | 非必要 | | +| mobi_app | str | android_comic | 非必要 | | +| version | str | 4.13.0 | 非必要 | | +| build | str | 36413002 | 非必要 | | +| channel | str | bilicomic | 非必要 | | +| platform | str | android | 非必要 | 可选值:web/android | +| device | str | android | 必要 | 如不填则不会获取ep_list信息,可选值:pc/android | +| buvid | str | | 非必要 | | +| machine | str | samsung+SM-G9730 | 非必要 | | +| is_teenager | num | 0 | 非必要 | | +| no_recommend | num | 0 | 非必要 | | +| ts | num | 秒级时间戳 | 非必要 | | + +**正文参数( application/json ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | +| comicId | num | 漫画id | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功 | +| msg | str | 错误信息 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| id | num | 漫画id | | +| title | str | 漫画名称 | | +| comic_type | num | 0,1 | | +| page_default | num | 0,1,2,4,8 | | +| page_allow | num | | | +| horizontal_cover | str | 横板封面 | | +| square_cover | str | 方形封面 | | +| vertical_cover | str | 竖版封面 | | +| author_name | array | 作者列表 | | +| styles | array | | | +| last_ord | num | 最新一话序号 | | +| is_finish | num | 完结状态
0:未完结 1:已完结 | | +| status | num | -1,0 | | +| fav | num | | | +| read_order | num | | | +| evaluate | num | 漫画简介 | | +| total | num | 总话数 | | +| ep_list | array | 章节信息 | | +| release_time | str | | | +| is_limit | num | | | +| read_epid | num | | | +| last_read_time | str | | | +| is_download | num | | | +| read_short_title | str | | | +| styles2 | array | | | +| renewal_time | str | | | +| last_short_title | str | 最新一话短标题 | | +| discount_type | num | | | +| discount | num | | | +| discount_end | str | | | +| no_reward | bool | | | +| batch_discount_type | num | | | +| ep_discount_type | num | | | +| has_fav_activity | bool | | | +| fav_free_amount | num | | | +| allow_wait_free | bool | 是否等就免费 | | +| wait_hour | num | 等待时间(小时) | | +| wait_free_at | num | 等待时间(小时) | | +| no_danmaku | num | | | +| auto_pay_status | num | | | +| no_month_ticket | bool | | | +| immersive | bool | | | +| no_discount | bool | | | +| show_type | num | | | +| pay_mode | num | | | +| chapters | array | | | +| classic_lines | str | 漫画简介 | | +| pay_for_new | num | | | +| fav_comic_info | obj | | | +| serial_status | num | | | +| series_info | obj | | | +| album_count | num | | | +| wiki_id | num | | | +| disable_coupon_amount | num | | | +| japan_comic | bool |是否为日本漫画 | | +| interact_value | num | | | +| temporary_finish_time | str | | | +| video | | | | +| introduction | str | 介绍| | +| comment_status | num | | | +| no_screenshot | bool | | | +| type | num | | | +| vomic_cvs | array | | | +| no_rank | bool | | | +| presale_eps | array | | | +| presale_text | str | | | +| presale_discount | num | | | +| no_leaderboard | bool | | | + +`ep_list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| id | num | 章节id | | +| ord | num | 章节序号,最新章节排在前面 | | +| read | num | 是否阅读过,0:没有 1:阅读过 | | +| pay_mode | num | | | +| is_locked | bool | 是否处于锁定状态 | | +| pay_gold | num | 解锁所需漫币 | | +| size | num | 文件大小(字节) | | +| short_title | str | 短标题 | | +| is_in_free | bool | | | +| title | str | 标题 | | +| cover | str | 封面 | | +| pub_time | str | 发布日期 | | +| comments | num | 评论数 | | +| unlock_expire_at | str | | | +| unlock_type | num | | | +| allow_wait_free | bool | | | +| progress | str | | | +| like_count | num | 点赞数 | | +| chapter_id | num | | | +| type | num | | | +| extra | num | | | + +`styles2`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| id | num | 漫画风格id | | +| name | str | 漫画风格名称 | | + +`fav_comic_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| has_fav_activity | bool | | | +| fav_free_amount | num | | | +| fav_coupon_type | num | | | + +`series_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| id | num | | | +| comics | array | | | + +**示例:** + +```bash +curl -L -X POST 'https://manga.bilibili.com/twirp/comic.v1.Comic/ComicDetail?device=pc' \ +-H 'Content-Type: application/json' \ +--data-raw '{ + "comicId": 28500 +}' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "", + "data": { + "id": 28500, + "title": "夏日重现", + "comic_type": 1, + "page_default": 4, + "page_allow": 15, + "horizontal_cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "square_cover": "http://i0.hdslb.com/bfs/manga-static/35fa9fa6190aa528f26f6e1341d9ee80b66b535f.jpg", + "vertical_cover": "https://i0.hdslb.com/bfs/manga-static/965cdb5c83e0b2066b4b60973ba7f4242f592967.jpg", + "author_name": [ + "田中靖规", + "集英社" + ], + "styles": [ + "悬疑灵异" + ], + "last_ord": 152, + "is_finish": 1, + "status": 0, + "fav": 0, + "read_order": 0, + "evaluate": "【此漫画的翻译由版权方提供】青梅竹马的潮死了——。听闻这个悲报,慎平回到了阔别已久的故乡和歌山市·日都岛与家人再会并出席葬礼。但是岛上貌似陡生异变,充斥着不寻常的气息……?\n夏日孤岛上的悬疑剧!!\n\n", + "total": 167, + "ep_list": [ + { + "id": 779804, + "ord": 152, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17973126, + "short_title": "后篇(4)", + "is_in_free": false, + "title": "2026未然凶宅-后篇(4)", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 218, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 458, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 779788, + "ord": 151, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17654401, + "short_title": "后篇(3)", + "is_in_free": false, + "title": "2026未然凶宅-后篇(3)", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 31, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 171, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 779782, + "ord": 150, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18250988, + "short_title": "后篇(2)", + "is_in_free": false, + "title": "2026未然凶宅-后篇(2)", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 39, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 179, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 779752, + "ord": 149, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19374429, + "short_title": "后篇(1)", + "is_in_free": false, + "title": "2026未然凶宅-后篇(1)", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 41, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 174, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 779751, + "ord": 148, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20993207, + "short_title": "前篇(3)", + "is_in_free": false, + "title": "2026未然凶宅-前篇(3)", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 52, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 187, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 779749, + "ord": 147, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17048075, + "short_title": "前篇(2)", + "is_in_free": false, + "title": "2026未然凶宅-前篇(2)", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 60, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 191, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 779748, + "ord": 146, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21462932, + "short_title": "前篇(1)", + "is_in_free": false, + "title": "2026未然凶宅-前篇(1)", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 151, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 233, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 546499, + "ord": 145, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 26980054, + "short_title": "139", + "is_in_free": false, + "title": "第139话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2021-02-01 12:00:00", + "comments": 1314, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 3241, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 543783, + "ord": 144, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 33822142, + "short_title": "138", + "is_in_free": false, + "title": "第138话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2021-01-25 12:00:00", + "comments": 232, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 514, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 539917, + "ord": 143, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20551895, + "short_title": "137", + "is_in_free": false, + "title": "第137话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2021-01-11 12:00:00", + "comments": 124, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 461, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 529960, + "ord": 142, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18729857, + "short_title": "136", + "is_in_free": false, + "title": "第136话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-12-28 12:00:00", + "comments": 112, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 432, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 526882, + "ord": 141, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 9528871, + "short_title": "135", + "is_in_free": false, + "title": "第135话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-12-21 12:00:00", + "comments": 64, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 397, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 524737, + "ord": 140, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 4658617, + "short_title": "记录", + "is_in_free": false, + "title": "023", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-12-14 12:00:00", + "comments": 63, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 368, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 520819, + "ord": 139, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19569820, + "short_title": "134", + "is_in_free": false, + "title": "第134话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-12-07 12:00:00", + "comments": 234, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 411, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 518563, + "ord": 138, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "133", + "is_in_free": false, + "title": "第133话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-11-30 12:00:00", + "comments": 52, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 404, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 516460, + "ord": 137, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 16923412, + "short_title": "132", + "is_in_free": false, + "title": "第132话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-11-23 12:00:00", + "comments": 66, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 408, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 513494, + "ord": 136, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22397411, + "short_title": "131", + "is_in_free": false, + "title": "第131话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-11-16 00:00:00", + "comments": 73, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 385, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 509309, + "ord": 135, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 11417949, + "short_title": "130", + "is_in_free": false, + "title": "第130话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-11-02 12:00:00", + "comments": 121, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 415, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 507403, + "ord": 134, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 13421937, + "short_title": "129", + "is_in_free": false, + "title": "第129话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-26 00:00:00", + "comments": 108, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 382, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 505464, + "ord": 133, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "128", + "is_in_free": false, + "title": "第128话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 101, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 414, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 504084, + "ord": 132, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 714738, + "short_title": "记录", + "is_in_free": false, + "title": "022", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 38, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 327, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 503749, + "ord": 131, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 13733489, + "short_title": "127", + "is_in_free": false, + "title": "第127话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 87, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 383, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 498378, + "ord": 130, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "126", + "is_in_free": false, + "title": "第126话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 83, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 392, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 496100, + "ord": 129, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17044238, + "short_title": "125", + "is_in_free": false, + "title": "第125话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 59, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 378, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494999, + "ord": 128, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19000950, + "short_title": "124", + "is_in_free": false, + "title": "第124话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 53, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 369, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494997, + "ord": 127, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 757788, + "short_title": "记录", + "is_in_free": false, + "title": "021", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 73, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 295, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494996, + "ord": 126, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 25583325, + "short_title": "123", + "is_in_free": false, + "title": "第123话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 88, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 341, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494995, + "ord": 125, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22945986, + "short_title": "122", + "is_in_free": false, + "title": "第122话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 114, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 382, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494994, + "ord": 124, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22007815, + "short_title": "121", + "is_in_free": false, + "title": "第121话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 60, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 336, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494992, + "ord": 123, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 14200387, + "short_title": "120", + "is_in_free": false, + "title": "第120话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 98, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 349, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494990, + "ord": 122, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20253075, + "short_title": "119", + "is_in_free": false, + "title": "第119话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 153, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 352, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494986, + "ord": 121, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 34545559, + "short_title": "118", + "is_in_free": false, + "title": "第118话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 97, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 353, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494983, + "ord": 120, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 26875814, + "short_title": "117", + "is_in_free": false, + "title": "第117话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 38, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 326, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494982, + "ord": 119, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 24302773, + "short_title": "116", + "is_in_free": false, + "title": "第116话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 60, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 311, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494981, + "ord": 118, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22563845, + "short_title": "115", + "is_in_free": false, + "title": "第115话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 103, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 332, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494979, + "ord": 117, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 26357441, + "short_title": "114", + "is_in_free": false, + "title": "第114话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 190, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 325, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494978, + "ord": 116, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 3055913, + "short_title": "记录", + "is_in_free": false, + "title": "020", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 27, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 303, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494977, + "ord": 115, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 27213199, + "short_title": "113", + "is_in_free": false, + "title": "第113话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 131, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 344, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494876, + "ord": 114, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 27036215, + "short_title": "112", + "is_in_free": false, + "title": "第112话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 84, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 306, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494872, + "ord": 113, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18077367, + "short_title": "111", + "is_in_free": false, + "title": "第111话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 66, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 317, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494852, + "ord": 112, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 6547152, + "short_title": "记录", + "is_in_free": false, + "title": "019", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 20, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 286, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494849, + "ord": 111, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17709563, + "short_title": "110", + "is_in_free": false, + "title": "第110话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 42, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 326, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494848, + "ord": 110, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "109", + "is_in_free": false, + "title": "第109话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 42, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 325, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494847, + "ord": 109, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20356850, + "short_title": "108", + "is_in_free": false, + "title": "第108话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 52, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 322, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494846, + "ord": 108, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21075013, + "short_title": "107", + "is_in_free": false, + "title": "第107话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 29, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 314, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494698, + "ord": 107, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19078032, + "short_title": "106", + "is_in_free": false, + "title": "第106话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 81, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 320, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494696, + "ord": 106, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21291294, + "short_title": "105", + "is_in_free": false, + "title": "第105话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 56, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 350, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494691, + "ord": 105, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22030863, + "short_title": "104", + "is_in_free": false, + "title": "第104话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 56, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 305, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494690, + "ord": 104, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17400960, + "short_title": "103", + "is_in_free": false, + "title": "第103话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 33, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 304, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494688, + "ord": 103, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "102", + "is_in_free": false, + "title": "第102话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 53, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 329, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552061, + "ord": 102.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1922541, + "short_title": "记录", + "is_in_free": false, + "title": "018", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 8, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 30, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494682, + "ord": 102, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20268719, + "short_title": "101", + "is_in_free": false, + "title": "第101话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 92, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 317, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494666, + "ord": 101, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17542840, + "short_title": "100", + "is_in_free": false, + "title": "第100话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 48, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 323, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494665, + "ord": 100, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 27598387, + "short_title": "99", + "is_in_free": false, + "title": "第99话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 109, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 350, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494664, + "ord": 99, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 24852154, + "short_title": "98", + "is_in_free": false, + "title": "第98话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 64, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 326, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494663, + "ord": 98, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20721168, + "short_title": "97", + "is_in_free": false, + "title": "第97话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 57, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 309, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494656, + "ord": 97, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 15000137, + "short_title": "96", + "is_in_free": false, + "title": "第96话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 126, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 339, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552060, + "ord": 96.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 3910437, + "short_title": "记录", + "is_in_free": false, + "title": "017", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 5, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 30, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494650, + "ord": 96, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 25062481, + "short_title": "95", + "is_in_free": false, + "title": "第95话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 89, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 360, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494645, + "ord": 95, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19376143, + "short_title": "94", + "is_in_free": false, + "title": "第94话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 82, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 397, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494638, + "ord": 94, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 34661163, + "short_title": "93", + "is_in_free": false, + "title": "第93话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 64, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 352, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494637, + "ord": 93, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 33798923, + "short_title": "92", + "is_in_free": false, + "title": "第92话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 55, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 350, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494632, + "ord": 92, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19784232, + "short_title": "91", + "is_in_free": false, + "title": "第91话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 81, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 387, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494627, + "ord": 91, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18532096, + "short_title": "90", + "is_in_free": false, + "title": "第90话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 121, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 371, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 494009, + "ord": 90, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19527018, + "short_title": "89", + "is_in_free": false, + "title": "第89话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 57, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 330, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552059, + "ord": 89.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 2034891, + "short_title": "记录", + "is_in_free": false, + "title": "016", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 14, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 33, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 493979, + "ord": 89, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18494693, + "short_title": "88", + "is_in_free": false, + "title": "第88话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 87, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 351, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 493950, + "ord": 88, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17416462, + "short_title": "87", + "is_in_free": false, + "title": "第87话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 71, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 343, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 493944, + "ord": 87, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "86", + "is_in_free": false, + "title": "第86话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 88, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 357, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552058, + "ord": 86.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 4837743, + "short_title": "记录", + "is_in_free": false, + "title": "015", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-10 00:00:00", + "comments": 9, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 42, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491230, + "ord": 86, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21039936, + "short_title": "85", + "is_in_free": false, + "title": "第85话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 59, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 319, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491229, + "ord": 85, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 14463535, + "short_title": "84", + "is_in_free": false, + "title": "第84话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 87, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 344, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552057, + "ord": 84.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 11625156, + "short_title": "记录", + "is_in_free": false, + "title": "014", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-10 00:00:00", + "comments": 12, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 46, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491228, + "ord": 84, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 15900351, + "short_title": "83", + "is_in_free": false, + "title": "第83话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 71, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 347, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491227, + "ord": 83, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19182670, + "short_title": "82", + "is_in_free": false, + "title": "第82话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 67, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 355, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491226, + "ord": 82, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18627336, + "short_title": "81", + "is_in_free": false, + "title": "第81话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 45, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 347, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491225, + "ord": 81, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 15574642, + "short_title": "80", + "is_in_free": false, + "title": "第80话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 51, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 346, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491224, + "ord": 80, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 24885059, + "short_title": "79", + "is_in_free": false, + "title": "第79话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 79, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 350, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491223, + "ord": 79, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22427296, + "short_title": "78", + "is_in_free": false, + "title": "第78话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 80, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 356, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552056, + "ord": 78.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1551067, + "short_title": "记录", + "is_in_free": false, + "title": "013", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 5, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 38, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491222, + "ord": 78, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18725322, + "short_title": "77", + "is_in_free": false, + "title": "第77话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 100, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 354, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491221, + "ord": 77, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 16185606, + "short_title": "76", + "is_in_free": false, + "title": "第76话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 59, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 341, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491220, + "ord": 76, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18886387, + "short_title": "75", + "is_in_free": false, + "title": "第75话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 88, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 370, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491215, + "ord": 75, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19228812, + "short_title": "74", + "is_in_free": false, + "title": "第74话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 106, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 343, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552054, + "ord": 74.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1106084, + "short_title": "记录", + "is_in_free": false, + "title": "012", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 9, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 43, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491214, + "ord": 74, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17213820, + "short_title": "73", + "is_in_free": false, + "title": "第73话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 105, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 358, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552053, + "ord": 73.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1510250, + "short_title": "记录", + "is_in_free": false, + "title": "011", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-10 00:00:00", + "comments": 7, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 46, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491213, + "ord": 73, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 12514556, + "short_title": "72", + "is_in_free": false, + "title": "第72话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 38, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 356, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491212, + "ord": 72, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 24337518, + "short_title": "71", + "is_in_free": false, + "title": "第71话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 45, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 353, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491211, + "ord": 71, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22329539, + "short_title": "70", + "is_in_free": false, + "title": "第70话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 45, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 343, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491210, + "ord": 70, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 12721444, + "short_title": "69", + "is_in_free": false, + "title": "第69话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 59, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 363, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491209, + "ord": 69, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 14948018, + "short_title": "68", + "is_in_free": false, + "title": "第68话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 48, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 363, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491208, + "ord": 68, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19604576, + "short_title": "67", + "is_in_free": false, + "title": "第67话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 97, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 370, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491207, + "ord": 67, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18529368, + "short_title": "66", + "is_in_free": false, + "title": "第66话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 136, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 386, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491206, + "ord": 66, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19616688, + "short_title": "65", + "is_in_free": false, + "title": "第65话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 79, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 350, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 491205, + "ord": 65, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17889729, + "short_title": "64", + "is_in_free": false, + "title": "第64话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 77, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 369, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552052, + "ord": 64.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1729726, + "short_title": "记录", + "is_in_free": false, + "title": "010", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-10 00:00:00", + "comments": 47, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 47, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485887, + "ord": 64, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 24816564, + "short_title": "63", + "is_in_free": false, + "title": "第63话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 96, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 363, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485886, + "ord": 63, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21990493, + "short_title": "62", + "is_in_free": false, + "title": "第62话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 161, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 377, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485885, + "ord": 62, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 16121252, + "short_title": "61", + "is_in_free": false, + "title": "第61话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 35, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 338, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485884, + "ord": 61, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 23868117, + "short_title": "60", + "is_in_free": false, + "title": "第60话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 54, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 353, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485883, + "ord": 60, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 14907334, + "short_title": "59", + "is_in_free": false, + "title": "第59话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 57, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 360, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485882, + "ord": 59, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21003716, + "short_title": "58", + "is_in_free": false, + "title": "第58话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 49, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 362, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485881, + "ord": 58, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21336454, + "short_title": "57", + "is_in_free": false, + "title": "第57话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 43, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 335, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485880, + "ord": 57, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 15975510, + "short_title": "56", + "is_in_free": false, + "title": "第56话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 43, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 346, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485879, + "ord": 56, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 16073891, + "short_title": "55", + "is_in_free": false, + "title": "第55话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 48, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 352, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552051, + "ord": 55.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1380370, + "short_title": "记录", + "is_in_free": false, + "title": "009", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 8, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 49, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485878, + "ord": 55, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 13480749, + "short_title": "54", + "is_in_free": false, + "title": "第54话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 56, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 357, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485877, + "ord": 54, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21882584, + "short_title": "53", + "is_in_free": false, + "title": "第53话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 38, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 372, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485853, + "ord": 53, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 23862198, + "short_title": "52", + "is_in_free": false, + "title": "第52话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 56, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 388, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485852, + "ord": 52, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 23267613, + "short_title": "51", + "is_in_free": false, + "title": "第51话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 43, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 370, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485851, + "ord": 51, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17028529, + "short_title": "50", + "is_in_free": false, + "title": "第50话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 63, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 380, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485850, + "ord": 50, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21963399, + "short_title": "49", + "is_in_free": false, + "title": "第49话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 122, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 418, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552050, + "ord": 49.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1650224, + "short_title": "记录", + "is_in_free": false, + "title": "008", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 15, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 57, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485849, + "ord": 49, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "48", + "is_in_free": false, + "title": "第48话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 71, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 392, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485848, + "ord": 48, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18582327, + "short_title": "47", + "is_in_free": false, + "title": "第47话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 64, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 401, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485847, + "ord": 47, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 28025152, + "short_title": "46", + "is_in_free": false, + "title": "第46话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 78, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 444, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485846, + "ord": 46, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18644930, + "short_title": "45", + "is_in_free": false, + "title": "第45话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 27, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 402, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485845, + "ord": 45, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17555220, + "short_title": "44", + "is_in_free": false, + "title": "第44话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 71, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 418, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485844, + "ord": 44, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 23713922, + "short_title": "43", + "is_in_free": false, + "title": "第43话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 41, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 392, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485842, + "ord": 43, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22048242, + "short_title": "42", + "is_in_free": false, + "title": "第42话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 36, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 400, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485841, + "ord": 42, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17956496, + "short_title": "41", + "is_in_free": false, + "title": "第41话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 45, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 423, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485840, + "ord": 41, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20461324, + "short_title": "40", + "is_in_free": false, + "title": "第40话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 102, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 441, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485839, + "ord": 40, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 16463871, + "short_title": "39", + "is_in_free": false, + "title": "第39话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 38, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 404, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485836, + "ord": 39, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18664684, + "short_title": "38", + "is_in_free": false, + "title": "第38话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 42, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 403, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485835, + "ord": 38, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17811979, + "short_title": "37", + "is_in_free": false, + "title": "第37话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 46, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 422, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552049, + "ord": 37.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 4923840, + "short_title": "记录", + "is_in_free": false, + "title": "005~007", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 9, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 59, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485834, + "ord": 37, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22221360, + "short_title": "36", + "is_in_free": false, + "title": "第36话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 78, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 410, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485833, + "ord": 36, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19204738, + "short_title": "35", + "is_in_free": false, + "title": "第35话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 42, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 397, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485832, + "ord": 35, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17688181, + "short_title": "34", + "is_in_free": false, + "title": "第34话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 43, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 407, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485831, + "ord": 34, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 14314953, + "short_title": "33", + "is_in_free": false, + "title": "第33话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 138, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 430, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 485826, + "ord": 33, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 15190983, + "short_title": "32", + "is_in_free": false, + "title": "第32话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 80, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 409, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484535, + "ord": 32, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21701429, + "short_title": "31", + "is_in_free": false, + "title": "第31话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 81, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 408, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484534, + "ord": 31, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 15619952, + "short_title": "30", + "is_in_free": false, + "title": "第30话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 61, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 429, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484528, + "ord": 30, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18250579, + "short_title": "29", + "is_in_free": false, + "title": "第29话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 60, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 435, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484526, + "ord": 29, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 27051218, + "short_title": "28", + "is_in_free": false, + "title": "第28话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 59, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 406, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484514, + "ord": 28, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "27", + "is_in_free": false, + "title": "第27话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 63, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 420, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484507, + "ord": 27, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17113482, + "short_title": "26", + "is_in_free": false, + "title": "第26话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 98, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 447, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484500, + "ord": 26, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 14359689, + "short_title": "25", + "is_in_free": false, + "title": "第25话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 63, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 407, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484483, + "ord": 25, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 15182223, + "short_title": "24", + "is_in_free": false, + "title": "第24话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 55, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 421, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484478, + "ord": 24, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20914179, + "short_title": "23", + "is_in_free": false, + "title": "第23话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 75, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 447, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484474, + "ord": 23, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 17764811, + "short_title": "22", + "is_in_free": false, + "title": "第22话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 65, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 434, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484461, + "ord": 22, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 27296421, + "short_title": "21", + "is_in_free": false, + "title": "第21话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 51, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 441, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484443, + "ord": 21, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 15462050, + "short_title": "记录", + "is_in_free": false, + "title": "004", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 115, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 455, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484433, + "ord": 20, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20824911, + "short_title": "20", + "is_in_free": false, + "title": "第20话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 127, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 497, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484422, + "ord": 19, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 25714866, + "short_title": "19", + "is_in_free": false, + "title": "第19话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 106, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 537, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484395, + "ord": 18, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 24927577, + "short_title": "18", + "is_in_free": false, + "title": "第18话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 94, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 527, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484387, + "ord": 17, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 0, + "short_title": "17", + "is_in_free": false, + "title": "第17话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 48, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 493, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484377, + "ord": 16, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 19775909, + "short_title": "16", + "is_in_free": false, + "title": "第16话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 70, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 503, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552046, + "ord": 15.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 3261603, + "short_title": "记录", + "is_in_free": false, + "title": "003", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2021-02-18 13:17:06", + "comments": 39, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 385, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484376, + "ord": 15, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 23101595, + "short_title": "15", + "is_in_free": false, + "title": "第15话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 97, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 510, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484375, + "ord": 14, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 21456269, + "short_title": "14", + "is_in_free": false, + "title": "第14话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 130, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 510, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484373, + "ord": 13, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 22942430, + "short_title": "13", + "is_in_free": false, + "title": "第13话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 64, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 522, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484372, + "ord": 12, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20225389, + "short_title": "12", + "is_in_free": false, + "title": "第12话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 67, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 499, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552048, + "ord": 11.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1569935, + "short_title": "记录", + "is_in_free": false, + "title": "002", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 10, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 52, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484369, + "ord": 11, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18897621, + "short_title": "11", + "is_in_free": false, + "title": "第11话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 82, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 566, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484367, + "ord": 10, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 28021344, + "short_title": "10", + "is_in_free": false, + "title": "第10话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 65, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 519, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484366, + "ord": 9, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 14198049, + "short_title": "9", + "is_in_free": false, + "title": "第9话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 72, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 544, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484365, + "ord": 8, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 14137875, + "short_title": "8", + "is_in_free": false, + "title": "第8话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 92, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 575, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 552047, + "ord": 7.5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 1794952, + "short_title": "记录", + "is_in_free": false, + "title": "001", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2022-05-12 00:00:00", + "comments": 23, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 80, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484360, + "ord": 7, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 20283011, + "short_title": "7", + "is_in_free": false, + "title": "第7话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 83, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 589, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484351, + "ord": 6, + "read": 0, + "pay_mode": 1, + "is_locked": true, + "pay_gold": 49, + "size": 18898536, + "short_title": "6", + "is_in_free": false, + "title": "第6话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 43, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 626, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484350, + "ord": 5, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 18623472, + "short_title": "5", + "is_in_free": false, + "title": "第5话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 86, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 1017, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484347, + "ord": 4, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 15209423, + "short_title": "4", + "is_in_free": false, + "title": "第4话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 85, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 976, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484345, + "ord": 3, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 15210025, + "short_title": "3", + "is_in_free": false, + "title": "第3话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 72, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 972, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484344, + "ord": 2, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 26269998, + "short_title": "2", + "is_in_free": false, + "title": "第2话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 147, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 1001, + "chapter_id": 0, + "type": 0, + "extra": 0 + }, + { + "id": 484342, + "ord": 1, + "read": 0, + "pay_mode": 0, + "is_locked": false, + "pay_gold": 0, + "size": 81495763, + "short_title": "1", + "is_in_free": false, + "title": "第1话", + "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", + "pub_time": "2020-10-21 00:00:00", + "comments": 407, + "unlock_expire_at": "0000-00-00 00:00:00", + "unlock_type": 0, + "allow_wait_free": false, + "progress": "", + "like_count": 1283, + "chapter_id": 0, + "type": 0, + "extra": 0 + } + ], + "release_time": "2020.10.21", + "is_limit": 0, + "read_epid": 0, + "last_read_time": "", + "is_download": 1, + "read_short_title": "", + "styles2": [ + { + "id": 1081, + "name": "悬疑灵异" + } + ], + "renewal_time": "", + "last_short_title": "后篇(4)", + "discount_type": 0, + "discount": 0, + "discount_end": "0001-01-01 00:00:00", + "no_reward": false, + "batch_discount_type": 0, + "ep_discount_type": 0, + "has_fav_activity": false, + "fav_free_amount": 0, + "allow_wait_free": false, + "wait_hour": 0, + "wait_free_at": "0000-00-00 00:00:00", + "no_danmaku": 0, + "auto_pay_status": 0, + "no_month_ticket": false, + "immersive": false, + "no_discount": false, + "show_type": 0, + "pay_mode": 1, + "chapters": [], + "classic_lines": "【此漫画的翻译由版权方提供】青梅竹马的潮死了——。听闻这个悲报,慎平回到了阔别已久的故乡和歌山市·日都岛与家人再会并出席葬礼。但是岛上貌似陡生异变,充斥着不寻常的气息……?\n夏日孤岛上的悬疑剧!!\n\n", + "pay_for_new": 0, + "fav_comic_info": { + "has_fav_activity": false, + "fav_free_amount": 0, + "fav_coupon_type": 0 + }, + "serial_status": 0, + "series_info": { + "id": 0, + "comics": [] + }, + "album_count": 0, + "wiki_id": 131075, + "disable_coupon_amount": 2, + "japan_comic": true, + "interact_value": "57514", + "temporary_finish_time": "", + "video": null, + "introduction": "最聪明的男主打最聪明的反派!", + "comment_status": 1, + "no_screenshot": true, + "type": 0, + "vomic_cvs": [], + "no_rank": true, + "presale_eps": [], + "presale_text": "", + "presale_discount": 0, + "no_leaderboard": true + } +} +``` + +
diff --git a/docs/manga/Download.md b/docs/manga/Download.md new file mode 100644 index 0000000..fea8a8f --- /dev/null +++ b/docs/manga/Download.md @@ -0,0 +1,256 @@ +# 获取当前话全部图片地址 + +> https://manga.bilibili.com/twirp/comic.v1.Comic/GetImageIndex + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ 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 ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | +| epId(ep_id) | num | 当前话的id | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功 | +| msg | str | 错误信息 | | +| data | obj | | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| path | str | .index 文件路径 | | +| 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 +}' +``` + +
+查看响应示例: + + +```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 + } + } +} +``` + +
+ +# 获取某一图片的token + +> https://manga.bilibili.com/twirp/comic.v1.Comic/ImageToken + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ 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}\"]`
{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\"]" +}' +``` + +
+查看响应示例: + + + +```json +{ + "code": 0, + "msg": "", + "data": [ + { + "url": "https://manga.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg", + "token": "36931815abb35857627a22c347dc1c86&ts=634045c2" + } + ] +} +``` + +
+ +# 下载图片 + +*请求方式: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 +``` + +**注**:若不加取图 Token 直接访问 `https://(i0|i1).hdslb.com/bfs/(manga|new_dyn|archive)/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg`均无法获取 diff --git a/docs/manga/Season.md b/docs/manga/Season.md new file mode 100644 index 0000000..7f59df6 --- /dev/null +++ b/docs/manga/Season.md @@ -0,0 +1,435 @@ +# 漫画赛季 + +**注**:漫画赛季仅在 app 端可见,但可以使用 Cookie 鉴权 + +## 获取赛季信息 + +> https://manga.bilibili.com/twirp/user.v1.Season/GetSeasonInfo + +*请求方式:POST* + +**注**:接口不鉴权可查看基本信息,鉴权后可查看赛季个人信息和赛季规则。 + +认证方式:Cookie(SESSDATA)/ 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:未完成
1:待领取奖励
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-限免卡
202-漫读券
203-优惠券
205-最终宝箱 | +| success | num | 兑换状态 | 0-未兑换
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 +``` + +
+查看响应示例: + +```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 } + } +} +``` + +
+ +## 赛季奖励领取 + +> https://manga.bilibili.com/twirp/user.v1.Season/TakeSeasonGifts + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ 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` | diff --git a/docs/manga/User.md b/docs/manga/User.md new file mode 100644 index 0000000..7118a32 --- /dev/null +++ b/docs/manga/User.md @@ -0,0 +1,712 @@ +# 漫画用户信息 + +## 获取拥有的漫读券列表 + +> https://manga.bilibili.com/twirp/user.v1.User/GetCoupons + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ APP + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | +| access_key | str | APP登录凭证 | 必要 | 使用APP鉴权方式时必填 | + +**正文参数 (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 | 是否即将过期?
0:否
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 +}' +``` + +
+查看响应示例: + +```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 + } + } +} +``` + +
+ +## 获取已购漫画 + +> https://manga.bilibili.com/twirp/user.v1.User/GetAutoBuyComics + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ 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}' +``` + +
+查看响应示例: + +```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 + } + ] +} +``` + +
\ No newline at end of file diff --git a/docs/manga/index_file.md b/docs/manga/index_file.md new file mode 100644 index 0000000..8e552f8 --- /dev/null +++ b/docs/manga/index_file.md @@ -0,0 +1,269 @@ +# 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 | +查看json内容: + +```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} + ] +} +``` + + + +## 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 | 图片高度 | | diff --git a/docs/manga/light_card.md b/docs/manga/light_card.md new file mode 100644 index 0000000..405daa4 --- /dev/null +++ b/docs/manga/light_card.md @@ -0,0 +1,200 @@ +# 获取轻享卡信息 + +> https://manga.bilibili.com/twirp/card.v1.Card/GetUserLightCard + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)/ APP + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|------------|-----|----------------|-----|-----------------| +| access_key | str | 登录`access_key` | | 与`SESSDATA`二选其一 | + +**json回复:** + +根对象: + +| 字段名 | 类型 | 内容 | 备注 | +|------|-----|------|------| +| code | num | 响应码 | 0:成功 | +| msg | str | | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段名 | 类型 | 内容 | 备注 | +|--------------------|-------|----------------|---------------------------------| +| state | num | 轻享卡开通状态 | 0:未开通
1:已开通 | +| show_state | num | | | +| expire_date | str | 轻享卡到期时间 | | +| receive_amount | num | 已领取数量 | | +| save_money | num | 已节省漫币 | | +| index | num | 默认选择签到周期 | | +| week | array | 一个领取周期内的领取状态信息 | | +| month_reward_state | num | 是否可选择全勤奖 | 0:不可领取
1:可领取
2:不可领取(灰色) | +| month_reward | num | | | +| cur_month_end | str | 全勤奖领取剩余时间 | | +| server_time | str | 当前服务器时间 | | + +`week`数组中的对象: + +| 字段名 | 类型 | 内容 | 备注 | +|-------------------|-----|-------------|------------------------------------------------| +| index | num | 第几领取周期 | 从`1`开始 | +| start_time | str | 本周期领取开始时间 | 1:待领取
2:已领取
3:明日可领
4:已失效
5:可领取 | +| end_time | str | 本周期领取结束时间 | `同上` | +| first | num | 本周期第1天的领取状态 | `同上` | +| second | num | 本周期第2天的领取状态 | `同上` | +| third | num | 本周期第3天的领取状态 | `同上` | +| fourth | num | 本周期第4天的领取状态 | `同上` | +| full_reward_state | num | 周期全勤奖领取状态 | 1:不可领取
2:可领取
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' +``` + +
+查看响应示例: + +```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" + } +} +``` + +
+ +# 领取轻享卡奖励 + +> https://manga.bilibili.com/twirp/card.v1.Card/GetLightCoupon + +*请求方式:POST* + +是否需要登录:`是` + +认证方式:Cookie(SESSDATA)/ APP + +Content-Type:`application/json` + +**URL参数:** + +| 参数名 | 类型 | 必填 | 内容 | 备注 | +|------------|-----|----|-----------------|----| +| access_key | str | | 与`SESSDATA`二选其一 | | + +**正文参数( application/json ):** + +| 参数名 | 类型 | 必填 | 内容 | 备注 | +|-----------|-----|----|------|----------------------| +| weekIndex | num | √ | 第几周 | 从`1`开始 | +| type | num | √ | 领取类型 | 1:领取漫读券
2:领取限免卡 | + +**json回复:** + +根对象: + +| 字段名 | 类型 | 内容 | 备注 | +|------|-----|-----|-------------------------------------------------------------------| +| code | num | 响应码 | 0:成功
3:今日已领取,请明日再来
3:还未满足领取条件
4:找不到数据~
6:你点击太快了哦~ | +| 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}' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "", + "data": {} +} +``` + +
\ No newline at end of file diff --git a/manga/point_shop.md b/docs/manga/point_shop.md similarity index 90% rename from manga/point_shop.md rename to docs/manga/point_shop.md index 8ed50cb..97d628c 100644 --- a/manga/point_shop.md +++ b/docs/manga/point_shop.md @@ -1,18 +1,10 @@ # 积分商城 -- [获取当前持有点数](#获取当前持有点数) -- [获取兑换奖品列表](#获取兑换奖品列表) -- [兑换物品](#兑换物品) -- [获取兑换历史记录](#获取兑换历史记录) -- [获取玩法说明](#获取玩法说明) - -*积分商城由web页面提供功能,地址为:* - -> https://manga.bilibili.com/eden/credits-exchange.html +**注**:积分商城由web页面提供功能,地址为 https://manga.bilibili.com/eden/credits-exchange.html ## 获取当前持有点数 -> http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint +> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint *请求方式:POST* @@ -37,7 +29,7 @@ **示例:** ```bash -curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint' \ +curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint' \ -b 'SESSDATA=xxx' ``` @@ -59,7 +51,7 @@ curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint' \ ## 获取兑换奖品列表 -> http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct +> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct *请求方式:POST* @@ -110,7 +102,7 @@ curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint' \ **示例:** ```bash -curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct' +curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct' ```
@@ -252,7 +244,7 @@ curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct' ## 兑换物品 -> http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange +> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange *请求方式:POST* @@ -272,13 +264,13 @@ curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct' | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:兑换成功
1:积分不足
2:库存不足
3:product point mismatch(point填写错误)
3:超过用户最大可兑换数量
4:现在抢票的人太多啦,再点一下有机会优先上车喔 ε=ε=(ノ≧∇≦)ノ | +| code | num | 返回值 | 0:兑换成功
1:积分不足
1:您点的太快了~
2:库存不足
3:product point mismatch(point填写错误)
3:超过用户最大可兑换数量
4:现在抢票的人太多啦,再点一下有机会优先上车喔 ε=ε=(ノ≧∇≦)ノ | | message | str | 错误信息 | | **示例:** ```bash -curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange' \ +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' \ @@ -299,7 +291,7 @@ curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange' \ ## 获取兑换历史记录 -> http://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList +> https://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList *请求方式:POST* @@ -343,7 +335,7 @@ curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange' \ **示例:** ```bash -curl 'http://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList' \ +curl 'https://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList' \ --data-urlencode 'act_id=90018' \ -b 'SESSDATA=xxx' ``` @@ -408,7 +400,7 @@ curl 'http://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList' \ ## 获取玩法说明 -> http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule +> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule *请求方式:POST* @@ -431,7 +423,7 @@ curl 'http://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList' \ **示例:** ```bash -curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule' +curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule' ```
@@ -448,4 +440,4 @@ curl 'http://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule' } ``` -
\ No newline at end of file +
diff --git a/docs/message/msg.md b/docs/message/msg.md new file mode 100644 index 0000000..8e368db --- /dev/null +++ b/docs/message/msg.md @@ -0,0 +1,84 @@ +# 通知消息 + +## 获取未读消息数 + +> + +> (新接口) + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +本接口不会返回未读的私信数,要获取未读的私信数请参阅[未读私信数](private_msg.md#未读私信数)相关说明 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------- | ------ | ------------------------- | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------------ | -------------------------- | +| at | num | 未读at数 | | +| chat | num | 0 | 仅旧接口,**作用尚不明确** | +| coin | num | 未读投币数 | | +| danmu | num | 未读弹幕数 | | +| favorite | num | 未读收藏数 | | +| like | num | 未读点赞数 | | +| recv_like | num | 未读点赞数 | 同 `like` | +| recv_reply | num | 未读回复数 | 同 `reply` | +| reply | num | 未读回复数 | | +| sys_msg | num | 未读系统通知数 | | +| sys_msg_style | num | 1 | 仅新接口, **作用尚不明确** | +| up | num | 未读UP主助手信息数 | | + +**示例:** + +以下信息代表了未读点赞数为10,未读回复数为4,未读at消息数为3,未读系统通知数为2,未读UP主助手信息数为1 + +```shell +curl 'https://api.vc.bilibili.com/x/im/web/msgfeed/unread' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "at": 3, + "chat": 0, + "coin": 0, + "danmu": 0, + "favorite": 0, + "like": 10, + "recv_like": 10, + "recv_reply": 4, + "reply": 4, + "sys_msg": 2, + "sys_msg_style": 1, + "up": 1 + } +} +``` + +
diff --git a/docs/message/private_msg.md b/docs/message/private_msg.md new file mode 100644 index 0000000..0baf0b4 --- /dev/null +++ b/docs/message/private_msg.md @@ -0,0 +1,2077 @@ +# 私信 + +## 对象与常量说明 + +### 会话对象 + +| 字段 | 类型 | 内容 | 备注 | +| -------------------- | ---- | -------------------------------- | --------------------------------------------------- | +| talker_id | num | 聊天对象的id | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | +| session_type | num | 聊天对象的类型 | 1:用户
2:粉丝团 | +| at_seqno | num | 最近一次未读at自己的消息的序列号 | 在粉丝团会话中有效,若没有未读的 at 自己的消息则为 `0` | +| top_ts | num | 置顶该会话的时间 | 微秒级时间戳;若未置顶该会话则为 `0`;用于判断是否置顶了会话 | +| group_name | str | 粉丝团名称 | 在粉丝团会话中有效,其他会话中为空字符串 | +| group_cover | str | 粉丝团头像 | 在粉丝团会话中有效,其他会话中为空字符串 | +| is_follow | num | 是否关注了对方 | 在用户会话中有效,系统会话中为 `1`, 其他会话中为 `0` | +| is_dnd | num | 是否对会话设置了免打扰 | | +| ack_seqno | num | 最近一次已读的消息序列号 | 用于快速跳转到首条未读的消息 | +| ack_ts | num | 最近一次已读时间 | 微秒级时间戳 | +| session_ts | num | 会话时间 | 微秒级时间戳 | +| unread_count | num | 未读消息数 | | +| last_msg | 有效时:obj
无效时:null | 最近的一条消息 | 详见[私信主体对象](#私信主体对象) | +| group_type | num | 粉丝团类型 | 在粉丝团时有效
0:应援团
2:官方群(如:ID 为 10 的粉丝团) | +| can_fold | num | 会话是否可被折叠入未关注人消息 | 在用户会话中有效 | +| status | num | 会话状态 | 详细信息有待补充 | +| max_seqno | num | 最近一条消息的序列号 | | +| new_push_msg | num | 是否有新推送的消息 | | +| setting | num | 推送设置 | 0:接收推送
1:不接收推送
2:(?) | +| is_guardian | num | 自己是否为对方的骑士(?) | 在用户会话中有效
0:否
2:是(?) | +| is_intercept | num | 会话是否被拦截 | | +| is_trust | num | 是否信任此会话 | 若为 `1`,则表示此会话之前被拦截过,但用户选择信任本会话 | +| system_msg_type | num | 系统会话类型 | 0:非系统会话
1:主播小助手
5:系统通知(?)
7:UP主小助手
8:客服消息
9:支付小助手 | +| account_info | obj | 会话信息 | 仅在系统会话中出现 | +| live_status | num | 用户是否正在直播 | 在用户会话中有效,其他会话中为 `0` | +| biz_msg_unread_count | num | 未读通知消息数 | | +| user_label | null | (?) | **作用尚不明确** | + +`account_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| name | str | 会话名称 | | +| pic_url | str | 会话头像 | | + +### 私信主体对象 + +注:私信主体对象≠[私信内容对象](private_msg_content.md) + +| 字段 | 类型 | 内容 | 备注 | +| ---------------- | ---- | -------------- | -------------------------------------------------------------- | +| sender_uid | num | 发送者mid | | +| receiver_type | num | 接收者类型 | 1:用户
2:粉丝团 | +| receiver_id | num | 接收者id | `receiver_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | +| msg_type | num | 消息类型 | 详见[私信消息类型、内容说明](private_msg_content.md) | +| content | str | 消息内容 | [私信内容对象](private_msg_content.md)**经过 JSON 序列化后的文本** | +| msg_seqno | num | 消息序列号 | 按照时间顺序从小到大 | +| timestamp | num | 消息发送时间 | 秒级时间戳 | +| at_uids | 有效时:array
无效时:null | at的成员mid | 在粉丝团时有效;此项为 `null` 或 `[0]` 均表示没有 at 成员 | +| msg_key | num | 消息唯一id | 部分库在解析JSON对象中的大数时存在数值的精度丢失问题,因此在处理此字段时可能会出现问题,建议使用修复了这一问题的库(如将大数转换成文本) | +| msg_status | num | 消息状态 | 0:正常
1:被撤回(接口仍能返回被撤回的私信内容)
2:被系统撤回(如:消息被举报;私信将不会显示在前端,B站接口也不会返回被系统撤回的私信的信息)
50:图片已失效(私信内容为一张提示“图片出现问题”的图片) | +| sys_cancel | bool | 是否为系统撤回 | 仅当 `msg_type` 为 `5` 且此项值为 `true` 时有此项;若此项值为 `true`,表示目标消息是被系统撤回的,此时前端将不显示该私信且没有提示 | +| notify_code | str | 通知代码 | 发送通知时使用,以下划线 `_` 分割,第 1 项表示主业务 id,第 2 项表示子业务 id;若这条私信非通知则为空文本;详细信息有待补充 | +| new_face_version | num | 表情包版本 | 为 `0` 或无此项表示旧版表情包,此时 B 站会自动转换成新版表情包,例如 `[doge]` -> `[tv_doge]`;`1` 为新版 | +| msg_source | num | 消息来源 | 见[消息来源列表](#消息来源列表msg_source) | + +`私信主体对象`中的`at_uids`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ------- | +| 0 | num | 用户1 | 成员mid | +| n | num | 用户(n+1) | | +| …… | num | …… | …… | + +### 消息来源列表(`msg_source`) + +| 代码 | 含义 | 备注 | +| ---- | ------------------------- | ----------------------------------- | +| 0 | 未知来源 | 在以前发送的部分私信的来源代码 | +| 1 | iOS | | +| 2 | Android | | +| 3 | H5 | | +| 4 | PC客户端 | | +| 5 | 官方推送消息 | 包括:官方向大多数用户自动发送的私信(如:UP主小助手的推广)等 | +| 6 | 推送/通知消息 | 包括:特别关注时稿件的自动推送、因成为契约者而自动发送的私信、包月充电回馈私信、官方发送的特定于自己的消息(如:UP主小助手的稿件审核状态通知)等 | +| 7 | Web | | +| 8 | 自动回复 - 被关注回复 | B站前端会显示“此条消息为自动回复” | +| 9 | 自动回复 - 收到消息回复 | B站前端会显示“此条消息为自动回复” | +| 10 | 自动回复 - 关键词回复 | B站前端会显示“此条消息为自动回复” | +| 11 | 自动回复 - 大航海上船回复 | B站前端会显示“此条消息为自动回复” | +| 12 | 自动推送 - UP 主赠言 | 在以前稿件推送消息与其附带的 UP 主赠言是 2 条不同的私信(其中 UP 主赠言的消息来源代码为 12),现在 UP 主赠言已并入为[稿件自动推送消息](private_msg_content.md#视频推送消息msg_type11)的一部分(`attach_msg`) | +| 13 | 粉丝团系统提示 | 如:粉丝团中的提示信息“欢迎xxx入群” | +| 16 | 系统 | 目前仅在 `msg_type` 为 `51` 时使用该代码 | +| 17 | 互相关注 | 互相关注时自动发送的私信“我们已互相关注,开始聊天吧~” | +| 18 | 系统提示 | 目前仅在 `msg_type` 为 `18` 时使用该代码,如:“对方主动回复或关注你前,最多发送1条消息” | +| 19 | AI | 如:给[搜索AI助手测试版](https://space.bilibili.com/1400565964/)发送私信时对方的自动回复 | + +## 会话相关 + +### 获取未读私信数 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +注: 该接口默认每 2 分钟请求一次;该接口不会返回[未读粉丝团私信数](#获取未读粉丝团私信数) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------------ | ---- | -------------------------- | ------ | -------------------------------------------------------------------------- | +| unread_type | num | 未读类型 | 非必要 | 0:所有
1:仅已关注
2:仅未关注
3:仅被拦截 (须同时设置参数 `show_dustbin=1`)
默认为 `0` | +| show_unfollow_list | num | 是否返回未关注人推送消息数 | 非必要 | 0:否
1:是 | +| show_dustbin | num | 是否返回被拦截私信数 | 非必要 | 0:否
1:是 | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------------- | ---- | ------------------------ | ---------------- | +| unfollow_unread | num | 未读未关注用户私信数 | | +| follow_unread | num | 未读已关注用户私信数 | | +| unfollow_push_msg | num | 未读未关注用户推送消息数 | | +| dustbin_push_msg | num | 未读被拦截的推送消息数 | | +| dustbin_unread | num | 未读被拦截的私信数 | | +| biz_msg_unfollow_unread | num | 未读未关注用户通知数 | | +| biz_msg_follow_unread | num | 未读已关注用户通知数 | | +| custom_unread | num | 未读客服消息数 | | + +**示例:** + +以下信息代表未读未关注用户私信数为 `1` 条,未读已关注用户私信数为 `6` 条 + +```shell +curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/single_unread' \ + --data-urlencode 'unread_type=0' \ + --data-urlencode 'show_unfollow_list=1' \ + --data-urlencode 'show_dustbin=1' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "unfollow_unread": 1, + "follow_unread": 6, + "unfollow_push_msg": 0, + "dustbin_push_msg": 0, + "dustbin_unread": 0, + "biz_msg_unfollow_unread": 0, + "biz_msg_follow_unread": 0, + "custom_unread": 0 + } +} +``` + +
+ +### 获取未读粉丝团私信数 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------- | ------ | ------------- | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ---------------- | ---------------- | +| unread_count | num | 未读粉丝团私信数 | | + +**示例:** + +以下信息代表未读粉丝团私信数为 `497` 条 + +```shell +curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/my_group_unread' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "unread_count": 497 + } +} +``` + +
+ +### 获取指定类型会话列表 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------- | ---- | -------------------- | ------ | ------------------------- | +| session_type | num | 会话类型 | 必要 | 1:用户与系统
2:未关注人
3:粉丝团
4:所有
5:被拦截
6:花火商单
7:所有系统消息
8:陌生人(与 “未关注人” 不同,不包含官方消息)
9:关注的人与系统 | +| group_fold | num | 是否折叠粉丝团消息 | 非必要 | 0:否
1:是 | +| unfollow_fold | num | 是否折叠未关注人消息 | 非必要 | 0:否
1:是 | +| sort_rule | num | 排序方式 | 非必要 | 仅当 `session_type` 不为 `4`、`7` 时有效
1、2:按会话时间逆向排序
3:按已读时间逆向排序
其他:用户与系统按会话时间逆向排序,粉丝团按加入时间正向排序 | +| begin_ts | num | 起始时间 | 非必要 | 微秒级时间戳 | +| end_ts | num | 终止时间 | 非必要 | 微秒级时间戳 | +| size | num | 返回的会话数 | 非必要 | 默认为 `20`,最大为 `100` | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
2:非法参数 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------------- | ---- | ---------------------------- | ------------------------ | +| session_list | 有会话时:array
无会话时:null | 会话列表 | | +| has_more | num | 是否有更多会话 | | +| anti_distrub_cleaning | bool | 是否开启了“一键防骚扰”功能 | | +| is_address_list_empty | num | 0 | **作用尚不明确** | +| system_msg | obj | 系统会话列表 | 仅当存在系统会话时有此项 | +| show_level | bool | 是否在会话列表中显示用户等级 | 目前恒为 `true` | + +`data`对象中的`session_list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ------------------------- | +| 0 | obj | 会话1 | 详见[会话对象](#会话对象) | +| n | obj | 会话(n+1) | | +| …… | obj | …… | …… | + +`data`对象中的`system_msg`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------ | ---- | ---------- | ---------------------------------------------------------- | +| {系统会话类型代码} | num | 系统会话id | 详见[会话对象](#会话对象)中对 `system_msg_type` 字段的说明 | + +**示例:** + +获取所有类型的会话列表: + +```shell +curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/get_sessions' \ + --data-urlencode 'session_type=4' \ + --data-urlencode 'group_fold=0' \ + --data-urlencode 'unfollow_fold=0' \ + --data-urlencode 'sort_rule=2' \ + --data-urlencode 'size=3' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "session_list": [ + { + "talker_id": 844424930131966, + "session_type": 1, + "at_seqno": 0, + "top_ts": 0, + "group_name": "", + "group_cover": "", + "is_follow": 1, + "is_dnd": 0, + "ack_seqno": 1238729956474887, + "ack_ts": 1709536924979884, + "session_ts": 1712305278098351, + "unread_count": 4, + "last_msg": { + "sender_uid": 844424930131966, + "receiver_type": 1, + "receiver_id": 425503913, + "msg_type": 10, + "content": "{\"title\":\"流量奖励到账通知\",\"text\":\"恭喜您已获得2000流量曝光奖励,快来投稿使用吧。\",\"jump_text\":\"\",\"jump_uri\":\"\",\"modules\":null,\"jump_text_2\":\"\",\"jump_uri_2\":\"\",\"jump_text_3\":\"\",\"jump_uri_3\":\"\",\"notifier\":null,\"jump_uri_config\":{\"all_uri\":\"https://member.bilibili.com/york/flow-reward?navhide=1\\u0026from=msgrecall\",\"text\":\"\"},\"jump_uri_2_config\":{\"text\":\"\"},\"jump_uri_3_config\":{\"text\":\"\"},\"biz_content\":null}", + "msg_seqno": 1285290404823041, + "timestamp": 1712305278, + "at_uids": null, + "msg_key": 7354295169819585966, + "msg_status": 0, + "notify_code": "2091_253", + "new_face_version": 1, + "msg_source": 6 + }, + "group_type": 0, + "can_fold": 0, + "status": 0, + "max_seqno": 1285290404823041, + "new_push_msg": 1, + "setting": 0, + "is_guardian": 0, + "is_intercept": 0, + "is_trust": 0, + "system_msg_type": 7, + "account_info": { + "name": "UP主小助手", + "pic_url": "https://message.biliimg.com/bfs/im/489a63efadfb202366c2f88853d2217b5ddc7a13.png" + }, + "live_status": 0, + "biz_msg_unread_count": 0, + "user_label": null + }, + { + "talker_id": 293793435, + "session_type": 1, + "at_seqno": 0, + "top_ts": 0, + "group_name": "", + "group_cover": "", + "is_follow": 1, + "is_dnd": 0, + "ack_seqno": 1236306587877408, + "ack_ts": 1709536984481314, + "session_ts": 1709385615744065, + "unread_count": 0, + "last_msg": { + "sender_uid": 293793435, + "receiver_type": 1, + "receiver_id": 425503913, + "msg_type": 11, + "content": "{\"title\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}", + "msg_seqno": 1236306587877408, + "timestamp": 1709385615, + "at_uids": null, + "msg_key": 7341755312943193481, + "msg_status": 0, + "notify_code": "", + "new_face_version": 1, + "msg_source": 6 + }, + "group_type": 0, + "can_fold": 0, + "status": 0, + "max_seqno": 1236306587877408, + "new_push_msg": 0, + "setting": 0, + "is_guardian": 0, + "is_intercept": 0, + "is_trust": 0, + "system_msg_type": 0, + "live_status": 0, + "biz_msg_unread_count": 0, + "user_label": null + }, + { + "talker_id": 221082140, + "session_type": 2, + "at_seqno": 0, + "top_ts": 0, + "group_name": "社会易姐QwQ的应援团", + "group_cover": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "is_follow": 0, + "is_dnd": 0, + "ack_seqno": 20, + "ack_ts": 1695011620552332, + "session_ts": 1693626568439784, + "unread_count": 0, + "last_msg": { + "sender_uid": 0, + "receiver_type": 2, + "receiver_id": 221082140, + "msg_type": 306, + "content": "{\"group_id\":221082140,\"content\":\"欢迎罗板栗入群\"}", + "msg_seqno": 20, + "timestamp": 1693626568, + "at_uids": null, + "msg_key": 7274070721607234847, + "msg_status": 0, + "notify_code": "", + "msg_source": 13 + }, + "group_type": 0, + "can_fold": 0, + "status": 0, + "max_seqno": 20, + "new_push_msg": 0, + "setting": 0, + "is_guardian": 0, + "is_intercept": 0, + "is_trust": 0, + "system_msg_type": 0, + "live_status": 0, + "biz_msg_unread_count": 0, + "user_label": null + } + ], + "has_more": 1, + "anti_disturb_cleaning": false, + "is_address_list_empty": 0, + "system_msg": { + "1": 844424930131967, + "7": 844424930131966, + "9": 844424930131965 + }, + "show_level": true + } +} +``` + +
+ +### 获取新会话列表 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +获取指定时间之后的新会话列表 + +注:该接口默认每 20 秒请求一次 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------- | ------ | ------------------------- | +| begin_ts | num | 起始时间 | 非必要 | 微秒级时间戳 | +| size | num | 返回的会话数 | 非必要 | 默认为 `20`,最大为 `100` | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------------- | ---- | ---------------------------- | ---------------------- | +| session_list | 有会话时:array
无会话时:null | 会话列表 | 按发送时间顺序逆向排序 | +| has_more | num | 是否有更多会话 | | +| anti_distrub_cleaning | bool | 是否开启了“一键防骚扰”功能 | | +| is_address_list_empty | num | 0 | **作用尚不明确** | +| show_level | bool | 是否在会话列表中显示用户等级 | 目前恒为 `false` | + +`data`对象中的`session_list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ------------------------- | +| 0 | obj | 会话1 | 详见[会话对象](#会话对象) | +| n | obj | 会话(n+1) | | +| …… | obj | …… | …… | + +**示例:** + +获取`begin_ts=1712420213519391`之后的新会话列表: + +```shell +curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/new_sessions' \ + --data-urlencode 'begin_ts=1712420213519391' \ + --data-urlencode 'size=3' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "session_list": [ + { + "talker_id": 844424930131966, + "session_type": 1, + "at_seqno": 0, + "top_ts": 0, + "group_name": "", + "group_cover": "", + "is_follow": 1, + "is_dnd": 0, + "ack_seqno": 1238729956474887, + "ack_ts": 1709536924979884, + "session_ts": 1712305278098351, + "unread_count": 4, + "last_msg": { + "sender_uid": 844424930131966, + "receiver_type": 1, + "receiver_id": 425503913, + "msg_type": 10, + "content": "{\"title\":\"流量奖励到账通知\",\"text\":\"恭喜您已获得2000流量曝光奖励,快来投稿使用吧。\",\"jump_text\":\"\",\"jump_uri\":\"\",\"modules\":null,\"jump_text_2\":\"\",\"jump_uri_2\":\"\",\"jump_text_3\":\"\",\"jump_uri_3\":\"\",\"notifier\":null,\"jump_uri_config\":{\"all_uri\":\"https://member.bilibili.com/york/flow-reward?navhide=1\\u0026from=msgrecall\",\"text\":\"\"},\"jump_uri_2_config\":{\"text\":\"\"},\"jump_uri_3_config\":{\"text\":\"\"},\"biz_content\":null}", + "msg_seqno": 1285290404823041, + "timestamp": 1712305278, + "at_uids": null, + "msg_key": 7354295169819585966, + "msg_status": 0, + "notify_code": "2091_253", + "new_face_version": 1, + "msg_source": 6 + }, + "group_type": 0, + "can_fold": 0, + "status": 0, + "max_seqno": 1285290404823041, + "new_push_msg": 1, + "setting": 0, + "is_guardian": 0, + "is_intercept": 0, + "is_trust": 0, + "system_msg_type": 7, + "account_info": { + "name": "UP主小助手", + "pic_url": "https://message.biliimg.com/bfs/im/489a63efadfb202366c2f88853d2217b5ddc7a13.png" + }, + "live_status": 0, + "biz_msg_unread_count": 0, + "user_label": null + }, + { + "talker_id": 293793435, + "session_type": 1, + "at_seqno": 0, + "top_ts": 0, + "group_name": "", + "group_cover": "", + "is_follow": 1, + "is_dnd": 0, + "ack_seqno": 1236306587877408, + "ack_ts": 1709536984481314, + "session_ts": 1709385615744065, + "unread_count": 0, + "last_msg": { + "sender_uid": 293793435, + "receiver_type": 1, + "receiver_id": 425503913, + "msg_type": 11, + "content": "{\"title\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}", + "msg_seqno": 1236306587877408, + "timestamp": 1709385615, + "at_uids": null, + "msg_key": 7341755312943193481, + "msg_status": 0, + "notify_code": "", + "new_face_version": 1, + "msg_source": 6 + }, + "group_type": 0, + "can_fold": 0, + "status": 0, + "max_seqno": 1236306587877408, + "new_push_msg": 0, + "setting": 0, + "is_guardian": 0, + "is_intercept": 0, + "is_trust": 0, + "system_msg_type": 0, + "live_status": 0, + "biz_msg_unread_count": 0, + "user_label": null + }, + { + "talker_id": 221082140, + "session_type": 2, + "at_seqno": 0, + "top_ts": 0, + "group_name": "社会易姐QwQ的应援团", + "group_cover": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "is_follow": 0, + "is_dnd": 0, + "ack_seqno": 20, + "ack_ts": 1695011620552332, + "session_ts": 1693626568439784, + "unread_count": 0, + "last_msg": { + "sender_uid": 0, + "receiver_type": 2, + "receiver_id": 221082140, + "msg_type": 306, + "content": "{\"group_id\":221082140,\"content\":\"欢迎罗板栗入群\"}", + "msg_seqno": 20, + "timestamp": 1693626568, + "at_uids": null, + "msg_key": 7274070721607234847, + "msg_status": 0, + "notify_code": "", + "msg_source": 13 + }, + "group_type": 0, + "can_fold": 0, + "status": 0, + "max_seqno": 20, + "new_push_msg": 0, + "setting": 0, + "is_guardian": 0, + "is_intercept": 0, + "is_trust": 0, + "system_msg_type": 0, + "live_status": 0, + "biz_msg_unread_count": 0, + "user_label": null + } + ], + "has_more": 0, + "anti_disturb_cleaning": false, + "is_address_list_empty": 0, + "show_level": false + } +} +``` + +
+ +### 获取会话详细信息 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +若从未与该会话聊过天,则返回 1000004 `入口节点已存在` 错误 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------ | ---- | ---------------- | ------ | ------------------------------------------------------ | +| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | +| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
1000004:入口节点已存在 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 有效时:obj
无效时:null | 数据本体 | 详见[会话对象](#会话对象) | + +**示例:** + +获取会话`talker_id=293793435&session_type=1`的详细信息: + +```shell +curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/session_detail' \ + --data-urlencode 'talker_id=293793435' \ + --data-urlencode 'session_type=1' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "talker_id": 293793435, + "session_type": 1, + "at_seqno": 0, + "top_ts": 0, + "group_name": "", + "group_cover": "", + "is_follow": 1, + "is_dnd": 0, + "ack_seqno": 1236306587877408, + "ack_ts": 1709536984481314, + "session_ts": 1709385615744065, + "unread_count": 0, + "last_msg": { + "sender_uid": 293793435, + "receiver_type": 1, + "receiver_id": 425503913, + "msg_type": 11, + "content": "{\"title\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}", + "msg_seqno": 1236306587877408, + "timestamp": 1709385615, + "at_uids": null, + "msg_key": 7341755312943193481, + "msg_status": 0, + "notify_code": "", + "new_face_version": 1, + "msg_source": 6 + }, + "group_type": 0, + "can_fold": 0, + "status": 0, + "max_seqno": 1236306587877408, + "new_push_msg": 0, + "setting": 0, + "is_guardian": 0, + "is_intercept": 0, + "is_trust": 0, + "system_msg_type": 0, + "live_status": 0, + "biz_msg_unread_count": 0, + "user_label": null + } +} +``` + +
+ +### 获取会话限制状态 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +仅支持用户会话 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| uid | num | 聊天对象mid | 必要 | | +| type | num | 1 | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
2:非法参数
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ------------------------ | ---------------------------- | +| is_limit | num | 用户是否被封禁 | | +| report_limit | num | 自己是否被限制举报该会话 | 常见于自己被封禁时出现该情况 | + +**示例:** + +获取`uid=123`的限制状态: + +```shell +curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/is_limit' \ + --data-urlencode 'uid=123' \ + --data-urlencode 'type=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "is_limit": 0, + "report_limit": 0 + } +} +``` + +
+ +### 获取会话免打扰状态 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | ---------------- | ------ | ----------------------- | +| own_uid | num | 自己的mid | 必要 | | +| uids | num | 用户mid | 非必要 | 仅支持填入 **1 个** mid | +| group_ids | num | 粉丝团id | 非必要 | 仅支持填入 **1 个** id | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
2:非法参数
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ----- | ---------------- | ------------------------------------- | +| uid_settings | array | 用户免打扰状态 | 仅当请求参数 `uids` 存在时有此项 | +| group_settings | array | 粉丝团免打扰状态 | 仅当请求参数 `group_ids` 存在时有此项 | + +`data`对象中的`uid_settings`、`group_settings`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | --------------------------------- | +| 0 | obj | 会话免打扰状态 | 仅有1项 | + +`uid_settings`、`group_settings`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ----------------- | -------------------------------- | +| id | num | 用户mid或粉丝团id | | +| setting | num | 免打扰状态 | 0:关闭免打扰
1:开启免打扰 | + +**示例:** + +获取会话`uids=2`与`group_ids=221082140`的免打扰状态: + +```shell +curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get_msg_dnd' \ + --data-urlencode 'own_uid=425503913' \ + --data-urlencode 'uids=2' \ + --data-urlencode 'group_ids=221082140' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "uid_settings": [{ + "id": 2, + "setting": 0 + }], + "group_settings": [{ + "id": 221082140, + "setting": 0 + }] + } +} +``` + +
+ +### 获取会话推送设置 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +仅支持用户会话 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ---------------- | ------ | ------------- | +| talker_uid | num | 聊天对象mid | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
2:非法参数
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | ---------------------- | ----------------------------------- | +| follow_status | num | 对方对于自己的关注属性 | 0:未关注
~~1:悄悄关注(现已下线)~~
2:已关注
6:已互粉
128:已拉黑 | +| special | num | 自己是否特别关注了对方 | | +| push_setting | num | 推送设置 | 0:接收推送
1:不接收推送 | +| show_push_setting | num | 是否显示推送设置 | | + +**示例:** + +获取`talker_uid=123`的推送设置: + +```shell +curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get_session_ss' \ + --data-urlencode 'talker_uid=123' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "follow_status": 6, + "special": 1, + "push_setting": 0, + "show_push_setting": 1 + } +} +``` + +
+ +### 设置会话为已读 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +将指定会话中的指定消息及以前的消息设置为已读 + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------ | ---- | ------------------------ | ------ | ---------------------------------------------------- | +| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | +| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | +| ack_seqno | num | 设置为已读的消息序列号 | 非必要 | 留空表示最新的消息 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 成功时为0 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | + +**示例:** + +将`talker_id=293793435`、`session_type=1`的`ack_seqno=1236306587877408`消息及之前的消息设置为已读 + +```shell +curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/update_ack' \ + --data-urlencode 'talker_id=293793435' \ + --data-urlencode 'session_type=1' \ + --data-urlencode 'ack_seqno=1236306587877408' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +### 移除指定会话 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +将指定会话从会话列表中移除,不会删除聊天记录 + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------ | ---- | ------------------------ | ------ | ---------------------------------------------------- | +| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | +| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 成功时为0 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | + +**示例:** + +移除会话`talker_id=2&session_type=1` + +```shell +curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/remove_session' \ + --data-urlencode 'talker_id=2' \ + --data-urlencode 'session_type=1' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +### 修改会话置顶状态 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------ | ---- | ------------------------ | ------ | ---------------------------------------------------- | +| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | +| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | +| op_type | num | 操作类型 | 必要 | 0:置顶
1:取消置顶 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 成功时为0 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | + +**示例:** + +置顶会话`talker_id=293793435&session_type=1` + +```shell +curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/set_top' \ + --data-urlencode 'talker_id=293793435' \ + --data-urlencode 'session_type=1' \ + --data-urlencode 'op_type=0' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +### 修改会话免打扰状态 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------ | ---- | ------------------------ | ------------ | -------------------------------- | +| uid | num | 自己的mid | 非必要 | | +| setting | num | 免打扰设置 | 必要 | 0:取消免打扰
1:开启免打扰 | +| dnd_uid | num | 用户mid | 必要(可选) | 当聊天对象为用户时有效 | +| dnd_group_id | num | 粉丝团id | 必要(可选) | 当聊天对象为粉丝团时有效 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 成功时为0 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | + +**示例:** + +对会话`dnd_uid=2`开启免打扰 + +```shell +curl 'https://api.vc.bilibili.com/link_setting/v1/link_setting/set_msg_dnd' \ + --data-urlencode 'uid=425503913' \ + --data-urlencode 'setting=1' \ + --data-urlencode 'dnd_uid=2' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +### 修改会话推送设置 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +仅支持用户会话 + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | ------ | ------------------------------ | +| talker_uid | num | 聊天对象mid | 必要 | | +| setting | num | 推送设置 | 必要 | 0:接收推送
1:不接收推送 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 成功时为0 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | + +**示例:** + +修改`talker_uid=2`的推送设置为不接收推送 + +```shell +curl 'https://api.vc.bilibili.com/link_setting/v1/link_setting/set_push_ss' \ + --data-urlencode 'talker_uid=2' \ + --data-urlencode 'setting=1' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +### 修改会话拦截状态 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +仅支持用户会话 + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | ------ | ---------------------------- | +| talker_id | num | 聊天对象mid | 必要 | | +| status | num | 拦截状态 | 必要 | 0:取消拦截
1:设置拦截 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 成功时为0 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | + +**示例:** + +对会话`talker_id=2`取消拦截状态 + +```shell +curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/update_intercept' \ + --data-urlencode 'talker_id=2' \ + --data-urlencode 'status=0' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +### 设置所有拦截会话为已读 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | ------ | ------------- | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 成功时为0 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | + +**示例:** + +```shell +curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/batch_update_dustbin_ack' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +### 移除所有拦截会话 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | ------ | ------------- | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 成功时为0 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | + +**示例:** + +```shell +curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/batch_rm_dustbin' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 私信消息相关 + +### 查询私信消息记录 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +仅调用该接口不会设置会话为已读,详见[设置会话为已读](#设置会话为已读) + +此接口有设计缺陷,可以获取已经撤回(`msg_status` 为 `1`)的私信内容 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------------- | ---- | ---------------- | ------ | ------------------------------------------------------ | +| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | +| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | +| size | num | 返回消息数量 | 非必要 | 默认为 0,最大为 2000
当本参数为 `0` 或不存在时,只返回系统提示 | +| begin_seqno | num | 开始的序列号 | 非必要 | 提供本参数时返回以本序列号开始(不包括本序列号)的消息 | +| end_seqno | num | 结束的序列号 | 非必要 | 提供本参数时返回以本序列号结束(不包括本序列号)的消息 | +| sender_device_id | num | 发送者设备 | 非必要 | 默认为 `1` | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等;**若本参数值为 `web`,则返回新版表情包** | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
2:非法参数
-101:账号未登录
-400:请求错误
700013:已解散QAQ,无法执行此操作
700014:你已不在此同萌中QAQ,无法执行此操作 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | ------------------------------ | ----------------------------------- | +| messages | 有私信时:array
无私信时:null | 私信列表 | 按发送时间顺序逆向排序 | +| has_more | num | 是否有更多私信 | | +| min_seqno | num | 所有消息中最小的序列号(最早) | 若无私信则为 `18446744073709551615` | +| max_seqno | num | 所有消息中最大的序列号(最晚) | 若无私信则为 `0` | +| e_infos | array | 聊天表情列表 | 若私信列表中无表情则无此项 | + +`data`对象中的`messages`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | --------------------------------- | +| 0 | obj | 私信1 | 详见[私信主体对象](#私信主体对象) | +| n | obj | 私信(n+1) | | +| …… | obj | …… | …… | + +`data`对象中的`e_infos`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 表情1 | | +| n | obj | 表情(n+1) | | +| …… | obj | …… | …… | + +`data`对象中的`e_infos`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ----------- | ----------------------------------- | +| text | str | 表情名称 | 包括左右两侧的中括号,如`[tv_doge]` | +| uri | str | 表情链接 | | +| size | num | 表情尺寸 | 1:小
2:大 | +| gif_url | str | 表情GIF链接 | 仅部分表情存在此项,如小电视表情 | + +**示例:** + +获取与目标用户`mid=123`的私信记录: + +```shell +curl -G 'https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs' \ + --data-urlencode 'talker_id=123' \ + --data-urlencode 'session_type=1' \ + --data-urlencode 'size=20' \ + --data-urlencode 'sender_device_id=1' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```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, + "msg_source": 2 + }, + { + "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": "", + "msg_source": 7 + + }, + ], + "has_more": 0, + "min_seqno": 308188515844097, + "max_seqno": 309675413389322, + "e_infos": [ + { + "text": "[口罩]", + "url": "http://i0.hdslb.com/bfs/emote/3ad2f66b151496d2a5fb0a8ea75f32265d778dd3.png", + "size": 1 + } + ] + } +} +``` + +
+ +### 获取多个视频、番剧、专栏的信息 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +可用于获取私信中分享或推送的多个视频、番剧、专栏的信息 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------- | ---- | ---------------- | ----------- | --------------------------------------------------------------------------------------------- | +| aids | nums | 视频AV号列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,最多 50 个成员 | +| ep_ids | nums | 番剧epid列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,最多 50 个成员 | +| article_ids | nums | 专栏CV号列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,无成员限制 | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ----- | ------------ | --------------------------------------- | +| archive | array | 视频信息列表 | 仅在指定了 `aids` 参数时存在此项 | +| article | array | 专栏信息列表 | 仅在指定了 `article_ids` 参数时存在此项 | +| pgc | array | 番剧信息列表 | 仅在指定了 `ep_ids` 参数时存在此项 | + +`archive`、`article`、`pgc`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 信息1 | | +| n | obj | 信息(n+1) | | +| …… | obj | …… | …… | + +`archive`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ------------ | ------------------------------ | +| bvid | str | 视频BV号 | | +| aid | num | 视频AV号 | | +| title | str | 视频标题 | 若视频失效则为 `内容已失效` | +| pic | str | 视频封面 | 若视频失效则为空文本 | +| param | str | 提供的参数 | 即 AV 号的文本形式 | +| uri | str | 跳转url | `bilibili://video/{视频AV号}` | +| goto | str | `av` | | +| duration | num | 视频时长 | 以秒为单位,若视频失效则为 `0` | +| up_name | str | 视频UP主昵称 | | +| view | num | 视频播放量 | | +| danmaku | num | 视频弹幕数 | | +| status | num | 视频状态 | 0:正常
-1:已失效 | +| is_started | num | 1 | **作用尚不明确** | + +`article`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ----- | ------------ | --------------------------- | +| id | num | 专栏CV号 | | +| title | str | 专栏标题 | 若专栏失效则为 `内容已失效` | +| summary | str | 专栏内容概要 | 若专栏失效则为空文本 | +| template_id | num | (?) | **作用尚不明确** | +| up_name | str | 专栏UP主昵称 | 若专栏失效则为空文本 | +| image_urls | array | 专栏封面列表 | 若专栏失效则为空数组 | +| view_num | num | 专栏观看数 | 若专栏失效则为 `0` | +| like_num | num | 专栏点赞数 | 若专栏失效则为 `0` | +| reply_num | num | 专栏评论数 | 若专栏失效则为 `0` | +| status | num | 专栏状态 | 0:正常
-1:已失效 | + +`image_urls`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | str | 封面1 | | +| n | str | 封面(n+1) | | +| …… | str | …… | …… | + +`pgc`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ------------ | --------------------------- | +| ep_id | num | 番剧epid | | +| cover | str | 番剧封面url | | +| title | str | 番剧分享标题 | 如 `《{番剧名}》 第{n}话 {单集标题}`、`《{番剧名}》 {备注}` 等 | +| duration | num | 番剧时长 | 以秒为单位 | +| view | num | 番剧播放量 | | +| danmaku | num | 番剧弹幕数 | | +| url | str | 跳转url | `https://www.bilibili.com/bangumi/play/ep{番剧epid}` | + +**示例:** + +获取`aids=170001&ep_ids=780019&article_ids=1`的信息 + +```shell +curl -G 'https://api.vc.bilibili.com/x/im/feed/infoweb' \ + --data-urlencode 'aids=170001' \ + --data-urlencode 'ep_ids=780019' \ + --data-urlencode 'article_ids=1' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "archive": [ + { + "bvid": "BV17x411w7KC", + "aid": 170001, + "title": "【MV】保加利亚妖王AZIS视频合辑", + "pic": "http://i2.hdslb.com/bfs/archive/1ada8c32a9d168e4b2ee3e010f24789ba3353785.jpg", + "param": "170001", + "uri": "bilibili://video/170001?player_height=288&player_rotate=0&player_width=512", + "goto": "av", + "duration": 2412, + "up_name": "冰封.虾子", + "view": 44809333, + "danmaku": 913266, + "status": 0, + "is_started": 1 + } + ], + "article": [ + { + "id": 1, + "title": "未知的光", + "summary": "天空像是倾倒出的墨水,黑得静谧而深邃。黎明还远,光亮全无。夜不能寐。披衣,起床。茶香的弥漫,一盏灯的相伴。夜,你是我久别重逢的朋友,那一刹那的相见,带给了我久违的安思。如果不是梦魇的皮闹,我本不该投入", + "template_id": 4, + "up_name": "健行见远渐忘", + "image_urls": [ + "https://i0.hdslb.com/bfs/article/d2eedf1fd338bceca10099e2f7b33fa9017c859b.jpg" + ], + "view_num": 1608818, + "like_num": 32247, + "reply_num": 14143, + "status": 0 + } + ], + "pgc": [ + { + "ep_id": 780019, + "cover": "http://i0.hdslb.com/bfs/archive/ee28c04d15fb133a9c70c502fabfbdc7e5051ffe.png", + "title": "《铃芽之旅》 新海诚集大成之作", + "duration": 7283, + "view": 22088209, + "danmaku": 93069, + "url": "https://www.bilibili.com/bangumi/play/ep780019" + } + ] + } +} +``` + +
+ +### 发送私信(web端) + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +**仅支持发送 `msg[msg_type]` 为 `1`、`2` 或 `5` 的私信** + +调用该接口会将该会话设置为已读 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------- | ---- | --------------- | ------ | ------------------------------------ | +| w_sender_uid | num | 发送者mid | 非必要 | 同正文参数 `msg[sender_uid]` | +| w_receiver_id | num | 接收者id | 非必要 | 同正文参数 `msg[receiver_id]` | +| w_dev_id | str | 设备id | 非必要 | 同正文参数 `msg[dev_id]` | +| w_rid | str | Wbi 签名 | 非必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | +| wts | str | UNIX 秒级时间戳 | 非必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------------------- | ---- | ------------------------ | ------ | ---------------------------------------------------- | +| msg\[sender_uid\] | num | 发送者mid | 必要 | 必须为自己的 mid | +| msg\[receiver_id\] | num | 接收者id | 必要 | `msg[receiver_type]` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | +| msg\[receiver_type\] | num | 接收者类型 | 必要 | 1:用户
2:粉丝团 | +| msg\[msg_type\] | num | 消息类型 | 必要 | 详见[私信消息类型、内容说明](private_msg_content.md)
**此接口仅支持传入 `1`、`2` 或 `5`** | +| msg\[msg_status\] | num | 消息状态 | 非必要 | 恒为 `0` | +| msg\[dev_id\] | str | 设备id | 必要 | 实质上即 UUID(版本 4),**生成方式见下** | +| msg\[timestamp\] | num | 当前时间戳(秒) | 必要 | | +| msg\[new_face_version\] | num | 表情包版本 | 非必要 | 提供 `0` 或者未提供本参数表示旧版表情包,此时 B 站会自动转换成新版表情包,例如 `[doge]` -> `[tv_doge]`;`1` 为新版 | +| msg\[content\] | str | 消息内容 | 必要 | 详见[私信消息类型、内容说明](private_msg_content.md),接受最多2000字节的内容 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +--- + +**dev_id 的生成:** + +dev_id 实质上就是 UUID(版本 4) + +
+查看生成 UUID 的代码 + +#### Python + +```python +import uuid + +dev_id = str(uuid.uuid4()) +``` + +#### JavaScript + +以下代码适用于较新版的 JS 引擎(Chrome≥92,Firefox≥95,Safari≥15.4,Node.js≥19.0.0): + +```js +const dev_id = crypto.randomUUID(); +``` + +以下为通用代码(来自 [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)): + +```js +const dev_id = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (function (name) { + const randomInt = 16 * Math.random() | 0; + return ("x" === name ? randomInt : 3 & randomInt | 8).toString(16).toUpperCase(); +})); +``` + +#### Java + +```java +import java.util.UUID; + +public class Main { + private String getDevId() { + UUID uuid = UUID.randomUUID(); + return uuid.toString(); + } +} +``` + +
+ +--- + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-3:系统错误
-101:账号未登录
-400:请求错误
10005:msgkey不存在
21007:消息过长,无法发送
21015:为了维护社区的良好秩序,只有绑定手机号的账号才能发送消息
21020:你发送消息频率过快,请稍后再发~
21026:不能给自己发送消息哦~
21028:由于系统升级,暂无法发送,敬请谅解
21035:该类消息暂时无法发送
21037:图片格式不合法,不要调戏接口啦
21041:消息已超期,不能撤回了哦
21042:消息已经撤回了哦
21046:你发消息的频率太高了,请在24小时后再发吧~
21047:对方主动回复或关注你前,最多发送1条消息~
25003:因对方隐私设置,暂无法给他发送聊天消息
25005:你已拉黑了对方,请先将对方移出黑名单后才能聊天
700013:已解散QAQ,无法执行此操作
700014:你已不在此同萌中QAQ,无法执行此操作 | +| message | str | 错误信息 | 成功时为0 | +| ttl | num | | 默认为1 | +| data | 有效时:obj
无效时:null | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ----- | ---------- | --------------------------------------------------------------------- | +| msg_key | num | 消息唯一id | | +| e_infos | array | 表情列表 | 仅当请求参数 `msg[msg_type]` 为 `1`,且私信内容中有表情时有此项 | +| msg_content | str | 发送的私信内容 | 一般同请求参数 `msg[content]` 的值,仅当请求参数 `msg[msg_type]` 为 `1` 时有此项 | +| key_hit_infos | obj | 触发的提示 | 仅当请求参数 `msg[msg_type]` 为 `1` 且 `msg[receiver_type]` 为 `1` 时有此项 | + +`e_infos`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 表情1 | | +| n | obj | 表情(n+1) | | +| …… | obj | …… | …… | + +`e_infos`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ----------- | ----------------------------------- | +| text | str | 表情名称 | 包括左右两侧的中括号,如 `[tv_doge]` | +| uri | str | 表情链接 | | +| size | num | 表情尺寸 | 1:小
2:大 | +| gif_url | str | 表情GIF链接 | 仅部分表情存在此项,如小电视表情 | + +`key_hit_infos`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | ------------ | -------------------------------------- | +| toast | str | 提示信息文字 | 当触发了提示时有此项 | +| rule_id | num | 触发的规则id | 当触发了提示时有此项,详细信息有待补充 | +| high_text | array | 高亮的文本 | 当触发了提示时有此项 | + +`high_text`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | ---------------- | +| 0 | obj | 高亮文本1 | 详细信息有待补充 | +| n | obj | 高亮文本(n+1) | | +| …… | 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[msg_status]=0' \ + --data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \ + --data-urlencode 'msg[timestamp]=1626181379' \ + --data-urlencode 'msg[new_face_version]=1' \ + --data-urlencode 'msg[content]={"content":"up主你好,\n催更[doge]"}' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "msg_key": 6984393491767669026, + "e_infos": [ + { + "text": "[doge]", + "url": "https://i0.hdslb.com/bfs/emote/3087d273a78ccaff4bb1e9972e2ba2a7583c9f11.png", + "size": 1 + } + ], + "msg_content": "{\"content\":\"up主你好,\\n催更[doge]\"}", + "key_hit_infos": {} + } +} +``` + +
+ +给目标用户`mid=1`发一条图片私信: + +> + +```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[msg_status]=0' \ + --data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \ + --data-urlencode 'msg[timestamp]=1626181379' \ + --data-urlencode 'msg[content]={"url":"https://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg","height":300,"width":300,"imageType":"jpeg","original":1,"size":54.144}' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "data": { + "msg_key": 6852570013146024354 + } +} +``` + +
+ +给目标用户`mid=1`发送会触发提示的私信: + +> 支付宝 + +```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[msg_status]=0' \ + --data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \ + --data-urlencode 'msg[timestamp]=1626181379' \ + --data-urlencode 'msg[content]={"content":"支付宝"}' \ + --data-urlencode 'csrf=xxx' \ + --data-urlencode 'csrf_token=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "msg_key": 6984393491767669026, + "msg_content": "{\"content\":\"支付宝\"}", + "key_hit_infos": { + "toast": "【温馨提示】为保障消费者权益,根据平台规则,如创作者在与消费者沟通中进行发布要求非法转账、欺诈转账等违规行为,平台有权对此进行处罚,感谢您的理解。", + "rule_id": 2, + "high_text": [{}] + } + } +} +``` + +
diff --git a/docs/message/private_msg_content.md b/docs/message/private_msg_content.md new file mode 100644 index 0000000..21a5deb --- /dev/null +++ b/docs/message/private_msg_content.md @@ -0,0 +1,627 @@ +# 私信消息类型、内容说明 + +## 通用消息类型 + +以下消息类型适用于大多数会话 + +### 文字消息(`msg_type=1`) + +在发送私信时,请确保下面的对象合法且 `content` 项的值为非空文本,否则会提示 `请求错误` + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---- | +| content | str | 私信内容 | | + +**示例:** + +内容为 `Hello` 的文字消息 + +```json +{ + "content": "Hello" +} +``` + +### 图片消息(`msg_type=2`) + +在发送私信时,请确保下面的对象合法且 `url` 项的值为 B 站的图床 url,否则会报 21037 `图片格式不合法,不要调戏接口啦` 错误 + +建议设置 `height` 与 `width` 属性为图片的尺寸,否则可能会导致消息显示异常 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ---------- | ------------------------- | +| url | str | 图片url | 一般为 B 站图床 url | +| height | num | 图片高度 | 单位:像素(非必要) | +| width | num | 图片宽度 | 单位:像素(非必要) | +| imageType | str | 图片格式 | (非必要) | +| original | num | 是否为原图 | 当本参数值为 `1` 时,APP上会出现“下载原图”按钮(非必要) | +| size | num | 文件大小 | 单位:千字节(非必要) | + +**示例:** + +图片 `https://message.biliimg.com/bfs/im_new/c161fdf51d901c1607a15e30f10116dd425503913.jpg` + +```json +{ + "url": "https://message.biliimg.com/bfs/im_new/c161fdf51d901c1607a15e30f10116dd425503913.jpg", + "height": 300, + "width": 300, + "imageType": "jpeg", + "original": 1, + "size": 55.443 +} +``` + +### 撤回消息(`msg_type=5`) + +内容为目标私信的 `msg_key` + +请确保目标私信存在、在撤回有效期(120 秒)里,且与发送的私信在同一会话内,只能撤回自己发送的私信 + +成功发送此私信后,目标私信的 `msg_status` 会变成 `1`(在前端会显示目标私信被撤回) + +**示例:** + +假如存在 `msg_key` 为 `7345551441311046575` 的私信 A,用户发送了 `msg_type` 为 `5` 且 `content` 为以下内容的私信 B: + +```json +7345551441311046575 +``` + +若发送成功,则私信 A 会被撤回(在前端显示该消息被撤回),并且其 `msg_status` 也会变成 `1` + +### 自定义表情消息(`msg_type=6`) + +结构同[图片消息](#图片消息msg_type2) + +### 分享消息(`msg_type=7`) + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ---------------- | -------------------------------------------------------------- | +| author | str | 分享内容作者 | 此项不实时更新,在发送私信时设置(非必要) | +| headline | str | 分享内容主标题 | 比 `title` 更突出;此项不实时更新,在发送私信时设置(非必要) | +| id | num | 分享内容id | | +| source | num | 分享内容类型 | ~~1:小视频~~(已弃用)
2:相簿
3:纯文字
4:直播(此类型不常用,见[分享其他内容消息](#分享其他内容消息msg_type14))
5:视频
6:专栏
7:番剧(`id` 为 season_id)
8:音乐
9:国产动画(`id` 为 AV 号)
10:图片
11:动态
16:番剧(`id` 为 epid)
17:番剧 | +| source_desc | str | 分享内容类型说明 | 仅当 `source` 值为 `16` 时有此项 | +| thumb | str | 分享内容封面 | 此项不实时更新,在发送私信时设置 | +| title | str | 分享内容标题 | 此项不实时更新,在发送私信时设置 | +| url | str | 分享内容url | (非必要) | +| bvid | str | 视频BV号 | 当 `source` 值为 `5` 时有效(非必要) | + +**示例:** + +分享 UP 主 “社会易姐QwQ” 的视频 av246551172/BV16v411e7CW + +```json +{ + "author": "社会易姐QwQ", + "headline": "", + "id": 246551172, + "source": 5, + "thumb": "http://i2.hdslb.com/bfs/archive/14ba78056f946ece8c954a10677ef6b073edb178.jpg", + "title": "合 成 大 東 瓜", + "bvid": "BV16v411e7CW" +} +``` + +### ~~系统撤回消息(`msg_type=8`)~~ + +~~此消息类型由于存在安全问题,已被弃用~~ + +
+查看此消息类型说明 + +此类型消息在接收时的 `msg_type` 的值为 `5`(而不是 `8`)且 `sys_cancel` 的值为 `true`,**仅在用户会话中有效;目前已不可直接发送** + +内容为目标私信的 `msg_key` + +请确保目标私信存在,且与发送的私信在同一会话内,只能撤回自己发送的私信;**不限制目标私信的发送时间** + +成功发送此私信后,目标私信的 `msg_status` 会变成 `2`(在前端会直接隐藏目标私信,且后端也不会返回目标私信的任何信息) + +
+ +### 小程序消息(`msg_type=9`) + +由于 B 站并没有对外公开小程序,此消息类型不常用 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ------------ | ------------------------- | +| avatar | str | 小程序图标 | | +| cover | str | 小程序封面 | | +| id | str | 小程序id | | +| jump_uri | str | 小程序链接 | | +| label_cover | str | 标签图标 | | +| label_name | str | 标签文字内容 | 一般为 `小程序` | +| name | str | 小程序名称 | | +| title | str | 小程序标题 | | + +**示例:** + +分享 “主站测试专用小程序” + +```json +{ + "avatar": "http://i0.hdslb.com/bfs/mall/mall/7b/dd/7bdd072290de017593791b52e937ca29.png", + "cover": "http://i0.hdslb.com/bfs/mall/mall/7b/dd/7bdd072290de017593791b52e937ca29.png", + "id": "bili91e3e7e93af281f9", + "jump_uri": "https://mall.bilibili.com/miniapp/bili91e3e7e93af281f9/pages/main?___timestamp=1689526821040&_biliFrom=about_bili_message&share_medium=android&share_source=bili_message&bbid=XU8CE838022AF6625C64B2153A3EF1E571AFF&ts=1689526821048", + "label_cover": "https://i0.hdslb.com/bfs/mall/mall/ae/0e/ae0ee4a857df5e307e1d04b5d420cb5b.png", + "label_name": "小程序", + "name": "主站测试专用小程序", + "title": "主站测试专用小程序" +} +``` + +### 通知消息(`msg_type=10`) + +此类型消息仅可接收,**不可直接发送** + +**按钮显示逻辑说明:** + +- **按钮的url**:首先尝试读取 `jump_uri_config`、`jump_uri_2_config`、`jump_uri_3_config` 对象中表示当前设备类型的 url(如 `web_uri`、`android_uri` 等);若为空值,则尝试读取 `jump_uri_config`、`jump_uri_2_config`、`jump_uri_3_config` 对象中 `all_uri` 的值;若仍为空值,则读取根对象中 `jump_uri`、`jump_uri_2`、`jump_uri_3` 的值;若仍为空值,则不显示该按钮(无论提示文字是否为空) +- **按钮提示文字**:若按钮是可见的,则先尝试读取 `jump_uri_config`、`jump_uri_2_config`、`jump_uri_3_config` 对象中 `text` 的值;若为空值,则读取根对象中 `jump_text`、`jump_text_2`、`jump_text_3` 的值;若仍为空值,则提示文字为 `查看详情` + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ----- | ------------- | ------------------------- | +| title | str | 通知标题 | | +| text | str | 通知内容 | | +| jump_text | str | 按钮1提示文字 | 若按钮1不存在则为空;若按钮1存在,此项也可能为空,此时前端显示文字为 `查看详情` | +| jump_uri | str | 按钮1跳转链接 | 若按钮1不存在则为空 | +| modules | 有效时:array
无效时:null | 详细信息 | | +| jump_text_2 | str | 按钮2提示文字 | 若按钮2不存在则为空;若按钮2存在,此项也可能为空,此时前端显示文字为 `查看详情` | +| jump_uri_2 | str | 按钮2跳转链接 | 若按钮2不存在则为空 | +| jump_text_3 | str | 按钮3提示文字 | 若按钮3不存在则为空;若按钮3存在,此项也可能为空,此时前端显示文字为 `查看详情` | +| jump_uri_3 | str | 按钮3跳转链接 | 若按钮3不存在则为空 | +| notifier | 有效时:obj
无效时:null | 发送者信息 | | +| jump_uri_config | obj | 按钮1配置 | | +| jump_uri_2_config | obj | 按钮2配置 | | +| jump_uri_3_config | obj | 按钮3配置 | | +| biz_content | 有效时:obj
无效时:null | 扩展信息 | | + +`modules`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | ---- | +| 0 | obj | 详细信息1 | | +| n | obj | 详细信息(n+1) | | +| …… | obj | …… | …… | + +`modules`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ---- | ---- | +| title | str | 标题 | | +| detail | str | 内容 | | + +`notifier`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ---------- | ------ | +| avatar_url | str | 发送者头像 | | +| nickname | str | 发送者名称 | | +| jump_url | str | 发送者链接 | 可为空 | + +`jump_uri_config`、`jump_uri_2_config`、`jump_uri_3_config`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ----------------------- | -------------------- | +| all_uri | str | 所有设备的跳转链接 | 若按钮不存在则无此项 | +| android_uri | str | Android客户端的跳转链接 | 若按钮不存在则无此项 | +| iphone_uri | str | iPhone客户端的跳转链接 | 若按钮不存在则无此项 | +| ipad_uri | str | iPad客户端的跳转链接 | 若按钮不存在则无此项 | +| web_uri | str | 网页上的跳转链接 | 若按钮不存在则无此项 | +| text | str | 按钮提示文字 | 若按钮不存在则为空 | + +`biz_content`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ----------- | ---------------- | +| cover | str | 封面url | | +| backup_cover | str | 备用封面url | | +| refresh_type | num | (?) | **作用尚不明确** | +| biz_type | num | (?) | **作用尚不明确** | +| biz_id1 | str | (?) | **作用尚不明确** | +| biz_id2 | str | (?) | **作用尚不明确** | +| biz_status | num | (?) | **作用尚不明确** | + +**示例:** + +直播开始提醒 + +```json +{ + "title": "直播开始提醒", + "text": "你预约的直播已开始,快来围观吧~", + "jump_text": "进入直播间", + "jump_uri": "https://live.bilibili.com/22747055?broadcast_type=0&is_room_feed=1&live_from=27040", + "modules": [{ + "title": "预约主题", + "detail": "2024哔哩哔哩拜年纪" + }, { + "title": "开播时间", + "detail": "2024-02-09 19:32" + }, { + "title": "UP主", + "detail": "哔哩哔哩拜年纪" + }], + "jump_text_2": "", + "jump_uri_2": "", + "jump_text_3": "", + "jump_uri_3": "", + "notifier": null, + "jump_uri_config": { + "all_uri": "https://live.bilibili.com/22747055?broadcast_type=0&is_room_feed=1&live_from=27040", + "text": "进入直播间" + }, + "jump_uri_2_config": { + "text": "" + }, + "jump_uri_3_config": { + "text": "" + }, + "biz_content": { + "cover": "", + "backup_cover": "http://i0.hdslb.com/bfs/live/new_room_cover/bdae2665883ec8aa4e79aca16f3c5ee2df1da64f.jpg", + "refresh_type": 1, + "biz_type": 2, + "biz_id1": "1868902080", + "biz_id2": "473923647994271663", + "biz_status": 0 + } +} +``` + +### 视频推送消息(`msg_type=11`) + +此类型消息仅可接收,**不可直接发送**;有小概率会出现即使视频存在,也只会出现 `rid`、`type`(值为 `11` 或 `8`,注意其名称后面没有下划线)和 `attach_msg` 三项的现象 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ------------ | ------------------------------------------------------ | +| title | str | 视频标题 | 接收私信时实时更新此项,若视频失效则为空文本 | +| times | num | 视频时长 | 以秒为单位,接收私信时实时更新此项,若视频失效则为 `0` | +| cover | str | 视频封面 | 接收私信时实时更新此项,若视频失效则为空文本 | +| rid | num | 视频AV号 | | +| type_ | num | (?) | **作用尚不明确** | +| desc | str | 视频简介 | 接收私信时实时更新此项,若视频失效则为空文本 | +| bvid | str | 视频BV号 | | +| view | num | 视频播放量 | 接收私信时实时更新此项,若视频失效则为 `0` | +| danmaku | num | 视频弹幕数 | 接收私信时实时更新此项,若视频失效则为 `0` | +| pub_date | num | 视频发布时间 | 秒级时间戳,若视频失效则为 `0` | +| attach_msg | 有效时:obj
无效时:null | UP主赠言 | | + +`attach_msg`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------------------------- | +| id | num | 赠言id | | +| content | str | 赠言内容 | 会自动加上 `UP主赠言:` 前缀,可能包含私信表情 | + +**示例:** + +推送视频 av740817783/BV1Dk4y1E7MZ + +```json +{ + "title": "【2023嵌入式大赛】浅浅测试一下龙芯开发板", + "times": 308, + "cover": "http://i2.hdslb.com/bfs/archive/880c937de9af758451aa94ee29771e0264c1903a.jpg", + "rid": 740817783, + "type_": 8, + "desc": "最近把龙芯开发板部分(任务一)程序完成了,时间非常紧迫,就不知道为啥突然给省赛加个(本来国赛的题\n从硬件焊接开始,到软件整完不过5天啊喂,肝疼,过几天比赛完发硬件制作过程\n硬件使用龙芯一号(LS1B010)SOC,软件使用 C 语言+FreeRTOS+VSCode 开发", + "bvid": "BV1Dk4y1E7MZ", + "view": 13492, + "danmaku": 5, + "pub_date": 1683381582, + "attach_msg": null +} +``` + +### 专栏推送消息(`msg_type=12`) + +此类型消息仅可接收,**不可直接发送**;有小概率会出现即使专栏存在,也只会出现 `rid`、`type`(值为 `12`)和 `attach_msg` 三项的现象 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ------------ | ------------------------------------------------------ | +| rid | num | 专栏CV号 | | +| title | str | 专栏标题 | 接收私信时实时更新此项,若专栏失效则为 `内容已失效` | +| summary | str | 专栏内容概要 | 接收私信时实时更新此项,若专栏失效则为空文本 | +| author | str | 专栏UP主昵称 | 接收私信时实时更新此项,若专栏失效则为空文本 | +| view | num | 专栏观看数 | 接收私信时实时更新此项,若专栏失效则为 `0` | +| like | num | 专栏点赞数 | 接收私信时实时更新此项,若专栏失效则为 `0` | +| reply | num | 专栏评论数 | 接收私信时实时更新此项,若专栏失效则为 `0` | +| template_id | num | (?) | **作用尚不明确** | +| image_urls | 有效时:array
无效时:null | 专栏封面列表 | 接收私信时实时更新此项,若专栏失效则为 `null` | +| attach_msg | 有效时:obj
无效时:null | UP主赠言 | | +| pub_date | num | 专栏发布时间 | 秒级时间戳,若专栏失效则为 `0` | + +`image_urls`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | str | 封面1 | | +| n | str | 封面(n+1) | | +| …… | str | …… | …… | + +`attach_msg`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------------------------- | +| id | num | 赠言id | | +| content | str | 赠言内容 | 会自动加上 `UP主赠言:` 前缀,可能包含私信表情 | + +**示例:** + +推送专栏 cv18275013 + +```json +{ + "rid": 18275013, + "title": "【单片机】遛弯捕捉到野生U盾,点亮它!", + "summary": "前一阵在学校那会,偶然的机会晚上饭后出去遛弯,在路边看到个被抛弃的 U盾,这么一想应该是附近拆迁搬东西时丢出去的,随即捕捉它。作为一个啥都折腾的捡垃圾技术宅肯定要去研究一波(笑是个建行的 U盾,按键部分还有点老灰,屏幕的尺寸盲猜 128x64,不可能再大了背面除了序列号没有别的东西,顶部有个盖子,像极了上古时期的 U盘插上充电宝可以正常点亮,至少屏没坏拆解&分析电路直接开拆,用刀片沿着四周缝隙插入并挑开卡扣内部结构挺简单,只有两颗较大的芯片,屏幕的 FPC 排线直接焊接在 PCB 上中间的这颗是", + "author": "社会易姐QwQ", + "view": 872, + "like": 38, + "reply": 7, + "template_id": 4, + "image_urls": [ + "https://i0.hdslb.com/bfs/article/c7c60e018c43c5c3a6e1520239021ea2753b2880.jpg" + ], + "attach_msg": null, + "pub_date": 1661358081 +} +``` + +### 图片卡片消息(`msg_type=13`) + +此类型消息仅可接收,**不可直接发送** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ------------------- | -------------------- | +| pic_url | str | 图片url | | +| jump_url | str | 点击图片跳转到的url | | +| title | str | 文字说明 | 显示在聊天列表的文字 | + +**示例:** + +```json +{ + "pic_url": "http://i0.hdslb.com/bfs/location/9e57aff7245c226c05ba46ddd1e82667f74d5a06.png", + "jump_url": "https://www.bilibili.com/h5/mall/suit/detail?navhide=1&id=66359&from=Banner", + "title": "原神,启动!" +} +``` + +### 分享其他内容消息(`msg_type=14`) + +常见于分享直播 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ---------------- | -------------------------------- | +| author | str | 分享内容作者 | 此项不实时更新,在发送私信时设置 | +| cover | str | 分享内容封面 | 此项不实时更新,在发送私信时设置 | +| desc | str | 分享内容简介 | 此项不实时更新,在发送私信时设置 | +| source | str | 分享内容类型说明 | 常见的值为 `直播` | +| title | str | 分享内容标题 | 此项不实时更新,在发送私信时设置 | +| url | str | 分享内容url | | + +**示例:** + +分享直播 ID 21738461 + +```json +{ + "author": "哔哩哔哩晚会", + "cover": "https://i1.hdslb.com/bfs/face/1b593d28fcd0cf63837c3ea80ac96d01bb85ec3b.jpg", + "desc": "主播:哔哩哔哩晚会 https://live.bilibili.com/21738461", + "source": "直播", + "title": "2023最美的夜 bilibili晚会", + "url": "https://live.bilibili.com/21738461?broadcast_type=0&is_room_feed=1&live_from=41000&share_medium=android&share_source=bili_message&bbid=XU8CE838022AF6625C64B2153A3EF1E571AFF&ts=1704038936971" +} +``` + +### 被关注时的自动推送消息(`msg_type=16`) + +一般仅在开启了 B 站的 “被关注回复” 功能与勾选 “被关注后,向关注我的人推送我的往期作品” 选项(仅部分用户会显示此选项)时才会发送此类型消息,紧接在自动发送的文字消息后面 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ----- | ---------------- | -------------------------------------------- | +| main_title | str | 主标题 | 一般为 `更多宝藏内容` | +| reply_content | str | 自动回复文字内容 | 仅在聊天列表中的消息概要中显示此内容,在私信内容中不显示 | +| sub_cards | array | 推送的稿件列表 | 一般为3个 | + +`sub_cards`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 稿件1 | | +| n | obj | 稿件(n+1) | | +| …… | obj | …… | …… | + +`sub_cards`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | -------------------------------- | +| card_id | num | 稿件AV号 | | +| card_type | num | 稿件类型 | 一般为 `1` | +| jump_url | str | 稿件链接 | | +| cover_url | str | 稿件封面url | 此项不实时更新,在发送私信时设置 | +| field1 | str | 稿件标题 | 此项不实时更新,在发送私信时设置 | +| field2 | str | 稿件发布时间 | 格式:`YYYY-MM-DD` | +| field3 | str | 字段3 | 此项不实时更新,在发送私信时设置 | +| icon3 | num | 图标3类型 | 1:播放量
3:弹幕数
5:收藏量 | +| field4 | str | 字段4 | 此项不实时更新,在发送私信时设置 | +| icon4 | num | 图标4类型 | 1:播放量
3:弹幕数
5:收藏量 | + +**示例:** + +```json +{ + "main_title": "更多宝藏内容", + "reply_content": "感谢大佬关注哦~[doge][脱单doge][doge]\n这里是科技区底边小UP,日常瞎折腾,软硬件电路程序网络服务器都折腾,视频月更风格硬核略小众,咕咕咕.....\n老大二了,就不中二了\n有什么好的建议欢迎私信", + "sub_cards": [{ + "card_id": 379743801, + "card_type": 1, + "jump_url": "https://b23.tv/BV1hZ4y197Cz", + "cover_url": "http://i2.hdslb.com/bfs/archive/bfb87f033272926efe6ff4caee8e6c49c07ff6fe.jpg", + "field1": "【宿舍评测】性能与便携两全 华为matebook E 2022深度体验及伪开箱", + "field2": "2021-12-10", + "field3": "20万", + "icon3": 1, + "field4": "479", + "icon4": 3 + }, { + "card_id": 768716232, + "card_type": 1, + "jump_url": "https://b23.tv/BV13r4y187R8", + "cover_url": "http://i1.hdslb.com/bfs/archive/bb1d41ef0c17c2df25c8b6ef98f01466bdee0c1f.jpg", + "field1": "【BadApple】使用古董示波器Aron BS-601播放BadApple!!!", + "field2": "2022-05-03", + "field3": "15万", + "icon3": 1, + "field4": "297", + "icon4": 3 + }, { + "card_id": 524989935, + "card_type": 1, + "jump_url": "https://b23.tv/BV17M411E7Kq", + "cover_url": "http://i1.hdslb.com/bfs/archive/17335854dfad9d7990943d8cc6dc07c85912b103.jpg", + "field1": "【拆解】华为 Matebook E 更换固态硬盘:从未见过如此好拆的二合一", + "field2": "2023-02-24", + "field3": "5万", + "icon3": 1, + "field4": "102", + "icon4": 3 + }] +} +``` + +### 系统提示消息(`msg_type=18`) + +此类型消息仅可接收,**不可直接发送**;由系统自动发送,但仅自己可见 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | -------------------------- | +| content | str | 提示列表 | **经过序列化后**的JSON数组 | + +`content`文本经JSON解析后的数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 提示1 | | +| n | obj | 提示(n+1) | | +| …… | obj | …… | …… | + +`content`文本经JSON解析后的数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------------------ | ----------- | +| text | str | 提示文字 | | +| color_day | str | 浅色模式下的提示文字颜色 | HEX颜色代码 | +| color_nig | str | 深色模式下的提示文字颜色 | HEX颜色代码 | +| jump_url | str | 点击提示跳转到的url | (非必要) | + +**示例:** + +若自己与对方从未聊过天,且对方未关注自己,则会有系统提示 + +```json +{ + "content": "[{\"text\":\"对方主动回复或关注你前,最多发送1条消息\",\"color_day\":\"#9499A0\",\"color_nig\":\"#9499A0\"}]" +} +``` + +### AI 消息(`msg_type=19`) + +此消息类型尚未得到广泛使用 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------- | ---- | -------------------- | ---------------- | +| content | obj | 富文本内容 | | +| show_like | bool | 是否显示点赞按钮 | | +| show_change | bool | 是否显示修改内容按钮 | | +| gpt_session_id | num | GPT 会话 id | | +| gpt_bind_query | str | (?) | **作用尚不明确** | +| session_closed_line | str | (?) | **作用尚不明确** | +| voice_url | str | 语音 url(?) | | +| sub_type | num | 子类型(?) | | +| voice_time | num | 语音时长(?) | | + +`content`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---------------- | +| paragraphs | array | 段落列表 | 详细信息有待补充 | + +**示例:** + +由于 B 站尚未公开此消息类型,暂无示例 + +## 粉丝团消息类型 + +以下消息类型仅常见于粉丝团中的系统消息(`receiver_type` 为 `2` 且 `sender_uid` 为 `0`) + +### 成员入群消息(`msg_type=301`) + +### 成员退群消息(`msg_type=302`) + +### 粉丝团冻结消息(`msg_type=303`) + +### 粉丝团解散消息(`msg_type=304`) + +### 粉丝团开通消息(`msg_type=305`) + +### 成员入群消息(`msg_type=306`) + +以上 6 种类型的消息均为以下数据类型结构 + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | -------- | ---------- | +| group_id | num | 粉丝团id | (非必要) | +| content | str | 提示文字 | | + +**示例:** + +`社会易姐QwQ的应援团` 开通的消息(`msg_type=305`) + +```json +{ + "group_id": 221082140, + "content": "社会易姐QwQ的应援团开通啦 (>▽<)" +} +``` + +成员 `wuziqian211` 进入 `社会易姐QwQ的应援团` 的消息(`msg_type=306`) + +```json +{ + "group_id": 221082140, + "content": "欢迎wuziqian211入群" +} +``` diff --git a/docs/message/settings.md b/docs/message/settings.md new file mode 100644 index 0000000..e94ca6e --- /dev/null +++ b/docs/message/settings.md @@ -0,0 +1,830 @@ +# 消息设置 + +## 获取用户偏好设置 + +> + +*请求方式:GET 或 POST* + +认证方式:Cookie(SESSDATA) + +**url参数(GET)或 正文参数(application/x-www-form-urlencoded,POST):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------------- | ---- | -------------------------------- | ------------ | ------------------------- | +| msg_notify | num | 是否显示 “消息提醒” 设置 | 非必要 | 若此项为任意整数,则返回数据中有 `msg_notify` 项 | +| show_unfollowed_msg | num | 是否显示 “收起未关注人消息” 设置 | 非必要 | 若此项为任意整数,则返回数据中有 `show_unfollowed_msg` 项 | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | +| csrf_token | str | CSRF Token(位于cookie) | POST方式必要 | | +| csrf | str | CSRF Token(位于cookie) | POST方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------------ | ---- | -------------------- | --------------------------------------------------------------------------- | +| show_unfollowed_msg | num | 收起未关注人消息 | 请求参数 `show_unfollowed_msg` 为整数时显示此项
0:不收起
1:收起 | +| msg_notify | num | 消息提醒 | 请求参数 `msg_notify` 为整数时显示此项
1:接收
3:不接收 | +| set_like | num | 收到的赞提醒(旧) | 0:接收
5:不接收 | +| set_comment | num | 回复我的提醒(旧) | 0:所有人
1:关注的人
2:不接受任何消息提醒 | +| set_at | num | @ 我的提醒 (旧) | 0:所有人
1:关注的人
2:不接受任何消息提醒 | +| is_group_fold | num | 收起应援团消息 | 0:不收起
1:收起 | +| should_receive_group | num | 接收应援团消息 | 0:不接收
1:接收 | +| receive_unfollow_msg | num | 接收未关注人消息 | 前端隐藏此开关
0:不接收
1:接收 | +| followed_reply | num | 被关注回复 | 0:关闭
1:开启 | +| keys_reply | num | 关键词回复 | 0:关闭
1:开启 | +| recv_reply | num | 收到消息回复 | 0:关闭
1:开启 | +| voyage_reply | num | 大航海上船回复 | 0:关闭
1:开启 | +| recommend_followed_reply | num | 被关注时自动推送作品 | 0:关闭
1:开启 | +| ai_intercept | num | 私信智能拦截 | 0:关闭
1:开启 | +| anti_harassment | null | 防骚扰和互动人群设置 | 此接口恒返回 `null` | +| set_recv_reply | num | 收到回复提醒(新) | 0:所有人
1:关注的人
2:不接受任何消息提醒 | +| set_recv_like | num | 收到喜欢提醒(新) | 0:接收
2:不接收 | +| set_new_follow | num | 新增粉丝提醒(新) | 0:接收
2:不接收 | + +**示例:** + +```shell +curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get' \ + --data-urlencode 'msg_notify=1' \ + --data-urlencode 'show_unfollowed_msg=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "show_unfollowed_msg": 0, + "msg_notify": 1, + "set_like": 0, + "set_comment": 0, + "set_at": 0, + "is_group_fold": 0, + "should_receive_group": 1, + "receive_unfollow_msg": 1, + "followed_reply": 1, + "keys_reply": 0, + "recv_reply": 1, + "voyage_reply": 0, + "recommend_followed_reply": 1, + "ai_intercept": 1, + "anti_harassment": null, + "set_recv_reply": 0, + "set_recv_like": 0, + "set_new_follow": 0 + } +} +``` + +
+ +## 修改用户偏好设置 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +参数名称与值基本同「[获取用户偏好设置](#获取用户偏好设置)」中的 `data` 对象,修改设置时只需提供修改的设置对应的参数即可 + +开启自动回复功能需要 1000 粉丝及以上,否则会提示 700009 `权限不足` + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------------------ | ---- | ------------------------ | ------ | ----------------------------------------------------- | +| show_unfollowed_msg | num | 收起未关注人消息 | 非必要 | 0:不收起
1:收起 | +| msg_notify | num | 消息提醒 | 非必要 | 1:接收
3:不接收 | +| set_like | num | 收到的赞提醒 | 非必要 | 0:接收
5:不接收 | +| set_comment | num | 回复我的提醒 | 非必要 | 0:所有人
1:关注的人
2:不接受任何消息提醒 | +| set_at | num | @ 我的提醒 | 非必要 | 0:所有人
1:关注的人
2:不接受任何消息提醒 | +| is_group_fold | num | 收起应援团消息 | 非必要 | 0:不收起
1:收起 | +| should_receive_group | num | 接收应援团消息 | 非必要 | 0:不接收
1:接收 | +| receive_unfollow_msg | num | 接收未关注人消息 | 非必要 | 0:不接收
1:接收 | +| followed_reply | num | 被关注回复 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | +| keys_reply | num | 关键词回复 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | +| recv_reply | num | 收到消息回复 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | +| voyage_reply | num | 大航海上船回复 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | +| recommend_followed_reply | num | 被关注时自动推送作品 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | +| ai_intercept | num | 私信智能拦截 | 非必要 | 0:关闭
1:开启 | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | -------------------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
2:非法参数
700009:权限不足 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | 空对象 | + +**示例:** + +开启接收消息提醒 + +```shell +curl 'https://api.vc.bilibili.com/link_setting/v1/link_setting/set' \ + --data-urlencode 'msg_notify=1' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + --data-urlencode 'csrf_token=xxx' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 获取消息屏蔽词 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------- | ------ | ------------- | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ------------------------------- | ------------------ | ---------------- | +| words | 有效时:array
无效时:null | 消息屏蔽词列表 | | +| message | str | (?) | **作用尚不明确** | +| max_word_length | num | 单个屏蔽词最大长度 | 目前为 `20` | +| max_words_size | num | 屏蔽词最大数量 | 目前为 `200` | + +`data` 中的 `words` 数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | ---- | +| 0 | obj | 屏蔽词1 | | +| n | obj | 屏蔽词(n+1) | | +| …… | obj | …… | …… | + +`words` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------------- | ---------- | +| content | str | 屏蔽词内容 | | +| ctime | num | 屏蔽词添加时间 | 秒级时间戳 | + +**示例:** + +```shell +curl -G 'https://api.vc.bilibili.com/x/im/link_setting/get_block_words' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "words": [ + { + "content": "屏蔽词", + "ctime": 1746422088 + } + ], + "message": "", + "max_word_length": 20, + "max_words_size": 200 + } +} +``` + +
+ +## 添加消息屏蔽词 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | ------ | -------------- | +| content | str | 屏蔽词内容 | 必要 | 最多 20 个字符 | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
1900004:添加失败,屏蔽词限制最多20个字
1900005:添加失败,最多可以添加200个屏蔽词
1900006:添加失败,屏蔽词重复
1900007:添加失败,屏蔽词不支持空格 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | 空对象 | + +**示例:** + +```shell +curl 'https://api.vc.bilibili.com/x/im/link_setting/add_block_word' \ + --data-urlencode 'content=屏蔽词' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + --data-urlencode 'csrf_token=xxx' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 删除消息屏蔽词 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | ------ | ------------- | +| content | str | 屏蔽词内容 | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | 空对象 | + +**示例:** + +```shell +curl 'https://api.vc.bilibili.com/x/im/link_setting/del_block_word' \ + --data-urlencode 'content=屏蔽词' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + --data-urlencode 'csrf_token=xxx' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 获取自动回复文本/关键词回复规则 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------- | ------ | ---------------------------------------------------------------------------- | +| type\[\] | num | 自动回复类型 | 必要 | 1:被关注回复
2:关键词回复
3:收到消息回复
5:大航海上船回复 | +| uid | num | 自己的mid | 非必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
2:非法参数 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ----- | ------------ | -------------------------------------- | +| texts | array | 自动回复文本 | 若未设置此类型自动回复文本,则没有此项 | + +`data` 中的 `texts` 数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | -------------------------------- | +| 0 | obj | 文本1 | | +| n | obj | 文本(n+1) | 当类型为 “关键词回复” 时可有多项 | +| …… | obj | …… | …… | + +`texts` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | -------------- | -------------------------------------------------------------------------- | +| id | num | 自动回复规则id | | +| uid | num | 自己的mid | | +| type | num | 自动回复类型 | 同请求参数 `type[]` | +| title | str | 规则名称 | 当类型为 “关键词回复” 时有效,否则为空文本 | +| key1 | str | 精确匹配关键词 | 当类型为 “关键词回复” 时有效,否则为空文本
以中文逗号分隔每一个关键词 | +| key2 | str | 模糊匹配关键词 | 当类型为 “关键词回复” 时有效,否则为空文本
以中文逗号分隔每一个关键词 | +| reply | str | 回复内容 | | + +**示例:** + +获取关键词回复规则 + +```shell +curl -G 'https://api.vc.bilibili.com/x/im/auto_reply/get_reply_text' \ + --data-urlencode 'type[]=2' \ + --data-urlencode 'uid=425503913' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "texts": [ + { + "id": 201321, + "uid": 425503913, + "type": 2, + "title": "谢谢", + "key1": "谢谢,Thank you", + "key2": "感谢", + "reply": "我也感谢您对我的支持 (=・ω・=)" + }, + { + "id": 201320, + "uid": 425503913, + "type": 2, + "title": "哭2", + "key1": "哭", + "key2": "", + "reply": "我是不会哭的 (=・ω・=)" + }, + { + "id": 201318, + "uid": 425503913, + "type": 2, + "title": "哭", + "key1": "", + "key2": "哭", + "reply": "别哭了[tv_微笑]摸摸您 (^・ω・^)" + } + ] + } +} +``` + +
+ +## 修改自动回复文本/关键词回复规则 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +仅调用本接口不会开启或关闭自动回复功能,请使用 “[修改用户偏好设置](#修改用户偏好设置)” 接口 + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | ---------------------- | ---------------------------------------------------------------------------- | +| type | num | 自动回复类型 | 必要 | 1:被关注回复
2:关键词回复
3:收到消息回复
5:大航海上船回复 | +| reply | str | 回复内容 | 必要 | 最多 500 个字符 | +| id | str | 规则id | 非必要 | 当类型为 “关键词回复” 时有效
为 `0` 或为空时新增回复规则,否则修改 id 对应的回复规则 | +| title | str | 规则名称 | 关键词回复必要 | 当类型为 “关键词回复” 时有效,最多 30 个字符 | +| key1 | str | 精确匹配关键词 | 关键词回复必要(可选) | 当类型为 “关键词回复” 时有效,`key1` 与 `key2` 须至少填一个参数
以中文逗号分隔每一个关键词,最多 20 项 | +| key2 | str | 模糊匹配关键词 | 关键词回复必要(可选) | 当类型为 “关键词回复” 时有效,`key1` 与 `key2` 须至少填一个参数
以中文逗号分隔每一个关键词,最多 20 项 | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
27011:请求参数错误
1500001:自动回复内容太长
1500002:规则数量已达上限,请删除后新建
1500003:您保存的内容含敏感信息,请修改后重试 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | 空对象 | + +**示例:** + +修改关键词回复规则 `id=201321`,规则名称为 `谢谢`,精确匹配关键词为 `谢谢,Thank you,感谢`,回复内容为 `嗯嗯,不用谢[tv_微笑]` + +```shell +curl 'https://api.vc.bilibili.com/x/im/auto_reply/set_reply_text' \ + --data-urlencode 'type=2' \ + --data-urlencode 'reply=嗯嗯,不用谢[tv_微笑]' \ + --data-urlencode 'id=201321' \ + --data-urlencode 'title=谢谢' \ + --data-urlencode 'key1=谢谢,Thank you,感谢' \ + --data-urlencode 'key2=' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + --data-urlencode 'csrf_token=xxx' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 删除关键词回复规则 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | ------ | ------------- | +| id | str | 规则id | 必要 | | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | +| csrf_token | str | CSRF Token(位于cookie) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-500:服务器错误
1003:不能删除别人的规则 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | 空对象 | + +**示例:** + +删除关键词回复规则 `id=201321` + +```shell +curl 'https://api.vc.bilibili.com/x/im/auto_reply/del_reply_text' \ + --data-urlencode 'id=201321' \ + --data-urlencode 'build=0' \ + --data-urlencode 'mobi_app=web' \ + --data-urlencode 'csrf_token=xxx' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 获取系统设置 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +此接口中的设置一般不能由用户随意更改 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------- | ------ | ------------------------- | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------------------------- | ---- | ---------------------------------------------------------------------------------------- | -------------------------- | +| is_create_group_available | num | 是否可创建粉丝团 | 粉丝数达到 1000 后开启 | +| is_auto_reply_available | num | 是否可使用自动回复功能 | 粉丝数达到 1000 后开启 | +| vc_hint_title | str | 稿件自动推送小灰条内容 | `我为什么会收到此类消息` | +| vc_hint_title_button | str | 稿件自动推送小灰条旁的按钮内容 | `了解更多` | +| vc_hint_detail | str | 稿件自动推送详细信息小灰条内容 | `您【特别关注】的UP主更新视频或专栏后,会第一时间在私信推送给您。如有需要可点击右上角设置关闭推送。` | +| vc_hint_detail_button | str | 关闭稿件自动推送按钮内容 | `关闭推送` | +| auto_reply_html | str | 自动回复H5页面url | `https://message.bilibili.com/h5/app/auto-reply` | +| is_receive_unfollow_wl | num | 是否显示限制接收未关注人消息功能 | | +| is_voyage | num | 是否在自动回复页面显示 “大航海自动回复” 选项 | 仅部分用户开启 | +| is_auto_reply_recommend_available | num | 是否在自动回复中的 “被关注回复” 页面显示 “被关注后,向关注我的人推送我的往期作品” 复选框 | 仅部分用户开启 | +| is_discuss_style_im_page | num | (?) | **作用尚不明确** | +| discuss_unread_style_im_page | num | (?) | **作用尚不明确** | +| old_up_assistant_door | obj | 原 “UP主小助手” 入口相关信息 | | +| is_new_up_assistant_effective | num | 新 “UP主小助手” 是否启用 | | +| is_archive_gray | bool | 是否不显示 “私信存档” 按钮 | | +| session_cfg | obj | 特定私信会话配置信息 | | +| migrate_session_api | bool | (?) | **作用尚不明确** | +| game_msg | obj | (?) | **作用尚不明确**;仅当请求参数 `mobi_app` 不为 `web` 时有其中的项目 | +| auto_reply_msg_desc | str | 指示消息为自动回复消息的提示内容 | `此条消息为自动回复` | +| huahuo_group_icon_new | str | 浅色模式下的花火图标url | | +| huahuo_group_icon_dark_new | str | 深色模式下的花火图标url | | +| im_disabled_input_hint | str | 某UP主禁用私信功能时的提示内容 | `请到UP主空间发起咨询` | + +`data` 中的 `old_up_assistant_door` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------- | ---- | ---------------------------- | ------------ | +| show_old_up_door | num | 是否显示原 “UP主小助手” 入口 | 目前恒为 `0` | +| title | str | 原 “UP主小助手” 入口标题 | 目前为空文本 | +| sub_title | str | 原 “UP主小助手” 入口子标题 | 目前为空文本 | + +`data` 中的 `session_cfg` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ---------------- | ---- | +| {用户mid} | obj | 该会话的配置信息 | | + +`session_cfg` 中的 `{用户mid}` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------- | ---- | -------------------- | ------------------- | +| hidden_emote_btn | bool | 是否隐藏表情按钮 | | +| hidden_pic_btn | bool | 是否隐藏发送图片按钮 | | +| max_height | num | 最大高度(?) | **作用尚不明确** | +| hint_text | str | 私信输入框的提示内容 | `你想问什么问题呢?` | +| hidden_top_hint | bool | (?) | **作用尚不明确** | +| is_gpt_account | bool | 是否为AI会话 | | + +`data` 中的 `game_msg` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ---- | ------------------------------------------------------------- | +| show_install | bool | true | **作用尚不明确**;仅当请求参数 `mobi_app` 不为 `web` 时有此项 | + +**示例:** + +```shell +curl 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get_sys_setting' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "is_create_group_available": 1, + "is_auto_reply_available": 1, + "vc_hint_title": "我为什么会收到此类消息", + "vc_hint_title_button": "了解更多", + "vc_hint_detail": "您【特别关注】的UP主更新视频或专栏后,会第一时间在私信推送给您。如有需要可点击右上角设置关闭推送。", + "vc_hint_detail_button": "关闭推送", + "auto_reply_html": "https://message.bilibili.com/h5/app/auto-reply", + "is_receive_unfollow_wl": 0, + "is_voyage": 1, + "is_auto_reply_recommend_available": 0, + "is_discuss_style_im_page": 0, + "discuss_unread_style_im_page": 0, + "old_up_assistant_door": { + "show_old_up_door": 0, + "title": "", + "sub_title": "" + }, + "is_new_up_assistant_effective": 1, + "is_archive_gray": true, + "session_cfg": { + "100000000000001": { + "hidden_emote_btn": true, + "hidden_pic_btn": true, + "max_height": 62, + "hint_text": "你想问什么问题呢?", + "hidden_top_hint": true, + "is_gpt_account": true + }, + "100000000000002": { + "hidden_emote_btn": true, + "hidden_pic_btn": true, + "max_height": 62, + "hint_text": "你想问什么问题呢?", + "hidden_top_hint": true, + "is_gpt_account": true + }, + "1400565964": { + "hidden_emote_btn": true, + "hidden_pic_btn": true, + "max_height": 62, + "hint_text": "你想问什么问题呢?", + "hidden_top_hint": true, + "is_gpt_account": true + } + }, + "migrate_session_api": false, + "game_msg": { + "show_install": true + }, + "auto_reply_msg_desc": "此条消息为自动回复", + "huahuo_group_icon_new": "http://i0.hdslb.com/bfs/kfptfe/floor/e2e3829e514ebccab1705636b0354ec89446a4b5.png", + "huahuo_group_icon_dark_new": "http://i0.hdslb.com/bfs/kfptfe/floor/d09bc8c0716a15938ec427db5fa962733703f3ce.png", + "im_disabled_input_hint": "请到UP主空间发起咨询" + } +} +``` + +
+ +## 获取创建粉丝团按钮可见性 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------- | ------ | ------------------------- | +| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | +| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| msg | str | 错误信息 | 默认为0 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------------------- | ---------------------- | +| show | num | 是否显示创建粉丝团按钮 | 粉丝数达到 1000 后显示 | + +**示例:** + +```shell +curl 'https://api.vc.bilibili.com/link_group/v1/member/show_create_group_icon' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "0", + "message": "0", + "ttl": 1, + "data": { + "show": 1 + } +} +``` + +
diff --git a/docs/misc/b23tv.md b/docs/misc/b23tv.md new file mode 100644 index 0000000..b90891b --- /dev/null +++ b/docs/misc/b23tv.md @@ -0,0 +1,127 @@ +# b23.tv 短链 + +## 简述 + +b23.tv 是由 Bilibili 提供的短链服务, 主要用于站内长链接缩短便于分享, 目前仅在手机客户端生成 + +### 格式 + +目前已知的 b23.tv 短链格式有以下 3 种 + +- 任意短链, 路径由7位数字或大小写英文字母组成, 为防止滥用似乎有时效限制, 如 https://b23.tv/pigt3PQ + +- 视频短链(AV号), 路径由字符串 `av` 尾随 视频 aid 组成, 如 https://b23.tv/av80433022 + +- 视频短链(BV号), 路径由字符串 `BV` 尾随 视频 bvid 组成, 如 https://b23.tv/BV1GJ411x7h7 + +## 生成 + +### 视频短链 + +1. 直接手动拼接字符串即可 + +2. 参见[任意短链](#任意短链) + +### 任意短链 + +> https://api.bilibili.com/x/share/click +> https://api.biliapi.net/x/share/click + +*请求方式: POST* + +认证方式: 仅APP, 但实际上形同虚设 + +注: 该接口参数对照表基本失效, 基本无实用价值, 已被注释, 参见 [#979](https://github.com/SocialSisterYi/bilibili-API-collect/issues/979) [Nemo2011/bilibili-api#720](https://github.com/Nemo2011/bilibili-api/pull/720) + +**正文参数(application/x-www-form-urlencoded):** + +必要: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------- | ------ | ---- | +| buvid | str | 设备 BUVID | 必要 | 实际任意非空字符串即可 | +| build | num | 客户端版本号 | 必要 | 大于 `5520400` 的任意有效整数, 如 `7710300` | +| platform | str | 客户端平台 | 必要 | 实际任意非空字符串即可 | +| share_channel | str | 分享方式? | 必要 | COPY | +| share_mode | num | 分享模式? | 必要 | 任意有效正整数, 常见 `1`, `3`, `4` | +| share_id | str | 分享 ID | 必要 | 见下方对照表 | +| oid | num | 对象 ID | 必要 | 见下方对照表 | + +不必要: + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------ | ---- | ---- | +| object_extra_fields| obj | 额外字段? | 非必要 | 如 `{"jumpfrom_id":30104}` `{"epid":"409808","cid":"1398781253"}` `{"season_type":"1","season_id":"39481","epid":"425006","dubbing_support":false,"background_audio":false,"role_audio_list":false}` | +| panel_type | num | 面板类型? | 非必要 | 1 | +| share_title | str | 分享标题? | 非必要 | 分享标题 | +| share_content | str | 分享内容? | 非必要 | 分享内容, 当 oid 存在时无意义(可是 oid 不可能不存在啊) | +| share_origin | str | 分享来源? | 非必要 | 如 `vinfo_share` `dynamic` `vertical-three-point-panel` `vinfo_player` | +| share_pattern | num | 分享模式? | 非必要 | 0 | +| share_session_id | str | 分享会话 ID? | 非必要 | 各部分用 `-` 分隔的小写的一串 UUID | +| ts | num | UNIX 秒级时间戳 | 非必要 | | + +对照表: + +| 类型 | 分享 ID (share_id) | 对象 ID (oid) | +| --- | ------------------ | ------------- | +| 视频 | main.ugc-video-detail.0.0.pv | 视频 aid | + + +**JSON回复:** + +根对象: + +| 字段名 | 类型 | 内容 | 备注 | +| ------ | ---- | -------- | ---- | +| code | num | 0 | 恒为 0 | +| message | str | 0 | 恒为 0 | +| ttl | num | 1 | 恒为 1 | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段名 | 类型 | 内容 | 备注 | +| ------ | ---- | -------- | ---- | +| content | str | 短链内容 | 若失败则不存在 | +| count | num | 0 | 恒为 0 | + +**示例:** + +为 `av80433022` 生成 b23.tv 短链 + +```shell +curl -X POST "http://api.biliapi.net/x/share/click" \ +--data-urlencode "platform=unix" \ +--data-urlencode "share_channel=COPY" \ +--data-urlencode "share_id=main.ugc-video-detail.0.0.pv" \ +--data-urlencode "share_mode=4" \ +--data-urlencode "oid=80433022" \ +--data-urlencode "buvid=qwq" \ +--data-urlencode "build=6114514" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "content": "【【官方 MV】Never Gonna Give You Up - Rick Astley-哔哩哔哩】 https://b23.tv/5x4wy5f", + "count": 0 + } +} +``` + +
diff --git a/docs/misc/buvid3_4.md b/docs/misc/buvid3_4.md new file mode 100644 index 0000000..99dc3c1 --- /dev/null +++ b/docs/misc/buvid3_4.md @@ -0,0 +1,132 @@ +# 获取 buvid3 / buvid4 / b_nut + +## 仅获取 buvid3 + +> https://api.bilibili.com/x/web-frontend/getbuvid + +*请求方式: GET* + + + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | -------- | +| code | num | 返回值 | 0:成功 | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | ---- | +| buvid | str | buvid3 | 需手动存放至 cookie 中 | + +**示例:** + +注: 不要复制 + +```shell +curl -G 'https://api.bilibili.com/x/web-frontend/getbuvid' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "data": { + "buvid": "54E5EFC1-3C8F-F690-2261-439E4F6A20A979439infoc" + } +} +``` + +
+ +## 接口获取 buvid3 / buvid4 + +> https://api.bilibili.com/x/frontend/finger/spi + +*请求方式: GET* + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | -------- | +| code | num | 返回值 | 0:成功 | +| message | str | 信息 | ok: 成功 | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | ---- | +| b_3 | str | buvid3 | 需手动存放至 cookie 中 | +| b_4 | str | buvid4 | 同上 | + +**示例:** + +注: 建议自行生成, 不要复制本处示例的 buvid3 / buvid4. + +```shell +curl -G 'https://api.bilibili.com/x/frontend/finger/spi' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "data": { + "b_3": "D9656DA8-9BEF-F464-5B72-C4849AFD336379044infoc", + "b_4": "F6E0FD4B-520C-1902-4F7B-E461D8D1F5AB79044-024072309-666onEZSnlHVPjoRp4kDYg==" + }, + "message": "ok" +} +``` + +
+ +## 从响应头获取 buvid3 / b_nut + +使用 `GET` 或 `HEAD` 方法请求 `https://www.bilibili.com/`, 且请求头中 `User-Agent` 字段不包含 `curl` `python` `awa` 等敏感子字符串, 且相同 `User-Agent` 字段不得短时多次请求. 在响应头中的 `Set-Cookie` 字段中, 即可找到 `buvid3` 和 `b_nut`. + +若不带任何 Cookie 请求, 则 `b_nut` 为响应生成时刻的 UNIX 秒级时间戳. +若请求 Cookie 仅带有 `buvid3`, 则 `b_nut` 为 `100`. +若请求 Cookie 仅带有 `b_nut`, 则与不带任何 Cookie 的响应相同. +若请求 Cookie 仅带有 `buvid3` 和 `b_nut`, 则响应无 `Set-Cookie` 字段. +若请求 Cookie 带有其他字段, 无影响. + +**示例:** + +```shell +curl -I "https://www.bilibili.com/" -A "awa" +``` + +
+查看响应示例: + +```http +HTTP/2 200 +date: Fri, 26 Jul 2024 06:38:43 GMT +content-type: text/html; charset=utf-8 +support: nantianmen +set-cookie: buvid3=805E4894-96A2-0684-6F00-C6EA1FFB911023315infoc; path=/; expires=Sat, 26 Jul 2025 06:38:43 GMT; domain=.bilibili.com +set-cookie: b_nut=1721975923; path=/; expires=Sat, 26 Jul 2025 06:38:43 GMT; domain=.bilibili.com +vary: Origin,Accept-Encoding +idc: shjd +expires: Fri, 26 Jul 2024 06:38:42 GMT +cache-control: no-cache +x-cache-webcdn: MISS from blzone01 +x-cache-time: 0 +x-save-date: Fri, 26 Jul 2024 06:38:43 GMT +``` + +
diff --git a/docs/misc/bvid_desc.md b/docs/misc/bvid_desc.md new file mode 100644 index 0000000..d9e3346 --- /dev/null +++ b/docs/misc/bvid_desc.md @@ -0,0 +1,850 @@ + +# 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) + +## 概述 + +### 格式 + +“bvid”恒为长度为 12 的字符串,前 3 个固定为“BV1”,后 9 个为 base58 计算结果(不包含数字 `0` 和大写字母 `I`、 `O` 以及小写字母 `l`) + +### 实质 + +“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号的过程](https://www.bilibili.com/video/BV1N741127Tj)~~ +实际上上面的算法依然不完整,新的算法参考自 [SocialSisterYi#740](https://github.com/SocialSisterYi/bilibili-API-collect/issues/740)~~来自 B 站某个 JS 文件?~~ + +### av->bv算法 + +**说明** + +1. 目前的 BV 格式为 BV1XXXXXXXXX,以 BV1 开头,后面包含 9 位有效数据。 +2. AV 最大值为 2⁵¹。 + +**算法** + +- 定义一个包含初始值为 `['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']` 的长度为 12 的数组`bytes`,用于存储转换后的字符。 + - 定义变量 `bv_idx` 并初始化为数组 `bytes` 的最后一个索引。 + - 将输入的 `aid` 与 avid 最大值(2⁵¹)进行按位或运算,其结果与常量 `XOR_CODE`(23442827791579)进行异或运算,得到变量 `tmp`。 + - 当 `tmp` 大于0时,循环执行以下操作直到小于0: + - 将 `tmp` 除以 58(码表的长度) 的余数作为索引,从 `FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf` 码表中取出对应的字符,并将其赋值给 `bytes[bv_idx]`。 + - 将 `tmp` 与 58 求模赋值给 `tmp`。 + - 将 `bv_idx` 减1。 + - 将 `bytes` 数组中索引为 3 和 9 的元素进行交换。 + - 将 `bytes` 数组中索引为 4 和 7 的元素进行交换。 + - 将 `bytes` 数组转换为字符串,并返回结果。 + +### bv->av算法 + +是 #av->bv算法 的逆向 + +- 将 `bvid` 中索引为 3 和 9 的字符进行交换。 +- 将 `bvid` 中索引为 4 和 7 的字符进行交换。 +- 删除 `bvid` 前3个字符(固定为 BV1)。 +- 定义变量 `tmp` 并初始化为 0。 +- 遍历 `bvid` 的每个字符,执行以下操作: + - 获取当前字符在 `FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf` 码表中的索引,并将其赋值给变量 `idx`。 + - 将 `tmp` 乘以常量 58,并加上 `idx`,最后赋值给 `tmp`。 +- 将 `tmp` 与常量 2⁵¹ - 1 进行按位与运算,其结果与常量 `XOR_CODE`(23442827791579) 进行异或运算,得到最终结果。 + +## 编程实现 + +### JavaScript/TypeScript + + + + +```javascript +const XOR_CODE = 23442827791579n; +const MASK_CODE = 2251799813685247n; +const MAX_AID = 1n << 51n; +const BASE = 58n; + +const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf'; + +function av2bv(aid) { + const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']; + let bvIndex = bytes.length - 1; + let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE; + while (tmp > 0) { + bytes[bvIndex] = data[Number(tmp % BigInt(BASE))]; + tmp = tmp / BASE; + bvIndex -= 1; + } + [bytes[3], bytes[9]] = [bytes[9], bytes[3]]; + [bytes[4], bytes[7]] = [bytes[7], bytes[4]]; + return bytes.join(''); +} + +function bv2av(bvid) { + const bvidArr = Array.from(bvid); + [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]]; + [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]]; + bvidArr.splice(0, 3); + const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n); + return Number((tmp & MASK_CODE) ^ XOR_CODE); +} + +console.log(av2bv(111298867365120)); +console.log(bv2av('BV1L9Uoa9EUx')); +``` + + + + + +```typescript +const XOR_CODE = 23442827791579n; +const MASK_CODE = 2251799813685247n; +const MAX_AID = 1n << 51n; +const BASE = 58n; + +const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf'; + +function av2bv(aid: number) { + const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']; + let bvIndex = bytes.length - 1; + let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE; + while (tmp > 0) { + bytes[bvIndex] = data[Number(tmp % BigInt(BASE))]; + tmp = tmp / BASE; + bvIndex -= 1; + } + [bytes[3], bytes[9]] = [bytes[9], bytes[3]]; + [bytes[4], bytes[7]] = [bytes[7], bytes[4]]; + return bytes.join('') as `BV1${string}`; +} + +function bv2av(bvid: `BV1${string}`) { + const bvidArr = Array.from(bvid); + [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]]; + [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]]; + bvidArr.splice(0, 3); + const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n); + return Number((tmp & MASK_CODE) ^ XOR_CODE); +} + +console.log(av2bv(111298867365120)); +console.log(bv2av('BV1L9Uoa9EUx')); +``` + + + +### Python + +来自:[#847](https://github.com/SocialSisterYi/bilibili-API-collect/issues/847#issuecomment-1807020675) + +```python +XOR_CODE = 23442827791579 +MASK_CODE = 2251799813685247 +MAX_AID = 1 << 51 +ALPHABET = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf" +ENCODE_MAP = 8, 7, 0, 5, 1, 3, 2, 4, 6 +DECODE_MAP = tuple(reversed(ENCODE_MAP)) + +BASE = len(ALPHABET) +PREFIX = "BV1" +PREFIX_LEN = len(PREFIX) +CODE_LEN = len(ENCODE_MAP) + +def av2bv(aid: int) -> str: + bvid = [""] * 9 + tmp = (MAX_AID | aid) ^ XOR_CODE + for i in range(CODE_LEN): + bvid[ENCODE_MAP[i]] = ALPHABET[tmp % BASE] + tmp //= BASE + return PREFIX + "".join(bvid) + +def bv2av(bvid: str) -> int: + assert bvid[:3] == PREFIX + + bvid = bvid[3:] + tmp = 0 + for i in range(CODE_LEN): + idx = ALPHABET.index(bvid[DECODE_MAP[i]]) + tmp = tmp * BASE + idx + return (tmp & MASK_CODE) ^ XOR_CODE + +assert av2bv(111298867365120) == "BV1L9Uoa9EUx" +assert bv2av("BV1L9Uoa9EUx") == 111298867365120 +``` + +### Rust + +参考 + +### Swift + +```swift +fileprivate let XOR_CODE: UInt64 = 23442827791579 +fileprivate let MASK_CODE: UInt64 = 2251799813685247 +fileprivate let MAX_AID: UInt64 = 1 << 51 + +fileprivate let data: [UInt8] = [70, 99, 119, 65, 80, 78, 75, 84, 77, 117, 103, 51, 71, 86, 53, 76, 106, 55, 69, 74, 110, 72, 112, 87, 115, 120, 52, 116, 98, 56, 104, 97, 89, 101, 118, 105, 113, 66, 122, 54, 114, 107, 67, 121, 49, 50, 109, 85, 83, 68, 81, 88, 57, 82, 100, 111, 90, 102] + +fileprivate let BASE: UInt64 = 58 +fileprivate let BV_LEN: Int = 12 +fileprivate let PREFIX: String = "BV1" + +func av2bv(avid: UInt64) -> String { + var bytes: [UInt8] = [66, 86, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48] + var bvIdx = BV_LEN - 1 + var tmp = (MAX_AID | avid) ^ XOR_CODE + + while tmp != 0 { + bytes[bvIdx] = data[Int(tmp % BASE)] + tmp /= BASE + bvIdx -= 1 + } + + bytes.swapAt(3, 9) + bytes.swapAt(4, 7) + + return String(decoding: bytes, as: UTF8.self) +} + +func bv2av(bvid: String) -> UInt64 { + let fixedBvid: String + if bvid.hasPrefix("BV") { + fixedBvid = bvid + } else { + fixedBvid = "BV" + bvid + } + var bvidArray = Array(fixedBvid.utf8) + + bvidArray.swapAt(3, 9) + bvidArray.swapAt(4, 7) + + let trimmedBvid = String(decoding: bvidArray[3...], as: UTF8.self) + + var tmp: UInt64 = 0 + + for char in trimmedBvid { + if let idx = data.firstIndex(of: char.utf8.first!) { + tmp = tmp * BASE + UInt64(idx) + } + } + + return (tmp & MASK_CODE) ^ XOR_CODE +} + +print(av2bv(avid: 111298867365120)) +print(bv2av(bvid: "BV1L9Uoa9EUx")) +``` + +### Java + +```java +import java.math.BigInteger; + +/** + * @author cctyl + */ +public class AVBVConverter { + + private static final BigInteger XOR_CODE = BigInteger.valueOf(23442827791579L); + private static final BigInteger MASK_CODE = BigInteger.valueOf(2251799813685247L); + private static final BigInteger MAX_AID = BigInteger.ONE.shiftLeft(51); + private static final int BASE = 58; + + private static final String DATA = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf"; + + public static String av2bv(long aidParam) { + BigInteger aid = BigInteger.valueOf(aidParam); + char[] bytes = {'B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'}; + int bvIndex = bytes.length - 1; + BigInteger tmp = MAX_AID.or(aid).xor(XOR_CODE); + while (tmp.compareTo(BigInteger.ZERO) > 0) { + bytes[bvIndex] = DATA.charAt(tmp.mod(BigInteger.valueOf(BASE)).intValue()); + tmp = tmp.divide(BigInteger.valueOf(BASE)); + bvIndex--; + } + swap(bytes, 3, 9); + swap(bytes, 4, 7); + return new String(bytes); + } + + public static long bv2av(String bvid) { + char[] bvidArr = bvid.toCharArray(); + swap(bvidArr, 3, 9); + swap(bvidArr, 4, 7); + String adjustedBvid = new String(bvidArr, 3, bvidArr.length - 3); + BigInteger tmp = BigInteger.ZERO; + for (char c : adjustedBvid.toCharArray()) { + tmp = tmp.multiply(BigInteger.valueOf(BASE)).add(BigInteger.valueOf(DATA.indexOf(c))); + } + BigInteger xor = tmp.and(MASK_CODE).xor(XOR_CODE); + return xor.longValue(); + } + + + private static void swap(char[] array, int i, int j) { + char temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + public static void main(String[] args) { + + final int aid1 = 643755790; + final String bv1 = "BV1bY4y1j7RA"; + + final int aid2 = 305988942; + final String bv2 = "BV1aP411K7it"; + + //av ==> bv + assert av2bv(aid1).equals(bv1); + assert av2bv(aid2).equals(bv2); + + //bv ==>av + assert bv2av(bv1) == aid1; + assert bv2av(bv2) == aid2; + } +} +``` + +### Golang + +```go +package main + +import ( + "fmt" + "strings" +) + +var ( + XOR_CODE = int64(23442827791579) + MAX_CODE = int64(2251799813685247) + CHARTS = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf" + PAUL_NUM = int64(58) +) + +func swapString(s string, x, y int) string { + chars := []rune(s) + chars[x], chars[y] = chars[y], chars[x] + return string(chars) +} + +func Bvid2Avid(bvid string) (avid int64) { + s := swapString(swapString(bvid, 3, 9), 4, 7) + bv1 := string([]rune(s)[3:]) + temp := int64(0) + for _, c := range bv1 { + idx := strings.IndexRune(CHARTS, c) + temp = temp*PAUL_NUM + int64(idx) + } + avid = (temp & MAX_CODE) ^ XOR_CODE + return +} + +func Avid2Bvid(avid int64) (bvid string) { + arr := [12]string{"B", "V", "1"} + bvIdx := len(arr) - 1 + temp := (avid | (MAX_CODE + 1)) ^ XOR_CODE + for temp > 0 { + idx := temp % PAUL_NUM + arr[bvIdx] = string(CHARTS[idx]) + temp /= PAUL_NUM + bvIdx-- + } + raw := strings.Join(arr[:], "") + bvid = swapString(swapString(raw, 3, 9), 4, 7) + return +} + +func main() { + avid := int64(1054803170) + bvid := "BV1mH4y1u7UA" + resAvid := Bvid2Avid(bvid) + resBvid := Avid2Bvid(avid) + + fmt.Printf("convert bvid to avid: %v\tvalue:%v\n", avid == resAvid, resAvid) + fmt.Printf("convert avid to bvid: %v\tvalue:%v\n", bvid == resBvid, resBvid) + +} + +``` + + +### C++ +```cpp +#include +#include +#include +#include + +constexpr int64_t XOR_CODE = 0x1552356C4CDB; +constexpr int64_t MAX_AID = 0x8000000000000; +constexpr int64_t MASK_CODE = MAX_AID - 1; +constexpr int64_t BASE = 58; +constexpr char Table[BASE + 1] = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf"; +constexpr char ReverseTable[128] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2c, 0x2d, 0x0b, 0x1a, 0x0e, 0x27, 0x11, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x25, 0x2a, 0x31, 0x12, 0x00, 0x0c, 0x15, 0x00, 0x13, 0x06, 0x0f, 0x08, 0x05, 0x00, + 0x04, 0x32, 0x35, 0x30, 0x07, 0x2f, 0x0d, 0x17, 0x33, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0x1c, 0x01, 0x36, 0x21, 0x39, 0x0a, 0x1e, 0x23, 0x10, 0x29, 0x00, 0x2e, 0x14, 0x37, + 0x16, 0x24, 0x28, 0x18, 0x1b, 0x09, 0x22, 0x02, 0x19, 0x2b, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +std::string Av2bv(const int64_t Avid) { + assert(Avid > 0 && "Avid must be greater than 0"); + std::string bv = "BV1"; + bv.resize(12, '\0'); + + int64_t tmp = (Avid | MAX_AID) ^ XOR_CODE; + for (size_t i = bv.size() - 1; tmp > 0 && i > 2; --i) { + bv[i] = Table[tmp % BASE]; + tmp /= BASE; + } + std::ranges::swap(bv.at(3), bv.at(9)); + std::ranges::swap(bv.at(4), bv.at(7)); + return bv; +} + +int64_t Bv2av(const std::string &Bvid) { + assert(Bvid.starts_with("BV1") && "Bvid must start with 'BV1'"); + + auto Bvid_ = Bvid; + std::ranges::swap(Bvid_.at(3), Bvid_.at(9)); + std::ranges::swap(Bvid_.at(4), Bvid_.at(7)); + + int64_t tmp = 0; + for (int i = 3; i < Bvid_.size(); ++i) { + tmp = ReverseTable[Bvid_.at(i)] + BASE * tmp; + } + return (tmp & MASK_CODE) ^ XOR_CODE; +} + +int main() { + assert(Av2bv(1004871019) == "BV16x4y1H7M1"); + assert(Bv2av("BV16x4y1H7M1") == 1004871019); +} +``` + + + +## 老版算法存档 + +**以下算法已失效**,编解码函数值域有限,不推荐使用,在此仅作为存档 + +
+查看折叠内容: + +算法参考自[【揭秘】av号转bv号的过程](https://www.bilibili.com/video/BV1N741127Tj) + +### av->bv算法 + +注:本算法及示例程序仅能编解码`avid < 29460791296`,且暂无法验证`avid >= 29460791296`的正确性 +再注:本人不清楚新算法能否编解码`avid >= 29460791296` + +1. a = (avid ⊕ 177451812) + 100618342136696320 +2. 以 i 为循环变量循环 6 次 b[i] = (a / 58 ^ i) % 58 +3. 将 b[i] 中各个数字转换为以下码表中的字符 + +码表: + +> fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF + +4. 初始化字符串 b[i]=` ` + +5. 按照以下字符顺序编码表编码并填充至 b[i] + +字符顺序编码表: + +> 0 -> 9 +> +> 1 -> 8 +> +> 2 -> 1 +> +> 3 -> 6 +> +> 4 -> 2 +> +> 5 -> 4 +> +> 6 -> 0 +> +> 7 -> 7 +> +> 8 -> 3 +> +> 9 -> 5 + +### bv->av算法 + +为以上算法的逆运算 + +### 编程实现 + +使用 Python C TypeScript Java Kotlin Golang Rust 等语言作为示例,欢迎社区提交更多例程 + +#### Python + +```python +XOR = 177451812 +ADD = 100618342136696320 +TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF" +MAP = 9, 8, 1, 6, 2, 4, 0, 7, 3, 5 + + +def av2bv(av: int) -> str: + av = (av ^ XOR) + ADD + bv = [""] * 10 + for i in range(10): + bv[MAP[i]] = TABLE[(av // 58**i) % 58] + return "".join(bv) + + +def bv2av(bv: int) -> int: + av = [""] * 10 + s = 0 + for i in range(10): + s += TABLE.find(bv[MAP[i]]) * 58**i + av = (s - ADD) ^ XOR + + return av + + +def main(): + while 1: + mode = input("1. AV to BV\n2. BV to AV\n3. Exit\n你的选择:") + if mode == "1": + print(f"BV号是:BV {av2bv(int(input('AV号是:')))}") + elif mode == "2": + print(f"AV号是:AV {bv2av(input('BV号是:'))}") + elif mode == "3": + break + else: + print("输入错误请重新输入") + + +if __name__ == "__main__": + main() +``` + +#### C + +```c +#include +#include +#include +#include + +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 = {}; // 反查码表 + 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 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() + private val mp2 = HashMap() + + //现在,定义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 +``` + +#### Rust + +crate: https://github.com/stackinspector/bvid + +```rust +// Copyright (c) 2023 stackinspector. MIT license. + +const XORN: u64 = 177451812; +const ADDN: u64 = 100618342136696320; +const TABLE: [u8; 58] = *b"fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; +const MAP: [usize; 10] = [9, 8, 1, 6, 2, 4, 0, 7, 3, 5]; +const REV_TABLE: [u8; 74] = [ + 13, 12, 46, 31, 43, 18, 40, 28, 5, 0, 0, 0, 0, 0, 0, 0, 54, 20, 15, 8, + 39, 57, 45, 36, 0, 38, 51, 42, 49, 52, 0, 53, 7, 4, 9, 50, 10, 44, 34, 6, + 25, 1, 0, 0, 0, 0, 0, 0, 26, 29, 56, 3, 24, 0, 47, 27, 22, 41, 16, 0, + 11, 37, 2, 35, 21, 17, 33, 30, 48, 23, 55, 32, 14, 19, +]; +const POW58: [u64; 10] = [ + 1, 58, 3364, 195112, 11316496, 656356768, 38068692544, + 2207984167552, 128063081718016, 7427658739644928, +]; + +fn av2bv(avid: u64) -> [u8; 10] { + let a = (avid ^ XORN) + ADDN; + let mut bvid = [0; 10]; + for i in 0..10 { + bvid[MAP[i]] = TABLE[(a / POW58[i]) as usize % 58]; + } + bvid +} + +fn bv2av(bvid: [u8; 10]) -> u64 { + let mut a = 0; + for i in 0..10 { + a += REV_TABLE[bvid[MAP[i]] as usize - 49] as u64 * POW58[i]; + } + (a - ADDN) ^ XORN +} + +// assert_eq!(*b"17x411w7KC", av2bv(170001)); +// assert_eq!(170001, bv2av(*b"17x411w7KC")); +``` + +
diff --git a/docs/misc/device_identity.md b/docs/misc/device_identity.md new file mode 100644 index 0000000..0335848 --- /dev/null +++ b/docs/misc/device_identity.md @@ -0,0 +1,104 @@ +# 设备各类标识算法(APP 端) + +## 设备唯一标识 BUVID + +注意区分于 Web 端的 [buvid3, buvid4](buvid3_4.md). + +BUVID 在 APP 首次安装于某设备, 且首次启动时生成. + +APP 首次(即每次安装后)启动, 会向云端发送本机各类设备特征, 含 `AndroidId`, `DrmId` 等, 请求是否有匹配的 BUVID, 有就使用云端的, 否则使用本地生成的. + +APP 请求是否有匹配的 BUVID 发送的本机各类设备特征包括(但不限于): + ++ `AndroidID` ++ `DrmId` ++ `IMEI` ++ `OAID` ++ 手机网卡 `MAC` ++ 设备品牌 ++ 设备 Model ++ 本地生成的 BUVID + +### 生成方法 + +1. 选定设备特征码, 可以是 `AndroidID`, `DrmId`, 手机网卡 `MAC` 等. 记为 `ID`. 特别地, `MAC` 应当去掉 `:`, `GUID`(即 UUID) 应当去掉 `-`. + +2. 计算 `ID` 的 MD5. 记为 `ID_MD5`. + +3. 从 `ID_MD5` 抽取第 3, 13, 23 位, 失败就默认为 000, 记为 `ID_E`. + +4. 根据选定的设备特征码类型确定 BUVID Prefix, 见附录. 记为 `BUVID_Prefix`. + +5. 按 `{BUVID_Prefix}{ID_E}{ID_MD5}` 的顺序连接起来, 共37位(2+3+32). 结果应当为大写. + +### Demo + +#### Rust + +代码及测试样例见 [Rust Playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=40b5906cf3838a60efa83fa368b15147). + +## 设备指纹 fp (fp_local, fp_remote) + +用于请求账户相关 REST API, 及 gRPC Metadata 生成. + +在请求头中, `fp_local` 和 `fp_remote` 设置为同一值即可, 暂不清楚区别. + +### 生成方法 + +1. 获取 BUVID. 此处一般使用 XU Prefix 的 BUVID. + +2. 获取设备 Model(`Build.MODEL`), 如 `NOH-AN01`. + +3. 获取手机无线电固件版本号(`Build.getRadioVersion()`), 失败则留空. 如 `21C20B686S000C000,21C20B686S000C000`. + +4. 按前述顺序拼接字符串, 计算得 MD5. + +5. 获取年月日, 格式 `yyyyMMddhhmmss`, 拼接到 4 得到的字符串后. + +6. 生成 16 位随机字符串, CharSet 为 `0123456789abcdef`, 拼接到 5 得到的字符串后, 记为 `fp_raw`. + +7. 计算得到一个特殊字符串, 拼接到 `fp_raw` 后, 即得到最终的 `fp`, 特殊字符串算法见下: + +```rust +let mut veri_code = 0; +// 有点像 HEX 的操作 +let fp_raw_sub_str = fp_raw + .as_bytes() // 将字符串 fp_raw 转换为字节数组 + .chunks(2) // 按每两个字节一组进行切分 + .map(|s| unsafe { ::std::str::from_utf8_unchecked(s) }) // 对每一组解析作为 UTF-8 字符串 + .collect::>(); // 将结果收集到 Vec 中 +// 如果 fp_raw 的长度小于 62, 则向下取偶数减半作为循环终止条件, 否则终止条件为31 +for i in 0..({ + if fp_raw.len() < 62 { + fp_raw.len() - fp_raw.len() % 2 // 取偶数 + } else { + 62 + } +} / 2) +{ + // 将每组字符串转换为对应的 16 进制整数, 将转换得到的整数加到 veri_code 上. + veri_code += i32::from_str_radix(fp_raw_sub_str[i], 16).unwrap_or(0); +} +// 最后将 veri_code 对 256 取余, 格式化为两位的 16 进制字符串 +let veri_code = format!("{:0>2x}", veri_code % 256); +``` + +### Demo + +#### Rust + +代码及测试样例见 [Rust Playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=40b5906cf3838a60efa83fa368b15147). + +## 附录 + +### BUVID Prefix + +|设备特征码|BUVID Prefix|备注| +|:-:|:-:|:-:| +|`AndroidID`|`XX`|| +|`DrmId`|`XU`|| +|`IMEI`|`XZ`|已弃用| +|`GUID`|`XW`|已弃用| +|`MAC`|`XY`|| +|`GoogleId`|`XG`|东南亚版本| +|`FacebookId`|`XF`|东南亚版本| diff --git a/docs/misc/errcode.md b/docs/misc/errcode.md new file mode 100644 index 0000000..3fe8264 --- /dev/null +++ b/docs/misc/errcode.md @@ -0,0 +1,62 @@ +# 公共错误码 + +下表为大部分接口返回值中`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 | 撞车跳转 | +| -352 | 风控校验失败 (UA 或 wbi 参数不合法) | +| -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 | 扣节操失败 | +| -799 | 请求过于频繁,请稍后再试 | +| -8888 | 对不起,服务器开小差了~ (ಥ﹏ಥ) | diff --git a/docs/misc/picture.md b/docs/misc/picture.md new file mode 100644 index 0000000..e16cfa0 --- /dev/null +++ b/docs/misc/picture.md @@ -0,0 +1,97 @@ +# 图片格式化 + +已知 `*.hdslb.com` `archive.biliimg.com` 等域名作用等效, 对于请求头 `Referer` 要求留空或在 `.bilibili.com` 等 B 站域名下 + +对于以上域名的 `/bfs/` 下的图片文件都可以使用以下可选格式化参数 + +使用 `@` 开始参数 (无论格式如何, 无论是否有参数, 通过计算 HASH 发现, 使用 `@` 均会导致返回图片不同), 多个参数以 `_` 分隔, 图片格式无需分隔且必须放在最后 + +参见: [#191](https://github.com/SocialSisterYi/bilibili-API-collect/issues/191) + +注: jpg 即 jpeg, 二者等效. 网页端常用 AVIF, WebP. + +| 参数 | 格式 | 含义 | 备注 | +| ---- | ------- | ---------------- | ---------------- | +| w | ${int}w | 图片最大限制宽度 | 范围 [1, 9223372036854775807] | +| h | ${int}h | 图片最大限制高度 | 范围 [1, 9223372036854775807] | +| s | ${int}s | 作用尚不明确 | 不影响输出结果, 范围 [1, 9223372036854775807] | +| e | ${int}e | 改变大小 | 0: 保留比例取其小, 1: 保留比例取其大, 2: 不保留原比例 | +| p | ${int}p | 缩放倍数 | 默认100, 范围 [1, 1000] | +| o | ${int}o | 作用尚不明确 | 不影响输出结果 范围 [0, 1] | +| q | ${int}q | 图片质量百分比 | 仅限webp/jpeg/avif | +| c | ${int}c | 裁切图片(如果宽高允许) | 0: 不裁切但会修改图片, 1: 上传时的预设规则(若无则右下), 2: 左上, 3: 右上 | +| f | ${int}f | 作用尚不明确 | [0, 1]: 不改变图片, 2: 会改变图片 | +| progressive | progressive | 图片编码方式 | 仅限 jpeg(无: baseline, 有: progressive)/png(无:non-interlaced, 有: interlaced) | +| ! | !${str} | 加载来源 | web-home-carousel-cover, header, web-dynamic, web-avatar-space-header, ... | +| . | .${str} | 图片格式 | 仅限 png/jpeg/webp/avif/[avg_color](#avg_color格式说明) | + +**示例:** + +
+查看示例: + +原始图片 + +https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg + + + +高度限制为100 + +https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@100h + + + +宽度限制为100 + +https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@100w + + + +转换格式为webp + +https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@.webp + + + +转换为webp图片质量为1% + +https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@1q.webp + + +
+ +## avg_color格式说明 + +当图片格式化输出格式为`avg_color`时 + +> \*.hdslb.com/bfs/\*/\*.*@\*.avg_color + +*请求方式:GET* + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ----------- | ------ | +| RGB | str | 平均颜色值 | HEX | + +**示例:** + +获取 https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg 的平均颜色值 + +```shell +curl 'https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@.avg_color' +``` + +
+查看响应示例: + +```json +{ + "RGB": "#7d6f6c" +} +``` + +
diff --git a/docs/misc/sign/APP.md b/docs/misc/sign/APP.md new file mode 100644 index 0000000..8b51c05 --- /dev/null +++ b/docs/misc/sign/APP.md @@ -0,0 +1,289 @@ +# APP API 签名与鉴权 + +## APP API 签名特性 + +部分客户端专用的 REST API 存在基于参数签名的鉴权,需要使用规定的`appkey`及其对应的`appsec`与原始请求参数进行签名计算,部分`AppKey`及与之对应的`AppSec`已经被公开:见该文档 [APPKey](APPKey.md) + +- 不同 `appkey` 对应不同的 app (如客户端、概念版、必剪、漫画、bililink等) + +- 不同平台同 app 也会存在不同的 `appkey` (如安卓端、ios端、TV端等) + +- 同平台同 app 下不同功能也会存在不同的 `appkey`(如登录专用、取流专用等) + +- 不同版本的客户端的 `appkey` 也可能不同 + +- **appkey与appsec一一对应** + +## APP API 签名算法 + +1. 首先为参数中添加`appkey`字段 +2. 然后按照参数的 Key 重新排序 +3. 再对这个 Key-Value 进行 url query 序列化,并拼接与之对应的`appsec` (盐) 进行 **md5 Hash 运算**(32-bit 字符小写),该 hash 便是 API 签名 +4. 最后在参数尾部增添`sign`字段,它的 Value 为上一步计算所得的 hash,一并作为表单或 Query 提交 + +## Demo + +该 Demo 提供 [Python](#python)、[Java](#java)、[TS/JS](#typescript-javascript)、[Swift](#swift)、[C++](#cplusplus) 语言例程 + +使用 appkey = `1d8b6e7d45233436`, appsec = `560c52ccd288fed045859ed18bffd973` 对如下 `params` 参数进行签名 + +上述示例`appkey`、`AppSec`均来自文档 [APPKey](APPKey.md) + +### Python + +```python +import hashlib +import urllib.parse + +def appsign(params, appkey, appsec): + '为请求参数进行 APP 签名' + 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) +``` + +输出内容分别是进行 APP 签名的后参数的 key-Value 以及 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 +``` + +### Java + + +```java +package io.github.cctyl; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.net.URLEncoder; +import java.util.TreeMap; + +/** + * @author cctyl + */ +public class AppSigner { + + private static final String APP_KEY = "1d8b6e7d45233436"; + private static final String APP_SEC = "560c52ccd288fed045859ed18bffd973"; + + public static String appSign(Map params) { + // 为请求参数进行 APP 签名 + params.put("appkey", APP_KEY); + // 按照 key 重排参数 + Map sortedParams = new TreeMap<>(params); + // 序列化参数 + StringBuilder queryBuilder = new StringBuilder(); + for (Map.Entry entry : sortedParams.entrySet()) { + if (queryBuilder.length() > 0) { + queryBuilder.append('&'); + } + queryBuilder + .append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8)) + .append('=') + .append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8)); + } + return generateMD5(queryBuilder .append(APP_SEC).toString()); + } + + private static String generateMD5(String input) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(input.getBytes()); + StringBuilder sb = new StringBuilder(); + for (byte b : digest) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return null; + } + + public static void main(String[] args) { + Map params = new HashMap<>(); + params.put("id", "114514"); + params.put("str", "1919810"); + params.put("test", "いいよ,こいよ"); + System.out.println(appSign(params)); + } +} +``` + +输出结果为:01479cf20504d865519ac50f33ba3a7d + +### TypeScript/JavaScript + +```typescript +import { createHash } from 'node:crypto' + +type Params = Record + +const md5 = (str: string) => createHash('md5').update(str).digest('hex') + +/** + * 为请求参数进行 APP 签名 + */ +export function appSign(params: Params, appkey: string, appsec: string) { + params.appkey = appkey + const searchParams = new URLSearchParams(params) + searchParams.sort() + return md5(searchParams.toString() + appsec) +} + +console.log( + appSign( + { + id: 114514, + str: '1919810', + test: 'いいよ,こいよ', + }, + '1d8b6e7d45233436', + '560c52ccd288fed045859ed18bffd973', + ), + '01479cf20504d865519ac50f33ba3a7d', +) +``` + +输出结果为:01479cf20504d865519ac50f33ba3a7d + +### Swift + +```swift +import Foundation +import CommonCrypto + +//Swift标准库没有MD5函数,所以我们要自己实现一个 +func MD5(string: String) -> String { + let length = Int(CC_MD5_DIGEST_LENGTH) + var digest = [UInt8](repeating: 0, count: length) + + if let d = string.data(using: .utf8) { + _ = d.withUnsafeBytes { body -> String in + CC_MD5(body.baseAddress, CC_LONG(d.count), &digest) + return "" + } + } + + return (0.. String { + var signedParams = params + signedParams["appkey"] = appKey + let sortedParams = signedParams.sorted { $0.key < $1.key } + //在制作成query时,需要显式addingPercentEncoding转换 + let query = sortedParams.map { "\($0.key)=\($0.value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)" }.joined(separator: "&") + let sign = MD5(string: query+appSec) + return sign +} + + +//testSign +let appKey = "1d8b6e7d45233436" +let appSec = "560c52ccd288fed045859ed18bffd973" +let signResult = appSign(params: [ + "id": "114514", + "str": "1919810", + "test": "いいよ,こいよ", +],appKey:appKey,appSec:appSec) +print(signResult) +``` + +输出结果为:01479cf20504d865519ac50f33ba3a7d + + + +### CplusPlus + +需要 c++ 23 标准库,[cpr](https://github.com/libcpr/cpr)、[cryptopp](https://github.com/weidai11/cryptopp)、[nlohmann/json](https://github.com/nlohmann/json) 等依赖 + +```c++ +#include // std::println + +/// thrid party libraries +#include // cpr::util::urlEncode() +#include +#include +#include + +/* + * 注意,假定不会发生错误! + */ + +/* 获取 md5 hex(lower) */ +std::string Get_md5_hex(const std::string &Input_str) { + CryptoPP::Weak1::MD5 hash; + std::string md5_hex; + + CryptoPP::StringSource ss(Input_str, true, + new CryptoPP::HashFilter(hash, + new CryptoPP::HexEncoder( + new CryptoPP::StringSink(md5_hex) + ) + ) + ); + + std::ranges::for_each(md5_hex, [](char &x) { x = std::tolower(x); }); + return md5_hex; +} + +/* 将 json 转换为 url 编码字符串 */ +std::string Json_to_url_encode_str(const nlohmann::json &Json) { + std::string encode_str; + for (const auto &[key, value]: Json.items()) { + encode_str.append(key).append("=").append(cpr::util::urlEncode(value.is_string() ? value.get() : to_string(value))).append("&"); + } + + // remove the last '&' + encode_str.resize(encode_str.size() - 1, '\0'); + return encode_str; +} + +std::string App_sign(nlohmann::json &Params, const std::string &App_key, const std::string &App_sec) { + Params["appkey"] = App_key; + Params["sign"] = Get_md5_hex(Json_to_url_encode_str(Params) + App_sec); + return Json_to_url_encode_str(Params); +} + +int main() { + nlohmann::json Params; + Params["id"] = 114514; + Params["str"] = "1919810"; + Params["test"] = "いいよ,こいよ"; + + constexpr auto App_key = "1d8b6e7d45233436"; + constexpr auto App_sec = "560c52ccd288fed045859ed18bffd973"; + std::string sign = App_sign(Params, App_key, App_sec); + std::println("{}", to_string(Params)); + std::println("{}", sign); +} +``` + +```text +{"appkey":"1d8b6e7d45233436","id":114514,"sign":"01479cf20504d865519ac50f33ba3a7d","str":"1919810","test":"いいよ,こいよ"} +appkey=1d8b6e7d45233436&id=114514&sign=01479cf20504d865519ac50f33ba3a7d&str=1919810&test=%E3%81%84%E3%81%84%E3%82%88%EF%BC%8C%E3%81%93%E3%81%84%E3%82%88 +``` + diff --git a/docs/misc/sign/APPKey.md b/docs/misc/sign/APPKey.md new file mode 100644 index 0000000..398ebb0 --- /dev/null +++ b/docs/misc/sign/APPKey.md @@ -0,0 +1,55 @@ +# APPKey + +以下为已知的 APPkey / APPSec,及部分使用场景参数信息,均来自抓包与逆向工程 + +| APPKEY | APPSEC | platform2 | APP类型 | neuronAppId1 | mobi_app2 | 备注 | +| :--------------: | :------------------------------: | :------------------: | :----------------: | :---------------------: | :------------------: | :----------------------------------------: | +| 9d5889cf67e615cd | 8fd9bb32efea8cef801fd895bef2713d | `android` | Ai4cCreatorAndroid | | | | +| 1d8b6e7d45233436 | 560c52ccd288fed045859ed18bffd973 | `android` | 粉版 | `1` | `android` | 获取资源通用 | +| 783bbb7264451d82 | 2653583c8873dea268ab9386918b1d65 | `android` | 粉版 | `1` | `android` | 仅获取用户信息时使用(7.X及更新版本) | +| 57263273bc6b67f6 | a0488e488d1567960d3a765e8d129f90 | `android` | 粉版 | `1` | `android` | 可能来自旧版 | +| 07da50c9a0bf829f | 25bdede4e1581c836cab73a48790ca6e | `android` | 概念版 | `3` | `android_b` | | +| 191c3b6b975af184 | 1673b15a09ef5e4427627f47b03a0578 | `android` | 概念版 | `3` | `android_b` | 仅获取用户信息时使用(7.X及更新版本) | +| 178cf125136ca8ea | 34381a26236dd1171185c0beb042e1c6 | `android` | 概念版 | `3` | `android_b` | 可能来自旧版 | +| 7d336ec01856996b | a1ce6983bc89e20a36c37f40c4f1a0dd | `android` | 概念版 | `3` | `android_b` | 可能来自旧版 | +| dfca71928277209b | b5475a8825547a4fc26c7d518eaaa02e | `android` | HD 版 | `5` | `android_hd` | | +| bb3101000e232e27 | 36efcfed79309338ced0380abd824ac1 | `android` | 白版 | `14` | `android_i` | | +| ae57252b0c09105d | c75875c596a69eb55bd119e74b07cfe3 | `android` | 白版 | `14` | `android_i` | 仅获取用户信息时使用(7.X及更新版本) | +| 8e16697a1b4f8121 | f5dd03b752426f2e623d7badb28d190a | `android` | 白版 | `14` | `android_i` | 可能来自旧版 | +| 7d089525d3611b1c | acd495b248ec528c2eed1e862d393126 | `android` | 蓝版 | `30` | `bstar_a` | | +| iVGUTjsxvpLeuDCf | aHRmhWMLkdeMuILqORnYZocwMBpMEOdt | `android` | - | - | - | 视频取流专用, 仅5.X旧版使用 | +| YvirImLGlLANCLvM | JNlZNgfNGKZEpaDTkCdPQVXntXhuiJEM | `ios` | - | - | - | 视频取流专用 | +| 27eb53fc9058f8c3 | c2ed53a74eeefe3cf99fbd01d8c9c375 | `web`/`ios`? | - | - | - | 第三方授权使用 | +| 84956560bc028eb7 | 94aba54af9065f71de72f5508f1cd42e | ? | UWP 版 | - | - | 部分API不接受此appkey, 返回-663错误 | +| 85eb6835b0a1034e | 2ad42749773c441109bdc0191257a664 | ? | UWP 版? | - | - | 部分API不接受此appkey, 返回-663错误 | +| 4ebafd7c4951b366 | 8cb98205e9b2ad3669aad0fce12a4c13 | `ios` | iPhone 客户端? | `iphone` | ? | | +| 8d23902c1688a798 | 710f0212e62bd499b8d3ac6e1db9302a | `android` | AndroidBiliThings | ? | ? | | +| 4c6e1021617d40d9 | e559a59044eb2701b7a8628c86aa12ae | `android` | AndroidMallTicket | ? | ? | | +| c034e8b74130a886 | e4e8966b1e71847dc4a3830f2d078523 | `android` | AndroidOttSdk | `7` | ? | | +| 4409e2ce8ffd12b8 | 59b43e04ad6965f34319062b478f83dd | `android` | 云视听小电视(TV版) | `9`? | `android_tv_yst`? | | +| 37207f2beaebf8d7 | e988e794d4d4b6dd43bc0e89d6e90c43 | `android` | BiliLink | ? | ? | | +| 9a75abf7de2d8947 | 35ca1c82be6c2c242ecc04d88c735f31 | `android` | BiliScan | ? | ? | | +| aae92bc66f3edfab | af125a0d5279fd576c1b4418a3e8276d | ? | PC 投稿工具 | - | ? | | +| bca7e84c2d947ac6 | 60698ba2f68e01ce44738920a0ffe768 | ? | login | - | ? | | +| h9Ejat5tFh81cq8V | BdiI92bjmZ9QRcjJBWv2EEssyjekAGKt | | | | | bilibili游戏 web端 游戏详情页API | + +注释: + +1 `neuronAppId`,产品编号,由数据平台分配,详情如下: + +- 粉(国内版)=1 +- 白(GooglePlay 版)=2 +- 蓝(东南亚版)=3 +- 直播姬=4 +- HD=5 +- 海外=6 +- OTT=7 +- 漫画=8 +- TV野版=9 +- 小视频=10 +- 网易漫画=11 +- 网易漫画lite=12 +- 网易漫画HD=13, +- 国际版=14 + +2 `platform`, `mobi_app` 仅供参考, 具体值需要抓包确定. diff --git a/docs/misc/sign/bili_ticket.md b/docs/misc/sign/bili_ticket.md new file mode 100644 index 0000000..c0ed0d8 --- /dev/null +++ b/docs/misc/sign/bili_ticket.md @@ -0,0 +1,304 @@ +# BiliTicket + +## 简述 + +`bili_ticket` 位于请求头 Cookie 中, 非必需, 但存在可降低风控概率 + +由 [@aynuarance](https://github.com/aynuarance) 于 [#903](https://github.com/SocialSisterYi/bilibili-API-collect/issues/903) 提供的思路,根据时间戳使用 `hmac_sha256` 算法计算 `hexsign`。 + +是 [JWT 令牌](https://jwt.io/),有效时长为 259260 秒,即 3 天。 +例如 `eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDI3NDI3NDYsImlhdCI6MTcwMjQ4MzQ4NiwicGx0IjotMX0.xQgtTAc41NA1gzvd9yKUPgucUy_DKcQj6OG1vj8V7ZA` + +```json +{ + "alg": "HS256", + "kid": "s03", + "typ": "JWT" +} +``` + +## 算法 + +1. 获取 UNIX 秒级时间戳存入变量如 `timestamp` +2. 计算变量 `hexsign` 值,使用 `hmac_sha256` 算法,密钥为 `XgwSnGZ1p`,消息为字符串 `"ts"` 与变量 `timestamp` 值拼接 +3. 构造请求参数,`key_id` 为 `ec02`,`hexsign` 为变量 `hexsign` 值,`context[ts]` 为变量 `timestamp` 值,`csrf` 为 cookie 中的 `bili_jct` 值也可为空 +4. 发送 `POST` 请求,获取 `data` 字段中的 `ticket` 字段的值即为所求 + +## 接口 + +> https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket + +*请求方式: POST* + +鉴权方式: 请求头 `Referer` 为空或 `.bilibili.com` 子域下任意页 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----- | ---- | ---- | ------ | ---- | +| key_id | str | ec02 | 必要 | | +| hexsign | str | 由 `hmac_sha256` 算法计算的 `hexsign` 值 | 必要 | | +| context[ts] | num | UNIX 秒级时间戳 | 必要 | | +| csrf | str | cookie 中的 `bili_jct` 值 | 非必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| code | num | 返回值 | 0: 成功
400: 参数错误 | +| message | str | 返回消息 | OK: 成功 | +| data | obj | 数据本体 | | +| ttl | num | 1 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| ticket | str | bili_ticket | | +| created_at | num | 创建时间 | UNIX 秒级时间戳 | +| ttl | num | 有效时长 | 259200 秒 (3 天) | +| context | obj | 空 | | +| nav | obj | wbi_img 相关 | 参见 [WBI 签名](./wbi.md) | + +`nav` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| img | str | img_key 值 | 参见 [WBI 签名](./wbi.md) | +| sub | str | sub_key 值 | 参见 [WBI 签名](./wbi.md) | + +**示例:** + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "OK", + "data": { + "ticket": "eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjM2OTMwODAsImlhdCI6MTcyMzQzMzgyMCwicGx0IjotMX0.efOwv7i4m0ykABrXEDHGAechU2AByMcP_-3EYpQrNKs", + "created_at": 1723433820, + "ttl": 259200, + "context": {}, + "nav": { + "img": "https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png", + "sub": "https://i0.hdslb.com/bfs/wbi/4932caff0ff746eab6f01bf08b70ac45.png" + } + }, + "ttl": 1 +} +``` + +
+ +## Demo + +此处提供 [Python](#python), [Java](#java), [JavaScript (Node.js)](#javascript-nodejs) 的示例代码 + +### Python + +需要 `requests` 依赖 + +```python +import hmac +import hashlib +import requests +import time + +def hmac_sha256(key, message): + """ + 使用HMAC-SHA256算法对给定的消息进行加密 + :param key: 密钥 + :param message: 要加密的消息 + :return: 加密后的哈希值 + """ + # 将密钥和消息转换为字节串 + key = key.encode('utf-8') + message = message.encode('utf-8') + + # 创建HMAC对象,使用SHA256哈希算法 + hmac_obj = hmac.new(key, message, hashlib.sha256) + + # 计算哈希值 + hash_value = hmac_obj.digest() + + # 将哈希值转换为十六进制字符串 + hash_hex = hash_value.hex() + + return hash_hex + + +if __name__ == '__main__': + o = hmac_sha256("XgwSnGZ1p",f"ts{int(time.time())}") + url = "https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket" + params = { + "key_id":"ec02", + "hexsign":o, + "context[ts]":f"{int(time.time())}", + "csrf": '' + } + + headers = { + 'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0" + } + resp = requests.post(url, params=params,headers=headers).json() + print(resp) +``` + +### Java + +无需第三方依赖 + +```java +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URI; +import java.nio.charset.StandardCharsets; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +public class BiliTicketDemo { + + /** + * Convert a byte array to a hex string. + * + * @param bytes The byte array to convert. + * @return The hex string representation of the given byte array. + */ + public static String bytesToHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + sb.append('0'); + } + sb.append(hex); + } + return sb.toString(); + } + + /** + * Generate a HMAC-SHA256 hash of the given message string using the given key + * string. + * + * @param key The key string to use for the HMAC-SHA256 hash. + * @param message The message string to hash. + * @throws Exception If an error occurs during the HMAC-SHA256 hash generation. + * @return The HMAC-SHA256 hash of the given message string using the given key + * string. + */ + public static String hmacSha256(String key, String message) throws Exception { + Mac mac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); + mac.init(secretKeySpec); + byte[] hash = mac.doFinal(message.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(hash); + } + + /** + * Get a Bilibili web ticket for the given CSRF token. + * + * @param csrf The CSRF token to use for the web ticket, can be {@code null} or + * empty. + * @return The Bilibili web ticket raw response for the given CSRF token. + * @throws Exception If an error occurs during the web ticket generation. + * @see https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/misc/sign/bili_ticket.md + */ + public static String getBiliTicket(String csrf) throws Exception { + // params + long ts = System.currentTimeMillis() / 1000; + String hexSign = hmacSha256("XgwSnGZ1p", "ts" + ts); + StringBuilder url = new StringBuilder( + "https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket"); + url.append('?'); + url.append("key_id=ec02").append('&'); + url.append("hexsign=").append(hexSign).append('&'); + url.append("context[ts]=").append(ts).append('&'); + url.append("csrf=").append(csrf == null ? "" : csrf); + // request + HttpURLConnection conn = (HttpURLConnection) new URI(url.toString()).toURL().openConnection(); + conn.setRequestMethod("POST"); + conn.addRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"); + InputStream in = conn.getInputStream(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int b; + while ((b = in.read()) != -1) { + out.write(b); + } + return new String(out.toByteArray(), StandardCharsets.UTF_8); + } + + /** + * Main method to test the BiliTicketDemo class. + * + * @param args The command line arguments (not used). + */ + public static void main(String[] args) { + try { + System.out.println(getBiliTicket("")); // use empty CSRF here + } catch (Exception e) { + e.printStackTrace(); + } + } + +} +``` + +### JavaScript (Node.js) + +```javascript +const crypto = require('crypto'); + +/** + * Generate HMAC-SHA256 signature + * @param {string} key The key string to use for the HMAC-SHA256 hash + * @param {string} message The message string to hash + * @returns {string} The HMAC-SHA256 signature as a hex string + */ +function hmacSha256(key, message) { + const hmac = crypto.createHmac('sha256', key); + hmac.update(message); + return hmac.digest('hex'); +} + +/** + * Get Bilibili web ticket + * @param {string} csrf CSRF token, can be empty or null + * @returns {Promise} Promise of the ticket response in JSON format + */ +async function getBiliTicket(csrf) { + const ts = Math.floor(Date.now() / 1000); + const hexSign = hmacSha256('XgwSnGZ1p', `ts${ts}`); + const url = 'https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket'; + const params = new URLSearchParams({ + key_id: 'ec02', + hexsign: hexSign, + 'context[ts]': ts, + csrf: csrf || '' + }); + const response = await fetch(`${url}?${params.toString()}`, { + method: 'POST', + headers: { + 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' + } + }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return response.json(); +} + +(async () => { + try { + const ticketResponse = await getBiliTicket(''); // use empty CSRF here + console.log(ticketResponse); + } catch (e) { + console.error('Failed to get BiliTicket:', e); + } +})(); +``` diff --git a/docs/misc/sign/v_voucher.md b/docs/misc/sign/v_voucher.md new file mode 100644 index 0000000..3804c80 --- /dev/null +++ b/docs/misc/sign/v_voucher.md @@ -0,0 +1,179 @@ +# v_voucher 验证 + +## 简述 + +当同一接口在短时间内被同一用户/IP/UA多次请求或异常时, 会触发风控, 如接口返回 `code` 为 `-352` 即 `风控校验失败`, 同时 `data` 中出现 `v_voucher` 字段, 响应头出现 `x-bili-gaia-vvoucher` + +`v_voucher` 结构为字符串 `voucher_` 尾随一串以 `-` 为分隔符的小写 UUID + +`v_voucher` 可用于申请 captcha 验证码, 若无意外发生, 根据验证结果使用 `validate` 接口获取 `grisk_id` 作为被风控接口的 `gaia_vtoken` 与 Cookie 中的 `x-bili-gaia-vtoken`, 即可恢复正常访问 + +若该情况出现在使用 Wbi 签名的接口中, 建议先检查 Wbi 签名是否正确. 若已检查 Wbi 签名或无需签名, 检查请求头中 `User-Agent` `Referer` 是否正常, 以及 `Cookie` 中 [`bili_ticket`](bili_ticket.md) [`b_nut` `buvid3` `buvid4`](../buvid3_4.md) 等是否存在. 使用 captcha 是最后的选择, 因为 captcha 验证需要用户操作 + +参见 [#1067](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1067) + +**注意: 不是所有风控都可以使用本方式通过 captcha 解决** + +## 操作流程 + +1. 快速以不正确的姿势请求接口, 直到返回 `v_voucher` 字段如下. 若 `data` 中没有 `v_voucher` 字段, 则检查响应头 `x-bili-gaia-vvoucher` + + ```json + { + "code": -352, + "message": "风控校验失败", + "ttl": 1, + "data": { + "v_voucher": "voucher_84a8c3ce-33f5-4551-9552-9c6b13aa7938" + } + } + ``` + +2. [请求 `register` 接口](#从-v_voucher-申请-captcha), 请求体传入 `csrf` 及 `v_voucher`, 该接口返回与 [申请captcha验证码](../../login/login_action/readme.md#申请captcha验证码) 部分相同, 记录此处返回的 `token` `challenge` + +3. 按照 [验证captcha验证码](../../login/login_action/readme.md#验证captcha验证码) 进行验证, 记下验证结果的 `validate` 与 `seccode` + +4. [请求 `validate` 接口](#从验证结果获取-grisk_id), 请求体传入 `challenge` `token` `validate` `seccode` `csrf`, 该接口返回 `grisk_id` 即 `gaia_vtoken` 与 `x-bili-gaia-vtoken` + +5. 重新请求原接口, 原 URL 参数加入 `gaia_vtoken`, Cookie 加入 `x-bili-gaia-vtoken`, 即恢复正常 + +## 接口列表 + +### 从 v_voucher 申请 captcha + +> https://api.bilibili.com/x/gaia-vgate/v1/register + +注: 同一有效 `v_voucher` 只能请求一次, 请求完毕请立即 [进行验证](../../login/login_action/readme.md#进行验证) 防止过期失效 + +*请求方式: POST* + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------- | ------ | ---- | +| csrf | str | CSRF Token (位于 Cookie 的 bili_jct) | 非必要 | | +| v_voucher | str | v_voucher | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ------ | ---- | +| code | num | 返回值 | 0:成功
100000: 验证码获取失败 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ------ | ---- | +| type | str | 验证码类型 | 目前只有 `geetest` | +| token | str | 验证码 token | 用于验证 | +| geetest | obj | 极验信息 | 若为 null 则说明该风控无法通过 captcha 解除 | +| biliword | null | | | +| phone | null | | | +| sms | null | | | + +`geetest` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ----- | ------ | -------- | +| gt | str | 极验id | 一般为固定值 | +| challenge | str | 极验KEY | 由B站后端产生用于人机验证 | + +**示例:** + +假设此处 `v_voucher` 为 `voucher_ecca35e6-36da-4f38-bd84-b3f420ea08c1` + +```shell +curl -X POST "https://api.bilibili.com/x/gaia-vgate/v1/register" \ +--data-urlencode "v_voucher=voucher_ecca35e6-36da-4f38-bd84-b3f420ea08c1" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "type": "geetest", + "token": "e7abdb050c3d4609979f1685137e3bc0", + "geetest": { + "challenge": "85118f8714875ca4c6d5641bb0ce9ddf", + "gt": "ac597a4506fee079629df5d8b66dd4fe" + }, + "biliword": null, + "phone": null, + "sms": null + } +} +``` + +
+ +## 从验证结果获取 grisk_id + +> https://api.bilibili.com/x/gaia-vgate/v1/validate + +*请求方式: POST* + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------ | ---- | ---- | +| csrf | str | CSRF Token (位于 Cookie 的 bili_jct) | 非必要 | 若登陆则必要 | +| challenge | str | 验证码 challenge | 必要 | | +| token | str | 验证码 token | 必要 | | +| validate | str | 验证结果 validate | 必要 | | +| seccode | str | 验证结果 seccode | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ------ | ---- | +| code | num | 返回值 | 0:成功
-111: csrf 校验失败
100003: 验证码过期 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ------ | ---- | +| is_valid | num | 验证结果 | 1:验证成功 | +| grisk_id | str | gaia_vtoken | 用于恢复正常访问 | + +**示例:** + +```shell +curl -X POST "https://api.bilibili.com/x/gaia-vgate/v1/validate" \ +--data-urlencode "challenge=e4fcb337b8c0427b56320f97e1064210" \ +--data-urlencode "csrf=xxxxxxxxxxxxxxx" \ +--data-urlencode "seccode=360f7b9cf75c74c68fbb7475416d0e0d|jordan" \ +--data-urlencode "token=0e1e58bdff3d4b8aa298e346fed07eeb" \ +--data-urlencode "validate=360f7b9cf75c74c68fbb7475416d0e0d" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "is_valid": 1, + "grisk_id": "2e91cf2b67172ca8432fe7c9ab66a5c4" + } +} +``` + +
diff --git a/docs/misc/sign/wbi.md b/docs/misc/sign/wbi.md new file mode 100644 index 0000000..2eb4777 --- /dev/null +++ b/docs/misc/sign/wbi.md @@ -0,0 +1,1477 @@ +# WBI 签名 + +自 2023 年 3 月起,Bilibili Web 端部分接口开始采用 WBI 签名鉴权,表现在 REST API 请求时在 Query param 中添加了 `w_rid` 和 `wts` 字段。WBI 签名鉴权独立于 [APP 鉴权](APP.md) 与其他 Cookie 鉴权,目前被认为是一种 Web 端风控手段。 + +经持续观察,大部分查询性接口都已经或准备采用 WBI 签名鉴权,请求 WBI 签名鉴权接口时,若签名参数 `w_rid` 与时间戳 `wts` 缺失、错误,会返回 [`v_voucher`](v_voucher.md),如: + +```json +{"code":0,"message":"0","ttl":1,"data":{"v_voucher":"voucher_******"}} +``` + +感谢 [#631](https://github.com/SocialSisterYi/bilibili-API-collect/issues/631) 的研究与逆向工程。 + +细节更新:[#885](https://github.com/SocialSisterYi/bilibili-API-collect/issues/885)。 + +最新进展: [#919](https://github.com/SocialSisterYi/bilibili-API-collect/issues/919) + +## WBI 签名算法 + +1. 获取实时口令 `img_key`、`sub_key` + + 从 [nav 接口](../../login/login_info.md#导航栏用户信息) 中获取 `img_url`、`sub_url` 两个字段的参数。 + 或从 [bili_ticket 接口](bili_ticket.md#接口) 中获取 `img` `sub` 两个字段的参数。 + + **注:`img_url`、`sub_url` 两个字段的值看似为存于 BFS 中的 png 图片 url,实则只是经过伪装的实时 Token,故无需且不能试图访问这两个 url** + + ```json + {"code":-101,"message":"账号未登录","ttl":1,"data":{"isLogin":false,"wbi_img":{"img_url":"https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png","sub_url":"https://i0.hdslb.com/bfs/wbi/4932caff0ff746eab6f01bf08b70ac45.png"}}} + ``` + + 截取其文件名,分别记为 `img_key`、`sub_key`,如上述例子中的 `7cd084941338484aae1ad9425b84077c` 和 `4932caff0ff746eab6f01bf08b70ac45`。 + + `img_key`、`sub_key` 全站统一使用,观测知应为**每日更替**,使用时建议做好**缓存和刷新**处理。 + + 特别地,发现部分接口将 `img_key`、`sub_key` 硬编码进 JavaScript 文件内,如搜索接口 `https://s1.hdslb.com/bfs/static/laputa-search/client/assets/index.1ea39bea.js`,暂不清楚原因及影响。 + 同时, 部分页面会在 SSR 的 `__INITIAL_STATE__` 包含 `wbiImgKey` 与 `wbiSubKey`, 具体可用性与区别尚不明确 + +2. 打乱重排实时口令获得 `mixin_key` + + 把上一步获取到的 `sub_key` 拼接在 `img_key` 后面(下例记为 `raw_wbi_key`),遍历重排映射表 `MIXIN_KEY_ENC_TAB`,取出 `raw_wbi_key` 中对应位置的字符拼接得到新的字符串,截取前 32 位,即为 `mixin_key`。 + + 重排映射表 `MIXIN_KEY_ENC_TAB` 长为 64,内容如下: + + ```rust + const MIXIN_KEY_ENC_TAB: [u8; 64] = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 + ] + ``` + + 重排操作如下例: + + ```rust + fn gen_mixin_key(raw_wbi_key: impl AsRef<[u8]>) -> String { + const MIXIN_KEY_ENC_TAB: [u8; 64] = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, + 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, + 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52, + ]; + let raw_wbi_key = raw_wbi_key.as_ref(); + let mut mixin_key = { + let binding = MIXIN_KEY_ENC_TAB + .iter() + // 此步操作即遍历 MIXIN_KEY_ENC_TAB,取出 raw_wbi_key 中对应位置的字符 + .map(|n| raw_wbi_key[*n as usize]) + // 并收集进数组内 + .collect::>(); + unsafe { String::from_utf8_unchecked(binding) } + }; + let _ = mixin_key.split_off(32); // 截取前 32 位字符 + mixin_key + } + ``` + + 如 `img_key` -> `7cd084941338484aae1ad9425b84077c`、`sub_key` -> `4932caff0ff746eab6f01bf08b70ac45` 经过上述操作后得到 `mixin_key` -> `ea1db124af3c7062474693fa704f4ff8`。 + +3. 计算签名(即 `w_rid`) + + 若下方内容为欲签名的**原始**请求参数(以 JavaScript Object 为例) + + ```javascript + { + foo: '114', + bar: '514', + zab: 1919810 + } + ``` + + `wts` 字段的值应为当前以秒为单位的 Unix 时间戳,如 `1702204169` + + 复制一份参数列表,添加 `wts` 参数,即: + + ```javascript + { + foo: '114', + bar: '514', + zab: 1919810, + wts: 1702204169 + } + ``` + + 随后按键名升序排序后百分号编码 URL Query,拼接前面得到的 `mixin_key`,如 `bar=514&foo=114&wts=1702204169&zab=1919810ea1db124af3c7062474693fa704f4ff8`,计算其 MD5 即为 `w_rid`。 + + 需要注意的是:如果参数值含中文或特殊字符等,编码字符字母应当**大写** (部分库会错误编码为小写字母),空格应当编码为 `%20`(部分库按 `application/x-www-form-urlencoded` 约定编码为 `+`), 具体正确行为可参考 [encodeURIComponent 函数](https://tc39.es/ecma262/multipage/global-object.html#sec-encodeuricomponent-uricomponent) + + 例如: + + ```javascript + { + foo: 'one one four', + bar: '五一四', + baz: 1919810 + } + ``` + + 应该被编码为 `bar=%E4%BA%94%E4%B8%80%E5%9B%9B&baz=1919810&foo=one%20one%20four`。 + +4. 向原始请求参数中添加 `w_rid`、`wts` 字段 + + 将上一步得到的 `w_rid` 以及前面的 `wts` 追加到**原始**请求参数编码得到的 URL Query 后即可,目前看来无需对原始请求参数排序。 + + 如前例最终得到 `bar=514&foo=114&zab=1919810&w_rid=8f6f2b5b3d485fe1886cec6a0be8c5d4&wts=1702204169`。 + +## Demo + +含 [Python](#python)、[JavaScript](#javascript)、[Golang](#golang)、[C#](#csharp)、[Java](#java)、[Kotlin](#kotlin)、[Swift](#swift)、[C++](#cplusplus)、[Rust](#rust)、[Haskell](#haskell) 语言编写的 Demo + +### Python + +需要`requests`依赖 + +```python +from functools import reduce +from hashlib import md5 +import urllib.parse +import time +import requests + +mixinKeyEncTab = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 +] + +def getMixinKey(orig: str): + '对 imgKey 和 subKey 进行字符顺序打乱编码' + return reduce(lambda s, i: s + orig[i], mixinKeyEncTab, '')[:32] + +def encWbi(params: dict, img_key: str, sub_key: str): + '为请求参数进行 wbi 签名' + mixin_key = getMixinKey(img_key + sub_key) + curr_time = round(time.time()) + params['wts'] = curr_time # 添加 wts 字段 + params = dict(sorted(params.items())) # 按照 key 重排参数 + # 过滤 value 中的 "!'()*" 字符 + params = { + k : ''.join(filter(lambda chr: chr not in "!'()*", str(v))) + for k, v + in params.items() + } + query = urllib.parse.urlencode(params) # 序列化参数 + wbi_sign = md5((query + mixin_key).encode()).hexdigest() # 计算 w_rid + params['w_rid'] = wbi_sign + return params + +def getWbiKeys() -> tuple[str, str]: + '获取最新的 img_key 和 sub_key' + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', + 'Referer': 'https://www.bilibili.com/' + } + resp = requests.get('https://api.bilibili.com/x/web-interface/nav', headers=headers) + resp.raise_for_status() + json_content = resp.json() + img_url: str = json_content['data']['wbi_img']['img_url'] + sub_url: str = json_content['data']['wbi_img']['sub_url'] + img_key = img_url.rsplit('/', 1)[1].split('.')[0] + sub_key = sub_url.rsplit('/', 1)[1].split('.')[0] + return img_key, sub_key + +img_key, sub_key = getWbiKeys() + +signed_params = encWbi( + params={ + 'foo': '114', + 'bar': '514', + 'baz': 1919810 + }, + img_key=img_key, + sub_key=sub_key +) +query = urllib.parse.urlencode(signed_params) +print(signed_params) +print(query) +``` + +输出内容分别是进行 Wbi 签名的后参数的 key-Value 以及 url query 形式 + +``` +{'bar': '514', 'baz': '1919810', 'foo': '114', 'wts': '1702204169', 'w_rid': 'd3cbd2a2316089117134038bf4caf442'} +bar=514&baz=1919810&foo=114&wts=1702204169&w_rid=d3cbd2a2316089117134038bf4caf442 +``` + +### JavaScript + +需要 `fetch`(浏览器、NodeJS等环境自带)、`md5` 依赖 + + + + +```javascript +import md5 from 'md5' + +const mixinKeyEncTab = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 +] + +// 对 imgKey 和 subKey 进行字符顺序打乱编码 +const getMixinKey = (orig) => mixinKeyEncTab.map(n => orig[n]).join('').slice(0, 32) + +// 为请求参数进行 wbi 签名 +function encWbi(params, img_key, sub_key) { + const mixin_key = getMixinKey(img_key + sub_key), + curr_time = Math.round(Date.now() / 1000), + chr_filter = /[!'()*]/g + + Object.assign(params, { wts: curr_time }) // 添加 wts 字段 + // 按照 key 重排参数 + const query = Object + .keys(params) + .sort() + .map(key => { + // 过滤 value 中的 "!'()*" 字符 + const value = params[key].toString().replace(chr_filter, '') + return `${encodeURIComponent(key)}=${encodeURIComponent(value)}` + }) + .join('&') + + const wbi_sign = md5(query + mixin_key) // 计算 w_rid + + return query + '&w_rid=' + wbi_sign +} + +// 获取最新的 img_key 和 sub_key +async function getWbiKeys() { + const res = await fetch('https://api.bilibili.com/x/web-interface/nav', { + headers: { + // SESSDATA 字段 + Cookie: 'SESSDATA=xxxxxx', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', + Referer: 'https://www.bilibili.com/'//对于直接浏览器调用可能不适用 + } + }) + const { data: { wbi_img: { img_url, sub_url } } } = await res.json() + + return { + img_key: img_url.slice( + img_url.lastIndexOf('/') + 1, + img_url.lastIndexOf('.') + ), + sub_key: sub_url.slice( + sub_url.lastIndexOf('/') + 1, + sub_url.lastIndexOf('.') + ) + } +} + +async function main() { + const web_keys = await getWbiKeys() + const params = { foo: '114', bar: '514', baz: 1919810 }, + img_key = web_keys.img_key, + sub_key = web_keys.sub_key + const query = encWbi(params, img_key, sub_key) + console.log(query) +} + +main() +``` + + + + + +```typescript +import md5 from 'md5' + +const mixinKeyEncTab = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 +] + +// 对 imgKey 和 subKey 进行字符顺序打乱编码 +const getMixinKey = (orig: string) => + mixinKeyEncTab + .map((n) => orig[n]) + .join("") + .slice(0, 32); + +// 为请求参数进行 wbi 签名 +function encWbi( + params: { [key: string]: string | number | object }, + img_key: string, + sub_key: string +) { + const mixin_key = getMixinKey(img_key + sub_key), + curr_time = Math.round(Date.now() / 1000), + chr_filter = /[!'()*]/g; + + Object.assign(params, { wts: curr_time }); // 添加 wts 字段 + // 按照 key 重排参数 + const query = Object.keys(params) + .sort() + .map((key) => { + // 过滤 value 中的 "!'()*" 字符 + const value = params[key].toString().replace(chr_filter, ""); + return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`; + }) + .join("&"); + + const wbi_sign = md5(query + mixin_key); // 计算 w_rid + + return query + "&w_rid=" + wbi_sign; +} +// 获取最新的 img_key 和 sub_key +async function getWbiKeys(SESSDATA: string) { + const res = await fetch('https://api.bilibili.com/x/web-interface/nav', { + headers: { + // SESSDATA 字段 + Cookie: `SESSDATA=${SESSDATA}`, + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', + Referer: 'https://www.bilibili.com/'//对于直接浏览器调用可能不适用 + } + }) + const { + data: { + wbi_img: { img_url, sub_url }, + }, + } = (await res.json()) as { + data: { + wbi_img: { img_url: string; sub_url: string }; + }; + }; + + return { + img_key: img_url.slice( + img_url.lastIndexOf('/') + 1, + img_url.lastIndexOf('.') + ), + sub_key: sub_url.slice( + sub_url.lastIndexOf('/') + 1, + sub_url.lastIndexOf('.') + ) + } +} + +async function main() { + const web_keys = await getWbiKeys("SESSDATA的值") + const params = { foo: '114', bar: '514', baz: 1919810 }, + img_key = web_keys.img_key, + sub_key = web_keys.sub_key + const query = encWbi(params, img_key, sub_key) + console.log(query) +} + +main() +``` + + + + +输出内容为进行 Wbi 签名的后参数的 url query 形式 + +``` +bar=514&baz=1919810&foo=114&wts=1684805578&w_rid=bb97e15f28edf445a0e4420d36f0157e +``` + +### Golang + +无第三方库 + +```go +package main + +import ( + "bytes" + "crypto/md5" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +func main() { + u, err := url.Parse("https://api.bilibili.com/x/space/wbi/acc/info?mid=1850091") + if err != nil { + panic(err) + } + fmt.Printf("orig: %s\n", u.String()) + err = Sign(u) + if err != nil { + panic(err) + } + fmt.Printf("signed: %s\n", u.String()) + + // 获取 wbi 时未修改 header + // 但实际使用签名后的 url 时发现风控较为严重 +} + +// Sign 为链接签名 +func Sign(u *url.URL) error { + return wbiKeys.Sign(u) +} + +// Update 无视过期时间更新 +func Update() error { + return wbiKeys.Update() +} + +func Get() (wk WbiKeys, err error) { + if err = wk.update(false); err != nil { + return WbiKeys{}, err + } + return wbiKeys, nil +} + +var wbiKeys WbiKeys + +type WbiKeys struct { + Img string + Sub string + Mixin string + lastUpdateTime time.Time +} + +// Sign 为链接签名 +func (wk *WbiKeys) Sign(u *url.URL) (err error) { + if err = wk.update(false); err != nil { + return err + } + + values := u.Query() + + values = removeUnwantedChars(values, '!', '\'', '(', ')', '*') // 必要性存疑? + + values.Set("wts", strconv.FormatInt(time.Now().Unix(), 10)) + + // [url.Values.Encode] 内会对参数排序, + // 且遍历 map 时本身就是无序的 + hash := md5.Sum([]byte(values.Encode() + wk.Mixin)) // Calculate w_rid + values.Set("w_rid", hex.EncodeToString(hash[:])) + u.RawQuery = values.Encode() + return nil +} + +// Update 无视过期时间更新 +func (wk *WbiKeys) Update() (err error) { + return wk.update(true) +} + +// update 按需更新 +func (wk *WbiKeys) update(purge bool) error { + if !purge && time.Since(wk.lastUpdateTime) < time.Hour { + return nil + } + + // 测试下来不用修改 header 也能过 + resp, err := http.Get("https://api.bilibili.com/x/web-interface/nav") + if err != nil { + return err + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + nav := Nav{} + err = json.Unmarshal(body, &nav) + if err != nil { + return err + } + + if nav.Code != 0 && nav.Code != -101 { // -101 未登录时也会返回两个 key + return fmt.Errorf("unexpected code: %d, message: %s", nav.Code, nav.Message) + } + img := nav.Data.WbiImg.ImgUrl + sub := nav.Data.WbiImg.SubUrl + if img == "" || sub == "" { + return fmt.Errorf("empty image or sub url: %s", body) + } + + // https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png + imgParts := strings.Split(img, "/") + subParts := strings.Split(sub, "/") + + // 7cd084941338484aae1ad9425b84077c.png + imgPng := imgParts[len(imgParts)-1] + subPng := subParts[len(subParts)-1] + + // 7cd084941338484aae1ad9425b84077c + wbiKeys.Img = strings.TrimSuffix(imgPng, ".png") + wbiKeys.Sub = strings.TrimSuffix(subPng, ".png") + + wbiKeys.mixin() + wbiKeys.lastUpdateTime = time.Now() + return nil +} + +func (wk *WbiKeys) mixin() { + var mixin [32]byte + wbi := wk.Img + wk.Sub + for i := range mixin { // for i := 0; i < len(mixin); i++ { + mixin[i] = wbi[mixinKeyEncTab[i]] + } + wk.Mixin = string(mixin[:]) +} + +var mixinKeyEncTab = [...]int{ + 46, 47, 18, 2, 53, 8, 23, 32, + 15, 50, 10, 31, 58, 3, 45, 35, + 27, 43, 5, 49, 33, 9, 42, 19, + 29, 28, 14, 39, 12, 38, 41, 13, + 37, 48, 7, 16, 24, 55, 40, 61, + 26, 17, 0, 1, 60, 51, 30, 4, + 22, 25, 54, 21, 56, 59, 6, 63, + 57, 62, 11, 36, 20, 34, 44, 52, +} + +func removeUnwantedChars(v url.Values, chars ...byte) url.Values { + b := []byte(v.Encode()) + for _, c := range chars { + b = bytes.ReplaceAll(b, []byte{c}, nil) + } + s, err := url.ParseQuery(string(b)) + if err != nil { + panic(err) + } + return s +} + +type Nav struct { + Code int `json:"code"` + Message string `json:"message"` + Ttl int `json:"ttl"` + Data struct { + WbiImg struct { + ImgUrl string `json:"img_url"` + SubUrl string `json:"sub_url"` + } `json:"wbi_img"` + + // ...... + } `json:"data"` +} +``` + +### CSharp + +无需依赖外部库 + +```cs +using System.Security.Cryptography; +using System.Text; +using System.Text.Json.Nodes; + +class Program +{ + private static HttpClient _httpClient = new(); + + private static readonly int[] MixinKeyEncTab = + { + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, + 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, + 57, 62, 11, 36, 20, 34, 44, 52 + }; + + //对 imgKey 和 subKey 进行字符顺序打乱编码 + private static string GetMixinKey(string orig) + { + return MixinKeyEncTab.Aggregate("", (s, i) => s + orig[i])[..32]; + } + + private static Dictionary EncWbi(Dictionary parameters, string imgKey, + string subKey) + { + string mixinKey = GetMixinKey(imgKey + subKey); + string currTime = DateTimeOffset.Now.ToUnixTimeSeconds().ToString(); + //添加 wts 字段 + parameters["wts"] = currTime; + // 按照 key 重排参数 + parameters = parameters.OrderBy(p => p.Key).ToDictionary(p => p.Key, p => p.Value); + //过滤 value 中的 "!'()*" 字符 + parameters = parameters.ToDictionary( + kvp => kvp.Key, + kvp => new string(kvp.Value.Where(chr => !"!'()*".Contains(chr)).ToArray()) + ); + // 序列化参数 + string query = new FormUrlEncodedContent(parameters).ReadAsStringAsync().Result; + //计算 w_rid + using MD5 md5 = MD5.Create(); + byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query + mixinKey)); + string wbiSign = BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); + parameters["w_rid"] = wbiSign; + + return parameters; + } + + // 获取最新的 img_key 和 sub_key + private static async Task<(string, string)> GetWbiKeys() + { + var httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"); + httpClient.DefaultRequestHeaders.Referrer = new Uri("https://www.bilibili.com/"); + + HttpResponseMessage responseMessage = await httpClient.SendAsync(new HttpRequestMessage + { + Method = HttpMethod.Get, + RequestUri = new Uri("https://api.bilibili.com/x/web-interface/nav"), + }); + + JsonNode response = JsonNode.Parse(await responseMessage.Content.ReadAsStringAsync())!; + + string imgUrl = (string)response["data"]!["wbi_img"]!["img_url"]!; + imgUrl = imgUrl.Split("/")[^1].Split(".")[0]; + + string subUrl = (string)response["data"]!["wbi_img"]!["sub_url"]!; + subUrl = subUrl.Split("/")[^1].Split(".")[0]; + return (imgUrl, subUrl); + } + + + public static async Task Main() + { + var (imgKey, subKey) = await GetWbiKeys(); + + Dictionary signedParams = EncWbi( + parameters: new Dictionary + { + { "foo", "114" }, + { "bar", "514" }, + { "baz", "1919810" } + }, + imgKey: imgKey, + subKey: subKey + ); + + string query = await new FormUrlEncodedContent(signedParams).ReadAsStringAsync(); + + Console.WriteLine(query); + } +} +``` +输出内容为进行 Wbi 签名的后参数的 url query 形式 + +``` +bar=514&baz=1919810&foo=114&wts=1687541921&w_rid=26e82b1b9b3a11dbb1807a9228a40d3b +``` + +### Java + +```java +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.*; +import java.util.stream.Collectors; + +public class WbiTest { + private static final int[] mixinKeyEncTab = new int[]{ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 + }; + + private static final char[] hexDigits = "0123456789abcdef".toCharArray(); + + public static String md5(String input) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8)); + char[] result = new char[messageDigest.length * 2]; + for (int i = 0; i < messageDigest.length; i++) { + result[i * 2] = hexDigits[(messageDigest[i] >> 4) & 0xF]; + result[i * 2 + 1] = hexDigits[messageDigest[i] & 0xF]; + } + return new String(result); + } catch (NoSuchAlgorithmException e) { + return null; + } + } + + public static String getMixinKey(String imgKey, String subKey) { + String s = imgKey + subKey; + StringBuilder key = new StringBuilder(); + for (int i = 0; i < 32; i++) + key.append(s.charAt(mixinKeyEncTab[i])); + return key.toString(); + } + + public static String encodeURIComponent(Object o) { + return URLEncoder.encode(o.toString(), StandardCharsets.UTF_8).replace("+", "%20"); + } + + public static void main(String[] args) { + String imgKey = "653657f524a547ac981ded72ea172057"; + String subKey = "6e4909c702f846728e64f6007736a338"; + String mixinKey = getMixinKey(imgKey, subKey); + System.out.println(mixinKey); // 72136226c6a73669787ee4fd02a74c27 + + // 用TreeMap自动排序 + TreeMap map = new TreeMap<>(); + map.put("foo", "one one four"); + map.put("bar", "五一四"); + map.put("baz", 1919810); + map.put("wts", System.currentTimeMillis() / 1000); + String param = map.entrySet().stream() + .map(it -> String.format("%s=%s", it.getKey(), encodeURIComponent(it.getValue()))) + .collect(Collectors.joining("&")); + String s = param + mixinKey; + + String wbiSign = md5(s); + System.out.println(wbiSign); + String finalParam = param + "&w_rid=" + wbiSign; + System.out.println(finalParam); + } +} +``` + +### Kotlin + +说明: 为了便于使用和缓存, 重新编写为实体类形式, 并拆分了多个文件. 使用官方的JSON序列化. (可以根据需要换成其他的) + +WbiParams.kt + +```kotlin +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.jsonPrimitive + +private fun JsonElement?.get(): String { + check(this != null) { "No contents found" } + return this.jsonPrimitive.content.split('/').last().removeSuffix(".png") +} + +private val mixinKeyEncTab = intArrayOf( + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 +) + +@Serializable +data class WbiParams( + val imgKey: String, + val subKey: String, +) { + // 此处整合了切分参数(直接传入{img_url:string, sub_url:string}即可), 不需要可以删掉 + constructor(wbiImg: JsonObject) : this(wbiImg["img_url"].get(), wbiImg["sub_url"].get()) + + private val mixinKey: String + get() = (imgKey + subKey).let { s -> + buildString { + repeat(32) { + append(s[mixinKeyEncTab[it]]) + } + } + } + + // 创建对象(GET获取或者读缓存, 比如Redis)之后, 直接调用此函数处理 + fun enc(params: Map): String { + val sorted = params.filterValues { it != null }.toSortedMap() + return buildString { + append(sorted.toQueryString()) + val wts = System.currentTimeMillis() / 1000 + sorted["wts"] = wts + append("&wts=") + append(wts) + append("&w_rid=") + append((sorted.toQueryString() + mixinKey).toMD5()) + } + } +} +``` + +Extensions.kt + +```kotlin +import java.security.MessageDigest + +private val hexDigits = "0123456789abcdef".toCharArray() + +fun ByteArray.toHexString() = buildString(this.size shl 1) { + this@toHexString.forEach { byte -> + append(hexDigits[byte.toInt() ushr 4 and 15]) + append(hexDigits[byte.toInt() and 15]) + } +} + +fun String.toMD5(): String { + val md = MessageDigest.getInstance("MD5") + val digest = md.digest(this.toByteArray()) + return digest.toHexString() +} + +fun Map.toQueryString() = this.filterValues { it != null }.entries.joinToString("&") { (k, v) -> + "${k.encodeURIComponent()}=${v!!.encodeURIComponent()}" +} +``` + +获取和使用案例略 + +### PHP + +来自[SocialSisterYi/bilibili-API-collect#813](https://github.com/SocialSisterYi/bilibili-API-collect/issues/813) + +```php +getWbiKeys(); + return $this->encWbi($query, $wbi_keys['img_key'], $wbi_keys['sub_key']); + } + + private function getMixinKey($orig) { + $t = ''; + foreach ($this->mixinKeyEncTab as $n) $t .= $orig[$n]; + return substr($t, 0, 32); + } + + private function encWbi($params, $img_key, $sub_key) { + $mixin_key = $this->getMixinKey($img_key . $sub_key); + $curr_time = time(); + $chr_filter = "/[!'()*]/"; + + $query = []; + $params['wts'] = $curr_time; + + ksort($params); + + foreach ($params as $key => $value) { + $value = preg_replace($chr_filter, '', $value); + $query[] = urlencode($key) . '=' . urlencode($value); + } + + $query = implode('&', $query); + $wbi_sign = md5($query . $mixin_key); + + return $query . '&w_rid=' . $wbi_sign; + } + + private function getWbiKeys() { + $resp = @json_decode( + $this->curl_get( + 'https://api.bilibili.com/x/web-interface/nav', + null, + 'https://www.bilibili.com/' + ), true + ); + + if (!$resp) throw new Exception('请求失败'); + + $img_url = $resp['data']['wbi_img']['img_url']; + $sub_url = $resp['data']['wbi_img']['sub_url']; + + return [ + 'img_key' => substr(basename($img_url), 0, strpos(basename($img_url), '.')), + 'sub_key' => substr(basename($sub_url), 0, strpos(basename($sub_url), '.')) + ]; + } + + private function curl_get($url, $cookies = null, $referer = 'https://www.bilibili.com/', $ua = null, $proxy = null, $header = []) { + $ch = curl_init(); + $header[] = "Accept: */*"; + $header[] = "Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7"; + $header[] = "Connection: close"; + $header[]="Referer:https://www.bilibili.com/"; + $header[] = "Cache-Control: max-age=0"; + curl_setopt_array($ch, [ + CURLOPT_HTTPGET => 1, + CURLOPT_CUSTOMREQUEST => 'GET', + CURLOPT_RETURNTRANSFER => 1, + CURLOPT_HTTPHEADER => $header, + CURLOPT_ENCODING => '', + CURLOPT_URL => $url, + CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.39', + CURLOPT_TIMEOUT => 15 + ]); + + if ($cookies) curl_setopt( + $ch, + CURLOPT_COOKIE, + $cookies + ); + + if ($referer) curl_setopt_array($ch, [ + CURLOPT_AUTOREFERER => $referer, + CURLOPT_REFERER => $referer + ]); + + $content = curl_exec($ch); + curl_close($ch); + return $content; + } +} + +$c = new Bilibili(); +echo $c->reQuery(['foo' => '114', 'bar' => '514', 'baz' => 1919810]); +// bar=514&baz=1919810&foo=114&wts=1700384803&w_rid=4614cb98d60a43e50c3a3033fe3d116b +``` + +### Rust + +需要 serde、serde_json、reqwest、tokio 以及 md5 + +```rust +use reqwest::header::USER_AGENT; +use serde::Deserialize; +use std::time::{SystemTime, UNIX_EPOCH}; + +const MIXIN_KEY_ENC_TAB: [usize; 64] = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, + 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, + 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52, +]; + +#[derive(Deserialize)] +struct WbiImg { + img_url: String, + sub_url: String, +} + +#[derive(Deserialize)] +struct Data { + wbi_img: WbiImg, +} + +#[derive(Deserialize)] +struct ResWbi { + data: Data, +} + +// 对 imgKey 和 subKey 进行字符顺序打乱编码 +fn get_mixin_key(orig: &[u8]) -> String { + MIXIN_KEY_ENC_TAB + .iter() + .take(32) + .map(|&i| orig[i] as char) + .collect::() +} + +fn get_url_encoded(s: &str) -> String { + s.chars() + .filter_map(|c| match c.is_ascii_alphanumeric() || "-_.~".contains(c) { + true => Some(c.to_string()), + false => { + // 过滤 value 中的 "!'()*" 字符 + if "!'()*".contains(c) { + return None; + } + let encoded = c + .encode_utf8(&mut [0; 4]) + .bytes() + .fold("".to_string(), |acc, b| acc + &format!("%{:02X}", b)); + Some(encoded) + } + }) + .collect::() +} + +// 为请求参数进行 wbi 签名 +fn encode_wbi(params: Vec<(&str, String)>, (img_key, sub_key): (String, String)) -> String { + let cur_time = match SystemTime::now().duration_since(UNIX_EPOCH) { + Ok(t) => t.as_secs(), + Err(_) => panic!("SystemTime before UNIX EPOCH!"), + }; + _encode_wbi(params, (img_key, sub_key), cur_time) +} + +fn _encode_wbi( + mut params: Vec<(&str, String)>, + (img_key, sub_key): (String, String), + timestamp: u64, +) -> String { + let mixin_key = get_mixin_key((img_key + &sub_key).as_bytes()); + // 添加当前时间戳 + params.push(("wts", timestamp.to_string())); + // 重新排序 + params.sort_by(|a, b| a.0.cmp(b.0)); + // 拼接参数 + let query = params + .iter() + .map(|(k, v)| format!("{}={}", get_url_encoded(k), get_url_encoded(v))) + .collect::>() + .join("&"); + // 计算签名 + let web_sign = format!("{:?}", md5::compute(query.clone() + &mixin_key)); + // 返回最终的 query + query + &format!("&w_rid={}", web_sign) +} + +async fn get_wbi_keys() -> Result<(String, String), reqwest::Error> { + let client = reqwest::Client::new(); + let ResWbi { data:Data{wbi_img} } = client + .get("https://api.bilibili.com/x/web-interface/nav") + .header(USER_AGENT,"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36") + .header("Referer","https://www.bilibili.com/") + // SESSDATA=xxxxx + .header("Cookie", "SESSDATA=xxxxx") + .send() + .await? + .json::() + .await?; + Ok(( + take_filename(wbi_img.img_url).unwrap(), + take_filename(wbi_img.sub_url).unwrap(), + )) +} + +fn take_filename(url: String) -> Option { + url.rsplit_once('/') + .and_then(|(_, s)| s.rsplit_once('.')) + .map(|(s, _)| s.to_string()) +} + +#[tokio::main] +async fn main() { + let keys = get_wbi_keys().await.unwrap(); + let params = vec![ + ("foo", String::from("114")), + ("bar", String::from("514")), + ("baz", String::from("1919810")), + ]; + let query = encode_wbi(params, keys); + println!("{}", query); +} + +// 取自文档描述的测试用例 +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_filename() { + assert_eq!( + take_filename( + "https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png".to_string() + ), + Some("7cd084941338484aae1ad9425b84077c".to_string()) + ); + } + + #[test] + fn test_get_mixin_key() { + let concat_key = + "7cd084941338484aae1ad9425b84077c".to_string() + "4932caff0ff746eab6f01bf08b70ac45"; + assert_eq!( + get_mixin_key(concat_key.as_bytes()), + "ea1db124af3c7062474693fa704f4ff8" + ); + } + + #[test] + fn test_encode_wbi() { + let params = vec![ + ("foo", String::from("114")), + ("bar", String::from("514")), + ("zab", String::from("1919810")), + ]; + assert_eq!( + _encode_wbi( + params, + ( + "7cd084941338484aae1ad9425b84077c".to_string(), + "4932caff0ff746eab6f01bf08b70ac45".to_string() + ), + 1702204169 + ), + "bar=514&foo=114&wts=1702204169&zab=1919810&w_rid=8f6f2b5b3d485fe1886cec6a0be8c5d4" + .to_string() + ) + } +} +``` + +### Swift + +需要 [Alamofire](https://github.com/Alamofire/Alamofire) 和 [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON) 库 + +```swift +import Alamofire +import CommonCrypto +import Foundation +import SwiftyJSON + +func biliWbiSign(param: String, completion: @escaping (String?) -> Void) { + func getMixinKey(orig: String) -> String { + return String(mixinKeyEncTab.map { orig[orig.index(orig.startIndex, offsetBy: $0)] }.prefix(32)) + } + + func encWbi(params: [String: Any], imgKey: String, subKey: String) -> [String: Any] { + var params = params + let mixinKey = getMixinKey(orig: imgKey + subKey) + let currTime = round(Date().timeIntervalSince1970) + params["wts"] = currTime + params = params.sorted { $0.key < $1.key }.reduce(into: [:]) { $0[$1.key] = $1.value } + params = params.mapValues { value in + if let doubleValue = value as? Double, doubleValue.truncatingRemainder(dividingBy: 1) == 0 { + return String(Int(doubleValue)).filter { !"!'()*".contains($0) } + } + return String(describing: value).filter { !"!'()*".contains($0) } + } + let query = params.map { "\($0.key)=\($0.value)" }.joined(separator: "&") + let wbiSign = calculateMD5(string: query + mixinKey) + params["w_rid"] = wbiSign + return params + } + + func getWbiKeys(completion: @escaping (Result<(imgKey: String, subKey: String), Error>) -> Void) { + let headers: HTTPHeaders = [ + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "Referer": "https://www.bilibili.com/" + ] + + AF.request("https://api.bilibili.com/x/web-interface/nav", headers: headers).responseJSON { response in + switch response.result { + case .success(let value): + let json = JSON(value) + let imgURL = json["data"]["wbi_img"]["img_url"].string ?? "" + let subURL = json["data"]["wbi_img"]["sub_url"].string ?? "" + let imgKey = imgURL.components(separatedBy: "/").last?.components(separatedBy: ".").first ?? "" + let subKey = subURL.components(separatedBy: "/").last?.components(separatedBy: ".").first ?? "" + completion(.success((imgKey, subKey))) + case .failure(let error): + completion(.failure(error)) + } + } + } + + func calculateMD5(string: String) -> String { + let data = Data(string.utf8) + var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) + _ = data.withUnsafeBytes { + CC_MD5($0.baseAddress, CC_LONG(data.count), &digest) + } + return digest.map { String(format: "%02hhx", $0) }.joined() + } + + let mixinKeyEncTab = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 + ] + + getWbiKeys { result in + switch result { + case .success(let keys): + let spdParam = param.components(separatedBy: "&") + var spdDicParam = [String: String]() + for pair in spdParam { + let components = pair.components(separatedBy: "=") + if components.count == 2 { + spdDicParam[components[0]] = components[1] + } + } + + let signedParams = encWbi(params: spdDicParam, imgKey: keys.imgKey, subKey: keys.subKey) + let query = signedParams.map { "\($0.key)=\($0.value)" }.joined(separator: "&") + completion(query) + case .failure(let error): + print("Error getting keys: \(error)") + completion(nil) + } + } +} + +// 使用示例 +biliWbiSign(param: "bar=514&foo=114&zab=1919810") { + signedQuery in + if let signedQuery = signedQuery { + print("签名后的参数: \(signedQuery)") + } else { + print("签名失败") + } +} + +RunLoop.main.run()//程序类型为命令行程序时需要添加这行代码 + +``` + +```text +签名后的参数: bar=514&wts=1741082093&foo=114&zab=1919810&w_rid=04775bb3debbb45bab86a93a1c08d12a +``` + + +### CPlusPlus + +需要 c++ 23 标准库,[cpr](https://github.com/libcpr/cpr)、[cryptopp](https://github.com/weidai11/cryptopp)、[nlohmann/json](https://github.com/nlohmann/json) 等依赖 + +```c++ +#include // std::array +#include // std::locale +#include // std::println + +/// thrid party libraries +#include +#include +#include +#include + +/* + * 注意,假定不会发生错误! + */ +class Wbi { + constexpr static std::array MIXIN_KEY_ENC_TAB_ = { + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, + 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, + 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, + 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52 + }; + + /* 获取 md5 hex(lower) */ + static std::string Get_md5_hex(const std::string &Input_str) { + CryptoPP::Weak1::MD5 hash; + std::string md5_hex; + + CryptoPP::StringSource ss(Input_str, true, + new CryptoPP::HashFilter(hash, + new CryptoPP::HexEncoder( + new CryptoPP::StringSink(md5_hex) + ) + ) + ); + + std::ranges::for_each(md5_hex, [](char &x) { x = std::tolower(x); }); + return md5_hex; + } + +public: + /* 将 json 转换为 url 编码字符串 */ + static std::string Json_to_url_encode_str(const nlohmann::json &Json) { + std::string encode_str; + for (const auto &[key, value]: Json.items()) { + encode_str.append(key).append("=").append(cpr::util::urlEncode(value.is_string() ? value.get() : to_string(value))).append("&"); + } + + // remove the last '&' + encode_str.resize(encode_str.size() - 1, '\0'); + return encode_str; + } + + /* 获取 wbi key */ + static std::pair Get_wbi_key() { + const auto url = cpr::Url {"https://api.bilibili.com/x/web-interface/nav"}; + const auto cookie = cpr::Cookies { + {"SESSDATA", "xxxxxxxxxxxx"}, + }; + const auto header = cpr::Header { + {"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}, + {"Referer", "https://www.bilibili.com/"}, + }; + const auto response = cpr::Get(url, cookie, header); + + nlohmann::json json = nlohmann::json::parse(response.text); + + const std::string img_url = json["data"]["wbi_img"]["img_url"]; + const std::string sub_url = json["data"]["wbi_img"]["sub_url"]; + + std::string img_key = img_url.substr(img_url.find("wbi/") + 4, img_url.find(".png") - img_url.find("wbi/") - 4); + std::string sub_key = sub_url.substr(sub_url.find("wbi/") + 4, sub_url.find(".png") - sub_url.find("wbi/") - 4); + return {img_key, sub_key}; + } + + /* 获取 mixin key */ + static std::string Get_mixin_key(const std::string &Img_key, const std::string &Sub_key) { + std::string raw_wbi_key_str = Img_key + Sub_key; + std::string result; + + std::ranges::for_each(MIXIN_KEY_ENC_TAB_, [&result, &raw_wbi_key_str](const uint8_t x) { + result.push_back(raw_wbi_key_str.at(x)); + }); + + return result.substr(0, 32); + } + + /* 计算签名(w_rid) */ + static std::string Calc_sign(nlohmann::json &Params, const std::string &Mixin_key) { + Params["wts"] = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + + const std::string encode_str = Json_to_url_encode_str(Params).append(Mixin_key); + return Get_md5_hex(encode_str); + } +}; + + +int main() { + nlohmann::json Params; + // qn=32&fnver=0&fnval=4048&fourk=1&avid=1755630705&cid=1574294582 + Params["qn"] = 32; + Params["fnver"] = 0; + Params["fnval"] = 4048; + Params["fourk"] = 1; + Params["avid"] = 1755630705; + Params["cid"] = 1574294582; + + auto [img_key, sub_key] = Wbi::Get_wbi_key(); + const auto mixin_key = Wbi::Get_mixin_key(img_key, sub_key); + const auto w_rid = Wbi::Calc_sign(Params, mixin_key); + std::println("{}", Wbi::Json_to_url_encode_str(Params) + "&w_rid=" + w_rid); +} +``` + +```text +avid=1755630705&cid=1574294582&fnval=4048&fnver=0&fourk=1&qn=32&wts=1717922933&w_rid=43571b838a1611fa121189083cfc1784 +``` + +### Haskell + +无第三方依赖: `base`, `Cabal-syntax`, `bytestring`, `containers`
+注: 此处使用自写的 URI 编码模块, 实际可用别的第三方库替代 + +`Main.hs`: +```hs +module Main (wbi, main) where + +import Data.ByteString.Char8 (pack) +import qualified Data.Map.Strict as Map +import Distribution.Utils.MD5 (md5, showMD5) +import URIEncoder (encodeURIComponent) +import Data.Time.Clock.System (getSystemTime, systemSeconds) + +mixinKeyEncTab :: [Int] +mixinKeyEncTab = [ + 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, + 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, + 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, + 36, 20, 34, 44, 52 + ] + +getMixinKey :: String -> String -> String +getMixinKey imgKey subKey = + let s = imgKey ++ subKey + in map (\i -> s !! (mixinKeyEncTab !! i)) [0..31] + +join :: [String] -> String -> String +join arr ins = concatMap (++ ins) (init arr) ++ last arr + +wbi :: String -> String -> Integer -> Map.Map String String -> String +wbi imgKey subKey wts params = + let orig = join (map (\(k, v) -> encodeURIComponent k ++ "=" ++ encodeURIComponent v) (Map.toList $ Map.insert "wts" (show wts) params)) "&" + in orig ++ "&w_rid=" ++ showMD5 (md5 $ pack $ orig ++ getMixinKey imgKey subKey) + +main :: IO () +main = do -- hard encode for test + let params1 = Map.fromList [("aid", "2")] + params2 = Map.fromList [("foo", "114") + ,("bar", "514") + ,("hello", "世 界") + ] + imgKey = "7cd084941338484aae1ad9425b84077c" + subKey = "4932caff0ff746eab6f01bf08b70ac45" + wts1 <- getSystemTime + putStrLn $ wbi imgKey subKey (toInteger $ systemSeconds wts1) params1 + wts2 <- getSystemTime + putStrLn $ wbi imgKey subKey (toInteger $ systemSeconds wts2) params2 +``` + +`URIEncoder.hs`: +```hs +module URIEncoder (encodeURIComponent) where + +import Data.Char (ord, chr, intToDigit) +import Data.Bits (shiftL, shiftR, (.&.)) +import Data.List (isInfixOf) + +-- ES 19.2.6.4 encodeURIComponent ( uriComponent ) +encodeURIComponent :: String -> String +encodeURIComponent input = case encode input "" of + Right result -> result + Left err -> error err + +-- ES 19.2.6.5 Encode ( string, extraUnescaped ) +encode :: String -> String -> Either String String +encode string extraUnescaped = loop 0 string + where + alwaysUnescaped = ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9'] ++ "-.!~*'()" + unescapedSet = alwaysUnescaped ++ extraUnescaped + + loop k str + | k >= length str = Right [] + | otherwise = case codePointAt str k of + (Nothing, _) -> Left "Unpaired surrogate" + (Just (cp, _), newK) -> + if [str !! k] `isInfixOf` unescapedSet + then (str !! k :) <$> loop (k + 1) str + else do + bytes <- utf8Encode cp + let escaped = concatMap percentEncode bytes + rest <- loop newK str + Right (escaped ++ rest) + +codePointAt :: String -> Int -> (Maybe (Int, Int), Int) +codePointAt s k + | k >= length s = (Nothing, k) + | otherwise = + let c1 = ord (s !! k) + in if 0xD800 <= c1 && c1 <= 0xDBFF && k+1 < length s + then let c2 = ord (s !! (k+1)) + in if 0xDC00 <= c2 && c2 <= 0xDFFF + then ( Just (0x10000 + ((c1 - 0xD800) `shiftL` 10) + (c2 - 0xDC00), 2) + , k + 2 ) + else (Just (c1, 1), k + 1) + else (Just (c1, 1), k + 1) + +utf8Encode :: Int -> Either String [Int] +utf8Encode cp + | cp < 0 = Left "Invalid code point" + | cp <= 0x007F = Right [cp] + | cp <= 0x07FF = Right + [ 0xC0 + (cp `shiftR` 6) + , 0x80 + (cp .&. 0x3F) ] + | cp <= 0xFFFF = Right + [ 0xE0 + (cp `shiftR` 12) + , 0x80 + ((cp `shiftR` 6) .&. 0x3F) + , 0x80 + (cp .&. 0x3F) ] + | cp <= 0x10FFFF = Right + [ 0xF0 + (cp `shiftR` 18) + , 0x80 + ((cp `shiftR` 12) .&. 0x3F) + , 0x80 + ((cp `shiftR` 6) .&. 0x3F) + , 0x80 + (cp .&. 0x3F) ] + | otherwise = Left "Code point out of range" + +percentEncode :: Int -> String +percentEncode byte = '%' : toHex byte + where + toHex n = [hexDigit (n `div` 16), hexDigit (n `mod` 16)] + hexDigit x + | x < 10 = intToDigit x + | otherwise = chr (x - 10 + ord 'A') +``` + +输出: +```text +aid=2&wts=1744823207&w_rid=a3cd246bd42c066932752b24694eaf0d +bar=514&foo=114&hello=%E4%B8%96%20%E7%95%8C&wts=1744823207&w_rid=93acf59d85f74453e40cea00056c3daf +``` diff --git a/docs/misc/time_stamp.md b/docs/misc/time_stamp.md new file mode 100644 index 0000000..58e0709 --- /dev/null +++ b/docs/misc/time_stamp.md @@ -0,0 +1,127 @@ +# 获取当前时间戳 + +## 获取当前时间戳 + +> https://api.bilibili.com/x/report/click/now +> https://api.bilibili.com/x/click-interface/click/now + +*请求方式:GET* + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------ | ---- | +| now | num | 当前的时间戳 | | + +**示例:** + +```shell +curl 'https://api.bilibili.com/x/report/click/now' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "now": 1592666471 + } +} +``` + +
+ +## 获取适用于 RTC 的时间戳 + +> https://api.live.bilibili.com/xlive/open-interface/v1/rtc/getTimestamp + +*请求方法: GET* + + + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | - | - | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | - | - | +| timestamp | num | 服务器端UTC时间戳 | | +| microtime | num | 服务器端UTC时间戳 (毫秒) | | + +**示例:** + +```shell +curl 'https://api.live.bilibili.com/xlive/open-interface/v1/rtc/getTimestamp' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "timestamp": 1723899823, + "microtime": 1723899823683 + } +} +``` + +
+ +## 获取服务器端UTC时间 + +> https://interface.bilibili.com/serverdate.js + +*请求方式:GET* + +**js回复:** + +```js +window.serverdate = Date.UTC(YYYY, M, D, h, m, s); +``` + +**示例:** + +```shell +curl 'https://interface.bilibili.com/serverdate.js' +``` + +
+查看响应示例: + +```js +window.serverdate = Date.UTC(2021, 4, 16, 17, 31, 8); +``` + +
diff --git a/newbie_exam/action.md b/docs/newbie_exam/action.md similarity index 93% rename from newbie_exam/action.md rename to docs/newbie_exam/action.md index 04fb863..d75967a 100644 --- a/newbie_exam/action.md +++ b/docs/newbie_exam/action.md @@ -1,21 +1,10 @@ # 操作 -- [提交答题](#提交答题) - - [提交基础题](#提交基础题) - - [提交附加题](#提交附加题) - - [提交自选题](#提交自选题) -- [获取验证码](#获取验证码) -- [提交验证码](#提交验证码) -- [提交自选题分类](#提交自选题分类) -- [提前交卷](#提前交卷) - ---- - ## 提交答题 ### 提交基础题 -> http://api.bilibili.com/x/answer/v4/base/check +> https://api.bilibili.com/x/answer/v4/base/check *请求方式:POST* @@ -51,7 +40,7 @@ 提交题目id为`104`的题,选项hash为`cb4c8cc9424fc771f7c1598e74de498f` ```shell -curl 'http://api.bilibili.com/x/answer/v4/base/check' \ +curl 'https://api.bilibili.com/x/answer/v4/base/check' \ --data-urlencode 'question_id=104' \ --data-urlencode 'ans_hash=cb4c8cc9424fc771f7c1598e74de498f' \ --data-urlencode 'csrf=xxxx' \ @@ -76,7 +65,7 @@ curl 'http://api.bilibili.com/x/answer/v4/base/check' \ ### 提交附加题 -> http://api.bilibili.com/x/answer/v4/base/check +> https://api.bilibili.com/x/answer/v4/base/check *请求方式:POST* @@ -112,7 +101,7 @@ curl 'http://api.bilibili.com/x/answer/v4/base/check' \ 提交题目id为`104`的题,选项hash为`cb4c8cc9424fc771f7c1598e74de498f` ```shell -curl 'http://api.bilibili.com/x/answer/v4/base/check' \ +curl 'https://api.bilibili.com/x/answer/v4/base/check' \ --data-urlencode 'question_id=104' \ --data-urlencode 'ans_hash=cb4c8cc9424fc771f7c1598e74de498f' \ --data-urlencode 'csrf=xxxx' \ @@ -137,7 +126,7 @@ curl 'http://api.bilibili.com/x/answer/v4/base/check' \ ### 提交自选题 -> http://api.bilibili.com/x/answer/v4/pro/check +> https://api.bilibili.com/x/answer/v4/pro/check *请求方式:POST* @@ -173,7 +162,7 @@ curl 'http://api.bilibili.com/x/answer/v4/base/check' \ 提交题目id为`2935`的题,选项hash为`ffd55cbe0624f466bee2ea3eb576a4d0` ```shell -curl -G 'http://api.bilibili.com/x/answer/v4/pro/check' \ +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' \ @@ -198,7 +187,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro/check' \ ## 获取验证码 -> http://api.bilibili.com/x/answer/v4/captcha +> https://api.bilibili.com/x/answer/v4/captcha *请求方式:GET* @@ -228,7 +217,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro/check' \ **示例:** ```shell -curl 'http://api.bilibili.com/x/answer/v4/captcha' \ +curl 'https://api.bilibili.com/x/answer/v4/captcha' \ -b 'SESSDATA=xxxx' ``` @@ -254,7 +243,7 @@ curl 'http://api.bilibili.com/x/answer/v4/captcha' \ ## 提交验证码 -> http://api.bilibili.com/x/answer/v4/captcha/check +> https://api.bilibili.com/x/answer/v4/captcha/check *请求方式:POST* @@ -292,7 +281,7 @@ curl 'http://api.bilibili.com/x/answer/v4/captcha' \ **示例:** ```shell -curl 'http://api.bilibili.com/x/answer/v4/captcha/check' \ +curl 'https://api.bilibili.com/x/answer/v4/captcha/check' \ --data-urlencode 'types=' \ --data-urlencode 'type=geetest' \ --data-urlencode 'bilibili_token=' \ @@ -319,7 +308,7 @@ curl 'http://api.bilibili.com/x/answer/v4/captcha/check' \ ## 提交自选题分类 -> http://api.bilibili.com/x/answer/v4/pro/type/check +> https://api.bilibili.com/x/answer/v4/pro/type/check *请求方式:POST* @@ -347,7 +336,7 @@ curl 'http://api.bilibili.com/x/answer/v4/captcha/check' \ 选择`游戏` `影视` `科教/知识` `动画/动漫`分类 ```shell -curl 'http://api.bilibili.com/x/answer/v4/pro/type/check' \ +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' @@ -368,7 +357,7 @@ curl 'http://api.bilibili.com/x/answer/v4/pro/type/check' \ ## 提前交卷 -> http://api.bilibili.com/x/answer/v4/submit +> https://api.bilibili.com/x/answer/v4/submit *请求方式:POST* @@ -418,7 +407,7 @@ curl 'http://api.bilibili.com/x/answer/v4/pro/type/check' \ **示例:** ```shell -curl 'http://api.bilibili.com/x/answer/v4/submit' \ +curl 'https://api.bilibili.com/x/answer/v4/submit' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxxx' ``` diff --git a/newbie_exam/fetch.md b/docs/newbie_exam/fetch.md similarity index 95% rename from newbie_exam/fetch.md rename to docs/newbie_exam/fetch.md index 91b58f6..f5fbd74 100644 --- a/newbie_exam/fetch.md +++ b/docs/newbie_exam/fetch.md @@ -1,14 +1,8 @@ # 拉取题目 -- [拉取基础题](#拉取基础题) -- [拉取附加题](#拉取附加题) -- [拉取自选题](#拉取自选题) - ---- - ## 拉取基础题 -> http://api.bilibili.com/x/answer/v4/base +> https://api.bilibili.com/x/answer/v4/base *请求方式:GET* @@ -67,7 +61,7 @@ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/answer/v4/base' \ +curl -G 'https://api.bilibili.com/x/answer/v4/base' \ -b 'SESSDATA=xxx' ``` @@ -112,7 +106,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/base' \ ## 拉取附加题 -> http://api.bilibili.com/x/answer/v4/extra +> https://api.bilibili.com/x/answer/v4/extra *请求方式:GET* @@ -136,7 +130,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/base' \ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/answer/v4/extra' \ +curl -G 'https://api.bilibili.com/x/answer/v4/extra' \ -b 'SESSDATA=xxx' ``` @@ -181,7 +175,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/extra' \ ## 拉取自选题 -> http://api.bilibili.com/x/answer/v4/pro +> https://api.bilibili.com/x/answer/v4/pro *请求方式:GET* @@ -205,7 +199,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/extra' \ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/answer/v4/pro' \ +curl -G 'https://api.bilibili.com/x/answer/v4/pro' \ -b 'SESSDATA=xxx' ``` diff --git a/newbie_exam/info.md b/docs/newbie_exam/info.md similarity index 97% rename from newbie_exam/info.md rename to docs/newbie_exam/info.md index 10f2c38..b200aa4 100644 --- a/newbie_exam/info.md +++ b/docs/newbie_exam/info.md @@ -1,14 +1,8 @@ # 查询信息 -- [查询答题状态](#查询答题状态) -- [查询自选题分类](#查询自选题分类) -- [查询答题结果](#查询答题结果) - ---- - ## 查询答题状态 -> http://api.bilibili.com/x/answer/v4/status +> https://api.bilibili.com/x/answer/v4/status *请求方式:GET* @@ -48,7 +42,7 @@ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/answer/v4/status' \ +curl -G 'https://api.bilibili.com/x/answer/v4/status' \ -b 'SESSDATA=xxx' ``` @@ -85,7 +79,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/status' \ ## 查询自选题分类 -> http://api.bilibili.com/x/answer/v4/pro/type +> https://api.bilibili.com/x/answer/v4/pro/type *请求方式:GET* @@ -136,7 +130,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/status' \ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/answer/v4/pro/type' \ +curl -G 'https://api.bilibili.com/x/answer/v4/pro/type' \ -b 'SESSDATA=xxx' ``` @@ -403,7 +397,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro/type' \ ## 查询答题结果 -> http://api.bilibili.com/x/answer/v4/result +> https://api.bilibili.com/x/answer/v4/result *请求方式:GET* @@ -455,7 +449,7 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro/type' \ **示例:** ```shell -curl -G 'http://api.bilibili.com/x/answer/v4/result' \ +curl -G 'https://api.bilibili.com/x/answer/v4/result' \ --data-urlencode 'hid=1615088061307609' \ -b 'SESSDATA=xxx' ``` diff --git a/note/action.md b/docs/note/action.md similarity index 95% rename from note/action.md rename to docs/note/action.md index f8bdb84..15c40e9 100644 --- a/note/action.md +++ b/docs/note/action.md @@ -1,13 +1,8 @@ # 笔记操作 -- [保存视频笔记](#保存视频笔记) -- [删除视频笔记](#删除视频笔记) - ---- - ## 保存视频笔记 -> http://api.bilibili.com/x/note/add +> https://api.bilibili.com/x/note/add *请求方式:POST* @@ -54,7 +49,7 @@ 保存内容为加粗的STRONG的笔记`3809605586518023`于`av970322090` ```shell -curl 'http://api.bilibili.com/x/note/add' \ +curl 'https://api.bilibili.com/x/note/add' \ --data-urlencode 'oid=970322090' \ --data-urlencode 'oid_type=0' \ --data-urlencode 'note_id=3809605586518023' @@ -86,7 +81,7 @@ curl 'http://api.bilibili.com/x/note/add' \ ## 删除视频笔记 -> http://api.bilibili.com/x/note/del +> https://api.bilibili.com/x/note/del *请求方式:POST* @@ -115,7 +110,7 @@ curl 'http://api.bilibili.com/x/note/add' \ 删除稿件`av457253380`下的笔记`4075968478576647` ```shell -curl 'http://api.bilibili.com/x/note/del' \ +curl 'https://api.bilibili.com/x/note/del' \ --data-urlencode 'oid=457253380' \ --data-urlencode 'note_id=4075968478576647' \ --data-urlencode 'csrf=xxx' @@ -124,6 +119,7 @@ curl 'http://api.bilibili.com/x/note/del' \
查看响应示例: + ```json { "code": 0, diff --git a/note/info.md b/docs/note/info.md similarity index 97% rename from note/info.md rename to docs/note/info.md index 962db9d..5793ee3 100644 --- a/note/info.md +++ b/docs/note/info.md @@ -1,14 +1,8 @@ # 笔记详细信息 -- [查询该稿件是否禁止笔记](#查询该稿件是否禁止笔记) -- [查询私有笔记内容](#查询私有笔记内容) -- [查询公开笔记内容](#查询公开笔记内容) - ---- - ## 查询该稿件是否禁止笔记 -> http://api.bilibili.com/x/note/is_forbid +> https://api.bilibili.com/x/note/is_forbid *请求方式:GET* @@ -40,12 +34,13 @@ 查询视频稿件`av338677252`是否禁止笔记 ```shell -curl 'http://api.bilibili.com/x/note/info' \ +curl 'https://api.bilibili.com/x/note/info' \ --data-urlencode 'aid=338677252' ```
查看响应示例: + ```json { "code": 0, @@ -61,7 +56,7 @@ curl 'http://api.bilibili.com/x/note/info' \ ## 查询私有笔记内容 -> http://api.bilibili.com/x/note/info +> https://api.bilibili.com/x/note/info *请求方式:GET* @@ -136,7 +131,7 @@ curl 'http://api.bilibili.com/x/note/info' \ 查询视频`av338677252`中笔记`24508729145690112`的内容 ```shell -curl 'http://api.bilibili.com/x/note/info' \ +curl 'https://api.bilibili.com/x/note/info' \ --data-urlencode 'oid=338677252' \ --data-urlencode 'oid_type=0' \ --data-urlencode 'note_id=24508729145690112' \ @@ -178,7 +173,7 @@ curl 'http://api.bilibili.com/x/note/info' \ ## 查询公开笔记内容 -> http://api.bilibili.com/x/note/publish/info +> https://api.bilibili.com/x/note/publish/info *请求方式:GET* @@ -242,7 +237,7 @@ curl 'http://api.bilibili.com/x/note/info' \ 查看公开笔记`cv15160286`的信息 ```shell -curl 'http://api.bilibili.com/x/note/publish/info' \ +curl 'https://api.bilibili.com/x/note/publish/info' \ --data-urlencode 'cvid=15160286' ``` @@ -311,4 +306,4 @@ curl 'http://api.bilibili.com/x/note/publish/info' \ } ``` -
\ No newline at end of file +
diff --git a/note/list.md b/docs/note/list.md similarity index 97% rename from note/list.md rename to docs/note/list.md index a42a666..d0d3851 100644 --- a/note/list.md +++ b/docs/note/list.md @@ -1,15 +1,8 @@ # 笔记列表 -- [查询稿件私有笔记](#查询稿件私有笔记) -- [查询用户私有笔记](#查询用户私有笔记) -- [查询稿件公开笔记](#查询稿件公开笔记) -- [查询用户公开笔记](#查询用户公开笔记) - ---- - ## 查询稿件私有笔记 -> http://api.bilibili.com/x/note/list/archive +> https://api.bilibili.com/x/note/list/archive *请求方式:GET* @@ -53,7 +46,7 @@ 查询视频`av970322090`的笔记id ```shell -curl 'http://api.bilibili.com/x/note/list/archive' \ +curl 'https://api.bilibili.com/x/note/list/archive' \ --data-urlencode 'oid=970322090' \ --data-urlencode 'oid_type=0' \ -b 'SESSDATA=xxx' @@ -79,7 +72,7 @@ curl 'http://api.bilibili.com/x/note/list/archive' \ ## 查询用户私有笔记 -> http://api.bilibili.com/x/note/list +> https://api.bilibili.com/x/note/list *请求方式:GET* @@ -159,7 +152,7 @@ curl 'http://api.bilibili.com/x/note/list/archive' \ **示例:** ```shell -curl 'http://api.bilibili.com/x/note/list' \ +curl 'https://api.bilibili.com/x/note/list' \ --data-urlencode 'ps=10' \ --data-urlencode 'pn=1' -b 'SESSDATA=xxx' @@ -211,7 +204,7 @@ curl 'http://api.bilibili.com/x/note/list' \ ## 查询稿件公开笔记 -> http://api.bilibili.com/x/note/publish/list/archive +> https://api.bilibili.com/x/note/publish/list/archive *请求方式:GET* @@ -282,7 +275,7 @@ curl 'http://api.bilibili.com/x/note/list' \ 查询视频`av338677252`的公开笔记列表 ```shell -curl 'http://api.bilibili.com/x/note/publish/list/archive' \ +curl 'https://api.bilibili.com/x/note/publish/list/archive' \ --data-urlencode 'oid=338677252' \ --data-urlencode 'oid_type=0' \ --data-urlencode 'ps=10' \ @@ -581,7 +574,7 @@ curl 'http://api.bilibili.com/x/note/publish/list/archive' \ ## 查询用户公开笔记 -> http://api.bilibili.com/x/note/publish/list/user +> https://api.bilibili.com/x/note/publish/list/user *请求方式:GET* @@ -632,7 +625,7 @@ curl 'http://api.bilibili.com/x/note/publish/list/archive' \ **示例:** ```shell -curl 'http://api.bilibili.com/x/note/publish/list/user' \ +curl 'https://api.bilibili.com/x/note/publish/list/user' \ --data-urlencode 'ps=10' \ --data-urlencode 'pn=1' -b 'SESSDATA=xxx' diff --git a/note/readme.md b/docs/note/readme.md similarity index 100% rename from note/readme.md rename to docs/note/readme.md diff --git a/docs/search/hot.md b/docs/search/hot.md new file mode 100644 index 0000000..6c7cdb9 --- /dev/null +++ b/docs/search/hot.md @@ -0,0 +1,693 @@ +# 默认搜索&热搜 + +## 获取默认搜索内容(web端) + +> https://api.bilibili.com/x/web-interface/wbi/search/default + +> ~~https://api.bilibili.com/x/web-interface/search/default~~ (旧链接) + +*请求方式:GET* + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +默认搜索为搜索框中默认填充内容,用于官方推荐内容,若不输入点击搜索按钮跳转为`url`中的链接 + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | --------------- | -------------- | +| seid | str | 搜索seid | | +| id | num | 默认搜索id | | +| type | num | 0 | | +| show_name | str | 显示文字 | | +| name | str | 空 | | +| goto_type | num | 跳转类型 | 1:视频 | +| goto_value | str | 搜索目标id | 视频:稿件avid | +| url | str | 搜索目标跳转url | | + +**示例:** + +```shell +curl 'https://api.bilibili.com/x/web-interface/search/default' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "seid": "17607543598496143098", + "id": 3296036255232726331, + "type": 0, + "show_name": "歪果仁在中国做模特能赚多少钱?", + "name": "", + "goto_type": 1, + "goto_value": "243920322", + "url": "https://www.bilibili.com/video/BV1Tv411q7gx" + } +} +``` + +
+ +## 获取热搜列表 + +> https://api.bilibili.com/x/web-interface/wbi/search/square +> ~~https://api.bilibili.com/x/web-interface/search/square~~ + +*请求方式: GET* + +**URL参数:** + +|参数名|类型|内容|必要性|备注| +|-|-|-|-|-| +|limit|num|结果限制|必要|范围 [1, 50]| +|platform|str|平台标识|不必要|web: web 端| + +**JSON回复:** + +根对象: + +|字段|类型|内容|备注| +|-|-|-|-| +|code|num|返回值|0: 成功
-400: 请求错误| +|message|str|错误信息|默认为空| +|ttl|num|1|| +|data|obj|数据本体|| + +`data`对象: + +|字段|类型|内容|备注| +|-|-|-|-| +|trending|obj|热搜榜单|套了个娃| + +`data`中的`trending`对象: + +|字段|类型|内容|备注| +|-|-|-|-| +|title|str|标题|| +|trackid|str|跟踪 ID?|| +|list|array|热搜列表|| +|top_list|array|空|| + +`trending`中的`list`数组: + +|项|类型|内容|备注| +|-|-|-|-| +|0|obj|热搜 1|| +|1|obj|热搜 2|| +|……|obj|……|| +|n|obj|热搜 (n+1)|| + +`list`数组中的对象: + +|字段|类型|内容|备注| +|-|-|-|-| +|keyword|str|关键词|| +|show_name|str|显示文字|| +|icon|str|图标 URL|| +|uri|str|空|| +|goto|str|空|| + +**示例:** + +获取热搜列表, 数量限制 4 + +```shell +curl -G --url 'https://api.bilibili.com/x/web-interface/search/square' \ +--url-query 'limit=4' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "trending": { + "title": "bilibili热搜", + "trackid": "8079760748892487175", + "list": [ + { + "keyword": "马克龙祝贺中国世界前两名", + "show_name": "马克龙祝贺中国世界前两名", + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", + "uri": "", + "goto": "" + }, + { + "keyword": "小孩电竞世界杯夺冠", + "show_name": "小孩电竞世界杯夺冠", + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", + "uri": "", + "goto": "" + }, + { + "keyword": "孙颖莎说我全勤下班了", + "show_name": "孙颖莎说我全勤下班了", + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", + "uri": "", + "goto": "" + }, + { + "keyword": "7月广东新冠新增一万余例", + "show_name": "7月广东新冠新增一万余例", + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", + "uri": "", + "goto": "" + } + ], + "top_list": [] + } + } +} +``` + +
+ +## 获取热搜列表(web端) + +> https://s.search.bilibili.com/main/hotword + +*请求方式:GET* + +榜单每隔固定时间统计一次,请求后返回搜索前10的关键词 + +带有转义 + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | ------------ | ------------- | +| exp_str | str | ??? | | +| code | num | 返回值 | 0:成功 | +| cost | obj | 详细搜索用时 | 大概是吧? | +| seid | str | 搜索seid | | +| timestamp | num | 榜单统计时间 | 时间戳 | +| message | str | 错误信息 | 默认为success | +| list | array | 热搜列表 | | + +`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ------------ | +| 0 | obj | 榜单第1名 | | +| n | obj | 榜单第(n+1)名 | 按照名次顺序 | +| 10 | obj | 榜单第10名 | 最后一项 | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | -------- | ------- | +| status | str | 空 | | +| hot_id | num | 热词id | 大概是吧? | +| keyword | str | 关键词 | | +| resource_id| num | 资源id | | +| goto_type | num | 0 | | +| res | array| null | | +| show_name | str | 完整关键词| | +| pos | num | 名次 | 1-10 | +| word_type | num | 条目属性 | 4: 新
5: 热
6: [雾,咒,小丑(愚人节)] 具体看icon7: 直播中
8: 默认(无标签)
9: 梗
11: 话题
12: 独家 | +| id | num | 名次 | 1-10 | +| goto_value | str | 空 | | +| live_id | array| null | | +| name_type | str | 空 | | +| icon | str | 图标url | | + +**示例:** + +```shell +curl 'https://s.search.bilibili.com/main/hotword' +``` + +
+查看响应示例: + +```json +{ + "exp_str": "8104#8200#8300#8401#8500#5502#6699", + "code": 0, + "cost": { + "reas_request": "0.001895", + "params_check": "0.000127", + "reas_response_format": "0.000098", + "deserialize_response": "0.000080", + "reas_request_format": "0.000076", + "total": "0.002479", + "main_handler": "0.002252" + }, + "seid": "9318821020548476185", + "timestamp": 1596034742, + "message": "success", + "list": [{ + "status": "", + "hot_id": 11003, + "keyword": "流浪地球2刘德华", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "流浪地球2刘德华造型", + "pos": 1, + "word_type": 8, + "id": 1, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "http://i0.hdslb.com/bfs/feed-admin/e9e7a2d8497d4063421b685e72680bf1cfb99a0d.png" + }, + { + "status": "", + "hot_id": 11012, + "keyword": "QQ飞车手游飞跃黄河", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "QQ飞车手游飞跃黄河", + "pos": 2, + "word_type": 8, + "id": 2, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "http://i0.hdslb.com/bfs/feed-admin/4d579fb61f9655316582db193118bba3a721eec0.png" + }, + { + "status": "", + "hot_id": 10996, + "keyword": "西工大遭网络攻击最新调查", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "西工大遭网络攻击最新调查", + "pos": 3, + "word_type": 8, + "id": 3, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "http://i0.hdslb.com/bfs/feed-admin/e9e7a2d8497d4063421b685e72680bf1cfb99a0d.png" + }, + { + "status": "", + "hot_id": 11004, + "keyword": "EDG 起诉", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "EDGJieJie已起诉多家企业", + "pos": 4, + "word_type": 8, + "id": 4, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "http://i0.hdslb.com/bfs/feed-admin/4d579fb61f9655316582db193118bba3a721eec0.png" + }, + { + "status": "", + "hot_id": 10992, + "keyword": "隐入尘烟", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "隐入尘烟全平台下架", + "pos": 5, + "word_type": 8, + "id": 5, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "http://i0.hdslb.com/bfs/feed-admin/e9e7a2d8497d4063421b685e72680bf1cfb99a0d.png" + }, + { + "status": "", + "hot_id": 10987, + "keyword": "原神半年内最良心封神池", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "原神半年内最良心封神池", + "pos": 6, + "word_type": 8, + "id": 6, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "" + }, + { + "status": "", + "hot_id": 10988, + "keyword": "高校回应设国内首个元宇宙院系", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "高校回应设国内首个元宇宙院系", + "pos": 7, + "word_type": 8, + "id": 7, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "" + }, + { + "status": "", + "hot_id": 10994, + "keyword": "美宇宙飞船成功撞击小行星", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "美宇宙飞船成功撞击小行星", + "pos": 8, + "word_type": 8, + "id": 8, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "" + }, + { + "status": "", + "hot_id": 10991, + "keyword": "你薅的羊毛可能已违法", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "你薅的羊毛可能已违法", + "pos": 9, + "word_type": 8, + "id": 9, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "" + }, + { + "status": "", + "hot_id": 11013, + "keyword": "辛普森一家", + "resource_id": 0, + "goto_type": 0, + "res": [ + + ], + "show_name": "辛普森一家", + "pos": 10, + "word_type": 8, + "id": 10, + "goto_value": "", + "live_id": [ + + ], + "name_type": "", + "icon": "http://i0.hdslb.com/bfs/feed-admin/4d579fb61f9655316582db193118bba3a721eec0.png" + } + ] +} +``` + +
+ +## 获取热搜列表(手机端) + +> https://app.bilibili.com/x/v2/search/trending/ranking + +*请求方式:GET* + +榜单每隔固定时间统计一次 + +带有转义 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ---------------- | ------ | ---- | +| limit | num | 热搜数量 | 非必要 | 留空为20, 最大为100 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | ------------ | ------------- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 返回值 | 默认为1 | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ------------ | +| trackid | num | | 不知用途 | +| list | array | 热搜列表 | | + +`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ------------ | +| 0 | obj | 榜单第1名 | | +| n | obj | 榜单第(n+1)名 | 按照名次顺序 | +| 20/limit | obj | 榜单第20名 | 最后一项 | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | -------- | ------- | +| position | num | 名次 | 1-20/limit | +| keyword | str | 关键词 | | +| show_name | str | 完整关键词| | +| word_type | num | 条目属性 | 同 web 端 | +| icon | str | 图标url | | +| hot_id | num | 热词id | 大概是吧? | + +**示例:** + +```shell +curl 'https://app.bilibili.com/x/v2/search/trending/ranking' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "trackid": "2578006123492681222", + "list": [{ + "position": 1, + "keyword": "列车延误乘务员哽咽安抚乘客", + "show_name": "列车延误乘务员哽咽安抚乘客", + "word_type": 5, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", + "hot_id": 107814, + "is_commercial": "0" + }, { + "position": 2, + "keyword": "黑神话悟空首次线下试玩", + "show_name": "黑神话悟空首次线下试玩", + "word_type": 5, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", + "hot_id": 107781, + "is_commercial": "0" + }, { + "position": 3, + "keyword": "22万人打出9.9分的动画", + "show_name": "22万人打出9.9分的动画", + "word_type": 6, + "icon": "https://i0.hdslb.com/bfs/legacy/463fa23613670218608e68247a137dd071c0e9c8.png", + "hot_id": 107818, + "is_commercial": "0" + }, { + "position": 4, + "keyword": "冰冻近五万年线虫被复活", + "show_name": "冰冻近五万年线虫被复活", + "word_type": 5, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", + "hot_id": 107774, + "is_commercial": "0" + }, { + "position": 5, + "keyword": "LNG前任和现任的较量", + "show_name": "LNG前任和现任的较量", + "word_type": 4, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", + "hot_id": 107853, + "is_commercial": "0" + }, { + "position": 6, + "keyword": "LOL手游剑姬女警新皮", + "show_name": "LOL手游剑姬女警新皮", + "word_type": 8, + "hot_id": 107841, + "is_commercial": "0" + }, { + "position": 7, + "keyword": "抽奖中金条却因过号被取消", + "show_name": "抽奖中金条却因过号被取消", + "word_type": 8, + "hot_id": 107817, + "is_commercial": "0" + }, { + "position": 8, + "keyword": "雪王到长城开蜜雪冰城", + "show_name": "雪王到长城开蜜雪冰城", + "word_type": 4, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", + "hot_id": 107849, + "is_commercial": "0" + }, { + "position": 9, + "keyword": "堡垒之夜联动终结者", + "show_name": "堡垒之夜联动终结者", + "word_type": 8, + "hot_id": 107846, + "is_commercial": "0" + }, { + "position": 10, + "keyword": "王者新英雄海诺动画", + "show_name": "王者新英雄海诺动画", + "word_type": 4, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", + "hot_id": 107870, + "is_commercial": "0" + }, { + "position": 11, + "keyword": "周星驰功夫10万字拆解", + "show_name": "周星驰功夫10万字拆解", + "word_type": 4, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", + "hot_id": 107848, + "is_commercial": "0" + }, { + "position": 12, + "keyword": "张杰铁粉彭奶奶去世", + "show_name": "张杰铁粉彭奶奶去世", + "word_type": 4, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", + "hot_id": 107840, + "is_commercial": "0" + }, { + "position": 13, + "keyword": "李玟二姐回应礼服争议", + "show_name": "李玟二姐回应礼服争议", + "word_type": 8, + "hot_id": 107833, + "is_commercial": "0" + }, { + "position": 14, + "keyword": "洪水中飘来冰箱市民取走饮料", + "show_name": "洪水中飘来冰箱市民取走饮料", + "word_type": 8, + "hot_id": 107802, + "is_commercial": "0" + }, { + "position": 15, + "keyword": "LOL斗魂觉醒佛耶戈语音", + "show_name": "LOL斗魂觉醒佛耶戈语音", + "word_type": 8, + "hot_id": 107790, + "is_commercial": "0" + }, { + "position": 16, + "keyword": "全面落实带薪休假制度", + "show_name": "全面落实带薪休假制度", + "word_type": 4, + "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", + "hot_id": 107839, + "is_commercial": "0" + }, { + "position": 17, + "keyword": "花少北 把病娇治好了", + "show_name": "花少北 把病娇治好了", + "word_type": 8, + "hot_id": 107782, + "is_commercial": "0" + }, { + "position": 18, + "keyword": "2.28米高的村超娃", + "show_name": "2.28米高的村超娃", + "word_type": 8, + "hot_id": 107805, + "is_commercial": "0" + }, { + "position": 19, + "keyword": "当在动漫中不小心撞到", + "show_name": "当在动漫中不小心撞到", + "word_type": 8, + "hot_id": 107832, + "is_commercial": "0" + }, { + "position": 20, + "keyword": "台风卡努路径趋向日本", + "show_name": "台风卡努路径趋向日本", + "word_type": 8, + "hot_id": 107800, + "is_commercial": "0" + }], + "exp_str": "8000#5508#6604#7703", + "hotword_egg_info": "0" + } +} +``` + +
diff --git a/search/search_request.md b/docs/search/search_request.md similarity index 98% rename from search/search_request.md rename to docs/search/search_request.md index d65a4c6..038c8f7 100644 --- a/search/search_request.md +++ b/docs/search/search_request.md @@ -1,17 +1,16 @@ # 搜索 -- [综合搜索(web端)](#综合搜索(web端)) -- [分类搜索(web端)](#分类搜索(web端)) - ---- +> **B站于2022年8月24日更新了搜索api,增加了一大堆Cookies的校验,如果Cookies不足会返回-412搜索被拦截。如果没有cookies的话,请在搜索之前先GET一遍 https://bilibili.com 以获取cookies** ## 综合搜索(web端) -> http://api.bilibili.com/x/web-interface/search/all/v2 +> https://api.bilibili.com/x/web-interface/wbi/search/all/v2 + +> ~~https://api.bilibili.com/x/web-interface/search/all/v2~~ (旧链接) *方式:GET* -认证方式:Cookie(SESSDATA) +鉴权方式:[Wbi 签名](../misc/sign/wbi.md), Cookie 中含有 [`buvid3`](../misc/buvid3_4.md) 字段 返回和关键字相关的20条信息 @@ -29,7 +28,7 @@ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | +| code | num | 返回值 | 0:成功
-400:请求错误
-412:请求被拦截 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | obj | 信息本体 | | @@ -40,7 +39,7 @@ | ---------------- | ----- | ---------------- | ---------------- | | seid | str | 搜索id | | | page | num | 页数 | 固定为1 | -| pagesize | num | 每页条数 | 固定为20 | +| page_size | num | 每页条数 | 固定为20 | | numResults | num | 总条数 | 最大值为1000 | | numPages | num | 分页数 | 最大值为50 | | suggest_keyword | str | 空 | **作用尚不明确** | @@ -177,7 +176,7 @@ 使用综合搜索进行搜索关键字`洛天依` ```shell -curl -G 'http://api.bilibili.com/x/web-interface/search/all/v2' \ +curl -G 'https://api.bilibili.com/x/web-interface/search/all/v2' \ --data-urlencode 'keyword=洛天依' \ -b 'SESSDATA=xxx' ``` @@ -578,15 +577,15 @@ curl -G 'http://api.bilibili.com/x/web-interface/search/all/v2' \ - - ## 分类搜索(web端) -> http://api.bilibili.com/x/web-interface/search/type +> https://api.bilibili.com/x/web-interface/wbi/search/type + +> ~~https://api.bilibili.com/x/web-interface/search/type~~ (旧链接) *请求方式:GET* -认证方式:Cookie(SESSDATA) +鉴权方式:[Wbi 签名](../misc/sign/wbi.md), Cookie 中含有 [`buvid3`](../misc/buvid3_4.md) 字段, Referer 在 `.bilibili.com` 下, User-Agent 不含敏感子串 根据关键词进行搜索,返回结果每页20项 @@ -610,7 +609,7 @@ curl -G 'http://api.bilibili.com/x/web-interface/search/all/v2' \ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | +| code | num | 返回值 | 0: 成功
-400: 请求错误
-412: 请求被拦截
-1200: 被降级过滤的请求(搜索目标类型不存在) | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | obj | 信息本体 | | @@ -703,7 +702,7 @@ curl -G 'http://api.bilibili.com/x/web-interface/search/all/v2' \ 按照关键词` 少年 `搜索视频,默认排序,全部时长,全部分区,第1页 ```shell -curl -G 'http://api.bilibili.com/x/web-interface/search/type' \ +curl -G 'https://api.bilibili.com/x/web-interface/search/type' \ --data-urlencode 'search_type=video' \ --data-urlencode 'keyword=少年' \ --data-urlencode 'order=totalrank' \ diff --git a/search/search_response.md b/docs/search/search_response.md similarity index 98% rename from search/search_response.md rename to docs/search/search_response.md index ed064d2..fb97747 100644 --- a/search/search_response.md +++ b/docs/search/search_response.md @@ -2,19 +2,6 @@ 本页为搜索结果数组`result`中的对象的说明 ---- - -- [对象类型1-结果为视频](#对象类型1-结果为视频) -- [对象类型2-结果为番剧&影视](#对象类型2-结果为番剧&影视) -- [对象类型3-结果为直播间](#对象类型3-结果为直播间) -- [对象类型4-结果为主播](#对象类型4-结果为主播) -- [对象类型5-结果为专栏](#对象类型5-结果为专栏) -- [对象类型6-结果为话题](#对象类型6-结果为话题) -- [对象类型7-结果为用户](#对象类型7-结果为用户) -- [对象类型8-结果为相簿](#对象类型8-结果为相簿) - ---- - ## 对象类型1-结果为视频 | 字段 | 类型 | 内容 | 备注 | diff --git a/docs/search/suggest.md b/docs/search/suggest.md new file mode 100644 index 0000000..276b0d0 --- /dev/null +++ b/docs/search/suggest.md @@ -0,0 +1,175 @@ +# 搜索建议 + +## 获取搜索建议关键词(web端) + +> https://s.search.bilibili.com/main/suggest + +*请求方式:GET* + +搜索建议最多提供10个候选关键词 + +搜索建议内容可为任意语言(中 英 日等....),中文拼音支持全拼联想词 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------------- | ---- | ---------------------- | ------ | ------------------------ | +| term | str | 需要获得建议的输入内容 | 必要 | | +| main_ver | str | v1 | 非必要 | 默认为 `v1` | +| highlight | str | 任意, 无明显作用 | 非必要 | 默认为空 | +| func | str | 函数? | 非必要 | 默认为 `suggest` | +| suggest_type | str | 建议类型? | 非必要 | 默认为 `accurate` | +| sub_type | str | 子类型? | 非必要 | 默认为 `tag` | +| userid | num | 本用户 mid | 非必要 | 可能用于个性化推荐 | +| bangumi_acc_num | num | 番剧累积数? | 非必要 | 默认为 `1` | +| special_acc_num | num | 特殊累积数? | 非必要 | 默认为 `1` | +| topic_acc_num | num | 话题累积数? | 非必要 | 默认为 `1` | +| upuser_acc_num | num | UP主累积数? | 非必要 | 默认为 `1` | +| tag_num | num | Tag 数? | 非必要 | 默认为 `10` | +| special_num | num | 特殊推荐数? | 非必要 | 默认为 `10` | +| bangumi_num | num | 番剧推荐数? | 非必要 | 默认为 `10` | +| upuser_num | num | UP主推荐数? | 非必要 | 默认为 `3` | +| rnd | num | 一个随机浮点数 | 非必要 | 由 `Math.random()` 生成? | +| buvid | str | 同 Cookie 中 buvid3 | 非必要 | | +| spmid | str | 333.1007 | 非必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ------------ | ------------ | +| exp_str | str | 实验字符串? | 作用尚不明确 | +| code | num | 返回值 | 0:成功 | +| result | obj | 搜索建议结果 | | +| stoken | str | ??? | 作用尚不明确 | + +`result`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ----- | -------- | ---- | +| tag | array | 套了个娃 | | + +`result`中的`tag`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------------- | ---------------------- | +| 0 | obj | 第1建议关键词 | | +| n | obj | 第(n+1)建议关键词 | 按照相关程度与热度顺序 | +| 9 | obj | 第10建议关键词 | 最后一项 | + +`tag`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ---------- | -------------------------------------------------- | +| value | str | 关键词内容 | | +| ref | num | 0 | 作用尚不明确 | +| name | str | 显示内容 | 带有 `` 的 XML 标签 | +| spid | num | 5 | 作用尚不明确 | +| type | str | 空 | | + +**示例:** + +获取关于 `洛天依` 的搜索建议 + +```shell +curl -G 'https://s.search.bilibili.com/main/suggest' \ +--data-urlencode 'term=洛天依' +``` + +
+查看响应示例: + +```json +{ + "exp_str": "106301_106700", + "code": 0, + "result": { + "tag": [ + { + "value": "洛天依", + "term": "洛天依", + "ref": 0, + "name": "洛天依", + "spid": 5, + "type": "" + }, + { + "value": "洛天依十二周年", + "term": "洛天依十二周年", + "ref": 0, + "name": "洛天依十二周年", + "spid": 5, + "type": "" + }, + { + "value": "洛天依演唱会", + "term": "洛天依演唱会", + "ref": 0, + "name": "洛天依演唱会", + "spid": 5, + "type": "" + }, + { + "value": "洛天依手办", + "term": "洛天依手办", + "ref": 0, + "name": "洛天依手办", + "spid": 5, + "type": "" + }, + { + "value": "洛天依歌曲", + "term": "洛天依歌曲", + "ref": 0, + "name": "洛天依歌曲", + "spid": 5, + "type": "" + }, + { + "value": "洛天依童话镇", + "term": "洛天依童话镇", + "ref": 0, + "name": "洛天依童话镇", + "spid": 5, + "type": "" + }, + { + "value": "洛天依东京不太热", + "term": "洛天依东京不太热", + "ref": 0, + "name": "洛天依东京不太热", + "spid": 5, + "type": "" + }, + { + "value": "洛天依霜雪千年", + "term": "洛天依霜雪千年", + "ref": 0, + "name": "洛天依霜雪千年", + "spid": 5, + "type": "" + }, + { + "value": "洛天依生日会", + "term": "洛天依生日会", + "ref": 0, + "name": "洛天依生日会", + "spid": 5, + "type": "" + }, + { + "value": "洛天依生日", + "term": "洛天依生日", + "ref": 0, + "name": "洛天依生日", + "spid": 5, + "type": "" + } + ] + }, + "stoken": "4020133863501304726" +} +``` + +
diff --git a/docs/teenager/teenager_mode.md b/docs/teenager/teenager_mode.md new file mode 100644 index 0000000..e7f5a1b --- /dev/null +++ b/docs/teenager/teenager_mode.md @@ -0,0 +1,84 @@ +# 青少年模式 +## 开启/关闭 +> https://app.bilibili.com/x/v2/account/teenagers/update + +*请求方式:POST* + +认证方式:APP(详见[设备各类标识算法](../misc/device_identity.md)) + +**POST参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|--------|-----|-------|---------|-----| +| appkey | str | APP密钥 | APP必要 | | +| ts | num | 当前时间戳 | APP必要 | | +| sign | str | APP签名 | APP必要 | | +| access_key | str | APP登录Token | APP必要 | | +| device_model | str | 设备 Model | APP必要 | | +| channel | str | APP下载渠道 | APP必要 | 比如yingyongbao | +| mobi_app | str |APP 包类型 | APP必要 | | +| platform | str |平台类型| APP必要 | android | +| c_locale | str |语言| 非必要 | zh_CN | +| s_locale | str |语言| 非必要 | zh_CN | +| statistics | str | ? | 必要 | 一般固定为{"appId":1,"platform":3,"version":"7.27.0","abtest":""},非key-value入参需要转URL编码 | +| pwd | num |密码| 必要 | 开启时为4位,关闭时必须为空 | +| teenagers_mode | num |开启/关闭模式| 必要 | 0为开启,1为关闭 | +| teenagers_status | num |当前模式状态| 必要 | 0为已经开启,1为目前关闭 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | -------- | ---------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** +关闭本账号的青少年模式(pwd=&teenagers_mode=1&teenagers_status=0) +```shell +curl --location 'https://app.bilibili.com/x/v2/account/teenagers/update' \ +--header 'Device-Id: 你的设备id' \ +--header 'Fp_local: 你的本地设备指纹' \ +--header 'Fp_remote: 你的远程设备指纹' \ +--header 'Session_id: 会话id' \ +--header 'App-Key: android' \ +--header 'Content-Type: application/x-www-form-urlencoded; charset=utf-8' \ +--data-urlencode 'access_key=你的access_key' \ +--data-urlencode 'appkey=1d8b6e7d45233436' \ +--data-urlencode 'build=6270200' \ +--data-urlencode 'c_locale=zh_CN' \ +--data-urlencode 'channel=yingyongbao' \ +--data-urlencode 'device_model=samsung%257CSM-G955N' \ +--data-urlencode 'mobi_app=android' \ +--data-urlencode 'platform=android' \ +--data-urlencode 's_locale=zh_CN' \ +--data-urlencode 'statistics=%257B%2522appId%2522%253A1%252C%2522platform%2522%253A3%252C%2522version%2522%253A%25226.27.0%2522%252C%2522abtest%2522%253A%2522%2522%257D' \ +--data-urlencode 'pwd=' \ +--data-urlencode 'teenagers_mode=1' \ +--data-urlencode 'teenagers_status=0' \ +--data-urlencode 'ts=1699301298' \ +--data-urlencode 'sign=0666c38cb79691c4a0d9570a0669ec96' \ +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` +pwd有数值时 +```json +{ + "code": -400, + "message": "关闭时密码必须为空", + "ttl": 1 +} +``` + +
diff --git a/user/check_nickname.md b/docs/user/check_nickname.md similarity index 80% rename from user/check_nickname.md rename to docs/user/check_nickname.md index 5e747bd..b006dbc 100644 --- a/user/check_nickname.md +++ b/docs/user/check_nickname.md @@ -1,12 +1,11 @@ # 检查昵称是否可注册 -- [检查昵称](#检查昵称) +## ~~检查昵称(已失效)~~ ---- +
+查看折叠内容 -## 检查昵称 - -> http://passport.bilibili.com/web/generic/check/nickname +> https://passport.bilibili.com/web/generic/check/nickname *请求方式:GET* @@ -44,7 +43,7 @@ 查询昵称 `xijinping` 是否被使用: ```shell -curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ +curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ --data-urlencode 'nickName=xijinping' ``` @@ -63,7 +62,7 @@ curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ 查询昵称 `//` 是否被使用: ```shell -curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ +curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ --data-urlencode 'nickName=//' ``` @@ -82,7 +81,7 @@ curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ 查询昵称 `test0000000000000 ` 是否被使用: ```shell -curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ +curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ --data-urlencode 'nickName=test0000000000000 ' ``` @@ -101,7 +100,7 @@ curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ 查询昵称 `0` 是否被使用: ```shell -curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ +curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ --data-urlencode 'nickName=0' ``` @@ -120,7 +119,7 @@ curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ 查询昵称 `test` 是否被使用: ```shell -curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ +curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ --data-urlencode 'nickName=test' ``` @@ -135,3 +134,12 @@ curl -G 'http://passport.bilibili.com/web/generic/check/nickname' \ ```
+ + + +目前该接口无论参数,稳定返回: +```json +{ + "code": 0 +} +``` diff --git a/docs/user/contract.md b/docs/user/contract.md new file mode 100644 index 0000000..7080164 --- /dev/null +++ b/docs/user/contract.md @@ -0,0 +1,131 @@ +# 加入老粉计划 + +> https://api.bilibili.com/x/v1/contract/add_contract + +*请求方式:POST* + +是否需要登录:`是` + +认证方式:Cookie(SESSDATA) + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|----------|-----|--------|-----|-----| +| aid | str | `空串` | | | +| up_mid | str | UP主UID | 必要 | | +| source | str | `4` | | | +| scene | str | `105` | | | +| platform | str | `web` | | | +| mobi_app | str | `pc` | | | +| csrf | str | 用户csrf | 必要 | | + +**json回复:** + +根对象: + +| 字段名 | 类型 | 内容 | 备注 | +|---------|-----|------|-------------------------| +| code | num | 响应码 | 0:成功
158001:`不满足条件` | +| message | str | 0 | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象 + +| 字段名 | 类型 | 内容 | 备注 | +|---------------|------|-----------------------------------|-----| +| allow_message | bool | `true` | | +| input_text | str | `UP主加油!看好你噢` | | +| input_title | str | `感谢你对UP主的特别支持,“老粉”可期!私信留言鼓励下TA吧 ` | | + +**示例:** + +```shell +curl --location --request POST 'https://api.bilibili.com/x/v1/contract/add_contract' \ +--header 'Cookie: SESSDATA=xxx' \ +--header 'Content-Type: application/x-www-form-urlencoded' \ +--data-urlencode 'up_mid=2' \ +--data-urlencode 'csrf=xxx' +``` + +
+点击查看 + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "allow_message": true, + "input_text": "UP主加油!看好你噢", + "input_title": "感谢你对UP主的特别支持,“老粉”可期!私信留言鼓励下TA吧 " + } +} +``` + +
+ +# 老粉计划发送留言 + +> https://api.bilibili.com/x/v1/contract/add_message + +*请求方式:POST* + +认证方式:Cookie (SESSDATA) + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|---------|-----|--------|-----|-----| +| aid | str | `空串` | | | +| up_mid | str | UP主UID | 必要 | | +| source | str | `4` | | | +| scene | str | `105` | | | +| content | str | 留言内容 | 必要 | | +| csrf | str | 用户csrf | 必要 | | + +**json回复:** + +根对象: + +| 字段名 | 类型 | 内容 | 备注 | +|---------|-----|------|------------------------------| +| code | num | 响应码 | 0:成功
158005:您跟up主还不是契约关系 | +| message | str | 0 | | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象 + +| 字段名 | 类型 | 内容 | 备注 | +|---------------|-----|------------------|-----| +| success_toast | str | `提交成功,UP主已收到留言~` | | + +**示例:** + +```shell +curl --location --request POST 'https://api.bilibili.com/x/v1/contract/add_message' \ +--header 'Cookie: SESSDATA=xxx' \ +--header 'Content-Type: application/x-www-form-urlencoded' \ +--data-urlencode 'up_mid=2' \ +--data-urlencode 'content=..' \ +--data-urlencode 'csrf=xxx' +``` + +
+点击查看 + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "success_toast": "提交成功,UP主已收到留言~" + } +} +``` + +
\ No newline at end of file diff --git a/docs/user/info.md b/docs/user/info.md new file mode 100644 index 0000000..3532f1b --- /dev/null +++ b/docs/user/info.md @@ -0,0 +1,1252 @@ +# 用户基本信息 + + + +## 用户空间详细信息 + +> https://api.bilibili.com/x/space/wbi/acc/info + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md), Cookie (对于某些 IP 地址,需要在 Cookie 中提供任意非空的 `buvid3` 字段) + +~~该接口的旧版 API :~~(已废弃,不建议使用) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ------------------------------------ | +| mid | num | 目标用户mid | 必要 | | +| w_rid | str | Wbi 签名 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | +| wts | num | 当前时间戳 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-400:请求错误
-403:访问权限不足
-404:用户不存在(如注销账号) | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------- | ---- | ---------------- | ------------------------------------------------------------ | +| mid | num | mid | | +| name | str | 昵称 | | +| sex | str | 性别 | 男/女/保密 | +| face | str | 头像链接 | | +| face_nft | num | 是否为 NFT 头像 | 0:不是 NFT 头像
1:是 NFT 头像 | +| face_nft_type | num | NFT 头像类型? | | +| sign | str | 签名 | | +| rank | num | 用户权限等级 | 目前应该无任何作用
5000:0级未答题
10000:普通会员
20000:字幕君
25000:VIP
30000:真·职人
32000:管理员 | +| level | num | 当前等级 | 0-6 级 | +| jointime | num | 注册时间 | 此接口返回恒为`0` | +| moral | num | 节操值 | 此接口返回恒为`0` | +| silence | num | 封禁状态 | 0:正常
1:被封 | +| coins | num | 硬币数 | 需要登录(Cookie)
只能查看自己的
默认为`0` | +| fans_badge | bool | 是否具有粉丝勋章 | false:无
true:有 | +| fans_medal | obj | 粉丝勋章信息 | | +| official | obj | 认证信息 | | +| vip | obj | 会员信息 | | +| pendant | obj | 头像框信息 | | +| nameplate | obj | 勋章信息 | | +| user_honour_info | obj | (?) | | +| is_followed | bool | 是否关注此用户 | true:已关注
false:未关注
需要登录(Cookie)
未登录恒为`false` | +| top_photo | str | 主页头图链接 | | +| theme | obj | (?) | | +| sys_notice | obj | 系统通知 | 无内容则为空对象
主要用于展示如用户争议、纪念账号等等的小黄条 | +| live_room | obj | 直播间信息 | | +| birthday | str | 生日 | MM-DD
如设置隐私为空 | +| school | obj | 学校 | | +| profession | obj | 专业资质信息 | | +| tags | 有效时:array
无效时:null | 个人标签 | | +| series | obj | (?) | | +| is_senior_member | num | 是否为硬核会员 | 0:否
1:是 | +| mcn_info | null | (?) | | +| gaia_res_type | num | (?) | | +| gaia_data | null | (?) | | +| is_risk | bool | (?) | | +| elec | obj | 充电信息 | | +| contract | obj | 是否显示老粉计划 | | +| certificate_show | bool | (?) | | +| name_render | 有效时:obj
无效时:null | 昵称渲染信息 | | + +`rank`示例 + +| UID | rank | +| --------- | ----- | +| 2 | 20000 | +| 16765 | 20000 | +| 15773384 | 20000 | +| 124416 | 20000 | +| 429736362 | 25000 | +| 424261768 | 25000 | +| 41273726 | 25000 | +| 15080107 | 25000 | +| 9847497 | 25000 | +| 4856007 | 25000 | +| 928123 | 25000 | +| 132704 | 25000 | +| 70093 | 25000 | +| 47291 | 25000 | +| 27380 | 25000 | +| 22445 | 25000 | +| 3351 | 25000 | +| 1101 | 25000 | +| 93066 | 30000 | +| 2443068 | 30000 | +| 46368 | 30000 | +| 11167 | 30000 | + +`profession`示例 + +| UID | +| ---------- | +| 654391 | +| 1440295 | +| 1785155 | +| 2990100 | +| 3875803 | + +`data`中的`official`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | -------- | ---------------------------------------- | +| role | num | 认证类型 | 见 [用户认证类型一览](official_role.md) | +| title | str | 认证信息 | 无为空 | +| desc | str | 认证备注 | 无为空 | +| type | num | 是否认证 | -1:无
0:个人认证
1:机构认证 | + +`data`中的`vip`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------------- | ---- | ------------------ | ------------------------------------------------------------ | +| type | num | 会员类型 | 0:无
1:月大会员
2:年度及以上大会员 | +| status | num | 会员状态 | 0:无
1:有 | +| due_date | num | 会员过期时间 | 毫秒时间戳 | +| vip_pay_type | num | 支付类型 | 0:未开启自动续费
1:已开启自动续费 | +| theme_type | num | 0 | 作用尚不明确 | +| label | obj | 会员标签 | | +| avatar_subscript | num | 是否显示会员图标 | 0:不显示
1:显示 | +| nickname_color | str | 会员昵称颜色 | 颜色码,一般为`#FB7299`,曾用于愚人节改变大会员配色 | +| role | num | 大角色类型 | 1:月度大会员
3:年度大会员
7:十年大会员
15:百年大会员 | +| avatar_subscript_url | str | 大会员角标地址 | | +| tv_vip_status | num | 电视大会员状态 | 0:未开通 | +| tv_vip_pay_type | num | 电视大会员支付类型 | | +| tv_due_date | num | 电视大会员过期时间 | 秒级时间戳 | +| avatar_icon | obj | 大会员角标信息 | | + +`vip`中的`label`对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------------------------|------|----------|------------------------------------------------------------------------------------------------------------------------------| +| path | str | 空 | 作用尚不明确 | +| text | str | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` | +| label_theme | str | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员
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 | 大会员牌子图片 | 繁体版 | + +`vip`中的`avatar_icon`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ------ | ------------ | +| icon_type | num | (?) | 作用尚不明确 | +| icon_resource | obj | (?) | 作用尚不明确 | + +`data`中的`pendant`对象: + +**普通头像框的`image`与`image_enhance`内容相同** + +**动态头像框的`image`为png静态图片,`image_enhance`为webp动态图片,`image_enhance_frame`为png逐帧序列** + +| 字段 | 类型 | 内容 | 备注 | +| ------------------- | ---- | --------------------- | ----------------- | +| pid | num | 头像框id | | +| name | str | 头像框名称 | | +| image | str | 头像框图片url | | +| expire | num | 过期时间 | 此接口返回恒为`0` | +| image_enhance | str | 头像框图片url | | +| image_enhance_frame | str | 头像框图片逐帧序列url | | +| n_pid | num | 新版头像框id | | + +`data`中的`nameplate`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------------- | ---- | +| nid | num | 勋章id | | +| name | str | 勋章名称 | | +| image | str | 勋章图标 | | +| image_small | str | 勋章图标(小) | | +| level | str | 勋章等级 | | +| condition | str | 获取条件 | | + +`data`中的`fans_medal`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------|------|-----------|-----| +| show | bool | | | +| wear | bool | 是否佩戴了粉丝勋章 | | +| medal | obj | 粉丝勋章信息 | | + +`fans_medal`中的`medal`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------------|-----|--------------|------------------| +| uid | num | 此用户mid | | +| target_id | num | 粉丝勋章所属UP的mid | | +| medal_id | num | 粉丝勋章id | | +| level | num | 粉丝勋章等级 | | +| medal_name | str | 粉丝勋章名称 | | +| medal_color | num | 颜色 | | +| intimacy | num | 当前亲密度 | | +| next_intimacy | num | 下一等级所需亲密度 | | +| day_limit | num | 每日亲密度获取上限 | | +| today_feed | num | 今日已获得亲密度 | | +| medal_color_start | num | 粉丝勋章颜色 | 十进制数,可转为十六进制颜色代码 | +| medal_color_end | num | 粉丝勋章颜色 | 十进制数,可转为十六进制颜色代码 | +| medal_color_border | num | 粉丝勋章边框颜色 | 十进制数,可转为十六进制颜色代码 | +| is_lighted | num | | | +| light_status | num | | | +| wearing_status | num | 当前是否佩戴 | 0:未佩戴
1:已佩戴 | +| score | num | | | + +`data`中的`sys_notice`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-----|------|-----| +| id | num | id | | +| content | str | 显示文案 | | +| url | str | 跳转地址 | | +| notice_type | num | 提示类型 | 1,2 | +| icon | str | 前缀图标 | | +| text_color | str | 文字颜色 | | +| bg_color | str | 背景颜色 | | + +`sys_notice`示例 + +| id | content | notice_type | 示例用户 | +|-----|-------------------------------------------------|-------------|-------------------------------------------------------------------------------------------------| +| 5 | 该用户存在争议行为,已冻结其帐号功能的使用 | 1 || +| 8 | 该用户存在较大争议,请谨慎甄别其内容 | 1 | [28062215](https://space.bilibili.com/28062215) | +| 11 | 该账号涉及合约争议,暂冻结其账号功能使用。详见公告-> | 1 || +| 16 | 该UP主内容存在争议,请注意甄别视频内信息 | 1 | [382534165](https://space.bilibili.com/382534165) | +| 20 | 请允许我们在此献上最后的告别,以此纪念其在哔哩哔哩留下的回忆与足迹。请点此查看纪念账号相关说明 | 2 |[212535360](https://space.bilibili.com/212535360)| +|22| 该账号涉及合约诉讼,封禁其账号使用 | || +| 24 | 该账号涉及合约争议,暂冻结其账号功能使用 | 1 | [291229008](https://space.bilibili.com/291229008) | +| 25 | 该用户涉及严重指控,暂冻结其账号功能使用 | 1 | [81447581](https://space.bilibili.com/81447581) | +| 31 | 该用户涉及严重指控,暂冻结其账号功能使用 | 1 | [22439273](https://space.bilibili.com/22439273) | +| 34 | 该用户涉及严重指控,暂冻结其账号功能使用 | 1 | [1640486775](https://space.bilibili.com/1640486775) | +| 36 | 该账户存在争议,请谨慎甄别 | 1 || + +`data`中的`live_room`对象: + +| 字段 | 类型 | 内容 | 备注 | +|----------------|-----|------------|------------------| +| roomStatus | num | 直播间状态 | 0:无房间
1:有房间 | +| liveStatus | num | 直播状态 | 0:未开播
1:直播中 | +| url | str | 直播间网页 url | | +| title | str | 直播间标题 | | +| cover | str | 直播间封面 url | | +| watched_show | obj | | | +| roomid | num | 直播间 id | | +| roundStatus | num | 轮播状态 | 0:未轮播
1:轮播 | +| broadcast_type | num | 0 | | + +`live_room`中的`watched_show`对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------------|------|---------------------|-----| +| switch | bool | ? | | +| num | num | total watched users | | +| text_small | str | | | +| text_large | str | | | +| icon | str | watched icon url | | +| icon_location | str | ? | | +| icon_web | str | watched icon url | | + +`data`中的`school`对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|-----|--------|-------| +| name | str | 就读大学名称 | 没有则为空 | + +`data`中的`profession`对象: + +| 字段 | 类型 | 内容 | 备注 | +|------------|-----|------|----------------| +| name | str | 资质名称 | | +| department | str | 职位 | | +| title | str | 所属机构 | | +| is_show | num | 是否显示 | 0:不显示
1:显示 | + +`data`中的`user_honour_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------|-------|------|-----| +| mid | num | 0 | | +| colour | str | null | | +| tags | array | null | | + +`data`中的`series`对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------------------|------|-----|-----| +| user_upgrade_status | num | (?) | | +| show_upgrade_window | bool | (?) | | + +`data`中的`elec`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | -------------- | ---- | +| show_info | obj | 显示的充电信息 | | + +`elec`中的`show_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ---------------- | ---------------- | +| show | bool | 是否显示充电按钮 | | +| state | num | 充电功能开启状态 | -1:未开通充电功能
1:已开通自定义充电
2:已开通包月、自定义充电
3:已开通包月高档、自定义充电 | +| title | str | 充电按钮显示文字 | 空字符串或 `充电` 或 `充电中` | +| icon | str | 充电图标 | | +| jump_url | str | 跳转url | | + +`data`中的`contract`对象: + +| 字段名 | 类型 | 内容 | 备注 | +|-------------------|------|-----------|---------------------------| +| is_display | bool | | true/false
在页面中未使用此字段 | +| is_follow_display | bool | 是否在显示老粉计划 | true:显示
false:不显示 | + +**示例:** + +查询用户`mid=2`的详细信息,Wbi 签名的 `wts`、`w_rid`生成方式详见 [Wbi 签名](../misc/sign/wbi.md) 文档 + +```shell +curl -G 'https://api.bilibili.com/x/space/wbi/acc/info' \ + --data-urlencode 'mid=2' \ + --data-urlencode 'wts=1685070149' \ + --data-urlencode 'w_rid=f7b376124782ae8cb42c56fdd69144ed' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "mid": 2, + "name": "碧诗", + "sex": "男", + "face": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", + "face_nft": 0, + "face_nft_type": 0, + "sign": "https://kami.im 直男过气网红 # We Are Star Dust", + "rank": 20000, + "level": 6, + "jointime": 0, + "moral": 0, + "silence": 0, + "coins": 0, + "fans_badge": true, + "fans_medal": { + "show": true, + "wear": true, + "medal": { + "uid": 2, + "target_id": 548076, + "medal_id": 32525, + "level": 28, + "medal_name": "桜樱怪", + "medal_color": 398668, + "intimacy": 25364, + "next_intimacy": 160000, + "day_limit": 250000, + "today_feed": 2382, + "medal_color_start": 398668, + "medal_color_end": 6850801, + "medal_color_border": 6809855, + "is_lighted": 1, + "guard_level": 3, + "light_status": 1, + "wearing_status": 1, + "score": 50185364 + } + }, + "official": { + "role": 2, + "title": "bilibili创始人(站长)", + "desc": "", + "type": 0 + }, + "vip": { + "type": 2, + "status": 1, + "due_date": 3979555200000, + "vip_pay_type": 0, + "theme_type": 0, + "label": { + "path": "", + "text": "十年大会员", + "label_theme": "ten_annual_vip", + "text_color": "#FFFFFF", + "bg_style": 1, + "bg_color": "#FB7299", + "border_color": "", + "use_img_label": true, + "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png" + }, + "avatar_subscript": 1, + "nickname_color": "#FB7299", + "role": 7, + "avatar_subscript_url": "", + "tv_vip_status": 1, + "tv_vip_pay_type": 1, + "tv_due_date": 2003500800, + "avatar_icon": { + "icon_type": 1, + "icon_resource": {} + } + }, + "pendant": { + "pid": 32257, + "name": "EveOneCat2", + "image": "https://i2.hdslb.com/bfs/garb/item/488870931b1bba66da36d22848f0720480d3d79a.png", + "expire": 0, + "image_enhance": "https://i2.hdslb.com/bfs/garb/item/5974f17f9d96a88bafba2f6d18d647a486e88312.webp", + "image_enhance_frame": "https://i2.hdslb.com/bfs/garb/item/4316a3910bb0bd6f2f1c267a3e9187f0b9fe5bd0.png", + "n_pid": 32257 + }, + "nameplate": { + "nid": 10, + "name": "见习偶像", + "image": "https://i2.hdslb.com/bfs/face/e93dd9edfa7b9e18bf46fd8d71862327a2350923.png", + "image_small": "https://i2.hdslb.com/bfs/face/275b468b043ec246737ab8580a2075bee0b1263b.png", + "level": "普通勋章", + "condition": "所有自制视频总播放数>=10万" + }, + "user_honour_info": { + "mid": 0, + "colour": null, + "tags": [], + "is_latest_100honour": 0 + }, + "is_followed": false, + "top_photo": "http://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", + "theme": {}, + "sys_notice": {}, + "live_room": { + "roomStatus": 1, + "liveStatus": 0, + "url": "https://live.bilibili.com/1024?broadcast_type=0&is_room_feed=0", + "title": "试图恰鸡", + "cover": "http://i0.hdslb.com/bfs/live/new_room_cover/96ee5bfd0279a0f18b190340334f43f473038288.jpg", + "roomid": 1024, + "roundStatus": 0, + "broadcast_type": 0, + "watched_show": { + "switch": true, + "num": 3, + "text_small": "3", + "text_large": "3人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": "", + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + } + }, + "birthday": "09-19", + "school": { + "name": "" + }, + "profession": { + "name": "", + "department": "", + "title": "", + "is_show": 0 + }, + "tags": null, + "series": { + "user_upgrade_status": 3, + "show_upgrade_window": false + }, + "is_senior_member": 0, + "mcn_info": null, + "gaia_res_type": 0, + "gaia_data": null, + "is_risk": false, + "elec": { + "show_info": { + "show": true, + "state": 1, + "title": "", + "icon": "", + "jump_url": "?oid=2" + } + }, + "contract": { + "is_display": false, + "is_follow_display": false + }, + "certificate_show": false, + "name_render": null + } +} +``` + +
+ +## 用户名片信息 + +> https://api.bilibili.com/x/web-interface/card + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------------------- | ------ | ----------------------- | +| mid | num | 目标用户mid | 必要 | | +| photo | bool | 是否请求用户主页头图 | 非必要 | true:是
false:否 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ----- | -------------- | ------------------------------------------------------------ | +| card | obj | 卡片信息 | | +| following | bool | 是否关注此用户 | true:已关注
false:未关注
需要登录(Cookie)
未登录为false | +| archive_count | num | 用户稿件数 | | +| article_count | num | 0 | **作用尚不明确** | +| follower | num | 粉丝数 | | +| like_num | num | 点赞数 | | + +`data`中的`card`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ----- | -------------- | ------------------------------------------------------------ | +| mid | str | 用户mid | | +| approve | bool | false | **作用尚不明确** | +| name | str | 用户昵称 | | +| sex | str | 用户性别 | 男 女 保密 | +| face | str | 用户头像链接 | | +| DisplayRank | str | 0 | **作用尚不明确** | +| regtime | num | 0 | **作用尚不明确** | +| spacesta | num | 用户状态 | 0:正常
-2:被封禁 | +| birthday | str | 空 | **作用尚不明确** | +| place | str | 空 | **作用尚不明确** | +| description | str | 空 | **作用尚不明确** | +| article | num | 0 | **作用尚不明确** | +| attentions | array | 空 | **作用尚不明确** | +| fans | num | 粉丝数 | | +| friend | num | 关注数 | | +| attention | num | 关注数 | | +| sign | str | 签名 | | +| level_info | obj | 等级 | | +| pendant | obj | 挂件 | | +| nameplate | obj | 勋章 | | +| Official | obj | 认证信息 | | +| official_verify | obj | 认证信息2 | | +| vip | obj | 大会员状态 | | +| space | obj | 主页头图 | | + +`card`中的`level_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | -------- | ---------------- | +| current_level | num | 当前等级 | 0-6级 | +| current_min | num | 0 | **作用尚不明确** | +| current_exp | num | 0 | **作用尚不明确** | +| next_exp | num | 0 | **作用尚不明确** | + +`card`中的`pendant`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ----------- | ---------------- | +| pid | num | 挂件id | | +| name | str | 挂件名称 | | +| image | str | 挂件图片url | | +| expire | num | 0 | **作用尚不明确** | + +`card`中的`nameplate`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ---------------- | -------------------- | +| nid | num | 勋章id | **详细说明有待补充** | +| name | str | 勋章名称 | | +| image | str | 挂件图片url 正常 | | +| image_small | str | 勋章图片url 小 | | +| level | str | 勋章等级 | | +| condition | str | 勋章条件 | | + +`card`中的`Official`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | -------- | ---------------------------------------- | +| role | num | 认证类型 | 见[用户认证类型一览](official_role.md) | +| title | str | 认证信息 | 无为空 | +| desc | str | 认证备注 | 无为空 | +| type | num | 是否认证 | -1:无
0:UP主认证
1:机构认证 | + +`card`中的`official_verify`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---------------------------------------- | +| type | num | 是否认证 | -1:无
0:UP主认证
1:机构认证 | +| desc | str | 认证信息 | 无为空 | + +`card`中的`vip`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ---------- | ------------------------------------------------- | +| vipType | num | 大会员类型 | 0:无
1:月度大会员
2:年度及以上大会员 | +| dueRemark | str | 空 | **作用尚不明确** | +| accessStatus | num | 0 | **作用尚不明确** | +| vipStatus | num | 大会员状态 | 0:无
1:有 | +| vipStatusWarn | str | 空 | **作用尚不明确** | +| theme_type | num | 0 | **作用尚不明确** | + +`card`中的`space`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ---------------- | ---- | +| s_img | str | 主页头图url 小图 | | +| l_img | str | 主页头图url 正常 | | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/card' \ +--data-urlencode 'mid=2' \ +--data-urlencode 'photo=true' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "card": { + "mid": "2", + "name": "碧诗", + "approve": false, + "sex": "男", + "rank": "20000", + "face": "http://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", + "DisplayRank": "0", + "regtime": 0, + "spacesta": 0, + "birthday": "", + "place": "", + "description": "", + "article": 0, + "attentions": [], + "fans": 969999, + "friend": 234, + "attention": 234, + "sign": "kami.im 直男过气网红 # av362830 “We Are Star Dust”", + "level_info": { + "current_level": 6, + "current_min": 0, + "current_exp": 0, + "next_exp": 0 + }, + "pendant": { + "pid": 0, + "name": "", + "image": "", + "expire": 0, + "image_enhance": "", + "image_enhance_frame": "" + }, + "nameplate": { + "nid": 10, + "name": "见习偶像", + "image": "http://i2.hdslb.com/bfs/face/e93dd9edfa7b9e18bf46fd8d71862327a2350923.png", + "image_small": "http://i2.hdslb.com/bfs/face/275b468b043ec246737ab8580a2075bee0b1263b.png", + "level": "普通勋章", + "condition": "所有自制视频总播放数\u003e=10万" + }, + "Official": { + "role": 2, + "title": "bilibili创始人(站长)", + "desc": "", + "type": 0 + }, + "official_verify": { + "type": 0, + "desc": "bilibili创始人(站长)" + }, + "vip": { + "type": 2, + "status": 1, + "due_date": 3896524800000, + "vip_pay_type": 0, + "theme_type": 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": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", + "vipType": 2, + "vipStatus": 1 + } + }, + "space": { + "s_img": "http://i1.hdslb.com/bfs/space/768cc4fd97618cf589d23c2711a1d1a729f42235.png", + "l_img": "http://i1.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png" + }, + "following": true, + "archive_count": 37, + "article_count": 0, + "follower": 969999, + "like_num": 3547978 + } +} +``` + +
+ +## 登录用户空间详细信息 + +> https://api.bilibili.com/x/space/myinfo + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------- | +| code | num | 返回值 | 0:成功
-101:未登录 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | ------------ | ------------------------ | +| mid | num | mid | | +| name | str | 昵称 | | +| sex | str | 性别 | 男 女 保密 | +| face | str | 头像图片url | | +| sign | str | 签名 | | +| rank | num | 10000 | **作用尚不明确** | +| level | num | 当前等级 | 0-6级 | +| jointime | num | 0 | **作用尚不明确** | +| moral | num | 节操 | 默认70 | +| silence | num | 封禁状态 | 0:正常
1:被封 | +| email_status | num | 已验证邮箱 | 0:未验证
1:已验证 | +| tel_status | num | 已验证手机号 | 0:未验证
1:已验证 | +| identification | num | 1 | **作用尚不明确** | +| vip | obj | 大会员状态 | | +| birthday | num | 生日 | 时间戳 | +| is_tourist | num | 0 | **作用尚不明确** | +| is_fake_account | num | 0 | **作用尚不明确** | +| pin_prompting | num | 0 | **作用尚不明确** | +| is_deleted | num | 0 | **作用尚不明确** | +| coins | num | 硬币数 | | +| following | num | 粉丝数 | | +| follower | num | 粉丝数 | | + +`data`中的`vip`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------- | ---- | ---------------- | ----------------------------------------------- | +| type | num | 会员类型 | 0:无
1:月大会员
2:年度及以上大会员 | +| status | num | 会员状态 | 0:无
1:有 | +| due_date | num | 会员过期时间 | Unix时间戳(毫秒) | +| theme_type | num | 0 | 作用尚不明确 | +| label | obj | 会员标签 | | +| avatar_subscript | num | 是否显示会员图标 | 0:不显示
1:显示 | +| nickname_color | str | 会员昵称颜色 | 颜色码 | + +`vip`中的`label`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------- | ------------------------------------------------------------ | +| path | str | 空 | 作用尚不明确 | +| text | str | 会员名称 | | +| label_theme | str | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员 | + +`data`中的`pendant`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ----------- | -------------------- | +| pid | num | 挂件id | **详细说明有待补充** | +| name | str | 挂件名称 | | +| image | str | 挂件图片url | | +| expire | num | 0 | **作用尚不明确** | + +`data`中的`nameplate`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ---------------- | -------------------- | +| nid | num | 勋章id | **详细说明有待补充** | +| name | str | 勋章名称 | | +| image | str | 挂件图片url 正常 | | +| image_small | str | 勋章图片url 小 | | +| level | str | 勋章等级 | | +| condition | str | 勋章条件 | | + +`data`中的`Official`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | -------- | ------------------------------------------------- | +| role | num | 认证类型 | 见[用户认证类型一览](official_role.md) | +| title | str | 认证信息 | 无为空 | +| desc | str | 认证备注 | 无为空 | +| type | num | 是否认证 | -1:无
0:认证 | + +`data`中的`level_exp`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | -------- | ---------------- | +| current_level | num | 当前等级 | 0-6级 | +| current_min | num | 0 | 指当前等级从多少经验值开始 | +| current_exp | num | 0 | 当前账户的经验值 | +| next_exp | num | 0 | 下一个等级所需的经验值**(不是还需要多少)** | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/space/myinfo' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "mid": 293793435, + "name": "社会易姐QwQ", + "sex": "男", + "face": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "sign": "高考刚结束的普通技术宅一枚,喜欢MC和编程以及电子,是车车人也是术术人,粉丝群:1136462265", + "rank": 10000, + "level": 5, + "jointime": 0, + "moral": 70, + "silence": 0, + "email_status": 1, + "tel_status": 1, + "identification": 1, + "vip": { + "type": 2, + "status": 1, + "due_date": 1644163200000, + "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": 2511, + "name": "初音未来13周年", + "image": "http://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", + "expire": 0, + "image_enhance": "http://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", + "image_enhance_frame": "http://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png" + }, + "nameplate": { + "nid": 4, + "name": "青铜殿堂", + "image": "http://i0.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", + "image_small": "http://i0.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", + "level": "普通勋章", + "condition": "单个自制视频总播放数\u003e=1万" + }, + "official": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "birthday": 1015257600, + "is_tourist": 0, + "is_fake_account": 0, + "pin_prompting": 0, + "is_deleted": 0, + "in_reg_audit": 0, + "is_rip_user": false, + "profession": { + "id": 0, + "name": "", + "show_name": "" + }, + "level_exp": { + "current_level": 5, + "current_min": 10800, + "current_exp": 27125, + "next_exp": 28800 + }, + "coins": 9, + "following": 1122, + "follower": 1122 + } +} +``` + +
+ +## 多用户详细信息 + +> https://api.bilibili.com/x/polymer/pc-electron/v1/user/cards + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------------- | ------ | ---------------------------------- | +| uids | nums | 目标用户的mid列表 | 必要 | 每个成员间用`,`分隔,最多50个成员 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----- | -------- | -------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
40143:批量大小超过限制 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | 用户信息随机排序 | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ----------------------- | ---- | +| {用户mid} | obj | 该mid对应的用户信息 | | +| …… | obj | …… | …… | + +`data`中的`{用户mid}`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ------------------- | -------------------- | +| mid | str | mid | | +| face | str | 头像链接 | | +| name | str | 昵称 | | +| official | obj | 认证信息 | 基本同「[用户空间详细信息](#用户空间详细信息)」中的 `data.official` 对象 | +| vip | obj | 会员信息 | 基本同「[用户空间详细信息](#用户空间详细信息)」中的 `data.vip` 对象,其中有些类型为 `num` 的字段在本接口中类型为 `str` | +| name_render | 有效时:obj
无效时:null | 昵称渲染信息 | | + +`{用户mid}`中的`name_render`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | --------------------------- | ---------------- | +| colors_info | obj | 昵称颜色信息(?) | **作用尚不明确** | +| render_scheme | str | `"Default"` 或 `"Colorful"` | **作用尚不明确** | + +`name_render`中的`colors_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | -------------- | ---------------- | +| color | array | 昵称颜色(?) | **作用尚不明确** | +| color_ids | array | `["6"]` | **作用尚不明确** | + +`color`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 颜色1 | | +| n | obj | 颜色(n+1) | | +| …… | obj | …… | …… | + +`color`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ---------------- | ---------------- | +| color_day | str | 浅色模式昵称颜色 | HEX颜色代码 | +| color_night | str | 深色模式昵称颜色 | HEX颜色代码 | + +**示例:** + +查询用户`uids=1,2,3`的详细信息 + +```shell +curl -G 'https://api.bilibili.com/x/polymer/pc-electron/v1/user/cards' \ +--data-urlencode 'uids=1,2,3' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "1": { + "mid": "1", + "face": "http://i1.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", + "name": "bishi", + "official": { + "desc": "", + "role": 0, + "title": "", + "type": -1 + }, + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": "1912521600000", + "nickname_color": "#FB7299", + "role": "7", + "status": 1, + "theme_type": 0, + "type": 2, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", + "label_theme": "ten_annual_vip", + "path": "", + "text": "十年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + } + }, + "name_render": null + }, + "2": { + "mid": "2", + "face": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", + "name": "碧诗", + "official": { + "desc": "", + "role": 2, + "title": "bilibili创始人(站长)", + "type": 0 + }, + "vip": { + "avatar_subscript": 1, + "avatar_subscript_url": "", + "due_date": "3995625600000", + "nickname_color": "#FB7299", + "role": "7", + "status": 1, + "theme_type": 0, + "type": 2, + "label": { + "bg_color": "#FB7299", + "bg_style": 1, + "border_color": "", + "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png", + "label_theme": "ten_annual_vip", + "path": "", + "text": "十年大会员", + "text_color": "#FFFFFF", + "use_img_label": true + } + }, + "name_render": null + }, + "3": { + "mid": "3", + "face": "http://i0.hdslb.com/bfs/face/d4de6a84557eea8f18510a3f61115d96832aa071.jpg", + "name": "囧囧倉", + "official": { + "desc": "", + "role": 0, + "title": "", + "type": -1 + }, + "vip": { + "avatar_subscript": 0, + "avatar_subscript_url": "", + "due_date": "0", + "nickname_color": "", + "role": "0", + "status": 0, + "theme_type": 0, + "type": 0, + "label": { + "bg_color": "", + "bg_style": 0, + "border_color": "", + "img_label_uri_hans": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant": "", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", + "label_theme": "", + "path": "", + "text": "", + "text_color": "", + "use_img_label": true + } + }, + "name_render": null + } + } +} +``` + +
+ +## 多用户详细信息2 + +> https://api.vc.bilibili.com/account/v1/user/cards + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +本接口较其他接口相比,只会返回非常有限的信息 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------------- | ------ | --------------------------------------------------------------------- | +| uids | nums | 目标用户的mid列表 | 必要 | 每个成员间用`,`分隔,最多50个成员,若超过此限制则返回的`data`数组为空 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | array | 信息本体 | 用户信息随机排序 | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---- | +| 0 | obj | 用户1 | | +| n | obj | 用户(n+1) | | +| …… | obj | …… | …… | + +`data`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ------------ | -------------------- | +| mid | num | mid | | +| name | str | 昵称 | | +| face | str | 头像链接 | | +| sign | str | 签名 | | +| rank | num | 用户权限等级 | | +| level | num | 当前等级 | 0-6 级 | +| silence | num | 封禁状态 | 0:正常
1:被封 | + +**示例:** + +查询用户`uids=1,2,3`的详细信息 + +```shell +curl -G 'https://api.vc.bilibili.com/account/v1/user/cards' \ +--data-urlencode 'uids=1,2,3' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "mid": 3, + "name": "囧囧倉", + "face": "http://i0.hdslb.com/bfs/face/d4de6a84557eea8f18510a3f61115d96832aa071.jpg", + "sign": "富强、民主、文明、和谐、自由、平等、公正、法治、爱国、敬业、诚信、友善。", + "rank": 10000, + "level": 6, + "silence": 0 + }, + { + "mid": 2, + "name": "碧诗", + "face": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", + "sign": "https://kami.im 直男过气网红 # We Are Star Dust", + "rank": 20000, + "level": 6, + "silence": 0 + }, + { + "mid": 1, + "name": "bishi", + "face": "http://i1.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", + "sign": "", + "rank": 10000, + "level": 6, + "silence": 0 + } + ] +} +``` + +
diff --git a/docs/user/medals.md b/docs/user/medals.md new file mode 100644 index 0000000..d2374bc --- /dev/null +++ b/docs/user/medals.md @@ -0,0 +1,822 @@ +# 所有粉丝勋章 + +## 指定用户的所有粉丝勋章信息 + +> https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall + +*请求方法: GET* + +认证方式: Cookie (SESSDATA) + + + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | -------- | ------ | ---- | +| target_id | num | 目标 mid | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0: 成功
-101: 账号未登录 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | 失败时不存在 | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ----- | --------------------- | ----- | +| list | array | 勋章列表 | | +| count | num | 勋章数 | | +| close_space_medal | num | 关闭空间粉丝勋章显示? | 0: 否 | +| only_show_wearing | num | 只显示当前佩戴的? | 0: 否 | +| name | str | 目标用户名 | | +| icon | str | 目标用户头像 URL | | +| uid | num | 目标用户 mid | | +| level | num | 目标用户等级 | | + +`data` 对象中 `list` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ------------ | ---- | +| medal_info | obj | 勋章信息 | | +| target_name | str | 主播名称 | | +| target_icon | str | 主播头像 URL | | +| link | str | 主播主页 URL | | +| live_status | num | 直播状态 | 0: 未直播
1: 正在直播
2: 轮播中 | +| offical | num | 主播认证类型 | 参见 [用户认证类型一览](official_role.md) | +| uinfo_medal | str | 用户勋章信息 | | + +`list` 数组中的对象中的 `medal_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | -------- | ---- | +| target_id | num | 主播 mid | | +| level | num | 勋章等级 | | +| medal_name | str | 勋章名称 | | +| medal_color_start | num | 勋章开始颜色 | 十进制(自行转换为16进制) | +| medal_color_end | num | 勋章结束颜色 | 同上 | +| medal_color_border | num | 勋章边框颜色 | 同上 | +| guard_level | num | 守护等级? | 1: 总督
2: 提督
3: 舰长 | +| wearing_status | num | 佩戴状态 | 0: 未佩戴
1: 佩戴中 | +| medal_id | num | 勋章 ID | | +| intimacy | num | 当前亲密度 | | +| next_intimacy | num | 下一等级所需亲密度 | | +| today_feed | num | 今日已获得亲密度 | | +| day_limit | num | 亲密度每日上限? | | +| guard_icon | str | 守护徽章图标 URL? | | +| honor_icon | str | 荣誉徽章图标 URL? | | + +`list` 数组中的对象中的 `uinfo_medal` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ---- | ---- | +| name | str | 勋章名称 | | +| level | num | 勋章等级 | | +| color_start | num | 勋章渐变开始颜色 | 十进制(自行转换为16进制) | +| color_end | num | 勋章渐变结束颜色 | 同上 | +| color_border | num | 勋章边框颜色 | 同上 | +| color | num | 勋章颜色 | 同上 | +| id | num | 勋章 ID | | +| typ | num | 勋章类型? | | +| is_light | num | 是否点亮? | | +| ruid | num | 主播 mid | | +| guard_level | num | 大航海等级 | 1: 总督
2: 提督
3: 舰长 | +| score | num | 勋章分数? | | +| guard_icon | str | 大航海图标 URL? | 粉丝牌左边的图标 | +| honor_icon | str | 荣誉徽章图标 URL? | | +| v2_medal_color_start | str | 勋章开始颜色 | 16进制 | +| v2_medal_color_end | str | 勋章结束颜色 | 同上 | +| v2_medal_color_border | str | 勋章边框颜色 | 同上 | +| v2_medal_color_text | str | 勋章文本色 | 同上 | +| v2_medal_color_level | str | 勋章等级颜色 | 同上 | +| user_receive_count | num | 勋章已获得数量? | | + +**示例:** + +```shell +curl -G 'https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall' \ +--url-query 'target_id=293793435' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "medal_info": { + "target_id": 178429408, + "level": 3, + "medal_name": "滑稽果", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 1, + "medal_id": 113190, + "intimacy": 248, + "next_intimacy": 500, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "老弟一号", + "target_icon": "https://i1.hdslb.com/bfs/face/21426275f3d3149b96b88783275205ba574c09e3.jpg", + "link": "https://space.bilibili.com/178429408", + "live_status": 2, + "official": 1, + "uinfo_medal": { + "name": "滑稽果", + "level": 3, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 113190, + "typ": 0, + "is_light": 1, + "ruid": 178429408, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 15858903, + "level": 9, + "medal_name": "二技猿", + "medal_color_start": 9272486, + "medal_color_end": 9272486, + "medal_color_border": 9272486, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 159670, + "intimacy": 168, + "next_intimacy": 1900, + "today_feed": 0, + "day_limit": 3000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "暮光小猿wzt", + "target_icon": "https://i0.hdslb.com/bfs/face/4113913241f83b03301c316fec6e4c3923bef64e.jpg", + "link": "https://space.bilibili.com/15858903", + "live_status": 0, + "official": 0, + "uinfo_medal": { + "name": "二技猿", + "level": 9, + "color_start": 9272486, + "color_end": 9272486, + "color_border": 9272486, + "color": 0, + "id": 159670, + "typ": 0, + "is_light": 1, + "ruid": 15858903, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#596FE099", + "v2_medal_color_end": "#596FE099", + "v2_medal_color_border": "#596FE099", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 24022863, + "level": 7, + "medal_name": "粉丝团", + "medal_color_start": 6126494, + "medal_color_end": 6126494, + "medal_color_border": 6126494, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 233401, + "intimacy": 1499, + "next_intimacy": 1600, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "黄禄轩电脑专用账号", + "target_icon": "https://i0.hdslb.com/bfs/face/a70ec7d2a3822980a915ef4b30371af0cbc79132.jpg", + "link": "https://space.bilibili.com/24022863", + "live_status": 2, + "official": 0, + "uinfo_medal": { + "name": "粉丝团", + "level": 7, + "color_start": 6126494, + "color_end": 6126494, + "color_border": 6126494, + "color": 0, + "id": 233401, + "typ": 0, + "is_light": 1, + "ruid": 24022863, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5866C799", + "v2_medal_color_end": "#5866C799", + "v2_medal_color_border": "#5866C799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 1347373376, + "level": 6, + "medal_name": "Geek范", + "medal_color_start": 6126494, + "medal_color_end": 6126494, + "medal_color_border": 6126494, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 658512, + "intimacy": 999, + "next_intimacy": 1500, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "GeekLogic", + "target_icon": "https://i2.hdslb.com/bfs/face/fc4ba4087efa80dce11dfdd1c2bc07d84fb603b9.jpg", + "link": "https://space.bilibili.com/1347373376", + "live_status": 0, + "official": 1, + "uinfo_medal": { + "name": "Geek范", + "level": 6, + "color_start": 6126494, + "color_end": 6126494, + "color_border": 6126494, + "color": 0, + "id": 658512, + "typ": 0, + "is_light": 1, + "ruid": 1347373376, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5866C799", + "v2_medal_color_end": "#5866C799", + "v2_medal_color_border": "#5866C799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 451664, + "level": 5, + "medal_name": "粉丝团", + "medal_color_start": 6126494, + "medal_color_end": 6126494, + "medal_color_border": 6126494, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 408689, + "intimacy": 799, + "next_intimacy": 1000, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "刘师兄_liujun", + "target_icon": "https://i2.hdslb.com/bfs/face/90665d1613cc5501a3f7bbc79b5dc83bcc30667d.jpg", + "link": "https://space.bilibili.com/451664", + "live_status": 0, + "official": 0, + "uinfo_medal": { + "name": "粉丝团", + "level": 5, + "color_start": 6126494, + "color_end": 6126494, + "color_border": 6126494, + "color": 0, + "id": 408689, + "typ": 0, + "is_light": 1, + "ruid": 451664, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5866C799", + "v2_medal_color_end": "#5866C799", + "v2_medal_color_border": "#5866C799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 89240844, + "level": 5, + "medal_name": "六零", + "medal_color_start": 6126494, + "medal_color_end": 6126494, + "medal_color_border": 6126494, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 306526, + "intimacy": 799, + "next_intimacy": 1000, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "A60_OnE", + "target_icon": "https://i0.hdslb.com/bfs/face/483513f7b0533d666fdf7eff96a70b69992056fd.jpg", + "link": "https://space.bilibili.com/89240844", + "live_status": 0, + "official": 0, + "uinfo_medal": { + "name": "六零", + "level": 5, + "color_start": 6126494, + "color_end": 6126494, + "color_border": 6126494, + "color": 0, + "id": 306526, + "typ": 0, + "is_light": 1, + "ruid": 89240844, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5866C799", + "v2_medal_color_end": "#5866C799", + "v2_medal_color_border": "#5866C799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 1850091, + "level": 5, + "medal_name": "観測者", + "medal_color_start": 6126494, + "medal_color_end": 6126494, + "medal_color_border": 6126494, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 118910, + "intimacy": 98, + "next_intimacy": 1000, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "Jannchie见齐", + "target_icon": "https://i0.hdslb.com/bfs/face/983034448f81f45f05956d0455a86fe0639d6a36.jpg", + "link": "https://space.bilibili.com/1850091", + "live_status": 2, + "official": 1, + "uinfo_medal": { + "name": "観測者", + "level": 5, + "color_start": 6126494, + "color_end": 6126494, + "color_border": 6126494, + "color": 0, + "id": 118910, + "typ": 0, + "is_light": 1, + "ruid": 1850091, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5866C799", + "v2_medal_color_end": "#5866C799", + "v2_medal_color_border": "#5866C799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 4911405, + "level": 4, + "medal_name": "毛狐狸", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 18887, + "intimacy": 658, + "next_intimacy": 700, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "粉毛变态老狐狸", + "target_icon": "https://i0.hdslb.com/bfs/face/5924e9201ac87066e76534472303b636a9961647.jpg", + "link": "https://space.bilibili.com/4911405", + "live_status": 0, + "official": 0, + "uinfo_medal": { + "name": "毛狐狸", + "level": 4, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 18887, + "typ": 0, + "is_light": 1, + "ruid": 4911405, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 130914376, + "level": 3, + "medal_name": "江草", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 166326, + "intimacy": 463, + "next_intimacy": 500, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "江灵夏草", + "target_icon": "https://i1.hdslb.com/bfs/face/63eb615514fddbc6024a34ddcacfb0bc6103d019.jpg", + "link": "https://space.bilibili.com/130914376", + "live_status": 0, + "official": 1, + "uinfo_medal": { + "name": "江草", + "level": 3, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 166326, + "typ": 0, + "is_light": 1, + "ruid": 130914376, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 316568752, + "level": 3, + "medal_name": "SEAL", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 312420, + "intimacy": 428, + "next_intimacy": 500, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "马督工", + "target_icon": "https://i1.hdslb.com/bfs/face/1c56737dfc0deffffc31c78e0cefb0c3ecf7e000.jpg", + "link": "https://space.bilibili.com/316568752", + "live_status": 0, + "official": 1, + "uinfo_medal": { + "name": "SEAL", + "level": 3, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 312420, + "typ": 0, + "is_light": 1, + "ruid": 316568752, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 633003, + "level": 3, + "medal_name": "器材党", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 57027, + "intimacy": 198, + "next_intimacy": 500, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "和光Channel", + "target_icon": "https://i0.hdslb.com/bfs/face/c34413202f3f4ab6c7955a2c9ca5a9ac8e86d8c2.jpg", + "link": "https://space.bilibili.com/633003", + "live_status": 0, + "official": 0, + "uinfo_medal": { + "name": "器材党", + "level": 3, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 57027, + "typ": 0, + "is_light": 1, + "ruid": 633003, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 5760446, + "level": 2, + "medal_name": "花泪", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 32283, + "intimacy": 298, + "next_intimacy": 300, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "花儿不哭", + "target_icon": "https://i2.hdslb.com/bfs/face/4f220d57ca877167f3efdc60e40d0cb53ca58b72.jpg", + "link": "https://space.bilibili.com/5760446", + "live_status": 0, + "official": 1, + "uinfo_medal": { + "name": "花泪", + "level": 2, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 32283, + "typ": 0, + "is_light": 1, + "ruid": 5760446, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 3644545, + "level": 2, + "medal_name": "东方狗", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 249059, + "intimacy": 98, + "next_intimacy": 300, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "白倉カナ", + "target_icon": "https://i1.hdslb.com/bfs/face/ae839f221a5812683fe0a3967f4a612dd65a05d2.jpg", + "link": "https://space.bilibili.com/3644545", + "live_status": 0, + "official": 0, + "uinfo_medal": { + "name": "东方狗", + "level": 2, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 249059, + "typ": 0, + "is_light": 1, + "ruid": 3644545, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 614801, + "level": 1, + "medal_name": "神油", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 627, + "intimacy": 119, + "next_intimacy": 201, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "神游八方", + "target_icon": "https://i2.hdslb.com/bfs/face/98f8e0f609ff2403cc086f7254f388336b6f5366.jpg", + "link": "https://space.bilibili.com/614801", + "live_status": 0, + "official": 1, + "uinfo_medal": { + "name": "神油", + "level": 1, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 627, + "typ": 0, + "is_light": 1, + "ruid": 614801, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + }, + { + "medal_info": { + "target_id": 12246, + "level": 1, + "medal_name": "纯色派", + "medal_color_start": 6067854, + "medal_color_end": 6067854, + "medal_color_border": 6067854, + "guard_level": 0, + "wearing_status": 0, + "medal_id": 5171, + "intimacy": 99, + "next_intimacy": 201, + "today_feed": 0, + "day_limit": 2000, + "guard_icon": "", + "honor_icon": "" + }, + "target_name": "囧仙", + "target_icon": "https://i0.hdslb.com/bfs/face/b7ee967282a33a59908218df5b240b45f51afda8.jpg", + "link": "https://space.bilibili.com/12246", + "live_status": 0, + "official": 1, + "uinfo_medal": { + "name": "纯色派", + "level": 1, + "color_start": 6067854, + "color_end": 6067854, + "color_border": 6067854, + "color": 0, + "id": 5171, + "typ": 0, + "is_light": 1, + "ruid": 12246, + "guard_level": 0, + "score": 0, + "guard_icon": "", + "honor_icon": "", + "v2_medal_color_start": "#5762A799", + "v2_medal_color_end": "#5762A799", + "v2_medal_color_border": "#5762A799", + "v2_medal_color_text": "#FFFFFFFF", + "v2_medal_color_level": "#000B7099", + "user_receive_count": 0 + } + } + ], + "count": 15, + "close_space_medal": 0, + "only_show_wearing": 0, + "name": "社会易姐QwQ", + "icon": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", + "uid": 645769214, + "level": 6 + } +} +``` + +
diff --git a/docs/user/official_role.md b/docs/user/official_role.md new file mode 100644 index 0000000..fb70aac --- /dev/null +++ b/docs/user/official_role.md @@ -0,0 +1,12 @@ +# 用户认证类型一览 +| ID | 认证类型 | 详细类型 | +| -- | ------- | ------- | +| 0 | 无 | | +| 1 | 个人认证 | 知名UP主 | +| 2 | 个人认证 | 大V达人 | +| 3 | 机构认证 | 企业 | +| 4 | 机构认证 | 组织 | +| 5 | 机构认证 | 媒体 | +| 6 | 机构认证 | 政府 | +| 7 | 个人认证 | 高能主播 | +| 9 | 个人认证 | 社会知名人士 | \ No newline at end of file diff --git a/docs/user/register.md b/docs/user/register.md new file mode 100644 index 0000000..21be1d6 --- /dev/null +++ b/docs/user/register.md @@ -0,0 +1,100 @@ +# 用户注册 + +## 人机验证 + +[完成人机验证(参考验证登录)](../login/login_action/readme.md#验证登录) + +完成后得到`key`, `challenge`, `validate`, `seccode`四个参数 + +## 发送短信验证码 + +[发送短信验证码(参考短信登录)](../login/login_action/SMS.md#发送短信验证码(web端)) + +**注意不同的是这里type=1而非21**,推测此参数决定短信内容 + +```bash +curl 'https://passport.bilibili.com/web/sms/general/v2/send' \ + --data-urlencode 'key=6eeb28e7bbd64b389da2be3a2778c7e3' \ + --data-urlencode 'captchaType=6' \ + --data-urlencode 'type=1' \ + --data-urlencode 'cid=1' \ + --data-urlencode 'tel=13888888888' \ + --data-urlencode 'challenge=c52148f88a28b6011db52bb213483ee8' \ + --data-urlencode 'validate=a98841cd6ea58e1b1f5783fca73cddb6' \ + --data-urlencode 'seccode=a98841cd6ea58e1b1f5783fca73cddb6|jordan' +``` + +
+查看示例 + +```json +{ + "code": 0, + "message": "验证码短信已下发" +} +``` + +
+ +## 提交注册请求 + +> https://passport.bilibili.com/web/reg/tel + +*请求方式:POST* + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------- | ---- | ---------------- | ------ | ------------------------------------------------------------ | +| cid | num | 国际冠字码 | 必要 | 可以从 [获取国际冠字码](../login/login_action/SMS.md#获取国际冠字码_web端) 接口中获取 | +| tel | num | 手机号码 | 必要 | | +| code | num | 短信验证码 | 必要 | | +| nickName | str | 昵称 | 必要 | | +| pwd | str | 密码 | 必要 | 密码为明文 | +| plat | num | 0 | 必要 | 平台? | +| gourl | str | 注册成功跳转地址 | 非必要 | 默认为主页`https://www.bilibili.com/` | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------------------------- | +| code | num | 返回值 | 0:成功
1005:验证码错误
1007:验证码过期 | +| message | str | 错误信息 | 成功时无此字段 | +| data | obj | 信息本体 | 只在成功时存在 | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ---------- | ----------------------------- | +| redirectUrl | str | 跳转链接 | | +| hint | str | "注册成功" | 成功后不提示成功还能提示什么? | +| in_reg_audit | num | (?) | | + +```bash +curl 'https://passport.bilibili.com/web/reg/tel' \ + --data-urlencode 'plat=0' \ + --data-urlencode 'cid=1' \ + --data-urlencode 'tel=13888888888' \ + --data-urlencode 'code=121314' \ + --data-urlencode 'nickName=萌系小妹纸わ' + --data-urlencode 'pwd=Password1234' \ + --data-urlencode 'gourl=https://www.bilibili.com' +``` + +
+查看示例 + +```json +{ + "code": 0, + "data": { + "redirectUrl": "https://www.bilibili.com", + "hint": "注册成功", + "in_reg_audit": 0 + } +} +``` + +
\ No newline at end of file diff --git a/docs/user/relation.md b/docs/user/relation.md new file mode 100644 index 0000000..6b5d143 --- /dev/null +++ b/docs/user/relation.md @@ -0,0 +1,2648 @@ +# 用户关系相关 + +## 查询关系列表 + + + +### 关系列表对象 + +以下说明中的 “目标用户” 指被查询的用户,“对方” 指返回的关系列表中的用户。 + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ------------------------------------------- | -------------------------- | ------------------------------------------------------------ | +| mid | num | 用户 mid | | +| attribute | num | 对方对于**自己**的关系属性 | 0:未关注
~~1:悄悄关注(现已下线)~~
2:已关注
6:已互粉
128:已拉黑 | +| mtime | num | 对方关注目标用户时间 | 秒级时间戳
互关后刷新 | +| tag | 默认分组:null
存在至少一个分组:array | 目标用户将对方分组到的 id | | +| special | num | 目标用户特别关注对方标识 | 0:否
1:是 | +| contract_info | obj | 契约计划相关信息 | | +| uname | str | 用户昵称 | | +| face | str | 用户头像url | | +| sign | str | 用户签名 | | +| face_nft | num | 是否为 NFT 头像 | 0:非 NFT 头像
1:NFT 头像 | +| official_verify | obj | 认证信息 | | +| vip | obj | 会员信息 | | +| name_render | 有效时:obj
无效时:null | 昵称渲染信息 | | +| nft_icon | str | (?) | | +| rec_reason | str | 推荐该用户的原因 | 大多数情况下为空;如:`xxx关注了TA`、`xx粉丝 xx视频` | +| track_id | str | 内部记录id | 大多数情况下为空;如:`up_rec_0.router-main-2021485-5f84c987cf-dv8fg.1746380060327.607` | +| follow_time | str | (?) | | + +`list`中的对象中的`tag`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------------------ | ---- | +| 0 | num | 位于分组 1 的分组 id | | +| n | num | 位于分组(n+1)的分组 id | | +| …… | num | …… | …… | + +`list`中的对象中的`contract_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------------------------ | ----------------------------------------------------------- | +| is_contract | bool | 目标用户是否为对方的契约者 | 仅当为 `true` 时才有此项 | +| is_contractor | bool | 对方是否为目标用户的契约者 | 仅当为 `true` 时才有此项 | +| ts | num | 对方成为目标用户的契约者的时间 | 秒级时间戳,仅当 `is_contractor` 项的值为 `true` 时才有此项 | +| user_attr | num | 对方作为目标用户的契约者的属性 | 1:老粉
否则为原始粉丝
仅当有特殊属性时才有此项 | + +`list`中的对象中的`official_verify`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------ | ------------------- | +| type | num | 用户认证类型 | -1:无
0:UP 主认证
1:机构认证 | +| desc | str | 用户认证信息 | 无为空 | + +`list`中的对象中的`vip`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------ | ----------------------------------------------- | +| vipType | num | 会员类型 | 0:无
1:月度大会员
2:年度以上大会员 | +| vipDueDate | num | 会员到期时间 | 时间戳 毫秒 | +| dueRemark | str | (?) | | +| accessStatus | num | (?) | | +| vipStatus | num | 大会员状态 | 0:无
1:有 | +| vipStatusWarn | str | (?) | | +| themeType | num | (?) | | +| label | obj | (?) | | + +`vip`中的`label`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | ---- | +| path | str | (?) | | + +### 查询用户粉丝明细(新) + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +本接口只有登录、标头 `referer` 为 `bilibili.com` 下的子域名、UA 不含 `python` 时才会返回列表 + +由于接口实现不同,本接口的返回可能出现以下三种情况: + +1. 返回列表按关注时间排序,此时当前用户**仅返回前 1000 名粉丝**,其他用户仅返回前 100 名粉丝,若继续往后查询则返回空列表 +2. 返回列表按粉丝 mid 的**文本形式**排序,此时对于任意用户均可返回全部粉丝 +3. 返回列表按照**智能推荐算法**排序,此时请求参数 `from=main` 且目标用户为自己,**仅返回前 1000 名粉丝** + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| -------------- | ---- | ---------------------- | ------------ | ------------------------------------------------------------------- | +| vmid | num | 目标用户 mid | 必要 | | +| ps | num | 每页项数 | 非必要 | 默认为 50 | +| pn | num | 页码 | 非必要 | 默认为 1 | +| offset | str | 偏移量 | 非必要 | 从上次请求的响应数据中的 `data.offset` 获取
此项有效且不为 `rcmd` 时会从此偏移量开始返回粉丝列表,忽略参数 `pn` | +| last_access_ts | num | 上次访问粉丝列表的时间 | 非必要 | 秒级时间戳,从[获取自己粉丝列表的未读状态](#获取自己粉丝列表的未读状态)接口获取
当按照**智能推荐算法**排序时,会优先展示此时间后关注的粉丝 | +| from | str | 请求来源 | 非必要 | 当为 `main` 且目标用户为自己时,粉丝列表按照**智能推荐算法**排序,此时响应数据中的 `data.list` 的成员中的 `rec_reason` 与 `track_id` 为非空 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-352:请求被拦截
-400:请求错误
22118:由于该用户隐私设置,粉丝列表不可见 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| list | array | 明细列表 | | +| offset | str | 偏移量 | 供下次请求使用
普通:`{列表最后的粉丝的 mtime}:{列表最后的粉丝的 mid}`
智能推荐算法:`rcmd` | +| re_version | num | (?) | | +| total | num | 粉丝总数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------ | ---------------------------------- | +| 0 | obj | 粉丝 1 | 详见 [关系列表对象](#关系列表对象) | +| n | obj | 粉丝 (n+1) | | +| …… | obj | …… | …… | + +**示例:** + +获取用户`mid=293793435`的粉丝明细 + +```shell +curl -G 'https://api.bilibili.com/x/relation/fans' \ + --data-urlencode 'vmid=293793435' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "mid": 289796932, + "attribute": 0, + "mtime": 1746199088, + "tag": null, + "special": 0, + "contract_info": {}, + "uname": "Astlinga_星灵", + "face": "https://i1.hdslb.com/bfs/face/005264524d05c0b8c132acc3ee88bb839351025b.jpg", + "sign": "", + "face_nft": 0, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1734278400000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "" + }, + "avatar_subscript": 0, + "nickname_color": "", + "avatar_subscript_url": "" + }, + "name_render": {}, + "nft_icon": "", + "rec_reason": "", + "track_id": "", + "follow_time": "" + }, + { + "mid": 3494375621396821, + "attribute": 0, + "mtime": 1746098997, + "tag": null, + "special": 0, + "contract_info": {}, + "uname": "JSRCode", + "face": "https://i1.hdslb.com/bfs/face/f6c74700c72d27ae224c5311634b4a3770e3cdcf.jpg", + "sign": "一个喜欢码代码的高中牲", + "face_nft": 0, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 0, + "vipDueDate": 0, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "" + }, + "avatar_subscript": 0, + "nickname_color": "", + "avatar_subscript_url": "" + }, + "name_render": {}, + "nft_icon": "", + "rec_reason": "", + "track_id": "", + "follow_time": "" + } + ], + "offset": "1746098997:3494375621396821", + "re_version": 0, + "total": 3776 + } +} +``` + +
+ +### 查询用户粉丝明细(旧) + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +本接口只有登录、标头 `referer` 为 `bilibili.com` 下的子域名、UA 不含 `python` 时才会返回列表 + +**本接口仅可返回前 1000 名粉丝**,若继续往后查询则返回空列表 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ------------------------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| vmid | num | 目标用户 mid | 必要 | | +| ps | num | 每页项数 | 非必要 | 默认为 50 | +| pn | num | 页码 | 非必要 | 默认为 1
仅可查看前 1000 名粉丝 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-352:请求被拦截
-400:请求错误
22118:由于该用户隐私设置,粉丝列表不可见 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| list | array | 明细列表 | | +| re_version | num | (?) | | +| total | num | 粉丝总数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------ | ---------------------------------- | +| 0 | obj | 粉丝 1 | 详见 [关系列表对象](#关系列表对象) | +| n | obj | 粉丝 (n+1) | 按照添加顺序排列 | +| …… | obj | …… | …… | + +**示例:** + +获取用户`mid=293793435`的粉丝明细 + +```shell +curl -G 'https://api.bilibili.com/x/relation/followers' \ + --data-urlencode 'vmid=293793435' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "mid": 289796932, + "attribute": 0, + "mtime": 1746199088, + "tag": null, + "special": 0, + "contract_info": {}, + "uname": "Astlinga_星灵", + "face": "https://i1.hdslb.com/bfs/face/005264524d05c0b8c132acc3ee88bb839351025b.jpg", + "sign": "", + "face_nft": 0, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1734278400000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "" + }, + "avatar_subscript": 0, + "nickname_color": "", + "avatar_subscript_url": "" + }, + "name_render": {}, + "nft_icon": "", + "rec_reason": "", + "track_id": "", + "follow_time": "" + }, + { + "mid": 3494375621396821, + "attribute": 0, + "mtime": 1746098997, + "tag": null, + "special": 0, + "contract_info": {}, + "uname": "JSRCode", + "face": "https://i1.hdslb.com/bfs/face/f6c74700c72d27ae224c5311634b4a3770e3cdcf.jpg", + "sign": "一个喜欢码代码的高中牲", + "face_nft": 0, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 0, + "vipDueDate": 0, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "" + }, + "avatar_subscript": 0, + "nickname_color": "", + "avatar_subscript_url": "" + }, + "name_render": {}, + "nft_icon": "", + "rec_reason": "", + "track_id": "", + "follow_time": "" + } + ], + "re_version": 0, + "total": 3776 + } +} +``` + +
+ +### 获取自己粉丝列表的未读状态 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +调用此接口后会重置未读状态 + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | -------------------------- | ---------------------------------- | +| count | num | 自上次访问后新增的粉丝个数 | | +| time | num | 上次访问粉丝列表时间 | 秒级时间戳;当没有新增粉丝时为 `0` | + +**示例:** + +```shell +curl 'https://api.bilibili.com/x/relation/followers/unread/count' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "count": 55, + "time": 1743677191 + } +} +``` + +
+ +### 查询用户关注明细 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +本接口只有登录、标头 `referer` 为 `bilibili.com` 下的子域名、UA 不含 `python` 时才会返回列表 + +登录可看当前用户全部,其他用户仅可查看前 100 个,访问超过 100 个时返回空列表(但 `code` 值为 `0`) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ------------------------------------------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| vmid | num | 目标用户 mid | 必要 | | +| order_type | str | 排序方式 | 非必要 | 当目标用户为自己时有效
按照关注顺序排列:留空
按照最常访问排列:attention | +| ps | num | 每页项数 | 非必要 | 默认为 50 | +| pn | num | 页码 | 非必要 | 默认为 1
其他用户仅可查看前 100 个 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-352:请求被拦截
-400:请求错误
22115:用户已设置隐私,无法查看 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| list | array | 明细列表 | | +| re_version | num | (?) | | +| total | num | 关注总数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | -------------------------------- | +| 0 | obj | 关注1 | 见 [关系列表对象](#关系列表对象) | +| n | obj | 关注(n+1) | 按照添加顺序排列 | +| …… | obj | …… | …… | + +**示例:** + +获取用户`mid=293793435`的关注明细,按照关注顺序 + +```shell +curl -G 'https://api.bilibili.com/x/relation/followings' \ + --data-urlencode 'vmid=293793435' \ + --data-urlencode 'order_type=' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [{ + "mid": 14082, + "attribute": 2, + "mtime": 1584271945, + "tag": null, + "special": 0, + "contract_info": {}, + "uname": "山新", + "face": "https://i0.hdslb.com/bfs/face/74c82caee6d9eb623e56161ea8ed6d68afabfeae.jpg", + "sign": "都说了是天依爹地,不是妈咪。\r私信有点多回复不过来~商业合作啥的请移步Weibo私信@山新 哦哦哦~", + "official_verify": { + "type": 0, + "desc": "配音演员、声优。洛天依声源提供者。" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1601654400000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + }, + "avatar_subscript": 1, + "nickname_color": "#FB7299", + "avatar_subscript_url": "" + }, + "name_render": {}, + "nft_icon": "", + "rec_reason": "", + "track_id": "", + "follow_time": "" + }, { + "mid": 420831218, + "attribute": 2, + "mtime": 1584208169, + "tag": [207542], + "special": 0, + "contract_info": {}, + "uname": "支付宝Alipay", + "face": "https://i2.hdslb.com/bfs/face/aaf18aeb2d9822e28a590bd8d878572ca8c59e04.jpg", + "sign": "阿支来了,关注点赞转发投币四连走起!", + "official_verify": { + "type": 1, + "desc": "支付宝官方账号" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1585065600000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + }, + "avatar_subscript": 1, + "nickname_color": "#FB7299", + "avatar_subscript_url": "" + }, + "name_render": {}, + "nft_icon": "", + "rec_reason": "", + "track_id": "", + "follow_time": "" + }], + "re_version": 0, + "total": 1028 + } +} +``` + +
+ +### 查询用户关注明细2 + +> + +*请求方式:GET* + +仅可查看前 5 页,对于已设置可见性隐私关注列表的用户,响应数据中的 `data.list` 为 null,且 `data.total` 为0 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------ | ------ | ----------------------------- | +| vmid | num | 目标用户 mid | 必要 | | +| order | str | 排序方式 | 非必要 | 按照降序排列:desc
按照升序排列:asc
默认降序排列 | +| ps | num | 每页项数 | 非必要 | 默认为 50 | +| pn | num | 页码 | 非必要 | 默认为 1
仅可查看前 5 页 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
22007:访问超过 5 页 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| list | array | 明细列表 | | +| re_version | num | (?) | | +| total | num | 关注总数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | --------------------------------------------- | +| 0 | obj | 关注 1 | 与 [关系列表对象](#关系列表对象) 数据结构**不同** | +| n | obj | 关注(n+1) | 按照添加顺序排列 | +| …… | obj | …… | …… | + +数组`list`中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---------------------------------------- | ------------ | --------------------------------------- | +| mid | num | 用户 mid | | +| attribute | num | 关注属性 | 0:未关注
2:已关注
6:已互粉 | +| mtime | num | 关注对方时间 | 时间戳
互关后刷新 | +| tag | 默认分组:null
存在至少一个分组:array | 分组 id | | +| special | num | 特别关注标志 | 0:否
1:是 | +| uname | str | 用户昵称 | | +| face | str | 用户头像 url | | +| sign | str | 用户签名 | | +| official_verify | obj | 认证信息 | | +| vip | obj | 会员信息 | | +| live | num | 是否直播 | 0:未直播
1:直播中 | + +数组`list`中的对象中的`tag`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------------------ | ---- | +| 0 | num | 位于分组 1 的分组 id | | +| n | num | 位于分组(n+1)的分组 id | | +| …… | num | …… | …… | + +`list`中的对象中的`official_verify`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------ | ------------------- | +| type | num | 用户认证类型 | -1:无
0:UP主认证
1:机构认证 | +| desc | str | 用户认证信息 | 无为空 | + +`list`中的对象中的`vip`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------ | ----------------------------------------------- | +| vipType | num | 会员类型 | 0:无
1:月度大会员
2:年度以上大会员 | +| vipDueDate | num | 会员到期时间 | 时间戳 毫秒 | +| dueRemark | str | (?) | | +| accessStatus | num | (?) | | +| vipStatus | num | 大会员状态 | 0:无
1:有 | +| vipStatusWarn | str | (?) | | +| themeType | num | (?) | | +| label | obj | (?) | | + +`vip`中的`label`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------ | ---- | +| path | str | (?) | | + +**示例:** + +获取用户`mid=293793435`的关注明细,按照关注顺序 + +```shell +curl -G 'https://app.biliapi.net/x/v2/relation/followings' \ + --data-urlencode 'vmid=293793435' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [{ + "mid": 14082, + "attribute": 2, + "mtime": 1584271945, + "tag": null, + "special": 0, + "uname": "山新", + "face": "https://i0.hdslb.com/bfs/face/74c82caee6d9eb623e56161ea8ed6d68afabfeae.jpg", + "sign": "都说了是天依爹地,不是妈咪。\r私信有点多回复不过来~商业合作啥的请移步Weibo私信@山新 哦哦哦~", + "official_verify": { + "type": 0, + "desc": "配音演员、声优。洛天依声源提供者。" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1601654400000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + }, + "live": 0 + }, { + "mid": 420831218, + "attribute": 2, + "mtime": 1584208169, + "tag": [207542], + "special": 0, + "uname": "支付宝Alipay", + "face": "https://i2.hdslb.com/bfs/face/aaf18aeb2d9822e28a590bd8d878572ca8c59e04.jpg", + "sign": "阿支来了,关注点赞转发投币四连走起!", + "official_verify": { + "type": 1, + "desc": "支付宝官方账号" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1585065600000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + }, + "live": 0 + }], + "re_version": 3228575555, + "total": 699 + } +} +``` + +
+ +### 查询用户关注明细3 + +> + +*请求方式:GET* + +对于设置了可见性隐私关注列表的用户会返回空列表 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------ | ----------- | -------- | +| vmid | num | 目标用户mid | 必要 | | +| ps | num | 每页项数 | 非必要 | 默认为20 | +| pn | num | 页码 | 非必要 | 默认为1 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ---------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 成功时无此项 | +| data | obj | 信息本体 | 失败时无此项 | +| ts | num | 当前时间戳 | 单位为毫秒 | +| request_id | str | 请求id | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ------------ | +| list | array | 明细列表 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---------------- | +| 0 | obj | 关注1 | | +| n | obj | 关注(n+1) | 按照关注顺序排列 | +| …… | obj | …… | …… | + +数组`list`中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | ------------------------------ | --------------------------------------- | +| mid | str | 用户mid | | +| attribute | num | 对方对于**目标用户**的关注属性 | 0:未关注
2:已关注
6:已互粉 | +| uname | str | 用户昵称 | | +| face | str | 用户头像url | | +| attention_display | obj | 用户认证信息 | | + +`attention_display`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ------------------------------------------------------------ | +| type | num | 是否认证 | 0:无
1:UP主专业认证
2:UP主认证
3:机构认证 | +| desc | str | 认证信息 | | + +**示例:** + +获取用户`mid=293793435`的关注明细 + +```shell +curl -G 'https://line3-h5-mobile-api.biligame.com/game/center/h5/user/relationship/following_list' \ + --data-urlencode 'vmid=293793435' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "data": { + "list": [{ + "mid": "14082", + "attribute": 2, + "uname": "山新", + "face": "https://i0.hdslb.com/bfs/face/74c82caee6d9eb623e56161ea8ed6d68afabfeae.jpg", + "attestation_display": { "type": 0, "desc": "" } + }, { + "mid": "420831218", + "attribute": 2, + "uname": "支付宝Alipay", + "face": "https://i2.hdslb.com/bfs/face/aaf18aeb2d9822e28a590bd8d878572ca8c59e04.jpg", + "attestation_display": { "type": 3, "desc": "bilibili机构认证:支付宝官方账号" } + }] + }, + "ts": 1677410818395, + "request_id": "d9d541b9f2d24e21821e2d6d2d16c17d" +} +``` + +
+ +### 搜索关注明细 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | --------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| vmid | str | 目标用户 mid | 必要 | | +| name | str | 搜索关键词 | 非必要 | | +| ps | num | 每页项数 | 非必要 | 默认为 50 | +| pn | num | 页码 | 非必要 | 默认为 1 | + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ----------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
22007:访问超过 5 页 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| list | array | 明细列表 | | +| re_version | num | (?) | | +| total | num | 关注总数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | -------------------------------- | +| 0 | obj | 匹配项目 1 | 见 [关系列表对象](#关系列表对象) | +| n | obj | 匹配项目(n+1) | 按照添加顺序排列 | +| …… | obj | …… | …… | + +**示例:** + +搜索我的关注列表中关键词`warma` + +```shell +curl -G 'https://api.bilibili.com/x/relation/followings/search' \ + --data-urlencode 'vmid=293793435' \ + --data-urlencode 'name=warma' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "mid": 53456, + "attribute": 2, + "mtime": 1586415053, + "tag": [-10], + "special": 1, + "uname": "Warma", + "face": "https://i2.hdslb.com/bfs/face/c1bbee6d255f1e7fc434e9930f0f288c8b24293a.jpg", + "sign": "我是沃玛,做点傻开心的视频。日常发在微博:@_warma_ ", + "official_verify": { + "type": 0, + "desc": "bilibili 知名UP主" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1637424000000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + } + } + ], + "total": 1 + } +} +``` + +
+ +### 查询共同关注明细 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | --------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| vmid | num | 目标用户 mid | 必要 | | +| ps | num | 每页项数 | 非必要 | 默认为 50 | +| pn | num | 页码 | 非必要 | 默认为 1 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| list | array | 明细列表 | | +| re_version | num | (?) | | +| total | num | 关注总数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | -------------------------------- | +| 0 | obj | 共同关注 1 | 见 [关系列表对象](#关系列表对象) | +| n | obj | 共同关注(n+1) | 按照添加顺序排列 | +| …… | obj | …… | …… | + +**示例:** + +获取自己与用户`mid=2`的共同关注明细 + +```shell +curl -G 'https://api.bilibili.com/x/relation/same/followings' \ + --data-urlencode 'vmid=2' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "mid": 116683, + "attribute": 2, + "mtime": 1564627532, + "tag": null, + "special": 0, + "uname": "=咬人猫=", + "face": "https://i0.hdslb.com/bfs/face/8fad84a4470f3d894d8f0dc95555ab8f2cb10a83.jpg", + "sign": "面瘫女仆酱~小粗腿~事业线什么的!!吐槽你就输了!喵~", + "official_verify": { + "type": 0, + "desc": "bilibili 2019百大UP主、高能联盟成员" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1618934400000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + } + }, + { + "mid": 517717593, + "attribute": 2, + "mtime": 1592126052, + "tag": [207542], + "special": 0, + "uname": "上海爱丽丝幻乐团", + "face": "https://i0.hdslb.com/bfs/face/851a9191cbe93e66304d7577c0f6f83834e52109.jpg", + "sign": "日本同人社团 上海爱丽丝幻乐团", + "official_verify": { + "type": 0, + "desc": "上海爱丽丝幻乐团官方账号" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1593792000000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + } + } + ], + "re_version": 2498273968, + "total": 38 + } +} +``` + +
+ +### 查询悄悄关注明细 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| list | array | 明细列表 | | +| re_version | num | (?) | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | -------------------------------- | +| 0 | obj | 悄悄关注 1 | 见 [关系列表对象](#关系列表对象) | +| n | obj | 悄悄关注(n+1) | 按照操作顺序排列 | +| …… | obj | …… | …… | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/relation/whispers' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "mid": 178429408, + "attribute": 1, + "mtime": 1605972105, + "tag": null, + "special": 0, + "uname": "老弟一号", + "face": "https://i2.hdslb.com/bfs/face/21426275f3d3149b96b88783275205ba574c09e3.jpg", + "sign": "萌新硬件玩家,前垃圾佬~(◦˙▽˙◦某宝店 老弟一号 粉丝群679540094商务合作V13869651328", + "official_verify": { + "type": 0, + "desc": "知识领域优质UP主" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1632499200000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + } + } + ], + "re_version": 2137574562 + } +} +``` + +
+ +### 查询互相关注明细 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +查询与自己互关的用户明细,可看全部 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | -------- | ---- | +| list | array | 明细列表 | | +| re_version | num | (?) | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | -------------------------------- | +| 0 | obj | 互关 1 | 见 [关系列表对象](#关系列表对象) | +| n | obj | 互关(n+1) | 按照添加顺序排列 | +| …… | obj | …… | …… | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/relation/friends' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```jsonc +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "mid": 596000, + "attribute": 6, + "mtime": 1685110154, + "tag": null, + "special": 0, + "uname": "椛椛在睡觉", + "face": "https://i2.hdslb.com/bfs/face/365c1ef3b2a3afe21d6832796338fad5119b2592.jpg", + "sign": "欢迎来找椛椛玩~ https://blogs.momiji-jin.com/", + "face_nft": 0, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1702742400000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 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", + "avatar_subscript_url": "" + }, + "nft_icon": "", + "rec_reason": "", + "track_id": "" + }, + { + "mid": 24022863, + "attribute": 6, + "mtime": 1685026230, + "tag": [-10], + "special": 1, + "uname": "黄禄轩电脑专用账号", + "face": "https://i0.hdslb.com/bfs/face/a70ec7d2a3822980a915ef4b30371af0cbc79132.jpg", + "sign": "若要私信,请私信「黄禄轩手机专用账号」http://space.bilibili.com/17640193/,群:410311648", + "face_nft": 0, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1686412800000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 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", + "avatar_subscript_url": "" + }, + "nft_icon": "", + "rec_reason": "", + "track_id": "" + }, + { + "mid": 85438718, + "attribute": 6, + "mtime": 1684759843, + "tag": [194110], + "special": 0, + "uname": "忘忧北萱草Official", + "face": "https://i2.hdslb.com/bfs/face/68d8cba01aab907dbb2cf2e17074f20947156237.jpg", + "sign": "现已加入 OrangeFire 豪华套餐!", + "face_nft": 0, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 2, + "vipDueDate": 1691683200000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 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", + "avatar_subscript_url": "" + }, + "nft_icon": "", + "rec_reason": "", + "track_id": "" + }, + { + "mid": 41620134, + "attribute": 6, + "mtime": 1684759649, + "tag": null, + "special": 0, + "uname": "Tiggy_Chan", + "face": "https://i0.hdslb.com/bfs/face/8c8d9f43eda207f8cb8503bfdf6cc3802a1cd6c1.jpg", + "sign": "此号只发科技类视频,娱乐类转至:虎子酱233", + "face_nft": 0, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1669219200000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "" + }, + "avatar_subscript": 0, + "nickname_color": "", + "avatar_subscript_url": "" + }, + "nft_icon": "", + "rec_reason": "", + "track_id": "" + }, + // …… + ], + "re_version": 0 + } +} +``` + +
+ +### 查询黑名单明细 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | --------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| ps | num | 每页项数 | 非必要 | 默认为 50 | +| pn | num | 页码 | 非必要 | 默认为 1 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ----- | ------------ | ---- | +| list | array | 明细列表 | | +| re_version | num | (?) | | +| total | num | 黑名单总计数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | -------------------------------- | +| 0 | obj | 黑名单 1 | 见 [关系列表对象](#关系列表对象) | +| n | obj | 黑名单 (n+1) | 按照添加顺序排列 | +| …… | obj | …… | …… | + +**示例:** + +获取黑名单明细 + +```shell +curl -G 'https://api.bilibili.com/x/relation/blacks' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "mid": 22179720, + "attribute": 128, + "mtime": 1603032789, + "tag": null, + "special": 0, + "uname": "咩2016", + "face": "https://i0.hdslb.com/bfs/face/41fe435a7e62eae605a5908652f32f3afff2ae74.jpg", + "sign": "", + "official_verify": { + "type": 0, + "desc": "" + }, + "vip": { + "vipType": 0, + "vipDueDate": 0, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + } + }, + { + "mid": 16174624, + "attribute": 128, + "mtime": 1603026420, + "tag": null, + "special": 0, + "uname": "其实死亡没有那么痛", + "face": "https://i2.hdslb.com/bfs/face/79257f5a2e7194a71337ccca5927afba7706d316.jpg", + "sign": "等我,我马上就来", + "official_verify": { + "type": 0, + "desc": "" + }, + "vip": { + "vipType": 0, + "vipDueDate": 0, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + } + } + ], + "re_version": 897205356, + "total": 2 + } +} +``` + +
+ +## 操作关系 + + + +### 操作用户关系 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)或 APP + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------- | --------------- | -------------------------------------------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| fid | num | 目标用户mid | 必要 | | +| act | num | 操作代码 | 必要 | **操作代码见下表** | +| re_src | num | 关注来源代码 | 非必要 | 包月充电:1
个人空间:11
视频:14
评论区:15
视频播放器结束页面:17
H5推荐关注:58
H5关注列表:106
H5粉丝列表:107
专栏:115
私信:118
搜索:120
视频播放器左上角关注按钮:164
H5共同关注:167
创作激励计划:192
活动页面:222
联合投稿视频:229
消息中心点赞详情:235
视频播放器关注弹幕:245 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | + +操作代码`act`: + +| 代码 | 含义 | 备注 | +| ---- | ------------ | ------------------------------------------------ | +| 1 | 关注 | 无法对已注销或不存在的用户进行此操作 | +| 2 | 取关 | | +| 3 | 悄悄关注 | **现已下线**,使用本操作代码请求接口会提示“请求错误” | +| 4 | 取消悄悄关注 | | +| 5 | 拉黑 | 无法对已注销或不存在的用户进行此操作 | +| 6 | 取消拉黑 | | +| 7 | 踢出粉丝 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-111:csrf校验失败
-400:请求错误
22001:不能对自己进行此操作
22002:因对方隐私设置,你还不能关注
22003:关注失败,请将该用户移除黑名单之后再试
22008:黑名单达到上限
22009:关注失败,已达关注上限
22013:账号已注销,无法完成操作
22014:已经关注用户,无法重复关注
22120:重复加入黑名单
40061:用户不存在 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +关注`mid=14082`的用户 + +```shell +curl 'https://api.bilibili.com/x/relation/modify' \ + --data-urlencode 'fid=14082' \ + --data-urlencode 'act=1' \ + --data-urlencode 're_src=11' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +### 批量操作用户关系 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)或 APP + +此接口只支持关注和拉黑操作 + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------- | --------------- | ------------------------------------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| fids | nums | 目标用户 mid 列表 | 必要 | 每个成员之间用 `,` 间隔,最多 50 个成员,不能包含自己的 mid | +| act | num | 操作代码 | 必要 | 同上
仅可为 1 或 5,故只能进行批量关注和拉黑 | +| re_src | num | 关注来源代码 | 非必要 | 同上 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-111:csrf校验失败
-400:请求错误
22003:用户位于黑名单 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ----- | ------------------- | ---- | +| failed_fids | array | 操作失败的 mid 列表 | | + +`data`中的`failed_fids`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------------- | ---- | +| 0 | num | 操作失败的 mid 1 | | +| n | num | 操作失败的 mid(n+1) | | +| …… | num | …… | …… | + +**示例:** + +批量关注`mid=1,2,3,4,5`的用户 + +```shell +curl 'https://api.bilibili.com/x/relation/batch/modify' \ + --data-urlencode 'fid=1,2,3,4,5' \ + --data-urlencode 'act=1' \ + --data-urlencode 're_src=11' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "failed_fids": [] + } +} +``` + +
+ +## 查询关系属性 + +### 关系属性对象 + +| 字段 | 类型 | 内容 | 备注 | +| --------- | --------------------------------------- | ------------ | -------------------------------------------------------- | +| mid | num | 目标用户 mid | | +| attribute | num | 关系属性 | 0:未关注
~~1:悄悄关注(已弃用)~~
2:已关注
6:已互粉
128:已拉黑 | +| mtime | num | 关注对方时间 | 时间戳
未关注为 0 | +| tag | 默认分组:null
存在至少一个分组:array | 分组 id | | +| special | num | 特别关注标志 | 0:否
1:是 | + +`tag`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------------- | ---- | +| 0 | num | 位于分组 1 的分组 | | +| n | num | 位于分组(n+1)的分组 | | +| …… | num | …… | …… | + +### 查询用户与自己关系(仅关注) + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| fid | num | 目标用户 mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | 详见 [关系属性对象](#关系属性对象) | + +**示例:** + +可得对于`mid=258150656`的用户,在`2018/10/28 0:51:41`时关注,且设为特别关注,并位于为`-10`分组中 + +```shell +curl -G 'https://api.bilibili.com/x/relation' \ + --data-urlencode 'fid=258150656' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "mid": 258150656, + "attribute": 2, + "mtime": 1540659101, + "tag": [-10], + "special": 1 + } +} +``` + +
+ +### 查询用户与自己关系(互相关系) + +> 接口1: + +> 接口2: + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +鉴权方式(仅接口1):[Wbi 签名](../misc/sign/wbi.md) + +~~该接口的旧版 API :~~(已废弃,不建议使用) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------ | ----------- | ------------------------------------ | +| access_key | str | APP登录Token | APP方式必要 | | +| mid | num | 目标用户mid | 必要 | | +| w_rid | str | Wbi 签名 | 仅接口1必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | +| wts | num | 当前时间戳 | 仅接口1必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------------------------- | ---------------------------------- | +| relation | obj | 目标用户对于当前用户的关系 | 详见 [关系属性对象](#关系属性对象) | +| be_relation | obj | 当前用户对于目标用户的关系 | 详见 [关系属性对象](#关系属性对象) | + +**示例:** + +可得对于`mid=15858903`的用户,在`2019/1/24 14:24:19`时关注了对方,且互相关注,自己将对方特别关注,并同时位于为`-10`和`194110`的分组中,对方也将自己设为特别关注,并同时位于为`-10`和`56502`的分组中(虽然我看不到) + +Wbi 签名的 `wts`、`w_rid`生成方式详见 [Wbi 签名](../misc/sign/wbi.md) 文档 + +```shell +curl -G 'https://api.bilibili.com/x/space/acc/relation' \ + --data-urlencode 'mid=15858903' \ + --data-urlencode 'wts=1686015899' \ + --data-urlencode 'w_rid=e10a3c566c9be80a7cebe7bcdf262588' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "relation": { + "mid": 15858903, + "attribute": 6, + "mtime": 1548311059, + "tag": [-10, 194110, 248468], + "special": 1 + }, + "be_relation": { + "mid": 293793435, + "attribute": 6, + "mtime": 1548311059, + "tag": [56502, -10], + "special": 1 + } + } +} +``` + +
+ +### 批量查询用户与自己关系 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ----------------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| fids | nums | 目标用户 mid | 必要 | 每个之间用`,`间隔,无成员限制 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ---------- | ---------------------------------- | +| {用户mid} | obj | 关注的用户 | 详见 [关系属性对象](#关系属性对象) | +| …… | obj | …… | 下同 | + +**示例:** + +批量查询`mid=1,2,3,4,5`的关系 + +```shell +curl -G 'https://api.bilibili.com/x/relation/relations' \ + --data-urlencode 'fid=258150656' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "1": { + "mid": 1, + "attribute": 2, + "mtime": 1601654227, + "tag": null, + "special": 0 + }, + "2": { + "mid": 2, + "attribute": 2, + "mtime": 1601654225, + "tag": null, + "special": 0 + } + } +} +``` + +
+ +## 关注分组相关 + +分组 id 特殊值: + +| id | 含义 | +| ---- | -------- | +| 0 | 默认分组 | +| -10 | 特别关心 | + +### 查询关注分组列表 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | array | 分组列表 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | ---- | +| 0 | obj | 分组 1 | | +| n | obj | 分组(n+1) | | +| …… | num | …… | …… | + +数组`data`中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ---------- | ---- | +| tagid | num | 分组 id | -10:特别关注
0:默认分组 | +| name | str | 分组名称 | | +| count | num | 分组成员数 | | +| tip | str | 提示信息 | | + +**示例:** + +查询所有的分组的名字以及id + +```shell +curl 'https://api.bilibili.com/x/relation/tags' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```jsonc +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "tagid": -10, + "name": "特别关注", + "count": 19, + "tip": "第一时间收到该分组下用户更新稿件的通知" + }, + { + "tagid": 0, + "name": "默认分组", + "count": 340, + "tip": "" + }, + { + "tagid": 194110, + "name": "基友们", + "count": 127, + "tip": "" + }, + { + "tagid": 194111, + "name": "我的同学", + "count": 22, + "tip": "" + }, + // …… + ] +} +``` + +
+ +### 查询关注分组明细 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +只可查询属于自己的分组 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ------------------------------------------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| tagid | num | 分组 id | 必要 | 0:默认分组
-10:特别关注
-20:所有 | +| order_type | str | 排序方式 | 非必要 | 按照关注顺序排列:留空
按照最常访问排列:attention | +| ps | num | 每页项数 | 非必要 | 默认为 20 | +| pn | num | 页数 | 非必要 | 默认为1 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
22104:该分组不存在 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | array | 成员列表 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | --------------------------------------- | +| 0 | obj | 成员信息 1 | 与[关系列表对象](#关系列表对象)**不同** | +| n | obj | 成员信息(n+1) | 按照添加顺序排序 | +| …… | obj | …… | …… | + +`data` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | --------------- | -------------- | +| mid | num | 用户mid | | +| attribute | num | 关系属性 | 恒为 `0` | +| tag | null | 关注分组id | 恒为 `null` | +| special | num | 是否特别关注 | 恒为 `0` | +| contract_info | obj | 契约计划信息 | | +| uname | str | 用户昵称 | | +| face | str | 用户头像url | | +| sign | str | 用户签名 | | +| face_nft | num | 是否为 NFT 头像 | | +| official_verify | obj | 认证信息 | 具体见下 | +| vip | obj | 会员信息 | | +| live | obj | 直播状态 | 具体见下 | +| nft_icon | str | (?) | | +| rec_reason | str | (?) | | +| track_id | str | (?) | | +| follow_time | str | (?) | | + +`data`中的对象中的`official_verify`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------ | ------------------- | +| type | num | 用户认证类型 | -1:无
0:UP 主认证
1:机构认证 | +| desc | str | 用户认证信息 | 无为空 | + +`data`中的对象中的`vip`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------ | ----------------------------------------------- | +| vipType | num | 会员类型 | 0:无
1:月度大会员
2:年度以上大会员 | +| vipDueDate | num | 会员到期时间 | 时间戳 毫秒 | +| dueRemark | str | (?) | | +| accessStatus | num | (?) | | +| vipStatus | num | 大会员状态 | 0:无
1:有 | +| vipStatusWarn | str | (?) | | +| themeType | num | (?) | | +| label | obj | (?) | | + +`data`数组中的对象中的`live`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------- | ------------------------ | +| live_status | num | 直播状态 | 0:未开播
1:已直播 | +| jump_url | str | 直播链接 | | + +`data`数组中的对象中的`contract_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------------------------ | ----------------------------------------------------------- | +| is_contract | bool | 目标用户是否为对方的契约者 | 仅当为 `true` 时才有此项 | +| is_contractor | bool | 对方是否为目标用户的契约者 | 仅当为 `true` 时才有此项 | +| ts | num | 对方成为目标用户的契约者的时间 | 秒级时间戳,仅当 `is_contractor` 项的值为 `true` 时才有此项 | +| user_attr | num | 对方作为目标用户的契约者的属性 | 1:老粉
否则为原始粉丝
仅当有特殊属性时才有此项 | + +**示例:** + +以每页2项的方式获取了id为`207542`分组的第1页的粉丝明细,按照关注顺序 + +```shell +curl -G 'https://api.bilibili.com/x/relation/tag' \ + --data-urlencode 'tagid=207542' \ + --data-urlencode 'order_type=' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [{ + "mid": 420831218, + "uname": "支付宝Alipay", + "face": "https://i2.hdslb.com/bfs/face/aaf18aeb2d9822e28a590bd8d878572ca8c59e04.jpg", + "sign": "阿支来了,关注点赞转发投币四连走起!", + "official_verify": { + "type": 1, + "desc": "支付宝官方账号" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1585065600000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 1, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + } + }, { + "mid": 125086406, + "uname": "MSI微星科技", + "face": "https://i1.hdslb.com/bfs/face/a844760e4e491677615b39399bc761e74c579bb4.jpg", + "sign": "你好,这里是微星显卡官方!专注显卡三十年,欢迎私信咨询或提问MSI", + "official_verify": { + "type": 1, + "desc": "微星科技官方账号" + }, + "vip": { + "vipType": 1, + "vipDueDate": 1540656000000, + "dueRemark": "", + "accessStatus": 0, + "vipStatus": 0, + "vipStatusWarn": "", + "themeType": 0, + "label": { + "path": "" + } + } + }] +} +``` + +
+ +### 查询目标用户所在的分组 + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| fid | num | 目标用户 mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------- | ---- | --------- | ---- | +| {加入的分组 id} | str | 分组名称 | 若目标用户存在默认分组中,则不显示 | +| …… | str | …… | 下同 | + +**示例:** + +查询用户`mid=319214221`存在的所有分组和名称 + +```shell +curl -G 'https://api.bilibili.com/x/relation/tag/user' \ + --data-urlencode 'fid=319214221' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "-10": "特别关注", + "194111": "我的同学" + } +} +``` + +
+ +### 查询所有特别关注 mid + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA)或 APP + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----- | -------- | ----------------------------- | +| code | num | 返回值 | 0:成功
-101:账号未登录 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | array | 成员列表 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| 0 | num | 成员 1 mid | | +| n | num | 成员(n+1)mid | | +| …… | num | …… | …… | + +**示例:** + +```shell +curl 'https://api.bilibili.com/x/relation/tag/special' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + 500716647, + 32832243, + 53456, + 25944552, + 301839556, + 427494870, + 319214221, + 31949159, + 382666849, + 258318451, + 15858903, + 54992199, + 3379951, + 392279807, + 23215368, + 258150656, + 20165629, + 22179720 + ] +} +``` + +
+ +### 创建分组 + + + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)或 APP + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------- | --------------- | ------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| tag | str | 分组名 | 必要 | 最长 16 字符 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22101:分组名称存在不允许的字符
22102:分组数量超过限制
22103:分组名过长
22106:该分组已经存在 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | --------------- | ---- | +| tagid | num | 创建的分组的 id | | + +**示例:** + +创建了名为`测试`的分组,得到id为`216677` + +```shell +curl 'https://api.bilibili.com/x/relation/tag/create' \ + --data-urlencode 'tag=测试' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "tagid": 216677 + } +} +``` + +
+ +### 重命名分组 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)或 APP + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------- | --------------- | ------------ | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| tagid | num | 分组 id | 必要 | | +| name | str | 新名称 | 必要 | 最长 16 字符 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22101:分组名称存在不允许的字符
22103:分组名过长
22104:该分组不存在 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | + +**示例:** + +把id为`194112`的分组更名为`膜法师` + +```shell +curl 'https://api.bilibili.com/x/relation/tag/update' \ + --data-urlencode 'tagid=194112' \ + --data-urlencode 'name=膜法师' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +### 删除分组 + + + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)或 APP + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------- | --------------- | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| tagid | num | 分组 id | 必要 | | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | + +示例: + +删除分组id为`216699`的分组 + +```shell +curl 'https://api.bilibili.com/x/relation/tag/del' \ + --data-urlencode 'tagid=216699' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +### 修改分组成员 + + + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)或 APP + +如需删除分组中的成员,请将`tagids`设为 0,即移动至默认分组,而不是取关 + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | -------------- | ------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| fids | nums | 目标用户 mid 列表 | 必要 | 每个之间用`,`间隔 | +| tagids | nums | 分组 id 列表 | 必要 | 每个之间用`,`间隔 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22104:分组不存在
22105:未关注 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | + +**示例:** + +把关注用户`mid=205631797`同时添加分组关系到id为`-10`和`207542`的分组中 + +```shell +curl 'https://api.bilibili.com/x/relation/tags/addUsers' \ + --data-urlencode 'fids=205631797' \ + --data-urlencode 'tagids=-10,207542' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +### 复制关注到分组 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)或 APP + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | -------------- | ------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| fids | nums | 待复制的用户 mid 列表 | 必要 | 每个之间用`,`间隔 | +| tagids | nums | 目标分组 id 列表 | 必要 | 每个之间用`,`间隔 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22104:分组不存在
22105:未关注 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | + +**示例:** + +把关注用户`mid=4856007`和`mid=326499679`同时复制到为`231305`的分组id中 + +```shell +curl 'https://api.bilibili.com/x/relation/tags/copyUsers' \ + --data-urlencode 'fids=4856007,326499679' \ + --data-urlencode 'tagids=231305' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +### 移动关注到分组 + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA)或 APP + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------ | ---- | ------------------------ | -------------- | ------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| beforeTagids | nums | 原分组 id 列表 | 必要 | 每个之间用`,`间隔 | +| afterTagids | nums | 新分组 id 列表 | 必要 | 每个之间用`,`间隔 | +| fids | nums | 待移动的用户 mid 列表 | 必要 | 每个之间用`,`间隔 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22104:分组不存在
22105:未关注 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | + +**示例:** + +把关注用户`mid=321173469`和`mid=327086920`同时从id为`207542`的分组移动到为`231305`的分组中 + +```shell +curl 'https://api.bilibili.com/x/relation/tags/moveUsers' \ + --data-urlencode 'beforeTagids=207542' \ + --data-urlencode 'afterTagids=23130' \ + --data-urlencode 'fids=321173469,327086920' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
diff --git a/docs/user/space.md b/docs/user/space.md new file mode 100644 index 0000000..36142af --- /dev/null +++ b/docs/user/space.md @@ -0,0 +1,4688 @@ +# 用户空间相关 + +## 主页 + + + +### 置顶视频 + +#### 查询用户置顶视频 + +>https://api.bilibili.com/x/space/top/arc + +*请求方式:GET* + +粉丝在其主页上可见 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| vmid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
53016:没有置顶视频 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | ------------------------------ | ------------------------------------------------------------ | +| aid | num | 稿件avid | | +| videos | num | 视频分P总数 | 默认为1 | +| tid | num | 分区tid | | +| tname | str | 子分区名称 | | +| copyright | num | 是否转载 | 1:原创
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 | 视频同步发布的的动态的文字内容 | 无为空 | +| cid | num | 视频1P cid | | +| dimension | obj | 视频1P分辨率 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中的`dimension`对象 | +| bvid | str | 稿件bvid | | +| reason | str | 置顶视频备注 | | +| inter_video | bool | 是否为合作视频 | false:否
true:是 | + +**示例:** + +查询用户`mid=23215368`的置顶视频 + +```shell +curl -G 'https://api.bilibili.com/x/space/top/arc' \ +--data-urlencode 'vmid=23215368' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "aid": 37896701, + "videos": 1, + "tid": 28, + "tname": "原创音乐", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/cc9e72822d68fffdd0406144f1b5348a13c89652.jpg", + "title": "燃烧吧!铃声!把主流手机铃声编成一首曲子", + "pubdate": 1544469671, + "ctime": 1544469671, + "desc": "各品牌的手机铃声大合奏,毫无违和感~", + "state": 0, + "attribute": 16768, + "duration": 208, + "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": 23215368, + "name": "Wayjon冰冰酱", + "face": "http://i2.hdslb.com/bfs/face/7c9715f1768191137eb7ebf91918ca0f99532012.jpg" + }, + "stat": { + "aid": 37896701, + "view": 1058237, + "danmaku": 16821, + "reply": 3725, + "favorite": 76888, + "coin": 100694, + "share": 17091, + "now_rank": 0, + "his_rank": 0, + "like": 90521, + "dislike": 0 + }, + "dynamic": "#编曲##FL##纯音乐#", + "cid": 66621209, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "bvid": "BV18t411q7zz", + "reason": "", + "inter_video": false + } +} +``` + +
+ +#### 设置置顶视频 + +> https://api.bilibili.com/x/space/top/arc/set + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------------ | -------------------------------- | +| aid | num | 置顶目标稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 置顶目标稿件bvid | 必要(可选) | avid与bvid任选一个 | +| reason | str | 置顶视频备注 | 非必要 | 置顶备注最大40字符
默认为空 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-304:未修改
-400:请求错误
53014:稿件已失效
53015:备注过长
53017:置顶非自己的稿件 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +置顶视频`av98948772`/`BV1n741127LD` + +avid方式: + +```shell +curl 'https://api.bilibili.com/x/space/top/arc/set' \ +--data-urlencode 'aid=98948772' \ +-b 'SESSDATA=xxx' +``` + +bvid方式: + +```shell +curl 'https://api.bilibili.com/x/space/top/arc/set' \ +--data-urlencode 'bvid=BV1n741127LD' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +#### 取消置顶视频 + +> https://api.bilibili.com/x/space/top/arc/cancel + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------ | ---- | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误(重复取消) | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +```shell +curl 'https://api.bilibili.com/x/space/top/arc/cancel' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +### 代表作视频 + +#### 查询用户代表作视频列表 + +> https://api.bilibili.com/x/space/masterpiece + +*请求方式:GET* + +新访客在其主页上可见 + +最多可以设置3个 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| vmid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | ---------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | array | 代表作列表 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------- | ------------------------- | +| 0 | obj | 代表作1 | 无则为空 | +| 1 | obj | 代表作2 | 无则为空 | +| 2 | obj | 代表作3 | 无则为空
最多设置3个 | + +`data`数组中的对象: + +同[查询用户置顶视频](#查询用户置顶视频)中的`data`对象 + +**示例:** + +查询用户`mid=23215368`的代表作视频列表 + +```shell +curl -G 'https://api.bilibili.com/x/space/masterpiece' \ +--data-urlencode 'vmid=23215368' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [{ + "aid": 37896701, + "videos": 1, + "tid": 28, + "tname": "原创音乐", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/cc9e72822d68fffdd0406144f1b5348a13c89652.jpg", + "title": "燃烧吧!铃声!把主流手机铃声编成一首曲子", + "pubdate": 1544469671, + "ctime": 1544469671, + "desc": "各品牌的手机铃声大合奏,毫无违和感~", + "state": 0, + "attribute": 16768, + "duration": 208, + "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": 23215368, + "name": "Wayjon冰冰酱", + "face": "http://i2.hdslb.com/bfs/face/7c9715f1768191137eb7ebf91918ca0f99532012.jpg" + }, + "stat": { + "aid": 37896701, + "view": 1058241, + "danmaku": 16821, + "reply": 3725, + "favorite": 76888, + "coin": 100694, + "share": 17091, + "now_rank": 0, + "his_rank": 0, + "like": 90521, + "dislike": 0 + }, + "dynamic": "#编曲##FL##纯音乐#", + "cid": 66621209, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "bvid": "BV18t411q7zz", + "reason": "", + "inter_video": false + }, { + "aid": 39596658, + "videos": 1, + "tid": 21, + "tname": "日常", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/431e51d0e40e3461e1c1b0f59c755ae8843b1adb.jpg", + "title": "MY2018 - 纪念我的2018年", + "pubdate": 1546328392, + "ctime": 1546328392, + "desc": "", + "state": 0, + "attribute": 16768, + "duration": 239, + "mission_id": 10996, + "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": 23215368, + "name": "Wayjon冰冰酱", + "face": "http://i2.hdslb.com/bfs/face/7c9715f1768191137eb7ebf91918ca0f99532012.jpg" + }, + "stat": { + "aid": 39596658, + "view": 1518, + "danmaku": 16, + "reply": 40, + "favorite": 22, + "coin": 60, + "share": 9, + "now_rank": 0, + "his_rank": 0, + "like": 112, + "dislike": 0 + }, + "dynamic": "#vlog##记录##生活记录#", + "cid": 69561078, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "bvid": "BV1Jt411B7La", + "reason": "", + "inter_video": false + }, { + "aid": 44721369, + "videos": 1, + "tid": 28, + "tname": "原创音乐", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/9887797402599c42f74a7624f3db4a92a0ebf465.jpg", + "title": "【铃声串烧系列】华米两开花;中华有为,国之荣耀!把主流手机铃声编成一首曲子", + "pubdate": 1551128445, + "ctime": 1551128445, + "desc": "把主流手机铃声编成一首曲子,这一版用华为的铃声作为主旋律,毫无违和感~伴随着2019mwc的开幕,希望国产厂商能获得全世界的目光,并且将属于中国人的科技自信传递到全世界!", + "state": 0, + "attribute": 16768, + "duration": 174, + "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": 23215368, + "name": "Wayjon冰冰酱", + "face": "http://i2.hdslb.com/bfs/face/7c9715f1768191137eb7ebf91918ca0f99532012.jpg" + }, + "stat": { + "aid": 44721369, + "view": 306757, + "danmaku": 7713, + "reply": 1520, + "favorite": 17216, + "coin": 16489, + "share": 2917, + "now_rank": 0, + "his_rank": 0, + "like": 21439, + "dislike": 0 + }, + "dynamic": "#铃声##纯音乐##音乐#【铃声串烧】Mix Ringtones!船新的版本来啦!这一版用华为的铃声作为主旋律,毫无违和感~伴随着2019mwc的开幕,希望国产厂商能获得全世界的目光,并且将属于中国人的科技自信传递到全世界!", + "cid": 78290138, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "bvid": "BV1vb411879C", + "reason": "", + "inter_video": false + }] +} +``` + +
+ +#### 添加代表作视频 + +> https://api.bilibili.com/x/space/masterpiece/add + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +代表作上限为3个稿件 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------------ | -------------------------------- | +| aid | num | 置顶目标稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 置顶目标稿件bvid | 必要(可选) | avid与bvid任选一个 | +| reason | str | 代表作备注 | 非必要 | 置顶备注最大40字符
默认为空 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
53014:稿件已失效
53015:备注过长
53017:置顶非自己的稿件
53019:达到上限
53020:已经存在该稿件 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +添加视频`av94916552`/`BV1ZE411K7ux`到代表作列表 + +avid方式: + +```shell +curl 'https://api.bilibili.com/x/space/masterpiece/add' \ +--data-urlencode 'aid=94916552' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +bvid方式: + +```shell +curl 'https://api.bilibili.com/x/space/masterpiece/add' \ +--data-urlencode 'bvid=BV1ZE411K7ux' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +#### 删除代表作视频 + +> https://api.bilibili.com/x/space/masterpiece/cancel + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------------ | ------------------ | +| aid | num | 要删除的目标稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 要删除的目标稿件bvid | 必要(可选) | avid与bvid任选一个 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
53021:置顶列表中没有该视频 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | 作用尚不明确 | + +**示例:** + +删除置顶视频`av59765630`/`BV1Yt41137T6` + +avid方式: + +```shell +curl 'https://api.bilibili.com/x/space/masterpiece/cancel' \ +--data-urlencode 'aid=59765630' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +bvid方式: + +```shell +curl 'https://api.bilibili.com/x/space/masterpiece/cancel' \ +--data-urlencode 'bvid=BV1Yt41137T6' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +### 个人TAG + +#### 查看用户个人TAG + +> https://api.bilibili.com/x/space/acc/tags + +*请求方式:GET* + +上限5条,且内容由用户自定义 + +带有转义 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | array | 信息本体 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ------------- | +| 0 | obj | 套了个娃 | 只有1项??? | + +`data`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ----- | ----------- | ---- | +| mid | num | 目标用户mid | | +| tags | array | TAG名称 | | + +`data`数组中的对象中的`tags`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ------- | +| 0 | str | TAG1 | | +| n | str | TAG(n+1) | | +| …… | str | …… | | +| 4 | str | TAG5 | 上限5条 | + +**示例:** + +查看用户`mid=53456`的个人TAG + +```shell +curl -G 'https://api.bilibili.com/x/space/acc/tags' \ +--data-urlencode 'mid=53456' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "mid": 53456, + "tags": [ + "游戏", + "音乐", + "warma", + "搞笑", + "动画" + ] + } + ] +} +``` + +
+ +#### 修改个人TAG + +> https://api.bilibili.com/x/space/acc/tags/set + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`DedeUserID`存在且不为0 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------ | ------------------------------------------------------------ | +| tags | strs | 要设置的TAG内容 | 非必要 | 删除公告留空或省去即可
各TAG长度小于10字符
最多5个TAG
各TAG之间用","(%2C)分隔
重复TAG无效 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误(超出长度限制) | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +修改个人TAG为`minecraft,技术宅,大佬,小哥哥,可爱` + +```shell +curl 'https://api.bilibili.com/x/space/acc/tags/set' \ +--data-urlencode 'tags=minecraft,技术宅,大佬,小哥哥,可爱' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx;DedeUserID=1' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +### 空间公告 + +#### 查看用户空间公告 + +> https://api.bilibili.com/x/space/notice + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | str | 公告信息 | 无则为空 | + +**示例:** + +查看用户`mid=53456`的空间公告 + +```shell +curl -G 'https://api.bilibili.com/x/space/notice' \ +--data-urlencode 'mid=53456' +``` + +
+查看响应示例: + +```json +{ + "code":0, + "message":"0", + "ttl":1, + "data":"我的微博 @_warma_\n直播录像上传到:warma养鸽场\n头像画师是:微博@Dr-H_喵_\n横幅画师:@薬屋" +} +``` + +
+ +#### 修改空间公告 + +> https://api.bilibili.com/x/space/notice/set + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------ | --------------------------------------- | +| notice | str | 要设置的公告内容 | 非必要 | 删除公告留空或省去即可
少于150字符 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-304:未修改
-400:请求错误(超出长度限制) | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | 作用尚不明确 | + +**示例:** + +修改个人空间公告为`鸽子` + +```shell +curl 'https://api.bilibili.com/x/space/notice/set' \ +--data-urlencode 'notice=鸽子' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +### 主页板块布局与权限 + +#### 查询空间设置 + +> http://space.bilibili.com/ajax/settings/getSettings + +*请求方式:GET* + +注:带有转义 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ------------------- | -------- | ---- | +| status | bool | 用户是否存在 | true:存在
false:不存在 | +| data | 用户存在时:obj
用户不存在时:str| 用户存在时:信息本体
用户不存在时:错误信息 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------------------- | ----- | ---------------- | ------------ | +| privacy | obj | 空间隐私权限 | | +| index_order | array | 空间板块布局 | | +| theme | str | default主题? | 作用尚不明确 | +| theme_preview_img_path | str | 主题预览图路径? | 作用尚不明确 | +| toutu | obj | 空间头图 | | + +`privacy`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------------- | ------------------------------ | +| bangumi | num | 追番及追剧 | 0:隐藏
1:公开
**下同** | +| bbq | num | 轻视频 | | +| channel | num | 频道 | | +| coins_video | num | 最近投币的视频 | | +| comic | num | 追漫 | | +| dress_up | num | 装扮 | | +| fav_video | num | 收藏夹 | | +| groups | num | 圈子? | 作用尚不明确 | +| likes_video | num | 最近点赞的视频 | | +| played_game | num | 最近玩过的游戏 | | +| tags | num | 订阅标签 | | +| user_info | num | 个人资料 | | + +`index_order`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | -------------------------------------------- | +| 0 | obj | 板块1 | 根据板块布局顺序排序
先左侧布局后右侧布局 | +| n | obj | 板块(n+1) | | +| …… | obj | …… | …… | + +`index_order`数组内对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---- | +| id | num | 板块编号 | | +| name | str | 板块名称 | | + +`toutu`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | -------------------- | -------------------------------------------------- | +| sid | num | 空间头图ID | | +| expire | num | 到期时间? | 时间戳?
作用尚不明确 | +| s_img | str | 空间头图小图相对路径 | 完整url为`http://i0.hdslb.com/`+相对路径 | +| l_img | str | 空间头图相对路径 | **同上** | +| android_img | str | 空 | 注:**手机端头图与web端不同,需要用另一个api获取** | +| iphone_img | str | 空 | | +| ipad_img | str | 空 | | +| thumbnail_img | str | 缩略图 | | +| platform | num | 0 | 作用尚不明确 | + +**示例:** + +查看`mid=2`的空间设置 + +```shell +curl -G 'http://space.bilibili.com/ajax/settings/getSettings' \ +--data-urlencode 'mid=2' +``` + +
+查看响应示例: + +```json +{ + "status":true, + "data":{ + "privacy":{ + "bangumi":1, + "bbq":1, + "channel":1, + "coins_video":0, + "comic":1, + "dress_up":1, + "fav_video":0, + "groups":0, + "likes_video":0, + "played_game":1, + "tags":1, + "user_info":1 + }, + "index_order":[ + { + "id":1, + "name":"我的稿件" + }, + { + "id":8, + "name":"我的专栏" + }, + { + "id":7, + "name":"我的频道" + }, + { + "id":2, + "name":"我的收藏夹" + }, + { + "id":3, + "name":"订阅番剧" + }, + { + "id":4, + "name":"订阅标签" + }, + { + "id":5, + "name":"最近投币的视频" + }, + { + "id":6, + "name":"我的圈子" + }, + { + "id":9, + "name":"我的相簿" + }, + { + "id":21, + "name":"公告" + }, + { + "id":22, + "name":"直播间" + }, + { + "id":23, + "name":"个人资料" + }, + { + "id":24, + "name":"官方活动" + }, + { + "id":25, + "name":"最近玩过的游戏" + } + ], + "theme":"default", + "theme_preview_img_path":"", + "toutu":{ + "sid":1, + "expire":2861874560, + "s_img":"bfs/space/768cc4fd97618cf589d23c2711a1d1a729f42235.png", + "l_img":"bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", + "android_img":"", + "iphone_img":"", + "ipad_img":"", + "thumbnail_img":"", + "platform":0 + } + } +} +``` + +
+ +#### 查询可用头图列表 (Web端) + +> https://space.bilibili.com/ajax/topphoto/getlist + +*请求方式: GET* + +注: 带有转义 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | -------------------------- | +| mid | num | 目标用户mid | 必要 | 非负数, 即使该用户并不存在 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ------------------------- | -------------------------------------- | ---- | +| status | bool | 成功: true
失败: false | | +| data | 成功: array
失败: str | 成功: 信息本体
失败: "用户id错误" | | + +`data`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ----------- | ------------------------------------ | +| id | num | 空间头图 ID | | +| product_name | str | 显示名称 | | +| price | num | 价格 | | +| coin_type | num | 支付类型? | | +| vip_free | num | 大会员免费 | | +| s_img | str | 小图 URI | 需要自行与 `i0.hdslb.com` 拼接成 URL | +| l_img | str | 大图 URI | 同 s_img | +| thumbnail_img | str | 空 | 并不存在的缩略图? | +| sort_num | num | 排序编号 | | +| is_disable | num | 已禁用 | 0: 未禁用 | +| expire | num | 过期时间? | UNIX 时间戳, 或 0 为永不过期 | +| had | num | 是否拥有? | 当 expire 不为 0 时 为 1, 否则为 0 | + +**示例:** + +查询`mid=1145141919810000000`的可用空间头图 + +```shell +curl -G "https://space.bilibili.com/ajax/topphoto/getlist" \ +--data-urlencode "mid=1145141919810000000" +``` + +
+查看响应示例: + +```json +{ + "status": true, + "data": [ + { + "id": 1, + "product_name": "bilibili春", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/768cc4fd97618cf589d23c2711a1d1a729f42235.png", + "l_img": "bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", + "thumbnail_img": "", + "sort_num": 19, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 2, + "product_name": "两人单车", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/d60a4be11f1bca6168a60a53c64bca18eddd6443.jpg", + "l_img": "bfs/space/44873d3568bdcb3d850d234e02a19602972450f1.png", + "thumbnail_img": "", + "sort_num": 16, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 5, + "product_name": "成为偶像", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/5fe2632486a5a91a234f0e7cb368ab6397477da4.jpg", + "l_img": "bfs/space/87277d30cd19edcec9db466a9a3e556aeb0bc0ed.png", + "thumbnail_img": "", + "sort_num": 15, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 11, + "product_name": "星际勘探", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/6849abc6e67000ad807b35a970aba31dd1e400dd.jpg", + "l_img": "bfs/space/c919a9818172a8297f8b0597722f96504a1e1d88.png", + "thumbnail_img": "", + "sort_num": 14, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 10, + "product_name": "星O大战", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/ff3b0882e55c1099738e59616e5956ad357d9948.jpg", + "l_img": "bfs/space/e22f5b8e06ea3ee4de9e4da702ce8ef9a2958f5a.png", + "thumbnail_img": "", + "sort_num": 13, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 12, + "product_name": "王牌特工", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/f5d38e2af44fd12fa65423aff55933fcf9071419.jpg", + "l_img": "bfs/space/8cd85a382756ab938df23a856017abccd187188e.png", + "thumbnail_img": "", + "sort_num": 12, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 3, + "product_name": "仰望星空", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/c9dae917e24b4fc17c4d544caf6b6c0b17f8692b.jpg", + "l_img": "bfs/space/9ccc0447aebf0656809b339b41aa5b3705f27c47.png", + "thumbnail_img": "", + "sort_num": 11, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 14, + "product_name": "雨过天晴", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/1115b2fdabd128337f892feada4ce32e51f3a5ad.jpg", + "l_img": "bfs/space/6a1198e25f8764bd30d53411dac9fdf840bc3265.png", + "thumbnail_img": "", + "sort_num": 10, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 6, + "product_name": "绿荫秘境", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/dc02d22a718c1c436f1a355b3cd726b04098ef7d.jpg", + "l_img": "bfs/space/265ecddc52d74e624dc38cf0cff13317085aedf7.png", + "thumbnail_img": "", + "sort_num": 9, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 13, + "product_name": "漫游仙境", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/184abe52a5ea9390b506c064cfba4f8f20ae9cca.jpg", + "l_img": "bfs/space/24d0815514951bb108fbb360b04a969441079315.png", + "thumbnail_img": "", + "sort_num": 7, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 15, + "product_name": "放课后time", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/aea2dd7b8894ce31d578d4fad6a7188c7b49cb2f.jpg", + "l_img": "bfs/space/6e799ff2de2de55d27796707a283068d66cdf3f4.png", + "thumbnail_img": "", + "sort_num": 6, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 4, + "product_name": "昴宿星团", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/1f4eaf70d1bb981f6057b3e440249d7a1f65774f.jpg", + "l_img": "bfs/space/3ab888c1d149e864ab44802dea8c1443e940fa0d.png", + "thumbnail_img": "", + "sort_num": 5, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 7, + "product_name": "蔷薇洛丽塔", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/718eac8c71e29b8a80431c46110805c3a40e30a6.jpg", + "l_img": "bfs/space/70ce28bcbcb4b7d0b4f644b6f082d63a702653c1.png", + "thumbnail_img": "", + "sort_num": 4, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 9, + "product_name": "黑暗之门", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/ef1b08e62fdc35b06e39795bc6de8e510935bf97.jpg", + "l_img": "bfs/space/cd52d4ac1d336c940cc4958120170f7928d9e606.png", + "thumbnail_img": "", + "sort_num": 3, + "is_disable": 0, + "expire": 0, + "had": 0 + }, + { + "id": 19, + "product_name": "你的名字", + "price": 0, + "coin_type": 0, + "vip_free": 0, + "s_img": "bfs/space/373e127e8784d3e4c1b5e6db0c27702ba077643f.jpg", + "l_img": "bfs/space/f49642b3683a08e3190f29d5a095386451f8952c.jpg", + "thumbnail_img": "", + "sort_num": 2, + "is_disable": 0, + "expire": 0, + "had": 0 + } + ] +} +``` + +
+ +### 设置空间头图 (Web端) + +> https://space.bilibili.com/ajax/settings/setToutu + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +鉴权方式: referer为 `.bilibili.com` 域名下 + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---------------------------------- | ------ | ---- | +| id | num | 头图 ID | 必要 | | +| csrf | str | CSRF Token (即 Cookie bili_jct 值) | 不必要 | | + +**JSON回复:** + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | -------- | --------------------------- | +| status | bool | 状态 | true: 成功
false: 失败 | +| data | str | 错误信息 | 正确时无此项 (带有转义) | + +**示例:** + +设置空间头图为为`王牌特工(id=12)` + +```shell +curl -X POST "https://space.bilibili.com/ajax/settings/setToutu" \ +--referer "https://space.bilibili.com/" \ +--data-urlencode "id=12" \ +--data-urlencode "csrf=xxx" \ +-b "SESSDATA=xxx; bili_jct=xxx" +``` + +
+查看响应示例: + +```json +{ + "status": true +} +``` + +
+ +#### 调整空间板块布局 + +> http://space.bilibili.com/ajax/settings/setIndexOrder + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`DedeUserID`及`DedeUserID__ckMd5`存在且不为0,referer为 `.bilibili.com`域名下 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | +| index_order | nums | 布局列表 | 必要 | 每个值之间用","(%2C)分隔
先左侧布局再右侧布局
值的意义见下表 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +布局参数`index_order`: + +| 值 | 含义 | +| ---- | ------------------------------------ | +| 1 | (左侧)我的稿件 | +| 2 | (左侧)我的收藏夹 | +| 3 | (左侧)订阅番剧 | +| 4 | (左侧)订阅标签 | +| 5 | (左侧)最近投币的视频 | +| 6 | (左侧)我的圈子 **(此板块被隐藏)** | +| 7 | (左侧)我的频道 | +| 8 | (左侧)我的专栏 | +| 9 | (左侧)我的相簿 | +| 21 | (右侧)公告 | +| 22 | (右侧)直播间 | +| 23 | (右侧)个人资料 | +| 24 | (右侧)官方活动 | +| 25 | (右侧)最近玩的游戏 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | -------- | ----------------------------------- | +| status | bool | 操作结果 | true:操作成功
false:操作失败 | +| data | str | 错误信息 | 正确时无此项 | + +**示例:** + +调整空间布局为: + +```text +我的稿件 直播间 +我的专栏 个人资料 +订阅番剧 公告 +我的收藏夹 官方活动 +我的相簿 最近玩的游戏 +最近投币的视频 +订阅标签 +我的频道 +``` + +```shell +curl 'https://space.bilibili.com/ajax/settings/setIndexOrder' \ +--data-urlencode 'index_order=1,8,3,2,9,5,4,7,22,23,21,24,25,6' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' \ +-e 'https://www.bilibili.com' +``` + +
+查看响应示例: + +```json +{ + "status": true +} +``` + +
+ +#### 修改空间隐私权限 + +> http://space.bilibili.com/ajax/settings/setPrivacy + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:Cookie中`DedeUserID`及`DedeUserID__ckMd5`存在且不为0,referer为 `.bilibili.com`域名下 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------- | ---- | ------------------------ | ------ | ---------------------------------- | +| fav_video | num | 收藏视频 | 非必要 | 0:隐藏
1:公开
**下同** | +| bangumi | num | 追番及追剧 | 非必要 | | +| tags | num | 关注的TAG | 非必要 | | +| coins_video | num | 投币的视频 | 非必要 | | +| user_info | num | 个人信息 | 非必要 | | +| played_game | num | 玩过的游戏 | 非必要 | | +| csrf | nstr | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | -------- | ----------------------------------- | +| status | bool | 操作结果 | true:操作成功
false:操作失败 | +| data | str | 错误信息 | 正确时无此项 | + +**示例:** + +设置`关注的TAG`为隐藏 + +```shell +curl 'https://space.bilibili.com/ajax/settings/setPrivacy' \ +--data-urlencode 'tags=0' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' \ +-e 'https://www.bilibili.com' +``` + +
+查看响应示例: + +```json +{ + "status": true +} +``` + +
+ +### 查询用户最近访问内容 + +#### 查询用户最近玩过的游戏 + +> https://api.bilibili.com/x/space/lastplaygame + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +如设置隐私查看自己的需要认证 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------------------------------- | -------- | ---------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 隐藏时:null
公开时:array | 信息本体 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---------------- | +| 0 | obj | 游戏1 | | +| n | obj | 游戏(n+1) | 项数为总计游戏数 | +| …… | obj | …… | …… | + +`data`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | ---------- | ---- | +| website | str | 游戏主页 url | | +| image | str | 游戏图标 url | | +| name | str | 游戏名 | | + +**示例:** + +查询`mid=2`的最近玩过的游戏 + +```shell +curl -G 'https://api.bilibili.com/x/space/lastplaygame' \ + --data-urlencode 'mid=2' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "website": "https://game.bilibili.com/fgo/event_meihosou", + "image": "http://i0.hdslb.com/bfs/game/f7d4ee0877089e4079b8f0b4f5c95dd4ceba512a.png", + "name": "命运-冠位指定(Fate/GO)" + }, + { + "website": "https://game.bilibili.com/pcr/xxtix", + "image": "http://i0.hdslb.com/bfs/game/7922ecea5cc76fe3c8c177e1d4a6c8cf1c36a700.jpg", + "name": "公主连结Re:Dive" + }, + { + "website": "https://game.bilibili.com/dwbgx/", + "image": "http://i0.hdslb.com/bfs/game/6d5b2df70dfa987408d8d09110cdc327949885e3.png", + "name": "大王不高兴" + }, + { + "website": "https://game.bilibili.com/bangdream/1stanniversary-yxzx/", + "image": "http://i0.hdslb.com/bfs/game/4a7d0b7272dffe5a489ee935b6bd2d4f7d5f1257.png", + "name": "BanG Dream!" + }, + { + "website": "http://www.biligame.com/detail/?id=101772", + "image": "http://i0.hdslb.com/bfs/game/8e8b04e7bd2170c2ba2c9f563a62c72bac2eba2c.jpg", + "name": "明日方舟" + } + ] +} +``` + +
+ +#### 查询用户最近玩过的游戏V2 + +> https://api.bilibili.com/x/space/lastplaygame/v2 + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +如设置隐私查看自己的需要认证 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------------------------------- | -------- | ---------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 隐藏时:null
公开时:obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ----- | ------ | --- | +| page_num | num | 当前页码 | | +| page_size | num | 每页项数 | | +| total_count | num | 游戏总数 | | +| list | array | 游戏列表 | | + +`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------- | ---------------- | +| 0 | obj | 游戏1 | | +| n | obj | 游戏(n+1) | 项数为总计游戏数 | +| …… | obj | …… | …… | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ----- | ----------- | ----------------- | +| game_base_id | num | 游戏 id | biligame 的游戏 id | +| game_name | str | 游戏名 | | +| game_icon | str | 游戏图标 url | | +| grade | num | 游戏评分 | 如`8.2`、`6.8` | +| detail_url | str | 游戏主页 url | | +| game_tags | array | 游戏标签 | | +| notice | str | 游戏简介文案 | | +| gift_title | str | 游戏礼物文案 | | +| game_status_v2 | num | (?) | | + +`game_tags`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------ | --------------------------- | +| 0 | obj | 游戏标签1 | 如`角色扮演`、`音乐节奏`、`休闲` | +| n | obj | 游戏标签(n+1) | | +| …… | obj | …… | …… | + +**示例:** + +查询`mid=2`的最近玩过的游戏 + +```shell +curl -G 'https://api.bilibili.com/x/space/lastplaygame/v2' \ + --data-urlencode 'mid=2' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "page_num": 0, + "page_size": 15, + "total_count": 8, + "list": [ + { + "game_base_id": 102567, + "game_name": "坎特伯雷公主与骑士唤醒冠军之剑的奇幻冒险", + "game_icon": "https://i0.hdslb.com/bfs/game/fc2f4fd3a347eeb9b8b6ab59d961269bdd05d4e0.png", + "grade": 8.2, + "detail_url": "https://www.biligame.com/detail/?id=102567", + "game_tags": [ + "角色扮演", + "像素风" + ], + "notice": "像素风欢脱冒险RPG", + "gift_title": "", + "game_status_v2": 0 + }, + { + "game_base_id": 101661, + "game_name": "光·遇", + "game_icon": "https://i0.hdslb.com/bfs/game/9a1be39915f057597f9328afe503a2bbd0de7754.png", + "grade": 6.8, + "detail_url": "https://www.biligame.com/detail/?id=101661", + "game_tags": [ + "休闲", + "治愈", + "唯美" + ], + "notice": "九色鹿季开启,探索本真之旅", + "gift_title": "光·遇九色鹿季回归礼包", + "game_status_v2": 0 + }, + { + "game_base_id": 103496, + "game_name": "原神", + "game_icon": "https://i0.hdslb.com/bfs/game/2b29383536b3d1a2517bfcb73767f78c242f0458.png", + "grade": 6.5, + "detail_url": "https://www.biligame.com/detail/?id=103496", + "game_tags": [ + "角色扮演", + "二次元", + "冒险" + ], + "notice": "跨越尘世的探索之旅", + "gift_title": "bilibili-原神4.4版本独家礼包", + "game_status_v2": 0 + }, + { + "game_base_id": 49, + "game_name": "命运-冠位指定(Fate/GO)", + "game_icon": "https://i0.hdslb.com/bfs/game/ca5d8d4b3a042beddf7cabca20ae0c946527d1bf.png", + "grade": 6, + "detail_url": "https://www.biligame.com/detail/?id=49", + "game_tags": [ + "卡牌", + "fate", + "厨向" + ], + "notice": "第2部现已开启!", + "gift_title": "", + "game_status_v2": 0 + }, + { + "game_base_id": 102216, + "game_name": "公主连结Re:Dive", + "game_icon": "https://i0.hdslb.com/bfs/game/3bb819e010fe6d594d8f4d417ee380f40e8b5b06.png", + "grade": 8.4, + "detail_url": "https://www.biligame.com/detail/?id=102216", + "game_tags": [ + "角色扮演" + ], + "notice": "新角色「璃乃(圣诞节)」登场!", + "gift_title": "", + "game_status_v2": 0 + }, + { + "game_base_id": 168, + "game_name": "BanG Dream!", + "game_icon": "https://i0.hdslb.com/bfs/game/d196365d9f112a5adede7eedea1e4154e98c5e53.png", + "grade": 9.2, + "detail_url": "https://www.biligame.com/detail/?id=168", + "game_tags": [ + "音乐节奏", + "BanG Dream" + ], + "notice": "「迎风展翅的我们」活动开启!", + "gift_title": "", + "game_status_v2": 0 + }, + { + "game_base_id": 101772, + "game_name": "明日方舟", + "game_icon": "https://i0.hdslb.com/bfs/game/faa556b00d29fffc88281c1ee038b1b7f23aa5c2.jpg", + "grade": 7.4, + "detail_url": "https://www.biligame.com/detail/?id=101772", + "game_tags": [ + "策略", + "架空文明", + "末世" + ], + "notice": "2023感谢庆典正式开启", + "gift_title": "", + "game_status_v2": 0 + }, + { + "game_base_id": 97, + "game_name": "碧蓝航线", + "game_icon": "https://i0.hdslb.com/bfs/game/b141a7690c226a0eae66518c713d3af62613b21d.png", + "grade": 8.7, + "detail_url": "https://www.biligame.com/detail/?id=97", + "game_tags": [ + "养成" + ], + "notice": "指挥官,欢迎回港", + "gift_title": "", + "game_status_v2": 0 + } + ] + } +} +``` + +
+ +#### 查询用户最近投币视频(Web) + +> https://api.bilibili.com/x/space/coin/video + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +如设置隐私查看自己的需要认证 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | --------- | ------ | ---- | +| vmid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------------------------------- | -------- | ---------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 隐藏时:null
公开时:array | 信息本体 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ---- | +| 0 | obj | 投币视频1 | | +| n | obj | 投币视频(n+1) | | +| …… | obj | …… | | + +`data`数组中的对象: + +基本与[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中`data`对象字段一致 + +**示例:** + +查看用户`mid=15858903`的最近投币视频 + +```shell +curl -G 'http://space.bilibili.com/x/space/coin/video' \ + --data-urlencode 'vmid=15858903' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "aid": 669644066, + "videos": 1, + "tid": 75, + "tname": "动物圈", + "copyright": 2, + "pic": "http://i1.hdslb.com/bfs/archive/0f73a68b8f449cc72e9ef109685bd295dc0c0c9d.jpg", + "title": "在人类幼崽身上用尽了温柔", + "pubdate": 1600608261, + "ctime": 1600608261, + "desc": "https://weibo.com/tv/show/1034:4551253766897703?from=old_pc_videoshow", + "state": 0, + "attribute": 16384, + "duration": 29, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0 + }, + "owner": { + "mid": 258457966, + "name": "卧龙寺", + "face": "http://i2.hdslb.com/bfs/face/f868d1f522733fdcf72a6267e0237157dd0e9948.jpg" + }, + "stat": { + "aid": 669644066, + "view": 3412898, + "danmaku": 719, + "reply": 1481, + "favorite": 21909, + "coin": 2864, + "share": 13702, + "now_rank": 0, + "his_rank": 0, + "like": 86970, + "dislike": 0 + }, + "dynamic": "", + "cid": 237319289, + "dimension": { + "width": 576, + "height": 1024, + "rotate": 0 + }, + "bvid": "BV1sa4y1j7jk", + "coins": 1, + "time": 1601802763, + "ip": "", + "inter_video": false + }, + { + "aid": 202267998, + "videos": 1, + "tid": 138, + "tname": "搞笑", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/ca7746f2207114513f1a421d7f744523275ee679.jpg", + "title": "充 电 器 の 痛", + "pubdate": 1601750952, + "ctime": 1601750952, + "desc": "这个简介吓到我了!", + "state": 0, + "attribute": 16512, + "duration": 50, + "mission_id": 14725, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0 + }, + "owner": { + "mid": 129922746, + "name": "-白糖洒一地-", + "face": "http://i0.hdslb.com/bfs/face/1f581f3b20a380c2fd13ecb8bbe409f8b49c6418.jpg" + }, + "stat": { + "aid": 202267998, + "view": 109, + "danmaku": 2, + "reply": 11, + "favorite": 5, + "coin": 9, + "share": 0, + "now_rank": 0, + "his_rank": 0, + "like": 20, + "dislike": 0 + }, + "dynamic": "", + "cid": 241861687, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "bvid": "BV1oh411X7iA", + "coins": 2, + "time": 1601773750, + "ip": "", + "inter_video": false + }, + { + "aid": 839722373, + "videos": 1, + "tid": 208, + "tname": "校园学习", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/11ed53241ceab314c919adba9f85582d24d9313c.jpg", + "title": "“白piáo”用日语到底怎么说?油管人气日语老师来教你!", + "pubdate": 1601026026, + "ctime": 1601026026, + "desc": "志方老师的B站用语日语课又来了~\n欢迎大家来看哦,\n如果喜欢我们的作品的话,欢迎大家用2~3连+转发来支持我们~\n如果拒绝的话,也可以用日语在评论和弹幕里刷上一波~即可以锻炼日语又可以拒绝我们,岂不美哉~~", + "state": 0, + "attribute": 16768, + "duration": 310, + "mission_id": 14655, + "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": 677926489, + "name": "日语志方老师", + "face": "http://i2.hdslb.com/bfs/face/d465e5cd42e3523a52b3bef38dce7b23627b7723.jpg" + }, + "stat": { + "aid": 839722373, + "view": 130688, + "danmaku": 1320, + "reply": 799, + "favorite": 3722, + "coin": 5883, + "share": 339, + "now_rank": 0, + "his_rank": 0, + "like": 17585, + "dislike": 0 + }, + "dynamic": "志方老师的B站用语日语课又来了~\n欢迎大家来看哦,\n如果喜欢我们的作品的话,欢迎大家用2~3连+转发来支持我们~\n如果拒绝的话,也可以用日语在评论和弹幕里刷上一波~即可以锻炼日语又可以拒绝我们,岂不美哉~~", + "cid": 238876133, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "bvid": "BV1n54y117kq", + "coins": 2, + "time": 1601036198, + "ip": "", + "inter_video": false + } + ] +} +``` + +
+ +#### 查询用户最近投币视频(APP) + +> https://app.bilibili.com/x/v2/space/coinarc + +*请求方式:GET* + +认证方式:APP + +如设置隐私查看自己的需要认证 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ----------- | ------ | -------- | +| access_key | str | APP登录Token | APP方式必要 | | +| appkey | str | APP密钥 | APP方式必要 | | +| vmid | num | 目标用户mid | 必要 | | +| pn | num | 页码 | 非必要 | 默认为1 | +| ps | num | 每页项数 | 非必要 | 默认为20 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------ | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ----- | ---------- | ---- | +| count | num | 投币的视频数 | | +| item | array | 投币视频列表 | | + +`item`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------------ | ---- | +| 0 | obj | 投币的视频信息1 | | +| n | obj | 投币的视频信息(n+1) | | +| …… | obj | …… | | + +`item`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | ------------ | ---------------------- | +| title | str | 稿件标题 | | +| subtitle | str | 空 | | +| tname | str | 空 | | +| cover | str | 封面图片 url | | +| cover_icon | str | 空 | | +| uri | str | APP 跳转 uri | 如`bilibili://video/2` | +| param | str | 稿件 avid | | +| goto | str | av | | +| length | num | 空 | | +| duration | num | 稿件视频长度 | 单位为秒 | +| is_popular | bool | (?) | | +| is_steins | bool | (?) | | +| is_ugcpay | bool | (?) | | +| is_cooperation | str | (?) | | +| is_pgc | str | (?) | | +| is_live_playback | str | (?) | | +| is_pugv | str | (?) | | +| is_fold | num | (?) | | +| play | num | 播放量 | | +| danmaku | num | 弹幕量 | | +| ctime | num | 发布时间 | 时间戳 | +| ugc_pay | num | 0 | | +| author | str | UP主昵称 | | +| state | bool | true | | +| videos | num | 0 | | +| view_content | str | 稿件播放量文案 | | +| icon_type | num | 0 | | +| publish_time_text | str | 空 | | + +**示例:** + +用户`mid=2`的投币列表 + +```shell +curl -G 'https://app.bilibili.com/x/v2/space/coinarc' \ + --data-urlencode 'appkey=1d8b6e7d45233436' \ + --data-urlencode 'access_key=xxx' \ + --data-urlencode 'vmid=2' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "count": 2, + "item": [ + { + "title": "请打开麦克风交流", + "subtitle": "", + "tname": "", + "cover": "http://i1.hdslb.com/bfs/archive/cf9aea43b72354ee8c9486e4bf8e07cb38920a65.jpg", + "cover_icon": "", + "uri": "bilibili://video/496832459?player_width=1080\u0026player_height=1920\u0026player_rotate=0", + "param": "496832459", + "goto": "av", + "length": "", + "duration": 134, + "is_popular": false, + "is_steins": false, + "is_ugcpay": false, + "is_cooperation": false, + "is_pgc": false, + "is_live_playback": false, + "is_pugv": false, + "is_fold": false, + "play": 706480, + "danmaku": 167, + "ctime": 1706431476, + "ugc_pay": 0, + "author": "三个猪鼓励", + "state": true, + "videos": 0, + "view_content": "70.6万", + "icon_type": 0, + "publish_time_text": "" + }, + { + "title": "【裏命】地球的内部【いよわ】【中文CC字幕】", + "subtitle": "", + "tname": "", + "cover": "http://i0.hdslb.com/bfs/archive/e087224ae4a5ff9ef3f2f6b7644d635276b8f5c6.jpg", + "cover_icon": "", + "uri": "bilibili://video/860645391?player_width=1920\u0026player_height=1080\u0026player_rotate=0", + "param": "860645391", + "goto": "av", + "length": "", + "duration": 264, + "is_popular": false, + "is_steins": false, + "is_ugcpay": false, + "is_cooperation": false, + "is_pgc": false, + "is_live_playback": false, + "is_pugv": false, + "is_fold": false, + "play": 194375, + "danmaku": 173, + "ctime": 1669713070, + "ugc_pay": 0, + "author": "精神安定剤", + "state": true, + "videos": 0, + "view_content": "19.4万", + "icon_type": 0, + "publish_time_text": "" + } + ] + } +} +``` + +
+ +#### 查询用户最近点赞视频(Web) + +> https://api.bilibili.com/x/space/like/video + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +如设置隐私查看自己的需要认证 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | --------- | ------ | ---- | +| vmid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------------------------------- | -------- | ---------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 隐藏时:null
公开时:array | 信息本体 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ---- | +| 0 | obj | 点赞视频1 | | +| n | obj | 点赞视频(n+1) | | +| …… | obj | …… | | + +`data`数组中的对象: + +基本与[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中`data`对象字段一致 + +**示例:** + +查看用户`mid=15858903`的最近点赞视频 + +```shell +curl -G 'http://space.bilibili.com/x/space/like/video' \ + --data-urlencode 'vmid=15858903' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [ + { + "aid": 1700085880, + "videos": 1, + "tid": 21, + "tname": "日常", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/7fad4ca408c66eb7ea72188f56bcf952306d5807.jpg", + "title": "你是从什么时候,意识到自己缺爱的呢?", + "pubdate": 1706706000, + "ctime": 1706602115, + "desc": "关于个人情感问题,私信发“2024”我来帮你~", + "state": 0, + "duration": 91, + "mission_id": 4009559, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 2104592226, + "name": "鲸落艳红尘", + "face": "https://i0.hdslb.com/bfs/face/80160fbcf71958e6f5ad3a4fdfa39a55cc0699a5.jpg" + }, + "stat": { + "aid": 1700085880, + "view": 930, + "danmaku": 1, + "reply": 5, + "favorite": 18, + "coin": 0, + "share": 4, + "now_rank": 0, + "his_rank": 0, + "like": 27, + "dislike": 0, + "vt": 0, + "vv": 930 + }, + "dynamic": "", + "cid": 1424231007, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1XK421y7ZL", + "first_frame": "http://i2.hdslb.com/bfs/storyff/n240130sa1k9birz4lwlsm21ya1w3p2c_firsti.jpg", + "pub_location": "湖北", + "bvid": "BV1XK421y7ZL", + "inter_video": false, + "resource_type": "ugc", + "subtitle": "", + "enable_vt": 0 + }, + { + "aid": 836926413, + "videos": 1, + "tid": 21, + "tname": "日常", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/dceaf79d1cc4f74ab8cd862f454a8ec4b4a44343.jpg", + "title": "内心的创伤,是建立深度亲密关系的桥梁!", + "pubdate": 1706594400, + "ctime": 1706515438, + "desc": "关于个人情感问题,私信发“2024”我来帮你~", + "state": 0, + "duration": 297, + "mission_id": 4009559, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 2104592226, + "name": "鲸落艳红尘", + "face": "https://i0.hdslb.com/bfs/face/80160fbcf71958e6f5ad3a4fdfa39a55cc0699a5.jpg" + }, + "stat": { + "aid": 836926413, + "view": 1903, + "danmaku": 0, + "reply": 7, + "favorite": 142, + "coin": 34, + "share": 30, + "now_rank": 0, + "his_rank": 0, + "like": 118, + "dislike": 0, + "vt": 0, + "vv": 1903 + }, + "dynamic": "", + "cid": 1423127570, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1xg4y1e7kY", + "first_frame": "http://i0.hdslb.com/bfs/storyff/n240129qn55at7dr1775k12hp34tw284_firsti.jpg", + "pub_location": "湖北", + "bvid": "BV1xg4y1e7kY", + "inter_video": false, + "resource_type": "ugc", + "subtitle": "", + "enable_vt": 0 + }, + …… + ] + } +} +``` + +
+ +#### 查询用户最近点赞视频(APP) + +> https://app.bilibili.com/x/v2/space/likearc + +*请求方式:GET* + +认证方式:APP + +如设置隐私查看自己的需要认证 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ----------- | ------ | -------- | +| access_key | str | APP登录Token | APP方式必要 | | +| appkey | str | APP密钥 | APP方式必要 | | +| vmid | num | 目标用户mid | 必要 | | +| pn | num | 页码 | 非必要 | 默认为1 | +| ps | num | 每页项数 | 非必要 | 默认为20 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ----- | ---------- | ---- | +| count | num | 点赞的视频数 | | +| item | array | 点赞视频列表 | | + +`item`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------------ | ---- | +| 0 | obj | 点赞的视频信息1 | | +| n | obj | 点赞的视频信息(n+1) | | +| …… | obj | …… | | + +`item`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ---- | ------------ | ---------------------- | +| title | str | 稿件标题 | | +| subtitle | str | 空 | | +| tname | str | 空 | | +| cover | str | 封面图片 url | | +| cover_icon | str | 空 | | +| uri | str | APP 跳转 uri | 如`bilibili://video/2` | +| param | str | 稿件 avid | | +| goto | str | av | | +| length | num | 空 | | +| duration | num | 稿件视频长度 | 单位为秒 | +| is_popular | bool | (?) | | +| is_steins | bool | (?) | | +| is_ugcpay | bool | (?) | | +| is_cooperation | str | (?) | | +| is_pgc | str | (?) | | +| is_live_playback | str | (?) | | +| is_pugv | str | (?) | | +| is_fold | num | (?) | | +| play | num | 播放量 | | +| danmaku | num | 弹幕量 | | +| ctime | num | 发布时间 | 时间戳 | +| ugc_pay | num | 0 | | +| author | str | UP主昵称 | | +| state | bool | true | | +| videos | num | 0 | | +| view_content | str | 稿件播放量文案 | | +| icon_type | num | 0 | | +| publish_time_text | str | 空 | | + +**示例:** + +用户`mid=2`的点赞列表 + +```shell +curl -G 'https://app.bilibili.com/x/v2/space/likearc' \ + --data-urlencode 'appkey=1d8b6e7d45233436' \ + --data-urlencode 'access_key=xxx' \ + --data-urlencode 'vmid=2' \ + --data-urlencode 'ps=2' \ + --data-urlencode 'pn=1' \ +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "count": 2, + "item": [ + { + "title": "兄弟难舍也难分", + "subtitle": "", + "tname": "", + "cover": "http://i1.hdslb.com/bfs/archive/58f031a52eab6d5faec5a39dfaab5728f65672d5.jpg", + "cover_icon": "", + "uri": "bilibili://video/624351941?player_width=1080\u0026player_height=1920\u0026player_rotate=0", + "param": "624351941", + "goto": "av", + "length": "", + "duration": 216, + "is_popular": false, + "is_steins": false, + "is_ugcpay": false, + "is_cooperation": false, + "is_pgc": false, + "is_live_playback": false, + "is_pugv": false, + "is_fold": false, + "play": 423652, + "danmaku": 362, + "ctime": 1706320200, + "ugc_pay": 0, + "author": "甜蜜老张", + "state": true, + "videos": 0, + "view_content": "42.4万", + "icon_type": 0, + "publish_time_text": "" + }, + { + "title": "技能搭配不累,共赴热血团战!", + "subtitle": "", + "tname": "", + "cover": "http://i2.hdslb.com/bfs/archive/2094b8e0be819222d320e2841ee1c39f5f2e4357.jpg", + "cover_icon": "", + "uri": "bilibili://video/793597196?player_width=1280\u0026player_height=720\u0026player_rotate=0", + "param": "793597196", + "goto": "av", + "length": "", + "duration": 41, + "is_popular": false, + "is_steins": false, + "is_ugcpay": false, + "is_cooperation": false, + "is_pgc": false, + "is_live_playback": false, + "is_pugv": false, + "is_fold": false, + "play": 1237, + "danmaku": 2, + "ctime": 1704855559, + "ugc_pay": 0, + "author": "38047aa1-cb8a-4", + "state": true, + "videos": 0, + "view_content": "1237", + "icon_type": 0, + "publish_time_text": "" + } + ] + } +} +``` + +
+ +## 投稿 + + + +### 查询用户投稿视频明细 + +> https://api.bilibili.com/x/space/wbi/arc/search + +> ~~https://api.bilibili.com/x/space/arc/search~~ (已废弃,保留是方便遇到问题的人搜索到此处) + +*请求方式:GET* + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +另见 [根据关键词查找视频](../video/collection.md#根据关键词查找视频), 功能基本相同, 暂未发现风控校验 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------- | ---- | ------------ | ------ | ----------------------------------------------------------------------------- | +| mid | num | 目标用户mid | 必要 | | +| order | str | 排序方式 | 非必要 | 默认为pubdate
最新发布:pubdate
最多播放:click
最多收藏:stow | +| tid | num | 筛选目标分区 | 非必要 | 默认为0
0:不进行分区筛选
分区tid为所筛选的分区 | +| keyword | str | 关键词筛选 | 非必要 | 用于使用关键词搜索该UP主视频稿件 | +| pn | num | 页码 | 非必要 | 默认为 `1` | +| ps | num | 每页项数 | 非必要 | 默认为 `30` | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
-412:请求被拦截 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | -------------- | ---- | +| list | obj | 列表信息 | | +| page | obj | 页面信息 | | +| episodic_button | obj | “播放全部“按钮 | | +| is_risk | bool | | | +| gaia_res_type | num | | | +| gaia_data | obj | | | + +`data`中的`list`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ------ | ---------------- | ---- | +| slist | array | 空数组 | | +| tlist | obj | 投稿视频分区索引 | | +| vlist | array | 投稿视频列表 | | + +`list`中的`tlist`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ------------ | --------------------- | +| {tid} | obj | 该分区的详情 | 字段名为存在的分区tid | +| …… | obj | …… | 向下扩展 | + +`tlist`中的`{tid}`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | -------------------- | ---- | +| count | num | 投稿至该分区的视频数 | | +| name | str | 该分区名称 | | +| tid | num | 该分区tid | | + +`list`中的`vlist`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ---- | +| 0 | obj | 投稿视频1 | | +| n | obj | 投稿视频(n+1) | | +| …… | obj | …… | …… | + +`list`中的`vlist`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------ | ---- | -------------- | ---------------------------- | +| aid | num | 稿件avid | | +| attribute | num | | | +| author | str | 视频UP主 | 不一定为目标用户(合作视频) | +| bvid | str | 稿件bvid | | +| comment | num | 视频评论数 | | +| copyright | str | 视频版权类型 | | +| created | num | 投稿时间 | 时间戳 | +| description | str | 视频简介 | | +| elec_arc_type | num | 充电为1,否则0 | 可能还有其他情况 | +| enable_vt | num | 0 | 作用尚不明确 | +| hide_click | bool | false | 作用尚不明确 | +| is_avoided | num | 0 | 作用尚不明确 | +| is_charging_arc | bool | 是否为充电视频 | | +| is_lesson_video | num | 是否为课堂视频 | 0:否
1:是 | +| is_lesson_finished | num | 课堂是否已完结 | 0:否
1:是 | +| is_live_playback | num | 是否为直播回放 | 0:否
1:是 | +| is_pay | num | 0 | 作用尚不明确 | +| is_self_view | bool | false | 作用尚不明确 | +| is_steins_gate | num | 是否为互动视频 | 0:否
1:是 | +| is_union_video | num | 是否为合作视频 | 0:否
1:是 | +| jump_url | str | 跳转链接 | 跳转到课堂的链接,否则为"" | +| length | str | 视频长度 | MM:SS | +| mid | num | 视频UP主mid | 不一定为目标用户(合作视频) | +| meta | obj | 所属合集或课堂 | 无数据时为 null | +| pic | str | 视频封面 | | +| play | num | 视频播放次数 | | +| playback_position | num | 百分比播放进度 | 封面下方显示的粉色条 | +| review | num | 0 | 作用尚不明确 | +| season_id | num | 合集或课堂编号 | 都不属于时为0 | +| subtitle | str | 空 | 作用尚不明确 | +| title | str | 视频标题 | | +| typeid | num | 视频分区tid | | +| video_review | num | 视频弹幕数 | | +| vt | num | 0 | 作用尚不明确 | +| vt_display | str | 空 | 作用尚不明确 | + +`list`中的`vlist`数组中的对象中的`meta`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ------------ | ---------------- | +| attribute | num | 0 | 作用尚不明确 | +| cover | str | 合集封面URL | | +| ep_count | num | 合集视频数量 | | +| ep_num | num | 合集视频数量 | | +| first_aid | num | 首个视频av号 | | +| id | num | 合集id | | +| intro | str | 合集介绍 | | +| mid | num | UP主uid | 若为课堂,则为0 | +| ptime | num | unix时间(s) | 最后更新时间 | +| sign_state | num | 0 | 作用尚不明确 | +| stat | obj | 合集统计数据 | | +| title | str | 合集名称 | | + +`list`中的`vlist`数组中的对象中的`meta`对象中的`stat`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ------------ | -------------------- | +| coin | num | 合集总投币数 | | +| danmaku | num | 合集总弹幕数 | | +| favorite | num | 合集总收藏数 | | +| like | num | 合集总点赞数 | | +| mtime | num | unix时间(s) | 其他统计数据更新时间 | +| reply | num | 合集总评论数 | | +| season_id | num | 合集id | | +| share | num | 合集总分享数 | | +| view | num | 合集总播放量 | | +| vt | num | 0 | 作用尚不明确 | +| vv | num | 0 | 作用尚不明确 | + +`data`中的`page`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ---------- | ---- | +| count | num | 总计稿件数 | | +| pn | num | 当前页码 | | +| ps | num | 每页项数 | | + +`data`中的`episodic_button`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | ---- | +| text | str | 按钮文字 | | +| uri | str | 全部播放页url | | + +**示例:** + +`pn`(页码)和`ps`(每页项数)只改变`vlist`中成员的多少与内容 + +以每页2项查询用户`mid=53456`的第1页投稿视频明细 + +```shell +curl -G 'https://api.bilibili.com/x/space/arc/search' \ +--data-urlencode 'mid=53456' \ +--data-urlencode 'ps=2' \ +--data-urlencode 'pn=1' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": { + "slist": [], + "tlist": { + "1": { + "tid": 1, + "count": 3, + "name": "动画" + }, + "129": { + "tid": 129, + "count": 1, + "name": "舞蹈" + }, + "160": { + "tid": 160, + "count": 96, + "name": "生活" + }, + "177": { + "tid": 177, + "count": 4, + "name": "纪录片" + }, + "181": { + "tid": 181, + "count": 50, + "name": "影视" + }, + "188": { + "tid": 188, + "count": 444, + "name": "科技" + }, + "196": { + "tid": 196, + "count": 2, + "name": "课堂" + } + }, + "vlist": [{ + "comment": 985, + "typeid": 250, + "play": 224185, + "pic": "http://i0.hdslb.com/bfs/archive/5e56c10a9bd67f2fcac46fdd0fc2caa8769700c8.jpg", + "subtitle": "", + "description": "这一次,我们的样片日记首次来到了西藏,在桃花季开启了藏东样片之旅!这趟“开荒”之旅我们跋山涉水,一路硬刚,多亏有路虎卫士这样的神队友撑全场!这次的素材我们也上传到了官网(ysjf.com/material),欢迎大家去看看~如果你喜欢这期视频,请多多支持我们,并把视频分享给你的朋友们一起看看!", + "copyright": "1", + "title": "和朋友去西藏拍样片日记……", + "review": 0, + "author": "影视飓风", + "mid": 946974, + "created": 1745290800, + "length": "22:11", + "video_review": 2365, + "aid": 114375683741573, + "bvid": "BV1ac5yzhE94", + "hide_click": false, + "is_pay": 0, + "is_union_video": 1, + "is_steins_gate": 0, + "is_live_playback": 0, + "is_lesson_video": 0, + "is_lesson_finished": 0, + "lesson_update_info": "", + "jump_url": "", + "meta": { + "id": 2046621, + "title": "样片日记", + "cover": "https://archive.biliimg.com/bfs/archive/e2ca3e5a6672cf35c9e61ac02e8d739cc0aafa8b.jpg", + "mid": 946974, + "intro": "", + "sign_state": 0, + "attribute": 140, + "stat": { + "season_id": 2046621, + "view": 31755096, + "danmaku": 171253, + "reply": 33685, + "favorite": 409505, + "coin": 935105, + "share": 199467, + "like": 1791607, + "mtime": 1745309513, + "vt": 0, + "vv": 0 + }, + "ep_count": 13, + "first_aid": 238588630, + "ptime": 1745290800, + "ep_num": 13 + }, + "is_avoided": 0, + "season_id": 2046621, + "attribute": 16793984, + "is_charging_arc": false, + "elec_arc_type": 0, + "vt": 0, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0, + "is_self_view": false + }, { + "comment": 0, + "typeid": 197, + "play": 8506, + "pic": "https://archive.biliimg.com/bfs/archive/489f3df26a190a152ad479bfe50a73f1cd4c43c5.jpg", + "subtitle": "", + "description": "8节课,Tim和青青带你用iPhone拍出电影感", + "copyright": "1", + "title": "【影视飓风】只看8节课,用iPhone拍出电影感", + "review": 0, + "author": "影视飓风", + "mid": 946974, + "created": 1744865737, + "length": "00:00", + "video_review": 9, + "aid": 114351440726681, + "bvid": "BV1WB5ezxEnz", + "hide_click": false, + "is_pay": 0, + "is_union_video": 0, + "is_steins_gate": 0, + "is_live_playback": 0, + "is_lesson_video": 1, + "is_lesson_finished": 1, + "lesson_update_info": "8", + "jump_url": "https://www.bilibili.com/cheese/play/ss190402215", + "meta": { + "id": 190402215, + "title": "【影视飓风】只看8节课,用iPhone拍出电影感", + "cover": "https://archive.biliimg.com/bfs/archive/489f3df26a190a152ad479bfe50a73f1cd4c43c5.jpg", + "mid": 0, + "intro": "", + "sign_state": 0, + "attribute": 0, + "stat": { + "season_id": 190402215, + "view": 1111222, + "danmaku": 1853, + "reply": 0, + "favorite": 0, + "coin": 0, + "share": 0, + "like": 0, + "mtime": 0, + "vt": 0, + "vv": 0 + }, + "ep_count": 0, + "ptime": 1744865737, + "ep_num": 0 + }, + "is_avoided": 0, + "season_id": 190402215, + "attribute": 1073758592, + "is_charging_arc": false, + "elec_arc_type": 0, + "vt": 0, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0, + "is_self_view": false + }] + }, + "page": { + "pn": 1, + "ps": 42, + "count": 786 + }, + "episodic_button": { + "text": "播放全部", + "uri": "//www.bilibili.com/medialist/play/946974?from=space" + }, + "is_risk": false, + "gaia_res_type": 0, + "gaia_data": null + } +} +``` + +
+ +### 查询用户投稿相簿预览 + +
+相簿功能已下线, 以下接口失效, 参见 +#801 + + +> https://api.bilibili.com/x/space/album/index + +*请求方式:GET* + +所有类型的相簿 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------ | ------ | ------- | +| mid | num | 目标用户mid | 必要 | | +| ps | num | 获取的相簿量 | 非必要 | 默认为8 定义域 1-大于1700 (注意滥用风险) | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | array | 相簿列表 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ---- | +| 0 | obj | 相簿内容1 | | +| n | obj | 相簿内容(n+1) | | +| …… | obj | …… | …… | + +`data`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ------ | ----------- | -------------- | +| count | num | 总计图片数 | | +| ctime | num | 发布时间 | 时间戳 | +| description | str | 简介 | | +| doc_id | num | 相簿id | 非动态!!! | +| like | num | 点赞数 | | +| pictures | array | 图片内容 | | +| poster_uid | num | 上传用户mid | | +| title | str | 标题 | 动态内容无 | +| view | num | 浏览数 | | + +`data`数组中的对象中的`pictures`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | --------------------- | +| 0 | obj | 内容图片1 | | +| n | obj | 内容图片(n+1) | 项数取决于`count`的值 | +| …… | obj | …… | …… | + +`pictures`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | -------- | ----------- | +| img_height | num | 图片高度 | | +| img_size | num | 图片大小 | 单位为KByte | +| img_src | str | 图片url | | +| img_width | num | 图片宽度 | | + +**示例:** + +查询用户`mid=53456`的投稿相簿预览 + +```shell +curl -G 'https://api.bilibili.com/x/space/album/index' \ +--data-urlencode 'mid=53456' \ +--data-urlencode 'ps=2' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [{ + "doc_id": 60470424, + "poster_uid": 53456, + "title": "", + "description": "你醒啦![tv_大佬]\n之前说到过的百万粉纪念的视频已经定时在了今天下午七点,欢迎来看呀!", + "pictures": [{ + "img_src": "https://i0.hdslb.com/bfs/album/2840366e30bf7c0aba9da5adde1a771255a57bc7.jpg", + "img_width": 625, + "img_height": 134, + "img_size": 14 + }], + "count": 1, + "ctime": 1583444859, + "view": 1677521, + "like": 29974 + }, { + "doc_id": 58962388, + "poster_uid": 53456, + "title": "", + "description": "上次的那些写实儿童画发出来啦!可以打印下来辟邪[tv_大佬]", + "pictures": [{ + "img_src": "https://i0.hdslb.com/bfs/album/8acaf7c7897cb858cccab36c33a5e875adfef177.jpg", + "img_width": 2172, + "img_height": 3258, + "img_size": 2831 + }, { + "img_src": "https://i0.hdslb.com/bfs/album/1611b6b56d3d4328889a62b9f9bdc92e9d065532.jpg", + "img_width": 3456, + "img_height": 5184, + "img_size": 3024 + }, { + "img_src": "https://i0.hdslb.com/bfs/album/f3a30a2ef5b39711af8b945d54d85ffd1e932b8a.jpg", + "img_width": 1200, + "img_height": 757, + "img_size": 313 + }], + "count": 3, + "ctime": 1582881332, + "view": 1176646, + "like": 25734 + }] +} +``` + +
+ +
+ +### 查询用户投稿相簿明细 + +
+ +相簿功能已下线, 以下接口失效 + + +> https://api.vc.bilibili.com/link_draw/v1/doc/doc_list +> https://api.bilibili.com/x/dynamic/feed/draw/doc_list + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | ----------- | ------ | ------------------------------------------------------------ | +| uid | num | 目标用户mid | 必要 | | +| page_num | num | 页码 | 必要 | 默认为0 | +| page_size | num | 每页项数 | 必要 | 默认为30 | +| biz | str | 查询类型 | 非必要 | 全部:all
绘画:draw
摄影:photo
日常:daily
默认为all | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------- | +| code | num | 返回值 | 0:成功 | +| msg | str | 错误信息 | 默认为success | +| message | str | 错误信息 | 默认为success | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ------ | -------- | ---- | +| items | array | 相簿列表 | | + +`items`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ---- | +| 0 | obj | 相簿内容1 | | +| n | obj | 相簿内容(n+1) | | +| …… | obj | …… | …… | + +`items`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ------ | ----------- | -------------- | +| count | num | 总计图片数 | | +| ctime | num | 发布时间 | 时间戳 | +| description | str | 简介 | | +| doc_id | num | 相簿id | 非动态!!! | +| like | num | 点赞数 | | +| pictures | array | 图片内容 | | +| poster_uid | num | 上传用户mid | | +| title | str | 标题 | 动态内容无 | +| view | num | 浏览数 | | + +`items`数组中的对象中的`pictures`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | --------------------- | +| 0 | obj | 内容图片1 | | +| n | obj | 内容图片(n+1) | 项数取决于`count`的值 | +| …… | obj | …… | …… | + +`pictures`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | -------- | ----------- | +| img_height | num | 图片高度 | | +| img_size | num | 图片大小 | 单位为KByte | +| img_src | str | 图片url | | +| img_width | num | 图片宽度 | | + +**示例:** + +查询用户`mid=53456`的投稿明细中的全部类型 + +```shell +curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/doc_list' \ +--data-urlencode 'uid=2' \ +--data-urlencode 'page_num=1' \ +--data-urlencode 'page_size=2' \ +--data-urlencode 'biz=all' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "success", + "message": "success", + "data": { + "items": [{ + "doc_id": 59015720, + "poster_uid": 2, + "title": "", + "description": "6影是真的无脑,2个宝石都护不住(设计师:这真是太酷了)", + "pictures": [{ + "img_src": "http://i0.hdslb.com/bfs/album/8456f050ec8639c6e0cef36aba27bfdedc550590.jpg", + "img_width": 1824, + "img_height": 840, + "img_size": 1024 + }], + "count": 1, + "ctime": 1582894607, + "view": 707073, + "like": 7055 + }, { + "doc_id": 46853140, + "poster_uid": 2, + "title": "", + "description": "#年度报告# #新年Flag# https://www.bilibili.com/blackboard/timemachine2019.html\n决定了,这就是我的新年Flag!今年我一定要…", + "pictures": [{ + "img_src": "http://i0.hdslb.com/bfs/album/5b3ae76f79d7cf2501afc3ca7c7da509dcf0e38a.jpg", + "img_width": 1125, + "img_height": 2184, + "img_size": 465 + }, { + "img_src": "http://i0.hdslb.com/bfs/album/87789fe9644337a1f7e6a0655a32584705af8bda.jpg", + "img_width": 1125, + "img_height": 2184, + "img_size": 421 + }, { + "img_src": "http://i0.hdslb.com/bfs/album/f752d7f3bb7952f6c0013b3f48ddcb07060b4721.jpg", + "img_width": 1125, + "img_height": 2184, + "img_size": 524 + }, { + "img_src": "http://i0.hdslb.com/bfs/active/7a52a411bccb716c8e67fe70e6c330d5209346de.jpg", + "img_width": 1125, + "img_height": 2184, + "img_size": 534 + }], + "count": 4, + "ctime": 1577966163, + "view": 833193, + "like": 5667 + }] + } +} +``` + +
+ +
+ +### 查询用户投稿专栏明细 + +> https://api.bilibili.com/x/space/wbi/article + +> ~~https://api.bilibili.com/x/space/article~~(旧链接) + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|------|-----|-------|--------------------------------------------------------------------------|-----| +| mid | num | 用户uid | | √ | +| pn | num | | 默认:1 | | +| ps | num | | 默认:30
范围:\[1,30\] | | +| sort | str | | `publish_time`:最新发布
`view`:最多阅读
`fav`:最多收藏
默认:`publish_time` | | + +**json回复:** + +根对象 + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|--------------------| +| code | num | 返回值 | 0:成功
-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:无
0:个人认证
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:无
1:月大会员
2:年度及以上大会员 | +| status | num | 大会员状态 | 0:无
1:有 | +| due_date | num | 大会员过期时间时间戳 | 单位:毫秒 | +| vip_pay_type | num | 支付类型 | | +| theme_type | num | `0` | | +| label | obj | 大会员标签 | | +| avatar_subscript | num | 是否显示大会员图标 | 0:不显示
1:显示 | +| nickname_color | str | 大会员昵称颜色 | | + +`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `vip`对象 -> `label`对象 + +| 字段名 | 类型 | 内容 | 备注 | +|-------------|-----|--------|------------------------------------------------------------------------------------------------------------------------------| +| path | str | `空串` | | +| text | str | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` | +| label_theme | str | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员
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' +``` + +
+查看响应示例: + +```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 + } +} +``` + +
+ +### 查询用户专栏文集明细 + +> https://api.bilibili.com/x/article/up/lists + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|----------|-----|-------|-----|-------------------| +| mid | num | 用户uid | √ | | +| sort | num | 排序方式 | | 0:最近更新
1:最多阅读 | +| jsonp | str | | | | +| callback | str | | | | + +**json回复:** + +根对象 + +| 字段名 | 类型 | 内容 | 备注 | +|---------|-----|------|--------------------| +| code | num | 响应码 | 0:成功
-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' +``` + +
+点击查看 + +```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 + } +} +``` + +
+ +### 查询用户投稿音频明细 + +> https://api.bilibili.com/audio/music-service/web/song/upper + +*请求方法: GET* + + + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --- | --- | --- | --- | --- | +| mid | num | 用户 mid | 必要 | | +| pn | num | 页码 | 必要 | 默认为 1 | +| ps | num | 每页项数 | 必要 | 默认为 30 | +| order | str | 排序方式 | 必要 | 1: 最新发布
2: 最多播放
3: 最多收藏 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| code | num | 返回值 | 0: 成功
72000000: 缺少参数 | +| msg | str | 返回信息 | 成功为 `success` | +| data | str | 数据本体 | 失败时不存在 | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| curPage | num | 当前页码 | | +| pageCount | num | 总页数 | | +| totalSize | num | 总计数 | | +| pageSize | num | 每页项数 | | +| data | array | 音频列表 | | + +`data` 对象中的 `data` 数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| id | num | 音频 AU 号 | | +| uid | num | 用户 mid | | +| uname | str | 用户名 | | +| author | null | | | +| title | str | 音频标题 | | +| cover | str | 音频封面图片 URL | | +| intro | null | | | +| lyric | str | 音频歌词 URL | | +| crtype | num | 1 | | +| duration | num | 音频时长 | 单位为 秒 | +| passtime | num | 发布时间 | UNIX 秒级时间戳 | +| curtime | num | 0 | | +| aid | null | | | +| cid | null | | | +| msid | null | | | +| attr | null | | | +| limit | null | | | +| activityId | null | | | +| limitdesc | null | | | +| ctime | num | 发布时间 | UNIX 毫秒时间戳 | +| statistic | obj | 统计数 | | +| coin_num | num | 硬币数量 | | +| is_cooper | null | | | + +`data` 数组中的对象中的 `statistic` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| sid | num | 音频 AU 号 | | +| play | num | 播放数 | | +| collect | num | 收藏数 | | +| comment | num | 评论数 | | +| share | num | 分享数 | | + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/audio/music-service/web/song/upper' \ +--url-query 'uid=8047632' \ +--url-query 'pn=1' \ +--url-query 'ps=30' \ +--url-query 'order=2' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "msg": "success", + "data": { + "curPage": 1, + "pageCount": 1, + "totalSize": 2, + "pageSize": 30, + "data": [ + { + "id": 257709, + "uid": 8047632, + "uname": "哔哩哔哩弹幕网", + "author": null, + "title": "【2018拜年祭单品】与你同行~B With U~", + "cover": "http://i0.hdslb.com/bfs/music/0f890889c8e1101f37317def0c4c555068054c88.jpg", + "intro": null, + "lyric": "http://i0.hdslb.com/bfs/music/1519959250257709.lrc", + "crtype": 1, + "duration": 301, + "passtime": 1519878405, + "curtime": 0, + "aid": null, + "cid": null, + "msid": null, + "attr": null, + "limit": null, + "activityId": null, + "limitdesc": null, + "ctime": 1519875632000, + "statistic": { + "sid": 257709, + "play": 845264, + "collect": 21978, + "comment": 1983, + "share": 1685 + }, + "coin_num": 13368, + "is_cooper": null + }, + { + "id": 378521, + "uid": 8047632, + "uname": "哔哩哔哩弹幕网", + "author": null, + "title": "《B TOGETHER》-bilibili九周年主题曲", + "cover": "http://i0.hdslb.com/bfs/music/109136c63e16d83fbad5ec9282a6fb96498d8144.jpg", + "intro": null, + "lyric": "http://i0.hdslb.com/bfs/music/1529979007378521.lrc", + "crtype": 1, + "duration": 261, + "passtime": 1529928347, + "curtime": 0, + "aid": null, + "cid": null, + "msid": null, + "attr": null, + "limit": null, + "activityId": null, + "limitdesc": null, + "ctime": 1529928235000, + "statistic": { + "sid": 378521, + "play": 123264, + "collect": 5501, + "comment": 1591, + "share": 535 + }, + "coin_num": 3640, + "is_cooper": null + } + ] + } +} +``` + +
+ +## 频道 + + + +[所有旧接口](https://github.com/SocialSisterYi/bilibili-API-collect/blob/7d89ece2ac46425810647c4ac92acf5f3721cb68/docs/user/space.md#%E9%A2%91%E9%81%93) 已弃用, 现可用接口参见 [合集和视频列表信息](../video/collection.md) + +## 课程 + + + +### 查询用户发布的课程列表 + +> https://api.bilibili.com/pugv/app/web/season/page + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | -------- | +| mid | num | 目标用户mid | 必要 | | +| pn | num | 页码 | 非必要 | 默认为1 | +| ps | num | 每页项数 | 非必要 | 默认为20 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ----- | -------- | ---- | +| list | array | 课程列表 | | +| page | obj | 页面信息 | | + +`data`中的`page`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | -------------- | ------------------------------------- | +| next | bool | 是否存在下一页 | false:最后一页
true:存在下一页 | +| num | num | 当前页码 | | +| size | num | 每页项数 | | +| total | num | 总计项数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | -------------------------- | +| 0 | obj | 课程1 | | +| n | obj | 课程(n+1) | 按照目标用户的发布顺序排列 | +| …… | obj | …… | | + +`data`中的`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ------------- | +| cover | str | 课程封面url | | +| ep_count | num | 课程集数 | | +| link | str | 课程页面url | 手机版页面url | +| page | num | 1 | 作用尚不明确 | +| play | num | 课程播放数 | | +| season_id | num | 课程ssid | | +| status | str | 更新状态说明 | | +| subtitle | str | 课程副标题 | | +| title | str | 课程标题 | | + +**示例:** + +查询用户`mid=33683045`的课程发布列表 + +```shell +curl -G 'https://api.bilibili.com/pugv/app/web/season/page' \ +--data-urlencode 'mid=33683045' \ +--data-urlencode 'ps=5' \ +--data-urlencode 'pn=1' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "data": { + "items": [ + { + "cover": "http://i0.hdslb.com/bfs/archive/596575057885fff7f0ceff047437186cba459358.jpg", + "ep_count": 10, + "link": "https://m.bilibili.com/cheese/play/ss80", + "page": 1, + "play": 174467, + "season_id": 80, + "status": "共10期", + "subtitle": "百科全书式军事科普短视频系列", + "title": "《战忽知道》第一季" + }, + { + "cover": "http://i0.hdslb.com/bfs/archive/322aa94d27cece62d2a859caf71ac2426f29eee2.jpg", + "ep_count": 1, + "link": "https://m.bilibili.com/cheese/play/ss145", + "page": 1, + "play": 22155, + "season_id": 145, + "status": "更新至第1期", + "subtitle": "此课程为《局座:第四次工业革命来了》部分集数,请谨慎购买", + "title": "【体验课】局座讲5G:5G如何改变我们的生活?" + }, + { + "cover": "http://i0.hdslb.com/bfs/archive/b9794ac4507f8764e219df413b661b5faf499a19.jpg", + "ep_count": 10, + "link": "https://m.bilibili.com/cheese/play/ss113", + "page": 1, + "play": 49833, + "season_id": 113, + "status": "更新至第10期", + "subtitle": "百科全书式军事科普短视频系列", + "title": "《战忽知道》第二季" + }, + { + "cover": "http://i0.hdslb.com/bfs/archive/7351fcb33592a4bc7aac9f71d421b4b5ce0177d3.jpg", + "ep_count": 10, + "link": "https://m.bilibili.com/cheese/play/ss51", + "page": 1, + "play": 4981037, + "season_id": 51, + "status": "共10期", + "subtitle": "洞悉国际局势,学习战略思维", + "title": "局座的国际战略课" + }, + { + "cover": "http://i0.hdslb.com/bfs/archive/31e2a170b5a815e34f0537a2727b28f1b87dca18.jpg", + "ep_count": 10, + "link": "https://m.bilibili.com/cheese/play/ss121", + "page": 1, + "play": 30754, + "season_id": 121, + "status": "更新至第10期", + "subtitle": "百科全书式军事科普短视频系列", + "title": "《战忽知道》第三季" + } + ], + "page": { + "next": true, + "num": 1, + "size": 5, + "total": 8 + } + }, + "message": "success" +} +``` + +
+ +## 订阅 + + + +### 查询用户追番预览列表 + +> http://space.bilibili.com/ajax/Bangumi/getList + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +如设置隐私查看自己的需要认证 + +带有转义,且只能获取最多15条 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ------------------------ | ---------------------------------- | --------------------------- | +| status | bool | 状态 | false:失败
true:成功 | +| data | 失败:str
成功:obj | 失败:错误信息
成功:信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ----- | ------------ | ------------ | +| count | num | 总计追番数 | | +| pages | num | 0 | 作用尚不明确 | +| result | array | 追番预览列表 | | + +`data`中的`result`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | -------------------------- | +| 0 | obj | 追番1 | | +| n | obj | 追番(n+1) | 按照目标用户的关注顺序排列 | +| …… | obj | …… | | +| 14 | obj | 追番15 | 最后一项 | + +`data`中的`result`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ---- | --------------- | --------------------------------- | +| brief | str | 简介 | | +| cover | str | 封面图片url | | +| evaluate | str | 空 | | +| favorites | num | 追番数 | | +| is_finish | num | 是否已完结 | 0:未完结
1:已完结 | +| last_ep_index | num | 0 | 作用尚不明确 | +| newest_ep_index | num | 最新一话 | 可能为0 | +| season_id | str | 番剧ssid | | +| share_url | str | 播放页面链接url | | +| title | str | 标题 | | +| total_count | num | 总计集数 | 未完结:-1
已完结:非0正整数 | + +**示例:** + +查看用户`mid=14082`的追番预览列表 + +```shell +curl -G 'http://space.bilibili.com/ajax/Bangumi/getList' \ +--data-urlencode 'mid=14082' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "status": true, + "data": { + "count": 25, + "pages": 0, + "result": [{ + "season_id": "29310", + "share_url": "http:\/\/bangumi.bilibili.com\/anime\/29310\/", + "title": "异度侵入 ID:INVADED", + "is_finish": 1, + "favorites": 3479220, + "newest_ep_index": 13, + "last_ep_index": 0, + "total_count": 13, + "cover": "http:\/\/i0.hdslb.com\/bfs\/bangumi\/image\/9bf9e66968f85b33ec3769a16c86b36dc984abbc.png", + "evaluate": "", + "brief": "本片讲述利用能检测出人们杀意的装置以及利用思想粒子做出的“井”,来探知事件真相的科幻故事。" + }, { + "season_id": "25739", + "share_url": "http:\/\/bangumi.bilibili.com\/anime\/25739\/", + "title": "关于我转生变成史莱姆这档事", + "is_finish": 1, + "favorites": 5518829, + "newest_ep_index": 0, + "last_ep_index": 0, + "total_count": 27, + "cover": "http:\/\/i0.hdslb.com\/bfs\/bangumi\/a4c0e0ccc44fe3949a734f546cf5bb07da925bad.png", + "evaluate": "", + "brief": "史莱姆生活,开始了。\n上班族的三上悟在道路上被歹徒给刺杀身亡后,回过神来发现自己转生到了异世界。\n不..." + }, + ………… + ] + } +} +``` + +
+ +### 查询用户追番(追剧)明细 + +> https://api.bilibili.com/x/space/bangumi/follow/list + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +如设置隐私查看自己的需要认证 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | -------------------- | +| vmid | num | 目标用户mid | 必要 | | +| pn | num | 页码 | 非必要 | 默认为1 | +| ps | num | 每页项数 | 非必要 | 默认为15 定义域1-30 | +| type | num | 查询类型 | 必要 | 1:追番
2:追剧 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ----- | ---------- | ---- | +| list | array | 追番列表 | | +| pn | num | 当前页码 | | +| ps | num | 每页项数 | | +| total | num | 总计追番数 | | + +`data`中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | -------------------------- | +| 0 | obj | 追番1 | | +| n | obj | 追番(n+1) | 按照目标用户的关注顺序排列 | +| …… | obj | …… | | + +`data`中的`list`数组中的对象: + +基本同「番剧详细信息」中的result对象(未完工) + +**示例:** + +查看用户`mid=14082`的追番明细 + +```shell +curl -G 'https://api.bilibili.com/x/space/bangumi/follow/list' \ +--data-urlencode 'vmid=14082' \ +--data-urlencode 'type=1' \ +--data-urlencode 'ps=2' \ +--data-urlencode 'pn=1' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "list": [{ + "season_id": 29310, + "media_id": 28224080, + "season_type": 1, + "season_type_name": "番剧", + "title": "异度侵入 ID:INVADED", + "cover": "http://i0.hdslb.com/bfs/bangumi/image/9bf9e66968f85b33ec3769a16c86b36dc984abbc.png", + "total_count": 13, + "is_finish": 1, + "is_started": 1, + "is_play": 1, + "badge": "会员专享", + "badge_type": 0, + "rights": { + "allow_review": 1, + "is_selection": 1, + "selection_style": 1 + }, + "stat": { + "follow": 3475768, + "view": 87500861, + "danmaku": 1334654, + "reply": 316632, + "coin": 835150, + "series_follow": 3475242, + "series_view": 87500861 + }, + "new_ep": { + "id": 307774, + "index_show": "全13话", + "cover": "http://i0.hdslb.com/bfs/archive/3dce2b856a7b0ea667aa288b51b7c0478fa56c4d.jpg", + "title": "13", + "long_title": "CHANNELEDⅡ", + "pub_time": "2020-03-23 00:30:00", + "duration": 1481000 + }, + "rating": { + "score": 9.8, + "count": 262589 + }, + "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/664dbf039ec2da8dd982b697a108e28e87b9897e.jpg", + "season_status": 13, + "season_title": "TV", + "badge_ep": "会员", + "media_attr": 196608, + "season_attr": 0, + "evaluate": "本片讲述利用能检测出人们杀意的装置以及利用思想粒子做出的“井”,来探知事件真相的科幻故事。...", + "areas": [{ + "id": 2, + "name": "日本" + }], + "subtitle": "", + "first_ep": 307446, + "can_watch": 1, + "series": { + "series_id": 4760, + "title": "ID:INVADED", + "season_count": 1, + "new_season_id": 29310 + }, + "publish": { + "pub_time": "2020-01-06 00:30:00", + "pub_time_show": "敬请期待", + "release_date": "2020-01-06", + "release_date_show": "2020年1月6日" + }, + "mode": 2, + "section": [{ + "section_id": 39327, + "season_id": 29310, + "limit_group": 328, + "watch_platform": 15, + "copyright": "dujia", + "ban_area_show": 1 + }, { + "section_id": 39633, + "season_id": 29310, + "limit_group": 328, + "watch_platform": 15, + "type": 1, + "copyright": "dujia", + "title": "其他", + "ban_area_show": 1 + }, { + "section_id": 44101, + "season_id": 29310, + "limit_group": 316, + "watch_platform": 15, + "type": 4, + "copyright": "ugc", + "ban_area_show": 1 + }], + "url": "https://www.bilibili.com/bangumi/play/ss29310", + "follow_status": 2, + "is_new": 0, + "progress": "", + "both_follow": true + }, { + "season_id": 25739, + "media_id": 139252, + "season_type": 1, + "season_type_name": "番剧", + "title": "关于我转生变成史莱姆这档事", + "cover": "http://i0.hdslb.com/bfs/bangumi/a4c0e0ccc44fe3949a734f546cf5bb07da925bad.png", + "total_count": 27, + "is_finish": 1, + "is_started": 1, + "is_play": 1, + "badge": "会员专享", + "badge_type": 0, + "rights": { + "allow_review": 1, + "is_selection": 1, + "selection_style": 1 + }, + "stat": { + "follow": 5516519, + "view": 246739631, + "danmaku": 3802465, + "reply": 460225, + "coin": 1338958, + "series_follow": 5516535, + "series_view": 246739631 + }, + "new_ep": { + "id": 316957, + "index_show": "全27话", + "cover": "http://i0.hdslb.com/bfs/archive/81d07d1a478ce3a6209b557e14df9b9c78c42abb.jpg", + "title": "OAD03", + "long_title": "外传:利姆鲁的华丽教师生活 其一", + "pub_time": "2020-03-27 00:00:03", + "duration": 1493000 + }, + "rating": { + "score": 9.4, + "count": 83354 + }, + "square_cover": "http://i0.hdslb.com/bfs/bangumi/8d9f5b4a566d0547bc2e3f6f733b732a09c0d3d4.jpg", + "season_status": 13, + "season_title": "TV", + "badge_ep": "会员", + "media_attr": 0, + "season_attr": 0, + "evaluate": "史莱姆生活,开始了。\n上班族的三上悟在道路上被歹徒给刺杀身亡后,回过神来发现自己转生到了异世界。\n不过,自己居然是“史莱姆”!\n他在得到利姆鲁这个名字后开始了自己的史莱姆人生,随着与各个种族相处交流的...", + "areas": [{ + "id": 2, + "name": "日本" + }], + "subtitle": "", + "first_ep": 250460, + "can_watch": 1, + "series": { + "series_id": 4188, + "title": "关于我转生变成史莱姆这档事", + "season_count": 1, + "new_season_id": 25739 + }, + "publish": { + "pub_time": "2018-10-02 00:30:00", + "pub_time_show": "2018年10月02日00:30", + "release_date": "2018-10-02", + "release_date_show": "2018年10月2日" + }, + "mode": 2, + "section": [{ + "section_id": 34988, + "season_id": 25739, + "limit_group": 328, + "watch_platform": 15, + "copyright": "bilibili", + "ban_area_show": 1 + }], + "url": "https://www.bilibili.com/bangumi/play/ss25739", + "follow_status": 2, + "is_new": 0, + "progress": "", + "both_follow": true + }], + "pn": 1, + "ps": 2, + "total": 25 + } +} +``` + +
+ +### 查询用户关注的TAG(话题) + +> http://space.bilibili.com/ajax/tags/getSubList + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +如设置隐私查看自己的需要认证 + +带有转义 + +只显示前100个 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ----------- | ------ | ---- | +| mid | num | 目标用户mid | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---------------------------- | -------------------------------------- | --------------------------- | +| status | bool | 返回值 | false:错误
true:正确 | +| data | 错误时:str
正确时:obj | 错误时:错误信息
正确时:数据本体 | 正确时不返回错误信息 | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ----- | ----------- | ---- | +| tags | array | 关注TAG列表 | | +| count | num | 关注TAG的数 | | + +`data`中的`tags`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | -------- | +| 0 | obj | 关注TAG1 | | +| n | obj | 关注TAG(n+1) | | +| …… | obj | …… | …… | +| 99 | obj | 关注TAG100 | 最后一项 | + +`data`中的`tags`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | ------------------- | ------------ | +| archive_count | num | 0 | 作用尚不明确 | +| cover | str | TAG图片url | 无则为空 | +| name | str | TAG名 | | +| notify | num | 1 | 作用尚不明确 | +| tag_id | num | tag_id | | +| updated_ts | str | 1970-01-01 08:00:00 | 作用尚不明确 | + +**示例:** + +查询用户`mid=2`的关注TAG + +```shell +curl -G 'http://space.bilibili.com/ajax/tags/getSubList' \ +--data-urlencode 'mid=2' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "status": true, + "data": { + "tags": [{ + "name": "豪宅", + "cover": "", + "tag_id": 47637, + "notify": 1, + "archive_count": 0, + "updated_ts": "1970-01-01 08:00:00" + }, { + "name": "死亡搁浅", + "cover": "", + "tag_id": 1737239, + "notify": 1, + "archive_count": 0, + "updated_ts": "1970-01-01 08:00:00" + }, + ………… + ], + "count": 58 + } +} +``` + +
diff --git a/user/status_number.md b/docs/user/status_number.md similarity index 82% rename from user/status_number.md rename to docs/user/status_number.md index 36435d4..e33ac45 100644 --- a/user/status_number.md +++ b/docs/user/status_number.md @@ -1,14 +1,7 @@ # 用户状态数 -- [关系状态数](#关系状态数) -- [UP主状态数](#UP主状态数) -- [~~订阅&投稿状态数(已弃用)~~](#~~订阅&投稿状态数(已弃用)~~) -- [相簿投稿数](#相簿投稿数) - ---- - ## 关系状态数 -> http://api.bilibili.com/x/relation/stat +> https://api.bilibili.com/x/relation/stat *请求方式:GET* @@ -47,7 +40,7 @@ 查询用户`mid=332704117`的关系状态数 ```shell -curl -G 'http://api.bilibili.com/x/relation/stat' \ +curl -G 'https://api.bilibili.com/x/relation/stat' \ --data-urlencode 'vmid=332704117' \ -b 'SESSDATA=xxx' ``` @@ -74,7 +67,7 @@ curl -G 'http://api.bilibili.com/x/relation/stat' \ ## UP主状态数 -> http://api.bilibili.com/x/space/upstat +> https://api.bilibili.com/x/space/upstat *请求方式:GET* @@ -125,7 +118,7 @@ curl -G 'http://api.bilibili.com/x/relation/stat' \ 查询用户`mid=456664753`的UP主状态数 ```shell -curl -G 'http://api.bilibili.com/x/space/upstat' \ +curl -G 'https://api.bilibili.com/x/space/upstat' \ --data-urlencode 'mid=456664753' \ -b 'SESSDATA=xxx' ``` @@ -152,11 +145,9 @@ curl -G 'http://api.bilibili.com/x/space/upstat' \ -## ~~订阅&投稿状态数(已弃用)~~ +## 用户导航栏状态数 -
-查看折叠内容 -> http://api.bilibili.com/x/space/navnum +> https://api.bilibili.com/x/space/navnum *请求方式:GET* @@ -165,6 +156,7 @@ curl -G 'http://api.bilibili.com/x/space/upstat' \ | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ------ | ---- | ----------- | ------ | ---- | | mid | num | 目标用户mid | 必要 | | +| web_location | str | 333.999 | 不必要 || **json回复:** @@ -184,37 +176,38 @@ curl -G 'http://api.bilibili.com/x/space/upstat' \ | video | num | 投稿视频数 | | | bangumi | num | 追番数 | 无视隐私设置 | | cinema | num | 追剧数 | 无视隐私设置 | -| channel | obj | 频道数 | | -| favourite | obj | 收藏夹数 | 无视隐私设置 | +| channel | obj | 视频列表数 | | +| favourite | obj | 收藏夹数 | | | tag | num | 关注TAG数 | 无视隐私设置 | | article | num | 投稿专栏数 | | | playlist | num | 0 | 作用尚不明确 | -| album | num | 投稿相簿数 | | +| album | num | 投稿图文数 | | | audio | num | 投稿音频数 | | | pugv | num | 投稿课程数 | | +| upos | num | 动态数 | | +| season_num | num | 视频合集数 | | `data`中的`channel`对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ----- | ---------- | ------------ | -| master | num | 频道数 | | -| guest | num | 频道数 | | +| master | num | 视频列表数 | | +| guest | num | 视频列表数 | | `data`中的`favourite`对象: | 字段 | 类型 | 内容 | 备注 | | ------ | ---- | ------------ | --------------------------------------- | | master | num | 全部收藏夹数 | 需要登录(SESSDATA)
只能查看自己的 | -| guest | num | 公开收藏夹数 | 无视隐私设置 | +| guest | num | 公开收藏夹数 | | **示例:** -查询用户`mid=239202390`的订阅&投稿状态数 +查询用户`mid=645769214`的订阅&投稿状态数 ```shell -curl -G 'http://api.bilibili.com/x/space/navnum' \ ---data-urlencode 'mid=239202390' \ --b 'SESSDATA=xxx' +curl -G 'https://api.bilibili.com/x/space/navnum' \ +--data-urlencode 'mid=645769214' ```
@@ -222,37 +215,38 @@ curl -G 'http://api.bilibili.com/x/space/navnum' \ ```json { - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "video": 290, - "bangumi": 25, - "cinema": 13, - "channel": { - "master": 2, - "guest": 2 - }, - "favourite": { - "master": 6, - "guest": 6 - }, - "tag": 0, - "article": 1, - "playlist": 0, - "album": 150, - "audio": 4, - "pugv": 0 - } + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "video": 34, + "bangumi": 1, + "cinema": 0, + "channel": { + "master": 5, + "guest": 5 + }, + "favourite": { + "master": 0, + "guest": 0 + }, + "tag": 0, + "article": 1, + "playlist": 0, + "album": 59, + "audio": 0, + "pugv": 0, + "season_num": 1, + "opus": 59 + } } ``` -
## 相簿投稿数 -> http://api.vc.bilibili.com/link_draw/v1/doc/upload_count +> https://api.vc.bilibili.com/link_draw/v1/doc/upload_count *请求方式:GET* @@ -287,7 +281,7 @@ curl -G 'http://api.bilibili.com/x/space/navnum' \ 查询用户`mid=53456`的投稿相簿数 ```shell -curl -G 'http://api.vc.bilibili.com/link_draw/v1/doc/upload_count' \ +curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/upload_count' \ --data-urlencode 'uid=53456' ``` diff --git a/video/like_coin_fav.md b/docs/video/action.md similarity index 54% rename from video/like_coin_fav.md rename to docs/video/action.md index 38984e9..c6ecb1a 100644 --- a/video/like_coin_fav.md +++ b/docs/video/action.md @@ -1,55 +1,37 @@ -# 视频点赞&投币&收藏&分享 - -- [视频点赞&投币&收藏&分享](#视频点赞投币收藏分享) - - [点赞](#点赞) - - [点赞视频(web端)](#点赞视频web端) - - [点赞视频(APP端)](#点赞视频app端) - - [判断视频是否被点赞(双端)](#判断视频是否被点赞双端) - - [投币](#投币) - - [投币视频(web端)](#投币视频web端) - - [投币视频(APP端)](#投币视频app端) - - [判断视频是否被投币(双端)](#判断视频是否被投币双端) - - [收藏](#收藏) - - [收藏视频(双端)](#收藏视频双端) - - [判断视频是否被收藏(双端)](#判断视频是否被收藏双端) - - [一键三连](#一键三连) - - [一键三连视频(web端)](#一键三连视频web端) - - [一键三连视频(APP端)](#一键三连视频app端) - - [分享](#分享) - - [分享视频 (Web端)](#分享视频-web端) - ---- +# 稿件观众操作 ## 点赞 - + ### 点赞视频(web端) -> http://api.bilibili.com/x/web-interface/archive/like +> https://api.bilibili.com/x/web-interface/archive/like *请求方式:POST* 认证方式:仅可Cookie(SESSDATA) +需验证 Cookie 中`buvid3`字段存在且正常, 否则将导致触发风控 + **正文参数( application/x-www-form-urlencoded ):** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------------ | ---------------------- | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| like | num | 操作方式 | 必要 | 1:点赞
2:取消赞 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------- | ------------ | ---------------------- | +| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | +| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | +| like | num | 操作方式 | 必要 | 1:点赞
2:取消赞 | +| csrf | str | CSRF Token(位于 Cookie) | 必要 | | **json回复:** 根对象: -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
10003:不存在该稿件
65004:取消点赞失败
65006:重复点赞 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
-403: 账号异常
10003:不存在该稿件
65004:取消点赞失败
65006:重复点赞 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | **示例:** @@ -58,7 +40,7 @@ avid方式: ```shell -curl 'http://api.bilibili.com/x/web-interface/archive/like' \ +curl 'https://api.bilibili.com/x/web-interface/archive/like' \ --data-urlencode 'aid=79677524' \ --data-urlencode 'like=1' \ --data-urlencode 'csrf=xxx' \ @@ -68,7 +50,7 @@ curl 'http://api.bilibili.com/x/web-interface/archive/like' \ bvid方式: ```shell -curl 'http://api.bilibili.com/x/web-interface/archive/like' \ +curl 'https://api.bilibili.com/x/web-interface/archive/like' \ --data-urlencode 'bvid=BV1uJ411r7hL' \ --data-urlencode 'like=1' \ --data-urlencode 'csrf=xxx' \ @@ -90,7 +72,7 @@ curl 'http://api.bilibili.com/x/web-interface/archive/like' \ ### 点赞视频(APP端) -> http://app.bilibili.com/x/v2/view/like +> https://app.bilibili.com/x/v2/view/like *请求方式:POST* @@ -98,22 +80,22 @@ curl 'http://api.bilibili.com/x/web-interface/archive/like' \ **正文参数( application/x-www-form-urlencoded ):** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| aid | num | 稿件avid | 必要 | | -| like | num | 操作方式 | 必要 | 0:点赞
1:取消赞 | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ---------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| aid | num | 稿件 avid | 必要 | | +| like | num | 操作方式 | 必要 | 0:点赞
1:取消赞 | **json回复:** 根对象: -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
10003:不存在该稿件 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
-403: 账号异常
10003:不存在该稿件 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | `data`对象: @@ -126,7 +108,7 @@ curl 'http://api.bilibili.com/x/web-interface/archive/like' \ 点赞视频`av79677524` ```shell -curl 'http://app.bilibili.com/x/v2/view/like' \ +curl 'https://app.bilibili.com/x/v2/view/like' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'aid=79677524' \ --data-urlencode 'like=0' @@ -148,21 +130,24 @@ curl 'http://app.bilibili.com/x/v2/view/like' \ -### 判断视频是否被点赞(双端) +### 判断视频近期是否被点赞(双端) -> http://api.bilibili.com/x/web-interface/archive/has/like +> https://api.bilibili.com/x/web-interface/archive/has/like *请求方式:GET* 认证方式:APP或Cookie(SESSDATA) +注: 这一 API 实际上只能判断出视频**在近期内**是否被点赞, 并不能判断出视频是否被点赞. +「近期」的定义不明, 但至少半年前点赞过的视频, 用这一接口获取到的结果就已经是 `0` 了. 参见 [#380](https://github.com/SocialSisterYi/bilibili-API-collect/issues/380). + **url参数:** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ------------ | ------------------ | -| access_key | str | APP登录Token | APP方式必要 | | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | --------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | +| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | **json回复:** @@ -182,7 +167,7 @@ curl 'http://app.bilibili.com/x/v2/view/like' \ avid方式: ```shell -curl -G 'http://api.bilibili.com/x/web-interface/archive/has/like' \ +curl -G 'https://api.bilibili.com/x/web-interface/archive/has/like' \ --data-urlencode 'aid=39330059' \ -b 'SESSDATA=xxx' ``` @@ -190,7 +175,7 @@ curl -G 'http://api.bilibili.com/x/web-interface/archive/has/like' \ bvid方式: ```shell -curl -G 'api.bilibili.com/x/web-interface/archive/has/like' \ +curl -G 'https://api.bilibili.com/x/web-interface/archive/has/like' \ --data-urlencode 'bvid=BV1Bt411z799' \ -b 'SESSDATA=xxx' ``` @@ -209,39 +194,89 @@ curl -G 'api.bilibili.com/x/web-interface/archive/has/like' \ +## 点踩 + +### 点踩视频(App端) + +> https://app.biliapi.net/x/v2/view/dislike + +*请求方式:POST* + +认证方式:仅可App + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------ | ----------------------- | +| access_key | str | APP 登录 Token | 必要 | | +| aid | num | 视频 aid | 必要 | | +| dislike | num | 操作类型 | 必要 | 0:点踩
1:取消点踩 | + +**json回复:** + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|-----------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
-404:啥都木有
65005:取消踩失败 未点踩过
65007:已踩过 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +点踩视频 + +```shell +curl -L -X POST 'https://app.biliapi.net/x/v2/view/dislike' \ +-H 'Content-Type: application/x-www-form-urlencoded' \ +--data-urlencode 'access_key=xxx' \ +--data-urlencode 'aid=xxx' \ +--data-urlencode 'dislike=0' +``` + +取消点踩 + +```shell +curl -L -X POST 'https://app.biliapi.net/x/v2/view/dislike' \ +-H 'Content-Type: application/x-www-form-urlencoded' \ +--data-urlencode 'access_key=xxx' \ +--data-urlencode 'aid=xxx' \ +--data-urlencode 'dislike=1' +``` + ## 投币 - + ### 投币视频(web端) -> http://api.bilibili.com/x/web-interface/coin/add +> https://api.bilibili.com/x/web-interface/coin/add *请求方式:POST* 认证方式:仅可Cookie(SESSDATA) +需验证 Cookie 中`buvid3`字段存在且正常, 否则将导致触发风控 + **正文参数( application/x-www-form-urlencoded ):** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------------------ | ------------ | --------------------------------------- | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| multiply | num | 投币数量 | 必要 | 上限为2 | -| select_like | num | 是否附加点赞 | 非必要 | 0:不点赞
1:同时点赞
默认为0 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------- | ---- | ------------------------- | ------------ | --------------------------------------- | +| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | +| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | +| multiply | num | 投币数量 | 必要 | 上限为2 | +| select_like | num | 是否附加点赞 | 非必要 | 0:不点赞
1:同时点赞
默认为0 | +| csrf | str | CSRF Token(位于 Cookie) | 必要 | | **json回复:** 根对象: -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-104:硬币不足
-111:csrf校验失败
-400:请求错误
10003:不存在该稿件
34002:不能给自己投币
34003:非法的投币数量
34004:投币间隔太短
34005:超过投币上限 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-104:硬币不足
-111:csrf校验失败
-400:请求错误
-403: 账号异常
10003:不存在该稿件
34002:不能给自己投币
34003:非法的投币数量
34004:投币间隔太短
34005:超过投币上限 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | data 对象: @@ -256,7 +291,7 @@ data 对象: avid方式: ```shell -curl 'http://api.bilibili.com/x/web-interface/coin/add' \ +curl 'https://api.bilibili.com/x/web-interface/coin/add' \ --data-urlencode 'aid=90671873' \ --data-urlencode 'select_like=1' \ --data-urlencode 'multiply=2' \ @@ -267,7 +302,7 @@ curl 'http://api.bilibili.com/x/web-interface/coin/add' \ bvid方式: ```shell -curl 'http://api.bilibili.com/x/web-interface/coin/add' \ +curl 'https://api.bilibili.com/x/web-interface/coin/add' \ --data-urlencode 'bvid=BV1N7411A7wC' \ --data-urlencode 'select_like=1' \ --data-urlencode 'multiply=2' \ @@ -293,7 +328,7 @@ curl 'http://api.bilibili.com/x/web-interface/coin/add' \ ### 投币视频(APP端) -> http://app.bilibili.com/x/v2/view/coin/add +> https://app.bilibili.com/x/v2/view/coin/add *请求方式:POST* @@ -301,12 +336,12 @@ curl 'http://api.bilibili.com/x/web-interface/coin/add' \ **正文参数( application/x-www-form-urlencoded ):** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------ | ----------- | --------------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| aid | num | 稿件avid | 必要 | | -| multiply | num | 投币数量 | 必要 | 上限为2 | -| select_like | num | 附加点赞 | 非必要 | 0:不点赞
1:同时点赞
默认为0 | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------- | ---- | -------------- | ------------ | --------------------------------------- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| aid | num | 稿件 avid | 必要 | | +| multiply | num | 投币数量 | 必要 | 上限为2 | +| select_like | num | 附加点赞 | 非必要 | 0:不点赞
1:同时点赞
默认为0 | **json回复:** @@ -328,7 +363,7 @@ data 对象: 为视频`av90671873`投币2枚 ```shell -curl 'http://app.bilibili.com/x/v2/view/coin/add' \ +curl 'https://app.bilibili.com/x/v2/view/coin/add' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'aid=90671873' \ --data-urlencode 'select_like=1' \ @@ -353,7 +388,7 @@ curl 'http://app.bilibili.com/x/v2/view/coin/add' \ ### 判断视频是否被投币(双端) -> http://api.bilibili.com/x/web-interface/archive/coins +> https://api.bilibili.com/x/web-interface/archive/coins *请求方式:GET* @@ -361,11 +396,11 @@ curl 'http://app.bilibili.com/x/v2/view/coin/add' \ **url参数:** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ------------ | ------------------ | -| access_key | str | APP登录Token | APP方式必要 | | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | --------------------- | +| access_key | str | APP 登录 Token | APP方式必要 | | +| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | +| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | **json回复:** @@ -391,7 +426,7 @@ curl 'http://app.bilibili.com/x/v2/view/coin/add' \ avid方式: ```shell -curl -G 'api.bilibili.com/x/web-interface/archive/coins' \ +curl -G 'https://api.bilibili.com/x/web-interface/archive/coins' \ --data-urlencode 'aid=37896701' \ -b 'SESSDATA=xxx' ``` @@ -399,7 +434,7 @@ curl -G 'api.bilibili.com/x/web-interface/archive/coins' \ bvid方式: ```shell -curl -G 'api.bilibili.com/x/web-interface/archive/coins' \ +curl -G 'https://api.bilibili.com/x/web-interface/archive/coins' \ --data-urlencode 'bvid=BV18t411q7zz' \ -b 'SESSDATA=xxx' ``` @@ -422,13 +457,11 @@ curl -G 'api.bilibili.com/x/web-interface/archive/coins' \ ## 收藏 - + ### 收藏视频(双端) -> http://api.bilibili.com/medialist/gateway/coll/resource/deal -> -> http://api.bilibili.com/x/v3/fav/resource/deal +> https://api.bilibili.com/medialist/gateway/coll/resource/deal *请求方式:POST* @@ -440,12 +473,12 @@ curl -G 'api.bilibili.com/x/web-interface/archive/coins' \ | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ------------- | ---- | ------------------------ | -------------- | ------------------------------ | -| access_key | str | APP登录Token | APP方式必要 | | -| rid | num | 稿件avid | 必要 | | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| rid | num | 稿件 avid | 必要 | | | type | num | 必须为2 | 必要 | | -| add_media_ids | nums | 需要加入的收藏夹mlid | 非必要 | 同时添加多个,用`,`(%2C)分隔 | -| del_media_ids | nums | 需要取消的收藏夹mlid | 非必要 | 同时取消多个,用`,`(%2C)分隔 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | +| add_media_ids | nums | 需要加入的收藏夹 mlid | 必要(可选) | 同时添加多个,用`,`(%2C)分隔 | +| del_media_ids | nums | 需要取消的收藏夹 mlid | 必要(可选) | 同时取消多个,用`,`(%2C)分隔 | +| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | **json回复:** @@ -453,7 +486,7 @@ curl -G 'api.bilibili.com/x/web-interface/archive/coins' \ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
-403:访问权限不足
10003:不存在该稿件
11201:已经收藏过了
11202:已经取消收藏了
11203:达到收藏上限
72010017:参数错误 | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
-403:访问权限不足
10003:不存在该稿件
11010: 您访问的内容不存在
11201:已经收藏过了
11202:已经取消收藏了
11203:达到收藏上限
72010017:参数错误 | | message | str | 错误信息 | 正确为success | | data | obj | 信息本体 | | @@ -470,7 +503,7 @@ curl -G 'api.bilibili.com/x/web-interface/archive/coins' \ Cookie方式: ```shell -curl 'http://api.bilibili.com/medialist/gateway/coll/resource/deal' \ +curl 'https://api.bilibili.com/medialist/gateway/coll/resource/deal' \ --data-urlencode 'rid=90671873' \ --data-urlencode 'type=2' \ --data-urlencode 'add_media_ids=49166435' \ @@ -483,7 +516,7 @@ curl 'http://api.bilibili.com/medialist/gateway/coll/resource/deal' \ APP方式: ```shell -curl 'http://api.bilibili.com/medialist/gateway/coll/resource/deal' \ +curl 'https://api.bilibili.com/medialist/gateway/coll/resource/deal' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'rid=90671873' \ --data-urlencode 'type=2' \ @@ -506,9 +539,84 @@ curl 'http://api.bilibili.com/medialist/gateway/coll/resource/deal' \ +### 收藏视频(Web端) + +> https://api.bilibili.com/x/v3/fav/resource/deal + +*请求方式: POST* + +认证方式: Cookie(SESSDATA) + +**正文参数(application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------- | ---- | ---------------------------------- | ------------ | ------------------------------ | +| rid | num | 稿件 avid | 必要 | | +| type | num | 必须为2 | 必要 | | +| add_media_ids | nums | 需要加入的收藏夹 mlid | 必要(可选) | 同时添加多个,用`,`(%2C)分隔 | +| del_media_ids | nums | 需要取消的收藏夹 mlid | 必要(可选) | 同时取消多个,用`,`(%2C)分隔 | +| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | +| platform | str | 平台标识? | 非必要 | web端: web | +| eab_x | num | 1 | 非必要 | 作用尚不明确 | +| ramval | num | 正整数 | 非必要 | 可能与在该页面的停留时间相关? | +| ga | num | 1 | 非必要 | 作用尚不明确 | +| gaia_source | str | ??? | 非必要 | web端: web_normal | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------- | +| code | num | 返回值 | 0: 成功
-101: 账号未登录
-111: csrf 校验失败
2001000: 参数错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | 错误时为 null 或不存在 | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | --------------------- | ----------------------- | +| prompt | bool | 是否为未关注用户收藏? | false:否
true:是 | +| ga_data | null | | 作用尚不明确 | +| toast_msg | str | 空 | 作用尚不明确 | +| success_num | num | 0 | 作用尚不明确 | + +**示例:** + +将视频 `av2` 添加到收藏夹 `645769214` 中 + +```shell +curl -X POST "https://api.bilibili.com/x/v3/fav/resource/deal" \ +--data-urlencode "rid=2" \ +--data-urlencode "type=2" \ +--data-urlencode "csrf=xxx" \ +--data-urlencode "add_media_ids=1428261914" \ +-b "SESSDATA=xxx" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "prompt": false, + "ga_data": null, + "toast_msg": "", + "success_num": 0 + } +} +``` + +
+ ### 判断视频是否被收藏(双端) -> http://api.bilibili.com/x/v2/fav/video/favoured +> https://api.bilibili.com/x/v2/fav/video/favoured *请求方式:GET* @@ -516,10 +624,10 @@ curl 'http://api.bilibili.com/medialist/gateway/coll/resource/deal' \ **url参数:** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | -------- | ------------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| aid | num或str | 稿件avid或稿件bvid | 必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---------- | --------------------- | ------------ | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| aid | num 或 str | 稿件 avid 或稿件 bvid | 必要 | | **json回复:** @@ -546,7 +654,7 @@ data 对象: avid方式: ```shell -curl -G 'http://api.bilibili.com/x/v2/fav/video/favoured' \ +curl -G 'https://api.bilibili.com/x/v2/fav/video/favoured' \ --data-urlencode 'aid=46281123' \ -b 'SESSDATA=xxx' ``` @@ -554,7 +662,7 @@ curl -G 'http://api.bilibili.com/x/v2/fav/video/favoured' \ bvid方式: ```shell -curl -G 'http://api.bilibili.com/x/v2/fav/video/favoured' \ +curl -G 'https://api.bilibili.com/x/v2/fav/video/favoured' \ --data-urlencode 'aid=BV1Bb411H7Dv' \ -b 'SESSDATA=xxx' ``` @@ -578,11 +686,11 @@ curl -G 'http://api.bilibili.com/x/v2/fav/video/favoured' \ ## 一键三连 - + ### 一键三连视频(web端) -> http://api.bilibili.com/x/web-interface/archive/like/triple +> https://api.bilibili.com/x/web-interface/archive/like/triple *请求方式:POST* @@ -590,24 +698,26 @@ curl -G 'http://api.bilibili.com/x/v2/fav/video/favoured' \ 同时点赞投币收藏视频,收藏于默认收藏夹中 +需验证 Cookie 中`buvid3`字段存在且正常, 否则将导致触发风控 + **正文参数( application/x-www-form-urlencoded ):** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------------ | ------------------ | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------- | ------------ | --------------------- | +| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | +| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | +| csrf | str | CSRF Token(位于 Cookie) | 必要 | | **json回复:** 根对象: -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
10003:不存在该稿件 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- |------------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
10003:不存在该稿件
-403: 账号异常 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | `data`对象: @@ -625,7 +735,7 @@ curl -G 'http://api.bilibili.com/x/v2/fav/video/favoured' \ avid方式: ```shell -curl 'http://api.bilibili.com/x/web-interface/archive/like/triple' \ +curl 'https://api.bilibili.com/x/web-interface/archive/like/triple' \ --data-urlencode 'aid=91003840' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' @@ -634,7 +744,7 @@ curl 'http://api.bilibili.com/x/web-interface/archive/like/triple' \ bvid方式: ```shell -curl 'http://api.bilibili.com/x/web-interface/archive/like/triple' \ +curl 'https://api.bilibili.com/x/web-interface/archive/like/triple' \ --data-urlencode 'bvid=BV1Wj411f79U' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' @@ -661,7 +771,7 @@ curl 'http://api.bilibili.com/x/web-interface/archive/like/triple' \ ### 一键三连视频(APP端) -> http://app.bilibili.com/x/v2/view/like/triple +> https://app.bilibili.com/x/v2/view/like/triple *请求方式:POST* @@ -671,10 +781,10 @@ curl 'http://api.bilibili.com/x/web-interface/archive/like/triple' \ **正文参数( application/x-www-form-urlencoded ):** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| aid | num | 稿件avid | 必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | -------------- | ------------ | ---- | +| access_key | str | APP 登录 Token | APP 方式必要 | | +| aid | num | 稿件 avid | 必要 | | **json回复:** @@ -701,7 +811,7 @@ curl 'http://api.bilibili.com/x/web-interface/archive/like/triple' \ 将视频`av91003840`一键三连 ```shell -curl 'http://app.bilibili.com/x/v2/view/like/triple' \ +curl 'https://app.bilibili.com/x/v2/view/like/triple' \ --data-urlencode 'access_key=xxx' \ --data-urlencode 'aid=91003840' ``` @@ -729,19 +839,23 @@ curl 'http://app.bilibili.com/x/v2/view/like/triple' \ ### 分享视频 (Web端) -> http://api.bilibili.com/x/web-interface/share/add +> https://api.bilibili.com/x/web-interface/share/add *请求方式:POST* -认证方式 csrf token +鉴权方式: Cookie (buvid3) **正文参数( application/x-www-form-urlencoded ):** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------------ | ------------------ | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------- | ------------ | --------------------- | +| aid | num | 稿件 aid | 必要 (可选) | aid 与 bvid 任选一个 | +| bvid | str | 稿件 bvid | 必要 (可选) | aid 与 bvid 任选一个 | +| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 不必要 | | +| eab_x | num | 2 | 不必要 | 作用尚不明确 | +| ramval | num | 0 | 不必要 | 作用尚不明确 | +| source | str | web_normal | 不必要 | | +| ga | num | 1 | 不必要 | 可能与风控有关? | **json回复:** @@ -749,18 +863,17 @@ curl 'http://app.bilibili.com/x/v2/view/like/triple' \ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | ---------- | ------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误 | +| code | num | 返回值 | 0: 成功
-101: 账号未登录
-111: csrf校验失败
-400: 请求错误
403: 账号异常,操作失败
71000: 重复分享 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | num | 当前分享数 | | - **示例:** 分享视频`BV1oA411776z` ```shell -curl 'http://api.bilibili.com/x/web-interface/share/add' \ +curl 'https://api.bilibili.com/x/web-interface/share/add' \ --data-urlencode 'csrf=xxx' \ --data-urlencode 'bvid=BV1oA411776z' ``` diff --git a/docs/video/appeal.md b/docs/video/appeal.md new file mode 100644 index 0000000..2324e45 --- /dev/null +++ b/docs/video/appeal.md @@ -0,0 +1,425 @@ +# 稿件投诉 + +## 附件上传 + +> 附件上传与视频封面上传共用一个api。 + +## 获取投诉类型 + +> https://api.bilibili.com/x/web-interface/archive/appeal/tags + +*请求类型:GET* + +**json回复:** + +| 参数名 | 类型 | 内容 | 备注 | +| ------- | ------------- | ---- | ------- | +| code | num | | 成功为0 | +| message | str | | 成功为0 | +| ttl | num | 1 | | +| data | array | | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ------------------ | +| 0 | obj | 类型条目 1 | | +| n | obj | 类型条目 (n+1) | 按照指定的顺序排列 | +| …… | obj | …… | …… | + +`data`数组中的对象 + +| 项 | 类型 | 内容 | 备注 | +| -------- | ------------------------------ | ---------------- | -------- | +| tid | num | 类型tid | | +| business | num | | 意义不明 | +| weight | num | 权重 | | +| round | num | | 意义不明 | +| state | num | | 意义不明 | +| name | str | 类型名称 | | +| remark | str | 类型备注 | | +| ctime | str | | 意义不明 | +| mtime | str | | 意义不明 | +| controls | 拥有时:array
没有时:null | 详细信息填写提示 | | + +`controls`数组中的对象: + +| 项 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------------- | -------- | +| tid | num | 同上 | | +| bid | num | | 意义不明 | +| name | str | 提示名称 | | +| title | str | 提示标题 | | +| component | str | 需要填入的类型 | | +| placeholder | str | 文本框占位符 | | +| required | num | 是否为必填 | | + +**示例:** + +```bash +curl --location --request GET 'https://api.bilibili.com/x/web-interface/archive/appeal/tags' +``` + +
+查看响应示例 + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "tid": 1, + "business": 1, + "weight": 1, + "round": 2, + "state": 1, + "name": "其他", + "remark": "为帮助审核人员更快处理,请补充问题类型和出现位置等详细信息", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2023-09-21T18:40:20+08:00", + "controls": null + }, + { + "tid": 8, + "business": 1, + "weight": 40, + "round": 2, + "state": 1, + "name": "与站内其他视频撞车", + "remark": "为帮助审核人员更快处理, 请描述撞车信息", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2023-03-06T16:36:02+08:00", + "controls": [ + { + "tid": 8, + "bid": 1, + "name": "撞车对象", + "title": "撞车对象", + "component": "input", + "placeholder": "BVID", + "required": 1 + } + ] + }, + { + "tid": 9, + "business": 1, + "weight": 30, + "round": 2, + "state": 1, + "name": "引战", + "remark": "为帮助审核人员更快处理, 请补充引战的话题和出现位置", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2018-08-13T15:41:20+08:00", + "controls": null + }, + { + "tid": 10, + "business": 1, + "weight": 20, + "round": 2, + "state": 1, + "name": "不能参加充电", + "remark": "为帮助审核人员更快处理, 请补充问题类型和出现位置等详细信息", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2018-08-23T11:35:28+08:00", + "controls": null + }, + { + "tid": 52, + "business": 1, + "weight": 35, + "round": 2, + "state": 1, + "name": "转载/自制错误", + "remark": "为帮助审核人员更快处理, 请补充原创作品出处", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2023-09-20T16:23:39+08:00", + "controls": [ + { + "tid": 52, + "bid": 1, + "name": "出处", + "title": "原创视频出处", + "component": "link", + "placeholder": "请填写链接", + "required": 1 + } + ] + }, + { + "tid": 10018, + "business": 1, + "weight": 36, + "round": 2, + "state": 1, + "name": "违规推广", + "remark": "", + "ctime": "2023-09-21T17:56:21+08:00", + "mtime": "2023-09-22T14:36:41+08:00", + "controls": null + }, + { + "tid": 10019, + "business": 1, + "weight": 34, + "round": 2, + "state": 1, + "name": "其他不规范行为", + "remark": "", + "ctime": "2023-09-21T18:05:33+08:00", + "mtime": "2023-09-22T14:37:03+08:00", + "controls": null + }, + { + "tid": 10020, + "business": 1, + "weight": 89, + "round": 2, + "state": 1, + "name": "危险行为", + "remark": "", + "ctime": "2023-09-21T18:05:51+08:00", + "mtime": "2023-09-22T14:38:08+08:00", + "controls": null + }, + { + "tid": 10022, + "business": 1, + "weight": 1, + "round": 2, + "state": 1, + "name": "其他", + "remark": "", + "ctime": "2023-09-21T19:07:01+08:00", + "mtime": "2023-09-22T14:38:59+08:00", + "controls": null + }, + { + "tid": 10023, + "business": 1, + "weight": 59, + "round": 2, + "state": 1, + "name": "企业商誉侵权", + "remark": "", + "ctime": "2023-12-01T14:06:58+08:00", + "mtime": "2023-12-01T15:33:26+08:00", + "controls": null + }, + { + "tid": 10024, + "business": 1, + "weight": 58, + "round": 2, + "state": 1, + "name": "侵权申诉", + "remark": "", + "ctime": "2023-12-01T14:07:18+08:00", + "mtime": "2023-12-01T15:33:37+08:00", + "controls": null + }, + { + "tid": 2, + "business": 1, + "weight": 100, + "round": 1, + "state": 1, + "name": "违法违禁", + "remark": "为帮助审核人员更快处理,补充违规内容出现位置", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2018-08-13T15:41:20+08:00", + "controls": null + }, + { + "tid": 3, + "business": 1, + "weight": 90, + "round": 1, + "state": 1, + "name": "色情低俗", + "remark": "为帮助审核人员更快处理,补充违规内容出现位置", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2023-09-21T19:07:10+08:00", + "controls": null + }, + { + "tid": 4, + "business": 1, + "weight": 80, + "round": 1, + "state": 1, + "name": "低俗", + "remark": "为帮助审核人员更快处理,补充违规内容出现位置", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2018-08-13T15:41:20+08:00", + "controls": null + }, + { + "tid": 5, + "business": 1, + "weight": 70, + "round": 1, + "state": 1, + "name": "赌博诈骗", + "remark": "为帮助审核人员更快处理,补充违规内容出现位置", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2018-08-13T15:41:20+08:00", + "controls": null + }, + { + "tid": 6, + "business": 1, + "weight": 60, + "round": 1, + "state": 1, + "name": "血腥暴力", + "remark": "为帮助审核人员更快处理,补充违规内容出现位置", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2018-08-13T15:41:20+08:00", + "controls": null + }, + { + "tid": 7, + "business": 1, + "weight": 50, + "round": 1, + "state": 1, + "name": "人身攻击", + "remark": "为帮助审核人员更快处理,补充违规内容出现位置", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2018-08-13T15:41:20+08:00", + "controls": null + }, + { + "tid": 10000, + "business": 1, + "weight": 10, + "round": 1, + "state": 1, + "name": "青少年不良信息", + "remark": "为帮助审核人员更快处理, 请补充违规内容出现位置", + "ctime": "2018-08-13T15:41:20+08:00", + "mtime": "2018-08-13T15:41:20+08:00", + "controls": null + }, + { + "tid": 10013, + "business": 1, + "weight": 37, + "round": 1, + "state": 1, + "name": "不良封面/标题", + "remark": "为帮助审核人员更快处理, 请描述详细信息", + "ctime": "2019-04-17T19:18:09+08:00", + "mtime": "2019-04-17T20:42:25+08:00", + "controls": null + }, + { + "tid": 10014, + "business": 1, + "weight": 8, + "round": 1, + "state": 1, + "name": "涉政谣言", + "remark": "为帮助审核人员更快处理,请补充谣言内容出现位置", + "ctime": "2022-09-15T17:23:44+08:00", + "mtime": "2022-09-16T09:56:07+08:00", + "controls": null + }, + { + "tid": 10015, + "business": 1, + "weight": 7, + "round": 1, + "state": 1, + "name": "涉社会事件谣言", + "remark": "为帮助审核人员更快处理,请补充谣言内容出现位置", + "ctime": "2022-09-15T17:25:56+08:00", + "mtime": "2022-09-16T09:56:07+08:00", + "controls": null + }, + { + "tid": 10017, + "business": 1, + "weight": 5, + "round": 1, + "state": 1, + "name": "虚假不实信息", + "remark": "为帮助审核人员更快处理,请补充不实内容出现位置", + "ctime": "2022-09-15T17:28:16+08:00", + "mtime": "2022-09-16T09:56:08+08:00", + "controls": null + }, + { + "tid": 10021, + "business": 1, + "weight": 88, + "round": 1, + "state": 1, + "name": "观感不适", + "remark": "", + "ctime": "2023-09-21T18:06:15+08:00", + "mtime": "2023-09-21T18:06:15+08:00", + "controls": null + } + ] +} +``` + +
+ +## 投诉稿件 + +> https://api.bilibili.com/x/web-interface/appeal/v2/submit +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +**正文参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------ | ------------------------ | +| csrf | str | csrf token(位于cookie bili_jct) | 必要 | 位于request body | +| aid | num | 稿件aid | 必要 | 位于request body | +| tid | num | 投诉理由tid | 必要 | 位于request body | +| desc | str | 投诉理由详细描述 | 必要 | 位于request body | +| attach | str | 附件(多个附件用逗号隔开 | 非必要 | 位于request body | +| buid | str | 风控代码 | 必要 | 位于request header | +| Buid | str | 风控代码 | 必要 | 位于request cookies | + +上下两个buid值必须相同,可随机 + +**json回复:** + +| 参数名 | 类型 | 内容 | 备注 | +| ------- | ---- | ------ | ------- | +| code | num | 返回码 | 成功为0 | +| message | str | | 成功为0 | +| ttl | | 1 | | + +**示例:举报av号为61080066的视频,理由为人身攻击,描述为“xxxxx”,并附带了一个图片附件 + +```bash +curl --location --request POST 'https://api.bilibili.com/x/web-interface/appeal/v2/submit' \ +--form 'csrf="xxxx"'\ +--form 'aid="61080066"' \ +--form 'tid="7"' \ +--form 'desc="xxxxx"' \ +--form 'attach="https://archive.biliimg.com/bfs/archive/xxxxx.png"' +``` + +
+ 查看响应示例 + +```json +{ + "code":0, + "message":"0", + "ttl":1 +} +``` + +
diff --git a/video/attribute_data.md b/docs/video/attribute_data.md similarity index 91% rename from video/attribute_data.md rename to docs/video/attribute_data.md index 4dfdec0..a3d1e70 100644 --- a/video/attribute_data.md +++ b/docs/video/attribute_data.md @@ -1,12 +1,11 @@ # 视频属性数据说明 -(PS:以下部分内容来源不明,且部分值前端不可见,有待验证) - -- [attribute字段值(视频属性位)](#attribute字段值(视频属性位)) -- [state字段值(稿件状态)](#state字段值(稿件状态)) +**PS**:以下部分内容来源不明,且部分值前端不可见,有待验证 ## attribute字段值(稿件属性位) +该字段前端已弃用, 相关接口返回恒为 `0`, 参见 [验证视频属性字段,实锤B站视频限流](https://shakaianee.top/archives/9/) + 该字段为二进制标志位,多个标志请用`OR`运算叠加 | 位 | 内容 | 备注 | @@ -32,7 +31,7 @@ | 18 | 是否付费 | | | 19 | 推送动态 | | | 20 | 家长模式 | | -| 21 | 是否限制游客和外链 | 分为两种情况,默认全部网页限制referer跳转,但第二种未登录无法访问,可以通过未登陆b站访问http://api.bilibili.com/x/web-interface/view 返回的code为-403来判断 | +| 21 | 是否限制游客和外链 | 分为两种情况,默认全部网页限制referer跳转,但第二种未登录无法访问,可以通过未登陆b站访问https://api.bilibili.com/x/web-interface/view 返回的code为-403来判断 | | 22 | ? | | | 23 | ? | | | 24 | 是否为联合投稿 | | @@ -67,5 +66,6 @@ | -20 | 创建未提交 | | | -30 | 创建已提交 | | | -40 | 定时发布 | | +| -50 | 仅UP主可见 | | | -100 | 用户删除 | | diff --git a/docs/video/collection.md b/docs/video/collection.md new file mode 100644 index 0000000..0e79db7 --- /dev/null +++ b/docs/video/collection.md @@ -0,0 +1,1986 @@ +# 合集和视频列表信息 + +请注意区分 **合集(seasons_archives)** 和 **视频列表(seasons_series)** + +合集是后加入的功能, 图标为立体叠放的正方形(.icon-heji), 可以在创作中心管理, 参见 [合集管理](../creativecenter/season.md) + +列表即系列(series)或频道(channel), 图标为平面叠放的矩形且中央有播放按钮标识(.icon-ic_channel1), 在个人空间直接操作 + +此处保留原 Issue 的表述, 参见 [#945](https://github.com/SocialSisterYi/bilibili-API-collect/issues/945) + +## 获取视频合集信息 + +> https://api.bilibili.com/x/polymer/web-space/seasons_archives_list (需验证referer) +> +> https://api.bilibili.com/x/polymer/space/seasons_archives_list (旧接口, 不推荐使用, 无鉴权验证) + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|--------|-----|------|--------|-----| +| mid | num | 用户 mid | 必要 | 创建者的 mid,但也可以是任意的非负整数 | +| season_id | num | 视频合集 ID | 必要 | | +| sort_reverse | bool | 排序方式 | 可选 | true: 升序排序
false: 默认排序 | +| page_num | num | 页码索引 | 可选 | 默认为 1 | +| page_size | num | 单页内容数量 | 可选 | 默认为 30 | +| gaia_vtoken | str | 风控验证? | 可选 | 若被风控则必要(如User-Agent不正常) | +| web_location | str | 页面位置? | 可选 | 333.999 | +| w_rid | str | WBI 签名 | 可选 | 参见 [WBI 签名](../misc/sign/wbi.md) | +| wts | num | UNIX 秒级时间戳 | 可选 | 参见 [WBI 签名](../misc/sign/wbi.md) | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------------- | ------- | ------------------------------ | ----------------------------------------------------------- | +| aids | array | 稿件 avid 列表 | 对应下方数组中内容 aid | +| archives | array | 合集中的视频 | | +| meta | obj | 合集元数据 | | +| page | obj | 分页信息 | | + +`data`中的`archives`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|----------|---------| +| 0 | obj | 合集内容 | | +| n | obj | (n+1)P内容 | | +| …… | obj | …… | …… | + +`archives`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|----------|-----|------|-----| +| aid | num | 稿件 avid || +| bvid | str | 稿件 bvid || +| ctime | num | 创建时间 | Unix 时间戳 | +| duration | num | 视频时长 | 单位为秒 | +| enable_vt | bool | false | 旧接口无 | +| interactive_video | bool | 是否是互动视频 | | +| pic | str | 封面 URL || +| playback_position | num || 会随着播放时间增长,播放完成后为 -1 。单位为 % | +| pubdate | num | 发布日期 | Unix 时间戳 | +| stat | obj | 稿件信息 || +| state | num | 0 || +| title | str | 稿件标题|| +| ugc_pay | num | UGC 付费? | 0: 否 | +| vt_display | str | 空 | 旧接口无 | + +`archives`中的`stat`对象: + +| 字段 | 类型 | 内容 | 备注 | +|----------|-----|------|-----| +| view | num | 稿件播放量 || +| vt | num | 0 || + +`data`中的`meta`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-----------------|-----|--------------|--------| +| category | num | 0 | | +| cover | str | 合集封面 URL | | +| description | str | 合集描述 | | +| mid | num | UP 主 ID | | +| name | str | 合集标题 | | +| ptime | num | 发布时间 | Unix 时间戳 | +| season_id | num | 合集 ID | | +| total | num | 合集内视频数量 | | + +`data`中的`page`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-----------------|-----|--------------|--------| +| page_num | num | 分页页码 | | +| page_size | num | 单页个数 | | +| total | num | 合集内视频数量 | | + +**示例:** + +获取 `mid=37737161` 的 `season_id=1227671` 视频合集信息,默认排序,第 1 页,每页 30 个视频 + +```shell +curl -G "https://api.bilibili.com/x/polymer/space/seasons_archives_list" \ +--data-urlencode "mid=37737161" \ +--data-urlencode "sort_reverse=false" \ +--data-urlencode "season_id=1227671" \ +--data-urlencode "page_num=1" \ +--data-urlencode "page_size=30" +``` + +
+查看响应示例: + + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "aids": [ + 311606079, + 400546145 + ], + "archives": [ + { + "aid": 311606079, + "bvid": "BV1XN411K7g9", + "ctime": 1679651747, + "duration": 261, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/234e6bd061176dba9e148f4373c52fa7cd2d801f.jpg", + "pubdate": 1679651747, + "stat": { + "view": 12145 + }, + "state": 0, + "title": "某些IT社区平台乱象,文章千篇一律,毫不注重版权,文章互相抄袭成潮流,希望能够好好管管!", + "ugc_pay": 0 + }, + { + "aid": 400546145, + "bvid": "BV1qo4y1L73P", + "ctime": 1682777426, + "duration": 335, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/a6b6fb0330bbf6c500720a024e5a9ade24d888c3.jpg", + "pubdate": 1682777425, + "stat": { + "view": 52743 + }, + "state": 0, + "title": "某些搜索引擎得到的结果,官方网站反而排在一些诈骗广告后面,诱导用户下载大量捆绑垃圾软件", + "ugc_pay": 0 + } + ], + "meta": { + "category": 0, + "cover": "https://archive.biliimg.com/bfs/archive/5e1c1f77c3065ec31eec43d7e35f7a061602e4d6.jpg", + "description": "白马首席讲师吐槽系列视频", + "mid": 37737161, + "name": "水浅王八多,真假白马说", + "ptime": 1682777425, + "season_id": 1227671, + "total": 2 + }, + "page": { + "page_num": 1, + "page_size": 30, + "total": 2 + } + } +} +``` + +
+ +## 只获取系列视频 + +> https://api.bilibili.com/x/polymer/web-space/home/seasons_series + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | ------------ | ------ | ---- | +| mid | num | 用户 mid | 必要 | | +| page_num | num | 页码索引 | 必要 | | +| page_size | num | 单页内容数量 | 必要 | | +| gaia_vtoken | str | 风控验证? | 可选 | 若被风控则必要(如User-Agent不正常) | +| w_rid | str | WBI 签名 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | +| wts | num | UNIX 秒级时间戳 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------- | +| code | num | 返回值 | 0:成功
-352: 请求被风控
-400: 请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ---- | -------- | -------- | +| items_lists | obj | 内容列表 | 套了个娃 | + +`data`中的`items_lists`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ----- | -------- | ---- | +| page | obj | 分页信息 | | +| seasons_list | array | 空 | | +| series_list | array | 系列列表 | | + +`items_lists`中的`page`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | -------- | ---- | +| page_num | num | 分页页码 | | +| page_size | num | 单页个数 | | +| total | num | 总页数 | | + +`items_lists`中的`series_list`数组: + +| 项 | 类型 | 内容 | 备注 | +| -- | ---- | ----------------- | ---- | +| 0 | obj | 第1个系列内容 | | +| 1 | obj | 第2个系列内容 | | +| …… | obj | …… | …… | +| n | obj | 第(n+1)个系列内容 | | + +`series_list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------- | ----- | ----------------- | ------------- | +| archives | array | 系列视频列表 | | +| meta | obj | 系列元数据 | | +| recent_aids | array | 系列视频 aid 列表 | 内容类型为num | + +`series_list`中的`archives`数组: + +同[获取视频合集信息](#获取视频合集信息)中的`archives`数组 + +`series_list`中的`meta`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ----- | -------------- | ------------- | +| category | num | 1 | | +| cover | str | 系列封面 URL | | +| creator | str | auto | | +| ctime | num | 创建时间 | Unix 时间戳 | +| description | str | 系列描述 | | +| keywords | array | 系列关键词列表 | 内容类型为str | +| last_update_ts | num | 最近更新时间 | Unix 时间戳 | +| mid | num | UP 主 ID | | +| mtime | num | 修改时间 | Unix 时间戳 | +| name | str | 系列标题 | | +| raw_keywords | str | 原始系列关键词 | | +| series_id | num | 系列 ID | | +| state | num | 2 | | +| total | num | 系列视频数量 | | + +**示例:** + +```shell +curl -G "https://api.bilibili.com/x/polymer/web-space/home/seasons_series" \ +--data-urlencode "mid=37737161" \ +--data-urlencode "page_num=1" \ +--data-urlencode "page_size=10" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "items_lists": { + "page": { + "page_num": 1, + "page_size": 10, + "total": 1 + }, + "seasons_list": [], + "series_list": [ + { + "archives": [ + { + "aid": 284063097, + "bvid": "BV1Fc411x7xF", + "ctime": 1705925782, + "duration": 8885, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/5aa1bb0a121d89969e9bd2634bc7ae23272bf850.jpg", + "playback_position": 0, + "pubdate": 1705925781, + "stat": { + "view": 14683, + "vt": 0 + }, + "state": 0, + "title": "Gradle 教程 已完结 (基于Kotlin DSL讲解) 4K蓝光画质 超强的脚本式项目依赖和构建工具", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 367948632, + "bvid": "BV1P94y1c7tV", + "ctime": 1703844221, + "duration": 52036, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/499aeb41a0428e05523b766e367540b04f7c3ae2.jpg", + "playback_position": 0, + "pubdate": 1703844220, + "stat": { + "view": 82997, + "vt": 0 + }, + "state": 0, + "title": "Kotlin 教程 已完结 (IDEA 2024 最新版) 4K蓝光画质+杜比音效 零基础入门一套搞定 入门到入土经典版", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 836303388, + "bvid": "BV1Hg4y1m7Ca", + "ctime": 1705401362, + "duration": 5873, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i1.hdslb.com/bfs/archive/a20b09d1cc1a81f6a9c5ed8ea322656e406be725.jpg", + "playback_position": 0, + "pubdate": 1705401362, + "stat": { + "view": 8417, + "vt": 0 + }, + "state": 0, + "title": "Kotlin 扩展篇 已完结 (IDEA 2024 最新版) 4K蓝光画质 与Java语言混合编程", + "ugc_pay": 0, + "vt_display": "" + } + ], + "meta": { + "category": 1, + "cover": "http://i0.hdslb.com/bfs/archive/5aa1bb0a121d89969e9bd2634bc7ae23272bf850.jpg", + "creator": "auto", + "ctime": 1705401630, + "description": "包含Kotlin语言学习的完整流程,正在不断完善中哦~", + "keywords": [ + "Kotlin" + ], + "last_update_ts": 1705925782, + "mid": 37737161, + "mtime": 1705925782, + "name": "Kotlin开心路线", + "raw_keywords": "Kotlin", + "series_id": 3908327, + "state": 2, + "total": 3 + }, + "recent_aids": [ + 284063097, + 367948632, + 836303388 + ] + }, + { + "archives": [ + { + "aid": 848832470, + "bvid": "BV1CL4y1i7qR", + "ctime": 1635258883, + "duration": 106474, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/45dddea811257f78ddd6f1e70197d95d7d6b5187.jpg", + "playback_position": 0, + "pubdate": 1635258883, + "stat": { + "view": 438645, + "vt": 0 + }, + "state": 0, + "title": "JavaWeb 教程 已完结(IDEA 2021版本)4K蓝光画质 入土到起立", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 566880413, + "bvid": "BV1Kv4y1x7is", + "ctime": 1676544280, + "duration": 25149, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i1.hdslb.com/bfs/archive/cc59de5afebc66447ba93ad9ea0ba73a9b09c117.jpg", + "playback_position": 0, + "pubdate": 1676544280, + "stat": { + "view": 87171, + "vt": 0 + }, + "state": 0, + "title": "Spring 核心教程 已完结(IDEA 2023最新版)4K蓝光画质 基于Spring6的全新重制版本 起立到起飞", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 615286308, + "bvid": "BV1Lh4y1M7kx", + "ctime": 1688117457, + "duration": 10373, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/5f860de4bc0fab30651ae93396f9c572be8380b2.jpg", + "playback_position": 0, + "pubdate": 1688117457, + "stat": { + "view": 41428, + "vt": 0 + }, + "state": 0, + "title": "Spring MVC 教程 已完结(IDEA 2023最新版)4K蓝光画质 基于Spring6的全新重制版本 起立到起飞", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 403104913, + "bvid": "BV1fV411M7aS", + "ctime": 1688560394, + "duration": 17611, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i1.hdslb.com/bfs/archive/c4557a16aa3519183d6ae0114e1c64107bb23703.jpg", + "playback_position": 0, + "pubdate": 1688560394, + "stat": { + "view": 59298, + "vt": 0 + }, + "state": 0, + "title": "Spring Security 教程 已完结(IDEA 2023最新版)4K蓝光画质 基于Spring6的全新重制版本 起立到起飞", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 828666773, + "bvid": "BV1xu4y1m7UP", + "ctime": 1689767299, + "duration": 29696, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i1.hdslb.com/bfs/archive/06cf686d4d3f7ce6731975ef59938d759283318e.jpg", + "playback_position": 0, + "pubdate": 1689767299, + "stat": { + "view": 108078, + "vt": 0 + }, + "state": 0, + "title": "Spring Boot 教程 已完结(IDEA 2023最新版)4K蓝光画质 基于SpringBoot 3 的全新重制版本 起飞到删库跑路", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 852857221, + "bvid": "BV1AL4y1j7RY", + "ctime": 1648811079, + "duration": 55544, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/629755f79c13c96c9b6d91da80257a352b29dd86.jpg", + "playback_position": 0, + "pubdate": 1648811079, + "stat": { + "view": 168251, + "vt": 0 + }, + "state": 0, + "title": "SpringCloud 教程 已完结(IDEA 2022.1最新版)4K蓝光画质 微服务开发", + "ugc_pay": 0, + "vt_display": "" + } + ], + "meta": { + "category": 1, + "cover": "http://i0.hdslb.com/bfs/archive/45dddea811257f78ddd6f1e70197d95d7d6b5187.jpg", + "creator": "auto", + "ctime": 1669273103, + "description": "已排序完成,共4个系列,请至少完成Java SE篇视频之后再开始JavaEE路线哦~ 整个路线大致为:JavaWeb基础篇、SSM成长篇、SpringBoot成熟篇、SpringCloud进阶篇", + "keywords": [ + "" + ], + "last_update_ts": 1696249622, + "mid": 37737161, + "mtime": 1696249622, + "name": "JavaEE通关路线", + "raw_keywords": "", + "series_id": 2800548, + "state": 2, + "total": 9 + }, + "recent_aids": [ + 848832470, + 566880413, + 615286308, + 403104913, + 828666773, + 852857221 + ] + }, + { + "archives": [ + { + "aid": 445283537, + "bvid": "BV14j411S76G", + "ctime": 1687946670, + "duration": 7008, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i1.hdslb.com/bfs/archive/208bb09ecf97fbbd73e45b3839715276ffbbe8f4.jpg", + "playback_position": 0, + "pubdate": 1687946670, + "stat": { + "view": 9483, + "vt": 0 + }, + "state": 0, + "title": "Apache Maven 依赖管理 极速上手 已完结(2021 版本)4K蓝光画质+杜比音效 从导入到冲突", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 813084463, + "bvid": "BV1r34y1p7j9", + "ctime": 1656909478, + "duration": 17457, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/798135f31dc9e03121458f32825dc81d8e403887.jpg", + "playback_position": 0, + "pubdate": 1656909478, + "stat": { + "view": 46179, + "vt": 0 + }, + "state": 0, + "title": "Docker 容器技术 已完结(2022 最新版)4K蓝光画质+杜比音效 从内卷到开摆", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 432905025, + "bvid": "BV1a3411f7nh", + "ctime": 1669296029, + "duration": 10393, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/d14c0fad064a224de7afb7edd147f8b335324c53.jpg", + "playback_position": 0, + "pubdate": 1669296029, + "stat": { + "view": 37040, + "vt": 0 + }, + "state": 0, + "title": "Linux 操作系统 光速入门 已完结(2021 版本)4K蓝光画质+杜比音效 从讨厌到喜欢", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 390385576, + "bvid": "BV19d4y147Df", + "ctime": 1669272992, + "duration": 23389, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/8ba763e1a1e14c47c1c178ecf21240896d3fbb5e.jpg", + "playback_position": 0, + "pubdate": 1669272992, + "stat": { + "view": 32189, + "vt": 0 + }, + "state": 0, + "title": "MySQL 数据库技术 已完结(2021版本)4K蓝光画质+杜比音效 从内卷到开摆", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 647924810, + "bvid": "BV1ce4y1W7YB", + "ctime": 1669275447, + "duration": 8492, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/f5bcc92a4e181cb12a8b80499cea255f43f2d97b.jpg", + "playback_position": 0, + "pubdate": 1669275447, + "stat": { + "view": 20004, + "vt": 0 + }, + "state": 0, + "title": "Git 版本控制 快速上手 已完结(2021版本)4K蓝光画质+杜比音效 从开摆到放弃", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 347934006, + "bvid": "BV1vR4y1o7Z2", + "ctime": 1669295228, + "duration": 10631, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/f95d39b0bc1a2bdad07461a8f4b1ea48c174902c.jpg", + "playback_position": 0, + "pubdate": 1669295228, + "stat": { + "view": 25860, + "vt": 0 + }, + "state": 0, + "title": "Redis 缓存技术 已完结(2021版本)4K蓝光画质+杜比音效 从内卷到开摆", + "ugc_pay": 0, + "vt_display": "" + } + ], + "meta": { + "category": 1, + "cover": "http://i1.hdslb.com/bfs/archive/208bb09ecf97fbbd73e45b3839715276ffbbe8f4.jpg", + "creator": "auto", + "ctime": 1669273164, + "description": "包含主线中讲解的中间件归档视频与当下必学的火热技术。", + "keywords": [ + "" + ], + "last_update_ts": 1688123428, + "mid": 37737161, + "mtime": 1688123428, + "name": "必学技术与中间件", + "raw_keywords": "", + "series_id": 2800550, + "state": 2, + "total": 7 + }, + "recent_aids": [ + 445283537, + 813084463, + 432905025, + 390385576, + 647924810, + 347934006 + ] + }, + { + "archives": [ + { + "aid": 900707014, + "bvid": "BV1YP4y1o75f", + "ctime": 1663494406, + "duration": 103542, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/291dd3b60b67a8f74567a81999612bd50b4e8017.jpg", + "playback_position": 0, + "pubdate": 1663494406, + "stat": { + "view": 312144, + "vt": 0 + }, + "state": 0, + "title": "JavaSE 教程 已完结 (IDEA 2022 最新版) 4K蓝光画质+杜比音效 零基础入门一套搞定 入门到入土", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 604837097, + "bvid": "BV1G84y1v7Vj", + "ctime": 1667815711, + "duration": 19395, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/4a4522194a1d0c8ae684976b26fb2fe43ce28f39.jpg", + "playback_position": 0, + "pubdate": 1667815711, + "stat": { + "view": 74496, + "vt": 0 + }, + "state": 0, + "title": "JavaSE AWT/Swing 图形化编程 (IDEA 2022 最新版) 4K蓝光画质+杜比音效 快速上手桌面程序 用IDEA写IDEA", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 766688029, + "bvid": "BV1Er4y1r7as", + "ctime": 1645157763, + "duration": 21585, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/ced6a8c8548f0f921f306ea3589f9d470adc0446.jpg", + "playback_position": 0, + "pubdate": 1645157763, + "stat": { + "view": 133409, + "vt": 0 + }, + "state": 0, + "title": "Java JVM 虚拟机 已完结(IDEA 2021版本)4K蓝光画质 全程劝退", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 936955310, + "bvid": "BV1JT4y1S7K8", + "ctime": 1646391131, + "duration": 31736, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i1.hdslb.com/bfs/archive/9347ef3cdb6cf0e5bca29ce32e211b488e90ab7b.jpg", + "playback_position": 0, + "pubdate": 1646391131, + "stat": { + "view": 74731, + "vt": 0 + }, + "state": 0, + "title": "Java JUC 并发编程 已完结(IDEA 2021版本)4K蓝光画质 玩转多线程", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 768437265, + "bvid": "BV1ar4y1J7mC", + "ctime": 1650881312, + "duration": 26314, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/7f97549147c09a386d9402b121cc6206c36e4079.jpg", + "playback_position": 0, + "pubdate": 1650881312, + "stat": { + "view": 67900, + "vt": 0 + }, + "state": 0, + "title": "Java NIO Netty网络编程 已完结(IDEA 2022.1最新版)4K蓝光画质 网络I/O进阶编程", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 684547077, + "bvid": "BV1tU4y1y7Fg", + "ctime": 1653900327, + "duration": 10243, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/dc0cc9464c6fc274c1f23f682a01dab5a358217b.jpg", + "playback_position": 0, + "pubdate": 1653900327, + "stat": { + "view": 47693, + "vt": 0 + }, + "state": 0, + "title": "JavaSE 9-17 新特性 已完结(IDEA 2022.1最新版)4K蓝光画质 Java9/10/11/12/13/14/15/16/17讲解", + "ugc_pay": 0, + "vt_display": "" + } + ], + "meta": { + "category": 1, + "cover": "http://i0.hdslb.com/bfs/archive/291dd3b60b67a8f74567a81999612bd50b4e8017.jpg", + "creator": "auto", + "ctime": 1648810702, + "description": "已排序完成,共3个系列,完成JavaSE篇之后,就可以开启JavaEE路线了", + "keywords": [ + "" + ], + "last_update_ts": 1667816253, + "mid": 37737161, + "mtime": 1667816253, + "name": "JavaSE基础路线", + "raw_keywords": "", + "series_id": 2158988, + "state": 2, + "total": 6 + }, + "recent_aids": [ + 900707014, + 604837097, + 766688029, + 936955310, + 768437265, + 684547077 + ] + }, + { + "archives": [ + { + "aid": 770027221, + "bvid": "BV1Cr4y137os", + "ctime": 1655371329, + "duration": 48185, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/5d9bd135f068e623e50c7341244635f6cc96c3ea.jpg", + "playback_position": 0, + "pubdate": 1655371329, + "stat": { + "view": 275378, + "vt": 0 + }, + "state": 0, + "title": "C语言程序设计 已完结(CLion 2022 最新版)4K蓝光画质+杜比音效 梦开始的地方", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 941207928, + "bvid": "BV13W4y127Ey", + "ctime": 1658474799, + "duration": 69081, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/0bf055a0961c0f9bbb7f869b47c3e3d7df21f55c.jpg", + "playback_position": 0, + "pubdate": 1658474798, + "stat": { + "view": 220072, + "vt": 0 + }, + "state": 0, + "title": "数据结构与算法 已完结(CLion 2022 最新版)4K蓝光画质+杜比音效 全程高能", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 426681358, + "bvid": "BV1u3411P7Na", + "ctime": 1653033628, + "duration": 12346, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i0.hdslb.com/bfs/archive/4174e2976f750d5410d6cef374c3035190717cac.jpg", + "playback_position": 0, + "pubdate": 1653033628, + "stat": { + "view": 71911, + "vt": 0 + }, + "state": 0, + "title": "Java 设计模式 已完结(IDEA 2022.1最新版)4K蓝光画质+杜比音效", + "ugc_pay": 0, + "vt_display": "" + } + ], + "meta": { + "category": 1, + "cover": "http://i0.hdslb.com/bfs/archive/5d9bd135f068e623e50c7341244635f6cc96c3ea.jpg", + "creator": "auto", + "ctime": 1653296733, + "description": "Java设计模式系列视频,提升你的代码编写规范。", + "keywords": [ + "" + ], + "last_update_ts": 1658735292, + "mid": 37737161, + "mtime": 1658735292, + "name": "高等院校计算机必修课", + "raw_keywords": "", + "series_id": 2318088, + "state": 2, + "total": 3 + }, + "recent_aids": [ + 770027221, + 941207928, + 426681358 + ] + } + ] + } + } +} +``` + +
+ +## 获取系列和合集视频 + +> https://api.bilibili.com/x/polymer/web-space/seasons_series_list + +*请求方式: GET* + +鉴权方式: 请求头 User-Agent 为正常浏览器, 若仍被风控则请求头再带上 Referer 为 `.bilibili.com` 下任意页 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| mid | num | 用户 mid | 必要 | | +| page_num | num | 页码 | 必要 | 默认为 1 | +| page_size | num | 每页数量 | 必要 | 默认为 20 | +| w_rid | str | WBI 签名 | 可选 | 参见 [WBI 签名](../misc/sign/wbi.md) | +| wts | num | UNIX 秒级时间戳 | 可选 | 参见 [WBI 签名](../misc/sign/wbi.md) | +| web_location | str | 页面位置? | 可选 | 333.999 | + +**JSON回复:** + +与 [只获取系列视频](#只获取系列视频) 基本一致, 但 `.data.items_lists.seasons_list` 数组不为空, +且该数组中的元素结构与 `.data.items_lists.series_list` 相同, 略 + +**示例:** + +获取 `mid=37737161` 的系列视频列表,每页 5 条,页码为 1 + +```shell +curl -G "https://api.bilibili.com/x/polymer/web-space/seasons_series_list" \ +--data-urlencode "mid=37737161" \ +--data-urlencode "page_num=1" \ +--data-urlencode "page_size=5" \ +--data-urlencode "w_rid=xxx" \ +--data-urlencode "wts=xxx" +``` + +
+查看响应示例: + +```jsonc +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "items_lists": { + "page": { + "page_num": 1, + "page_size": 5, + "total": 9 + }, + "seasons_list": [ + { + "archives": [ + { + "aid": 343807541, + "bvid": "BV1t94y1D79E", + "ctime": 1658907465, + "duration": 2164, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i1.hdslb.com/bfs/archive/0af0faa77a1921db4cf86c115db70aa2594983f0.jpg", + "playback_position": 0, + "pubdate": 1658907465, + "stat": { + "view": 43096, + "vt": 0 + }, + "state": 0, + "title": "Java学习路线两条龙版,让你不再迷茫!包含各个知识点梳理,常用技术栈介绍等。", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 429032764, + "bvid": "BV11G411h7NB", + "ctime": 1659499261, + "duration": 197, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/5235a0ab2738e288b08654aa8e0cd3a509a7ef96.jpg", + "playback_position": 0, + "pubdate": 1659499200, + "stat": { + "view": 22700, + "vt": 0 + }, + "state": 0, + "title": "好书推荐《On Java》都什么年代了,还在看传统Java书籍?", + "ugc_pay": 0, + "vt_display": "" + }, + // ... + ], + "meta": { + "category": 0, + "cover": "https://archive.biliimg.com/bfs/archive/27733cf13514d990c880154b937cd8633f583aa4.jpg", + "description": "除教程视频外其他的视频,均在此。", + "mid": 37737161, + "name": "合集·拾枝杂谈", + "ptime": 1694682652, + "season_id": 587216, + "total": 10 + }, + "recent_aids": [ + 343807541, + 429032764, + 857089796, + 560181990, + 774119786, + 859397126 + ] + }, + { + "archives": [ + { + "aid": 311606079, + "bvid": "BV1XN411K7g9", + "ctime": 1679651747, + "duration": 261, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/234e6bd061176dba9e148f4373c52fa7cd2d801f.jpg", + "playback_position": 0, + "pubdate": 1679651747, + "stat": { + "view": 12150, + "vt": 0 + }, + "state": 0, + "title": "某些IT社区平台乱象,文章千篇一律,毫不注重版权,文章互相抄袭成潮流,希望能够好好管管!", + "ugc_pay": 0, + "vt_display": "" + }, + { + "aid": 400546145, + "bvid": "BV1qo4y1L73P", + "ctime": 1682777426, + "duration": 335, + "enable_vt": false, + "interactive_video": false, + "pic": "http://i2.hdslb.com/bfs/archive/a6b6fb0330bbf6c500720a024e5a9ade24d888c3.jpg", + "playback_position": 0, + "pubdate": 1682777425, + "stat": { + "view": 52744, + "vt": 0 + }, + "state": 0, + "title": "某些搜索引擎得到的结果,官方网站反而排在一些诈骗广告后面,诱导用户下载大量捆绑垃圾软件", + "ugc_pay": 0, + "vt_display": "" + } + ], + "meta": { + "category": 0, + "cover": "https://archive.biliimg.com/bfs/archive/5e1c1f77c3065ec31eec43d7e35f7a061602e4d6.jpg", + "description": "白马首席讲师吐槽系列视频", + "mid": 37737161, + "name": "合集·水浅王八多,真假白马说", + "ptime": 1682777425, + "season_id": 1227671, + "total": 2 + }, + "recent_aids": [ + 311606079, + 400546145 + ] + }, + // ... + ], + "series_list": [ + // 与前接口基本相同 + ] + } + } +} +``` + +
+ +## 查询指定系列 + +> https://api.bilibili.com/x/series/series + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| series_id | num | 系列ID | 必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ------------ | ---- | +| meta | obj | 系列信息 | | +| recent_aids | array | 系列 aid 列表 | 内容类型为 num | + +`data`中的`meta`对象: + +同[只获取系列视频](#只获取系列视频)中的`meta`对象 + +**示例:** + +```shell +curl -G 'https://api.bilibili.com/x/series/series' \ +--data-urlencode 'series_id=2158988' +``` + +
+查看响应示例 + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "meta": { + "series_id": 2158988, + "mid": 37737161, + "name": "JavaSE基础路线", + "description": "已排序完成,共3个系列,完成JavaSE篇之后,就可以开启JavaEE路线了", + "keywords": [ + "" + ], + "creator": "auto", + "state": 2, + "last_update_ts": 1667816253, + "total": 6, + "ctime": 1648810702, + "mtime": 1667816253, + "raw_keywords": "", + "category": 1 + }, + "recent_aids": [ + 900707014, + 604837097, + 766688029, + 936955310, + 768437265, + 684547077 + ] + } +} +``` + +
+ +## 获取指定系列视频 + +> https://api.bilibili.com/x/series/archives + +*请求方式: GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| mid | num | 用户 mid | 必要 | | +| series_id | num | 系列ID | 必要 | | +| only_normal | bool | 作用尚不明确 | 可选 | 默认为 true | +| sort | str | 排序方式 | 可选 | desc: 默认排序
asc: 升序排序 | +| pn | num | 页码 | 可选 | 默认为 1 | +| ps | num | 每页数量 | 可选 | 默认为 20 | +| current_mid | num | 当前用户 mid | 可选 | 用于 `playback_position` 播放进度 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------- | +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ------------ | ---- | +| aids | array | 视频 aid 列表 | 内容类型为 num | +| page | obj | 页码信息 | | +| archives | array | 视频信息列表 | | + +`data`中的`page`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------- | ---- | +| num | num | 当前页码 | | +| size | num | 每页数量 | | +| total | num | 视频总数 | | + +`data`中的`archives`数组: + +基本同[获取视频合集信息](#获取视频合集信息)中的`archives`数组 + +**示例:** + +获取 `mid=39665558` 的 `series_id=534501` 系列视频列表,每页 16 条,页码为 1,默认排序, 当前用户 mid 为 `1070915568` + +```shell +curl -G "https://api.bilibili.com/x/series/archives" \ +--data-urlencode "mid=39665558" \ +--data-urlencode "series_id=534501" \ +--data-urlencode "only_normal=true" \ +--data-urlencode "sort=desc" \ +--data-urlencode "pn=1" \ +--data-urlencode "ps=16" \ +--data-urlencode "current_mid=1070915568" +``` + +
+查看响应示例: + +```jsonc +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "aids": [ + 695029098, + 724599872, + 594794875, + 41565264, + 541053051, + 499696652, + 673071936, + 462891077, + 973903762, + 61692380, + 336713491, + 372661682, + 550840795, + 51839931, + 718592873, + 87838863 + ], + "page": { + "num": 1, + "size": 16, + "total": 25 + }, + "archives": [ + { + "aid": 695029098, + "title": "Python控制Minecraft教程(下):自动建造", + "pubdate": 1677321251, + "ctime": 1677321251, + "state": 0, + "pic": "http://i1.hdslb.com/bfs/archive/187c0ba21b9ceba908a8760e83d49f466316824b.jpg", + "duration": 275, + "stat": { + "view": 26555 + }, + "bvid": "BV1k24y1J78X", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 724599872, + "title": "『教程』一看就懂!Github基础教程", + "pubdate": 1646740815, + "ctime": 1646740824, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/1401ebe64e88deddf2b44ad6a740ff8872c2fda6.jpg", + "duration": 296, + "stat": { + "view": 2412054 + }, + "bvid": "BV1hS4y1S7wL", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 594794875, + "title": "『教程』手把手教你流畅访问Github", + "pubdate": 1647345613, + "ctime": 1647336725, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/71cc640a84087cc99399449c00b93212fe78ee6f.jpg", + "duration": 236, + "stat": { + "view": 910491 + }, + "bvid": "BV1Aq4y1q7hr", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 41565264, + "title": "《Python负基础到入门教程》专为\"非计算机专业和编程困难户\"制作(全13集 配音字幕重制版)", + "pubdate": 1548316071, + "ctime": 1548316072, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/5f4f6acfc00723c84f726d35add94b1d4b4ee482.jpg", + "duration": 6395, + "stat": { + "view": 261286 + }, + "bvid": "BV1et411b76c", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 541053051, + "title": "『教程』文字频频乱码 这背后是显卡的扭曲还是规则的沦丧?", + "pubdate": 1592996906, + "ctime": 1592996907, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/8a3c3e3d01a91776763d34bba79add698869c82d.jpg", + "duration": 381, + "stat": { + "view": 1184937 + }, + "bvid": "BV1ai4y1x7Uz", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 499696652, + "title": "『教程』VsCode五分钟上手教程 无一句废话", + "pubdate": 1601207369, + "ctime": 1601207369, + "state": 0, + "pic": "http://i1.hdslb.com/bfs/archive/cb78c07a090ed456bdcc217b0417670867772a29.jpg", + "duration": 329, + "stat": { + "view": 417610 + }, + "bvid": "BV1bK411P767", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 673071936, + "title": "『教程』补码怎么来的?", + "pubdate": 1620994814, + "ctime": 1620986531, + "state": 0, + "pic": "http://i1.hdslb.com/bfs/archive/12c02599321a0b1386b29ddc4653ff7df9bd54b4.jpg", + "duration": 445, + "stat": { + "view": 247578 + }, + "bvid": "BV16U4y1t7LD", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 462891077, + "title": "『教程』回调函数是个啥?", + "pubdate": 1631274885, + "ctime": 1631274885, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/df294350462558601f65b743ca25e2fdc01de628.jpg", + "duration": 452, + "stat": { + "view": 213895 + }, + "bvid": "BV1vL411t78b", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 98 + }, + { + "aid": 973903762, + "title": "『教程』堆栈是个啥?", + "pubdate": 1625227205, + "ctime": 1625227209, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/bf7956b6311ec0787fd52d1293bb4287d16b7e65.jpg", + "duration": 370, + "stat": { + "view": 535174 + }, + "bvid": "BV1P44y1q7uL", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 99 + }, + { + "aid": 61692380, + "title": "『教程』什么是递归?", + "pubdate": 1564660818, + "ctime": 1564637347, + "state": 0, + "pic": "http://i1.hdslb.com/bfs/archive/4af853671204b9bc631fada1934a3e86145a7d19.jpg", + "duration": 658, + "stat": { + "view": 487397 + }, + "bvid": "BV194411f71o", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 79 + }, + { + "aid": 336713491, + "title": "『教程』几分钟听懂迭代器", + "pubdate": 1636713476, + "ctime": 1636713476, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/6e255cce7c0303ab0211acd0f9d1ec5980ff03f7.jpg", + "duration": 453, + "stat": { + "view": 110688 + }, + "bvid": "BV18R4y1t7Hg", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 97 + }, + { + "aid": 372661682, + "title": "『教程』桌面精灵是怎样实现的?", + "pubdate": 1604916264, + "ctime": 1604916264, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/aaa8bb7b6fced63dd4792e28c1f78ba903fcc4cc.jpg", + "duration": 326, + "stat": { + "view": 168775 + }, + "bvid": "BV1aZ4y1V7aa", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 550840795, + "title": "『教程』什么是钩子技术?", + "pubdate": 1642744335, + "ctime": 1642744335, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/380b1ff9726c673411cf916b03268c7fb16aff68.jpg", + "duration": 240, + "stat": { + "view": 237568 + }, + "bvid": "BV1Cq4y1c7kK", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 51839931, + "title": "『教程』学编程前必知的8个电脑操作", + "pubdate": 1557313623, + "ctime": 1557313623, + "state": 0, + "pic": "http://i2.hdslb.com/bfs/archive/b54535ee3ff27006912d8013f2ea1667b2a50f80.jpg", + "duration": 641, + "stat": { + "view": 139385 + }, + "bvid": "BV1t4411v78E", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 718592873, + "title": "『教程』这些常见编程单词到底该怎么读?看你能否读对?对✔❌✅☑", + "pubdate": 1634300675, + "ctime": 1634265090, + "state": 0, + "pic": "http://i1.hdslb.com/bfs/archive/de43275f44aea9f6d79c13ee68c6dcdfc9e5fc5e.jpg", + "duration": 783, + "stat": { + "view": 81193 + }, + "bvid": "BV1JQ4y1D79p", + "ugc_pay": 0, + "interactive_video": true, + "enable_vt": 0, + "vt_display": "", + "playback_position": 100 + }, + { + "aid": 87838863, + "title": "『教程』什么是环境变量", + "pubdate": 1581258353, + "ctime": 1581258353, + "state": 0, + "pic": "http://i0.hdslb.com/bfs/archive/331b2304d8262c4252f338599846761d6a5a8e0c.jpg", + "duration": 353, + "stat": { + "view": 99797 + }, + "bvid": "BV1w741147G9", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + } + ] + } +} +``` + +
+ +## 根据关键词查找视频 + +> https://api.bilibili.com/x/series/recArchivesByKeywords + +*请求方式:GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| mid | num | 用户 mid | 必要 | | +| keywords | str | 关键词 | 必要 | 可为空, 即获取所有视频 | +| ps | num | 每页视频数 | 非必要 | 默认为 0, 留空为 20 | +| pn | num | 页码 | 非必要 | 留空为 1 | +| orderby | str | 排序方式 | 非必要 | 最新发布: pubdate(默认)
最多播放: views
senddate: 最新发布 | +| series_id | num | 系列 ID | 非必要 | 用于过滤结果, 即若某一视频包含在系列内则不返回该视频 | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| archives | arr | 视频列表 | | +| page | obj | 页码信息 | | + +`archives` 数组: + +同[获取视频合集信息](#获取视频合集信息)中的`archives`数组 + +`page` 对象: + +同[获取视频合集信息](#获取视频合集信息)中的`page`对象 + +**示例:** + +查询用户 `mid=2` 关键词为 `幕` 的视频, 不限制每页视频数 + +```shell +curl -G "https://api.bilibili.com/x/series/recArchivesByKeywords" \ +--data-urlencode "mid=2" \ +--data-urlencode "keywords=幕" \ +--data-urlencode "ps=0" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "archives": [ + { + "aid": 120040, + "title": "高级语言弹幕测试", + "pubdate": 1311616515, + "ctime": 1497344798, + "state": 0, + "pic": "http://i1.hdslb.com/bfs/archive/55a553659799d8a6fcb645d8f1f9df418ad6fe4e.jpg", + "duration": 911, + "stat": { + "view": 3584767 + }, + "bvid": "BV1Xx411c7cH", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 2, + "title": "字幕君交流场所", + "pubdate": 1252458549, + "ctime": 1497344798, + "state": 0, + "pic": "http://static.hdslb.com/images/transparent.gif", + "duration": 2055, + "stat": { + "view": 4609291 + }, + "bvid": "BV1xx411c7mD", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + }, + { + "aid": 271, + "title": "弹幕测试专用", + "pubdate": 1249886475, + "ctime": 1497344798, + "state": 0, + "pic": "http://i1.hdslb.com/bfs/archive/a5980672f3d03e8292148748a63de99cd45679d3.jpg", + "duration": 1213, + "stat": { + "view": 4857422 + }, + "bvid": "BV1xx411c7Xg", + "ugc_pay": 0, + "interactive_video": false, + "enable_vt": 0, + "vt_display": "", + "playback_position": 0 + } + ], + "page": { + "num": 1, + "size": 0, + "total": 3 + } + } +} +``` + +
+ +## 创建视频列表 + +> https://api.bilibili.com/x/series/series/createAndAddArchives + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ----| ---- | ------ | ---- | +| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | + +**正文参数 (multipart/form-data):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| mid | num | 用户 mid | 必要 | | +| name | str | 标题 | 必要 | | +| keywords | str | 关键词 | 不必要 | | +| description | str | 简介 | 不必要 | | +| aids | str | 视频 aid 列表 | 不必要 | 以 `,` 分隔, 如 `2,112861,112861976201494,976201494` | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ------------ | ---- | +| series_id | num | 视频列表 ID | | + +**示例:** + +为 `mid=616368979` 创建视频列表, 标题为 `NAME`, 视频为 `112861976201494` + +```shell +curl -X POST --url "https://api.bilibili.com/x/series/series/createAndAddArchives" \ +--url-query "csrf=xxxxxxxxxx" \ +--data-urlencode "mid=616368979" \ +--data-urlencode "name=NAME" \ +--data-urlencode "aids=112861976201494" \ +-b "SESSDATA=xxx" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "series_id": 4269765 + } +} +``` + +
+ +## 删除视频列表 + +> https://api.bilibili.com/x/series/series/delete + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ----| ---- | ------ | ---- | +| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | +| mid | num | 用户 mid | 必要 | | +| series_id | num | 视频列表 ID | 必要 | | +| aids | str | 空 | 不必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 空 | | + +**示例:** + +为 `mid=616368979` 删除视频列表 `series_id=4269765` + +```shell +curl -X POST --url "https://api.bilibili.com/x/series/series/delete" \ +--url-query "csrf=xxxxxxxxxx" \ +--url-query "series_id=4269765" \ +--url-query "mid=616368979" \ +-b "SESSDATA=xxx" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 删除视频列表中的稿件 + +> https://api.bilibili.com/x/series/series/delArchives + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ----| ---- | ------ | ---- | +| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| mid | num | 用户 mid | 必要 | | +| series_id | num | 视频列表 ID | 必要 | | +| aids | str | 视频 aid 列表 | 必要 | 以 `,` 分隔, 如 `2,112861,112861976201494,976201494` | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------- | +| code | num | 返回值 | 0: 成功 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 空 | | + +**示例:** + +为 `mid=616368979` 删除视频列表 `series_id=4269782` 中的 `112861976201494` + +```shell +curl -X POST --url "https://api.bilibili.com/x/series/series/delArchives" \ +--url-query "csrf=xxxxxxxxxx" \ +--data-urlencode "mid=616368979" \ +--data-urlencode "series_id=4269782" \ +--data-urlencode "aids=112861976201494" \ +-b "SESSDATA=xxx" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 添加稿件至视频列表 + +> https://api.bilibili.com/x/series/series/addArchives + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +同[删除视频列表中的稿件](#删除视频列表中的稿件) + +**正文参数 (application/x-www-form-urlencoded):** + +同[删除视频列表中的稿件](#删除视频列表中的稿件) + +**JSON回复:** + +同[删除视频列表中的稿件](#删除视频列表中的稿件) + +**示例:** + +为 `mid=616368979` 添加视频 `112861976201494` 至视频列表 `series_id=4269782` + +```shell +curl -X POST --url "https://api.bilibili.com/x/series/series/addArchives" \ +--url-query "csrf=xxxxxxxxxx" \ +--data-urlencode "mid=616368979" \ +--data-urlencode "series_id=4269782" \ +--data-urlencode "aids=112861976201494" \ +-b "SESSDATA=xxx" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
+ +## 编辑视频列表信息 + +> https://api.bilibili.com/x/series/series/update + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ----| ---- | ------ | ---- | +| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| mid | num | 用户 mid | 必要 | | +| series_id | num | 视频列表 ID | 必要 | | +| name | str | 标题 | 必要 | | +| keywords | str | 关键词 | 不必要 | | +| description | str | 简介 | 不必要 | | +| add_aids | str | 视频 aid 列表 | 不必要 | 以 `,` 分隔 | +| del_aids | str | 视频 aid 列表 | 不必要 | | +| aids | str | 空 | 不必要 | | + +**JSON回复:** + +同[删除视频列表中的稿件](#删除视频列表中的稿件) + +**示例:** + +为 `mid=616368979` 编辑视频列表 `series_id=4269782`, 设置标题为 `NAME`, 设置简介为空, 设置关键词 `Telnet`, 添加视频 `112861976201494` + +```shell +curl -X POST --url "https://api.bilibili.com/x/series/series/update" \ +--url-query "csrf=xxxxxxxxxx" \ +--data-urlencode "name=NAME" \ +--data-urlencode "mid=616368979" \ +--data-urlencode "series_id=4269782" \ +--data-urlencode "keywords=Telnet" \ +--data-urlencode "add_aids=112861976201494" \ +-b "SESSDATA=xxx" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": {} +} +``` + +
diff --git a/docs/video/info.md b/docs/video/info.md new file mode 100644 index 0000000..78f5943 --- /dev/null +++ b/docs/video/info.md @@ -0,0 +1,4564 @@ +# 视频基本信息 + + + +## 获取视频详细信息(web端) + +> https://api.bilibili.com/x/web-interface/wbi/view +> https://api.bilibili.com/x/web-interface/view + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +限制游客访问的视频需要登录 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|------|-----|--------|--------|---------------| +| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|------------------------------------------------------------------------------------| +| code | num | 返回值 | 0:成功
-400:请求错误
-403:权限不足
-404:无视频
62002:稿件不可见
62004:稿件审核中
62012:仅UP主自己可见 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------------- | ------- | ------------------------------ | ------------------------------------------------------------ | +| bvid | str | 稿件bvid | | +| aid | num | 稿件avid | | +| videos | num | 稿件分P总数 | 默认为1 | +| tid | num | 分区tid | 详情见[视频分区一览](video_zone.md) | +| tid_v2 | num | 分区tid (v2) | 详情见[视频分区一览 (v2)](video_zone_v2.md) | +| tname | str | 子分区名称 | | +| tname_v2 | str | 子分区名称 (v2) | | +| copyright | num | 视频类型 | 1:原创
2:转载 | +| pic | str | 稿件封面图片url | | +| title | str | 稿件标题 | | +| pubdate | num | 稿件发布时间 | 秒级时间戳 | +| ctime | num | 用户投稿时间 | 秒级时间戳 | +| desc | str | 视频简介 | | +| desc_v2 | array | 新版视频简介 | | +| state | num | 视频状态 | 详情见[属性数据文档](attribute_data.md#state字段值稿件状态) | +| ~~attribute~~(已经弃用) | ~~num~~ | ~~稿件属性位配置~~ | 详情见[属性数据文档](attribute_data.md#attribute字段值稿件属性位) | +| duration | num | 稿件总时长(所有分P) | 单位为秒 | +| forward | num | 撞车视频跳转avid | 仅撞车视频存在此字段 | +| mission_id | num | 稿件参与的活动id | | +| redirect_url | str | 重定向url | 仅番剧或影视视频存在此字段
用于番剧&影视的av/bv->ep | +| rights | obj | 视频属性标志 | | +| owner | obj | 视频UP主信息 | | +| stat | obj | 视频状态数 | | +| argue_info | obj | 争议/警告信息 | | +| dynamic | str | 视频同步发布的的动态的文字内容 | | +| cid | num | 视频1P cid | | +| dimension | obj | 视频1P分辨率 | | +| premiere | | null | | +| teenage_mode | num | | 用于青少年模式 | +| is_chargeable_season | bool | | | +| is_story | bool | 是否可以在 Story Mode 展示? | | +| is_upower_exclusive | bool | 是否为充电专属视频 | | +| is_upower_play | bool | | | +| is_upower_preview | bool | 充电专属视频是否支持试看 | | +| no_cache | bool | 是否不允许缓存? | | +| pages | array | 视频分P列表 | | +| subtitle | obj | 视频CC字幕信息 | | +| staff | array | 合作成员列表 | 非合作视频无此项 | +| is_season_display | bool | | | +| user_garb | obj | 用户装扮信息 | | +| honor_reply | obj | | | +| like_icon | str | 空串 | | +| need_jump_bv | bool | 需要跳转到BV号? | | +| disable_show_up_info | bool | 禁止展示UP主信息? | | +| is_story_play | bool | 是否为 Story Mode 视频? | | +| is_view_self | bool | 是否为自己投稿的视频? | | + +`data`中的`desc_v2`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|--------|-----| +| 0 | obj | 新版简介内容 | | + +`desc_v2`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|----------|-----|------|-----| +| raw_text | str | 简介内容 |type=1时显示原文
type=2时显示'@'+raw_text+' '并链接至biz_id的主页| +| type | num | 类型 |1:普通,2:@他人| +| biz_id | num |被@用户的mid|=0,当type=1| + +`data`中的`rights`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-----------------|-----|--------------|--------| +| bp | num | 是否允许承包 | | +| elec | num | 是否支持充电 | | +| download | num | 是否允许下载 | | +| movie | num | 是否电影 | | +| pay | num | 是否PGC付费 | | +| hd5 | num | 是否有高码率 | | +| no_reprint | num | 是否显示“禁止转载”标志 | | +| autoplay | num | 是否自动播放 | | +| ugc_pay | num | 是否UGC付费 | | +| is_cooperation | num | 是否为联合投稿 | | +| ugc_pay_preview | num | 0 | 作用尚不明确 | +| no_background | num | 0 | 作用尚不明确 | +| clean_mode | num | 0 | 作用尚不明确 | +| is_stein_gate | num | 是否为互动视频 | | +| is_360 | num | 是否为全景视频 | | +| no_share | num | 0 | 作用尚不明确 | +| arc_pay | num | 0 | 作用尚不明确 | +| free_watch | num | 0 | 作用尚不明确 | + +`data`中的`owner`对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|-----|--------|-----| +| mid | num | UP主mid | | +| name | str | UP主昵称 | | +| face | str | UP主头像 | | + +`data`中的`stat`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ------------ | ------- | +| aid | num | 稿件avid | | +| view | num | 播放数 | | +| danmaku | num | 弹幕数 | | +| reply | num | 评论数 | | +| favorite | num | 收藏数 | | +| coin | num | 投币数 | | +| share | num | 分享数 | | +| now_rank | num | 当前排名 | | +| his_rank | num | 历史最高排行 | | +| like | num | 获赞数 | | +| dislike | num | 点踩数 | 恒为`0` | +| evaluation | str | 视频评分 | | +| vt | int | 作用尚不明确 | 恒为`0` | + +`data`中的`argue_info`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ---- | ----------------- | ------------ | +| argue_link | str | | 作用尚不明确 | +| argue_msg | str | 警告/争议提示信息 | | +| argue_type | int | | 作用尚不明确 | + +`data`中的`pages`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|----------|---------| +| 0 | obj | 1P内容 | 无分P仅有此项 | +| n | obj | (n+1)P内容 | | +| …… | obj | …… | …… | + +`pages`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|-----------|-----|-----------|---------------------------------------------| +| cid | num | 分P cid | | +| page | num | 分P序号 | 从1开始 | +| from | str | 视频来源 | vupload:普通上传(B站)
hunan:芒果TV
qq:腾讯 | +| part | str | 分P标题 | | +| duration | num | 分P持续时间 | 单位为秒 | +| vid | str | 站外视频vid | 仅站外视频有效 | +| weblink | str | 站外视频跳转url | 仅站外视频有效 | +| dimension | obj | 当前分P分辨率 | 部分较老视频无分辨率值 | + +`pages`数组中的对象中的`dimension`对象(同`data`中的`dimension`对象): + +| 字段 | 类型 | 内容 | 备注 | +|--------|-----|---------|----------------| +| width | num | 当前分P 宽度 | | +| height | num | 当前分P 高度 | | +| rotate | num | 是否将宽高对换 | 0:正常
1:对换 | + +`subtitle`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------|-------|----------|-----| +| allow_submit | bool | 是否允许提交字幕 | | +| list | array | 字幕列表 | 未登录为空 | + +`subtitle`对象中的`list`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|---------|-----| +| 0 | obj | 字幕1 | | +| n | obj | 字幕(n+1) | | +| …… | obj | …… | …… | + +`list`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------|------|---------------|-----| +| id | num | 字幕id | | +| lan | str | 字幕语言 | | +| lan_doc | str | 字幕语言名称 | | +| is_lock | bool | 是否锁定 | | +| author_mid | num | 字幕上传者mid | | +| subtitle_url | str | json格式字幕文件url | | +| author | obj | 字幕上传者信息 | | + +`list`数组中的对象中的`author`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-----------------|-----|------------|--------| +| mid | num | 字幕上传者mid | | +| name | str | 字幕上传者昵称 | | +| sex | str | 字幕上传者性别 | 男 女 保密 | +| face | str | 字幕上传者头像url | | +| sign | str | 字幕上传者签名 | | +| rank | num | 10000 | 作用尚不明确 | +| birthday | num | 0 | 作用尚不明确 | +| is_fake_account | num | 0 | 作用尚不明确 | +| is_deleted | num | 0 | 作用尚不明确 | + +`staff`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|-----------|-----| +| 0 | obj | 合作成员1 | | +| n | obj | 合作成员(n+1) | | +| …… | obj | …… | …… | + +`staff`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|----------|-----|---------|-----| +| mid | num | 成员mid | | +| title | str | 成员名称 | | +| name | str | 成员昵称 | | +| face | str | 成员头像url | | +| vip | obj | 成员大会员状态 | | +| official | obj | 成员认证信息 | | +| follower | num | 成员粉丝数 | | +| label_style | num | | | + +`staff`数组中的对象中的`vip`对象: + +| 字段 | 类型 | 内容 | 备注 | +|------------|-----|--------|---------------------------| +| type | num | 成员会员类型 | 0:无
1:月会员
2:年会员 | +| status | num | 会员状态 | 0:无
1:有 | +| due_date | num | 到期时间 | UNIX 毫秒时间戳 | +| vip_pay_type | num | | | +| theme_type | num | 0 | | +| label | obj | | | + +`staff`数组中的对象中的`official`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------|-----|--------|---------------------------------------| +| role | num | 成员认证级别 | 见[用户认证类型一览](../user/official_role.md) | +| title | str | 成员认证名 | 无为空 | +| desc | str | 成员认证备注 | 无为空 | +| type | num | 成员认证类型 | -1:无
0:有 | + +`data`中的`user_garb`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------------|-----|-------|-----| +| url_image_ani_cut | str | 某url? | | + +`data`中的`honor_reply`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------|-------|-----|-----| +| honor | array | | | + +`honor`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|----------------------|-----|-------------------------------------|-----| +| aid | num | 当前稿件aid | | +| type | num | 1:入站必刷收录
2:第?期每周必看
3:全站排行榜最高第?名
4:热门 | | +| desc | num | 描述 | | +| weekly_recommend_num | num | | | + +**示例:** + +获取视频`av85440373`/`BV117411r7R1`的基本信息 + +avid方式: + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/view' \ +--data-urlencode 'aid=85440373' +``` + +bvid方式: + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/view' \ +--data-urlencode 'bvid=BV117411r7R1' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "bvid": "BV117411r7R1", + "aid": 85440373, + "videos": 1, + "tid": 28, + "tid_v2": 2061, + "tname": "原创音乐", + "tname_v2": "人力VOCALOID", + "copyright": 1, + "pic": "http://i1.hdslb.com/bfs/archive/ea0dd34bf41e23a68175680a00e3358cd249105f.jpg", + "title": "当我给拜年祭的快板加了电音配乐…", + "pubdate": 1580377255, + "ctime": 1580212263, + "desc": "【CB想说的】看完拜年祭之后最爱的一个节目!给有快板的部分简单加了一些不同风格的配乐hhh,感谢沃玛画的我!太可爱了哈哈哈哈哈哈哈!!!\n【Warma想说的】我画了打碟的CB,画风为了还原原版视频所以参考了四迹老师的画风,四迹老师的画真的太可爱啦!不过其实在画的过程中我遇到了一个问题,CB的耳机……到底是戴在哪个耳朵上呢?\n\n原版:av78977080\n编曲(配乐):Crazy Bucket\n人声(配音):Warma/谢拉\n曲绘:四迹/Warma\n动画:四迹/Crazy Bucket\n剧本:Mokurei-木灵君\n音频后期:DMYoung/纳兰寻风/Crazy Bucket\n包装:破晓天", + "desc_v2": [ + { + "raw_text": "【CB想说的】看完拜年祭之后最爱的一个节目!给有快板的部分简单加了一些不同风格的配乐hhh,感谢沃玛画的我!太可爱了哈哈哈哈哈哈哈!!!\n【Warma想说的】我画了打碟的CB,画风为了还原原版视频所以参考了四迹老师的画风,四迹老师的画真的太可爱啦!不过其实在画的过程中我遇到了一个问题,CB的耳机……到底是戴在哪个耳朵上呢?\n\n原版:av78977080\n编曲(配乐):Crazy Bucket\n人声(配音):Warma/谢拉\n曲绘:四迹/Warma\n动画:四迹/Crazy Bucket\n剧本:Mokurei-木灵君\n音频后期:DMYoung/纳兰寻风/Crazy Bucket\n包装:破晓天", + "type": 1, + "biz_id": 0 + } + ], + "state": 0, + "duration": 486, + "mission_id": 11838, + "rights": { + "bp": 0, + "elec": 0, + "download": 1, + "movie": 0, + "pay": 0, + "hd5": 1, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 1, + "ugc_pay_preview": 0, + "no_background": 0, + "clean_mode": 0, + "is_stein_gate": 0, + "is_360": 0, + "no_share": 0, + "arc_pay": 0, + "free_watch": 0 + }, + "owner": { + "mid": 66606350, + "name": "陈楒潼桶桶桶", + "face": "https://i2.hdslb.com/bfs/face/c9af3b32cf74baec5a4b65af8ca18ae5ff571f77.jpg" + }, + "stat": { + "aid": 85440373, + "view": 2404179, + "danmaku": 12348, + "reply": 2676, + "favorite": 58329, + "coin": 72793, + "share": 9620, + "now_rank": 0, + "his_rank": 55, + "like": 161270, + "dislike": 0, + "evaluation": "", + "vt": 0 + }, + "argue_info": { + "argue_msg": "", + "argue_type": 0, + "argue_link": "" + }, + "dynamic": "进来就出不去了!!!\n#全民音乐UP主##CB##warma##电音##快板##拜年祭##诸神的奥运##编曲##Remix#", + "cid": 146044693, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "premiere": null, + "teenage_mode": 0, + "is_chargeable_season": false, + "is_story": false, + "is_upower_exclusive": false, + "is_upower_play": false, + "is_upower_preview": false, + "enable_vt": 0, + "vt_display": "", + "is_upower_exclusive_with_qa": false, + "no_cache": false, + "pages": [ + { + "cid": 146044693, + "page": 1, + "from": "vupload", + "part": "建议改成:建议改成:诸 神 的 电 音 节(不是)", + "duration": 486, + "vid": "", + "weblink": "", + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "ctime": 1580212263 + } + ], + "subtitle": { + "allow_submit": false, + "list": [ + { + "id": 1061981378473779968, + "lan": "ai-zh", + "lan_doc": "中文(自动生成)", + "is_lock": false, + "subtitle_url": "", + "type": 1, + "id_str": "1061981378473779968", + "ai_type": 0, + "ai_status": 2, + "author": { + "mid": 0, + "name": "", + "sex": "", + "face": "", + "sign": "", + "rank": 0, + "birthday": 0, + "is_fake_account": 0, + "is_deleted": 0, + "in_reg_audit": 0, + "is_senior_member": 0, + "name_render": null + } + } + ] + }, + "staff": [ + { + "mid": 66606350, + "title": "UP主", + "name": "陈楒潼桶桶桶", + "face": "https://i2.hdslb.com/bfs/face/c9af3b32cf74baec5a4b65af8ca18ae5ff571f77.jpg", + "vip": { + "type": 2, + "status": 1, + "due_date": 1769443200000, + "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": "", + "use_img_label": true, + "img_label_uri_hans": "", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png" + }, + "avatar_subscript": 1, + "nickname_color": "#FB7299", + "role": 3, + "avatar_subscript_url": "", + "tv_vip_status": 0, + "tv_vip_pay_type": 0, + "tv_due_date": 0, + "avatar_icon": { + "icon_type": 1, + "icon_resource": {} + } + }, + "official": { + "role": 1, + "title": "bilibili 知名音乐UP主", + "desc": "", + "type": 0 + }, + "follower": 616428, + "label_style": 0 + }, + { + "mid": 53456, + "title": "曲绘", + "name": "Warma", + "face": "https://i2.hdslb.com/bfs/face/87c0b7e4d3eedf04c458a82b9271013beaa4bc59.jpg", + "vip": { + "type": 2, + "status": 1, + "due_date": 1770480000000, + "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": "", + "use_img_label": true, + "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/0DFy9BHgwE.gif", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d7e624d13d3e134251e4174a7318c19a8edbd71.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/uckjAv3Npy.png" + }, + "avatar_subscript": 1, + "nickname_color": "#FB7299", + "role": 3, + "avatar_subscript_url": "", + "tv_vip_status": 1, + "tv_vip_pay_type": 1, + "tv_due_date": 1753286400, + "avatar_icon": { + "icon_type": 1, + "icon_resource": {} + } + }, + "official": { + "role": 1, + "title": "bilibili 知名UP主", + "desc": "", + "type": 0 + }, + "follower": 4818052, + "label_style": 0 + } + ], + "is_season_display": false, + "user_garb": { + "url_image_ani_cut": "https://i0.hdslb.com/bfs/garb/item/e4c1c34e8b87fc05a893ed4a04ad322f75edbed9.bin" + }, + "honor_reply": { + "honor": [ + { + "aid": 85440373, + "type": 2, + "desc": "第45期每周必看", + "weekly_recommend_num": 45 + }, + { + "aid": 85440373, + "type": 3, + "desc": "全站排行榜最高第55名", + "weekly_recommend_num": 0 + }, + { + "aid": 85440373, + "type": 4, + "desc": "热门", + "weekly_recommend_num": 0 + }, + { + "aid": 85440373, + "type": 7, + "desc": "热门收录", + "weekly_recommend_num": 0 + } + ] + }, + "like_icon": "", + "need_jump_bv": false, + "disable_show_up_info": false, + "is_story_play": 1, + "is_view_self": false + } +} +``` + +
+ +视频标题为:`当我给拜年祭的快板加了电音配乐…` + +视频分区为:`tid=28(音乐->原创音乐)` + +视频时长:`486s` + +视频发布时间:`2020/1/30 17:40:55` + +视频投稿时间:`2020/1/28 19:51:3` + +视频分P为:`1` + +视频类型为:`1(原创)` + +视频UP主为:`66606350(Crazy_Bucket_陈楒潼)` + +视频简介为: + +`【CB想说的】看完拜年祭之后最爱的一个节目!给有快板的部分简单加了一些不同风格的配乐hhh,感谢沃玛画的我!太可爱了哈哈哈哈哈哈哈!!!\n【Warma想说的】我画了打碟的CB,画风为了还原原版视频所以参考了四迹老师的画风,四迹老师的画真的太可爱啦!不过其实在画的过程中我遇到了一个问题,CB的耳机……到底是戴在哪个耳朵上呢?\n\n原版:av78977080\n编曲(配乐):Crazy Bucket\n人声(配音):Warma/谢拉\n曲绘:四迹/Warma\n动画:四迹/Crazy Bucket\n剧本:Mokurei-木灵君\n音频后期:DMYoung/纳兰寻风/Crazy Bucket\n包装:破晓天` + +视频状态为:`0(开放浏览)` + +视频属性为: `显示“禁止转载“标志`、`高清`、`禁止其他人添加TAG`、`联合投稿视频` + +视频封面为: + +https://i1.hdslb.com/bfs/archive/ea0dd34bf41e23a68175680a00e3358cd249105f.jpg + + + +## 获取视频超详细信息(web端) + +> https://api.bilibili.com/x/web-interface/view/detail + +> https://api.bilibili.com/x/web-interface/wbi/view/detail + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +限制游客访问的视频需要登录 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| --------- | ---- | -------------------- | ---------- | ------------------ | +| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | +| need_elec | num | 是否获取UP主充电信息 | 非必要 | 0:否
1:是 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-400:请求错误
-403:权限不足
-404:无视频
62002:稿件不可见
62004:稿件审核中
62012:仅UP主自己可见 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ----- | ---------------- | ------------ | +| View | obj | 视频基本信息 | | +| Card | obj | 视频UP主信息 | | +| Tags | array | 视频TAG信息 | | +| Reply | obj | 视频热评信息 | | +| Related | array | 推荐视频信息 | | +| Spec | null | ? | 作用尚不明确 | +| hot_share | obj | ? | 作用尚不明确 | +| elec | 有效时:obj
无效时:null | 充电信息 | 当请求参数 `need_elec=1` 且有充电信息时有效 | +| recommend | null | ? | 作用尚不明确 | +| emergency | obj | 视频操作按钮信息 | | +| view_addit | obj | ? | 作用尚不明确 | +| guide | null | ? | 作用尚不明确 | +| query_tags | null | ? | 作用尚不明确 | +| participle | array | 分词信息 | 用于推荐 | +| module_ctrl | null | ? | 作用尚不明确 | +| replace_recommend | bool | ? | 作用尚不明确 | + +`data`中的`View`对象: + +基本同「[获取视频详细信息(web端)](#获取视频详细信息web端)」中的data对象 + +`data`中的`Card`对象: + +基本同「[用户名片信息](../user/info.md#用户名片信息)」中的data对象 + +`data`中的`Tags`数组: + +基本同「[获取视频TAG信息(新)](tags.md#获取视频TAG信息新)」中的data数组 + +`data`中的`Reply`对象: + +基本同「[获取评论区热评](../comment/list.md#获取评论区热评)」中的data对象 + +`data`中的`Related`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|-----------|-----| +| 0 | obj | 推荐视频1 | | +| n | obj | 推荐视频(n+1) | | +| …… | obj | …… | …… | + +`Related`数组中的对象: + +基本同「[获取视频详细信息(web端)](#获取视频详细信息web端)」中的data对象,已知部分字段有差异,如没有分P信息 + +`data`中的`hot_share`对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|-------|-------|--------| +| show | bool | false | 作用尚不明确 | +| list | array | 空 | 作用尚不明确 | + +`data`中的`elec`对象: + +基本同「[获取视频充电鸣谢名单](../electric/charge_list.md#获取视频充电鸣谢名单)」中的data对象 + +`data`中的`emergency`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ------------------ | -------- | +| no_like | bool | 是否不显示点赞按钮 | | +| no_coin | bool | 是否不显示投币按钮 | | +| no_fav | bool | 是否不显示收藏按钮 | | +| no_share | bool | 是否不显示分享按钮 | | + +`data`中的`view_addit`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------------- | ------------ | +| 63 | bool | 是否不显示直播推荐 | | +| 64 | bool | 是否不显示活动推荐 | | +| 69 | bool | ? | 作用尚不明确 | +| 71 | bool | 是否不显示标签与笔记 | | +| 72 | bool | ? | 作用尚不明确 | + +**示例:** + +获取视频`av170001`/`BV17x411w7KC`的详细信息 + +avid方式: + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/view/detail' \ +--data-urlencode 'aid=170001' \ +--data-urlencode 'need_elec=1' +``` + +bvid方式: + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/view/detail' \ +--data-urlencode 'bvid=BV17x411w7KC' \ +--data-urlencode 'need_elec=1' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "View": { + "bvid": "BV17x411w7KC", + "aid": 170001, + "videos": 10, + "tid": 193, + "tid_v2": 2017, + "tname": "MV", + "tname_v2": "MV", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/1ada8c32a9d168e4b2ee3e010f24789ba3353785.jpg", + "title": "【MV】保加利亚妖王AZIS视频合辑", + "pubdate": 1320850533, + "ctime": 1497380562, + "desc": "sina 保加利亚超级天王 Azis1999年出道。他的音乐融合保加利亚名族曲风chalga和pop、rap等元素,不过他惊艳的易装秀与浮夸的角色诠释才是他最为出名的地方 Azis与众多保加利亚天王天后级歌手都有过合作.06年,他作为Mariana Popova的伴唱,在欧洲半决赛上演唱了他们的参赛曲Let Me Cry 06年他被Velikite Balgari评为保加利亚有史以来最伟大的名人之一", + "desc_v2": [ + { + "raw_text": "sina 保加利亚超级天王 Azis1999年出道。他的音乐融合保加利亚名族曲风chalga和pop、rap等元素,不过他惊艳的易装秀与浮夸的角色诠释才是他最为出名的地方 Azis与众多保加利亚天王天后级歌手都有过合作.06年,他作为Mariana Popova的伴唱,在欧洲半决赛上演唱了他们的参赛曲Let Me Cry 06年他被Velikite Balgari评为保加利亚有史以来最伟大的名人之一", + "type": 1, + "biz_id": 0 + } + ], + "state": 0, + "duration": 2412, + "rights": { + "bp": 0, + "elec": 0, + "download": 1, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "clean_mode": 0, + "is_stein_gate": 0, + "is_360": 0, + "no_share": 0, + "arc_pay": 0, + "free_watch": 0 + }, + "owner": { + "mid": 122541, + "name": "冰封.虾子", + "face": "http://i0.hdslb.com/bfs/face/40c46ee74dd6ea33d46c38cd6083e6a1286aa482.gif" + }, + "stat": { + "aid": 170001, + "view": 45252521, + "danmaku": 914336, + "reply": 184686, + "favorite": 883733, + "coin": 291585, + "share": 12779204, + "now_rank": 0, + "his_rank": 13, + "like": 928358, + "dislike": 0, + "evaluation": "", + "vt": 0 + }, + "argue_info": { + "argue_msg": "", + "argue_type": 0, + "argue_link": "" + }, + "dynamic": "", + "cid": 279786, + "dimension": { + "width": 512, + "height": 288, + "rotate": 0 + }, + "premiere": null, + "teenage_mode": 0, + "is_chargeable_season": false, + "is_story": false, + "is_upower_exclusive": false, + "is_upower_play": false, + "is_upower_preview": false, + "enable_vt": 0, + "vt_display": "", + "is_upower_exclusive_with_qa": false, + "no_cache": false, + "pages": [ + { + "cid": 279786, + "page": 1, + "from": "vupload", + "part": "Хоп", + "duration": 199, + "vid": "", + "weblink": "", + "dimension": { + "width": 512, + "height": 288, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 275431, + "page": 2, + "from": "vupload", + "part": "Imash li surce", + "duration": 205, + "vid": "", + "weblink": "", + "dimension": { + "width": 640, + "height": 360, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 279787, + "page": 3, + "from": "vupload", + "part": "No Kazvam Ti Stiga", + "duration": 308, + "vid": "", + "weblink": "", + "dimension": { + "width": 432, + "height": 324, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 280467, + "page": 4, + "from": "vupload", + "part": "Samo za teb", + "duration": 273, + "vid": "", + "weblink": "", + "dimension": { + "width": 360, + "height": 288, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 280468, + "page": 5, + "from": "vupload", + "part": "Tochno sega", + "duration": 241, + "vid": "", + "weblink": "", + "dimension": { + "width": 584, + "height": 360, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 280469, + "page": 6, + "from": "vupload", + "part": "Kak boli", + "duration": 336, + "vid": "", + "weblink": "", + "dimension": { + "width": 384, + "height": 288, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 274491, + "page": 7, + "from": "vupload", + "part": "Obicham Te", + "duration": 250, + "vid": "", + "weblink": "", + "dimension": { + "width": 402, + "height": 208, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 267410, + "page": 8, + "from": "vupload", + "part": "Mrazish", + "duration": 201, + "vid": "", + "weblink": "", + "dimension": { + "width": 540, + "height": 360, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 267714, + "page": 9, + "from": "vupload", + "part": "Няма накъде", + "duration": 201, + "vid": "", + "weblink": "", + "dimension": { + "width": 450, + "height": 360, + "rotate": 0 + }, + "ctime": 1497380562 + }, + { + "cid": 270380, + "page": 10, + "from": "vupload", + "part": "Gadna poroda", + "duration": 198, + "vid": "", + "weblink": "", + "dimension": { + "width": 432, + "height": 324, + "rotate": 0 + }, + "ctime": 1497380562 + } + ], + "subtitle": { + "allow_submit": false, + "list": [] + }, + "is_season_display": false, + "user_garb": { + "url_image_ani_cut": "https://i0.hdslb.com/bfs/garb/item/e4c1c34e8b87fc05a893ed4a04ad322f75edbed9.bin" + }, + "honor_reply": { + "honor": [ + { + "aid": 170001, + "type": 3, + "desc": "全站排行榜最高第13名", + "weekly_recommend_num": 0 + } + ] + }, + "like_icon": "", + "need_jump_bv": false, + "disable_show_up_info": false, + "is_story_play": 0, + "is_view_self": false + }, + "Card": { + "card": { + "mid": "122541", + "name": "冰封.虾子", + "approve": false, + "sex": "保密", + "rank": "10000", + "face": "http://i0.hdslb.com/bfs/face/40c46ee74dd6ea33d46c38cd6083e6a1286aa482.gif", + "face_nft": 0, + "face_nft_type": 0, + "DisplayRank": "0", + "regtime": 0, + "spacesta": 0, + "birthday": "", + "place": "", + "description": "", + "article": 0, + "attentions": [], + "fans": 64052, + "friend": 45, + "attention": 45, + "sign": "路亚钓鱼爱好者交流群411267154", + "level_info": { + "current_level": 6, + "current_min": 0, + "current_exp": 0, + "next_exp": 0 + }, + "pendant": { + "pid": 0, + "name": "", + "image": "", + "expire": 0, + "image_enhance": "", + "image_enhance_frame": "", + "n_pid": 0 + }, + "nameplate": { + "nid": 9, + "name": "出道偶像", + "image": "https://i0.hdslb.com/bfs/face/3f2d64f048b39fb6c26f3db39df47e6080ec0f9c.png", + "image_small": "https://i0.hdslb.com/bfs/face/90c35d41d8a19b19474d6bac672394c17b444ce8.png", + "level": "高级勋章", + "condition": "所有自制视频总播放数>=50万" + }, + "Official": { + "role": 0, + "title": "", + "desc": "", + "type": -1 + }, + "official_verify": { + "type": -1, + "desc": "" + }, + "vip": { + "type": 1, + "status": 0, + "due_date": 1493827200000, + "vip_pay_type": 0, + "theme_type": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "", + "use_img_label": true, + "img_label_uri_hans": "", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" + }, + "avatar_subscript": 0, + "nickname_color": "", + "role": 0, + "avatar_subscript_url": "", + "tv_vip_status": 0, + "tv_vip_pay_type": 0, + "tv_due_date": 0, + "avatar_icon": { + "icon_resource": {} + }, + "vipType": 1, + "vipStatus": 0 + }, + "is_senior_member": 0, + "name_render": null + }, + "space": { + "s_img": "http://i1.hdslb.com/bfs/activity-plat/static/LRjqHhi0wL.png", + "l_img": "http://i1.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png" + }, + "following": false, + "archive_count": 382, + "article_count": 0, + "follower": 64052, + "like_num": 1048712 + }, + "Tags": [ + { + "tag_id": 0, + "tag_name": "发现《Hop》", + "music_id": "MA407124762800730394", + "tag_type": "bgm", + "jump_url": "https://music.bilibili.com/h5/music-detail?music_id=MA407124762800730394&cid=279786&aid=170001&na_close_hide=1" + }, + { + "tag_id": 117552, + "tag_name": "保加利亚妖王", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + }, + { + "tag_id": 112503, + "tag_name": "保加利亚", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + }, + { + "tag_id": 2958988, + "tag_name": "Азис", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + }, + { + "tag_id": 2622213, + "tag_name": "azis", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + }, + { + "tag_id": 2512079, + "tag_name": "mv", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + } + ], + "Reply": { + "page": null, + "replies": [ + { + "rpid": 1, + "oid": 0, + "type": 0, + "mid": 0, + "root": 0, + "parent": 0, + "dialog": 0, + "count": 0, + "rcount": 0, + "state": 0, + "fansgrade": 0, + "attr": 0, + "ctime": 0, + "like": 0, + "action": 0, + "content": null, + "replies": null, + "assist": 0, + "show_follow": false + } + ] + }, + "Related": [ + { + "aid": 1252180876, + "videos": 1, + "tid": 130, + "tname": "音乐综合", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/5a4eef19e38a3fa27f9db53cc45e7233e714ae03.jpg", + "title": "Ricardo Milos - Dancin song [1080p]", + "pubdate": 1711002767, + "ctime": 1711002768, + "desc": "https://www.youtube.com/watch?v=e9ASqhs9770", + "state": 0, + "duration": 259, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 477132, + "name": "TAKERA", + "face": "https://i0.hdslb.com/bfs/face/5af8b319889ba7a7d20ac59edb8464d65f43c1e1.gif" + }, + "stat": { + "aid": 1252180876, + "view": 1590321, + "danmaku": 2766, + "reply": 2405, + "favorite": 58654, + "coin": 13468, + "share": 15966, + "now_rank": 0, + "his_rank": 0, + "like": 144640, + "dislike": 0, + "vt": 0, + "vv": 1590321, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 1483741030, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1hJ4m177RN", + "first_frame": "http://i0.hdslb.com/bfs/storyff/n240327ad1t4c11o1bbzfc2bkvg5fkuc_firsti.jpg", + "pub_location": "中国香港", + "cover43": "", + "tidv2": 2036, + "tnamev2": "舞蹈综合", + "pid_v2": 1004, + "pid_name_v2": "舞蹈", + "bvid": "BV1hJ4m177RN", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 1252180876, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 80433022, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 1, + "pic": "http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg", + "title": "【官方 MV】Never Gonna Give You Up - Rick Astley", + "pubdate": 1577835803, + "ctime": 1577835803, + "desc": "-", + "state": 0, + "duration": 213, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 1, + "no_reprint": 0, + "autoplay": 0, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 1, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 486906719, + "name": "索尼音乐中国", + "face": "https://i2.hdslb.com/bfs/face/6bc95d0670863d36bf9167a37b825c39ce258506.jpg" + }, + "stat": { + "aid": 80433022, + "view": 91790223, + "danmaku": 128050, + "reply": 170137, + "favorite": 1286326, + "coin": 1061915, + "share": 396054, + "now_rank": 0, + "his_rank": 0, + "like": 2464595, + "dislike": 0, + "vt": 0, + "vv": 91790223, + "fav_g": 10, + "like_g": 0 + }, + "dynamic": "", + "cid": 137649199, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1GJ411x7h7", + "up_from_v2": 15, + "pub_location": "未知", + "cover43": "", + "tidv2": 2017, + "tnamev2": "MV", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1GJ411x7h7", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 80433022, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 718913090, + "videos": 1, + "tid": 27, + "tname": "综合", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/6567760d676268e2bf2e2c57486085a31427ed79.jpg", + "title": "【咩栗】镇 站 之 宝", + "pubdate": 1636448401, + "ctime": 1636448403, + "desc": "可以关注一下可爱的小羊和小狼呀~\n小羊主页:https://space.bilibili.com/745493\n小狼主页:https://space.bilibili.com/617459493\n⚡️☀️\n微博@电击咩阿栗\n微博@呜米嗷呜\n⚡️☀️\n网易云@咩栗\n网易云@呜米", + "state": 0, + "duration": 188, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 674421433, + "name": "呜米咩栗的草原日常", + "face": "https://i1.hdslb.com/bfs/face/5566e3a4786959527a72545f908b5664693a2945.jpg" + }, + "stat": { + "aid": 718913090, + "view": 315224, + "danmaku": 195, + "reply": 462, + "favorite": 2897, + "coin": 702, + "share": 202, + "now_rank": 0, + "his_rank": 0, + "like": 15615, + "dislike": 0, + "vt": 0, + "vv": 315224, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "咩栗,不可以。", + "cid": 436835160, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV14Q4y1S7HU", + "first_frame": "http://i0.hdslb.com/bfs/storyff/n211105a23d8ue6bh0m1ed1cu6yztac5_firsti.jpg", + "cover43": "", + "tidv2": 2047, + "tnamev2": "虚拟UP主", + "pid_v2": 1005, + "pid_name_v2": "二次元", + "bvid": "BV14Q4y1S7HU", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 718913090, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 895258574, + "videos": 2, + "tid": 130, + "tname": "音乐综合", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/b94b8be43cd0a9a12bf1a334541b017a3bd24cb6.jpg", + "title": "【全弹幕】av10388 武器A", + "pubdate": 1648906567, + "ctime": 1648906567, + "desc": "sm9307581\n武器A\n[日常]UP主:博丽·灵梦(UID:13308)\n播放:1605344 | 收藏:20926 | 弹幕:42522\n投稿时间:2010/06/20 10:13\n啊哈哈哈,啊哈哈,啊哈,啊……总之就是武器……", + "state": 0, + "duration": 144, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 104657830, + "name": "尚宜鼎MEMZ", + "face": "https://i1.hdslb.com/bfs/face/6761798442c6e9607c62803ac4fa5fe4a3e7b25b.jpg" + }, + "stat": { + "aid": 895258574, + "view": 3769820, + "danmaku": 22377, + "reply": 2776, + "favorite": 12271, + "coin": 484, + "share": 3748, + "now_rank": 0, + "his_rank": 0, + "like": 47622, + "dislike": 0, + "vt": 0, + "vv": 3769820, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 1491314436, + "dimension": { + "width": 2848, + "height": 1600, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1NP4y1K7Ze", + "first_frame": "http://i0.hdslb.com/bfs/storyff/n240402sa2muwqb7q7sbvedoskth1279_firsti.jpg", + "pub_location": "广东", + "cover43": "", + "tidv2": 2041, + "tnamev2": "动漫剪辑", + "pid_v2": 1005, + "pid_name_v2": "二次元", + "bvid": "BV1NP4y1K7Ze", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 895258574, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 56927206, + "videos": 1, + "tid": 138, + "tname": "搞笑", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/fd8324a72f0c6629f6d9b6af0daa11d950863993.jpg", + "title": "【每天一遍,网抑再见】万恶之源,抖就完事了", + "pubdate": 1561555314, + "ctime": 1561555314, + "desc": "【带字幕版】本人亲自翻译\nBGM:coincidance \n有些人看着看着就抖起来了,别说了,护士姐姐真漂亮\nhttps://www.youtube.com/watch?v=nBHkIWAJitg&feature=share\n肩膀好了,就来摇头吧\nav65659850", + "state": 0, + "duration": 139, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 34232005, + "name": "200斤的五条艾", + "face": "https://i1.hdslb.com/bfs/face/5135289ba858105ae466429ba9610e7980cf73f0.jpg" + }, + "stat": { + "aid": 56927206, + "view": 43534329, + "danmaku": 77687, + "reply": 19894, + "favorite": 1584517, + "coin": 721148, + "share": 563420, + "now_rank": 0, + "his_rank": 15, + "like": 2118557, + "dislike": 0, + "vt": 0, + "vv": 43534329, + "fav_g": 3, + "like_g": 0 + }, + "dynamic": "#沙雕##搞笑视频##魔性#", + "cid": 99428737, + "dimension": { + "width": 960, + "height": 720, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1Ax411d7jD", + "up_from_v2": 11, + "cover43": "", + "tidv2": 2059, + "tnamev2": "鬼畜调教", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1Ax411d7jD", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 56927206, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 3643130, + "videos": 1, + "tid": 138, + "tname": "搞笑", + "copyright": 2, + "pic": "http://i1.hdslb.com/bfs/archive/bc23ac6f17c82700d5c1941e0991bc8a6fcbd46c.png", + "title": "金坷垃原版", + "pubdate": 1453518942, + "ctime": 1497431869, + "desc": "http://v.youku.com/v_show/id_XNTkzMDUxNzI0.html?from=y1.2-1-102.3.1-1.1-1-1-0-0#paction 给知道金坷垃的孩子们补补课", + "state": 0, + "duration": 101, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 11374676, + "name": "LX秦先生", + "face": "https://i2.hdslb.com/bfs/face/90a808cdd9414d5f53e04d85b8929333eb61f474.jpg" + }, + "stat": { + "aid": 3643130, + "view": 11110768, + "danmaku": 29385, + "reply": 7168, + "favorite": 287656, + "coin": 61435, + "share": 190334, + "now_rank": 0, + "his_rank": 0, + "like": 379164, + "dislike": 0, + "vt": 0, + "vv": 11110768, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 5827830, + "dimension": { + "width": 640, + "height": 354, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1Rs411R7Hi", + "cover43": "", + "tidv2": 2059, + "tnamev2": "鬼畜调教", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1Rs411R7Hi", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 3643130, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 1601123876, + "videos": 1, + "tid": 130, + "tname": "音乐综合", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/bc7442c6c54ef573ebe0455104ad87703703fad5.jpg", + "title": "「保加利亚妖王」Hop - Azis 阿吉斯 百万级装备试听【Hi-Res】", + "pubdate": 1709023713, + "ctime": 1709023713, + "desc": "作词 : Azis\n作曲 : Azis\n\n\n\n音响:天朗皇家西敏寺\n功放:麦景图 \n录音MIC:纽曼149 \n录音设备:SSL+ Protools", + "state": 0, + "duration": 189, + "mission_id": 4009709, + "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, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 440121192, + "name": "JLRS日落fm", + "face": "https://i0.hdslb.com/bfs/face/008f2cf802f48e1d7f837887a3cefd95b918a0e5.jpg" + }, + "stat": { + "aid": 1601123876, + "view": 549485, + "danmaku": 1576, + "reply": 1569, + "favorite": 7872, + "coin": 5056, + "share": 4117, + "now_rank": 0, + "his_rank": 0, + "like": 22458, + "dislike": 0, + "vt": 0, + "vv": 549485, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "还记得这位妖王吗?", + "cid": 1452568619, + "dimension": { + "width": 3840, + "height": 2160, + "rotate": 0 + }, + "season_id": 4499678, + "short_link_v2": "https://b23.tv/BV1e1421f7rA", + "first_frame": "http://i2.hdslb.com/bfs/storyff/n240227sauzmn6l1y49t5cjnklc5tyvk_firsti.jpg", + "pub_location": "吉林", + "cover43": "", + "tidv2": 2024, + "tnamev2": "电台·歌单", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1e1421f7rA", + "season_type": 1, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 1601123876, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 1581914, + "videos": 1, + "tid": 130, + "tname": "音乐综合", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/7437f19df1061f4a9cd2972b81dbd3a6723bf74c.jpg", + "title": "妖王都开始男人了,怎么办!", + "pubdate": 1412259320, + "ctime": 1497428704, + "desc": "音悦台 保加利亚妖男Azis /Азис携手流行男歌手Giorgos Tsalikis/Тсаликис 最新单曲 Estar Loco /Полудяваме\n纯爷们,男人就该干男人,该干的事。", + "state": 0, + "duration": 227, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 4685783, + "name": "FoolishJoker", + "face": "https://i2.hdslb.com/bfs/face/a81786a76af0cbd6d7e35adc488ccc22b0030d72.jpg" + }, + "stat": { + "aid": 1581914, + "view": 2303678, + "danmaku": 5815, + "reply": 6856, + "favorite": 28958, + "coin": 5696, + "share": 14014, + "now_rank": 0, + "his_rank": 0, + "like": 24255, + "dislike": 0, + "vt": 0, + "vv": 2303678, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 2403522, + "dimension": { + "width": 640, + "height": 360, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1gx411P77L", + "up_from_v2": 8, + "cover43": "", + "tidv2": 2027, + "tnamev2": "音乐综合", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1gx411P77L", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 1581914, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 31130726, + "videos": 1, + "tid": 130, + "tname": "音乐综合", + "copyright": 2, + "pic": "http://i0.hdslb.com/bfs/archive/e9755c62c5a38ec352e424aa0d7d20417c1a3fde.jpg", + "title": "PPAP原版完整视频", + "pubdate": 1536122369, + "ctime": 1536122367, + "desc": "视频时长令强迫症不爽(我故意的)", + "state": 0, + "duration": 121, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 180305935, + "name": "不懂事的记忆", + "face": "https://i1.hdslb.com/bfs/face/7c1510f2fc8911cf885c9b14a94a99db738813c2.jpg" + }, + "stat": { + "aid": 31130726, + "view": 3810989, + "danmaku": 5269, + "reply": 2587, + "favorite": 76845, + "coin": 7721, + "share": 21117, + "now_rank": 0, + "his_rank": 0, + "like": 122042, + "dislike": 0, + "vt": 0, + "vv": 3810989, + "fav_g": 8, + "like_g": 0 + }, + "dynamic": "", + "cid": 54379754, + "dimension": { + "width": 640, + "height": 360, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1BW411Z7J3", + "up_from_v2": 8, + "cover43": "", + "tidv2": 2027, + "tnamev2": "音乐综合", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1BW411Z7J3", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 31130726, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 675490509, + "videos": 1, + "tid": 138, + "tname": "搞笑", + "copyright": 2, + "pic": "http://i1.hdslb.com/bfs/archive/58f8f3c8dfcf3b1ac6cf7a7b0eda660aa2e1e1fc.jpg", + "title": "奥地利美术生就业经历", + "pubdate": 1631273645, + "ctime": 1631272999, + "desc": "https://m.youtube.com/watch?v=h7s410TPnWg", + "state": 0, + "duration": 128, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 489656132, + "name": "古米廖夫", + "face": "https://i2.hdslb.com/bfs/face/633ed3ba1ec5bcde5db105849c2498b03f6b7eee.jpg" + }, + "stat": { + "aid": 675490509, + "view": 40823108, + "danmaku": 48676, + "reply": 12360, + "favorite": 952804, + "coin": 557605, + "share": 256173, + "now_rank": 0, + "his_rank": 0, + "like": 1531015, + "dislike": 0, + "vt": 0, + "vv": 40823108, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 405970117, + "dimension": { + "width": 1280, + "height": 720, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1jU4y1N7vg", + "up_from_v2": 35, + "first_frame": "http://i1.hdslb.com/bfs/storyff/n210910a2u7yjx97xzec435kyzziyn8s_firsti.jpg", + "pub_location": "黑龙江", + "cover43": "", + "tidv2": 2060, + "tnamev2": "鬼畜剧场", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1jU4y1N7vg", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 675490509, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 44501, + "videos": 1, + "tid": 26, + "tname": "音MAD", + "copyright": 2, + "pic": "http://i0.hdslb.com/bfs/archive/1dff881735a73cdc4757237e45eff03d42c81137.jpg", + "title": "久本雅美の頭がカービィのBGMに合わせて爆発したようです", + "pubdate": 1293118092, + "ctime": 1497366357, + "desc": "sm6999999 恭请四代御本尊様,45秒后大量召唤三色弹幕,顺带头像同步测试┗(^o^ )┓", + "state": 0, + "duration": 72, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 59948, + "name": "高興帝", + "face": "http://i2.hdslb.com/bfs/face/68a4fb8cf9442f0db277d58a9dbccbf02eacdad4.jpg" + }, + "stat": { + "aid": 44501, + "view": 2450853, + "danmaku": 16774, + "reply": 5627, + "favorite": 25342, + "coin": 3316, + "share": 3531, + "now_rank": 0, + "his_rank": 0, + "like": 47552, + "dislike": 0, + "vt": 0, + "vv": 2450853, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 74884, + "dimension": { + "width": 480, + "height": 360, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1Bx411c7NF", + "cover43": "", + "tidv2": 2062, + "tnamev2": "音MAD", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1Bx411c7NF", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 44501, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 1706416465, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/2365889cfca6e33566104487604138906a610c59.jpg", + "title": "【4K珍藏】诈骗神曲《Never Gonna Give You Up》!愿者上钩!", + "pubdate": 1723457882, + "ctime": 1723042776, + "desc": "《‌Never Gonna Give You Up》‌这首歌曲发行于1987年11月16日。‌这首歌曲由Rick Astley演唱,‌并收录于他的专辑《‌Whenever You Need Somebody》‌中。", + "state": 0, + "duration": 213, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 2043250564, + "name": "4K音乐馆", + "face": "https://i1.hdslb.com/bfs/face/4be964615e70e18ab469e4403cb0fa320f8d2fdc.jpg" + }, + "stat": { + "aid": 1706416465, + "view": 1001774, + "danmaku": 1150, + "reply": 1204, + "favorite": 20440, + "coin": 2354, + "share": 12072, + "now_rank": 0, + "his_rank": 0, + "like": 28749, + "dislike": 0, + "vt": 0, + "vv": 1001774, + "fav_g": 38, + "like_g": 0 + }, + "dynamic": "", + "cid": 1641702404, + "dimension": { + "width": 3840, + "height": 2160, + "rotate": 0 + }, + "season_id": 257515, + "short_link_v2": "https://b23.tv/BV1UT42167xb", + "first_frame": "http://i1.hdslb.com/bfs/storyff/n240807sa3h3ta5x4y8t48d3i1ld43yn_firsti.jpg", + "pub_location": "山东", + "cover43": "", + "tidv2": 2017, + "tnamev2": "MV", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1UT42167xb", + "season_type": 1, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 1706416465, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 70025529, + "videos": 1, + "tid": 130, + "tname": "音乐综合", + "copyright": 2, + "pic": "http://i0.hdslb.com/bfs/archive/49948624e5b18fda60ec255eeffe9fb86e2a73a0.jpg", + "title": "大悲咒(高品质珍藏版)", + "pubdate": 1570435422, + "ctime": 1570183927, + "desc": "净化心情,佛祖保佑,大吉大利!!!", + "state": 0, + "duration": 1792, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 1, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 362819520, + "name": "抹茶牛油果", + "face": "http://i0.hdslb.com/bfs/face/3b2571027baef2a954c2fc1b5473ed609ef00fb3.jpg" + }, + "stat": { + "aid": 70025529, + "view": 15194194, + "danmaku": 126652, + "reply": 36609, + "favorite": 447623, + "coin": 115299, + "share": 201225, + "now_rank": 0, + "his_rank": 0, + "like": 432430, + "dislike": 0, + "vt": 0, + "vv": 15194194, + "fav_g": 49, + "like_g": 0 + }, + "dynamic": "#大悲咒##高音质##循环#", + "cid": 121325699, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1XE411S7Ew", + "cover43": "", + "tidv2": 2192, + "tnamev2": "疗愈成长", + "pid_v2": 1028, + "pid_name_v2": "神秘学", + "bvid": "BV1XE411S7Ew", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 70025529, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 827984205, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 2, + "pic": "http://i1.hdslb.com/bfs/archive/ffacd250c10ca7cea1a665e89b691b3b7b837587.jpg", + "title": "燃!保加利亚妖王2023新歌MV!", + "pubdate": 1688208848, + "ctime": 1688208848, + "desc": "youtube\n保加利亚妖王azis新歌mv", + "state": 0, + "duration": 225, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 1295732260, + "name": "蒂尼黄DiniHuang", + "face": "https://i1.hdslb.com/bfs/face/71cc994f3b717fb64dec53cab8b825b471f3886a.jpg" + }, + "stat": { + "aid": 827984205, + "view": 168546, + "danmaku": 188, + "reply": 343, + "favorite": 851, + "coin": 79, + "share": 2315, + "now_rank": 0, + "his_rank": 0, + "like": 4373, + "dislike": 0, + "vt": 0, + "vv": 168546, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 1181623685, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV19g4y1A7xq", + "up_from_v2": 8, + "first_frame": "http://i0.hdslb.com/bfs/storyff/n230701qn3tfuifpjvvh0e2pctwqbkep_firsti.jpg", + "pub_location": "上海", + "cover43": "", + "tidv2": 2017, + "tnamev2": "MV", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV19g4y1A7xq", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 827984205, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 80573606, + "videos": 1, + "tid": 29, + "tname": "音乐现场", + "copyright": 2, + "pic": "http://i0.hdslb.com/bfs/archive/b0433e71df7f856cf1a45a926361661eca28b8fb.jpg", + "title": "满级大佬屠杀新手村", + "pubdate": 1577243562, + "ctime": 1577243562, + "desc": "YouTube\n\n*《She Taught Me How to Yodel》\n\n约德尔唱法(Yodeling)是瑞士阿尔卑斯山区的一种特殊唱法,采用真假声迅速切换的方式演唱。“约德尔”,在当地方言中是“树林歌唱”的意思,因此有时也将其翻译为“woods sing”。\n\n小女孩叫Sofia Shkidchenko,演唱于乌克兰达人秀,她有自己的油管频道可以去订阅哦~\n\n自己也没想到随手上传的个视频突然播放量这么多,不是专业的搬运博主,此视频留作纪念,但更新随缘啦。祝大家万事如意。", + "state": 0, + "duration": 126, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 247412150, + "name": "Ueroey", + "face": "https://i2.hdslb.com/bfs/face/f8cef132ebaeac9da8c73ad52f6c53b7d1f74637.jpg" + }, + "stat": { + "aid": 80573606, + "view": 62129265, + "danmaku": 106580, + "reply": 27081, + "favorite": 1259191, + "coin": 453054, + "share": 189609, + "now_rank": 0, + "his_rank": 7, + "like": 2766708, + "dislike": 0, + "vt": 0, + "vv": 62129265, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "#音乐#", + "cid": 137890032, + "dimension": { + "width": 638, + "height": 312, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1LJ411W7Bo", + "up_from_v2": 9, + "pub_location": "浙江", + "cover43": "", + "tidv2": 2018, + "tnamev2": "音乐现场", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1LJ411W7Bo", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 80573606, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 370010949, + "videos": 2, + "tid": 138, + "tname": "搞笑", + "copyright": 2, + "pic": "http://i1.hdslb.com/bfs/archive/8339e4a40c1a10cfb0e0abe0bc4ef6ecbd61a45f.jpg", + "title": "黑人抬棺原版视频", + "pubdate": 1585735296, + "ctime": 1585735296, + "desc": "up主关于本条视频收入的说明戳:BV1YK41157dT\n转载自https://www.youtube.com/watch?v=b3Y_9bTRGVg\n其他:抖棺(肩)舞:BV1kt4y127Ee\n苏卡棺裂:BV1GZ4y1x7mZ\n我是比划,感谢您的观看感谢点赞感谢一切!改天一定陪老铁好好比划比划!(咕)\n(建议大家戳一下宝藏2p)", + "state": 0, + "duration": 200, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 479724334, + "name": "比划大魔王", + "face": "http://i1.hdslb.com/bfs/face/910e60494f7deff1b3bdcf1eaaead6779d77bac5.jpg" + }, + "stat": { + "aid": 370010949, + "view": 65490009, + "danmaku": 454078, + "reply": 47875, + "favorite": 1008732, + "coin": 445010, + "share": 783444, + "now_rank": 0, + "his_rank": 2, + "like": 1912992, + "dislike": 0, + "vt": 0, + "vv": 65490009, + "fav_g": 24, + "like_g": 0 + }, + "dynamic": "", + "cid": 172423516, + "dimension": { + "width": 1280, + "height": 720, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1NZ4y1j7nw", + "cover43": "", + "tidv2": 2059, + "tnamev2": "鬼畜调教", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1NZ4y1j7nw", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 370010949, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 161596, + "videos": 1, + "tid": 21, + "tname": "日常", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/90bc3229e862994ac021a5f0894f232bc49b36bf.jpg", + "title": "据说80%的男生都听过这段音乐,有木有?", + "pubdate": 1319379031, + "ctime": 1497399731, + "desc": "据说男生都听过,为啥我没有呢? ", + "state": 0, + "duration": 0, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 211322, + "name": "卍解←死神", + "face": "https://i2.hdslb.com/bfs/face/2cb86d5f33a409732e4a0dcc7cda70bc8c199a7f.jpg" + }, + "stat": { + "aid": 161596, + "view": 576962, + "danmaku": 1042, + "reply": 1638, + "favorite": 6576, + "coin": 227, + "share": 931, + "now_rank": 0, + "his_rank": 612, + "like": 9845, + "dislike": 0, + "vt": 0, + "vv": 576962, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 266868, + "dimension": { + "width": 448, + "height": 336, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1Nx411w7tR", + "cover43": "", + "tidv2": 2027, + "tnamev2": "音乐综合", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1Nx411w7tR", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 161596, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 112699505707398, + "videos": 1, + "tid": 22, + "tname": "鬼畜调教", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/54c8218801e90a957e67541ea7d76e6d310614fe.jpg", + "title": "【范小勤】HOP", + "pubdate": 1719658405, + "ctime": 1719658405, + "desc": "", + "state": 0, + "duration": 200, + "mission_id": 1729431, + "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, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 40488241, + "name": "帅气的五岁少年", + "face": "https://i1.hdslb.com/bfs/face/0438443dd2bbb2fe1b46aa1d2134745f8d9f26c8.jpg" + }, + "stat": { + "aid": 112699505707398, + "view": 47395, + "danmaku": 176, + "reply": 125, + "favorite": 566, + "coin": 242, + "share": 1366, + "now_rank": 0, + "his_rank": 0, + "like": 1598, + "dislike": 0, + "vt": 0, + "vv": 47395, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 500001599795260, + "dimension": { + "width": 1440, + "height": 1080, + "rotate": 0 + }, + "season_id": 3617308, + "short_link_v2": "https://b23.tv/BV1J63veXEvH", + "first_frame": "http://i1.hdslb.com/bfs/storyff/n240629sabnqqnvswrfyh2h8capwsas5_firsti.jpg", + "pub_location": "上海", + "cover43": "", + "tidv2": 2059, + "tnamev2": "鬼畜调教", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1J63veXEvH", + "season_type": 1, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 112699505707398, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 345957866, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/2327de6051626e9f263e265805cbb1be3a05ad8d.jpg", + "title": "【越南神曲】-《Kẻ Cắp Gặp Bà Già 》!终于找到原版了!", + "pubdate": 1664102700, + "ctime": 1664027264, + "desc": "提到「越南电音」,大家可能会感到比较陌生,甚至摸不着头脑。 事实上,越南电音已经席卷国内短视频平台,没有人可以逃过它的轰炸。 音乐一开,无人不嗨~", + "state": 0, + "duration": 234, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 0, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 2043250564, + "name": "4K音乐馆", + "face": "https://i1.hdslb.com/bfs/face/4be964615e70e18ab469e4403cb0fa320f8d2fdc.jpg" + }, + "stat": { + "aid": 345957866, + "view": 8519264, + "danmaku": 3892, + "reply": 3755, + "favorite": 143914, + "coin": 9867, + "share": 8152, + "now_rank": 0, + "his_rank": 0, + "like": 136218, + "dislike": 0, + "vt": 0, + "vv": 8519264, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 842321779, + "dimension": { + "width": 3840, + "height": 2160, + "rotate": 0 + }, + "season_id": 725909, + "short_link_v2": "https://b23.tv/BV1Ud4y1M7C7", + "first_frame": "http://i1.hdslb.com/bfs/storyff/n220924qn371jsgk4te6781w32102ovo_firsti.jpg", + "pub_location": "山东", + "cover43": "", + "tidv2": 2017, + "tnamev2": "MV", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1Ud4y1M7C7", + "season_type": 1, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 345957866, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 456093155, + "videos": 1, + "tid": 59, + "tname": "演奏", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/9c160af2907ba2c161d565a99e61032ba72868ff.png", + "title": "太羞耻了!敢于琴行挑战演奏《Hop》!", + "pubdate": 1592883074, + "ctime": 1592883074, + "desc": "太羞耻了!敢于琴行挑战演奏《Hop》! Hop改编版", + "state": 0, + "duration": 168, + "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, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 13677047, + "name": "Piano莱特", + "face": "https://i2.hdslb.com/bfs/face/edf6a0ae7dfe9adb5e8d5e813a69455554931c73.jpg" + }, + "stat": { + "aid": 456093155, + "view": 1432473, + "danmaku": 3867, + "reply": 1839, + "favorite": 14907, + "coin": 7949, + "share": 5164, + "now_rank": 0, + "his_rank": 0, + "like": 75832, + "dislike": 0, + "vt": 0, + "vv": 1432473, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 204234033, + "dimension": { + "width": 3840, + "height": 2160, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1r5411W71r", + "cover43": "", + "tidv2": 2021, + "tnamev2": "演奏", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1r5411W71r", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 456093155, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 88379669, + "videos": 1, + "tid": 138, + "tname": "搞笑", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/44deb7e35de1c0d19fc79e6f838ad334585755f6.jpg", + "title": "当你怂恿网课老师放HOP", + "pubdate": 1581481509, + "ctime": 1581481509, + "desc": "我受不了了我要笑死了\n网课欢乐多", + "state": 0, + "duration": 131, + "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, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 8307655, + "name": "-Holog-", + "face": "https://i1.hdslb.com/bfs/face/797edf7cf269bdf89d1deb46b2b5068e65920b88.jpg" + }, + "stat": { + "aid": 88379669, + "view": 1553672, + "danmaku": 5349, + "reply": 1662, + "favorite": 7998, + "coin": 2519, + "share": 6023, + "now_rank": 0, + "his_rank": 0, + "like": 57979, + "dislike": 0, + "vt": 0, + "vv": 1553672, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "#保加利亚妖王##搞笑视频##HOP#\n把害怕打在公屏上_(:з」∠)_", + "cid": 150977310, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1D7411G76q", + "up_from_v2": 8, + "cover43": "", + "tidv2": 2207, + "tnamev2": "随拍·综合", + "pid_v2": 1032, + "pid_name_v2": "其他", + "bvid": "BV1D7411G76q", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 88379669, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 752882938, + "videos": 1, + "tid": 21, + "tname": "日常", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/f5a60b4edaef1b44faab4ffc47384843a7d47c56.jpg", + "title": "【av100000000】b站视频破亿了!第一亿个视频十小时循环(补档)", + "pubdate": 1588142976, + "ctime": 1588142976, + "desc": "【av100000000】b站视频破亿了!第一亿个视频十小时循环(补档)\nBV1y7411Q743/av100000000", + "state": 0, + "duration": 36000, + "mission_id": 13243, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 382043832, + "name": "輝夜姬想讓人告白", + "face": "https://i0.hdslb.com/bfs/face/647d2a40ac51b8e1379d6c46c64f5a8e28b269ab.jpg" + }, + "stat": { + "aid": 752882938, + "view": 161614, + "danmaku": 357, + "reply": 497, + "favorite": 1217, + "coin": 165, + "share": 166, + "now_rank": 0, + "his_rank": 0, + "like": 4623, + "dislike": 0, + "vt": 0, + "vv": 161614, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "#B站##BILIBILI##哔哩哔哩#", + "cid": 184673331, + "dimension": { + "width": 960, + "height": 600, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1Yk4y1r7g2", + "cover43": "", + "tidv2": 2207, + "tnamev2": "随拍·综合", + "pid_v2": 1032, + "pid_name_v2": "其他", + "bvid": "BV1Yk4y1r7g2", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 752882938, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 676186170, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 2, + "pic": "http://i1.hdslb.com/bfs/archive/24e8bd7eb31bbc142cd2676d28efa4c45c06bc33.jpg", + "title": "【4K60FPS】查理·普斯《See You Again》爆火神曲!珍惜身边的人!", + "pubdate": 1634983053, + "ctime": 1634983053, + "desc": "官方MV\n原盘提取制作,进行了部分调整\n中英文双语字幕制作,自己双语翻译\n《See You Again》是由美国说唱歌手维兹·卡利法与歌手查理·普斯合作演唱的一首歌曲\n这首歌,我想不用多说了,因为太多人点这首歌了\n希望大家珍惜身边的人", + "state": 0, + "duration": 229, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 0, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 229733301, + "name": "音乐私藏馆", + "face": "https://i0.hdslb.com/bfs/face/91a6526445f61e2d491523242b532d5e76f0435a.jpg" + }, + "stat": { + "aid": 676186170, + "view": 19331747, + "danmaku": 55418, + "reply": 19047, + "favorite": 459123, + "coin": 125647, + "share": 58270, + "now_rank": 0, + "his_rank": 30, + "like": 560583, + "dislike": 0, + "vt": 0, + "vv": 19331747, + "fav_g": 208, + "like_g": 0 + }, + "dynamic": "", + "cid": 429657756, + "dimension": { + "width": 3840, + "height": 2160, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1qU4y1F73A", + "first_frame": "http://i1.hdslb.com/bfs/storyff/n211023qn35uju26iwo4pw2enpricqvy_firsti.jpg", + "pub_location": "陕西", + "cover43": "", + "tidv2": 2017, + "tnamev2": "MV", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1qU4y1F73A", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 676186170, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 11841799, + "videos": 1, + "tid": 236, + "tname": "竞技体育", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/20b223c72345a544272f70014f3a9ce2e30b39c8.jpg", + "title": "【万恶之源】游泳教练原视频", + "pubdate": 1499056716, + "ctime": 1499056716, + "desc": "在网盘里翻出来的不知道有没有人上传过。不断地摸索和练习,你就学会了游泳\n其中重点不能上传,我试过一次了。", + "state": 0, + "duration": 231, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 25844288, + "name": "希爾薇", + "face": "https://i2.hdslb.com/bfs/face/67b49b90952cd64320432ae561e78e54ea3ecb53.jpg" + }, + "stat": { + "aid": 11841799, + "view": 693786, + "danmaku": 4253, + "reply": 1097, + "favorite": 20296, + "coin": 2820, + "share": 14821, + "now_rank": 0, + "his_rank": 0, + "like": 13990, + "dislike": 0, + "vt": 0, + "vv": 693786, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 19555184, + "dimension": { + "width": 352, + "height": 288, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1ox411B7jr", + "cover43": "", + "tidv2": 2063, + "tnamev2": "鬼畜综合", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1ox411B7jr", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 11841799, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 96842562, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 2, + "pic": "http://i0.hdslb.com/bfs/archive/5c33d3957fee3dac7376ab12b3e9a2b595600d84.jpg", + "title": "真正的冰雪女王", + "pubdate": 1584448702, + "ctime": 1584448702, + "desc": "转载https://weibo.com/tv/v/FlXRiE62K?fid=1034:217aa2b6ddb0f47e65468914c7d2c9af\n妖王的歌简直可以洗涤灵魂", + "state": 0, + "duration": 219, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 388982725, + "name": "萌萌四海为家", + "face": "https://i1.hdslb.com/bfs/face/f4ce35193db8743094a4efb4e00e97442244f2aa.jpg" + }, + "stat": { + "aid": 96842562, + "view": 39902, + "danmaku": 47, + "reply": 32, + "favorite": 372, + "coin": 39, + "share": 627, + "now_rank": 0, + "his_rank": 0, + "like": 507, + "dislike": 0, + "vt": 0, + "vv": 39902, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "#欧美MV##BGM##歌曲#", + "cid": 165335972, + "dimension": { + "width": 480, + "height": 360, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1V7411Z7HX", + "cover43": "", + "tidv2": 2017, + "tnamev2": "MV", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1V7411Z7HX", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 96842562, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 84204989, + "videos": 1, + "tid": 267, + "tname": "电台", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/c6533d1b6c9fcd3cd574a0117acaa4e5ddbe7fa4.jpg", + "title": "【B站入站曲】(全站最清晰音质)", + "pubdate": 1579462179, + "ctime": 1579462179, + "desc": "【B站音乐同名】本曲是本人使用Chrome+多种技术手段历时4个小时扒出的原曲,扒曲不易(如有异议请自行尝试即可知之),请多支持!", + "state": 0, + "duration": 131, + "mission_id": 12642, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 189708807, + "name": "Yc云灿", + "face": "https://i0.hdslb.com/bfs/face/c815a0c66ab6adbd208558a0fe25c59c6ee916fa.jpg" + }, + "stat": { + "aid": 84204989, + "view": 113298, + "danmaku": 2640, + "reply": 426, + "favorite": 6659, + "coin": 1578, + "share": 238, + "now_rank": 0, + "his_rank": 0, + "like": 8192, + "dislike": 0, + "vt": 0, + "vv": 113298, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "#2019##2019年度报告##年度报告#", + "cid": 144036516, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV157411v76Z", + "pub_location": "山西", + "cover43": "", + "tidv2": 2024, + "tnamev2": "电台·歌单", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV157411v76Z", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 84204989, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 45213203, + "videos": 1, + "tid": 138, + "tname": "搞笑", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/1c73c8c16fe733568c3b6a5332c85be3ddc41acd.jpg", + "title": "如果把极乐净土的背景音乐换成hop会怎么样", + "pubdate": 1551585358, + "ctime": 1551585358, + "desc": "-", + "state": 0, + "duration": 222, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 300015102, + "name": "砂糖血块", + "face": "https://i0.hdslb.com/bfs/face/77d73e4aa3fa669255be492596e02f1570f4fb5d.jpg" + }, + "stat": { + "aid": 45213203, + "view": 521576, + "danmaku": 4054, + "reply": 867, + "favorite": 12646, + "coin": 12832, + "share": 8799, + "now_rank": 0, + "his_rank": 0, + "like": 31530, + "dislike": 0, + "vt": 0, + "vv": 521576, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 79166580, + "dimension": { + "width": 1144, + "height": 640, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1bb411B7dn", + "cover43": "", + "tidv2": 2036, + "tnamev2": "舞蹈综合", + "pid_v2": 1004, + "pid_name_v2": "舞蹈", + "bvid": "BV1bb411B7dn", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 45213203, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 66372123, + "videos": 1, + "tid": 21, + "tname": "日常", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/a12315d2efc49f1862be996093c8076284719e43.jpg", + "title": "学校食堂公然放HOP,这到底是人性的泯灭,还是道德的伦桑?", + "pubdate": 1567398824, + "ctime": 1567398825, + "desc": "吃饭时的我惊呆了。。。", + "state": 0, + "duration": 61, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 298061175, + "name": "Dusk-氵夕", + "face": "https://i0.hdslb.com/bfs/face/803bf620ead9c25168935e31797b25d51f2cb614.jpg" + }, + "stat": { + "aid": 66372123, + "view": 270243, + "danmaku": 238, + "reply": 211, + "favorite": 1443, + "coin": 116, + "share": 427, + "now_rank": 0, + "his_rank": 0, + "like": 7846, + "dislike": 0, + "vt": 0, + "vv": 270243, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "#自制##奇葩##HOP#", + "cid": 115113475, + "dimension": { + "width": 1280, + "height": 720, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV174411177w", + "up_from_v2": 8, + "pub_location": "宁夏", + "cover43": "", + "tidv2": 2088, + "tnamev2": "社会观察", + "pid_v2": 1010, + "pid_name_v2": "知识", + "bvid": "BV174411177w", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 66372123, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 669351541, + "videos": 1, + "tid": 138, + "tname": "搞笑", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/fa08f65dc87fa6a26a99d0dc6fbc141adcef917b.jpg", + "title": "这TM才是东京热!!!", + "pubdate": 1597827562, + "ctime": 1597827562, + "desc": "祝大家长高3cm!", + "state": 0, + "duration": 73, + "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, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 641529005, + "name": "海胆君の日本留学日记", + "face": "https://i2.hdslb.com/bfs/face/75b3ddf5767533667d08c4475823fdf6ed7111d0.jpg" + }, + "stat": { + "aid": 669351541, + "view": 183005, + "danmaku": 78, + "reply": 54, + "favorite": 685, + "coin": 101, + "share": 225, + "now_rank": 0, + "his_rank": 0, + "like": 1310, + "dislike": 0, + "vt": 0, + "vv": 183005, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "#bilibili新星计划##搞笑##全程高能#", + "cid": 226269297, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1ea4y177Rj", + "pub_location": "辽宁", + "cover43": "", + "tidv2": 2002, + "tnamev2": "影视剪辑", + "pid_v2": 1001, + "pid_name_v2": "影视", + "bvid": "BV1ea4y177Rj", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 669351541, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 239236582, + "videos": 1, + "tid": 22, + "tname": "鬼畜调教", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/60e0c8b0bdb8781ae5213d06e35a80e416b624fd.jpg", + "title": "av10388闪版", + "pubdate": 1706161150, + "ctime": 1706160987, + "desc": "-", + "state": 0, + "duration": 72, + "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, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 352435610, + "name": "尼911a", + "face": "https://i2.hdslb.com/bfs/face/dca0c49ddabaae204209764e73a1eeddd4e94fa3.jpg" + }, + "stat": { + "aid": 239236582, + "view": 98736, + "danmaku": 149, + "reply": 201, + "favorite": 700, + "coin": 45, + "share": 379, + "now_rank": 0, + "his_rank": 0, + "like": 875, + "dislike": 0, + "vt": 0, + "vv": 98736, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 1418632218, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1he411Y7MB", + "up_from_v2": 11, + "first_frame": "http://i2.hdslb.com/bfs/storyff/n240125saqkgdlb6aio291t2cc5qola0_firsti.jpg", + "pub_location": "江苏", + "cover43": "", + "tidv2": 2207, + "tnamev2": "随拍·综合", + "pid_v2": 1032, + "pid_name_v2": "其他", + "bvid": "BV1he411Y7MB", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 239236582, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 294464399, + "videos": 1, + "tid": 21, + "tname": "日常", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/8327a7955381a3a7fc0606b08ad87dd74a948a4b.png", + "title": "B站的两个极限AV号被我找到了!", + "pubdate": 1638019819, + "ctime": 1638019819, + "desc": "-", + "state": 0, + "duration": 71, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 495847991, + "name": "Tedsan", + "face": "https://i2.hdslb.com/bfs/face/d3689b9a5f93d82deb1f8b6a081767a16b16e5ca.jpg" + }, + "stat": { + "aid": 294464399, + "view": 86852, + "danmaku": 25, + "reply": 280, + "favorite": 338, + "coin": 54, + "share": 61, + "now_rank": 0, + "his_rank": 0, + "like": 450, + "dislike": 0, + "vt": 0, + "vv": 86852, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 450235439, + "dimension": { + "width": 1440, + "height": 720, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1fF411b7Hm", + "up_from_v2": 19, + "first_frame": "http://i1.hdslb.com/bfs/storyff/n211127a23442em8g5nug2775mg3789m_firsti.jpg", + "pub_location": "四川", + "cover43": "", + "tidv2": 2207, + "tnamev2": "随拍·综合", + "pid_v2": 1032, + "pid_name_v2": "其他", + "bvid": "BV1fF411b7Hm", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 294464399, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 592220402, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/234b7c4a99412224007bf21a0e3902946dc45cd6.jpg", + "title": "【4K50帧】“我在东北玩泥巴”原曲 Daler Mehndi - Tunak Tunak Tun", + "pubdate": 1638883948, + "ctime": 1638883948, + "desc": "-", + "state": 0, + "duration": 257, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 0, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 472562429, + "name": "智英武54", + "face": "https://i2.hdslb.com/bfs/face/e7bb5b2f16863992562f10ce2a686035bf33a1b4.jpg" + }, + "stat": { + "aid": 592220402, + "view": 2711581, + "danmaku": 7298, + "reply": 1980, + "favorite": 58898, + "coin": 5115, + "share": 17577, + "now_rank": 0, + "his_rank": 0, + "like": 72931, + "dislike": 0, + "vt": 0, + "vv": 2711581, + "fav_g": 11, + "like_g": 0 + }, + "dynamic": "", + "cid": 456563995, + "dimension": { + "width": 2880, + "height": 2160, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1bq4y1q7Ho", + "up_from_v2": 8, + "first_frame": "http://i2.hdslb.com/bfs/storyff/n211207a24niqqktio4no1wmwd5tsget_firsti.jpg", + "pub_location": "江苏", + "cover43": "", + "tidv2": 2017, + "tnamev2": "MV", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1bq4y1q7Ho", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 592220402, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 441264199, + "videos": 1, + "tid": 26, + "tname": "音MAD", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/4e36449edad0021385e5477bbe427ca9243d549a.jpg", + "title": "五大哲学", + "pubdate": 1679426636, + "ctime": 1679426636, + "desc": "-", + "state": 0, + "duration": 13, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 613658683, + "name": "长瀞重度依赖", + "face": "https://i1.hdslb.com/bfs/face/c53f852b5ca574eed9be9877d7ce3f28a2e89385.jpg" + }, + "stat": { + "aid": 441264199, + "view": 671881, + "danmaku": 92, + "reply": 230, + "favorite": 2720, + "coin": 228, + "share": 1060, + "now_rank": 0, + "his_rank": 0, + "like": 9049, + "dislike": 0, + "vt": 0, + "vv": 671881, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 1064182352, + "dimension": { + "width": 720, + "height": 720, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1nL411r7mS", + "up_from_v2": 8, + "first_frame": "http://i2.hdslb.com/bfs/storyff/n230322qntglnzeqo4m1c23cnoyehccs_firsti.jpg", + "pub_location": "广西", + "cover43": "", + "tidv2": 2015, + "tnamev2": "娱乐综合", + "pid_v2": 1002, + "pid_name_v2": "娱乐", + "bvid": "BV1nL411r7mS", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 441264199, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 49016435, + "videos": 1, + "tid": 31, + "tname": "翻唱", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/9b7da84975469b7ddcd78717d06c092c4433ccf4.jpg", + "title": "【喵会长】妹子竟被逼着翻唱保加利亚妖王!⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄!", + "pubdate": 1555135227, + "ctime": 1554999201, + "desc": "这次视频改了N遍,剪的好累~希望大家能多多支持一下\n网易云音频链接:https://music.163.com/#/song?id=1358976277\n关注微博有惊喜!@隔壁班的喵会长", + "state": 0, + "duration": 200, + "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, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 21330948, + "name": "隔壁班的喵会长", + "face": "https://i0.hdslb.com/bfs/face/75a4a80496daacb478496f6a0aaf4d3ab357393d.jpg" + }, + "stat": { + "aid": 49016435, + "view": 1988312, + "danmaku": 8866, + "reply": 5413, + "favorite": 53008, + "coin": 136074, + "share": 13019, + "now_rank": 0, + "his_rank": 4, + "like": 268302, + "dislike": 0, + "vt": 0, + "vv": 1988312, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "那个曾经制霸b站的男银又肥来了!!!!", + "cid": 86290623, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1vb411M79s", + "pub_location": "山西", + "cover43": "", + "tidv2": 2061, + "tnamev2": "人力VOCALOID", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1vb411M79s", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 49016435, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 730704908, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 2, + "pic": "http://i1.hdslb.com/bfs/archive/2fd2b442a3f42ed0ba20c5204afdd92dbdfb9a68.jpg", + "title": "【越南神曲】-《Cứ Chill Thôi》!终于找到原版了!", + "pubdate": 1663586400, + "ctime": 1663574508, + "desc": "听完以后瞬间心情舒畅,太绝了!", + "state": 0, + "duration": 281, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 0, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 2043250564, + "name": "4K音乐馆", + "face": "https://i1.hdslb.com/bfs/face/4be964615e70e18ab469e4403cb0fa320f8d2fdc.jpg" + }, + "stat": { + "aid": 730704908, + "view": 4715077, + "danmaku": 3141, + "reply": 4132, + "favorite": 75716, + "coin": 9002, + "share": 7597, + "now_rank": 0, + "his_rank": 0, + "like": 79627, + "dislike": 0, + "vt": 0, + "vv": 4715077, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 837595821, + "dimension": { + "width": 3840, + "height": 2160, + "rotate": 0 + }, + "season_id": 725909, + "short_link_v2": "https://b23.tv/BV1GD4y1i7dA", + "first_frame": "http://i2.hdslb.com/bfs/storyff/n220919qn29hpyl52if2k1dthb32a0ji_firsti.jpg", + "pub_location": "山东", + "cover43": "", + "tidv2": 2017, + "tnamev2": "MV", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1GD4y1i7dA", + "season_type": 1, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 730704908, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 413754644, + "videos": 1, + "tid": 59, + "tname": "演奏", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/4769bc9c91af6fc8598d1b22d16033b540af33a8.jpg", + "title": "【东京热】TOKY HOT THEME SONG ( FULL VERSION)", + "pubdate": 1594208253, + "ctime": 1594208253, + "desc": "-", + "state": 0, + "duration": 157, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 476156735, + "name": "星际的小喵", + "face": "http://i2.hdslb.com/bfs/face/b6fcd4d4d23047432012576dda4239b5d0b5fa6e.jpg" + }, + "stat": { + "aid": 413754644, + "view": 476215, + "danmaku": 166, + "reply": 906, + "favorite": 6630, + "coin": 627, + "share": 3116, + "now_rank": 0, + "his_rank": 0, + "like": 6086, + "dislike": 0, + "vt": 0, + "vv": 476215, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "#日本##音乐##东京#", + "cid": 210245452, + "dimension": { + "width": 426, + "height": 240, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1pV41167y7", + "cover43": "", + "tidv2": 2027, + "tnamev2": "音乐综合", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1pV41167y7", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 413754644, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 468509831, + "videos": 1, + "tid": 193, + "tname": "MV", + "copyright": 2, + "pic": "http://i0.hdslb.com/bfs/archive/03971484b4c3931e89cbcf5862f8c10645e6aaec.jpg", + "title": "补裆 av3440 -", + "pubdate": 1651067890, + "ctime": 1651067890, + "desc": "新浪\nbiliplus,里面只有残缺的信息,发布时间应该是2010-2-27", + "state": 0, + "duration": 215, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 675115853, + "name": "゚゙゙゙゚゚゙゚゚", + "face": "https://i2.hdslb.com/bfs/face/8706d12c0df1f27aff5ae3c045b7da0133bd8c4a.png" + }, + "stat": { + "aid": 468509831, + "view": 280276, + "danmaku": 89, + "reply": 324, + "favorite": 4518, + "coin": 151, + "share": 209, + "now_rank": 0, + "his_rank": 0, + "like": 6403, + "dislike": 0, + "vt": 0, + "vv": 280276, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 586522933, + "dimension": { + "width": 320, + "height": 240, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1H541117sZ", + "up_from_v2": 8, + "first_frame": "http://i2.hdslb.com/bfs/storyff/n220427qn2g6emv26rnqxq247csj5kgn_firsti.jpg", + "cover43": "", + "tidv2": 2027, + "tnamev2": "音乐综合", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1H541117sZ", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 468509831, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 19390801, + "videos": 1, + "tid": 22, + "tname": "鬼畜调教", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/d52994a1876d07a975dc6683b78a898d9b581208.png", + "title": "【春晚鬼畜】赵本山:我就是念诗之王!【改革春风吹满地】", + "pubdate": 1518339644, + "ctime": 1518230987, + "desc": "小时候每次吃完年夜饭,都会急急忙忙跑回自己房间跟朋友玩彩虹岛,街头篮球,泡泡堂,极品飞车,CS。一旦听到外面大人们喊“哦!赵本山来咯!”,就马上暂停手上的游戏赶紧跑出去看。对我来说没有赵本山的春晚根本不是春晚。\n鬼畜本家:av18521530\n【举起手来】花姑娘又要吸旺仔牛奶!\nby @疯猴pme", + "state": 0, + "duration": 152, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 353246678, + "name": "UP-Sings", + "face": "http://i2.hdslb.com/bfs/face/224815f69567dfbdacffc64185b89568bf8da0f3.jpg" + }, + "stat": { + "aid": 19390801, + "view": 123739584, + "danmaku": 667864, + "reply": 325458, + "favorite": 3047850, + "coin": 4800461, + "share": 1494973, + "now_rank": 0, + "his_rank": 3, + "like": 5445710, + "dislike": 0, + "vt": 0, + "vv": 123739584, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "不管今年春晚有没有本山叔,鬼畜区总归是有的!", + "cid": 31621681, + "dimension": { + "width": 640, + "height": 360, + "rotate": 0 + }, + "season_id": 879555, + "short_link_v2": "https://b23.tv/BV1bW411n7fY", + "cover43": "", + "tidv2": 2059, + "tnamev2": "鬼畜调教", + "pid_v2": 1007, + "pid_name_v2": "鬼畜", + "bvid": "BV1bW411n7fY", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 19390801, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 305593327, + "videos": 1, + "tid": 255, + "tname": "颜值·网红舞", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/b4917bb0a9147f205e6af9d87d6d50b864a7a97f.jpg", + "title": "蝴蝶步2.0(◦˙▽˙◦)", + "pubdate": 1669474753, + "ctime": 1669474753, + "desc": "-", + "state": 0, + "duration": 15, + "mission_id": 1039224, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 43724742, + "name": "怎么这样的呐", + "face": "https://i0.hdslb.com/bfs/face/f9e9ae6025a9e02b134eec3dd84b87c3689216a3.jpg" + }, + "stat": { + "aid": 305593327, + "view": 13909975, + "danmaku": 1401, + "reply": 7111, + "favorite": 235000, + "coin": 83120, + "share": 24633, + "now_rank": 0, + "his_rank": 0, + "like": 383239, + "dislike": 0, + "vt": 0, + "vv": 13909975, + "fav_g": 14, + "like_g": 0 + }, + "dynamic": "双更一下~", + "cid": 904012490, + "dimension": { + "width": 1456, + "height": 2592, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1kP411u7jr", + "up_from_v2": 19, + "first_frame": "http://i2.hdslb.com/bfs/storyff/n221126qn2i92o9zf8m22h34kykxw0dl_firsti.jpg", + "pub_location": "浙江", + "cover43": "", + "tidv2": 2030, + "tnamev2": "颜值·网红舞", + "pid_v2": 1004, + "pid_name_v2": "舞蹈", + "bvid": "BV1kP411u7jr", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 305593327, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + }, + { + "aid": 114075187020133, + "videos": 1, + "tid": 256, + "tname": "短片", + "copyright": 1, + "pic": "http://i1.hdslb.com/bfs/archive/3d3aaf0ab2da5e41f4de7ed3e7995babbfd1168a.jpg", + "title": "中国人自己的保加利亚妖王", + "pubdate": 1740649401, + "ctime": 1740649401, + "desc": "-", + "state": 0, + "duration": 53, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0, + "arc_pay": 0, + "pay_free_watch": 0 + }, + "owner": { + "mid": 1247190580, + "name": "麦克瑟瑟大型纪录片", + "face": "https://i1.hdslb.com/bfs/face/98df710e5e76e7fe37c0d5fd8047b899b21943d5.jpg" + }, + "stat": { + "aid": 114075187020133, + "view": 9167, + "danmaku": 1, + "reply": 12, + "favorite": 24, + "coin": 2, + "share": 9, + "now_rank": 0, + "his_rank": 0, + "like": 166, + "dislike": 0, + "vt": 0, + "vv": 9167, + "fav_g": 0, + "like_g": 0 + }, + "dynamic": "", + "cid": 28602729880, + "dimension": { + "width": 1440, + "height": 1080, + "rotate": 0 + }, + "short_link_v2": "https://b23.tv/BV1Xg9cYYEDZ", + "up_from_v2": 19, + "first_frame": "http://i0.hdslb.com/bfs/storyff/n250227sao3m0apa1gc9g2yxt3vx2l53_firsti.jpg", + "pub_location": "河南", + "cover43": "", + "tidv2": 2026, + "tnamev2": "乐评盘点", + "pid_v2": 1003, + "pid_name_v2": "音乐", + "bvid": "BV1Xg9cYYEDZ", + "season_type": 0, + "is_ogv": false, + "ogv_info": null, + "rcmd_reason": "", + "enable_vt": 0, + "ai_rcmd": { + "id": 114075187020133, + "goto": "av", + "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", + "uniq_id": "" + } + } + ], + "Spec": null, + "hot_share": { + "show": false, + "list": [] + }, + "elec": null, + "emergency": { + "no_like": false, + "no_coin": false, + "no_fav": false, + "no_share": false + }, + "view_addit": { + "63": false, + "64": false, + "69": false, + "71": false, + "72": false + }, + "guide": null, + "query_tags": null, + "participle": [ + "保加利亚", + "azis", + "mv" + ], + "module_ctrl": null, + "replace_recommend": false + } +} +``` + +
+ +## 获取视频简介 + +> https://api.bilibili.com/x/web-interface/archive/desc + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|------|-----|--------|--------|---------------| +| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|--------------------------------------| +| code | num | 返回值 | 0:成功
-400:请求错误
62002:稿件不可见 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | str | 简介内容 | | + +**示例:** + +查看视频(教主的咕鸽)`av39330059`/`BV1Bt411z799`的简介 + +avid方式: + +```shell +curl -G 'https://api.bilibili.com/x/archive/desc' \ +--data-urlencode 'aid=39330059' +``` + +bvid方式: + +```shell +curl -G 'https://api.bilibili.com/x/archive/desc' \ +--data-urlencode 'bvid=BV1Bt411z799' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": "1.小朋友们大家好,我是你们爷爷最喜欢的超威一列姆!\r\n2.在过去的一年里,我创作了无数脍炙人口的歌曲,常常被人夸赞高产似雌豚。\r\n3.接下来的日子里我会一如既往地勤勉创作,争取继续保持现在的产量,文体两开花。\r\n4.我感觉照这个势头和速度下去别说日常更新不在话下,连出张新专辑都指日可待了啊。\r\n5.也感谢你们一如既往的支持和鼓励,我会注意身体,不把自己累垮掉的。\r\n6.我个人不建议你们在评论区里艾特任何UP主,我真的不建议,当然你们非要这么做我也没办法的。" +} +``` + +
+ +## 查询视频分P列表 (avid/bvid转cid) + +> https://api.bilibili.com/x/player/pagelist + +*请求方式:GET* + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|------|-----|--------|--------|---------------| +| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-------|------|-----------------------------------| +| code | num | 返回值 | 0:成功
-400:请求错误
-404:无视频 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | array | 分P列表 | | + +数组`data`: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|----------|---------| +| 0 | obj | 1P内容 | 无分P仅有此项 | +| n | obj | (n+1)P内容 | | +| …… | obj | …… | …… | + +数组`data`中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-----|-----------|---------------------------------------------| +| cid | num | 当前分P cid | | +| page | num | 当前分P | | +| from | str | 视频来源 | vupload:普通上传(B站)
hunan:芒果TV
qq:腾讯 | +| part | str | 当前分P标题 | | +| duration | num | 当前分P持续时间 | 单位为秒 | +| vid | str | 站外视频vid | | +| weblink | str | 站外视频跳转url | | +| dimension | obj | 当前分P分辨率 | 有部分视频无法获取分辨率 | +| first_frame | str | 分P封面 | | + +数组`data`中的对象中的`dimension`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------|-----|---------|----------------| +| width | num | 当前分P 宽度 | | +| height | num | 当前分P 高度 | | +| rotate | num | 是否将宽高对换 | 0:正常
1:对换 | + +**示例:** + +查询视频`av13502509`/`BV1ex411J7GE`的分P列表 + +avid方式: + +```shell +curl -G 'https://api.bilibili.com/x/player/pagelist' \ +--data-urlencode 'aid=13502509' +``` + +bvid方式: + +```shell +curl -G 'https://api.bilibili.com/x/player/pagelist' \ +--data-urlencode 'bvid=BV1ex411J7GE' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [{ + "cid": 66445301, + "page": 1, + "from": "vupload", + "part": "00. 宣传短片", + "duration": 33, + "vid": "", + "weblink": "", + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + } + }, { + "cid": 35039663, + "page": 2, + "from": "vupload", + "part": "01. 火柴人与动画师", + "duration": 133, + "vid": "", + "weblink": "", + "dimension": { + "width": 1484, + "height": 1080, + "rotate": 0 + } + }, { + "cid": 35039678, + "page": 3, + "from": "vupload", + "part": "02. 火柴人与动画师 II", + "duration": 210, + "vid": "", + "weblink": "", + "dimension": { + "width": 1484, + "height": 1080, + "rotate": 0 + } + }, { + "cid": 35039693, + "page": 4, + "from": "vupload", + "part": "03. 火柴人与动画师 III", + "duration": 503, + "vid": "", + "weblink": "", + "dimension": { + "width": 992, + "height": 720, + "rotate": 0 + } + }] +} +``` + +
diff --git a/video/interact_video.md b/docs/video/interact_video.md similarity index 98% rename from video/interact_video.md rename to docs/video/interact_video.md index 1d0a956..103bf2f 100644 --- a/video/interact_video.md +++ b/docs/video/interact_video.md @@ -2,15 +2,9 @@ 注:互动视频分P与普通视频分P不互通 ---- - -- [获取互动视频模块详细信息](#获取互动视频模块详细信息) - ---- - ## 获取互动视频模块详细信息 -> http://api.bilibili.com/x/stein/edgeinfo_v2 +> https://api.bilibili.com/x/stein/edgeinfo_v2 *请求方式:GET* @@ -196,7 +190,7 @@ avid方式: ```shell -curl -G 'http://api.bilibili.com/x/stein/edgeinfo_v2' \ +curl -G 'https://api.bilibili.com/x/stein/edgeinfo_v2' \ --data-urlencode 'aid=73267982' \ --data-urlencode 'graph_version=155446' \ --data-urlencode 'edge_id=5556092' \ @@ -206,7 +200,7 @@ curl -G 'http://api.bilibili.com/x/stein/edgeinfo_v2' \ bvid方式: ```shell -curl -G 'http://api.bilibili.com/x/stein/edgeinfo_v2' \ +curl -G 'https://api.bilibili.com/x/stein/edgeinfo_v2' \ --data-urlencode 'bvid=BV1UE411y7Wy' \ --data-urlencode 'graph_version=155446' \ --data-urlencode 'edge_id=5556092' \ diff --git a/video/online.md b/docs/video/online.md similarity index 91% rename from video/online.md rename to docs/video/online.md index 89b6e90..4b80f0e 100644 --- a/video/online.md +++ b/docs/video/online.md @@ -1,11 +1,8 @@ # 视频在线人数 -- [获取视频在线人数_web端](#获取视频在线人数_web端) -- [获取视频在线人数_APP端](#获取视频在线人数_APP端) - ## 获取视频在线人数_web端 -> http://api.bilibili.com/x/player/online/total +> https://api.bilibili.com/x/player/online/total *请求方式:GET* @@ -48,7 +45,7 @@ 查询视频`av759949922`/`BV1y64y1q757`中1P(`392402545`)的在线人数 ```shell -curl -G 'http://api.bilibili.com/x/player/online/total' \ +curl -G 'https://api.bilibili.com/x/player/online/total' \ --data-urlencode 'aid=759949922' \ --data-urlencode 'cid=392402545' ``` @@ -76,7 +73,7 @@ curl -G 'http://api.bilibili.com/x/player/online/total' \ ## 获取视频在线人数_APP端 -> http://app.bilibili.com/x/v2/view/video/online +> https://app.bilibili.com/x/v2/view/video/online *请求方式:GET* @@ -118,7 +115,7 @@ curl -G 'http://api.bilibili.com/x/player/online/total' \ 查询视频`av759949922`/`BV1y64y1q757`中1P(`392402545`)的在线人数 ```shell -curl -G 'http://app.bilibili.com/x/v2/view/video/online' \ +curl -G 'https://app.bilibili.com/x/v2/view/video/online' \ --data-urlencode 'aid=759949922' \ --data-urlencode 'appkey=1d8b6e7d45233436' \ --data-urlencode 'cid=392402545' \ diff --git a/video/pbp.md b/docs/video/pbp.md similarity index 93% rename from video/pbp.md rename to docs/video/pbp.md index b2cab6d..9ce5824 100644 --- a/video/pbp.md +++ b/docs/video/pbp.md @@ -4,15 +4,9 @@ 并用曲线顶点表示在进度条上,实现可视化 ---- - -- [获取弹幕趋势顶点列表](#获取弹幕趋势顶点列表) - ---- - ## 获取弹幕趋势顶点列表 -> http://bvc.bilivideo.com/pbp/data +> https://bvc.bilivideo.com/pbp/data *请求方式:GET* @@ -54,7 +48,7 @@ 获取视频`cid=3724723`的获取弹幕趋势顶点列表 ```shell -curl -G 'http://api.bilibili.com/pbp/data' \ +curl -G 'https://api.bilibili.com/pbp/data' \ --data-urlencode 'cid=3724723' ``` diff --git a/docs/video/player.md b/docs/video/player.md new file mode 100644 index 0000000..5b18cdf --- /dev/null +++ b/docs/video/player.md @@ -0,0 +1,509 @@ +# 播放器 + +## web 播放器信息 + +web 播放器的信息接口,提供正常播放需要的元数据,包括:智能防挡弹幕、字幕、章节看点等。 + +> https://api.bilibili.com/x/player/wbi/v2 +> https://api.bilibili.com/x/player/v2 + +*请求方式:GET* + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | --------- | ----------- | ----------------- | +| aid | num | 稿件 avid | 必要 (可选) | aid 与 bvid 任选 | +| bvid | str | 稿件 bvid | 必要 (可选) | aid 与 bvid 任选 | +| cid | num | 稿件 cid | 必要 | | +| season_id | num | 番剧 season_id | 不必要 | | +| ep_id | num | 剧集 ep_id | 不必要 | | +| w_rid | str | WBI 签名 | 不必要 | | +| wts | num | 当前 unix 时间戳 | 不必要 | | + +**JSON回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0: 成功
-400: 请求错误 | +| message | str | 错误信息 | 默认为 0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | -------- | ---- | +| aid | num | 视频 aid | | +| bvid | str | 视频 bvid | | +| allow_bp | bool | | | +| no_share | bool | 禁止分享? | | +| cid | num | 视频 cid | | +| dm_mask | obj | webmask 防挡字幕信息 | 若无则没有防挡功能 | +| subtitle | obj | 字幕信息 | 若无则没有字幕, 若不登陆则为空 | +| view_points | array | 分段章节信息 | | +| ip_info | obj | 请求 IP 信息 | | +| login_mid | num | 登录用户 mid | | +| login_mid_hash | str | | | +| is_owner | bool | 是否为该视频 UP 主 | | +| name | str | | | +| permission | num | | | +| level_info | obj | 登录用户等级信息 | | +| vip | obj | 登录用户 VIP 信息 | | +| answer_status | num | 答题状态 | | +| block_time | num | 封禁时间? | | +| role | str | | | +| last_play_time | num | 上次观看时间? | | +| last_play_cid | num | 上次观看 cid? | | +| now_time | num | 当前 UNIX 秒级时间戳 | | +| online_count | num | 在线人数 | | +| need_login_subtitle | bool | 是否必须登陆才能查看字幕 | 是的 | +| preview_toast | str | `为创作付费,购买观看完整视频\|购买观看` | | +| options | obj | | | +| guide_attention | any | | | +| jump_card | any | | | +| operation_card | any | | | +| online_switch | obj | | | +| fawkes | obj | 播放器相关信息? | | +| show_switch | obj | | | +| bgm_info | obj | 背景音乐信息 | | +| toast_block | bool | | | +| is_upower_exclusive | bool | 是否为充电专属视频 | | +| is_upower_play | bool | | | +| is_ugc_pay_preview | bool | | | +| elec_high_level | obj | 充电专属视频信息 | | +| disable_show_up_info | bool | | | + +`data` 对象中的 `options` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | --- | --- | +| is_360 | bool | 是否 360 全景视频 | | +| without_vip | bool | | | + +`data` 对象中的 `bgm_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| music_id | str | 音乐 id | | +| music_title | str | 音乐标题 | | +| jump_url | str | 跳转 URL | | + +`data` 对象中的 `dm_mask` 对象 (如果有): + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | -------- | ---- | +|cid | num | 视频 cid | | +|plat | num | 未知 | | +|fps | num | webmask 取样 fps | | +|time | num | 未知 | | +|mask_url | str | webmask 资源 url | | + +解析 webmask 请看 [智能防挡弹幕](../danmaku/webmask.md) + +`data` 对象中的 `subtitle` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | -------- | ---- | +|allow_submit|bool | true | | +| lan | str | "" | | +|lan_doc | str | "" | | +|subtitles| array | | 不登录为 `[]` | + +`subtitle` 对象中的 `subtitles` 数组内的元素: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | -------- | ---- | +| ai_status | num | | | +| ai_type | num | | | +| id | num | | | +|id_str | str| | 和 id 不一样 | +| is_lock | bool | | | +| lan | str | 语言类型英文字母缩写 || +| lan_doc | str| 语言类型中文名称 | | +|subtitle_url|str| 资源 url 地址 | | +|type| num | 0 | | + +`data`对象中的`view_point` 数组内的元素: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ----- | -------- | ---- | +| content | str | 分段章节名 | | +| from | num | 分段章节起始秒数 | | +| to | num | 分段章节结束秒数 | | +| type | num | | | +| imgUrl | str | 图片资源地址 | | +| logoUrl | str | "" | | +| team_type | str | | | +| team_name | str | | | + +`data`对象中的`elec_high_level`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ---- | ------------------------------ | ---------------- | +| privilege_type | num | 解锁视频所需最低定价档位的代码 | 见[充电档位代码与定价](../electric/monthly.md#充电档位代码privilege_type与定价) | +| title | str | 提示标题 | `该视频为「{充电档位名称}」专属视频` | +| sub_title | str | 提示子标题 | `开通「{充电档位定价}元档包月充电」即可观看` | +| show_button | bool | 是否显示按钮 | | +| button_text | str | 按钮文本 | `去开通` | +| jump_url | obj | 跳转url信息 | 详细信息有待补充 | +| intro | str | 充电介绍语 | | +| open | bool | (?) | | +| new | bool | (?) | | +| question_text | str | (?) | | +| qa_detail_link | str | (?) | | + +**示例:** + +未登录, `aid=1906473802` + +```shell +curl -G 'https://api.bilibili.com/x/player/wbi/v2' \ +--url-query 'bvid=BV1MU411S7iJ' \ +--url-query 'aid=1906473802' \ +--url-query 'cid=1625992822' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "aid": 1906473802, + "bvid": "BV1MU411S7iJ", + "allow_bp": false, + "no_share": false, + "cid": 1625992822, + "max_limit": 1000, + "page_no": 1, + "has_next": false, + "ip_info": { + "ip": "104.28.152.138", + "zone_ip": " 10.163.150.25", + "zone_id": 29409280, + "country": "美国", + "province": "加利福尼亚州", + "city": "东洛杉矶" + }, + "login_mid": 0, + "login_mid_hash": "", + "is_owner": false, + "name": "", + "permission": "0", + "level_info": { + "current_level": 0, + "current_min": 0, + "current_exp": 0, + "next_exp": 0, + "level_up": 0 + }, + "vip": { + "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": "", + "use_img_label": false, + "img_label_uri_hans": "", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "", + "img_label_uri_hant_static": "" + }, + "avatar_subscript": 0, + "nickname_color": "", + "role": 0, + "avatar_subscript_url": "", + "tv_vip_status": 0, + "tv_vip_pay_type": 0, + "tv_due_date": 0, + "avatar_icon": { + "icon_resource": {} + } + }, + "answer_status": 0, + "block_time": 0, + "role": "", + "last_play_time": 0, + "last_play_cid": 0, + "now_time": 1725002188, + "online_count": 1, + "need_login_subtitle": false, + "view_points": [], + "preview_toast": "为创作付费,购买观看完整视频|购买观看", + "options": { + "is_360": false, + "without_vip": false + }, + "guide_attention": [], + "jump_card": [], + "operation_card": [], + "online_switch": { + "enable_gray_dash_playback": "500", + "new_broadcast": "1", + "realtime_dm": "1", + "subtitle_submit_switch": "1" + }, + "fawkes": { + "config_version": 30787, + "ff_version": 21289 + }, + "show_switch": { + "long_progress": false + }, + "bgm_info": { + "music_id": "MA436038343856245020", + "music_title": "Unwelcome school", + "jump_url": "https://music.bilibili.com/h5/music-detail?music_id=MA436038343856245020&cid=1625992822&aid=1906473802" + }, + "toast_block": false, + "is_upower_exclusive": false, + "is_upower_play": false, + "is_ugc_pay_preview": false, + "elec_high_level": { + "privilege_type": 0, + "title": "", + "sub_title": "", + "show_button": false, + "button_text": "", + "jump_url": "", + "intro": "", + "new": false + }, + "disable_show_up_info": false + } +} +``` + +
+ +已登陆, `aid=60977932` + +```shell +curl -G 'https://api.bilibili.com/x/player/v2' \ +--url-query 'aid=60977932' \ +--url-query 'cid=106101299' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "aid": 60977932, + "bvid": "BV1Jt411P77c", + "allow_bp": false, + "no_share": false, + "cid": 106101299, + "max_limit": 1000, + "page_no": 1, + "has_next": true, + "ip_info": { + "ip": "108.181.22.55", + "zone_ip": " 172.27.132.5", + "zone_id": 29409296, + "country": "美国", + "province": "加利福尼亚州", + "city": "洛杉矶" + }, + "login_mid": 616368979, + "login_mid_hash": "445e7035", + "is_owner": false, + "name": "淡紫玲儿", + "permission": "10000,1001", + "level_info": { + "current_level": 3, + "current_min": 1500, + "current_exp": 2962, + "next_exp": 4500, + "level_up": -62135596800 + }, + "vip": { + "type": 1, + "status": 0, + "due_date": 1665417600000, + "vip_pay_type": 0, + "theme_type": 0, + "label": { + "path": "", + "text": "", + "label_theme": "", + "text_color": "", + "bg_style": 0, + "bg_color": "", + "border_color": "", + "use_img_label": true, + "img_label_uri_hans": "", + "img_label_uri_hant": "", + "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", + "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" + }, + "avatar_subscript": 0, + "nickname_color": "", + "role": 0, + "avatar_subscript_url": "", + "tv_vip_status": 0, + "tv_vip_pay_type": 0, + "tv_due_date": 0, + "avatar_icon": { + "icon_resource": {} + } + }, + "answer_status": 0, + "block_time": 0, + "role": "0", + "last_play_time": 0, + "last_play_cid": 0, + "now_time": 1725003260, + "online_count": 1, + "need_login_subtitle": false, + "subtitle": { + "allow_submit": true, + "lan": "zh-CN", + "lan_doc": "中文(中国)", + "subtitles": [ + { + "id": 13643112644608002, + "lan": "zh-Hans", + "lan_doc": "中文(简体)", + "is_lock": true, + "subtitle_url": "//aisubtitle.hdslb.com/bfs/subtitle/c49b18a284739d99df1e3723cdf72c0c82db98e0.json?auth_key=1725003260-5d0391a07f4f47f6960f60cf5045dff3-0-fc16c1f67a6b41edcb2a89d5e0c9bfdd", + "type": 0, + "id_str": "13643112644608002", + "ai_type": 0, + "ai_status": 0 + }, + { + "id": 13643200114196484, + "lan": "en-US", + "lan_doc": "英语(美国)", + "is_lock": true, + "subtitle_url": "//aisubtitle.hdslb.com/bfs/subtitle/2b38bc0f5d7671176964d4c3de441ed37568500c.json?auth_key=1725003260-5f709a74aa884751b77f86b6f6a48078-0-9b2fc3c18b99b1bf0cc7c7e63d18f686", + "type": 0, + "id_str": "13643200114196484", + "ai_type": 0, + "ai_status": 0 + } + ] + }, + "view_points": [], + "preview_toast": "为创作付费,购买观看完整视频|购买观看", + "options": { + "is_360": false, + "without_vip": false + }, + "guide_attention": [], + "jump_card": [], + "operation_card": [], + "online_switch": { + "enable_gray_dash_playback": "500", + "new_broadcast": "1", + "realtime_dm": "1", + "subtitle_submit_switch": "1" + }, + "fawkes": { + "config_version": 30787, + "ff_version": 21289 + }, + "show_switch": { + "long_progress": false + }, + "bgm_info": null, + "toast_block": false, + "is_upower_exclusive": false, + "is_upower_play": false, + "is_ugc_pay_preview": false, + "elec_high_level": { + "privilege_type": 0, + "title": "", + "sub_title": "", + "show_button": false, + "button_text": "", + "jump_url": "", + "intro": "", + "new": false + }, + "disable_show_up_info": false + } +} +``` + +
+ +## 播放反馈 + +> https://app.bilibili.com/x/resource/laser2 + +*请求方式: POST* + +注: 该接口不传 Cookie + +**URL参数:** + +|参数名|类型|内容|必要性|备注| +|-|-|-|-|-| +|mid|num|当前用户 mid|不必要|未登录为空| +|buvid|str|BUVID (APP) 或 buvid3 (Web)|必要|可为任意非空字符串| +|app_key|str|APP 密钥|必要|Web: web_player
可为任意非空字符串| +|url|str|日志 URL|非必要|从 [上传接口](../creativecenter/upload.md#上传接口) 得到的 upos 协议 URL| +|task_type|num|任务类型|非必要|300: 播放卡顿
301: 进度条君无法调戏
354: 校园网无法访问
303: 弹幕无法显示
553: 跳过首尾时间有误
304: 出现浮窗广告
305: 无限小电视
302: 音画不同步
306: 黑屏
307: 其他| + +**JSON回复:** + +|字段|类型|内容|备注| +|-|-|-|-| +|code|num|返回值|0: 成功
-400: 请求错误| +|message|str|错误信息|默认为 0| +|ttl|num|1|| +|data|obj|数据本体| | + +`data` 对象: + +|字段|类型|内容|备注| +|-|-|-|-| +|task_id|num|任务 ID?|| + +**示例:** + +播放反馈无限小电视, 不登录, 不传文件, buvid 为 `chenrui-in-icu` + +```shell +curl -X POST "https://app.bilibili.com/x/resource/laser2" \ +--data-urlencode "buvid=chenrui-in-icu" \ +--data-urlencode "app_key=web_player" \ +--data-urlencode "task_type=305" +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "task_id": 850448532 + } +} +``` + +
diff --git a/docs/video/recommend.md b/docs/video/recommend.md new file mode 100644 index 0000000..c7dea12 --- /dev/null +++ b/docs/video/recommend.md @@ -0,0 +1,1639 @@ +# 视频推荐 + +## 获取单视频推荐列表(web端) + +> https://api.bilibili.com/x/web-interface/archive/related + +*请求方式:GET* + +最多获取40条推荐视频 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------------ | ------------------ | +| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ------ | -------- | ---------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | array | 推荐列表 | | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | ---- | +| 0 | obj | 推荐视频1 | | +| n | obj | 推荐视频(n+1) | | +| …… | obj | …… | …… | +| 39 | obj | 推荐视频40 | | + +`data`数组中的对象: + +基本同「[获取视频详细信息(web端)](info.md#获取视频详细信息(web端))」中的data对象,已知没有分P信息 + +**示例:** + +查询视频`av7`/`BV1xx411c7m9`的推荐视频列表 + +avid方式: + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/archive/related' \ +--data-urlencode 'aid=7' +``` + +bvid方式: + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/archive/related' \ +--data-urlencode 'bvid=BV1xx411c7m9' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [{ + "aid": 21322566, + "videos": 1, + "tid": 124, + "tname": "趣味科普人文", + "copyright": 1, + "pic": "http://i2.hdslb.com/bfs/archive/37f383ac35d386af1fc578108ad643e5952ff66a.jpg", + "title": "bilibili上市宣传视频", + "pubdate": 1522205992, + "ctime": 1522205994, + "desc": "今天晚上9点30分(北京时间),bilibili将在美国纳斯达克(NASDAQ)证券交易所挂牌上市。", + "state": 0, + "attribute": 16768, + "duration": 155, + "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": 208259, + "name": "陈睿", + "face": "http://i2.hdslb.com/bfs/face/8920e6741fc2808cce5b81bc27abdbda291655d3.png" + }, + "stat": { + "aid": 21322566, + "view": 2129084, + "danmaku": 51108, + "reply": 18119, + "favorite": 46524, + "coin": 85223, + "share": 16669, + "now_rank": 0, + "his_rank": 1, + "like": 95621, + "dislike": 0 + }, + "dynamic": "今天晚上9点30分(北京时间),bilibili将在美国纳斯达克(NASDAQ)证券交易所挂牌上市。", + "cid": 35063529, + "dimension": { + "width": 1920, + "height": 1080, + "rotate": 0 + }, + "bvid": "" + }, { + "aid": 271, + "videos": 1, + "tid": 53, + "tname": "", + "copyright": 1, + "pic": "http://i1.hdslb.com/bfs/archive/a5980672f3d03e8292148748a63de99cd45679d3.jpg", + "title": "弹幕测试专用", + "pubdate": 1249886475, + "ctime": 1497344798, + "desc": "给职人发射弹幕定位用.", + "state": 0, + "attribute": 32768, + "duration": 4558, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0 + }, + "owner": { + "mid": 2, + "name": "碧诗", + "face": "http://i1.hdslb.com/bfs/face/3e60b20604b6fdc7d081eb6a1ec72aa47c5a3964.jpg" + }, + "stat": { + "aid": 271, + "view": 2532266, + "danmaku": 699214, + "reply": 10224, + "favorite": 34927, + "coin": 9712, + "share": 3586, + "now_rank": 0, + "his_rank": 182, + "like": 27257, + "dislike": 0 + }, + "dynamic": "", + "cid": 3659795, + "dimension": { + "width": 0, + "height": 0, + "rotate": 0 + }, + "bvid": "" + }, { + "aid": 106, + "videos": 1, + "tid": 26, + "tname": "音MAD", + "copyright": 2, + "pic": "http://i2.hdslb.com/bfs/archive/34d8fdf08d1fe28c229dec2fd122815a1d012908.jpg", + "title": "最终鬼畜蓝蓝路", + "pubdate": 1350316631, + "ctime": 1497348932, + "desc": "sm2057168 把这个音mad的图腾和支柱从UP的怒火中搬出来重新立好,这是我所能做的最后的事情了。", + "state": 0, + "attribute": 32768, + "duration": 318, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 0, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0 + }, + "owner": { + "mid": 8839, + "name": "TSA", + "face": "http://i0.hdslb.com/bfs/face/0ef5daf622bf4789034b3c15147a45e11c48c9b3.jpg" + }, + "stat": { + "aid": 106, + "view": 7607070, + "danmaku": 212896, + "reply": 41521, + "favorite": 200705, + "coin": 51673, + "share": 38049, + "now_rank": 0, + "his_rank": 22, + "like": 148550, + "dislike": 0 + }, + "dynamic": "", + "cid": 3635863, + "dimension": { + "width": 0, + "height": 0, + "rotate": 0 + }, + "bvid": "" + }, { + "aid": 50025934, + "videos": 1, + "tid": 122, + "tname": "野生技术协会", + "copyright": 1, + "pic": "http://i0.hdslb.com/bfs/archive/af534399612085dbd916381b3377b18c765fab2d.png", + "title": "B站又一位Lv9的up诞生了", + "pubdate": 1555829289, + "ctime": 1555829289, + "desc": "要不关注一下?", + "state": 0, + "attribute": 16512, + "duration": 45, + "rights": { + "bp": 0, + "elec": 0, + "download": 0, + "movie": 0, + "pay": 0, + "hd5": 0, + "no_reprint": 1, + "autoplay": 1, + "ugc_pay": 0, + "is_cooperation": 0, + "ugc_pay_preview": 0, + "no_background": 0 + }, + "owner": { + "mid": 174161216, + "name": "血色红茶Xenomprph", + "face": "http://i1.hdslb.com/bfs/face/5a5ececb9b7a688751024c60063ba5853bed7e1e.jpg" + }, + "stat": { + "aid": 50025934, + "view": 159595, + "danmaku": 62, + "reply": 153, + "favorite": 301, + "coin": 1059, + "share": 55, + "now_rank": 0, + "his_rank": 0, + "like": 1219, + "dislike": 0 + }, + "dynamic": "", + "cid": 87577929, + "dimension": { + "width": 2560, + "height": 1440, + "rotate": 0 + }, + "bvid": "" + }, + ………… + ] +} +``` + +
+ + +## 获取首页视频推荐列表(web端) + +> https://api.bilibili.com/x/web-interface/wbi/index/top/feed/rcmd + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +最多获取30条推荐视频,直播及推荐边栏 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|---------------|------|------------------------|--------|-------------------------------------------------------| +| fresh_type | num | 相关性 | 非必要 | 默认为 4
值越大推荐内容越相关 | +| ps | num | 单页返回的记录条数 | 非必要 | 默认为 12, 留空即最大值为 30 | +| fresh_idx | num | 当前翻页号 | 非必要 | 以 1 开始 | +| fresh_idx_1h | num | 当前翻页号(一小时前?) | 非必要 | 以 1 开始, 默认与 fresh_idx 内容相同 | +| brush | num | 刷子? | 非必要 | 以 1 开始, 默认与 fresh_idx 内容相同 | +| fetch_row | num | 本次抓取的最后一行行号 | 非必要 | 1 递归加上本次抓取总行数 | +| web_location | num | 网页位置 | 非必要 | 主页为 1430650 | +| y_num | num | 普通列数 | 非必要 | 一行中视频,直播及广告数 | +| last_y_num | num | 总列数 | 非必要 | 普通列数 + 边栏列数 | +| feed_version | str | V8 | 非必要 | 作用尚不明确 | +| homepage_ver | num | 1 | 非必要 | 首页版本 | +| screen | str | 浏览器视口大小 | 非必要 | 水平在前垂直在后以减号分割 | +| seo_info | str | 空 | 非必要 | 作用尚不明确 | +| last_showlist | str | 上次抓取的视频av号列表 | 非必要 | av与数字间用下划线分隔, 若视频UP主已关注则中间再插入n | +| uniq_id | str | ??? | 非必要 | 作用尚不明确 | +| w_rid | str | WBI 签名 | 非必要 | 见[WBI 签名](../misc/sign/wbi.md) | +| wts | num | UNIX 时间戳 | 非必要 | 见[WBI 签名](../misc/sign/wbi.md) | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|------|----------|------------------------------| +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------------------|-------|-----------|--------------------------------| +| business_card | null | | | +| floor_info | null | | | +| item | array | 推荐列表 | | +| mid | num | 用户mid | 未登录为0 | +| preload_expose_pct | num | 0.5 | 用于预加载? | +| preload_floor_expose_pct | num | 0.5 | 用于预加载? | +| side_bar_column | array | 边栏列表? | 可参考字段 item 及对应功能文档 | +| user_feature | null | | | + +`data`对象中`item`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------------------|------|--------------------|-------------------------------------------| +| av_feature | null | | | +| business_info | obj | 商业推广信息 | 无为null
对于推广内容,视频信息会在这个dict的"archive"属性下 | +| bvid | str | 视频bvid | | +| cid | num | 稿件cid | | +| dislike_switch | num | 1 | 显示不感兴趣开关? | +| dislike_switch_pc | num | 0 | 显示不感兴趣开关(PC)? | +| duraion | num | 视频时长 | | +| enable_vt | num | 0 | 作用尚不明确 | +| goto | num | 目标类型 | av: 视频
ogv: 边栏
live: 直播 | +| duraion | num | 视频时长 | | +| id | num | 视频aid / 直播间id | | +| is_followed | num | 已关注 | 0: 未关注
1: 已关注 | +| is_stock | num | 0 | 作用尚不明确 | +| ogv_info | null | | | +| owner | obj | UP主 | | +| pic | str | 封面 | | +| pic_4_3 | str | 封面(4:3) | | +| pos | num | 0 | 位置? | +| pubdate | num | 发布时间 | | +| rcmd_reason | obj | 推荐理由 | 直播等为null | +| room_info | obj | 直播间信息 | 普通视频等为null, 参见[直播](../live) | +| show_info | num | 展示信息 | 1: 普通视频
0: 直播 | +| stat | obj | 视频状态信息 | 直播等为null, 参见[视频基本信息](info.md) | +| title | str | 标题 | | +| track_id | str | 跟踪标识? | | +| uri | str | 目标页 URI | | +| vt_display | str | 空 | 作用尚不明确 | + +`item`数组中的对象中的`owner`对象: + +| 字段 | 类型 | 内容 | 备注 | +|------|------|---------|-------| +| face | str | 头像URL | | +| mid | num | UP主mid | | +| name | str | UP昵称 | | + +`item`数组中的对象中的`rcmd_reason`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|------|---------|--------------------------------------| +| reason_type | num | 原因类型 | 0: 无
1: 已关注
3: 高点赞量 | +| content | str | 原因描述 | 当 reason_type 为 3 时存在 | + +**示例:** + +获取新版web端首页推荐视频列表 + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/wbi/index/top/feed/rcmd' \ +--data-urlencode 'fresh_type=4' \ +--data-urlencode 'ps=12' \ +--data-urlencode 'fresh_idx=5' \ +--data-urlencode 'fresh_idx_1h=5' \ +--data-urlencode 'fetch_row=16' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "item": [ + { + "id": 1354614895, + "bvid": "BV1Dz42117GZ", + "cid": 1548835687, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1Dz42117GZ", + "pic": "http://i1.hdslb.com/bfs/archive/b47154987b4c0f40a39779c09a9d485176d1238f.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/archive/b47154987b4c0f40a39779c09a9d485176d1238f.jpg", + "title": "做数学题总是抄错 | 看错 | 算错 怎么破?决定高考分数的这个非智力因素不容忽视", + "duration": 882, + "pubdate": 1715946937, + "owner": { + "mid": 374484802, + "name": "数学阮禾老师", + "face": "https://i1.hdslb.com/bfs/face/4df57e4b48b04206bce7572831688741580ca0e1.jpg" + }, + "stat": { + "view": 48250, + "like": 2959, + "danmaku": 433, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1255924089, + "bvid": "BV1DJ4m1u7Mp", + "cid": 1600833978, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1DJ4m1u7Mp", + "pic": "http://i0.hdslb.com/bfs/archive/5068d860e8bbc37679ece933aa8e6d8428cfb5c1.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-07-01-1145021255924089_1612_gener.jpg", + "title": "人类这种生物,看到按钮就会按下去。", + "duration": 326, + "pubdate": 1719805500, + "owner": { + "mid": 5616993, + "name": "马夫鱼33", + "face": "https://i0.hdslb.com/bfs/face/4c2af23046147e91ce5a4af3375464fdcf1956e6.jpg" + }, + "stat": { + "view": 667067, + "like": 28529, + "danmaku": 483, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "content": "2万点赞", + "reason_type": 3 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1306020278, + "bvid": "BV1rM4m117Ry", + "cid": 1608959606, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1rM4m117Ry", + "pic": "http://i0.hdslb.com/bfs/archive/49f62c70f17d0afe00e5e620dd366c68149c780e.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/archive/49f62c70f17d0afe00e5e620dd366c68149c780e.jpg", + "title": "Axios 前后端对接教程|HTTP", + "duration": 352, + "pubdate": 1720440325, + "owner": { + "mid": 260736087, + "name": "三分钟实验室", + "face": "https://i0.hdslb.com/bfs/face/6172aa089ed0b26ffffb72018422eb4280d4da41.jpg" + }, + "stat": { + "view": 7527, + "like": 365, + "danmaku": 1, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1755972439, + "bvid": "BV1g4421D7qn", + "cid": 1597039275, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1g4421D7qn", + "pic": "http://i2.hdslb.com/bfs/archive/35ee2ffaab4206d17893a3f48cdf512b4f028fdc.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-26-21354756381755972439_16_12_5326_crop.jpg", + "title": "《我爱发明》里那些抽象发明 歹徒兴奋床!", + "duration": 659, + "pubdate": 1719408945, + "owner": { + "mid": 348989367, + "name": "沫子瞪片", + "face": "https://i0.hdslb.com/bfs/face/a2131d38a2ea73f16ff25e61dbeb40377233f552.jpg" + }, + "stat": { + "view": 1540767, + "like": 65409, + "danmaku": 5383, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1055953358, + "bvid": "BV1jH4y1w7A6", + "cid": 1598484848, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1jH4y1w7A6", + "pic": "http://i1.hdslb.com/bfs/archive/accdb655b4f2bef665e6fdedb4de28de2feda078.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-28-12560692491055953358_16_12_2438_crop.jpg", + "title": "为什么一个数的5次方个位数是自己!", + "duration": 327, + "pubdate": 1719550565, + "owner": { + "mid": 483522694, + "name": "火星课堂", + "face": "https://i1.hdslb.com/bfs/face/fe751f0d7062c8e8adcef501390d48330fac0514.jpg" + }, + "stat": { + "view": 244673, + "like": 5406, + "danmaku": 210, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": { + "id": 0, + "contract_id": "", + "res_id": 1055953358, + "asg_id": 0, + "pos_num": 0, + "name": "", + "pic": "", + "litpic": "", + "url": "", + "style": 0, + "agency": "", + "label": "", + "intro": "", + "creative_type": 0, + "request_id": "1721098961752q172a25a216a162q1363", + "src_id": 5637, + "area": 0, + "is_ad_loc": true, + "ad_cb": "", + "title": "", + "server_type": 0, + "cm_mark": 0, + "stime": 0, + "mid": "", + "activity_type": 0, + "epid": 0, + "sub_title": "", + "ad_desc": "", + "adver_name": "", + "null_frame": false, + "pic_main_color": "", + "card_type": 0, + "business_mark": null, + "inline": { + "inline_use_same": 0, + "inline_type": 0, + "inline_url": "", + "inline_barrage_switch": 0 + }, + "operater": "", + "jump_target": 0, + "show_urls": null, + "click_urls": null + }, + "is_stock": 1, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1763571437, + "bvid": "", + "cid": 0, + "goto": "live", + "uri": "https://live.bilibili.com/1763571437", + "pic": "http://i0.hdslb.com/bfs/live/new_room_cover/f1787ef2ce4a2a031fb4a6a63b62d15493268d71.jpg", + "pic_4_3": "", + "title": "【新V】今天不要再把自己笨哭了", + "duration": 0, + "pubdate": 0, + "owner": { + "mid": 3546712666802274, + "name": "伊柒璇儿_鹤熙冠", + "face": "https://i0.hdslb.com/bfs/face/3e0ff3d7d53b9ac1a2d90ea563e22d3f70ad28cc.jpg" + }, + "stat": null, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": null, + "show_info": 0, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": { + "room_id": 1763571437, + "uid": 3546712666802274, + "live_status": 1, + "show": { + "short_id": 0, + "title": "【新V】今天不要再把自己笨哭了", + "cover": "http://i0.hdslb.com/bfs/live/new_room_cover/f1787ef2ce4a2a031fb4a6a63b62d15493268d71.jpg", + "keyframe": "http://i0.hdslb.com/bfs/live-key-frame/keyframe07161101001763571437k9l40v.jpg", + "popularity_count": 8539, + "tag_list": null, + "live_start_time": 0, + "live_id": 0, + "hidden_online": false + }, + "area": { + "area_id": 0, + "area_name": "虚拟日常", + "parent_area_id": 9, + "parent_area_name": "虚拟主播", + "old_area_id": 0, + "old_area_name": "", + "old_area_tag": "", + "area_pk_status": 0, + "is_video_room": false + }, + "watched_show": { + "switch": true, + "num": 168, + "text_small": "168", + "text_large": "168人看过", + "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", + "icon_location": "", + "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" + } + }, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1855792572, + "bvid": "BV16s421T7CU", + "cid": 1587596195, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV16s421T7CU", + "pic": "http://i2.hdslb.com/bfs/archive/1b9d9799260a075b094212bf79e3d7ccb9e04087.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-19-14044883851855792572_16_12_7260_crop.jpg", + "title": "压缩蚊件.zip", + "duration": 66, + "pubdate": 1718777086, + "owner": { + "mid": 173947574, + "name": "好奇五先生", + "face": "https://i2.hdslb.com/bfs/face/1c69fff12a2d0d50e71931cef0486ab919a818a2.jpg" + }, + "stat": { + "view": 951633, + "like": 22930, + "danmaku": 932, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1405866842, + "bvid": "BV11r421F7E8", + "cid": 1589772517, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV11r421F7E8", + "pic": "http://i2.hdslb.com/bfs/archive/50b1bb8d227d17a3b6195e80128ab295d152d3be.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-20-2148551405866842_1612_gener.jpg", + "title": "【音游推荐】暑期音游推荐,不同基础都可入坑", + "duration": 311, + "pubdate": 1718891332, + "owner": { + "mid": 592146708, + "name": "Qc天水", + "face": "https://i0.hdslb.com/bfs/face/2998a9e762aa07559b2acf54234f07979c959ffe.jpg" + }, + "stat": { + "view": 278997, + "like": 6698, + "danmaku": 303, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1055540151, + "bvid": "BV1in4y197U4", + "cid": 1582190043, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1in4y197U4", + "pic": "http://i2.hdslb.com/bfs/archive/9a366971fadd6e4dfd1813c42b180c8779038627.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-15-18004087071055540151_16_12_7856_crop.jpg", + "title": "我把裁判罚下场了", + "duration": 217, + "pubdate": 1718445600, + "owner": { + "mid": 475304452, + "name": "生姜蛋包饭", + "face": "https://i1.hdslb.com/bfs/face/40feee36c71f7f53931854fc54c88d530360b1a7.jpg" + }, + "stat": { + "view": 678085, + "like": 62171, + "danmaku": 832, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "content": "6万点赞", + "reason_type": 3 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1505823466, + "bvid": "BV1vS421d7No", + "cid": 1596567774, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1vS421d7No", + "pic": "http://i2.hdslb.com/bfs/archive/b2b19b067cdbf7dd93be5fc01009e72c20572184.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-26-1241021505823466_1612_gener.jpg", + "title": "AI 视频:两小儿辩日", + "duration": 138, + "pubdate": 1719376858, + "owner": { + "mid": 589397373, + "name": "宝玉xp", + "face": "https://i0.hdslb.com/bfs/face/c2c29f6e1bb9b0860241f0df4d2cdea8242ab5d2.jpg" + }, + "stat": { + "view": 1216188, + "like": 54839, + "danmaku": 194, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1055744039, + "bvid": "BV1Zn4y1Q7zj", + "cid": 1575814128, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1Zn4y1Q7zj", + "pic": "http://i0.hdslb.com/bfs/archive/5288cf0830e49de414084c4168b11033b08f8507.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-09-17404720501055744039_16_12_294_crop.jpg", + "title": "【诺子】重新“看见”世界是一种什么样的感觉?", + "duration": 579, + "pubdate": 1717926045, + "owner": { + "mid": 10276136, + "name": "诺子喵呜", + "face": "https://i2.hdslb.com/bfs/face/7e6846ed5619b945c888b8f8db5000469f6353ff.jpg" + }, + "stat": { + "view": 1016467, + "like": 97886, + "danmaku": 979, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + }, + { + "id": 1706215690, + "bvid": "BV1tT421k7By", + "cid": 1611364587, + "goto": "av", + "uri": "https://www.bilibili.com/video/BV1tT421k7By", + "pic": "http://i1.hdslb.com/bfs/archive/cd3308109e8726fe4147dd25ed7ca0dbeeda1dc1.jpg", + "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-07-11-00194836761706215690_16_12_3934_crop.jpg", + "title": "谷歌翻译20遍《河中石兽》泌尿系统", + "duration": 145, + "pubdate": 1720628387, + "owner": { + "mid": 1030835113, + "name": "象哥嘎", + "face": "https://i1.hdslb.com/bfs/face/aa0ae89fa72dab7b8bc082433769b1768f51c3dc.jpg" + }, + "stat": { + "view": 78600, + "like": 3437, + "danmaku": 328, + "vt": 0 + }, + "av_feature": null, + "is_followed": 0, + "rcmd_reason": { + "reason_type": 0 + }, + "show_info": 1, + "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", + "pos": 0, + "room_info": null, + "ogv_info": null, + "business_info": null, + "is_stock": 0, + "enable_vt": 0, + "vt_display": "", + "dislike_switch": 1, + "dislike_switch_pc": 0 + } + ], + "side_bar_column": [ + { + "id": 25502, + "goto": "comic", + "track_id": "", + "pos": 1, + "card_type": "漫画", + "card_type_en": "comic", + "cover": "http://i0.hdslb.com/bfs/manga-static/5e410bf6f73ff87f87b543e4b918de5f024652e8.jpg", + "url": "https://manga.bilibili.com/detail/mc25502", + "title": "头文字D", + "sub_title": "", + "duration": 0, + "stats": null, + "room_info": null, + "styles": [ + "游戏竞技" + ], + "comic": { + "comic_id": 25502, + "title": "头文字D", + "horizontal_cover": "http://i0.hdslb.com/bfs/manga-static/5e410bf6f73ff87f87b543e4b918de5f024652e8.jpg", + "square_cover": "http://i0.hdslb.com/bfs/manga-static/da660f6274730af82d557f21a6247d4f6b1e300b.jpg", + "vertical_cover": "http://i0.hdslb.com/bfs/manga-static/64df8b860d2bf6bf2edd0426b4aefbff25b51386.jpg", + "is_finish": 1, + "status": 0, + "last_ord": 724, + "total": 724, + "release_time": "", + "last_short_title": "番外05", + "discount_type": 0, + "recommendation": "秋名山下坡最快的AE86神话!", + "last_read_ep_id": 0, + "latest_ep_short_title": "", + "style": [ + "游戏竞技" + ], + "author_name": [ + "重野秀一 ", + "讲谈社" + ], + "allow_wait_free": false, + "type": 0, + "rank": null, + "operate_cover": "", + "rookie_type": 0 + }, + "producer": null, + "source": "", + "av_feature": null, + "is_rec": 0, + "is_finish": 0, + "is_started": 0, + "is_play": 0, + "enable_vt": 0, + "vt_display": "" + }, + { + "id": 47800, + "goto": "ogv", + "track_id": "", + "pos": 2, + "card_type": "番剧", + "card_type_en": "bangumi", + "cover": "https://i0.hdslb.com/bfs/bangumi/image/1c61f75b571fffb8c5a2bd0396b49ce3529776f4.png", + "url": "https://www.bilibili.com/bangumi/play/ss47800", + "title": "铁甲小宝 重制版 中文配音", + "sub_title": "童年经典回归!", + "duration": 1382000, + "stats": { + "follow": 116644, + "view": 10864687, + "danmaku": 42428, + "reply": 11448, + "coin": 18904, + "series_follow": 209046, + "series_view": 17474247, + "likes": 61376, + "favorite": 116644 + }, + "room_info": null, + "new_ep": { + "id": 824212, + "index_show": "更新至第30话", + "cover": "http://i0.hdslb.com/bfs/archive/e185c054588945a1de6648ff7fb5001852df39f4.png", + "title": "30", + "long_title": "巨大机器来袭!!", + "pub_time": "2024-07-15 18:00:01", + "duration": 1382000, + "day_of_week": 1 + }, + "styles": [ + "日常", + "热血", + "搞笑", + "原创", + "特摄" + ], + "comic": null, + "producer": [ + { + "mid": 928123, + "name": "哔哩哔哩番剧", + "type": 3, + "is_contribute": 1 + } + ], + "source": "", + "av_feature": null, + "is_rec": 0, + "is_finish": 0, + "is_started": 1, + "is_play": 1, + "horizontal_cover_16_9": "https://i0.hdslb.com/bfs/bangumi/image/ec5065dc0e88417abd4792d5caa96dacc99d1d51.png", + "horizontal_cover_16_10": "https://i0.hdslb.com/bfs/bangumi/image/5cc132e336cc72e6521bba928d8a0e50bd5a6d34.png", + "enable_vt": 0, + "vt_display": "" + }, + { + "id": 48020, + "goto": "ogv", + "track_id": "", + "pos": 3, + "card_type": "国创", + "card_type_en": "guochuang", + "cover": "https://i0.hdslb.com/bfs/bangumi/image/fcb176fcbf5a66fd122fa99f9fdf2cabf22468bb.png", + "url": "https://www.bilibili.com/bangumi/play/ss48020", + "title": "不白吃古诗词漫游记 第二季", + "sub_title": "古诗词这动人的浪漫", + "duration": 179000, + "stats": { + "follow": 2173495, + "view": 325366, + "danmaku": 110, + "reply": 208, + "coin": 443, + "series_follow": 2208624, + "series_view": 3322752487, + "likes": 8794, + "favorite": 2173495 + }, + "room_info": null, + "new_ep": { + "id": 830238, + "index_show": "更新至第7话", + "cover": "http://i0.hdslb.com/bfs/archive/6db74bc8ab2670181562314a24abe525cebb7c76.jpg", + "title": "7", + "long_title": "王维当个官怎么还郁闷了?", + "pub_time": "2024-07-15 19:00:00", + "duration": 179000, + "day_of_week": 1 + }, + "styles": [ + "少儿", + "历史", + "原创", + "古风" + ], + "comic": null, + "producer": [], + "source": "", + "av_feature": null, + "is_rec": 0, + "is_finish": 0, + "is_started": 1, + "is_play": 1, + "horizontal_cover_16_9": "https://i0.hdslb.com/bfs/bangumi/image/f19013ddd7f87b0e03df10feccc4a61a3a43774a.png", + "horizontal_cover_16_10": "https://i0.hdslb.com/bfs/bangumi/image/966553b199829aae7e47882edbe053463ee85276.png", + "enable_vt": 0, + "vt_display": "" + } + ], + "business_card": null, + "floor_info": null, + "user_feature": null, + "preload_expose_pct": 0.5, + "preload_floor_expose_pct": 0.5, + "mid": 645769214 + } +} +``` + +
+ + +## 获取短视频模式视频列表 + +> https://app.bilibili.com/x/v2/feed/index + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +有大量不明意义的参数 备注仅供参考 + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|--------------|-----|---------------------------|-----|------------------------------| +| fnval | num | 视频流格式标识 | 非必要 | 默认为272 | +| fnver | num | 视频流版本标识 | 非必要 | 恒为1 | +| force_host | num | 源url类型 | 非必要 | 0:无限制 1:使用http 2:使用https | +| fourk | num | 是否允许 4K 视频 | 非必要 | 画质最高 1080P:0(默认)
画质最高 4K:1 | +| guidance | num | 0 | 非必要 | | +| https_url_req | num | 0 | 非必要 | | +| inline_danmu | num | 2 | 非必要 | | +| inline_sound | num | 1 | 非必要 | | +| interest_id | num | 0 | 非必要 | | +| login_event | num | 登录状态 | 非必要 | 0为登录 1为未登录 | +| mobi_app | num | android | 非必要 | 设备类型 | +| network | num | wifi | 非必要 | 网络类型 | +| open_event | num | | 非必要 | | +| platform | num | android | 非必要 | 设备类型 | +| pull | boll | false | 非必要 | | +| qn | num | 32 | 非必要 | 似乎是画质 | +| recsys_mode | num | 0 | 非必要 | | +| s_locale | str | zh_CN | 非必要 | 语言 | +| video_mode | num | 1 | 非必要 | | +| voice_balance | num | 音量均衡? | 非必要 | 默认为1 | + + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-------|------|----------------------| +| code | num | 返回值 | 0:成功 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | | | + + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-------|------|----------------------| +| config | obj | 一些界面相关的内容 | 此处省略 | +| items | array | 视频列表 | | + +`data`中的`items`数组的对象: + +以下为视频类型 + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-------|------|----------------------| +| can_play | num | 1 | 字面意思 | +| card_goto | str | av | | +| card_type | str | 卡片类型 | 视频为small_cover_v2 | +| cover | str | 封面url | | +| cover_left_1_content_description | str | 播放量 | 8.9万观看 | +| cover_left_2_content_description | str | 弹幕数 | 250弹幕 | +| cover_left_text_1 | str | 播放量 | 8.9万 | +| cover_left_text_2 | str | 弹幕数 | 250 | +| cover_right_content_description | str | 视频长度 | 1分钟20秒 | +| cover_right_text | str | 视频长度 | 1:20 | +| desc_button | obj | up主信息 | | +| param | str | 视频aid | | +| player_args | obj | 视频信息 | | +| talk_back | str | | | +| title | str | 标题 | | +| uri | str | 跳转链接 | | + +`desc_button`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-------|------|----------------------| +| event | str | | | +| text | str | up名称 | | +| type | num | 1 | | +| uri | str | 跳转链接 | | + + +`player_args`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-------|------|----------------------| +| aid | num | 视频aid | | +| cid | num | 视频cid | | +| duration | num | 视频长度 | 秒数 | +| type | str | | | + + +**示例:** + +获取短视频模式视频列表 + +```shell +curl -G 'https://app.bilibili.com/x/v2/feed/index' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "items": [ + { + "card_type": "small_cover_v2", + "card_goto": "av", + "goto": "av", + "param": "411978753", + "cover": "http://i2.hdslb.com/bfs/archive/a1bda1e57e6812ca8822a8839fc4a1d3539255a8.jpg", + "title": "帕 鲁 现 状", + "uri": "bilibili://video/411978753?cid=1423365216\u0026player_height=1920\u0026player_preload=%7B%22cid%22%3A1423365216%2C%22expire_time%22%3A1706633200%2C%22file_info%22%3A%7B%2216%22%3A%5B%7B%22timelength%22%3A79970%2C%22filesize%22%3A3782665%7D%5D%2C%2264%22%3A%5B%7B%22timelength%22%3A79900%2C%22filesize%22%3A9552030%7D%5D%7D%2C%22support_quality%22%3Anull%2C%22support_formats%22%3Anull%2C%22support_description%22%3Anull%2C%22quality%22%3A16%2C%22url%22%3A%22http%3A%2F%2Fcn-gdst-cm-01-12.bilivideo.com%2Fupgcxcode%2F16%2F52%2F1423365216%2F1423365216-1-16.mp4%3Fe%3Dig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_%5Cu0026uipk%3D5%5Cu0026nbs%3D1%5Cu0026deadline%3D1706636800%5Cu0026gen%3Dplayurlv2%5Cu0026os%3Dbcache%5Cu0026oi%3D0%5Cu0026trid%3D00000ccc07d4b7a34140a25493d51003bd95U%5Cu0026mid%3D0%5Cu0026platform%3D%5Cu0026upsig%3D2bf8e99202a181300981ab6ba9d2305d%5Cu0026uparams%3De%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform%5Cu0026cdnid%3D6876%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026orderid%3D0%2C3%5Cu0026buvid%3D%5Cu0026build%3D0%5Cu0026f%3DU_0_0%5Cu0026bw%3D47881%5Cu0026logo%3D80000000%22%2C%22video_codecid%22%3A7%2C%22video_project%22%3Atrue%2C%22fnver%22%3A0%2C%22fnval%22%3A0%7D\u0026player_rotate=0\u0026player_width=1080\u0026report_flow_data=%7B%22flow_card_type%22%3A%22av%22%7D", + "three_point": { + "dislike_reasons": [ + { + "id": 4, + "name": "UP主:锤子game", + "toast": "将减少相似内容推荐" + }, + { + "id": 2, + "name": "分区:网络游戏", + "toast": "将减少相似内容推荐" + }, + { + "id": 3, + "name": "频道:搞笑", + "toast": "将减少相似内容推荐" + }, + { + "id": 12, + "name": "此类内容过多", + "toast": "将减少相似内容推荐" + }, + { + "id": 13, + "name": "推荐过", + "toast": "将减少相似内容推荐" + }, + { + "id": 1, + "name": "不感兴趣", + "toast": "将减少相似内容推荐" + } + ], + "feedbacks": [ + { + "id": 1, + "name": "恐怖血腥", + "toast": "将优化首页此类内容" + }, + { + "id": 2, + "name": "色情低俗", + "toast": "将优化首页此类内容" + }, + { + "id": 3, + "name": "封面恶心", + "toast": "将优化首页此类内容" + }, + { + "id": 4, + "name": "标题党/封面党", + "toast": "将优化首页此类内容" + } + ], + "watch_later": 1 + }, + "args": { + "up_id": 495695169, + "up_name": "锤子game", + "rid": 65, + "rname": "网络游戏", + "tid": 1833, + "tname": "搞笑", + "aid": 411978753 + }, + "player_args": { + "aid": 411978753, + "cid": 1423365216, + "type": "av", + "duration": 80 + }, + "idx": 1706629610, + "three_point_v2": [ + { + "title": "添加至稍后再看", + "type": "watch_later", + "icon": "https://i0.hdslb.com/bfs/activity-plat/static/ce06d65bc0a8d8aa2a463747ce2a4752/NyPAqcn0QF.png" + }, + { + "title": "反馈", + "subtitle": "(选择后将优化首页此类内容)", + "reasons": [ + { + "id": 1, + "name": "恐怖血腥", + "toast": "将优化首页此类内容" + }, + { + "id": 2, + "name": "色情低俗", + "toast": "将优化首页此类内容" + }, + { + "id": 3, + "name": "封面恶心", + "toast": "将优化首页此类内容" + }, + { + "id": 4, + "name": "标题党/封面党", + "toast": "将优化首页此类内容" + } + ], + "type": "feedback" + }, + { + "title": "不感兴趣", + "subtitle": "(选择后将减少相似内容推荐)", + "reasons": [ + { + "id": 4, + "name": "UP主:锤子game", + "toast": "将减少相似内容推荐" + }, + { + "id": 2, + "name": "分区:网络游戏", + "toast": "将减少相似内容推荐" + }, + { + "id": 3, + "name": "频道:搞笑", + "toast": "将减少相似内容推荐" + }, + { + "id": 12, + "name": "此类内容过多", + "toast": "将减少相似内容推荐" + }, + { + "id": 13, + "name": "推荐过", + "toast": "将减少相似内容推荐" + }, + { + "id": 1, + "name": "不感兴趣", + "toast": "将减少相似内容推荐" + } + ], + "type": "dislike" + } + ], + "talk_back": "视频,帕 鲁 现 状,32.5万观看,257弹幕,时长1分钟20秒,UP主锤子game,", + "report_flow_data": "{\"flow_card_type\":\"av\"}", + "cover_left_text_1": "32.5万", + "cover_left_icon_1": 1, + "cover_left_1_content_description": "32.5万观看", + "cover_left_text_2": "257", + "cover_left_icon_2": 3, + "cover_left_2_content_description": "257弹幕", + "cover_right_text": "1:20", + "cover_right_content_description": "1分钟20秒", + "desc_button": { + "text": "锤子game", + "uri": "bilibili://space/495695169", + "event": "nickname", + "type": 1 + }, + "official_icon": 16, + "can_play": 1, + "goto_icon": { + "icon_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/077GOeHOfO.png", + "icon_night_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/ldbCXtkoK2.png", + "icon_width": 16, + "icon_height": 16 + } + }, + { + "card_type": "small_cover_v2", + "card_goto": "av", + "goto": "av", + "param": "836990443", + "cover": "http://i1.hdslb.com/bfs/archive/d16a125d6ec1c68cc9e0815bc28dcb62a1df9932.jpg", + "title": "【Phigros自制/崩坏:星穹铁道】欢迎来到匹诺康尼! 不眠之夜 IN Lv.13", + "uri": "bilibili://video/836990443?cid=1422516399\u0026player_height=1080\u0026player_preload=%7B%22cid%22%3A1422516399%2C%22expire_time%22%3A1706633200%2C%22file_info%22%3A%7B%2216%22%3A%5B%7B%22timelength%22%3A102818%2C%22filesize%22%3A4441802%7D%5D%2C%2264%22%3A%5B%7B%22timelength%22%3A102748%2C%22filesize%22%3A12468618%7D%5D%7D%2C%22support_quality%22%3Anull%2C%22support_formats%22%3Anull%2C%22support_description%22%3Anull%2C%22quality%22%3A16%2C%22url%22%3A%22http%3A%2F%2Fupos-sz-mirrorali.bilivideo.com%2Fupgcxcode%2F99%2F63%2F1422516399%2F1422516399-1-16.mp4%3Fe%3Dig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_%5Cu0026uipk%3D5%5Cu0026nbs%3D1%5Cu0026deadline%3D1706636800%5Cu0026gen%3Dplayurlv2%5Cu0026os%3Dalibv%5Cu0026oi%3D0%5Cu0026trid%3D0ccc07d4b7a34140a25493d51003bd95U%5Cu0026mid%3D0%5Cu0026platform%3D%5Cu0026upsig%3D06ea793aa573018646c0096adf0dcb9e%5Cu0026uparams%3De%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026orderid%3D0%2C3%5Cu0026buvid%3D%5Cu0026build%3D0%5Cu0026f%3DU_0_0%5Cu0026bw%3D43547%5Cu0026logo%3D80000000%22%2C%22video_codecid%22%3A7%2C%22video_project%22%3Atrue%2C%22fnver%22%3A0%2C%22fnval%22%3A0%7D\u0026player_rotate=0\u0026player_width=1920\u0026report_flow_data=%7B%22flow_card_type%22%3A%22av%22%7D", + "three_point": { + "dislike_reasons": [ + { + "id": 4, + "name": "UP主:早期陈总", + "toast": "将减少相似内容推荐" + }, + { + "id": 2, + "name": "分区:音游", + "toast": "将减少相似内容推荐" + }, + { + "id": 3, + "name": "频道:音乐游戏", + "toast": "将减少相似内容推荐" + }, + { + "id": 12, + "name": "此类内容过多", + "toast": "将减少相似内容推荐" + }, + { + "id": 13, + "name": "推荐过", + "toast": "将减少相似内容推荐" + }, + { + "id": 1, + "name": "不感兴趣", + "toast": "将减少相似内容推荐" + } + ], + "feedbacks": [ + { + "id": 1, + "name": "恐怖血腥", + "toast": "将优化首页此类内容" + }, + { + "id": 2, + "name": "色情低俗", + "toast": "将优化首页此类内容" + }, + { + "id": 3, + "name": "封面恶心", + "toast": "将优化首页此类内容" + }, + { + "id": 4, + "name": "标题党/封面党", + "toast": "将优化首页此类内容" + } + ], + "watch_later": 1 + }, + "args": { + "up_id": 1515475415, + "up_name": "早期陈总", + "rid": 136, + "rname": "音游", + "tid": 10174, + "tname": "音乐游戏", + "aid": 836990443 + }, + "player_args": { + "aid": 836990443, + "cid": 1422516399, + "type": "av", + "duration": 103 + }, + "idx": 1706629609, + "three_point_v2": [ + { + "title": "添加至稍后再看", + "type": "watch_later", + "icon": "https://i0.hdslb.com/bfs/activity-plat/static/ce06d65bc0a8d8aa2a463747ce2a4752/NyPAqcn0QF.png" + }, + { + "title": "反馈", + "subtitle": "(选择后将优化首页此类内容)", + "reasons": [ + { + "id": 1, + "name": "恐怖血腥", + "toast": "将优化首页此类内容" + }, + { + "id": 2, + "name": "色情低俗", + "toast": "将优化首页此类内容" + }, + { + "id": 3, + "name": "封面恶心", + "toast": "将优化首页此类内容" + }, + { + "id": 4, + "name": "标题党/封面党", + "toast": "将优化首页此类内容" + } + ], + "type": "feedback" + }, + { + "title": "不感兴趣", + "subtitle": "(选择后将减少相似内容推荐)", + "reasons": [ + { + "id": 4, + "name": "UP主:早期陈总", + "toast": "将减少相似内容推荐" + }, + { + "id": 2, + "name": "分区:音游", + "toast": "将减少相似内容推荐" + }, + { + "id": 3, + "name": "频道:音乐游戏", + "toast": "将减少相似内容推荐" + }, + { + "id": 12, + "name": "此类内容过多", + "toast": "将减少相似内容推荐" + }, + { + "id": 13, + "name": "推荐过", + "toast": "将减少相似内容推荐" + }, + { + "id": 1, + "name": "不感兴趣", + "toast": "将减少相似内容推荐" + } + ], + "type": "dislike" + } + ], + "talk_back": "视频,【Phigros自制/崩坏:星穹铁道】欢迎来到匹诺康尼! 不眠之夜 IN Lv.13,22.8万观看,797弹幕,时长1分钟43秒,UP主早期陈总,", + "report_flow_data": "{\"flow_card_type\":\"av\"}", + "cover_left_text_1": "22.8万", + "cover_left_icon_1": 1, + "cover_left_1_content_description": "22.8万观看", + "cover_left_text_2": "797", + "cover_left_icon_2": 3, + "cover_left_2_content_description": "797弹幕", + "cover_right_text": "1:43", + "cover_right_content_description": "1分钟43秒", + "desc_button": { + "text": "早期陈总", + "uri": "bilibili://space/1515475415", + "event": "nickname", + "type": 1 + }, + "can_play": 1, + "goto_icon": { + "icon_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/077GOeHOfO.png", + "icon_night_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/ldbCXtkoK2.png", + "icon_width": 16, + "icon_height": 16 + } + } + ], + "config": { + "column": 2, + "autoplay_card": 2, + "feed_clean_abtest": 0, + "home_transfer_test": 0, + "auto_refresh_time": 1200, + "show_inline_danmaku": 1, + "toast": {}, + "is_back_to_homepage": true, + "enable_rcmd_guide": true, + "inline_sound": 2, + "auto_refresh_time_by_appear": 1200, + "auto_refresh_time_by_active": 1200, + "visible_area": 80, + "card_density_exp": 1, + "story_mode_v2_guide_exp": 6 + }, + "interest_choose": null + } +} +``` + +
diff --git a/docs/video/report.md b/docs/video/report.md new file mode 100644 index 0000000..ef141bc --- /dev/null +++ b/docs/video/report.md @@ -0,0 +1,246 @@ +# 视频观看数据上报 + +## 上报观看进度(双端) + +> https://api.bilibili.com/x/v2/history/report + +*请求方式:POST* + +认证方式:APP或Cookie(SESSDATA) + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------------------ | -------------- | --------------------- | +| access_key | str | APP登录Token | APP方式必要 | | +| aid | num | 稿件avid | 必要 | | +| cid | num | 视频cid | 必要 | 用于识别分P | +| progress | num | 观看进度 | 非必要 | 单位为秒
默认为0 | +| platform | str | 平台标识 | 非必要 | 可为android | +| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +记录视频`av13662970`(`cid=126654047`)的观看记录位于`1248`秒 + +Cookie方式: + +```shell +curl 'https://api.bilibili.com/x/v2/history/report' \ +--data-urlencode 'aid=13662970' \ +--data-urlencode 'cid=126654047' \ +--data-urlencode 'progress=1248' \ +--data-urlencode 'platform=android' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +APP方式: + +```shell +curl 'https://api.bilibili.com/x/v2/history/report' \ +--data-urlencode 'access_key=xxx' \ +--data-urlencode 'aid=13662970' \ +--data-urlencode 'cid=126654047' \ +--data-urlencode 'progress=1248' \ +--data-urlencode 'platform=android' +``` + + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +## 上报视频播放心跳(web端) + +> https://api.bilibili.com/x/click-interface/web/heartbeat + +*请求方式:POST* + +认证方式:仅可Cookie(SESSDATA) + +默认间隔15秒一次, 亦可记录播放历史 + +该接口较为复杂, 且参数计算方法均为推测, 实际过程不明, 可能含有错误, 若要正式使用可以把已播放的持续时间全都设为相同值 + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------------------------- | ---- | ------------------------------ | ------ | ------- | +| w_start_ts | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | UNIX 秒级时间戳 | +| w_mid | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | | +| w_aid | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | | +| w_dt | num | 2 | 非必要 | | +| w_realtime | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | +| w_playedtime | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | +| w_real_played_time | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | +| w_video_duration | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | +| w_last_play_progress_time | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | +| web_location | num | 网页位置 | 非必要 | 视频详情页播放器: 1315873 | +| w_rid | num | WBI 签名 | 非必要 | 参见[WBI 签名](../misc/sign/wbi.md) | +| wts | num | UNIX 秒级时间戳 | 非必要 | 参见[WBI 签名](../misc/sign/wbi.md) | + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------------------- | ---- | ---------------------------------- | ------------ | ----------------------------------------------------------- | +| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个(网页端请求默认仅使用aid) | +| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | +| cid | num | 视频cid | 非必要 | 用于识别分P | +| epid | num | 番剧epid | 非必要 | | +| sid | num | 番剧ssid | 非必要 | | +| mid | num | 当前用户mid | 非必要 | | +| played_time | num | 视频播放进度 | 非必要 | 单位 秒
播放完成为 -1 | +| realtime | num | 本轮页面会话真实播放时间 | 非必要 | 单位 秒 | +| real_played_time | num | 本轮页面会话真实视频播放持续时间 | 非必要 | 单位 秒 | +| refer_url | str | 与请求头 Referer 字段相同 | 非必要 | | +| quality | num | 视频清晰度 | 非必要 | 参见[qn视频清晰度标识](videostream_url.md#qn视频清晰度标识) | +| video_duration | num | 视频时长 | 非必要 | 单位 秒 | +| last_play_progress_time | num | play_time 与 本轮页面会话开始时 played_time 之和 | 非必要 | 单位 秒 | +| max_play_progress_time | num | 本轮页面会话所有最大 last_play_progress_time 与 本轮页面会话开始时 played_time 之和 | 非必要 | 单位 秒 | +| start_ts | num | 开始播放时刻 | 非必要 | 时间戳 | +| type | num | 视频类型 | 非必要 | 3:投稿视频
4:剧集
10:课程 | +| sub_type | num | 剧集副类型 | 非必要 | 0: 普通投稿视频
1:番剧
2:电影
3:纪录片
4:国创
5:电视剧
7:综艺 | +| dt | num | 2 | 非必要 | | +| outer | num | 0 | 非必要 | | +| spmid | str | 333.788.0.0 | 非必要 | 作用尚不明确 | +| from_spmid | str | 播放来源? | 非必要 | 也可为空, 如: `444.41.list.card_archive.click` `333.999.0.0` | +| session | str | 会话信息? | 非必要 | 一串无分隔小写 UUID | +| extra | obj | 额外信息, 如播放器版本 | 非必要 | 如: `{"player_version":"4.8.36"}` | +| play_type | num | 播放动作 | 非必要 | 0:播放中
1:开始播放
2:暂停
3:继续播放
4: 结束播放 | +| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 非必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +上报一次视频`av2`/`BV1xx411c7mD`的心跳数据 + +```shell +curl 'https://api.bilibili.com/x/click-interface/web/heartbeat' \ +--data-urlencode 'aid=2' \ +--data-urlencode 'bvid=BV1xx411c7mD' \ +--data-urlencode 'cid=62131' \ +--data-urlencode 'played_time=60' \ +--data-urlencode 'realtime=60' \ +--data-urlencode 'start_ts=1592720840' \ +--data-urlencode 'type=3' \ +--data-urlencode 'dt=2' \ +--data-urlencode 'play_type=0' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +## 开始观看视频 (web端) + +> https://api.bilibili.com/x/click-interface/click/web/h5 + +*请求方式: POST* + +认证方式: Cookie (SESSDATA) + +该接口亦被用于计算播放量, 播放量更新不是实时的
+该接口使用似乎存在 200 播放限制, **请勿滥用!** + +**URL参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| w_aid | num | 稿件 aid | 不必要 | | +| w_part | num | 视频分 P 编号 | 不必要 | | +| w_ftime | num | 点击时间戳? | 不必要 | UNIX 秒级时间戳 | +| w_stime | num | 开始播放时间戳? | 不必要 | UNIX 秒级时间戳 | +| w_type | num | 视频类型 | 不必要 | 见[上报视频播放心跳(web端)](#上报视频播放心跳web端) | +| web_location | num | 网页位置? | 不必要 | 1315873 | +| w_rid | num | WBI 签名 | 不必要 | 参见[WBI 签名](../misc/sign/wbi.md) | +| wts | num | UNIX 秒级时间戳 | 不必要 | 参见[WBI 签名](../misc/sign/wbi.md) | + +**正文参数 (application/x-www-form-urlencoded):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ---- | +| mid | num | 当前用户 mid | 不必要 | | +| aid | num | 稿件 aid | 必要 | | +| cid | num | 视频 cid | 不必要 | | +| part | num | 视频分 P 编号 | 不必要 | | +| lv | num | 当前用户等级 | 不必要 | | +| ftime | num | 同 URL 参数中带有 `w_` 前缀的同名参数 | 不必要 | | +| stime | num | 同 URL 参数中带有 `w_` 前缀的同名参数 | 不必要 | | +| type | num | 视频类型 | 不必要 | 见[上报视频播放心跳(web端)](#上报视频播放心跳web端) | +| sub_type | num | 视频子类型 | 不必要 | 见[上报视频播放心跳(web端)](#上报视频播放心跳web端) | +| referer_url | str | 与请求头 Referer 字段相同 | 不必要 | | +| outer | num | 0 | 不必要 | | +| spmid | str | 333.788.0.0 | 不必要 | 作用尚不明确 | +| from_spmid | str | 播放来源? | 不必要 | 见[上报视频播放心跳(web端)](#上报视频播放心跳web端) | +| session | str | 会话信息? | 不必要 | 一串无分隔小写 UUID | +| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 不必要 | | + +**JSON回复:** + +根对象: + +|字段|类型|内容|备注| +|-|-|-|-| +|code|num|返回值|0:成功
-400:请求错误| +|message|str|错误信息|默认为 `0`| +|ttl|num|1|| + +**示例:** + +```shell +curl 'https://api.bilibili.com/x/click-interface/click/web/h5' \ +--data-urlencode 'aid=2' \ +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
diff --git a/video/snapshot.md b/docs/video/snapshot.md similarity index 93% rename from video/snapshot.md rename to docs/video/snapshot.md index c4f7aa9..3bc1bb0 100644 --- a/video/snapshot.md +++ b/docs/video/snapshot.md @@ -6,18 +6,8 @@ 截取时间表的时间和快照一一对应,并按照从左到右 从上到下的顺序排布 ---- - -- [获取视频快照(web端)](#获取视频快照(web端)) -- [获取视频快照(APP端)](#获取视频快照(APP端)) -- [获取视频快照(web端)(用于封面预览)](#获取视频快照(web端)(用于封面预览)) -- [图片拼版](#图片拼版) -- [bin格式截取时间表](#bin格式截取时间表) - ---- - ## 获取视频快照(web端) -> http://api.bilibili.com/x/player/videoshot +> https://api.bilibili.com/x/player/videoshot *请求方式:GET* @@ -77,7 +67,7 @@ avid方式: ```shell -curl -G 'http://api.bilibili.com/x/player/videoshot' \ +curl -G 'https://api.bilibili.com/x/player/videoshot' \ --data-urlencode 'aid=26273789' \ --data-urlencode 'index=1' ``` @@ -85,7 +75,7 @@ curl -G 'http://api.bilibili.com/x/player/videoshot' \ bvid方式: ```shell -curl -G 'http://api.bilibili.com/x/player/videoshot' \ +curl -G 'https://api.bilibili.com/x/player/videoshot' \ --data-urlencode 'bvid=BV1os411H7wm' \ --data-urlencode 'index=1' ``` @@ -114,7 +104,7 @@ curl -G 'http://api.bilibili.com/x/player/videoshot' \ ## 获取视频快照(APP端) -> http://app.bilibili.com/x/v2/view/video/shot +> https://app.bilibili.com/x/v2/view/video/shot *请求方式:GET* @@ -165,7 +155,7 @@ curl -G 'http://api.bilibili.com/x/player/videoshot' \ 获取视频`av26273789`(`cid=49075258`)的快照 ```shell -curl -G 'http://app.bilibili.com/x/v2/view/video/shot' \ +curl -G 'https://app.bilibili.com/x/v2/view/video/shot' \ --data-urlencode 'appkey=1d8b6e7d45233436' \ --data-urlencode 'aid=26273789' \ --data-urlencode 'cid=49075258' \ @@ -182,14 +172,14 @@ curl -G 'http://app.bilibili.com/x/v2/view/video/shot' \ "message": "0", "ttl": 1, "data": { - "pvdata": "http://i0.hdslb.com/bfs/videoshot/49075258.bin", + "pvdata": "https://i0.hdslb.com/bfs/videoshot/49075258.bin", "img_x_len": 10, "img_y_len": 10, "img_x_size": 160, "img_y_size": 90, "image": [ - "http://i0.hdslb.com/bfs/videoshot/49075258.jpg", - "http://i0.hdslb.com/bfs/videoshot/49075258-1.jpg" + "https://i0.hdslb.com/bfs/videoshot/49075258.jpg", + "https://i0.hdslb.com/bfs/videoshot/49075258-1.jpg" ] } } @@ -199,7 +189,7 @@ curl -G 'http://app.bilibili.com/x/v2/view/video/shot' \ ## 获取视频快照(web端)(用于封面预览) -> http://api.bilibili.com/pvideo +> https://api.bilibili.com/pvideo *请求方式:GET* @@ -256,7 +246,7 @@ curl -G 'http://app.bilibili.com/x/v2/view/video/shot' \ 获取视频`av26273789`的快照 ```shell -curl -G 'http://api.bilibili.com/pvideo' \ +curl -G 'https://api.bilibili.com/pvideo' \ --data-urlencode 'aid=26273789' ``` @@ -290,7 +280,7 @@ curl -G 'http://api.bilibili.com/pvideo' \ 示例拼版图片url:http://i0.hdslb.com/bfs/videoshot/49075258.jpg -![](http://i0.hdslb.com/bfs/videoshot/49075258.jpg) + ## bin格式截取时间表 diff --git a/video/status_number.md b/docs/video/status_number.md similarity index 92% rename from video/status_number.md rename to docs/video/status_number.md index 821122e..89dc0bc 100644 --- a/video/status_number.md +++ b/docs/video/status_number.md @@ -1,12 +1,13 @@ # 视频状态数 -- [视频状态数(仅avid)](#视频状态数(仅avid)) -- [视频状态数(bvid/avid)](#视频状态数(bvid/avid)) - ---- +本页接口均已失效 ## 视频状态数(仅avid) -> http://api.bilibili.com/archive_stat/stat + +
+该接口已弃用 (HTTP 403) + +> https://api.bilibili.com/archive_stat/stat *请求方式:GET* @@ -52,7 +53,7 @@ avid方式: ```shell -curl -G 'http://api.bilibili.com/archive_stat/stat' \ +curl -G 'https://api.bilibili.com/archive_stat/stat' \ --data-urlencode 'aid=91572143' ``` @@ -84,9 +85,14 @@ curl -G 'http://api.bilibili.com/archive_stat/stat' \
+ + ## 视频状态数(bvid/avid) -> http://api.bilibili.com/x/web-interface/archive/stat +
+该接口已失效 (HTTP 404) + +> https://api.bilibili.com/x/web-interface/archive/stat *请求方式:GET* @@ -138,14 +144,14 @@ curl -G 'http://api.bilibili.com/archive_stat/stat' \ avid方式: ```shell -curl -G 'http://api.bilibili.com/x/web-interface/archive/stat' \ +curl -G 'https://api.bilibili.com/x/web-interface/archive/stat' \ --data-urlencode 'aid=2271112' ``` bvid方式: ```shell -curl -G 'http://api.bilibili.com/x/web-interface/archive/stat' \ +curl -G 'https://api.bilibili.com/x/web-interface/archive/stat' \ --data-urlencode 'bvid=BV1es411D7sW' ``` @@ -182,7 +188,7 @@ curl -G 'http://api.bilibili.com/x/web-interface/archive/stat' \ 当UA为`2333python2333`时,则无法访问此接口: ```shell -curl -G 'http://api.bilibili.com/x/web-interface/archive/stat' \ +curl -G 'https://api.bilibili.com/x/web-interface/archive/stat' \ --data-urlencode 'aid=2271112' \ -A '2333python2333' ``` @@ -200,3 +206,5 @@ curl -G 'http://api.bilibili.com/x/web-interface/archive/stat' \ ```
+ + diff --git a/docs/video/summary.md b/docs/video/summary.md new file mode 100644 index 0000000..e7da86f --- /dev/null +++ b/docs/video/summary.md @@ -0,0 +1,227 @@ +# 视频AI总结 + + + +## 获取AI总结内容 + +> https://api.bilibili.com/x/web-interface/view/conclusion/get + +*请求方式: GET* + +认证方式:Cookie(SESSDATA) + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|--------|-----|--------|-----|----------------------------------| +| aid | num | 稿件 avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件 bvid | 必要(可选) | avid与bvid任选一个 | +| cid | num | 视频 cid | 必要 | | +| up_mid | num | UP主 mid | 必要 | | +| w_rid | str | Wbi 签名 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | +| wts | num | 当前时间戳 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|--------------------------| +| code | num | 返回值 | 0: 成功
-101: 账号未登录
-400:请求错误
-403: 访问权限不足 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------|-----|------|----------------------| +| code | num | 返回值 | -1: 不支持AI摘要(敏感内容等)或其他因素导致请求异常
0: 有摘要
1:无摘要(未识别到语音) | +| model_result | obj | 摘要内容 | | +| stid | str | 摘要 id | 如`code=1`且该字段为`0`时,则未进行 AI 总结,即添加总结队列
如`code=1`且该字段为空时未识别到语音 | +| status | num | (?) | | +| like_num | num | 点赞数 | 默认为`0` | +| dislike_num | num | 点踩数 | 默认为`0` | + +`data`中的`model_result`对象: + +| 字段 | 类型 | 内容 | 备注 | +|-------------|-----|----------|------------------------------------------| +| result_type | num | 数据类型 | 0: 没有摘要
1:仅存着摘要总结
2:存着摘要以及提纲 | +| summary | str | 视频摘要 | 通常为一段概括整个视频内容的文本 | +| outline | 有数据时:array
无数据时:null | 分段提纲 | 通常为视频中叙述的各部分及其要点 | + +`model_result`对象中的`outline`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|---------|-----| +| 0 | obj | 总结分段1 | | +| n | obj | 总结分段(n+1) | | +| …… | obj | …… | …… | + +`outline`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|--------------|-----|------|----| +| title | str | 分段标题 | 段落内容的概括 | +| part_outline | array | 分段要点 | 当前分段中多个提到的细节 | +| timestamp | num | 分段起始时间 | 单位为秒 | + +`outline`数组中的对象中的`part_outline`数组: + +| 项 | 类型 | 内容 | 备注 | +|-----|-----|---------|-----| +| 0 | obj | 分段要点1 | | +| n | obj | 分段要点(n+1) | | +| …… | obj | …… | …… | + +`part_outline`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +|-----------|-----|-------|----| +| timestamp | num | 要点起始时间 | 单位为秒 | +| content | str | 小结内容 | 其中一个分段的要点 | + +**示例:** + +得到视频`BV1L94y1H7CV`(`cid=1335073288`)的摘要 + +```bash +curl -G 'https://api.bilibili.com/x/web-interface/view/conclusion/get' \ + --data-urlencode 'bvid=BV1L94y1H7CV' \ + --data-urlencode 'cid=1335073288' \ + --data-urlencode 'up_mid=297242063' \ + --data-urlencode 'wts=1701546363' \ + --data-urlencode 'w_rid=1073871926b3ccd99bd790f0162af634' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "code": 0, + "model_result": { + "result_type": 2, + "summary": "在网上阅读时遇到错别字和语言梗的烦恼,以及正确使用语言的重要性。作者认为,我们每个人都应该有包容心,不掉渣,不纠正别人的错误,同时也需要明辨是非,规范使用语言。视频还提到了一些常见的语言梗和错误用法,呼吁大家不要过分使用网络词汇,而应该注重语言的艺术性和深度。最后,作者欢迎大家关注他的微信公众号。", + "outline": [ + { + "title": "现代人使用中文时面临的困境,包括错别字、用法不正确等问题,并呼吁大家规范使用中文。", + "part_outline": [ + { + "timestamp": 1, + "content": "网友评论有错别字,勉强能看懂,但难受。" + }, + { + "timestamp": 39, + "content": "重来一次,明辨是非。" + }, + { + "timestamp": 167, + "content": "粉墨登场是贬义词,形容坏人打扮好老登场。" + } + ], + "timestamp": 1 + }, + { + "title": "网络词汇的过度使用导致语言生硬,以及对流行语言梗的短暂使用感到厌倦。", + "part_outline": [ + { + "timestamp": 241, + "content": "网络词汇过分使用会误导别人,使规范词汇生硬" + }, + { + "timestamp": 270, + "content": "以前的语言梗有深度,现在的流行梗很短命" + }, + { + "timestamp": 338, + "content": "巨星之间需要化学反应的过程,前几场发挥欠佳" + } + ], + "timestamp": 241 + } + ] + }, + "stid": "5117037934391059183", + "status": 0, + "like_num": 6, + "dislike_num": 2 + } +} +``` + +
+ +## 点赞&点踩摘要 + +> https://api.bilibili.com/x/web-interface/view/conclusion/set + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|-------|-----|--------|-----|----------------------------------| +| w_rid | str | Wbi 签名 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | +| wts | num | 当前时间戳 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +|------------|-----|----------------------|-----|-----------------------------| +| aid | num | 稿件 avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件 bvid | 必要(可选) | avid与bvid任选一个 | +| cid | num | 稿件 cid | 必要 | | +| up_mid | num | UP主 mid | 非必要 | | +| stid | num | 摘要 id | 必要 | | +| like_state | num | 执行操作 | 必要 | 1: 点赞
2: 取消点赞
3: 点踩
4: 取消点踩 | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +|---------|-----|------|------------------------------------------| +| code | num | 返回值 | 0: 成功
-400: 请求错误
65002:origin id 错误
65004:取消赞失败 未点赞过
65005:取消踩失败 未点踩过
65006: 已赞过
65007:已踩过 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +为视频`BV1L94y1H7CV`(`cid=1335073288`)的摘要点赞 + +```shell +curl 'https://api.bilibili.com/x/web-interface/view/conclusion/set?w_rid=edb471fc926646ef3889a80488166b66&wts=1700358953' \ + --data-urlencode 'bvid=BV1L94y1H7CV' \ + --data-urlencode 'cid=1335073288' \ + --data-urlencode 'up_mid=297242063' \ + --data-urlencode 'stid=5117037934391059183' \ + --data-urlencode '&like_state=1' \ + --data-urlencode 'csrf=xxx' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
diff --git a/docs/video/tags.md b/docs/video/tags.md new file mode 100644 index 0000000..2ee6fde --- /dev/null +++ b/docs/video/tags.md @@ -0,0 +1,434 @@ +# 视频TAG + +## 获取视频TAG信息(新) + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------------ | -------------------------------- | +| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | +| cid | num | 分P cid | 非必要 | 提供此参数可返回对应分P的BGM信息 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | array | TAG列表 | 无TAG为空 | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| 0 | obj | 第1个TAG | | +| n | obj | 第(n+1)个TAG | | +| …… | obj | …… | …… | + +`data`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ---------- | ------------------------------------------------------------ | +| tag_id | num | tag_id | 当`tag_type`不为`bgm`时有效 | +| tag_name | str | TAG名称 | | +| music_id | str | 背景音乐id | 当`tag_type`为`bgm`时有效,以`MA`开头 | +| tag_type | str | TAG类型 | `old_channel`:普通标签
`topic`:话题
`bgm`:背景音乐 | +| jump_url | str | 跳转url | 当`tag_type`为`topic`或`bgm`时有效 | + +**示例:** + +查询视频`av89772773`/`BV1M741177Kg`的TAG + +avid方式: + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/view/detail/tag' \ +--data-urlencode 'aid=89772773' \ +--data-urlencode 'cid=153322313' \ +-b 'SESSDATA=xxx' +``` + +bvid方式: + +```shell +curl -G 'https://api.bilibili.com/x/web-interface/view/detail/tag' \ +--data-urlencode 'bvid=BV1M741177Kg' \ +--data-urlencode 'cid=153322313' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "tag_id": 0, + "tag_name": "发现《Other Side》", + "music_id": "MA456128506519140428", + "tag_type": "bgm", + "jump_url": "https://music.bilibili.com/h5/music-detail?music_id=MA456128506519140428&cid=153322313&aid=89772773&na_close_hide=1" + }, + { + "tag_id": 12620189, + "tag_name": "异度侵入", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + }, + { + "tag_id": 707, + "tag_name": "ED", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + }, + { + "tag_id": 1394, + "tag_name": "动漫", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + }, + { + "tag_id": 13289329, + "tag_name": "异度侵入ed原图", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + }, + { + "tag_id": 7520816, + "tag_name": "bilibili新星计划", + "music_id": "", + "tag_type": "old_channel", + "jump_url": "" + } + ] +} +``` + +
+ +## 获取视频TAG信息(旧) + +> + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------------ | ------------------ | +| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | +| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----- | -------- | --------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | array | TAG列表 | 无TAG为空 | + +`data`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | -------------- | ---- | +| 0 | obj | 第1个TAG | | +| n | obj | 第(n+1)个TAG | | +| …… | obj | …… | …… | + +`data`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------- | ---- | -------------- | ------------------------------------------------------------ | +| tag_id | num | tag_id | | +| tag_name | str | TAG名称 | | +| cover | str | TAG图片url | | +| head_cover | str | TAG页面头图url | | +| content | str | TAG介绍 | | +| short_content | str | TAG简介 | | +| type | num | ??? | | +| state | num | 0 | | +| ctime | num | 创建时间 | 秒级时间戳 | +| count | obj | 状态数 | | +| is_atten | num | 是否关注 | 0:未关注
1:已关注
需要登录(Cookie)
未登录为0 | +| likes | num | 0 | 作用尚不明确 | +| hates | num | 0 | 作用尚不明确 | +| attribute | num | 0 | 作用尚不明确 | +| liked | num | 是否已经点赞 | 0:未点赞
1:已点赞
需要登录(Cookie)
未登录为0 | +| hated | num | 是否已经点踩 | 0:未点踩
1:已点踩
需要登录(Cookie)
未登录为0 | +| extra_attr | num | ? ? ? | | + +`data`数组中的对象中的`count`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ------------- | ------------ | +| view | num | 0 | 作用尚不明确 | +| use | num | 视频添加TAG数 | | +| atten | num | TAG关注 | | + +**示例:** + +查询视频`av89772773`/`BV1M741177Kg`的TAG + +avid方式: + +```shell +curl -G 'https://api.bilibili.com/x/tag/archive/tags' \ +--data-urlencode 'aid=89772773' \ +-b 'SESSDATA=xxx' +``` + +bvid方式: + +```shell +curl -G 'https://api.bilibili.com/x/tag/archive/tags' \ +--data-urlencode 'bvid=BV1M741177Kg' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [{ + "tag_id": 12620189, + "tag_name": "异度侵入", + "cover": "", + "head_cover": "", + "content": "", + "short_content": "", + "type": 1, + "state": 0, + "ctime": 1576235749, + "count": { + "view": 0, + "use": 6392, + "atten": 8938 + }, + "is_atten": 1, + "likes": 1, + "hates": 0, + "attribute": 0, + "liked": 0, + "hated": 0 + }, { + "tag_id": 7520816, + "tag_name": "bilibili新星计划", + "cover": "", + "head_cover": "", + "content": "", + "short_content": "", + "type": 4, + "state": 0, + "ctime": 1529717850, + "count": { + "view": 0, + "use": 1967314, + "atten": 65082 + }, + "is_atten": 0, + "likes": 0, + "hates": 0, + "attribute": 0, + "liked": 0, + "hated": 0 + }, { + "tag_id": 707, + "tag_name": "ED", + "cover": "", + "head_cover": "", + "content": "", + "short_content": "", + "type": 3, + "state": 0, + "ctime": 1436866637, + "count": { + "view": 0, + "use": 62646, + "atten": 75642 + }, + "is_atten": 1, + "likes": 0, + "hates": 0, + "attribute": 0, + "liked": 0, + "hated": 0 + }, { + "tag_id": 1394, + "tag_name": "动漫", + "cover": "http://i0.hdslb.com/bfs/tag/d08c5fe17ceb793e7ce95d9c67392743b33b46d0.jpg", + "head_cover": "", + "content": " “动漫”是动画和漫画的合称与缩写。在其他语言相当少用。随着现代传媒技术的发展,动画(animation或anime)和漫画(comics,manga;特别是故事性漫画)之间联系日趋紧密,两者常被合而为“动漫”。\n  由于漫画本身的发展形成了现代故事漫画的表现形式,将影视艺术融入漫画之中,使得漫画与动画更容易结合,影视艺术独特的地方在于它能通过镜头的推拉摇移和片段剪辑的蒙太奇技巧来表达想法和感受。漫画正是吸收了影视艺术的这两个特点。当讲述的故事越发复杂、人物越发丰富的时候,传统单线式叙事的方法就越行不通,蒙太奇的介入就成为一种需要了;当漫画家在传统表现手段中无法找到更合适的抒发感情的方法的时候,当读者需要作品有更强的冲击力和表现力的时候,各种镜头的灵活运用就成为一种必需了。一部现代故事漫画往往集远、中、近、特四种镜头于一身,漫画家往往能熟练地运用镜头的移动和各种蒙太奇剪接,对故事特定部分的情绪和氛围进行渲染。这就是现代故事漫画容易和动画结合的一个原因,因为它天生就像动画的分镜头剧本,读者在看漫画时如同在看一部电影。正是有着这样的相似性所以如今将动画和漫画合称为“动漫”。", + "short_content": "", + "type": 3, + "state": 0, + "ctime": 1436866637, + "count": { + "view": 0, + "use": 1134143, + "atten": 113030 + }, + "is_atten": 0, + "likes": 0, + "hates": 0, + "attribute": 0, + "liked": 0, + "hated": 0 + }, { + "tag_id": 13289329, + "tag_name": "异度侵入ed原图", + "cover": "", + "head_cover": "", + "content": "", + "short_content": "", + "type": 1, + "state": 0, + "ctime": 1581948411, + "count": { + "view": 0, + "use": 3, + "atten": 0 + }, + "is_atten": 0, + "likes": 0, + "hates": 0, + "attribute": 0, + "liked": 0, + "hated": 0 + }] +} +``` + +
+ +## 点赞&取消点赞视频TAG + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +重复请求为取消 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------ | ---- | +| aid | num | 稿件avid | 必要 | | +| tag_id | num | tag_id | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +为视频`av89772773`的TAG`12620189`点赞 + +```shell +curl 'https://api.bilibili.com/x/tag/archive/like2' \ +--data-urlencode 'aid=89772773' \ +--data-urlencode 'tag_id=12620189' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +## 点踩&取消点踩视频TAG + +> + +*请求方式:POST* + +认证方式:Cookie(SESSDATA) + +重复请求为取消 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ------------------------ | ------ | ---- | +| aid | num | 稿件avid | 必要 | | +| tag_id | num | tag_id | 必要 | | +| csrf | str | CSRF Token(位于cookie) | 必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +为视频`av89772773`的TAG`7520816`点踩 + +```shell +curl 'https://pi.bilibili.com/x/tag/archive/hate2' \ +--data-urlencode 'aid=89772773' \ +--data-urlencode 'tag_id=7520816' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
diff --git a/docs/video/video_zone.md b/docs/video/video_zone.md new file mode 100644 index 0000000..14fe503 --- /dev/null +++ b/docs/video/video_zone.md @@ -0,0 +1,336 @@ +# 视频分区一览 + +用于判断视频所在的分区,或推荐分区视频等…… + +亦可用于更深♂入了解B站的分区 + +本文档中的内容适用于 `tid`、`tname` 等字段,关于 `tid_v2`、`tname_v2` 等字段请参阅 “[视频分区一览 (v2)](./video_zone_v2.md)” 文档 + +## 动画 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|-----------------------|------------|-----|------------------------------------------------------------------|--------------------------------------------------------------------| +| 动画(主分区) | douga | 1 | | [/v/douga](https://www.bilibili.com/v/douga) | +| MAD·AMV | mad | 24 | 具有一定制作程度的动画或静画的二次创作视频 | [/v/douga/mad](https://www.bilibili.com/v/douga/mad) | +| MMD·3D | mmd | 25 | 使用MMD(MikuMikuDance)和其他3D建模类软件制作的视频 | [/v/douga/mmd](https://www.bilibili.com/v/douga/mmd) | +| 同人·手书
(~~原短片·手书~~) | handdrawn | 47 | 追求个人特色和创意表达的手书(绘)、以及同人作品展示、宣传为主的内容 | [/v/douga/handdrawn](https://www.bilibili.com/v/douga/handdrawn) | +| 配音 | voice | 257 | 使用ACGN相关画面或台本素材进行人工配音创作的内容 | [/v/douga/voice](https://www.bilibili.com/v/douga/voice) | +| 手办·模玩 | garage_kit | 210 | 手办模玩的测评、改造或其他衍生内容 | [/v/douga/garage_kit](https://www.bilibili.com/v/douga/garage_kit) | +| 特摄 | tokusatsu | 86 | 特摄相关衍生视频 | [/v/douga/tokusatsu](https://www.bilibili.com/v/douga/tokusatsu) | +| 动漫杂谈 | acgntalks | 253 | 以谈话形式对ACGN文化圈进行的鉴赏、吐槽、评点、解说、推荐、科普等内容 | [/v/douga/acgntalks](https://www.bilibili.com/v/douga/acgntalks) | +| 综合 | other | 27 | 以动画及动画相关内容为素材,包括但不仅限于音频替换、恶搞改编、排行榜等内容 | [/v/douga/other](https://www.bilibili.com/v/douga/other) | + +## 番剧 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------|-------------|-----|---------------------------|----------------------------------------------------------------------| +| 番剧(主分区) | anime | 13 | | [/anime](https://www.bilibili.com/anime) | +| 资讯 | information | 51 | 动画番剧相关资讯视频 | [/v/anime/information](https://www.bilibili.com/v/anime/information) | +| 官方延伸 | offical | 152 | 动画番剧为主题的宣传节目、采访视频,及声优相关视频 | [/v/anime/offical](https://www.bilibili.com/v/anime/offical) | +| 完结动画 | finish | 32 | 已完结的动画番剧合集 | [/v/anime/finish](https://www.bilibili.com/v/anime/finish) | +| 连载动画 | serial | 33 | 当季连载的动画番剧 | [/v/anime/serial](https://www.bilibili.com/v/anime/serial) | + +## 国创 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------|-------------|-----|------------|------------------------------------------------------------------------------| +| 国创(主分区) | guochuang | 167 | | [/guochuang](https://www.bilibili.com/guochuang) | +| 国产动画 | chinese | 153 | 我国出品的PGC动画 | [/v/guochuang/chinese](https://www.bilibili.com/v/guochuang/chinese) | +| 国产原创相关 | original | 168 | | [/v/guochuang/original](https://www.bilibili.com/v/guochuang/original) | +| 布袋戏 | puppetry | 169 | | [/v/guochuang/puppetry](https://www.bilibili.com/v/guochuang/puppetry) | +| 资讯 | information | 170 | | [/v/guochuang/information](https://www.bilibili.com/v/guochuang/information) | +| 动态漫·广播剧 | motioncomic | 195 | | [/v/guochuang/motioncomic](https://www.bilibili.com/v/guochuang/motioncomic) | + +## 音乐 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------------|----------------|---------|----------------------------------------------------------|--------------------------------------------------------------------| +| 音乐(主分区) | music | 3 | | [/v/music](https://www.bilibili.com/v/music) | +| 原创音乐 | original | 28 | 原创歌曲及纯音乐,包括改编、重编曲及remix | [/v/music/original](https://www.bilibili.com/v/music/original) | +| 音乐现场 | live | 29 | 音乐表演的实况视频,包括官方的综艺节目、音乐剧、音乐节、演唱会、打歌舞台现场等,以及个人演出/街头表演现场等 | [/v/music/live](https://www.bilibili.com/v/music/live) | +| 翻唱 | cover | 31 | 对曲目的人声再演绎视频 | [/v/music/cover](https://www.bilibili.com/v/music/cover) | +| 演奏 | perform | 59 | 乐器和非传统乐器器材的演奏作品 | [/v/music/perform](https://www.bilibili.com/v/music/perform) | +| 乐评盘点 | commentary | 243 | 音乐类新闻、盘点、点评、reaction、榜单、采访、幕后故事、唱片开箱等 | [/v/music/commentary](https://www.bilibili.com/v/music/commentary) | +| VOCALOID·UTAU | vocaloid | 30 | 以VOCALOID等歌声合成引擎为基础,运用各类音源进行的创作 | [/v/music/vocaloid](https://www.bilibili.com/v/music/vocaloid) | +| MV | mv | 193 | 为音乐作品配合拍摄或制作的音乐录影带(Music Video),以及自制拍摄、剪辑、翻拍MV | [/v/music/mv](https://www.bilibili.com/v/music/mv) | +| 音乐粉丝饭拍 | fan_videos | 266 | 在音乐演出现场由粉丝团体或个人拍摄的非官方记录视频,包括但不限于粉丝自制饭拍、直拍、Vlog以及衍生的内容混剪等 | [/v/music/fan_videos](https://www.bilibili.com/v/music/fan_videos) | +| AI音乐 | ai_music | 265 | 以AI合成技术为基础,运用各类工具进行的AI作编曲、AI作词、AI语音、AI变声、AI翻唱、AI MV等创作 | [/v/music/ai_music](https://www.bilibili.com/v/music/ai_music) | +| 电台 | radio | 267 | 音乐分享、播单、白噪音、有声读物等以听为主的播放内容 | [/v/music/radio](https://www.bilibili.com/v/music/radio) | +| 音乐教学 | tutorial | 244 | 以音乐教学为目的的内容 | [/v/music/tutorial](https://www.bilibili.com/v/music/tutorial) | +| 音乐综合 | other | 130 | 所有无法被收纳到其他音乐二级分区的音乐类视频 | [/v/music/other](https://www.bilibili.com/v/music/other) | +| ~~电音~~(已下线) | ~~electronic~~ | ~~194~~ | ~~以电子合成器、音乐软体等产生的电子声响制作的音乐~~ | ~~/v/music/electronic~~ | + +## 舞蹈 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|-------------------------|----------|-----|--------------------------------------|----------------------------------------------------------------| +| 舞蹈(主分区) | dance | 129 | | [/v/dance](https://www.bilibili.com/v/dance) | +| 宅舞 | otaku | 20 | 与ACG相关的翻跳、原创舞蹈 | [/v/dance/otaku](https://www.bilibili.com/v/dance/otaku) | +| 街舞 | hiphop | 198 | 收录街舞相关内容,包括赛事现场、舞室作品、个人翻跳、FREESTYLE等 | [/v/dance/hiphop](https://www.bilibili.com/v/dance/hiphop) | +| 明星舞蹈 | star | 199 | 国内外明星发布的官方舞蹈及其翻跳内容 | [/v/dance/star](https://www.bilibili.com/v/dance/star) | +| 国风舞蹈 | china | 200 | 收录国风向舞蹈内容,包括中国舞、民族民间舞、汉唐舞、国风爵士等 | [/v/dance/china](https://www.bilibili.com/v/dance/china) | +| 颜值·网红舞
(~~原手势·网红舞~~) | gestures | 255 | 手势舞及网红流行舞蹈、短视频舞蹈等相关视频 | [/v/dance/gestures](https://www.bilibili.com/v/dance/gestures) | +| 舞蹈综合 | three_d | 154 | 收录无法定义到其他舞蹈子分区的舞蹈视频 | [/v/dance/three_d](https://www.bilibili.com/v/dance/three_d) | +| 舞蹈教程 | demo | 156 | 镜面慢速,动作分解,基础教程等具有教学意义的舞蹈视频 | [/v/dance/demo](https://www.bilibili.com/v/dance/demo) | + +## 游戏 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------|-------------|-----|---------------------------------------------------------------|--------------------------------------------------------------------| +| 游戏(主分区) | game | 4 | | [/v/game](https://www.bilibili.com/v/game) | +| 单机游戏 | stand_alone | 17 | 以所有平台(PC、主机、移动端)的单机或联机游戏为主的视频内容,包括游戏预告、CG、实况解说及相关的评测、杂谈与视频剪辑等 | [/v/game/stand_alone](https://www.bilibili.com/v/game/stand_alone) | +| 电子竞技 | esports | 171 | 具有高对抗性的电子竞技游戏项目,其相关的赛事、实况、攻略、解说、短剧等视频。 | [/v/game/esports](https://www.bilibili.com/v/game/esports) | +| 手机游戏 | mobile | 172 | 以手机及平板设备为主要平台的游戏,其相关的实况、攻略、解说、短剧、演示等视频。 | [/v/game/mobile](https://www.bilibili.com/v/game/mobile) | +| 网络游戏 | online | 65 | 由网络运营商运营的多人在线游戏,以及电子竞技的相关游戏内容。包括赛事、攻略、实况、解说等相关视频 | [/v/game/online](https://www.bilibili.com/v/game/online) | +| 桌游棋牌 | board | 173 | 桌游、棋牌、卡牌对战等及其相关电子版游戏的实况、攻略、解说、演示等视频。 | [/v/game/board](https://www.bilibili.com/v/game/board) | +| GMV | gmv | 121 | 由游戏素材制作的MV视频。以游戏内容或CG为主制作的,具有一定创作程度的MV类型的视频 | [/v/game/gmv](https://www.bilibili.com/v/game/gmv) | +| 音游 | music | 136 | 各个平台上,通过配合音乐与节奏而进行的音乐类游戏视频 | [/v/game/music](https://www.bilibili.com/v/game/music) | +| Mugen | mugen | 19 | 以Mugen引擎为平台制作、或与Mugen相关的游戏视频 | [/v/game/mugen](https://www.bilibili.com/v/game/mugen) | + +## 知识 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|-----------------------------|-------------------|--------|-----------------------------|----------------------------------------------------------------------------------------| +| 知识(主分区) | knowledge | 36 | | [/v/knowledge](https://www.bilibili.com/v/knowledge) | +| 科学科普 | science | 201 | 回答你的十万个为什么 | [/v/knowledge/science](https://www.bilibili.com/v/knowledge/science) | +| 社科·法律·心理(~~原社科人文、原趣味科普人文~~) | social_science | 124 | 基于社会科学、法学、心理学展开或个人观点输出的知识视频 | [/v/knowledge/social_science](https://www.bilibili.com/v/knowledge/social_science) | +| 人文历史 | humanity_history | 228 | 看看古今人物,聊聊历史过往,品品文学典籍 | [/v/knowledge/humanity_history](https://www.bilibili.com/v/knowledge/humanity_history) | +| 财经商业 | business | 207 | 说金融市场,谈宏观经济,一起畅聊商业故事 | [/v/knowledge/finance](https://www.bilibili.com/v/knowledge/finance) | +| 校园学习 | campus | 208 | 老师很有趣,学生也有才,我们一起搞学习 | [/v/knowledge/campus](https://www.bilibili.com/v/knowledge/campus) | +| 职业职场 | career | 209 | 职业分享、升级指南,一起成为最有料的职场人 | [/v/knowledge/career](https://www.bilibili.com/v/knowledge/career) | +| 设计·创意 | design | 229 | 天马行空,创意设计,都在这里 | [/v/knowledge/design](https://www.bilibili.com/v/knowledge/design) | +| 野生技术协会 | skill | 122 | 技能党集合,是时候展示真正的技术了 | [/v/knowledge/skill](https://www.bilibili.com/v/knowledge/skill) | +| ~~演讲·公开课~~(已下线) | ~~speech_course~~ | ~~39~~ | ~~涨知识的好地方,给爱学习的你~~ | ~~/v/technology/speech_course~~ | +| ~~星海~~(已下线) | ~~military~~ | ~~96~~ | ~~军事类内容的圣地~~ | ~~/v/technology/military~~ | +| ~~机械~~(已下线) | ~~mechanical~~ | ~~98~~ | ~~机械设备展示或制作视频~~ | ~~/v/technology/mechanical~~ | + +## 科技 + +新:旧: + +~~原数码分区~~ + +| 名称 | 代号 | tid | 简介 | url路由 | +|----------------------|---------------------|---------|----------------------------------|------------------------------------------------------------------------| +| 科技(主分区) | tech | 188 | | [/v/tech](https://www.bilibili.com/v/tech) | +| 数码(~~原手机平板~~) | digital | 95 | 科技数码产品大全,一起来做发烧友 | [/v/tech/digital](https://www.bilibili.com/v/tech/digital) | +| 软件应用 | application | 230 | 超全软件应用指南 | [/v/tech/application](https://www.bilibili.com/v/tech/application) | +| 计算机技术 | computer_tech | 231 | 研究分析、教学演示、经验分享......有关计算机技术的都在这里 | [/v/tech/computer_tech](https://www.bilibili.com/v/tech/computer_tech) | +| 科工机械 (~~原工业·工程·机械~~) | industry | 232 | 从小芯片到大工程,一起见证科工力量 | [/v/tech/industry](https://www.bilibili.com/v/tech/industry) | +| 极客DIY | diy | 233 | 炫酷技能,极客文化,硬核技巧,准备好你的惊讶 | [/v/tech/diy](https://www.bilibili.com/v/tech/diy) | +| ~~电脑装机~~(已下线) | ~~pc~~ | ~~189~~ | ~~电脑、笔记本、装机配件、外设和软件教程等相关视频~~ | ~~/v/digital/pc~~ | +| ~~摄影摄像~~(已下线) | ~~photography~~ | ~~190~~ | ~~摄影摄像器材、拍摄剪辑技巧、拍摄作品分享等相关视频~~ | ~~/v/digital/photography~~ | +| ~~影音智能~~(已下线) | ~~intelligence_av~~ | ~~191~~ | ~~影音设备、智能产品等相关视频~~ | ~~/v/digital/intelligence_av~~ | + +## 运动 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------|---------------|-----|--------------------------------------------------------|----------------------------------------------------------------------------| +| 运动(主分区) | sports | 234 | | [/v/sports](https://www.bilibili.com/v/sports) | +| 篮球 | basketball | 235 | 与篮球相关的视频,包括但不限于篮球赛事、教学、评述、剪辑、剧情等相关内容 | [/v/sports/basketball](https://www.bilibili.com/v/sports/basketball) | +| 足球 | football | 249 | 与足球相关的视频,包括但不限于足球赛事、教学、评述、剪辑、剧情等相关内容 | [/v/sports/football](https://www.bilibili.com/v/sports/football) | +| 健身 | aerobics | 164 | 与健身相关的视频,包括但不限于瑜伽、CrossFit、健美、力量举、普拉提、街健等相关内容 | [/v/sports/aerobics](https://www.bilibili.com/v/sports/aerobics) | +| 竞技体育 | athletic | 236 | 与竞技体育相关的视频,包括但不限于乒乓、羽毛球、排球、赛车等竞技项目的赛事、评述、剪辑、剧情等相关内容 | [/v/sports/culture](https://www.bilibili.com/v/sports/culture) | +| 运动文化 | culture | 237 | 与运动文化相关的视频,包络但不限于球鞋、球衣、球星卡等运动衍生品的分享、解读,体育产业的分析、科普等相关内容 | [/v/sports/culture](https://www.bilibili.com/v/sports/culture) | +| 运动综合 | comprehensive | 238 | 与运动综合相关的视频,包括但不限于钓鱼、骑行、滑板等日常运动分享、教学、Vlog等相关内容 | [/v/sports/comprehensive](https://www.bilibili.com/v/sports/comprehensive) | + +## 汽车 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------------|------------------|---------|---------------------------------------------------------------|----------------------------------------------------------------------------| +| 汽车(主分区) | car | 223 | | [/v/car](https://www.bilibili.com/v/car) | +| 汽车知识科普 | knowledge | 258 | 关于汽车技术与文化的硬核科普,以及生活中学车、用车、养车的相关知识 | [/v/car/knowledge](https://www.bilibili.com/v/car/knowledge) | +| 购车攻略 | strategy | 227 | 丰富详实的购车建议和新车体验 | [/v/car/strategy](https://www.bilibili.com/v/car/strategy) | +| 新能源车 | newenergyvehicle | 247 | 新能源汽车相关内容,包括电动汽车、混合动力汽车等车型种类,包含不限于新车资讯、试驾体验、专业评测、技术解读、知识科普等内容 | [/v/car/newenergyvehicle](https://www.bilibili.com/v/car/newenergyvehicle) | +| 赛车 | racing | 245 | F1等汽车运动相关 | [/v/car/racing](https://www.bilibili.com/v/car/racing) | +| 改装玩车 | modifiedvehicle | 246 | 汽车文化及改装车相关内容,包括改装车、老车修复介绍、汽车聚会分享等内容 | [/v/car/modifiedvehicle](https://www.bilibili.com/v/car/modifiedvehicle) | +| 摩托车 | motorcycle | 240 | 骑士们集合啦 | [/v/car/motorcycle](https://www.bilibili.com/v/car/motorcycle) | +| 房车 | touringcar | 248 | 房车及营地相关内容,包括不限于产品介绍、驾驶体验、房车生活和房车旅行等内容 | [/v/car/touringcar](https://www.bilibili.com/v/car/touringcar) | +| 汽车生活 | life | 176 | 分享汽车及出行相关的生活体验类视频 | [/v/car/life](https://www.bilibili.com/v/car/life) | +| ~~汽车文化~~(已下线) | ~~culture~~ | ~~224~~ | ~~车迷的精神圣地,包括汽车赛事、品牌历史、汽车改装、经典车型和汽车模型等~~ | ~~/v/car/culture~~ | +| ~~汽车极客~~(已下线) | ~~geek~~ | ~~225~~ | ~~汽车硬核达人聚集地,包括DIY造车、专业评测和技术知识分享~~ | ~~/v/car/geek~~ | +| ~~智能出行~~(已下线) | ~~smart~~ | ~~226~~ | ~~探索新能源汽车和未来智能出行的前沿阵地~~ | ~~/v/car/smart~~ | + +## 生活 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|--------------|----------------|---------|-----------------------------------|----------------------------------------------------------------| +| 生活(主分区) | life | 160 | | [/v/life](https://www.bilibili.com/v/life) | +| 搞笑 | funny | 138 | 各种沙雕有趣的搞笑剪辑,挑战,表演,配音等视频 | [/v/life/funny](https://www.bilibili.com/v/life/funny) | +| 亲子 | parenting | 254 | 分享亲子、萌娃、母婴、育儿相关的视频 | [/v/life/parenting](https://www.bilibili.com/v/life/parenting) | +| 出行 | travel | 250 | 为达到观光游览、休闲娱乐为目的的远途旅行、中近途户外生活、本地探店 | [/v/life/travel](https://www.bilibili.com/v/life/travel) | +| 三农 | rurallife | 251 | 分享美好农村生活 | [/v/life/rurallife](https://www.bilibili.com/v/life/rurallife) | +| 家居房产 | home | 239 | 与买房、装修、居家生活相关的分享 | [/v/life/home](https://www.bilibili.com/v/life/home) | +| 手工 | handmake | 161 | 手工制品的制作过程或成品展示、教程、测评类视频 | [/v/life/handmake](https://www.bilibili.com/v/life/handmake) | +| 绘画 | painting | 162 | 绘画过程或绘画教程,以及绘画相关的所有视频 | [/v/life/painting](https://www.bilibili.com/v/life/painting) | +| 日常 | daily | 21 | 记录日常生活,分享生活故事 | [/v/life/daily](https://www.bilibili.com/v/life/daily) | +| ~~美食圈~~(重定向) | ~~food~~ | ~~76~~ | ~~美食鉴赏&料理制作教程~~ | ~~/v/life/food~~ | +| ~~动物圈~~(重定向) | ~~animal~~ | ~~75~~ | ~~萌萌的动物都在这里哦~~ | ~~/v/life/animal~~ | +| ~~运动~~(重定向) | ~~sports~~ | ~~163~~ | ~~运动相关的记录、教程、装备评测和精彩瞬间剪辑视频~~ | ~~/v/life/sports~~ | +| ~~汽车~~(重定向) | ~~automobile~~ | ~~176~~ | ~~专业汽车资讯,分享车生活~~ | ~~/v/life/automobile~~ | +| ~~其他~~(已下线) | ~~other~~ | ~~174~~ | ~~对于分区归属不明的视频进行归纳整合的特定分区~~ | ~~/v/life/other~~ | + +## 美食 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|------------------------|-------------|-----|------------------|--------------------------------------------------------------------| +| 美食(主分区) | food | 211 | | [/v/food](https://www.bilibili.com/v/food) | +| 美食制作(~~原[生活]->[美食圈]~~) | make | 76 | 学做人间美味,展示精湛厨艺 | [/v/food/make](https://www.bilibili.com/v/food/make) | +| 美食侦探 | detective | 212 | 寻找美味餐厅,发现街头美食 | [/v/food/detective](https://www.bilibili.com/v/food/detective) | +| 美食测评 | measurement | 213 | 吃货世界,品尝世间美味 | [/v/food/measurement](https://www.bilibili.com/v/food/measurement) | +| 田园美食 | rural | 214 | 品味乡野美食,寻找山与海的味道 | [/v/food/rural](https://www.bilibili.com/v/food/rural) | +| 美食记录 | record | 215 | 记录一日三餐,给生活添一点幸福感 | [/v/food/record](https://www.bilibili.com/v/food/record) | + +## 动物圈 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|----------|------------------|-----|-------------------------------------------|----------------------------------------------------------------------------------| +| 动物圈(主分区) | animal | 217 | | [/v/animal](https://www.bilibili.com/v/animal) | +| 喵星人 | cat | 218 | 喵喵喵喵喵 | [/v/animal/cat](https://www.bilibili.com/v/animal/cat) | +| 汪星人 | dog | 219 | 汪汪汪汪汪 | [/v/animal/dog](https://www.bilibili.com/v/animal/dog) | +| 小宠异宠 | reptiles | 222 | 奇妙宠物大赏 | [/v/animal/reptiles](https://www.bilibili.com/v/animal/reptiles) | +| 野生动物 | wild_animal | 221 | 内有“猛兽”出没 | [/v/animal/wild_animal](https://www.bilibili.com/v/animal/wild_animal) | +| 动物二创 | second_edition | 220 | 解说、配音、剪辑、混剪 | [/v/animal/second_edition](https://www.bilibili.com/v/animal/second_edition) | +| 动物综合 | animal_composite | 75 | 收录除上述子分区外,其余动物相关视频以及非动物主体或多个动物主体的动物相关延伸内容 | [/v/animal/animal_composite](https://www.bilibili.com/v/animal/animal_composite) | + +## 鬼畜 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|------------|-----------------|-----|-----------------------------------------|----------------------------------------------------------------------------------| +| 鬼畜(主分区) | kichiku | 119 | | [/v/kichiku](https://www.bilibili.com/v/kichiku) | +| 鬼畜调教 | guide | 22 | 使用素材在音频、画面上做一定处理,达到与BGM一定的同步感 | [/v/kichiku/guide](https://www.bilibili.com/v/kichiku/guide) | +| 音MAD | mad | 26 | 使用素材音频进行一定的二次创作来达到还原原曲的非商业性质稿件 | [/v/kichiku/mad/v/kichiku/mad](https://www.bilibili.com/v/kichiku/mad) | +| 人力VOCALOID | manual_vocaloid | 126 | 将人物或者角色的无伴奏素材进行人工调音,使其就像VOCALOID一样歌唱的技术 | [/v/kichiku/manual_vocaloid](https://www.bilibili.com/v/kichiku/manual_vocaloid) | +| 鬼畜剧场 | theatre | 216 | 使用素材进行人工剪辑编排的有剧情的作品 | [/v/kichiku/theatre](https://www.bilibili.com/v/kichiku/theatre) | +| 教程演示 | course | 127 | 鬼畜相关的教程演示 | [/v/kichiku/course](https://www.bilibili.com/v/kichiku/course) | + +## 时尚 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|--------------|--------------|---------|---------------------------------------------|--------------------------------------------------------------------| +| 时尚(主分区) | fashion | 155 | | [/v/fashion](https://www.bilibili.com/v/fashion) | +| 美妆护肤 | makeup | 157 | 彩妆护肤、美甲美发、仿妆、医美相关内容分享或产品测评 | [/v/fashion/makeup](https://www.bilibili.com/v/fashion/makeup) | +| 仿妆cos | cos | 252 | 对二次元、三次元人物角色进行模仿、还原、展示、演绎的内容 | [/v/fashion/cos](https://www.bilibili.com/v/fashion/cos) | +| 穿搭 | clothing | 158 | 穿搭风格、穿搭技巧的展示分享,涵盖衣服、鞋靴、箱包配件、配饰(帽子、钟表、珠宝首饰)等 | [/v/fashion/clothing](https://www.bilibili.com/v/fashion/clothing) | +| 时尚潮流 | catwalk | 159 | 时尚街拍、时装周、时尚大片,时尚品牌、潮流等行业相关记录及知识科普 | [/v/fashion/catwalk](https://www.bilibili.com/v/fashion/catwalk) | +| ~~健身~~(重定向) | ~~aerobics~~ | ~~164~~ | ~~器械、有氧、拉伸运动等,以达到强身健体、减肥瘦身、形体塑造目的~~ | ~~/v/fashion/aerobics~~ | +| ~~风尚标~~(已下线) | ~~trends~~ | ~~192~~ | ~~时尚明星专访、街拍、时尚购物相关知识科普~~ | ~~/v/fashion/trends~~ | + +## 资讯 + +**注:该分区无排名功能** + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------|-------------|-----|------------------------|----------------------------------------------------------------------------| +| 资讯(主分区) | information | 202 | | [/v/information](https://www.bilibili.com/v/information) | +| 热点 | hotspot | 203 | 全民关注的时政热门资讯 | [/v/information/hotspot](https://www.bilibili.com/v/information/hotspot) | +| 环球 | global | 204 | 全球范围内发生的具有重大影响力的事件动态 | [/v/information/global](https://www.bilibili.com/v/information/global) | +| 社会 | social | 205 | 日常生活的社会事件、社会问题、社会风貌的报道 | [/v/information/social](https://www.bilibili.com/v/information/social) | +| 综合 | multiple | 206 | 除上述领域外其它垂直领域的综合资讯 | [/v/information/multiple](https://www.bilibili.com/v/information/multiple) | + +## 广告 + + + +**该分区已下线** + +| 名称 | 代号 | tid | 简介 | url路由 | +|-------------|--------|---------|-----|--------------| +| ~~广告(主分区)~~ | ~~ad~~ | ~~165~~ | | ~~/v/ad~~ | +| ~~广告~~(已下线) | ~~ad~~ | ~~166~~ | | ~~/v/ad/ad~~ | + +## 娱乐 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|-----------------------|--------------------|---------|------------------------------------------|--------------------------------------------------------------------------------| +| 娱乐(主分区) | ent | 5 | | [/v/ent](https://www.bilibili.com/v/ent) | +| 娱乐杂谈 | talker | 241 | 娱乐人物解读、娱乐热点点评、娱乐行业分析 | [/v/ent/talker](https://www.bilibili.com/v/ent/talker) | +| CP安利 | cp_recommendation | 262 | 以安利各类娱乐名人、角色CP之间默契于火花为主题的混剪、解说,观点表达类视频 | [/v/ent/cp_recommendation](https://www.bilibili.com/v/ent/cp_recommendation) | +| 颜值安利 | beauty | 263 | 以各类娱乐名人、角色的颜值、气质魅力为核心的混剪视频 | [/v/ent/beauty](https://www.bilibili.com/v/ent/beauty) | +| 娱乐粉丝创作
(~~原粉丝创作~~) | fans | 242 | 粉丝向创作视频 | [/v/ent/fans](https://www.bilibili.com/v/ent/fans) | +| 娱乐资讯 | entertainment_news | 264 | 具备趣味价值的文化娱乐新闻与动态报道,如名人动态,作品发布,舞台演出,趣闻盘点等 | [/v/ent/entertainment_news](https://www.bilibili.com/v/ent/entertainment_news) | +| 明星综合 | celebrity | 137 | 娱乐圈动态、明星资讯相关 | [/v/ent/celebrity](https://www.bilibili.com/v/ent/celebrity) | +| 综艺 | variety | 71 | 所有综艺相关,全部一手掌握! | [/v/ent/variety](https://www.bilibili.com/v/ent/variety) | +| ~~Korea相关~~(已下线) | ~~korea~~ | ~~131~~ | ~~Korea相关音乐、舞蹈、综艺等视频~~ | ~~/v/ent/korea~~ | + +## 影视 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------|---------------|-----|-------------------------------|----------------------------------------------------------------------------------| +| 影视(主分区) | cinephile | 181 | | [/v/cinephile](https://www.bilibili.com/v/cinephile) | +| 影视杂谈 | cinecism | 182 | 影视评论、解说、吐槽、科普等 | [/v/cinephile/cinecism](https://www.bilibili.com/v/cinephile/cinecism) | +| 影视剪辑 | montage | 183 | 对影视素材进行剪辑再创作的视频 | [/v/cinephile/montage](https://www.bilibili.com/v/cinephile/montage) | +| 影视整活 | mashup | 260 | 使用影视素材制造的有趣、有梗的创意混剪、配音、特效玩梗视频 | [/v/cinephile/mashup](https://www.bilibili.com/v/cinephile/mashup) | +| AI影像 | ai_imaging | 259 | 分享AI制作的影像作品、创作历程、技术风向 | [/v/cinephile/ai_imaging](https://www.bilibili.com/v/cinephile/ai_imaging) | +| 预告·资讯 | trailer_info | 184 | 影视类相关资讯,预告,花絮等视频 | [/v/cinephile/trailer_info](https://www.bilibili.com/v/cinephile/trailer_info) | +| 小剧场 | shortplay | 85 | 有场景、有剧情的演绎类内容 | [/v/cinephile/shortplay](https://www.bilibili.com/v/cinephile/shortplay) | +| 短片 | shortfilm | 256 | 各种类型的短片 | [/v/cinephile/shortfilm](https://www.bilibili.com/v/cinephile/shortfilm) | +| 影视综合 | comprehensive | 261 | 一切无法被收纳其他影视二级分区的影视相关内容 | [/v/cinephile/comprehensive](https://www.bilibili.com/v/cinephile/comprehensive) | + +## 纪录片 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|----------|-------------|-----|----|----------------------------------------------------------------------------| +| 纪录片(主分区) | documentary | 177 | | [/documentary](https://www.bilibili.com/documentary) | +| 人文·历史 | history | 37 | | [/v/documentary/history](https://www.bilibili.com/v/documentary/history) | +| 科学·探索·自然 | science | 178 | | [/v/documentary/science](https://www.bilibili.com/v/documentary/science) | +| 军事 | military | 179 | | [/v/documentary/military](https://www.bilibili.com/v/documentary/military) | +| 社会·美食·旅行 | travel | 180 | | [/v/documentary/travel](https://www.bilibili.com/v/documentary/travel) | + +## 电影 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|---------|---------|-----|-----|--------------------------------------------------------------| +| 电影(主分区) | movie | 23 | | [/movie](https://www.bilibili.com/movie) | +| 华语电影 | chinese | 147 | | [/v/movie/chinese](https://www.bilibili.com/v/movie/chinese) | +| 欧美电影 | west | 145 | | [/v/movie/west](https://www.bilibili.com/v/movie/west) | +| 日本电影 | japan | 146 | | [/v/movie/japan](https://www.bilibili.com/v/movie/japan) | +| 其他国家 | movie | 83 | | [/v/movie/movie](https://www.bilibili.com/v/movie/movie) | + +## 电视剧 + + + +| 名称 | 代号 | tid | 简介 | url路由 | +|----------|----------|-----|-----|----------------------------------------------------------| +| 电视剧(主分区) | tv | 11 | | [/tv](https://www.bilibili.com/tv) | +| 国产剧 | mainland | 185 | | [/v/tv/mainland](https://www.bilibili.com/v/tv/mainland) | +| 海外剧 | overseas | 187 | | [/v/tv/overseas](https://www.bilibili.com/v/tv/overseas) | diff --git a/docs/video/video_zone_v2.md b/docs/video/video_zone_v2.md new file mode 100644 index 0000000..247c122 --- /dev/null +++ b/docs/video/video_zone_v2.md @@ -0,0 +1,458 @@ +# 视频分区一览 (v2) + +本文档中的内容适用于 `tid_v2`(部分接口写为 `tidv2`)、`tname_v2`(部分接口写为 `tnamev2`)等字段,关于 `tid`、`tname` 等字段请参阅 “[视频分区一览](./video_zone.md)” 文档 + +目前 B 站尚未启用子分区 + +## 动画 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ----------- | ---- | --------- | ---------------------------------------------- | +| 动画 (主分区) | douga | 1005 | 7 | [/c/douga/](https://www.bilibili.com/c/douga/) | +| 同人动画 | fan_anime | 2037 | | | +| 模玩周边 | garage_kit | 2038 | | | +| cosplay | cosplay | 2039 | | | +| 二次元线下 | offline | 2040 | | | +| 动漫剪辑 | editing | 2041 | | | +| 动漫评论 | commentary | 2042 | | | +| 动漫速读 | quick_view | 2043 | | | +| 动漫配音 | voice | 2044 | | | +| 动漫资讯 | information | 2045 | | | +| 网文解读 | interpret | 2046 | | | +| 虚拟up主 | vup | 2047 | | | +| 特摄 | tokusatsu | 2048 | | | +| 布袋戏 | puppetry | 2049 | | | +| 漫画·动态漫 | comic | 2050 | | | +| 广播剧 | motion | 2051 | | | +| 动漫reaction | reaction | 2052 | | | +| 动漫教学 | tutorial | 2053 | | | +| 二次元其他 | other | 2054 | | | + +## 游戏 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| -------------- | ----------- | ---- | --------- | -------------------------------------------- | +| 游戏 (主分区) | game | 1008 | 8 | [/c/game/](https://www.bilibili.com/c/game/) | +| 单人RPG游戏 | rpg | 2064 | | | +| MMORPG游戏 | mmorpg | 2065 | | | +| 单机主机类游戏 | stand_alone | 2066 | | | +| SLG游戏 | slg | 2067 | | | +| 回合制策略游戏 | tbs | 2068 | | | +| 即时策略游戏 | rts | 2069 | | | +| MOBA游戏 | moba | 2070 | | | +| 射击游戏 | stg | 2071 | | | +| 体育竞速游戏 | spg | 2072 | | | +| 动作竞技游戏 | act | 2073 | | | +| 音游舞游 | msc | 2074 | | | +| 模拟经营游戏 | sim | 2075 | | | +| 女性向游戏 | otome | 2076 | | | +| 休闲/小游戏 | puz | 2077 | | | +| 沙盒类 | sandbox | 2078 | | | +| 其他游戏 | other | 2079 | | | + +## 鬼畜 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | --------------- | ---- | --------- | -------------------------------------------------- | +| 鬼畜 (主分区) | kichiku | 1007 | 9 | [/c/kichiku/](https://www.bilibili.com/c/kichiku/) | +| 鬼畜调教 | guide | 2059 | | | +| 鬼畜剧场 | theatre | 2060 | | | +| 人力VOCALOID | manual_vocaloid | 2061 | | | +| 音MAD | mad | 2062 | | | +| 鬼畜综合 | other | 2063 | | | + +## 音乐 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ---------- | ---- | --------- | ---------------------------------------------- | +| 音乐 (主分区) | music | 1003 | 10 | [/c/music/](https://www.bilibili.com/c/music/) | +| 原创音乐 | original | 2016 | | | +| MV | mv | 2017 | | | +| 音乐现场 | live | 2018 | | | +| 乐迷饭拍 | fan_videos | 2019 | | | +| 翻唱 | cover | 2020 | | | +| 演奏 | perform | 2021 | | | +| VOCALOID | vocaloid | 2022 | | | +| AI音乐 | ai_music | 2023 | | | +| 电台·歌单 | radio | 2024 | | | +| 音乐教学 | tutorial | 2025 | | | +| 乐评盘点 | commentary | 2026 | | | +| 音乐综合 | other | 2027 | | | + +## 舞蹈 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | -------- | ---- | --------- | ---------------------------------------------- | +| 舞蹈 (主分区) | dance | 1004 | 11 | [/c/dance/](https://www.bilibili.com/c/dance/) | +| 宅舞 | otaku | 2028 | | | +| 街舞 | hiphop | 2029 | | | +| 颜值·网红舞 | gestures | 2030 | | | +| 明星舞蹈 | star | 2031 | | | +| 国风舞蹈 | china | 2032 | | | +| 舞蹈教学 | tutorial | 2033 | | | +| 芭蕾舞 | ballet | 2034 | | | +| wota艺 | wota | 2035 | | | +| 舞蹈综合 | other | 2036 | | | + +## 影视 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ----------- | ---- | --------- | ------------------------------------------------------ | +| 影视 (主分区) | cinephile | 1001 | 12 | [/c/cinephile/](https://www.bilibili.com/c/cinephile/) | +| 影视解读 | commentary | 2001 | | | +| 影视剪辑 | montage | 2002 | | | +| 影视资讯 | information | 2003 | | | +| 影视正片搬运 | porterage | 2004 | | | +| 短剧短片 | shortfilm | 2005 | | | +| AI影视 | ai | 2006 | | | +| 影视reaction | reaction | 2007 | | | +| 影视综合 | other | 2008 | | | + +## 娱乐 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ----------- | ---- | --------- | ------------------------------------------ | +| 娱乐 (主分区) | ent | 1002 | 13 | [/c/ent/](https://www.bilibili.com/c/ent/) | +| 娱乐评论 | commentary | 2009 | | | +| 明星剪辑 | montage | 2010 | | | +| 娱乐饭拍&现场 | fans_video | 2011 | | | +| 娱乐资讯 | information | 2012 | | | +| 娱乐reaction | reaction | 2013 | | | +| 娱乐综艺正片 | variety | 2014 | | | +| 娱乐综合 | other | 2015 | | | + +## 知识 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| -------------- | ------------------ | ---- | --------- | ------------------------------------------------------ | +| 知识 (主分区) | knowledge | 1010 | 14 | [/c/knowledge/](https://www.bilibili.com/c/knowledge/) | +| 应试教育 | exam | 2084 | | | +| 非应试语言学习 | lang_skill | 2085 | | | +| 大学专业知识 | campus | 2086 | | | +| 商业财经 | business | 2087 | | | +| 社会观察 | social_observation | 2088 | | | +| 时政解读 | politics | 2089 | | | +| 人文历史 | humanity_history | 2090 | | | +| 设计艺术 | design | 2091 | | | +| 心理杂谈 | psychology | 2092 | | | +| 职场发展 | career | 2093 | | | +| 科学科普 | science | 2094 | | | +| 其他知识杂谈 | other | 2095 | | | + +## 科技数码 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | ----------- | ---- | --------- | -------------------------------------------- | +| 科技数码 (主分区) | tech | 1012 | 15 | [/c/tech/](https://www.bilibili.com/c/tech/) | +| 电脑 | computer | 2099 | | | +| 手机 | phone | 2100 | | | +| 平板电脑 | pad | 2101 | | | +| 摄影摄像 | photography | 2102 | | | +| 工程机械 | machine | 2103 | | | +| 自制发明/设备 | create | 2104 | | | +| 科技数码综合 | other | 2105 | | | + +## 资讯 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ----------- | ---- | --------- | ---------------------------------------------------------- | +| 资讯 (主分区) | information | 1009 | 16 | [/c/information/](https://www.bilibili.com/c/information/) | +| 时政资讯 | politics | 2080 | | | +| 海外资讯 | overseas | 2081 | | | +| 社会资讯 | social | 2082 | | | +| 综合资讯 | other | 2083 | | | + +## 美食 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ---------- | ---- | --------- | -------------------------------------------- | +| 美食 (主分区) | food | 1020 | 17 | [/c/food/](https://www.bilibili.com/c/food/) | +| 美食制作 | make | 2149 | | | +| 美食探店 | detective | 2150 | | | +| 美食测评 | commentary | 2151 | | | +| 美食记录 | record | 2152 | | | +| 美食综合 | other | 2153 | | | + +## 小剧场 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| --------------- | ---------- | ---- | --------- | ------------------------------------------------------ | +| 小剧场 (主分区) | shortplay | 1021 | 18 | [/c/shortplay/](https://www.bilibili.com/c/shortplay/) | +| 剧情演绎 | plot | 2154 | | | +| 语言类小剧场 | lang | 2155 | | | +| UP主小综艺 | up_variety | 2156 | | | +| 街头采访 | interview | 2157 | | | + +## 汽车 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ---------- | ---- | --------- | ---------------------------------------- | +| 汽车 (主分区) | car | 1013 | 19 | [/c/car](https://www.bilibili.com/c/car) | +| 汽车测评 | commentary | 2106 | | | +| 汽车文化 | culture | 2107 | | | +| 汽车生活 | life | 2108 | | | +| 汽车技术 | tech | 2109 | | | +| 汽车综合 | other | 2110 | | | + +## 时尚美妆 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | ----------- | ---- | --------- | -------------------------------------------------- | +| 时尚美妆 (主分区) | fashion | 1014 | 20 | [/c/fashion/](https://www.bilibili.com/c/fashion/) | +| 美妆 | makeup | 2111 | | | +| 护肤 | skincare | 2112 | | | +| 仿装cos | cos | 2113 | | | +| 鞋服穿搭 | outfits | 2114 | | | +| 箱包配饰 | accessories | 2115 | | | +| 珠宝首饰 | jewelry | 2116 | | | +| 三坑 | trick | 2117 | | | +| 时尚解读 | commentary | 2118 | | | +| 时尚综合 | other | 2119 | | | + +## 体育运动 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | ----------- | ---- | --------- | ------------------------------------------------ | +| 体育运动 (主分区) | sports | 1018 | 21 | [/c/sports/](https://www.bilibili.com/c/sports/) | +| 潮流运动 | trend | 2133 | | | +| 足球 | football | 2134 | | | +| 篮球 | basketball | 2135 | | | +| 跑步 | running | 2136 | | | +| 武术 | kungfu | 2137 | | | +| 格斗 | fighting | 2138 | | | +| 羽毛球 | badminton | 2139 | | | +| 体育资讯 | information | 2140 | | | +| 体育赛事 | match | 2141 | | | +| 体育综合 | other | 2142 | | | + +## 动物 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| --------------------- | -------- | ---- | --------- | ------------------------------------------------ | +| 动物 (主分区) | animal | 1024 | 22 | [/c/animal/](https://www.bilibili.com/c/animal/) | +| 猫 | cat | 2167 | | | +| 狗 | dog | 2168 | | | +| 小宠异宠 | reptiles | 2169 | | | +| 野生动物·动物解说科普 | science | 2170 | | | +| 动物综合·二创 | other | 2171 | | | + +## vlog + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ------- | ---- | --------- | -------------------------------------------- | +| vlog (主分区) | vlog | 1029 | 23 | [/c/vlog/](https://www.bilibili.com/c/vlog/) | +| 中外生活vlog | life | 2194 | | | +| 学生vlog | student | 2195 | | | +| 职业vlog | career | 2196 | | | +| 其他vlog | other | 2197 | | | + +## 绘画 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | -------- | ---- | --------- | ---------------------------------------------------- | +| 绘画 (主分区) | painting | 1006 | 24 | [/c/painting/](https://www.bilibili.com/c/painting/) | +| 二次元绘画 | acg | 2055 | | | +| 非二次元绘画 | none_acg | 2056 | | | +| 绘画学习 | tutorial | 2057 | | | +| 绘画综合 | other | 2058 | | | + +## 人工智能 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | ----------- | ---- | --------- | ---------------------------------------- | +| 人工智能 (主分区) | ai | 1011 | 25 | [/c/ai/](https://www.bilibili.com/c/ai/) | +| AI学习 | tutorial | 2096 | | | +| AI资讯 | information | 2097 | | | +| AI杂谈 | other | 2098 | | | + +## 家装房产 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | ---------- | ---- | --------- | -------------------------------------------- | +| 家装房产 (主分区) | home | 1015 | 26 | [/c/home/](https://www.bilibili.com/c/home/) | +| 买房租房 | trade | 2120 | | | +| 家庭装修 | renovation | 2121 | | | +| 家居展示 | furniture | 2122 | | | +| 家用电器 | appliances | 2123 | | | + +## 户外潮流 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | -------- | ---- | --------- | ---------------------------------------------------- | +| 户外潮流 (主分区) | outdoors | 1016 | 27 | [/c/outdoors/](https://www.bilibili.com/c/outdoors/) | +| 露营 | camping | 2124 | | | +| 徒步 | hiking | 2125 | | | +| 户外探秘 | explore | 2126 | | | +| 户外综合 | other | 2127 | | | + +## 健身 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | -------- | ---- | --------- | ------------------------------------------ | +| 健身 (主分区) | gym | 1017 | 28 | [/c/gym/](https://www.bilibili.com/c/gym/) | +| 健身科普 | science | 2128 | | | +| 健身跟练教学 | tutorial | 2129 | | | +| 健身记录 | record | 2130 | | | +| 健身身材展示 | figure | 2131 | | | +| 健身综合 | other | 2132 | | | + +## 手工 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ----------- | ---- | --------- | ---------------------------------------------------- | +| 手工 (主分区) | handmake | 1019 | 29 | [/c/handmake/](https://www.bilibili.com/c/handmake/) | +| 文具手帐 | handbook | 2143 | | | +| 轻手作 | light | 2144 | | | +| 传统手工艺 | traditional | 2145 | | | +| 解压手工 | relief | 2146 | | | +| DIY玩具 | diy | 2147 | | | +| 其他手工 | other | 2148 | | | + +## 旅游出行 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | --------- | ---- | --------- | ------------------------------------------------ | +| 旅游出行 (主分区) | travel | 1022 | 30 | [/c/travel/](https://www.bilibili.com/c/travel/) | +| 旅游记录 | record | 2158 | | | +| 旅游攻略 | strategy | 2159 | | | +| 城市出行 | city | 2160 | | | +| 公共交通 | transport | 2161 | | | + +## 三农 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | -------- | ---- | --------- | ---------------------------------------------- | +| 三农 (主分区) | rural | 1023 | 31 | [/c/rural/](https://www.bilibili.com/c/rural/) | +| 农村种植 | planting | 2162 | | | +| 赶海捕鱼 | fishing | 2163 | | | +| 打野采摘 | harvest | 2164 | | | +| 农业技术 | tech | 2165 | | | +| 农村生活 | life | 2166 | | | + +## 亲子 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ------------- | ---- | --------- | ------------------------------------------------------ | +| 亲子 (主分区) | parenting | 1025 | 32 | [/c/parenting/](https://www.bilibili.com/c/parenting/) | +| 孕产护理 | pregnant_care | 2172 | | | +| 婴幼护理 | infant_care | 2173 | | | +| 儿童才艺 | talent | 2174 | | | +| 萌娃 | cute | 2175 | | | +| 亲子互动 | interaction | 2176 | | | +| 亲子教育 | education | 2177 | | | +| 亲子综合 | other | 2178 | | | + +## 健康 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ---------- | ---- | --------- | ------------------------------------------------ | +| 健康 (主分区) | health | 1026 | 33 | [/c/health/](https://www.bilibili.com/c/health/) | +| 健康科普 | science | 2179 | | | +| 养生 | regimen | 2180 | | | +| 两性知识 | sexes | 2181 | | | +| 心理健康 | psychology | 2182 | | | +| 助眠视频·ASMR | asmr | 2183 | | | +| 医疗保健综合 | other | 2184 | | | + +## 情感 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ------------- | ------------- | ---- | --------- | -------------------------------------------------- | +| 情感 (主分区) | emotion | 1027 | 34 | [/c/emotion/](https://www.bilibili.com/c/emotion/) | +| 家庭关系 | family | 2185 | | | +| 恋爱关系 | romantic | 2186 | | | +| 人际关系 | interpersonal | 2187 | | | +| 自我成长 | growth | 2188 | | | + +## 生活兴趣 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | ----------------- | ---- | --------- | ---------------------------------------------------- | +| 生活兴趣 (主分区) | life_joy | 1030 | 35 | [/c/life_joy/](https://www.bilibili.com/c/life_joy/) | +| 休闲玩乐 | leisure | 2198 | | | +| 线下演出 | on_site | 2199 | | | +| 文玩文创 | artistic_products | 2200 | | | +| 潮玩玩具 | trendy_toys | 2201 | | | +| 兴趣综合 | other | 2202 | | | + +## 生活经验 + + + +| 名称 | 代号 | tid | channelId | url 路由 | +| ----------------- | --------------- | ---- | --------- | ------------------------------------------------------------------ | +| 生活经验 (主分区) | life_experience | 1031 | 36 | [/c/life_experience/](https://www.bilibili.com/c/life_experience/) | +| 生活技能 | skills | 2203 | | | +| 办事流程 | procedures | 2204 | | | +| 婚嫁 | marriage | 2205 | | | + +## 神秘学 (未公开) + +该分区未出现在 B 站前端的界面中,也无图标 + +| 名称 | 代号 | tid | channelId | url 路由 | +| --------------- | ----------- | ---- | --------- | ------------------------------------------------------ | +| 神秘学 (主分区) | mysticism | 1028 | 44 | [/c/mysticism/](https://www.bilibili.com/c/mysticism/) | +| 塔罗占卜 | tarot | 2189 | | | +| 星座占星 | horoscope | 2190 | | | +| 传统玄学 | metaphysics | 2191 | | | +| 疗愈成长 | healing | 2192 | | | +| 其他神秘学 | other | 2193 | | | diff --git a/docs/video/videostream_url.md b/docs/video/videostream_url.md new file mode 100644 index 0000000..304e617 --- /dev/null +++ b/docs/video/videostream_url.md @@ -0,0 +1,1128 @@ +# 视频流URL + + + +视频为 DASH 或 MP4 流媒体,需调用取流 API 传参视频 id 获取 + +## qn视频清晰度标识 + +注:该值在 DASH 格式下无效,因为 DASH 格式会取到所有分辨率的流地址 + +又注: B站对于新的视频更新了播放设置, 较高分辨率均采用 DASH, 较低分辨率与老视频还保留了 MP4, 这导致较新视频无法获取 MP4 格式的高分辨率视频, 参见 [#606](https://github.com/SocialSisterYi/bilibili-API-collect/issues/606) 或 [cv949156](https://www.bilibili.com/read/cv949156/) + +| 值 | 含义 | 备注 | +| ---- | -------------- | ------------------------------------------------------------ | +| 6 | 240P 极速 | 仅 MP4 格式支持
仅`platform=html5`时有效 | +| 16 | 360P 流畅 | | +| 32 | 480P 清晰 | | +| 64 | 720P 高清 | WEB 端默认值
~~B站前端需要登录才能选择,但是直接发送请求可以不登录就拿到 720P 的取流地址~~
**无 720P 时则为 720P60** | +| 74 | 720P60 高帧率 | 登录认证 | +| 80 | 1080P 高清 | TV 端与 APP 端默认值
登录认证 | +| 100 | 智能修复 | 人工智能增强画质
大会员认证 +| 112 | 1080P+ 高码率 | 大会员认证 | +| 116 | 1080P60 高帧率 | 大会员认证 | +| 120 | 4K 超清 | 需要`fnval&128=128`且`fourk=1`
大会员认证 | +| 125 | HDR 真彩色 | 仅支持 DASH 格式
需要`fnval&64=64`
大会员认证 | +| 126 | 杜比视界 | 仅支持 DASH 格式
需要`fnval&512=512`
大会员认证 | +| 127 | 8K 超高清 | 仅支持 DASH 格式
需要`fnval&1024=1024`
大会员认证 | + +例如:请求 1080P+ 的视频,则`qn=112` + +## fnver视频流版本标识 + +目前该值恒为 0,即`fnver=0` + +## fnval视频流格式标识 + +该代码为二进制属性位,如需组合功能需要使用`OR`运算结合一下数值 + +目前 FLV 格式已下线,应避免使用`fnval=0` + +| 值 | 含义 | 备注 | +| ---- | ------------------ | ------------------------------------------------------------ | +| ~~0~~ | ~~FLV 格式~~ | FLV 格式已下线
~~仅 H.264 编码
部分老视频存在分段现象
与 MP4、DASH 格式互斥~~ | +| 1 | MP4 格式 | 仅 H.264 编码
与 ~~FLV~~、DASH 格式互斥 | +| 16 | DASH 格式 | 与 MP4、~~FLV~~ 格式互斥 | +| 64 | 是否需求 HDR 视频 | 需求 DASH 格式
仅 H.265 编码
需要`qn=125`
大会员认证 | +| 128 | 是否需求 4K 分辨率 | 该值与`fourk`字段协同作用
需要`qn=120`
大会员认证 | +| 256 | 是否需求杜比音频 | 需求 DASH 格式
大会员认证 | +| 512 | 是否需求杜比视界 | 需求 DASH 格式
大会员认证 | +| 1024 | 是否需求 8K 分辨率 | 需求 DASH 格式
需要`qn=127`
大会员认证 | +| 2048 | 是否需求 AV1 编码 | 需求 DASH 格式 | + +例如:请求 DASH 格式,且需要 HDR 的视频流,则`fnval=16|64=80` + +## 视频编码代码 + +| 值 | 含义 | 备注 | +| ---- | ---------- | ---------------- | +| 7 | AVC 编码 | 8K 视频不支持该格式 | +| 12 | HEVC 编码 | | +| 13 | AV1 编码 | | + +## 视频伴音音质代码 + +| 值 | 含义 | +| ----- | ---- | +| 30216 | 64K | +| 30232 | 132K | +| 30280 | 192K | +| 30250 | 杜比全景声 | +| 30251 | Hi-Res无损 | + +## 获取视频流地址_web端 + +> https://api.bilibili.com/x/player/wbi/playurl + +> ~~https://api.bilibili.com/x/player/playurl~~ (旧链接) + +*请求方式:GET* + +认证方式:Cookie(SESSDATA) + +鉴权方式:[Wbi 签名](../misc/sign/wbi.md) + +--- + +关于视频流会员鉴权: + +- 获取 720P 及以上清晰度视频时需要登录(Cookie) + +- 获取高帧率(1080P60)/ 高码率(1080P+)/ HDR / 杜比视界 视频时需要有大会员的账号登录(Cookie) + +- 获取会员专属视频时需要登录(Cookie) + +- 部分特殊视频(如平台宣传片、活动视频等)不需要大会员账号认证 + +--- + +获取 url 有效时间为 120min,超时失效需要重新获取 + +~~部分视频会有分段,需要特别注意~~(FLV 格式已下线,不可能出现分段 + +若视频有分P,仅为单P视频的 url,换P则需传参对应 CID 重新获取 + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---------------- | ------------ | ------------------------------------------------------------ | +| avid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | +| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | +| cid | num | 视频 cid | 必要 | | +| qn | num | 视频清晰度选择 | 非必要 | 未登录默认 32(480P),登录后默认 64(720P)
含义见 [上表](#qn视频清晰度标识)
**DASH 格式时无效** | +| fnval | num | 视频流格式标识 | 非必要 | 默认值为`1`(MP4 格式)
含义见 [上表](#fnval视频流格式标识) | +| fnver | num | 0 | 非必要 | | +| fourk | num | 是否允许 4K 视频 | 非必要 | 画质最高 1080P:0(默认)
画质最高 4K:1 | +| session | str | | 非必要 | 从视频播放页的 HTML 中设置 window.\_\_playinfo\_\_ 处获取,或者通过 buvid3 + 当前UNIX毫秒级时间戳 经过md5获取 | +| otype | str | | 非必要 | 固定为`json` | +| type | str | | 非必要 | 目前为空 | +| platform | str | | 非必要 | pc:web播放(默认值,视频流存在 referer鉴权)
html5:移动端 HTML5 播放(仅支持 MP4 格式,无 referer 鉴权可以直接使用`video`标签播放) | +| high_quality | num | 是否高画质 | 非必要 | platform=html5时,此值为1可使画质为1080p | +| try_look | num | 未登录高画质 | 非必要 | 为 `1` 时可以不登录拉到 `64` 和 `80` 清晰度 | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ----------------------------- | -------- | ---------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
-404:无视频 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | 有效时:obj
无效时:null | 数据本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------------ | ----- | ----------------------------------------------- | ----------------------------------------------- | +| from | str | `local`? | | +| result | str | `suee`? | | +| message | str | 空? | | +| quality | num | 清晰度标识 | 含义见 [上表](#qn视频清晰度标识) | +| format | str | 视频格式 | `mp4`/`flv` | +| timelength | num | 视频长度 | 单位为毫秒
不同分辨率 / 格式可能有略微差异 | +| accept_format | str | 支持的全部格式 | 每项用`,`分隔 | +| accept_description | array | 支持的清晰度列表(文字说明) | | +| accept_quality | array | 支持的清晰度列表(代码) | 含义见 [上表](#qn视频清晰度标识) | +| video_codecid | num | 默认选择视频流的编码id | 含义见 [上表](#视频编码代码) | +| seek_param | str | `start`? | | +| seek_type | str | `offset`(DASH / FLV)?
`second`(MP4)? | | +| durl | array | 视频分段流信息 | **注:仅 FLV / MP4 格式存在此字段** | +| dash | obj | DASH 流信息 | **注:仅 DASH 格式存在此字段** | +| support_formats | array | 支持格式的详细信息 | | +| high_format | null | (?) | | +| last_play_time | num | 上次播放进度 | 毫秒值 | +| last_play_cid | num | 上次播放分P的 cid | | + +`data`中的`accept_description`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ---- | +| 0 | str | 分辨率名称1 | | +| n | str | 分辨率名称(n+1) | | +| …… | str | …… | | + +`data`中的`accept_quality`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | -------------------------------- | +| 0 | num | 分辨率代码1 | 含义见 [上表](#qn视频清晰度标识) | +| n | num | 分辨率代码(n+1) | | +| …… | num | …… | | + +`data`中的`support_formats`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ---- | +| 0 | obj | 播放格式详细信息1 | | +| n | obj | 播放格式详细信息(n+1) | | +| …… | obj | …… | | + +`support_formats`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ------ | ------------ | ---------------------------------- | +| quality | num | 视频清晰度代码 | 含义见 [上表](#qn视频清晰度标识) | +| format | str | 视频格式 | | +| new_description | str | 格式描述 | | +| display_desc | str | 格式描述 | | +| superscript | str | (?) | | +| codecs | array | 可用编码格式列表 | | + +`support_formats`中的`codecs`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | --------------- | ---- | +| 0 | str | 例:av01.0.13M.08.0.110.01.01.01.0 | 使用AV1编码 | +| 1 | str | 例子:avc1.640034 | 使用AVC编码 | +| 2 | str | 例子:hev1.1.6.L153.90 | 使用HEVC编码 | + +由于 MP4 / ~~FLV~~ 与 DASH 格式的返回结构不同,以下内容需要分类讨论`durl`与`dash`字段的内容 + + +--- + +### FLV/MP4格式 + +`data`中的`durl`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------------- | ------------------------- | +| 0 | obj | 视频分段 1 信息 | **目前由于 FLV 格式已经下线,不会存在分段现象,故无需关心** | +| n | obj | 视频分段 (n+1) 信息 | | +| …… | obj | …… | | + +`durl`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| ---------- | ------ | ------------ | ---------------------------------- | +| order | num | 视频分段序号 | 某些视频会分为多个片段(从1顺序增长) | +| length | num | 视频长度 | 单位为毫秒 | +| size | num | 视频大小 | 单位为 Byte | +| ahead | str | (?) | | +| vhead | str | (?) | | +| url | str | 默认流 URL | **注意 unicode 转义符**
有效时间为120min | +| backup_url | array | 备用视频流 | | + +`durl`数组中的对象中的`backup_url`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------------- | --------------------------------------------- | +| 0 | str | 备用流 URL 1 | **注意 unicode 转义符**
有效时间为120min | +| n | str | 备用流 URL (n+1) | | +| …… | str | …… | | + +**示例:** + +**视频无分段时:** + +获取视频`av99999999`/`BV1y7411Q7Eq`中的 1P(cid=`171776208`)的视频流 URL,清晰度为 1080P+,使用 FLV 方式获取 + +avid方式: + +```shell +curl -G 'https://api.bilibili.com/x/player/playurl' \ + --data-urlencode 'avid=99999999' \ + --data-urlencode 'cid=171776208' \ + --data-urlencode 'qn=112' \ + --data-urlencode 'fnval=0' \ + --data-urlencode 'fnver=0' \ + --data-urlencode 'fourk=1' \ + -b 'SESSDATA=xxx' +``` + + bvid方式: + +```shell +curl -G 'https://api.bilibili.com/x/player/playurl' \ + --data-urlencode 'bvid=BV1y7411Q7Eq' \ + --data-urlencode 'cid=171776208' \ + --data-urlencode 'qn=112' \ + --data-urlencode 'fnval=0' \ + --data-urlencode 'fnver=0' \ + --data-urlencode 'fourk=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "from": "local", + "result": "suee", + "message": "", + "quality": 64, + "format": "flv720", + "timelength": 283801, + "accept_format": "hdflv2,flv,flv720,flv480,mp4", + "accept_description": [ + "高清 1080P+", + "高清 1080P", + "高清 720P", + "清晰 480P", + "流畅 360P" + ], + "accept_quality": [ + 112, + 80, + 64, + 32, + 16 + ], + "video_codecid": 7, + "seek_param": "start", + "seek_type": "offset", + "durl": [ + { + "order": 1, + "length": 283801, + "size": 70486426, + "ahead": "", + "vhead": "", + "url": "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/08/62/171776208/171776208_nb2-1-64.flv?e=ig8euxZM2rNcNbNMnwdVhwdlhbK3hwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1662808778&gen=playurlv2&os=cosbv&oi=3719461929&trid=31dc1934e77141bfbdf5ae88aca0b29fu&mid=0&platform=pc&upsig=a4d5f1713e1ba313041d034a958c2414&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=0,3&agrr=1&bw=249068&logo=80000000", + "backup_url": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/08/62/171776208/171776208_nb2-1-64.flv?e=ig8euxZM2rNcNbNMnwdVhwdlhbK3hwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1662808778&gen=playurlv2&os=cosbv&oi=3719461929&trid=31dc1934e77141bfbdf5ae88aca0b29fu&mid=0&platform=pc&upsig=a4d5f1713e1ba313041d034a958c2414&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&agrr=1&bw=249068&logo=40000000", + "https://upos-sz-mirrorcosb.bilivideo.com/upgcxcode/08/62/171776208/171776208_nb2-1-64.flv?e=ig8euxZM2rNcNbNMnwdVhwdlhbK3hwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1662808778&gen=playurlv2&os=cosbbv&oi=3719461929&trid=31dc1934e77141bfbdf5ae88aca0b29fu&mid=0&platform=pc&upsig=7b8a6924948864944815ec0748cc108f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=2,3&agrr=1&bw=249068&logo=40000000" + ] + } + ], + "support_formats": [ + { + "quality": 112, + "format": "hdflv2", + "new_description": "1080P 高码率", + "display_desc": "1080P", + "superscript": "高码率", + "codecs": null + }, + { + "quality": 80, + "format": "flv", + "new_description": "1080P 高清", + "display_desc": "1080P", + "superscript": "", + "codecs": null + }, + { + "quality": 64, + "format": "flv720", + "new_description": "720P 高清", + "display_desc": "720P", + "superscript": "", + "codecs": null + }, + { + "quality": 32, + "format": "flv480", + "new_description": "480P 清晰", + "display_desc": "480P", + "superscript": "", + "codecs": null + }, + { + "quality": 16, + "format": "mp4", + "new_description": "360P 流畅", + "display_desc": "360P", + "superscript": "", + "codecs": null + } + ], + "high_format": null, + "last_play_time": 0, + "last_play_cid": 0 + } +} +``` + +
+ +**视频有分段时:** + +以下内容无参考价值,仅做历史保存 + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "from": "local", + "result": "suee", + "message": "", + "quality": 16, + "format": "flv360", + "timelength": 1437918, + "accept_format": "flv,flv720,flv480,flv360", + "accept_description": [ + "高清 1080P", + "高清 720P", + "清晰 480P", + "流畅 360P" + ], + "accept_quality": [ + 80, + 64, + 32, + 16 + ], + "video_codecid": 7, + "seek_param": "start", + "seek_type": "offset", + "durl": [ + { + "order": 1, + "length": 364417, + "size": 23018310, + "ahead": "", + "vhead": "", + "url": "http://upos-sz-mirrorhw.bilivideo.com/upgcxcode/98/24/872498/872498-1-15.flv?e=ig8euxZM2rNcNbRB7zUVhoM17WuBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=hwbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=f99db2dc9b8c65c245515b29b9ca8b16&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=80000000", + "backup_url": [ + "http://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/98/24/872498/872498-1-15.flv?e=ig8euxZM2rNcNbRB7zUVhoM17WuBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=ks3cbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=74d0d62697364346f88d9c39430ce23c&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=40000000" + ] + }, + { + "order": 2, + "length": 364395, + "size": 23694756, + "ahead": "", + "vhead": "", + "url": "http://upos-sz-mirrorcos.bilivideo.com/upgcxcode/98/24/872498/872498-2-15.flv?e=ig8euxZM2rNcNbRjhbUVhoM17bNBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=cosbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=308c87c55f3325bdaac2a3e8632948ee&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=80000000", + "backup_url": [ + "http://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/98/24/872498/872498-2-15.flv?e=ig8euxZM2rNcNbRjhbUVhoM17bNBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=ks3cbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=eb8f043e0f36f82ab9c62fd002143438&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=40000000" + ] + }, + { + "order": 3, + "length": 352333, + "size": 22835734, + "ahead": "", + "vhead": "", + "url": "http://upos-sz-mirrorhw.bilivideo.com/upgcxcode/98/24/872498/872498-3-15.flv?e=ig8euxZM2rNcNbRjhwdVhoM17bdVhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=hwbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=2685b7649f4bb6eb90f986f125432d78&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=80000000", + "backup_url": [ + "http://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/98/24/872498/872498-3-15.flv?e=ig8euxZM2rNcNbRjhwdVhoM17bdVhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=ks3cbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=922543bfb26184f901187bf9c39c69b2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=40000000" + ] + }, + { + "order": 4, + "length": 356773, + "size": 23466279, + "ahead": "", + "vhead": "", + "url": "http://upos-sz-mirrorkodo.bilivideo.com/upgcxcode/98/24/872498/872498-4-15.flv?e=ig8euxZM2rNcNbRjhbUVhoM17bNBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=kodobv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=9d29707faf012797ef2b6de21523fcf2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=80000000", + "backup_url": [ + "http://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/98/24/872498/872498-4-15.flv?e=ig8euxZM2rNcNbRjhbUVhoM17bNBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=ks3cbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=9ad4524d31c8d9695ae07b400b73ed29&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=40000000" + ] + } + ] + } +} +``` + +
+ +--- + +### DASH格式 + +`data`中的`dash`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------------- | ----- | ---------- | ------------ | +| duration | num | 视频长度 | 秒值 | +| minBufferTime | num | 1.5? | | +| min_buffer_time | num | 1.5? | | +| video | array | 视频流信息 | | +| audio | array | 伴音流信息 | 当视频没有音轨时,此项为 null | +| dolby | obj | 杜比全景声伴音信息 | | +| flac | obj | 无损音轨伴音信息 | 当视频没有无损音轨时,此项为 null | + +`dash`中的`video`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------------------- | ---- | +| 0 | obj | 视频码流 1 | 同一清晰度可拥有 H.264 / H.265 / AV1 多种码流
**HDR 仅支持 H.265** | +| n | obj | 视频码流(n+1) | | +| …… | obj | …… | | + +`dash`中的`audio`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------- | ---- | +| 0 | obj | 清晰度1 | | +| n | obj | 清晰度(n+1) | | +| …… | obj | …… | | + +`video`及`audio`数组中的对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ----- | --------------------- | ----------------------------------------------- | +| id | num | 音视频清晰度代码 | 参考上表
[qn视频清晰度标识](#qn视频清晰度标识)
[视频伴音音质代码](#视频伴音音质代码) | +| baseUrl | str | 默认流 URL | **注意 unicode 转义符**
有效时间为 120min | +| base_url | str | **同上** | | +| backupUrl | array | 备用流 URL | | +| backup_url | array | **同上** | | +| bandwidth | num | 所需最低带宽 | 单位为 Byte | +| mimeType | str | 格式 mimetype 类型 | | +| mime_type | str | **同上** | | +| codecs | str | 编码/音频类型 | eg:`avc1.640032` | +| width | num | 视频宽度 | 单位为像素
**仅视频流存在该字段** | +| height | num | 视频高度 | 单位为像素
**仅视频流存在该字段** | +| frameRate | str | 视频帧率 | **仅视频流存在该字段** | +| frame_rate | str | **同上** | | +| sar | str | Sample Aspect Ratio(单个像素的宽高比) | 音频流该值恒为空 | +| startWithSap | num | Stream Access Point(流媒体访问位点) | 音频流该值恒为空 | +| start_with_sap | num | **同上** | | +| SegmentBase | obj | 见下表 | url 对应 m4s 文件中,头部的位置
音频流该值恒为空 | +| segment_base | obj | **同上** | | +| codecid | num | 码流编码标识代码 | 含义见 [上表](#视频编码代码)
音频流该值恒为`0` | + +`video`数组中的对象中的`backup_url`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ---------------- | --------------------------------------------- | +| 0 | str | 备用流 URL 1 | **注意 unicode 转义符**
有效时间为120min | +| n | str | 备用流 URL (n+1) | | +| …… | str | …… | | + +`video`数组中的对象中的`SegmentBase`对象: + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ---- | ---------------------------- | ------------------------------------------------------------ | +| initialization | str | `${init_first}-${init_last}` | eg:`0-821`
ftyp (file type) box 加上 moov box 在 m4s 文件中的范围(单位为 bytes)
如 0-821 表示开头 820 个字节 | +| index_range | str | `${sidx_first}-${sidx_last}` | eg:`822-1309`
sidx (segment index) box 在 m4s 文件中的范围(单位为 bytes)
sidx 的核心是一个数组,记录了各关键帧的时间戳及其在文件中的位置,
其作用是索引 (拖进度条) | + +> 常规 MP4 文件的索引信息放在 moov box 中,其中包含每一帧 (不止是关键帧) 的一些信息。在 DASH 方式下,关键帧信息移到了 sidx box 里,其他的则分散到了各个 moof (movie fragment) box 中。 + +对这里的文件结构感兴趣的,可以参考标准文档 [ISO/IEC 14496-12](https://www.iso.org/standard/83102.html),如果不想那么深入的话可以百度「[MP4 文件结构](https://baike.baidu.com/item/mp4/9218018)」 + +`dash`中的`dolby`对象: + +此项为”杜比视界“视频独有 + +| 字段 | 类型 | 内容 | 备注 | +| -------------- | ---- | --------------------------------------------- | ------------------------------------------------------------ | +| type | num | 杜比音效类型 | 1:普通杜比音效
2:全景杜比音效 | +| audio | array | 杜比伴音流列表 | | + +`dolby`对象中的`audio`数组: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------------------ | ----------------------------------------------- | +| 0 | obj | 杜比伴音流信息 | 同上文 DASH 流中`video`及`audio`数组中的对象 | + +`dash`中的`flac`对象: + +| 项 | 类型 | 内容 | 备注 | +| ---- | ---- | ------------------------ | ----------------------------------------------- | +| display | bool | 是否在播放器显示切换Hi-Res无损音轨按钮 | | +| audio | obj | 音频流信息 | 同上文 DASH 流中`video`及`audio`数组中的对象 | + +**示例:** + +获取视频`av969628065`/`BV1rp4y1e745`中的 1P(cid=`244954665`)的视频流 URL,使用 DASH 方式获取 + +avid 方式: + +```shell +curl -G 'https://api.bilibili.com/x/player/playurl' \ + --data-urlencode 'avid=969628065' \ + --data-urlencode 'cid=244954665' \ + --data-urlencode 'fnval=4048' \ # 4048 为所有 dash 选项或运算的结果 + --data-urlencode 'fnver=0' \ + --data-urlencode 'fourk=1' \ + -b 'SESSDATA=xxx' +``` + + bvid 方式: + +```shell +curl -G 'https://api.bilibili.com/x/player/playurl' \ + --data-urlencode 'bvid=BV1rp4y1e745' \ + --data-urlencode 'cid=244954665' \ + --data-urlencode 'fnval=4048' \ + --data-urlencode 'fnver=0' \ + --data-urlencode 'fourk=1' \ + -b 'SESSDATA=xxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "from": "local", + "result": "suee", + "message": "", + "quality": 64, + "format": "flv720", + "timelength": 346495, + "accept_format": "hdflv2,hdflv2,flv_p60,flv,flv720,flv480,mp4", + "accept_description": [ + "真彩 HDR", + "超清 4K", + "高清 1080P60", + "高清 1080P", + "高清 720P", + "清晰 480P", + "流畅 360P" + ], + "accept_quality": [ + 125, + 120, + 116, + 80, + 64, + 32, + 16 + ], + "video_codecid": 7, + "seek_param": "start", + "seek_type": "offset", + "dash": { + "duration": 347, + "minBufferTime": 1.5, + "min_buffer_time": 1.5, + "video": [ + { + "id": 80, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026oi=3028829496\u0026tag=\u0026nbs=1\u0026gen=playurlv3\u0026uipk=5\u0026os=mcdn\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026upsig=71821c3a1f0d596b8a0f79861695de67\u0026uparams=e,og,oi,tag,nbs,gen,uipk,os,platform,trid,mid,deadline\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026oi=3028829496\u0026tag=\u0026nbs=1\u0026gen=playurlv3\u0026uipk=5\u0026os=mcdn\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026upsig=71821c3a1f0d596b8a0f79861695de67\u0026uparams=e,og,oi,tag,nbs,gen,uipk,os,platform,trid,mid,deadline\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026uipk=5\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026upsig=585675af7dc762a4d21572f939196248\u0026uparams=e,platform,trid,oi,mid,uipk,gen,os,og,deadline,tag,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026gen=playurlv3\u0026platform=pc\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026os=08cbv\u0026og=hw\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026upsig=9fc6a3e3e0eaf3847c5c0f1c32047c09\u0026uparams=e,oi,nbs,uipk,gen,platform,mid,deadline,tag,os,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026uipk=5\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026upsig=585675af7dc762a4d21572f939196248\u0026uparams=e,platform,trid,oi,mid,uipk,gen,os,og,deadline,tag,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026gen=playurlv3\u0026platform=pc\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026os=08cbv\u0026og=hw\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026upsig=9fc6a3e3e0eaf3847c5c0f1c32047c09\u0026uparams=e,oi,nbs,uipk,gen,platform,mid,deadline,tag,os,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "bandwidth": 772828, + "mimeType": "video/mp4", + "mime_type": "video/mp4", + "codecs": "hev1.1.6.L150.90", + "width": 1920, + "height": 960, + "frameRate": "30.303", + "frame_rate": "30.303", + "sar": "1:1", + "startWithSap": 1, + "start_with_sap": 1, + "SegmentBase": { + "Initialization": "0-1159", + "indexRange": "1160-2019" + }, + "segment_base": { + "initialization": "0-1159", + "index_range": "1160-2019" + }, + "codecid": 12 + }, + { + "id": 80, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1745411269\u0026uipk=5\u0026og=cos\u0026gen=playurlv3\u0026os=mcdn\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026upsig=134e6b8516a05db7ef97a18b68b94cb5\u0026uparams=e,platform,deadline,uipk,og,gen,os,trid,oi,mid,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1745411269\u0026uipk=5\u0026og=cos\u0026gen=playurlv3\u0026os=mcdn\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026upsig=134e6b8516a05db7ef97a18b68b94cb5\u0026uparams=e,platform,deadline,uipk,og,gen,os,trid,oi,mid,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026deadline=1745411269\u0026uipk=5\u0026nbs=1\u0026mid=59442895\u0026tag=\u0026upsig=d3f4bbcd7c490effdfdf0b9f8375f9a2\u0026uparams=e,platform,trid,oi,gen,os,og,deadline,uipk,nbs,mid,tag\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026gen=playurlv3\u0026os=cosbv\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026og=cos\u0026oi=3028829496\u0026deadline=1745411269\u0026upsig=584b3a331daefde16b118f612d43c1c6\u0026uparams=e,platform,gen,os,mid,tag,nbs,uipk,trid,og,oi,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026deadline=1745411269\u0026uipk=5\u0026nbs=1\u0026mid=59442895\u0026tag=\u0026upsig=d3f4bbcd7c490effdfdf0b9f8375f9a2\u0026uparams=e,platform,trid,oi,gen,os,og,deadline,uipk,nbs,mid,tag\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026gen=playurlv3\u0026os=cosbv\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026og=cos\u0026oi=3028829496\u0026deadline=1745411269\u0026upsig=584b3a331daefde16b118f612d43c1c6\u0026uparams=e,platform,gen,os,mid,tag,nbs,uipk,trid,og,oi,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "bandwidth": 1916748, + "mimeType": "video/mp4", + "mime_type": "video/mp4", + "codecs": "avc1.640032", + "width": 1920, + "height": 960, + "frameRate": "29.412", + "frame_rate": "29.412", + "sar": "1:1", + "startWithSap": 1, + "start_with_sap": 1, + "SegmentBase": { + "Initialization": "0-994", + "indexRange": "995-1854" + }, + "segment_base": { + "initialization": "0-994", + "index_range": "995-1854" + }, + "codecid": 7 + }, + { + "id": 64, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026gen=playurlv3\u0026os=mcdn\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026upsig=fcba1f000ead402f2ab2748df6e8d127\u0026uparams=e,deadline,gen,os,og,nbs,uipk,platform,trid,oi,mid,tag\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026gen=playurlv3\u0026os=mcdn\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026upsig=fcba1f000ead402f2ab2748df6e8d127\u0026uparams=e,deadline,gen,os,og,nbs,uipk,platform,trid,oi,mid,tag\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026gen=playurlv3\u0026deadline=1745411269\u0026tag=\u0026og=cos\u0026oi=3028829496\u0026os=cosbv\u0026upsig=9ab39b34d214780c30147af36a862d89\u0026uparams=e,nbs,uipk,platform,trid,mid,gen,deadline,tag,og,oi,os\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026tag=\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026upsig=bea70709fec064c8f384ee24eb5ccd1a\u0026uparams=e,oi,nbs,uipk,tag,gen,os,og,platform,trid,mid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026gen=playurlv3\u0026deadline=1745411269\u0026tag=\u0026og=cos\u0026oi=3028829496\u0026os=cosbv\u0026upsig=9ab39b34d214780c30147af36a862d89\u0026uparams=e,nbs,uipk,platform,trid,mid,gen,deadline,tag,og,oi,os\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026tag=\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026upsig=bea70709fec064c8f384ee24eb5ccd1a\u0026uparams=e,oi,nbs,uipk,tag,gen,os,og,platform,trid,mid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "bandwidth": 1236894, + "mimeType": "video/mp4", + "mime_type": "video/mp4", + "codecs": "hev1.1.6.L120.90", + "width": 1280, + "height": 640, + "frameRate": "58.824", + "frame_rate": "58.824", + "sar": "1:1", + "startWithSap": 1, + "start_with_sap": 1, + "SegmentBase": { + "Initialization": "0-1060", + "indexRange": "1061-1920" + }, + "segment_base": { + "initialization": "0-1060", + "index_range": "1061-1920" + }, + "codecid": 12 + }, + { + "id": 64, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026nbs=1\u0026uipk=5\u0026os=mcdn\u0026og=hw\u0026upsig=0b3aae3388cb52b436e591615c048007\u0026uparams=e,oi,mid,deadline,tag,gen,platform,trid,nbs,uipk,os,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026nbs=1\u0026uipk=5\u0026os=mcdn\u0026og=hw\u0026upsig=0b3aae3388cb52b436e591615c048007\u0026uparams=e,oi,mid,deadline,tag,gen,platform,trid,nbs,uipk,os,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026gen=playurlv3\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=08cbv\u0026og=hw\u0026upsig=9dc7c021d5094eab92053fc58e84a48d\u0026uparams=e,mid,deadline,tag,nbs,gen,uipk,platform,trid,oi,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026og=hw\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026os=08cbv\u0026upsig=d2a75ae893a23a5d90630725d57efe72\u0026uparams=e,trid,mid,deadline,tag,og,oi,nbs,uipk,platform,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026gen=playurlv3\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=08cbv\u0026og=hw\u0026upsig=9dc7c021d5094eab92053fc58e84a48d\u0026uparams=e,mid,deadline,tag,nbs,gen,uipk,platform,trid,oi,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026og=hw\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026os=08cbv\u0026upsig=d2a75ae893a23a5d90630725d57efe72\u0026uparams=e,trid,mid,deadline,tag,og,oi,nbs,uipk,platform,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" + ], + "bandwidth": 1222911, + "mimeType": "video/mp4", + "mime_type": "video/mp4", + "codecs": "avc1.640020", + "width": 1280, + "height": 640, + "frameRate": "62.500", + "frame_rate": "62.500", + "sar": "1:1", + "startWithSap": 1, + "start_with_sap": 1, + "SegmentBase": { + "Initialization": "0-994", + "indexRange": "995-1854" + }, + "segment_base": { + "initialization": "0-994", + "index_range": "995-1854" + }, + "codecid": 7 + }, + { + "id": 32, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026uipk=5\u0026og=cos\u0026gen=playurlv3\u0026os=mcdn\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026upsig=68bd74999864b4a96ac0dbb730b53612\u0026uparams=e,oi,uipk,og,gen,os,platform,trid,mid,deadline,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026uipk=5\u0026og=cos\u0026gen=playurlv3\u0026os=mcdn\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026upsig=68bd74999864b4a96ac0dbb730b53612\u0026uparams=e,oi,uipk,og,gen,os,platform,trid,mid,deadline,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026os=cosbv\u0026og=cos\u0026oi=3028829496\u0026mid=59442895\u0026nbs=1\u0026upsig=25c03095d15e721ca7a7e80f9e831319\u0026uparams=e,deadline,tag,gen,uipk,platform,trid,os,og,oi,mid,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026os=cosbv\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026nbs=1\u0026platform=pc\u0026gen=playurlv3\u0026og=cos\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026upsig=c879e409a7bf7995c12ae5e22cb82b97\u0026uparams=e,uipk,os,trid,oi,nbs,platform,gen,og,mid,deadline,tag\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026os=cosbv\u0026og=cos\u0026oi=3028829496\u0026mid=59442895\u0026nbs=1\u0026upsig=25c03095d15e721ca7a7e80f9e831319\u0026uparams=e,deadline,tag,gen,uipk,platform,trid,os,og,oi,mid,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026os=cosbv\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026nbs=1\u0026platform=pc\u0026gen=playurlv3\u0026og=cos\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026upsig=c879e409a7bf7995c12ae5e22cb82b97\u0026uparams=e,uipk,os,trid,oi,nbs,platform,gen,og,mid,deadline,tag\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" + ], + "bandwidth": 246476, + "mimeType": "video/mp4", + "mime_type": "video/mp4", + "codecs": "hev1.1.6.L120.90", + "width": 854, + "height": 426, + "frameRate": "30.303", + "frame_rate": "30.303", + "sar": "426:427", + "startWithSap": 1, + "start_with_sap": 1, + "SegmentBase": { + "Initialization": "0-1163", + "indexRange": "1164-2023" + }, + "segment_base": { + "initialization": "0-1163", + "index_range": "1164-2023" + }, + "codecid": 12 + }, + { + "id": 32, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026os=mcdn\u0026og=cos\u0026tag=\u0026platform=pc\u0026oi=3028829496\u0026gen=playurlv3\u0026upsig=99b3ff6929d865dafbbdf21301c3889b\u0026uparams=e,deadline,nbs,uipk,trid,mid,os,og,tag,platform,oi,gen\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026os=mcdn\u0026og=cos\u0026tag=\u0026platform=pc\u0026oi=3028829496\u0026gen=playurlv3\u0026upsig=99b3ff6929d865dafbbdf21301c3889b\u0026uparams=e,deadline,nbs,uipk,trid,mid,os,og,tag,platform,oi,gen\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026deadline=1745411269\u0026gen=playurlv3\u0026nbs=1\u0026platform=pc\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026os=cosbv\u0026og=cos\u0026upsig=2e6bf8c0c1fc96618294d917f21192e7\u0026uparams=e,uipk,trid,deadline,gen,nbs,platform,oi,mid,tag,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026mid=59442895\u0026gen=playurlv3\u0026tag=\u0026nbs=1\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=cosbv\u0026og=cos\u0026deadline=1745411269\u0026uipk=5\u0026upsig=cc07c04afd6ac07b10f46241ef4c5fbc\u0026uparams=e,platform,mid,gen,tag,nbs,trid,oi,os,og,deadline,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026deadline=1745411269\u0026gen=playurlv3\u0026nbs=1\u0026platform=pc\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026os=cosbv\u0026og=cos\u0026upsig=2e6bf8c0c1fc96618294d917f21192e7\u0026uparams=e,uipk,trid,deadline,gen,nbs,platform,oi,mid,tag,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026mid=59442895\u0026gen=playurlv3\u0026tag=\u0026nbs=1\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=cosbv\u0026og=cos\u0026deadline=1745411269\u0026uipk=5\u0026upsig=cc07c04afd6ac07b10f46241ef4c5fbc\u0026uparams=e,platform,mid,gen,tag,nbs,trid,oi,os,og,deadline,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" + ], + "bandwidth": 628803, + "mimeType": "video/mp4", + "mime_type": "video/mp4", + "codecs": "avc1.64001F", + "width": 854, + "height": 426, + "frameRate": "29.412", + "frame_rate": "29.412", + "sar": "426:427", + "startWithSap": 1, + "start_with_sap": 1, + "SegmentBase": { + "Initialization": "0-999", + "indexRange": "1000-1859" + }, + "segment_base": { + "initialization": "0-999", + "index_range": "1000-1859" + }, + "codecid": 7 + }, + { + "id": 16, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026gen=playurlv3\u0026os=mcdn\u0026tag=\u0026nbs=1\u0026upsig=cdb471486fa3908a2790ba9ef0fd0a44\u0026uparams=e,og,oi,deadline,uipk,platform,trid,mid,gen,os,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026gen=playurlv3\u0026os=mcdn\u0026tag=\u0026nbs=1\u0026upsig=cdb471486fa3908a2790ba9ef0fd0a44\u0026uparams=e,og,oi,deadline,uipk,platform,trid,mid,gen,os,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026tag=\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026oi=3028829496\u0026upsig=340b5f721a89f6dd90ae6153225cf808\u0026uparams=e,tag,trid,mid,deadline,nbs,uipk,platform,gen,os,og,oi\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026uipk=5\u0026os=08cbv\u0026platform=pc\u0026deadline=1745411269\u0026gen=playurlv3\u0026og=hw\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026upsig=e6c5646fd0e0d9cbb16296d2c8d8649f\u0026uparams=e,oi,mid,tag,nbs,uipk,os,platform,deadline,gen,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026tag=\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026oi=3028829496\u0026upsig=340b5f721a89f6dd90ae6153225cf808\u0026uparams=e,tag,trid,mid,deadline,nbs,uipk,platform,gen,os,og,oi\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026uipk=5\u0026os=08cbv\u0026platform=pc\u0026deadline=1745411269\u0026gen=playurlv3\u0026og=hw\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026upsig=e6c5646fd0e0d9cbb16296d2c8d8649f\u0026uparams=e,oi,mid,tag,nbs,uipk,os,platform,deadline,gen,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "bandwidth": 167889, + "mimeType": "video/mp4", + "mime_type": "video/mp4", + "codecs": "hev1.1.6.L120.90", + "width": 640, + "height": 320, + "frameRate": "30.303", + "frame_rate": "30.303", + "sar": "1:1", + "startWithSap": 1, + "start_with_sap": 1, + "SegmentBase": { + "Initialization": "0-1157", + "indexRange": "1158-2017" + }, + "segment_base": { + "initialization": "0-1157", + "index_range": "1158-2017" + }, + "codecid": 12 + }, + { + "id": 16, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026os=mcdn\u0026og=hw\u0026tag=\u0026upsig=93d8e429ac6dcf654df688457f138820\u0026uparams=e,oi,mid,deadline,nbs,uipk,platform,gen,trid,os,og,tag\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026os=mcdn\u0026og=hw\u0026tag=\u0026upsig=93d8e429ac6dcf654df688457f138820\u0026uparams=e,oi,mid,deadline,nbs,uipk,platform,gen,trid,os,og,tag\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026tag=\u0026upsig=87f32943e6cfcb2957f0b90e9be210f3\u0026uparams=e,mid,deadline,nbs,gen,os,og,uipk,platform,trid,oi,tag\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=1,3", + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026og=hw\u0026tag=\u0026nbs=1\u0026deadline=1745411269\u0026gen=playurlv3\u0026os=08cbv\u0026upsig=0de6ac37eecd7261cc83e9e55f438747\u0026uparams=e,uipk,platform,trid,oi,mid,og,tag,nbs,deadline,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026tag=\u0026upsig=87f32943e6cfcb2957f0b90e9be210f3\u0026uparams=e,mid,deadline,nbs,gen,os,og,uipk,platform,trid,oi,tag\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=1,3", + "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026og=hw\u0026tag=\u0026nbs=1\u0026deadline=1745411269\u0026gen=playurlv3\u0026os=08cbv\u0026upsig=0de6ac37eecd7261cc83e9e55f438747\u0026uparams=e,uipk,platform,trid,oi,mid,og,tag,nbs,deadline,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "bandwidth": 352627, + "mimeType": "video/mp4", + "mime_type": "video/mp4", + "codecs": "avc1.64001E", + "width": 640, + "height": 320, + "frameRate": "29.412", + "frame_rate": "29.412", + "sar": "1:1", + "startWithSap": 1, + "start_with_sap": 1, + "SegmentBase": { + "Initialization": "0-1002", + "indexRange": "1003-1862" + }, + "segment_base": { + "initialization": "0-1002", + "index_range": "1003-1862" + }, + "codecid": 7 + } + ], + "audio": [ + { + "id": 30232, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=59442895\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026gen=playurlv3\u0026os=mcdn\u0026og=cos\u0026upsig=c9f074f7fc113d3d06b928f74a1427d4\u0026uparams=e,deadline,tag,nbs,uipk,platform,mid,trid,oi,gen,os,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=59442895\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026gen=playurlv3\u0026os=mcdn\u0026og=cos\u0026upsig=c9f074f7fc113d3d06b928f74a1427d4\u0026uparams=e,deadline,tag,nbs,uipk,platform,mid,trid,oi,gen,os,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-estgoss.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026og=cos\u0026oi=3028829496\u0026mid=59442895\u0026nbs=1\u0026os=upos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026tag=\u0026upsig=d563b613434d1b8d4c2acc1717a82dfa\u0026uparams=e,deadline,uipk,platform,gen,og,oi,mid,nbs,os,trid,tag\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-estgoss.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026gen=playurlv3\u0026tag=\u0026platform=pc\u0026os=upos\u0026og=cos\u0026upsig=0d401aeaea4a51b01605e5155ccf2e34\u0026uparams=e,nbs,uipk,trid,oi,mid,deadline,gen,tag,platform,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-estgoss.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026og=cos\u0026oi=3028829496\u0026mid=59442895\u0026nbs=1\u0026os=upos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026tag=\u0026upsig=d563b613434d1b8d4c2acc1717a82dfa\u0026uparams=e,deadline,uipk,platform,gen,og,oi,mid,nbs,os,trid,tag\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-estgoss.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026gen=playurlv3\u0026tag=\u0026platform=pc\u0026os=upos\u0026og=cos\u0026upsig=0d401aeaea4a51b01605e5155ccf2e34\u0026uparams=e,nbs,uipk,trid,oi,mid,deadline,gen,tag,platform,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=2,3" + ], + "bandwidth": 76436, + "mimeType": "audio/mp4", + "mime_type": "audio/mp4", + "codecs": "mp4a.40.2", + "width": 0, + "height": 0, + "frameRate": "", + "frame_rate": "", + "sar": "", + "startWithSap": 0, + "start_with_sap": 0, + "SegmentBase": { + "Initialization": "0-933", + "indexRange": "934-1805" + }, + "segment_base": { + "initialization": "0-933", + "index_range": "934-1805" + }, + "codecid": 0 + }, + { + "id": 30280, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026gen=playurlv3\u0026tag=\u0026os=mcdn\u0026og=cos\u0026deadline=1745411269\u0026upsig=3d3484b4a91783d0d7277e073d947fad\u0026uparams=e,nbs,uipk,platform,trid,oi,mid,gen,tag,os,og,deadline\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026gen=playurlv3\u0026tag=\u0026os=mcdn\u0026og=cos\u0026deadline=1745411269\u0026upsig=3d3484b4a91783d0d7277e073d947fad\u0026uparams=e,nbs,uipk,platform,trid,oi,mid,gen,tag,os,og,deadline\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026os=cosbv\u0026platform=pc\u0026mid=59442895\u0026nbs=1\u0026uipk=5\u0026upsig=f7cc870e2a4925c24e46ad9425cf39a8\u0026uparams=e,og,trid,oi,deadline,tag,gen,os,platform,mid,nbs,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026platform=pc\u0026gen=playurlv3\u0026os=cosbv\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026upsig=d380844ae7ac21f8484650ba59a15d97\u0026uparams=e,og,mid,tag,nbs,platform,gen,os,trid,oi,deadline,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026os=cosbv\u0026platform=pc\u0026mid=59442895\u0026nbs=1\u0026uipk=5\u0026upsig=f7cc870e2a4925c24e46ad9425cf39a8\u0026uparams=e,og,trid,oi,deadline,tag,gen,os,platform,mid,nbs,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026platform=pc\u0026gen=playurlv3\u0026os=cosbv\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026upsig=d380844ae7ac21f8484650ba59a15d97\u0026uparams=e,og,mid,tag,nbs,platform,gen,os,trid,oi,deadline,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=2,3" + ], + "bandwidth": 154889, + "mimeType": "audio/mp4", + "mime_type": "audio/mp4", + "codecs": "mp4a.40.2", + "width": 0, + "height": 0, + "frameRate": "", + "frame_rate": "", + "sar": "", + "startWithSap": 0, + "start_with_sap": 0, + "SegmentBase": { + "Initialization": "0-933", + "indexRange": "934-1805" + }, + "segment_base": { + "initialization": "0-933", + "index_range": "934-1805" + }, + "codecid": 0 + }, + { + "id": 30216, + "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=mcdn\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026uipk=5\u0026mid=59442895\u0026gen=playurlv3\u0026og=cos\u0026upsig=77babed89168a38118c16f99396e3fb6\u0026uparams=e,platform,trid,oi,os,deadline,tag,nbs,uipk,mid,gen,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=mcdn\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026uipk=5\u0026mid=59442895\u0026gen=playurlv3\u0026og=cos\u0026upsig=77babed89168a38118c16f99396e3fb6\u0026uparams=e,platform,trid,oi,os,deadline,tag,nbs,uipk,mid,gen,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", + "backupUrl": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026upsig=d76799fe0f76dea02c775c8667fc3f82\u0026uparams=e,gen,os,og,trid,mid,tag,nbs,oi,deadline,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=cosbv\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026gen=playurlv3\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026deadline=1745411269\u0026upsig=5cb2a5242aa474a5a0ba70e16b3d04f6\u0026uparams=e,os,nbs,uipk,platform,oi,mid,tag,gen,og,trid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "backup_url": [ + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026upsig=d76799fe0f76dea02c775c8667fc3f82\u0026uparams=e,gen,os,og,trid,mid,tag,nbs,oi,deadline,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", + "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=cosbv\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026gen=playurlv3\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026deadline=1745411269\u0026upsig=5cb2a5242aa474a5a0ba70e16b3d04f6\u0026uparams=e,os,nbs,uipk,platform,oi,mid,tag,gen,og,trid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" + ], + "bandwidth": 31705, + "mimeType": "audio/mp4", + "mime_type": "audio/mp4", + "codecs": "mp4a.40.5", + "width": 0, + "height": 0, + "frameRate": "", + "frame_rate": "", + "sar": "", + "startWithSap": 0, + "start_with_sap": 0, + "SegmentBase": { + "Initialization": "0-943", + "indexRange": "944-1815" + }, + "segment_base": { + "initialization": "0-943", + "index_range": "944-1815" + }, + "codecid": 0 + } + ], + "dolby": { + "type": 0, + "audio": null + }, + "flac": null + }, + "support_formats": [ + { + "quality": 125, + "format": "hdflv2", + "new_description": "HDR 真彩", + "display_desc": "HDR", + "superscript": "", + "codecs": [ + "hev1.2.4.L156.90" + ] + }, + { + "quality": 120, + "format": "hdflv2", + "new_description": "4K 超清", + "display_desc": "4K", + "superscript": "", + "codecs": [ + "avc1.640034", + "hev1.1.6.L156.90" + ] + }, + { + "quality": 116, + "format": "flv_p60", + "new_description": "1080P 60帧", + "display_desc": "1080P", + "superscript": "60帧", + "codecs": [ + "avc1.640032", + "hev1.1.6.L150.90" + ] + }, + { + "quality": 80, + "format": "flv", + "new_description": "1080P 高清", + "display_desc": "1080P", + "superscript": "", + "codecs": [ + "avc1.640032", + "hev1.1.6.L150.90" + ] + }, + { + "quality": 64, + "format": "flv720", + "new_description": "720P 高清", + "display_desc": "720P", + "superscript": "", + "codecs": [ + "avc1.640020", + "hev1.1.6.L120.90" + ] + }, + { + "quality": 32, + "format": "flv480", + "new_description": "480P 清晰", + "display_desc": "480P", + "superscript": "", + "codecs": [ + "avc1.64001F", + "hev1.1.6.L120.90" + ] + }, + { + "quality": 16, + "format": "mp4", + "new_description": "360P 流畅", + "display_desc": "360P", + "superscript": "", + "codecs": [ + "avc1.64001E", + "hev1.1.6.L120.90" + ] + } + ], + "high_format": null, + "last_play_time": 0, + "last_play_cid": 0, + "view_info": null, + "play_conf": { + "is_new_description": false + } + } +} +``` + +
+ +## 视频取流说明 + +关于拉流: + +1. MP4 / ~~FLV~~ 格式仅需拉视频流,DASH 格式需同时拉视频与伴音流 +2. 如 DASH 格式需要杜比或无损的伴音,需要取对应`dolby`或`flac`字段中的流 +3. **注意 Unicode 转义符** + +~~关于分段:~~ + +~~FLV 格式可能产生分段情况,将`$.data.durl[1-n].url`或`$.data.durl[1-n].backup_url[0]`中的内容作为 URL 进行 GET 请求进行分段播放,如需下载需要合并~~(FLV 格式已下线,不会存在分段现象) + +关于鉴权: + +1. WEB 端取流需要验证防盗链,即`referer`为 `.bilibili.com`域名下且 UA 不能为空 +2. APP 端也需要验证防盗链,即 UA 需要含有`Mozilla/5.0 BiliDroid/*.*.* (bbcallen@gmail.com)`(*为版本) +3. 如`referer`或 UA 错误的情况会被判定为盗链,返回`403 Forbidden`故无法取流 +4. 若传`platform=html5`参数取流,则不会进行防盗链验证,即可通过 HTML 标签`