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