不再维护此仓库,请前往 iTXTech/mirai-js 查看另一个基于 Mozilla Rhino 和 Mirai 的 SDK。
为Mirai的mirai-api-http提供封装好的适用于全平台的SDK。
Mozilla Rhino: JavaScript in Java
Rhino is an implementation of JavaScript in Java.
Rhino是一个可以在JavaScript上运行Java程序的库。
为Mirai的mirai-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
接口,处理消息并发送。
你只需要在W3school简单学习基础语法就可以开始使用了。
现在开始使用!
core版本
core版本暂不可用,请等待发布
http版本
前往mirai-console和mirai-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)
前往mozilla/rhino项目release界面下载rhino运行库(rhino-xxx.jar而不是rhino-runtime-xxx.jar)
//导入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。
尽情享用吧!
提供一些demo帮助快速理解并开发。
所有功能均为测试版,少部分功能(如加群响应,移除群员等功能未测试),若有BUG请开issue反馈。
所有SDK提供的方法请参考SDK文档
- 编写SDK文档
- 支持监听EventMessage
- 将MozillaRhino整合成mirai插件
- 修复
Image
/FlashImage
消息无法发送本地图片(#4)。
discord
→discard
。- 添加
MessageChain.contains
以更好地判断消息 Mirai.utils.http
和Mirai.utils.files
兼容rsync.stop()
。- 修改了
MessageChain.__convert
的判断逻辑。
文档已更新,MessageChain.contains
的用法请浏览SDK文档。
- 调用
Mirai.registerClasses2Object
时Mirai.utils
类也会注册到指定对象。 - 添加
Mirai.__BotManager
中的检验管理和消息监听管理,其管理工作移动到Mirai.Bot
。 - 添加工具类
Mirai.utils.rsync
,允许在rhino中异步执行(其本质是Thread
的封装)。 - 修复了一些逻辑问题和bug。
- 修复了MessageSender.at()消息的问题。
- 添加
Mirai.loadExternalObject
允许加载外部脚本。
文档已更新,新事件和方法浏览SDK文档。
BREAKING CHANGES
- 完全重构MiraiBot_HTTP.js并更名为MiraiQQBot.http.js
- 简化部署方式
- 新的bug。
文档已更新,新事件和方法浏览SDK文档。
Session.sendTempMessage
适配http api 1.6.2版本。- 添加
EventType.NEW_FRIEND_REQUEST
和EventType.NEW_MEMBER_JOIN_REQUEST
以支持监听新好友请求和新加群请求事件。 - 添加
Session.handleFriendRequest
和Session.handleMemberJoinRequest
以处理新好友请求和新加群请求。
文档已更新,新事件和方法浏览SDK文档。
- 添加
Session.sendTempMessage
以支持发送临时消息。 - 发送好友消息支持引用。
- 添加
Session.get(Friend/Group/GroupMember)List
以支持获取好友/群/群成员列表。 - 添加
Session.(un)mute(All)
以支持(全体)(解除)禁言。 - 添加
Session.kick
以支持踢出群成员。 - HTTP Post/Get 内置,不再需要NetworkUtils模块。
- 修复了bug和一些逻辑问题。
文档已更新,新用法浏览SDK文档。
- 为
Mirai.GroupInfo
的构造函数添加null判断 Mirai.connect()
中的post auth修改到Mirai.auth()
,添加Mirai.Session.reAuth()
用于session失效后的重认证- 修复了小bug
文档已更新。
- 修改了
Permission
的父类为Mirai.GroupInfo
GroupSenderInfo.getGroupInfo()
改为GroupSenderInfo.getGroup()
- 添加了
Mirai.EventType(Const)
事件类型,现在可以监听事件了。 Mirai.MessageListener.hookOtherMessage(JSON msg)
改为Mirai.MessageListener.hookEvent(Mirai.EventType.? event)
来hook事件
文档已更新。
- 适配
mirai-api-http
1.5版本的接口/fetchMessage
返回的数据格式。 - 添加
Mirai.MessageType.FlashImage
闪照消息类型,用法与Mirai.MessageType.Image
相同。 - 为
Mirai.MessageType.Image
构造函数增加了path
参数,表示发送本地图片的路径,该路径是相对于plugins/MiraiAPIHTTP/images/
的。
文档未更新。
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。
文档未更新。
- 修改
MessageChain.build
的构造方式(原来的不受影响) - 添加
Session.getCachedMessage
方法 - 添加
MessageChain.discordMessage
方法 - 添加
MessageChain.addMessage
方法 - 添加
MessageChain.addMessageF
方法 - 添加
MessageChain.toChainArray
方法
有关这些新方法的用法请看SDK文档
- 修复运行30分钟后出现的bug.
- 添加消息撤回方法:Mirai.Session.recall().
- 修复了捕捉消息出现错误时对错误的处理错误
- 修复了不能抓取其他类型消息的bug
- 首次提交
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/>.