给哔哩哔哩bilibili电脑版做个手机遥控器

前言

bilibili电脑版可以在电脑屏幕上观看bilibili视频。然而,电脑版的bilibili不能通过手机控制视频翻页和调节音量,这意味着观看视频时需要一直坐在电脑旁边。那么,有没有办法制作一个手机遥控器来控制bilibili电脑版呢?

首先,bilibili电脑版支持快捷键,可以通过一些快捷键来控制视频播放。例如,按下空格键可以控制视频的播放和暂停。

既然快捷键可以控制视频,那么我们的思路就很清晰了。可以在电脑上搭建一个HTTP服务器,部署一个遥控器样式的网页,上面放置一些简单的按钮。用户打开网页后,点击这些按钮,服务器端就会模拟用户点击键盘来实现相应的操作。

前后台代码实现

说干就干, 开始动手实现这个手机版bilibili遥控器, 语言方面我们选择使用NodeJS来搭建我们的服务器, 先写前端UI:

整体的网页框架

XML 复制代码
<html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<body>
    ...
</body>
<script>
    ...
</script>
</html>
  • <meta charset="utf-8">: 指定文档的字符编码为UTF-8。
  • <meta name="viewport" content="width=device-width, initial-scale=1" />: 使页面在移动设备上适应屏幕宽度,并初始缩放比例为1。

遥控器的按钮:

XML 复制代码
<button data-action="up" style="margin-bottom: 30px;width: 100%;height: 110px;">音量+</button>
<button data-action="down" style="margin-bottom: 30px;width: 100%;height: 110px;">音量-</button>
<button data-action="previous" style="margin-bottom: 30px;width: 100%;height: 110px;">上一个</button>
<button data-action="next" style="margin-bottom: 30px;width: 100%;height: 110px;">下一个</button>
<button data-action="pauseOrPlay" style="margin-bottom: 30px;width: 100%;height: 110px;">暂停/播放</button>

每个按钮都有一个 data-action 属性,用于定义按钮的动作。

按钮的样式通过 style 属性设置,按钮高度110px,宽度100%,且每个按钮的底部都有30px的间距。

Javascript代码

javascript 复制代码
document.querySelectorAll('button[data-action]').forEach(button => {
    button.addEventListener('click', () => {
        const action = button.getAttribute('data-action');
        fetch(`${window.location.origin}/${action}`)
            .then(response => response.json())
            .then(data => {
                console.log(data);
            })
            .catch(error => {
                alert('Error fetching data:', error);
            });
    });
});

首先代码中会选择所有带有 data-action 属性的按钮。

为每个按钮添加点击事件监听器。

点击按钮后,会获取按钮的 data-action 属性值,并发起一个fetch请求

整体的网页代码

整体的网页代码如下:

XML 复制代码
<html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />

<body>
    <button data-action="up" style="margin-bottom: 30px;width: 100%;height: 110px;">音量+</button>
    <br>
    <button data-action="down" style="margin-bottom: 30px;width: 100%;height: 110px;">音量-</button>
    <br>
    <button data-action="previous" style="margin-bottom: 30px;width: 100%;height: 110px;">上一个</button>
    <br>
    <button data-action="next" style="margin-bottom: 30px;width: 100%;height: 110px;">下一个</button>
    <br>
    <button data-action="pauseOrPlay" style="margin-bottom: 30px;width: 100%;height: 110px;">暂停/播放</button>
    <br>
</body>

<script>
    document.querySelectorAll('button[data-action]').forEach(button => {
        button.addEventListener('click', () => {
            const action = button.getAttribute('data-action');
            fetch(`${window.location.origin}/${action}`)
                .then(response => response.json())
                .then(data => {
                    console.log(data);
                })
                .catch(error => {
                    alert('Error fetching data:', error);
                });
        });
    });
</script>

</html>

预览效果

网页在手机浏览器里打开的效果如下图所示:

后端HTTP服务器实现

剩下的就是服务端了, 主要用来接受http请求, 触发不同的键盘事件即可.

整体代码

javascript 复制代码
const path = require("path");
const ks = require('node-key-sender');
const express = require('express');
const app = express();
const port = 3000;

const actions = {
  next: () => ks.sendKey('down'),
  previous: () => ks.sendKey('up'),
  up: () => ks.sendCombination(['shift', 'up']),
  down: () => ks.sendCombination(['shift', 'down']),
  pauseOrPlay: () => ks.sendKey('space')
};

Object.keys(actions).forEach(action => {
  app.get(`/${action}`, async (req, res) => {
    try {
      await actions[action]();
      res.json({ success: true, message: `${action} action completed` });
    } catch (error) {
      res.status(500).json({ success: false, message: `Error performing ${action} action`, error });
    }
  });
});

app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'index.html'));
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

代码解释

引入模块

javascript 复制代码
const path = require("path");
const ks = require('node-key-sender');
const express = require('express');

node-key-sender: 这个模块用于发送模拟键盘按键事件。

express: 用于创建Web服务器的Node.js框架。

创建Express应用和设置端口

javascript 复制代码
const app = express();
const port = 3000;

定义动作(Actions)对象

javascript 复制代码
const actions = {
  next: () => ks.sendKey('down'),
  previous: () => ks.sendKey('up'),
  up: () => ks.sendCombination(['shift', 'up']),
  down: () => ks.sendCombination(['shift', 'down']),
  pauseOrPlay: () => ks.sendKey('space')
};

这里定义了五个动作,每个动作对应一个键盘事件。

创建路由

javascript 复制代码
Object.keys(actions).forEach(action => {
  app.get(`/${action}`, async (req, res) => {
    try {
      await actions[action]();
      res.json({ success: true, message: `${action} action completed` });
    } catch (error) {
      res.status(500).json({ success: false, message: `Error performing ${action} action`, error });
    }
  });
});

使用 Object.keys(actions) 获取所有动作的名称,并为每个动作创建一个对应的路由。

处理请求时,调用相应的动作,并返回JSON格式的响应。

返回静态网页

javascript 复制代码
app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'index.html'));
});

这个路由将根路径 (/) 的请求返回 index.html 文件。

启动服务器

javascript 复制代码
app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

服务器监听指定端口(这里是3000),并在启动时输出提示信息。

添加上package.json文件

package.json文件用来描述dependencies信息

javascript 复制代码
{
  "name": "bilibili-remote-control",
  "version": "1.0.0",
  "description": "Bilibili遥控器",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "MIT",
  "dependencies": {
    "express": "^4.17.1",
    "node-key-sender": "^1.0.11"
  }
}

运行手机遥控器

整个代码就完成了, 现在可以启动遥控器了:

装上dependencies

javascript 复制代码
npm install

运行遥控器

javascript 复制代码
npm run start

可以看到服务器已经启动起来了

手机浏览器里打开192.168.x.x开头的网页, 然后运行bilibili桌面版, 即可在手机里面控制bilibili的播放了, 再也不用坐在电脑屏幕跟前了.

总结

以上便是给整个bilibili手机版遥控器介绍, 相关代码已经发布到CSDN, 可以直接访问: bilibili-remote-controller:Bilibili电脑版手机遥控器 - GitCode

相关推荐
PeterJXL1 个月前
下载 B 站封面的正确方式
下载·bilibili·封面
云卓SKYDROID2 个月前
遥控器显示分别对应的无人机状态详解!!
无人机·科普·知识·遥控器·云卓科技
云卓SKYDROID2 个月前
无人机道通布局的讲究详解!!!
无人机·知识·遥控器·云卓科技
云卓SKYDROID2 个月前
无人机遥控器的材料组成!!!
无人机·遥控器·知识科普·高科技·云卓科技
云卓SKYDROID2 个月前
无人机遥控器工作原理!!!
无人机·科普·知识·遥控器·云卓科技
云卓SKYDROID2 个月前
无人机遥控器电路板的材料解析!!!
无人机·知识·遥控器·电路板·云卓科技
云卓SKYDROID2 个月前
无人机遥控器显示屏的重要性!!!
安全·无人机·遥控器·材料·云卓科技
云卓SKYDROID2 个月前
无人机遥控器里的接收器工作原理解析!
无人机·科普·知识·遥控器·云卓科技·图传
Lilixxs4 个月前
B站大课堂-自动化精品视频(个人存档)
自动化·教程·plc·运动控制·工业控制·codesys·bilibili