【Node】B站随机视频
在线地址:B站随机视频
参考: 带我去一个随机的B站视频! BV 号规则 https://www.zhihu.com/question/381784377/answer/1099438784
代码:
结构
初始化项目
▼text复制代码npm init -y npm install express axios
server.js
▼js复制代码const express = require("express"); const axios = require("axios"); const app = express(); const port = 8102; // BV转换所需的常量 const table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; const tr = {}; for (let i = 0; i < 58; i++) { tr[table[i]] = i; } const s = [11, 10, 3, 8, 4, 6]; const xor = 177451812; const add = 8728348608; // AV号转BV号 function enc(x) { x = (x ^ xor) + add; const r = "BV1 4 1 7 ".split(""); for (let i = 0; i < 6; i++) { r[s[i]] = table[Math.floor(x / Math.pow(58, i)) % 58]; } return r.join(""); } // 按年份范围生成随机BV号 function generateRandomBV() { const yearRanges = { 2013: { min: 1, max: 1000000 }, 2014: { min: 1000001, max: 2000000 }, 2015: { min: 2000001, max: 4000000 }, 2016: { min: 4000001, max: 8000000 }, 2017: { min: 8000001, max: 16000000 }, 2018: { min: 16000001, max: 35000000 }, 2019: { min: 35000001, max: 60000000 }, 2020: { min: 60000001, max: 85000000 }, 2021: { min: 85000001, max: 500000000 }, 2022: { min: 500000001, max: 700000000 }, 2023: { min: 700000001, max: 835000000 }, 2024: { min: 835000001, max: 950000000 }, }; const years = Object.keys(yearRanges); const randomYear = years[Math.floor(Math.random() * years.length)]; const range = yearRanges[randomYear]; const avid = Math.floor(Math.random() * (range.max - range.min)) + range.min; return enc(avid); } // 验证BV号是否存在 async function verifyBV(bvid) { try { const response = await axios.get( `https://api.bilibili.com/x/web-interface/view?bvid=${bvid}`, { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", Referer: "https://www.bilibili.com", }, } ); return response.data.code === 0; } catch { return false; } } // 随机视频接口 app.get("/random", async (req, res) => { try { let bvid = generateRandomBV(); while (!(await verifyBV(bvid))) { bvid = generateRandomBV(); } res.json({ bvid }); } catch (error) { console.error("Error:", error.message); res.status(500).json({ error: "Internal Server Error" }); } }); // 前端页面路由 app.get("/", (req, res) => { res.sendFile(__dirname + "/index.html"); }); // 启动服务 app.listen(port, () => { console.log(`服务运行在 http://localhost:${port}`); });
index.html
▼html复制代码<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>B站随机视频</title> <style> body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f0f0; } .btn { padding: 20px 40px; font-size: 24px; background: #00a1d6; color: white; border: none; border-radius: 50px; cursor: pointer; transition: transform 0.2s; } .btn:hover { transform: scale(1.1); } </style> </head> <body> <button class="btn" onclick="getRandomVideo()">随机看个B站视频</button> <script> async function getRandomVideo() { try { const response = await fetch("/random"); const data = await response.json(); if (data.bvid) { window.open(`https://www.bilibili.com/video/${data.bvid}`, "_blank"); } } catch (error) { console.error("Error:", error); } } </script> </body> </html>
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
【Electron】图片魔方
3
梦里的场景像被岁月浸过的老胶片,每一帧都带着温润的质感——指尖触到的藤蔓带着晨露的冰凉,远处钟楼的铜铃声震得空气发颤,甚至连擦肩而过的陌生人衣角上的暗纹,都清晰得如同刻在视网膜上。当意识从梦境的深潭里浮上来时,指尖还残留着虚空中攥住的微凉,目光扫过熟悉的天花板,却有半分恍惚悬在现实与幻梦的交界处,仿佛灵魂还在那片真实得令人心悸的风景里迟迟不肯归位。
2
99起始页:[99起始页](http://123.60.153.252:99)
上班摸鱼之作:一个拥有 40 多个组件的浏览器标签页,而且 99% 的代码都是 AI 帮我实现的!【从 4 月 6 日实现第一个组件,到现在 5 月 29 日,平均一天一个组件,中间有 1 个星期比较消极没咋搞】从随机哔哩哔哩到观音灵签,每个组件都是工作间隙的小小成就。
虽然只是基于前端三件套的简单实现,但借助 Cursor 和 AI 的强大能力,我只需提出想法,代码就自动生成了。这种高效协作让我能在不引人注意的情况下,悄悄构建自己的数字乐园。
当我看到这些组件在页面上流畅运行时,那种成就感比完成工作任务还要爽!这大概是 AI 时代最完美的摸鱼方式了。
#AI 编程 #上班摸鱼 #前端开发 #打工人的小确幸
4
反常规工具类型设计文档 ——5 大「反向生活助手」创意
3
程序员自救指南:从「想做很多事」到「开始第一件事」
8
