/mirai-rhinojs-sdk

为Mirai API Http提供封装好的适用于Mozilla Rhino的SDK,适配Auto.js。

Primary LanguageJavaScriptGNU Affero General Public License v3.0AGPL-3.0

Deprecated

不再维护此仓库,请前往 iTXTech/mirai-js 查看另一个基于 Mozilla Rhino 和 Mirai 的 SDK。

mirai-rhinojs-sdk

Miraimirai-api-http提供封装好的适用于全平台的SDK。

Mozilla Rhino是什么?

Mozilla Rhino: JavaScript in Java

Rhino

Rhino is an implementation of JavaScript in Java.

Rhino是一个可以在JavaScript上运行Java程序的库。


简介

Miraimirai-api-http提供封装好的适用于全平台的SDK。

如何适用全平台?

Windows/Linux用户可以下载rhino运行库运行脚本。

安卓用户可以在Termux配置java环境或下载基于rhino的应用(如Auto.js)

如何简单易用?

下面提供一个简单的例子:

//将消息类型等静态常量注册进全局对象
Mirai.registerClasses2Object(this);
//设置http api服务器地址和验证密钥
Mirai.setServer("http://localhost:8081/");
Mirai.setAuthKey("stageguard");
//创建一个新的bot
var bot = Mirai.createNewBot(你的qq号);
//订阅bot消息
bot.subscribe({
  //订阅群组消息
  group: (group, sender, message) => {
    message.contains("回复测试").then(() => {
        //回复这个群友,以下方法是等价的
        group.reply("回复你了1");
        group.reply(Plain("回复你了2"));
        sender.reply("回复你了3");
        bot.sendGroupMessage(group, [Plain("回复你了4")], sender.getSourceId());
      }).contains("at测试").then(() => {
        //at这个群友,以下方法是等价的
        sender.at("at你了1");
        group.at(sender, "at你了2");
        group.send(At(sender) + Plain("at你了3"));
        bot.send(group, At(sender) + Plain("at你了4"));
        bot.send(group, At(sender), Plain("at你了5"));
        bot.sendGroupMessage(group, [At(sender), Plain("at你了6")]);
      }).contains("私聊我").then(() => {
        //自动判断有无好友
        sender.send("私聊你了1");
        //自动判断有无好友
        bot.send(sender, "私聊你了2");
        //手动判断
        if(bot.haveFriend(sender)) {
          bot.sendFriendMessage(sender, [Plain("私聊你了3")]);
        } else {
          bot.sendTempMessage(sender, group, [Plain("私聊你了3")]);
        }
      }).contains("禁言").then(() => {
    	//group中的permission参数表示的是bot在这个群组的权限
        //sender中的permission参数表示消息发送者在这个群组的权限
        if(group.getPermission() == MEMBER || sender.getPermission() == OWNER) {
          group.send("我没有权限做那个!");
        } else {
          //若无At类型消息,get()则返回一个参数都为null的新消息对象
          if(message.get(AT).getTarget() != null) {
            //禁言60秒,以下方法都是等价的
            //获取at类型消息的target参数(被at的人的qq号)
            var target = message.get(AT).getTarget();
            bot.mute(group, target, 60);
            bot.unmute(group, target);
            group.mute(target, 60);
            group.unmute(target);
          }
        }
      });
  },
  friend: (sender, message) => {},
  //订阅其他事件
  event: (event) => {
    switch(event.type) {
      //自动拒绝好友请求
      case NEW_FRIEND_REQUEST:
        event.reject();
      break;
      //bot下线
      case BOT_OFFLINE:
      case BOT_OFFLINE_FORCE:
      case BOT_OFFLINE_DROPPED:
        bot.destroy();
      break;
    }
  },
  error: (e) => {
    Log.e(e);
  },
});

mirai-rhinojs-sdk提供了非常灵活的语法,允许你多种方式实现同一功能,尽量做到符合逻辑,同时提供多种消息类型构造方式:

sender.send(At(1355416608), Plain("at你了"));
//文本消息的构造函数可以省略
sender.send(At(1355416608), "at你了");
//伪操作符重载
//伪操作符重载方式不能省略文本消息的构造函数
sender.send(At(1355416608) + Plain("at你了"));

mirai-rhinojs-sdk将会有两个版本,它们的用法大部分都是相同的,但略有区别:

  • (未实现)core: 此版本将mirai-core作为依赖使用,不需要预先部署mirai-console,这也意味着使用此版本将无法使用mirai-console插件。
  • (可用)http: 此版本基于mirai-console的插件mirai-api-http,该版本的通讯交互为轮询fetchMessage接口,处理消息并发送。

快速开始:

我不会JavaScript

你只需要在W3school简单学习基础语法就可以开始使用了。

我会JavaScript

现在开始使用!

core版本

core版本暂不可用,请等待发布


http版本

部署mirai-console

前往mirai-consolemirai-api-http的release界面下载最新版本的wrapper和mirai-api-http,按照mirai-api-http的README做好配置。

安卓用户请浏览mzdluo123/MiraiAndroid项目下载mirai android app或浏览我的博客在termux部署。

运行脚本

请选择你的平台查看

Android(AutoJS)

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

//导入MiraiQQBot库
eval(http.get("https://raw.githubusercontent.com/StageGuard/mirai-rhinojs-sdk/master/source/wrapper.js").body.string());
//注册一些常量对象到全局对象
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));
    }
  },
 });

运行脚本

Windows/Linux/Android(Termux)

下载rhino运行库

前往mozilla/rhino项目release界面下载rhino运行库(rhino-xxx.jar而不是rhino-runtime-xxx.jar)

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

//导入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) => {
    message.contains(SIXSIXSIX).then(() => sender.send(Poke(LIKE)));
  },
 });

运行脚本

java -jar rhino.js -f your_script.js

出现以下日志,即为运行成功
Bot xxxxxxxxxx created.
Verification thread started for xxxxxxxxxx.
Message subscription thread started for xxxxxxxxxx.
Session is verified: xxxx

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

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

Poke消息

尽情享用吧!

提供一些demo帮助快速理解并开发。


所有功能均为测试版,少部分功能(如加群响应,移除群员等功能未测试),若有BUG请开issue反馈。

所有SDK提供的方法请参考SDK文档


To-Do

  • 编写SDK文档
  • 支持监听EventMessage
  • 将MozillaRhino整合成mirai插件

更新日志

2020.06.26 → 1.6.4

  • 修复Image/FlashImage消息无法发送本地图片(#4)

2020.05.31 → 1.6.3

  • discorddiscard
  • 添加MessageChain.contains以更好地判断消息
  • Mirai.utils.httpMirai.utils.files兼容rsync.stop()
  • 修改了MessageChain.__convert的判断逻辑。

文档已更新,MessageChain.contains的用法请浏览SDK文档

2020.05.17 → 1.6.2

  • 调用Mirai.registerClasses2ObjectMirai.utils类也会注册到指定对象。
  • 添加Mirai.__BotManager中的检验管理和消息监听管理,其管理工作移动到Mirai.Bot
  • 添加工具类Mirai.utils.rsync,允许在rhino中异步执行(其本质是Thread的封装)。
  • 修复了一些逻辑问题和bug。

2020.05.02 → 1.6.1

  • 修复了MessageSender.at()消息的问题。
  • 添加Mirai.loadExternalObject允许加载外部脚本。

文档已更新,新事件和方法浏览SDK文档

2020.05.02 → 1.6.0

BREAKING CHANGES

  • 完全重构MiraiBot_HTTP.js并更名为MiraiQQBot.http.js
  • 简化部署方式
  • 新的bug。

文档已更新,新事件和方法浏览SDK文档

2020.04.14 → 1.5.1

  • Session.sendTempMessage适配http api 1.6.2版本。
  • 添加EventType.NEW_FRIEND_REQUESTEventType.NEW_MEMBER_JOIN_REQUEST以支持监听新好友请求和新加群请求事件。
  • 添加Session.handleFriendRequestSession.handleMemberJoinRequest以处理新好友请求和新加群请求。

文档已更新,新事件和方法浏览SDK文档

2020.04.12 → 1.5_alpha

  • 添加Session.sendTempMessage以支持发送临时消息。
  • 发送好友消息支持引用。
  • 添加Session.get(Friend/Group/GroupMember)List以支持获取好友/群/群成员列表。
  • 添加Session.(un)mute(All)以支持(全体)(解除)禁言。
  • 添加Session.kick以支持踢出群成员。
  • HTTP Post/Get 内置,不再需要NetworkUtils模块。
  • 修复了bug和一些逻辑问题。

文档已更新,新用法浏览SDK文档

2020.04.07 → 1.4.1_alpha

  • Mirai.GroupInfo的构造函数添加null判断
  • Mirai.connect()中的post auth修改到Mirai.auth(),添加Mirai.Session.reAuth()用于session失效后的重认证
  • 修复了小bug

文档已更新。

2020.04.07 → 1.4_alpha

  • 修改了Permission的父类为Mirai.GroupInfo
  • GroupSenderInfo.getGroupInfo()改为GroupSenderInfo.getGroup()
  • 添加了Mirai.EventType(Const)事件类型,现在可以监听事件了。
  • Mirai.MessageListener.hookOtherMessage(JSON msg) 改为 Mirai.MessageListener.hookEvent(Mirai.EventType.? event)来hook事件

文档已更新。

2020.04.06 → 1.3.1_alpha

  • 适配mirai-api-http 1.5版本的接口/fetchMessage返回的数据格式。
  • 添加Mirai.MessageType.FlashImage闪照消息类型,用法与Mirai.MessageType.Image相同。
  • Mirai.MessageType.Image构造函数增加了path参数,表示发送本地图片的路径,该路径是相对于plugins/MiraiAPIHTTP/images/的。

文档未更新。

2020.04.06 → 1.3_alpha

  • Session.sendMessage现在直接可以发送Mirai.MessageType.?消息而无需仅为了一个消息对象构建消息链。
  • Mirai.GroupInfo.getBotPermission方法改名为Mirai.GroupInfo.getPermission
  • 添加Mirai.GroupInfo.Permission群组权限常量OWNER, ADMIN和MEMBER
  • 添加Mirai.EventType事件类型和Mirai.EventTypeConst事件类型常量。也就是说现在支持监听事件了。
  • (Mirai.MessageListener中的hookOtherMessage(JSON msg)改成hookEvent(Mirai.EventType.? event))
  • demo.js更新,为了展示这次MiraiBot_HTTP.js的新特性。
  • 修复了一些遗留bug。

文档未更新。

2020.04.05 → 1.2_alpha

  • 修改MessageChain.build的构造方式(原来的不受影响)
  • 添加Session.getCachedMessage方法
  • 添加MessageChain.discordMessage方法
  • 添加MessageChain.addMessage方法
  • 添加MessageChain.addMessageF方法
  • 添加MessageChain.toChainArray方法

有关这些新方法的用法请看SDK文档

2020.04.05 → 1.1_alpha

  • 修复运行30分钟后出现的bug.
  • 添加消息撤回方法:Mirai.Session.recall().
  • 修复了捕捉消息出现错误时对错误的处理错误
  • 修复了不能抓取其他类型消息的bug

2020.04.04 → 1.0_alpha

  • 首次提交

License

mirai-rhinojs-sdk
Copyright (C) 2020  StageGuard

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.