Skip to content

wuziqian211/website-api

Repository files navigation

YumeHaru's Blog API

https://api.yumeharu.top/api/

✨介绍

本项目的 API 主要为晨叶梦春的小屋的一些功能提供服务。

对于大多数 API:

  • 🚩API 类型RESTful API
  • ✏请求方式:一般为 GET(理论上可以使用任何请求方式)
  • 🔖请求参数URL 查询字符串(如 ?mid=425503913&type=html),参数名区分大小写
  • 💬回复数据类型:默认情况下回复 JSON,但存在特殊情况,比如当您直接使用浏览器打开本 API 的页面时可能会回复 HTML,详见回复数据类型规则
  • 🔢HTTP 状态代码
状态代码 说明
200 请求成功
307不是 302 临时重定向(如:您在获取图片数据时,在 type 参数中带上了 _redirect 后缀)
308不是 301 永久重定向
403 获取该信息的权限不足(仅出现在 “获取哔哩哔哩视频 / 剧集 / 番剧信息及数据” API 中,表示获取这个视频的信息需要登录 B 站账号)
404 您想获取信息的目标(用户、视频等)不存在,或者 API 不存在(对于 “获取哔哩哔哩视频 / 剧集 / 番剧信息及数据” API 来说,该状态代码还可能表示视频正在审核中)
429不是 412 请求太频繁
500504 API 调用异常或超时(对于 “获取哔哩哔哩视频 / 剧集 / 番剧信息及数据” API 来说,该状态代码还可能表示视频太大,API 无法回复视频数据)
400 因参数无效(或其他原因)而请求失败

同时,https://api.yumeharu.top/api/ 中的 API 强制使用 HTTPS 协议。这是 Vercel 的行为,您在其他地方部署 API 不一定会强制使用 HTTPS 协议。

您可以使用以下公开的 API:

这些 API 允许任何合法网站与程序等调用,而 API 的服务器不会存储任何访问记录与哔哩哔哩用户、视频、剧集、番剧等的信息、数据等,仅转发与处理哔哩哔哩 API 的回复数据。

Tip

本项目的 API 可以给您带来许多好处:

  1. 您基本不需要添加任何 “风控参数” 即可成功调用 API,因为添加 “风控参数” 等操作由 API 的服务器自动进行;
  2. 本项目的 API 会频繁更新,以确保能够给用户带来更好的体验;
  3. API 可以给您简化一些操作,如:您在引用图片时,直接填写图片链接为 https://api.yumeharu.top/api/getuser?mid=2&type=avatar 即可引用 B 站上 UID 为 2 的用户的头像,并且会实时更新。

Note

  • 这些 API 的服务器不在中国大陆。如果您可以正常调用 B 站的 API,最好直接使用 B 站的 API,可以更快回复您所需要的信息。
  • 由于本 API 可以返回多种类型的数据,因此建议您始终带 type 参数调用 API,详见回复数据类型规则

Caution

  • 请勿将这些 API 用于非法目的!这些 API 的目的是方便大家的使用,并且可能会随时停止开发或删档。因恶意使用这些 API 而造成的不良影响及后果与本项目无关。
  • 本项目为开源项目,不接受任何形式的索取或催单行为,更不容许存在付费内容。

📖详细用法

👤获取哔哩哔哩用户信息

https://api.yumeharu.top/api/getuser

本 API 可以获取指定 B 站用户的信息。目前本 API 始终带 Cookie 获取用户信息。

🔖请求参数

请求参数 说明
mid 您想获取用户信息的用户的 UID,只能是正整数。
示例4255039132
type 本 API 回复的数据类型,详见回复数据类型规则。本 API 对此参数进行了扩展:
  • 如果本参数的值为 imagefaceavatar,则默认情况下,成功时回复用户的头像数据,失败时回复默认头像数据。此条件下:
    • 若加上 _errorwhenfailed 后缀,则失败时根据 Sec-Fetch-Dest 标头的值提示获取头像失败;
    • 若加上 _redirect 后缀,则成功时重定向到 B 站服务器的头像地址。
    可以添加多个后缀。
本参数的值不区分大小写。

如果没有填写 mid 参数,且本 API 将回复图片数据,那么本 API 就回复 B 站的随机头像数据。

📺获取哔哩哔哩视频 / 剧集 / 番剧信息及数据

https://api.yumeharu.top/api/getvideo

本 API 可以获取指定 B 站视频、剧集、番剧的信息及数据。

Warning

本 API 获取到的视频数据仅供预览,如果您想下载视频,请使用其他工具,本 API 只能获取大小不超过 4.5 MB(在这里 1 MB = 1000 KB)的视频。

🔖请求参数

请求参数 说明
vid 您想获取信息或数据的视频、剧集、番剧的编号。可以是前缀为 av 或没有前缀的 AV 号,前缀为 BV 的 BV 号,前缀为 mdssep 的剧集、番剧等的编号,编号的前缀不区分大小写。
示例10429av106BV17x411w7KCss29325
cid 该视频的某个分 P 的 cid,或者该剧集中某一集的 cid,只能是正整数。仅在获取视频数据时使用本参数。
p 该视频的第几个分 P,或者该剧集中的第几集,只能是正整数。仅在获取视频数据时使用本参数。
type 本 API 回复的数据类型,详见回复数据类型规则。本 API 对此参数进行了扩展:
  • 如果本参数的值为 videodata,则默认情况下,成功时回复视频数据,失败时以视频形式提示视频不存在,并且失败时若请求标头 Sec-Fetch-Dest 的值为 video(名称与值均不区分大小写),则响应 200 状态代码,否则响应表示错误的状态代码(如 404400500 等;这样做的目的是让播放器能够加载提示 “视频不存在” 的视频,不会因本 API 响应表示错误的状态代码而不加载视频)。此条件下:
    • 若加上 _errorwhenfailed 后缀,则失败时若请求标头 Sec-Fetch-Dest 的值为 video(名称与值均不区分大小写),则以视频形式提示视频不存在(且响应 200 状态代码),否则以 HTML 形式提示视频不存在(响应表示错误的状态代码)。
  • 如果本参数的值为 imagecoverpic,则默认情况下,成功时回复视频封面数据,失败时回复默认封面数据。此条件下:
    • 若加上 _errorwhenfailed 后缀,则失败时根据 Sec-Fetch-Dest 标头的值提示获取封面失败;
    • 若加上 _redirect 后缀,则成功时重定向到 B 站服务器的封面地址。
    可以添加多个后缀。
本参数的值不区分大小写。
cookie 获取信息时是否带 Cookie。
  • 如果本参数的值为 true,则强制带 Cookie 获取信息;
  • 如果本参数的值为 false,则强制不带 Cookie 获取信息;
  • 否则先尝试不带 Cookie 获取信息,如果失败,再带 Cookie 获取信息。
本参数的值不区分大小写。
示例:获取仅对登录用户可见的视频信息:BV16s411f7x2
force 指定本 API 应该强制获取视频信息,仅适用于获取视频的信息(编号为 AV 号或 BV 号)。如果存在本参数,那么本 API 会尽可能尝试获取到视频信息,无论这个视频现在是否存在(会自动设置 cookie=true 参数)。
示例:获取被退回或锁定的视频信息:av10388av10492

其中,cidp 参数仅在获取数据时被使用,且只能填写其中一个;若这些参数均未填写,则默认为该视频的第 1 个分 P,或该剧集中的第 1 集。

Note

当您想要本 API 回复视频的数据(设置 type=videotype=data 参数,可能带后缀)时,本 API 为了尽可能获取到更高清晰度的视频,会自动设置 cookie=true 参数,您可以手动设置 cookie=false 参数以覆盖此行为。

然而,如果您设置了 force 参数,由于本 API 必须要带 Cookie 才能强制获取视频信息,因此您手动设置 cookie=false 参数会报错

🗒附录

本项目的所有 API 文件均为 ECMAScript modules 文件,使用 TypeScript 编写,不使用任何框架。

目前,有些 API 是 Serverless Functions,有些是 Edge Functions

本项目使用 Vercel 部署。如果您想从本项目部署 API,请将环境变量 userAgent 设置为浏览器的用户代理,并设置环境变量 SESSDATAbili_jct 为一个可用的 B 站账号的 Cookie。若您想在除 Vercel 以外的平台部署本项目的 API,您可能需要改动一些文件。

💬回复数据类型规则

与大部分其他网站的 API 不同,本项目的 API 在调用后,既可以回复 HTML,也可以回复 JSON,有些 API 可以回复图片与视频数据。

🎉通过 type 参数判断

当您指定 type 参数时,API 会根据 type 参数的值判断回复数据类型(参数名区分大小写,值不区分大小写;有些 API 会对这个列表进行扩展;需要 API 支持您指定的回复数据类型):

type 参数 回复数据类型
json JSON
htmlpage HTML 页面
imageimgpicturepic 图片
video 视频

🖇通过 Sec-Fetch-Dest 标头判断

如果上述过程无法判断回复数据类型,那么就根据 HTTP 请求头 Sec-Fetch-Dest 的值判断回复数据类型(标头名称与值均不区分大小写,需要 API 支持您指定的回复数据类型):

Sec-Fetch-Dest 标头 回复数据类型
json JSON
documentframeiframe HTML 页面
image 图片
video 视频

📥通过 Accept 标头判断

若上述过程仍无法判断回复数据类型,则根据 HTTP 请求头 Accept 的值判断回复数据类型(标头名称与值均不区分大小写,需要 API 支持您指定的回复数据类型):

  • Accept 的值包含 html(比如使用浏览器直接访问 API 的页面)时,回复 HTML 页面;
  • Accept 的值包含 image(比如在 HTML <img> 标签src 参数中直接填写 API 的地址)时,回复图片数据;
  • Accept 的值包含 video(比如在 HTML <video> 标签<source> 标签src 参数直接填写 API 的地址)时,回复视频数据。

❓默认回复 JSON

若上述过程无法判断回复数据类型,则回复 JSON。

🔗回复的 JSON 对象数据结构

根对象:

字段 类型 说明
code number 返回值。常见的返回值有:
0:成功
-400:请求错误(如:参数不合法)
-403:访问权限不足(如:未使用 Cookie 获取信息)
-404:啥都木有
-412:请求被拦截
message string 错误信息,若请求成功则一般为 0success
data 有效时:object
无效时:null
回复数据本体。对于 “获取哔哩哔哩用户信息” 与 “获取哔哩哔哩视频 / 剧集 / 番剧信息及数据” API 的数据本体,请自行查找对应的 B 站 API 的说明,此处不再进行说明。
extInfo object API 返回的扩展信息,包括调用所耗时间、数据来源、错误类型等。

extInfo 对象:

字段 类型 说明
errType string 错误类型,仅在调用 API 失败时出现。
upstreamServerRespError:上游服务器响应错误(成功获取到了 URL,但请求时上游服务器回复了错误响应代码)
upstreamServerNoData:上游服务器未回复本体数据(上游服务器 API 回复了表示失败的 code
upstreamServerInvalidRequest:对上游服务器的请求无效(如:参数不合法)
upstreamServerForbidden:对访问上游服务器的本体数据的权限不足(如:未使用 Cookie 获取信息)
upstreamServerRequestBanned:对上游服务器的请求被拦截(如:在短时间内频繁调用 API)
internalServerInvalidRequest:本 API 服务器接收到的请求无效(参数不合法)
notFoundInHistory:在历史记录中未找到指定视频的信息,仅在 “获取哔哩哔哩视频 / 剧集 / 番剧信息及数据” API 中使用
upstreamServerUrl string 上游服务器 URL,仅当 errType 值为 upstreamServerRespError 时出现。
upstreamServerRespStatus number 上游服务器的响应状态代码,仅当 errType 值为 upstreamServerRespError 时出现。
spaceAccInfoCode number B 站 API x/space/wbi/acc/info 的返回值,仅在 “获取哔哩哔哩用户信息” API 中调用该 API 失败时出现。
spaceAccInfoMessage string B 站 API x/space/wbi/acc/info 的错误信息,仅在 “获取哔哩哔哩用户信息” API 中调用该 API 失败时出现。
dataSource string[] 或 string 回复数据的来源。
apiExecTime number 调用 API 所耗时间(单位:毫秒)。
查看响应示例
{
  "code": 0, // 返回值
  "message": "0", // 错误信息
  "data": { // 数据本体(此处不再进行相关字段的说明)
    "mid": 2,
    "name": "碧诗",
    "approve": false,
    "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",
    "description": "",
    "rank": 20000,
    "DisplayRank": "20000",
    "level": 6,
    "jointime": 0,
    "regtime": 0,
    "spacesta": 0,
    "place": "",
    "moral": 0,
    "silence": 0,
    "coins": 0,
    "article": 0,
    "attentions": [], // 因涉及隐私,此处隐藏具体数据
    "fans": 1155509,
    "friend": 344,
    "attention": 344,
    "following": 344,
    "follower": 1155509,
    "level_info": {
      "next_exp": -1,
      "current_level": 6,
      "current_min": 28800,
      "current_exp": 0 // 因涉及隐私,此处隐藏具体数据
    },
    "fans_badge": true,
    "fans_medal": {
      "show": true,
      "wear": true,
      "medal": {
        "uid": 2,
        "target_id": 6189069,
        "medal_id": 282173,
        "level": 16,
        "medal_name": "别嘴硬",
        "medal_color": 12478086,
        "intimacy": 0, // 因涉及隐私,此处隐藏具体数据
        "next_intimacy": 50000,
        "day_limit": 25000,
        "medal_color_start": 12478086,
        "medal_color_end": 12478086,
        "medal_color_border": 12478086,
        "is_lighted": 1,
        "light_status": 1,
        "wearing_status": 1,
        "score": 0 // 因涉及隐私,此处隐藏具体数据
      }
    },
    "official": { "role": 2, "title": "bilibili创始人(站长)", "desc": "", "type": 0 },
    "official_verify": { "type": 0, "desc": "bilibili创始人(站长)" },
    "vip": {
      "type": 2,
      "status": 1,
      "due_date": 3974198400000,
      "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://i1.hdslb.com/bfs/face/e93dd9edfa7b9e18bf46fd8d71862327a2350923.png",
      "image_small": "https://i0.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://i2.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": 6,
        "text_small": "6",
        "text_large": "6人看过",
        "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png",
        "icon_location": "",
        "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png"
      }
    },
    "birthday": 622137600,
    "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
  },
  "extInfo": { // 扩展信息
    "dataSource": ["getCardByMid", "spaceAccInfo"], // 数据来源
    "apiExecTime": 745.896267 // 调用 API 耗时(单位:毫秒)
  }
}

🗂目录结构

文件或文件夹 说明
api/ 本文件夹包含所有 API,在网站上访问里面的文件会调用对应 API
api/404.ts 网站上的页面不存在时调用的 API
api/getuser.ts “获取哔哩哔哩用户信息” API
api/getvideo.ts “获取哔哩哔哩视频 / 剧集 / 番剧信息及数据” API
api/index.ts 用于渲染网站首页的 API
api/modules.ts 晨叶梦春的小屋的一些功能使用的 API
assets/ 本文件夹包含静态文件,在网站上访问里面的文件会显示文件内容
assets/[1-5]-22.jpg, assets/[1-6]-33.jpg 哔哩哔哩的一些随机头像
assets/apple-touch-icon.png 网站图标
assets/big-vip.svg, assets/business.svg, assets/nft.gif, assets/nft-label.gif, assets/nft-label-oversea.gif, assets/personal.svg, assets/small-vip.svg 哔哩哔哩大会员、机构认证、数字藏品头像(无白色边框)、数字藏品头像、海外版数字藏品头像、UP 主认证与愚人节限定的 “小会员” 图标
assets/big-vip_dark.svg, assets/business_dark.svg, assets/personal_dark.svg, assets/small-vip_dark.svg 深色模式下的哔哩哔哩大会员、机构认证、UP 主认证与愚人节限定的 “小会员” 图标
assets/constants.ts 常量定义文件,如视频的分区、状态,朋友列表
assets/error.mp4 获取视频数据时,如果视频不可用,就回复本文件数据
assets/female.png, assets/male.png 表示性别的图片
assets/iconfont.woff2 图标字体文件
assets/level_[0-6].svg, assets/level_6+.svg 哔哩哔哩用户的等级图片
assets/main.js 页面使用的 JS
assets/nocover.png 获取视频封面时,如果视频不存在,就回复本文件数据
assets/noface.jpg 获取用户头像时,如果用户不存在,就回复本文件数据
assets/style.css 页面使用的 CSS
assets/top-photo.png 哔哩哔哩个人空间默认头图
assets/types.d.ts 类型定义文件
assets/utils.ts 所有 API 使用的功能文件,包括网站上页面的 “框架”
assets/warning.png, assets/tribute.png 警告图标
favicon.ico 网站图标
LICENSE MIT 许可证
package.json, package-lock.json 本 API 使用的库列表
README.md 对本 API 的说明文件,即本文件
robots.txt 搜索引擎爬虫配置文件
tsconfig.json TypeScript 配置文件
vercel.json Vercel(API 服务提供者)的配置文件

📄许可证

本项目使用 MIT 许可证