Skip to content

开放接口(open-api)

提供外部通过 http 访问内部的实现

提示

非本地调用时, 需要在 配置文件 中添加调用者 IP白名单

内置接口

  • /bot/api/sendGroup 发送群消息, POST 方式, 参数 content, groupId(可选, 默认值为 group.current)
  • /bot/api/sendUser 发送用户消息, POST 方式, 参数 content, userId

自定义接口

代码
java
const config = require('config')

function action(request, response) {
	// 打印 request
	console.log(request)
	const msg = '饿了, 我要吃饭饭'
	bot.sendGroup(config.get('group.current'), msg)
	// 把响应内容放到 response.data 中
	response.data = { msg: 'ok' }
}

访问路径为: /api + 自定义接口路径

如: /api/sendGroupMessage

使用场景

  • 当玩家抽奖获得极品道具时
  • BOSS 击杀竞速刷新榜单时
  • 副本组队召集队友时
  • 秒杀活动即将售空时
  • 发送指定群消息
  • ...

栗子截图

提示

推送的内容是完全自定义的, 图中内容仅作演示

在抽奖脚本中, 获取抽到的道具名, 获取道具属性, 获取中奖玩家名, 然后拼接模板, 最后调用机器人发送消息

某些功能可能需要在源码中实现

在游戏脚本中调用接口

查看 item 名字

details
function getItemName(item) {
	return Packages.server.MapleItemInformationProvider.getInstance().getName(item.getItemId())
}

function getItemNameById(id) {
	return Packages.server.MapleItemInformationProvider.getInstance().getName(id)
}

使用方式

js code
js
function pushMsg(msg) {
    if (java.lang.System.getProperty("bot.enable") == "false") {
        return
    }
    var baseUrl = java.lang.System.getProperty("bot.baseUrl")
	var api = (baseUrl ? baseUrl : "http://localhost:9600") + "/bot/api/sendGroup"
	var ar = new java.lang.Runnable {
		run: function() {
			var out = null;
			var conn = null;
			try{
				conn = new java.net.URL(api).openConnection();
				conn.setRequestMethod("POST");
				conn.setDoOutput(true);
				//获取输出流
				out = new java.io.OutputStreamWriter(conn.getOutputStream(), "UTF-8");
				
				out.write(JSON.stringify({
					content: String(msg)
				}));
				out.flush();
				out.close();
				// 发送请求
				conn.getResponseCode();
			} catch (e) {
				print(e);
			} finally {
				try{
					if (out != null) {
						out.close();
					}
				}catch (e){
					print(e);
				}
				try {
					if (conn != null) {
						conn.disconnect();
					}
				} catch (e) {
					print(e);
				}
			}
		}		
	}
	new java.lang.Thread(ar).start();
}
java code
java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import okhttp3.*;

import java.io.IOException;

public class Bot {
    // 建议这个值改为配置文件加载
    public static String baseUrl = "http://localhost:9600"; // ServerProperties.getProperty("bot.baseUrl", "http://localhost:9600");
    // 建议这个值改为配置文件加载, 是否启用
    public static boolean enable = true; // ServerProperties.getProperty("bot.enable", false);
    private static OkHttpClient okhttp = new OkHttpClient();
    private static ObjectMapper objectMapper = new ObjectMapper();
    // 异常次数, 不要求太精准, 不考虑线程安全
    private static int errorCount;

    /**
     * 异步发送消息, 不阻塞线程, < > & 这 3 个特殊字符要使用 html 字符转义
     * @param content
     * @param groupId 可选参数
     */
    public static void sendGroupMessage(String content, String groupId) {
        ObjectNode objectNode = objectMapper.createObjectNode();
        objectNode.put("content", content);
        if (groupId != null) objectNode.put("groupId", groupId);
        post("/bot/api/sendGroup", objectNode.toString());
    }

    public static void sendGroupMessage(String content) {
        sendGroupMessage(content, null);
    }

    /**
     * 异步发送消息, 不阻塞线程, < > & 这 3 个特殊字符要使用 html 字符转义
     * @param content
     * @param userId 可选参数
     */
    public static void sendGroupMemberMessage(String content, String userId) {
        ObjectNode objectNode = objectMapper.createObjectNode();
        objectNode.put("content", content);
        objectNode.put("userId", userId);
        post("/api/sendGroupMember", objectNode.toString());
    }

    private static void post(String api, String body) {
        if (!enable) return;
        Request request = new Request.Builder()
                // .post(RequestBody.create(body, MediaType.parse("application/json"))) // jdk8+ okhttp4
                // .post(RequestBody.create(MediaType.parse("application/json"), body)) // jdk7 okhttp3
                .post()
                .url(baseUrl + api)
                .build();
        okhttp.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                if (++errorCount > 5) enable = false;
            }

            @Override
            public void onResponse(Call call, Response response) {
                errorCount = 0;
            }
        });
    }
}

/**
 * 使用时, 删除本类
 * 把下面方法放入 cm 对象中, 脚本通过 cm.sendGroupMessage() 发送消息
 */
class CM {
    /**
     * 发送群消息
     * @param content
     */
    public void sendGroupMessage(String content) {
        Bot.sendGroupMessage(content);
    }

    /**
     * 发送群成员消息(临时)
     * @param content
     * @param userId
     */
    public void sendGroupMemberMessage(String content, String userId) {
        Bot.sendGroupMemberMessage(content, userId);
    }

    /**
     * 开启或关闭机器人
     * @param enable
     */
    public void enableBot(boolean enable) {
        Bot.enable = enable;
    }

    /**
     * 机器人状态
     */
    public boolean botStatus() {
        return Bot.enable;
    }
}

下载依赖(jdk8)  下载依赖(jdk7)  也可以前往 maven 仓库自行下载

jar in script

下载

将 jar 放至 lib 目录下

在工作目录新建 bot.properties 配置文件

在脚本中使用

js
Packages.mxd.bot.sendGroupMessage('内容')   // 发送信息