avatar

0202年能在安卓手机上玩QQ机器人吗

此教程将手把手教你怎么在手机qq上跑一个qq机器人

前言

2019年1月1日,腾讯宣布关闭WebQQ服务,很多基于WebQQ的QQ机器人都失效了。似乎QQ机器人的时代结束了…..

结束了吗?
没有!

WebQQ没了,我们可以用其他协议啊!
据此,CoolQ和Mirai脱颖而出。

本文将介绍如何用开源库Mirai搭建基于安卓QQ协议的QQ机器人。


开源库介绍

Mirai

logo

title

Gitter

Gradle CI

Download

Mirai 是一个在全平台下运行,提供 QQ Android 和 TIM PC 协议支持的高效率机器人框架

这个项目的名字来源于

京都动画作品《境界的彼方》栗山未来(Kuriyama Mirai)

CRYPTON初音未来为代表的创作与活动(Magical Mirai)

图标以及形象由画师DazeCake绘制

Mirai使用Kotlin开发,生成的java程序(jar)理论上可以在任何支持java的平台使用。 下面来简单了解一下Mirai的结构(部分)...

Mirai的核心MiraiCore:与腾讯QQ服务器直接对接,处理接收并发送原始消息。

Mirai的主程序(启动器)mirai-console-wrapper:启动bot控制台,可以接收与发送消息,同时向外部提供接收与发送消息的接口。

Mirai插件:基于消息接口为主程序mirai-console-wrapper提供各种各样的拓展功能,如天气查询,点歌,涩图等等…

其中一个插件mirai-api-http将消息的接收和发送接口以本地http/websocket服务的方式部署,只需要post/get就能实现消息的接收与发送,这就为使用其他语言开发Mirai功能提供了一个更简单的平台,基于此已有python-mirainodejs-miraigomirai三种非Kotlin/Java语言的SDK,以及接下来这个教程使用的RhinoJS也属于一种SDK。

Mirai也可以通过mirai-native插件实现与CoolQ插件的对接。

Mirai详细结构图


Mozilla Rhino: JavaScript in Java

Rhino

Rhino is an implementation of JavaScript in Java.

Rhino是一个可以在JavaScript上运行Java程序的库。
我们可以通过JavaScript脚本访问mirai http api快速实现mirai功能开发。
既然rhino能运行Java程序那为什么不直接使用mirai的java库而使用http api呢,因为我不会!(后续我会研究把rhino也做成mirai插件)


mirai-rhinojs-sdk:

这是我自己编写&维护的一个小项目,为Mirai API Http提供封装好的适用于Mozilla Rhino的SDK。


手机跑QQ机器人大概思路

我们可以使用强大的Termux运行java以运行mirai和rhino。
但有个问题是:直接在termux环境运行java是有bug的,该bug导致java无法解析域名,也就是说mirai的自动更新和post/get httpapi会报错!
既然Termux环境不行,那就用proot模拟一个其他linux的环境!

所以,本教程大概思路如下:①配置mirai&rhino运行环境(proot linux和java等) → ②配置开发环境(link文件等) → ③提供一些参考文档

闲言少述,现在开始!


详细过程

你首先需要下载万能的Termux,这是一切的开端。

①配置mirai&rhino运行环境

安装proot linux

如果你提前已安装任意一proot linux发行版,可以跳过这一步。
请不要使用zsh终端。

在Termux终端运行以下代码以更新软件包至最新并安装wgetproot

1
2
apt update && apt upgrade -y
apt install wget proot -y

授予Termux存储空间访问权限:

1
termux-setup-storage

你可以在外部存储空间创建一个文件夹,该文件夹存放你的mirai bot源码(js),然后将其链接至termux:

1
ln -s /storage/emulated/0/QBotSourceCode ~/QBotSourceCode

下载一个linux rootfs,这里我用ubuntu/bionic作为示范:

1
wget https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/ubuntu/bionic/arm64/default/20200331_07%3A53/rootfs.tar.xz -O ~/ubuntu.tar.xz

创建一个文件夹并将rootfs解压进去:

1
2
3
4
5
6
7
8
9
mkdir ubuntu
mv ubuntu.tar.xz ubuntu/
cd ubuntu
#解压
xz -d ubuntu.tar.xz
tar -xvf ubuntu.tar
#删除压缩包
rm ubuntu.tar
cd ~

创建一个proot启动脚本:

1
2
3
touch startubuntu.sh
echo -e "#! /bin/bash\nunset LD_PRELOAD\nproot --link2symlink -S ubuntu -b /sys -b /dev -b /proc -b ~/QBotSourceCode -w /root /usr/bin/env -i HOME=/root LANG=C.UTF-8 PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin TERM=xterm-256color /bin/bash --login" > ~/startubuntu.sh
chmod +x startubuntu.sh

注意脚本中的-S ubuntu-b ~/QBotSourceCode,这两个目录分别为linux proot根目录上面链接到termux内部的源码目录,如果你用了其他名称请别忘了改这里的目录!

启动proot linux:

1
./startubuntu.sh

出现了新的bash即为成功运行:

1
2
3
4
5
6
7
u0_a207@localhost ~> chmod +x startubuntu.sh
u0_a207@localhost ~> ./startubuntu.sh
groups: cannot find name for group ID 3003
groups: cannot find name for group ID 9997
groups: cannot find name for group ID 20207
groups: cannot find name for group ID 50207
root@localhost:~#

proot linux

接下来的操作都将在proot linux里进行,如果你退出了proot linux,下次再启动startubuntu.sh脚本即可。

配置java环境和mirai&rhino环境

这样在外部对应文件夹里创建文件就也会”同步到source文件夹了”

请将链接文件夹名称设为source

在proot linux中运行以下代码以配置一下dns并更新软件包至最新并安装java jdk 11

1
2
3
4
5
rm /etc/resolv.conf
touch /etc/resolv.conf
echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" > /etc/resolv.conf
apt update && apt upgrade -y
apt install openjdk-11-jdk vim wget -y

下载mirai-console-wrapper,mirai-api-http和rhino:

1
2
3
4
5
6
7
8
9
10
11
12
wget https://github.com/mamoe/mirai-console-wrapper/releases/download/1.2.0/mirai-console-wrapper-1.2.0-all.jar -Omirai-console.jar
#创建插件文件夹
mkdir plugins && cd plugins
wget https://github.com/mamoe/mirai-api-http/releases/download/v1.7.0/mirai-api-http-v1.7.0.jar -Omirai-api-http-v1.7.0.jar
#创建mirai http api配置文件
mkdir MiraiAPIHTTP
touch MiraiAPIHTTP/setting.yml
#写入配置
echo -e "port: 8080\nauthKey: stageguard" > MiraiAPIHTTP/setting.yml
cd ..
#下载Rhino
wget https://github.com/mozilla/rhino/releases/download/Rhino1_7_12_Release/rhino-1.7.12.jar -Orhino.jar

注意最后一行中的portauthKey,它们分别指定了http api服务运行端口验证密钥,如需要更改请自行更改。
目前Mirai处于开发期,更新频率较快,如果有奇奇怪怪的bug请检查mirai-console-wrapper和mirai-api-http是否有更新。
若更新也不能解决bug,请前往对应项目提交issue

启动mirai-console-wrapper:

1
java -jar mirai-console.jar

首次启动会让你选择版本,我们选择pure版。
选择后会下载mirai core,只需要等待即可。
mirai console启动成功

注:若选错版本,请删除content文件夹后再重新启动。
若出现Connection closed by peer错误,请多试几次。

这样我们就成功启动了mirai console了。
输入/login qq号 qq密码登录一个机器人。



登录成功,已经可以看到发送的消息了。

至此,环境配置告一段落,接下来的内容你得会点儿JavaScript才能看得懂。
如果不懂JavaScript,你可以照葫芦画瓢。


编写定制化bot功能

上一个proot linux会话窗口保留挂mirai console,用startubuntu.sh脚本新开一个proot linux。

新建一个js脚本,复制以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//导入MiraiQQBot库
(function(http_get) {
eval(http_get("https://raw.githubusercontent.com/StageGuard/mirai-rhinojs-sdk/master/source/wrapper.js"));
}((url) => {
var connection = (new java.net.URL(url)).openConnection(), bufferedReader, line, result = "";
connection.setDoInput(true);
var bufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(connection.getInputStream()));
while ((line = bufferedReader.readLine()) != null) result += (line + "\n");
bufferedReader.close(); return result;
}));
//注册一些常量对象到全局对象
Mirai.registerClasses2Object(scope);
//http api服务器地址
Mirai.setServer("http://localhost:8080/");
//验证密钥
Mirai.setAuthKey("stageguard");
//创建新的bot
var bot = Mirai.createNewBot(你的bot qq号);

//订阅bot消息
bot.subscribe({
//订阅群组消息
group: (group, sender, message) => {
group.send(message);
},
friend: (sender, message) => {
if(message.get(POKE).getName() == SIXSIXSIX) {
sender.send(Poke(LIKE));
}
},
});

运行脚本

1
java -jar rhino.js -f 脚本名称.js

出现以下日志,即为运行成功

1
2
3
4
Bot xxxxxxxxxx created.
Verification thread started for xxxxxxxxxx.
Message subscription thread started for xxxxxxxxxx.
Session is verified: xxxx

现在,你的bot就是复读机了(

尝试对你的BOT发送戳一戳中的666。

Poke消息

这仅仅是基本功能,更多sdk方法请看SDK文档

文章作者: StageGuard
文章链接: https://stageguard.top/2020/04/01/run-qqbot-on-termux-android/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 StageGuard