灵猴市集Linghou Market

哔哩哔哩热门视频

哔哩哔哩bilibili-popular-videos

哔哩哔哩热门视频 用途 读取哔哩哔哩热门视频列表,返回标题、作者、播放数、弹幕数、BV 号和视频链接。 执行前提 请在 bilibili.com 页面执行。该脚本只读取公开热门接口;通常不要求登录,但站点风控、地区限制或接口临时变更可能导致请求失败。 参数 limit:可选,返回数量,整数,范围 1-50,默认 20。 返回值 返回数组,每一项包含: ra…

视频热门内容提取
版本1.0.0
扫描passed
更新2026-06-28
超时30000ms

匹配范围

*://*.bilibili.com/*

排除范围

未声明

能力声明

dom.read

代码

源码已展开
1const input = typeof params === 'object' && params !== null ? params : {};2 3function readLimit(value, fallback, max) {4  const raw = value == null || value === '' ? fallback : value;5  const n = typeof raw === 'number'6    ? raw7    : typeof raw === 'string' && /^[1-9]\d*$/.test(raw)8      ? Number(raw)9      : NaN;10  if (!Number.isSafeInteger(n) || n < 1 || n > max) {11    throw new Error(`limit must be an integer from 1 to ${max}`);12  }13  return n;14}15 16function readVideo(row, rank) {17  const bvid = String(row?.bvid || '').trim();18  return {19    rank,20    title: String(row?.title || '').trim(),21    author: String(row?.owner?.name || '').trim(),22    play: Number.isFinite(Number(row?.stat?.view)) ? Number(row.stat.view) : null,23    danmaku: Number.isFinite(Number(row?.stat?.danmaku)) ? Number(row.stat.danmaku) : null,24    bvid,25    url: bvid ? `https://www.bilibili.com/video/${bvid}` : '',26  };27}28 29async function fetchJson(url) {30  const response = await fetch(url, {31    method: 'GET',32    credentials: 'include',33    headers: { accept: 'application/json' },34  });35  if (!response.ok) {36    throw new Error(`request failed with HTTP ${response.status}`);37  }38  const payload = await response.json();39  if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {40    throw new Error('API returned a malformed response');41  }42  if (payload.code != null && payload.code !== 0) {43    throw new Error(`API returned code ${payload.code}: ${payload.message || ''}`);44  }45  return payload;46}47 48const limit = readLimit(input.limit, 20, 50);49const url = new URL('https://api.bilibili.com/x/web-interface/popular');50url.searchParams.set('ps', String(limit));51url.searchParams.set('pn', '1');52 53const payload = await fetchJson(url.toString());54const rows = Array.isArray(payload?.data?.list) ? payload.data.list : [];55if (rows.length === 0) {56  throw new Error('API returned no videos');57}58 59return rows.slice(0, limit).map((row, index) => readVideo(row, index + 1));