Skip to content

消息推送

可在脚本或源码内调用机器人主动发送消息

使用场景

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

截图

提示

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

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

教学

js code
js
function pushMsg(msg) {
	var api = "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 java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import server.ServerProperties;

public class Bot {
    // 建议这个值改为配置文件加载
    private static final String baseUrl = ServerProperties.getProperty("bot.baseUrl", "http://localhst:9600");
    // 建议这个值改为配置文件加载, 是否启用
    private static boolean enable = ServerProperties.getProperty("bot.enable", false);
    // 建议这个值改为配置文件加载, 群号, 保留值, 现在没用到
    private static String groupId = "";
    // 纯网络 IO, 非 CPU 密集型任务, 可以多分配一下工作线程
    private static ExecutorService executorService = Executors.newFixedThreadPool(16);

    public static void enable() {
        enable = true;
    }

    public static void disable() {
        enable = false;
    }

    /**
     * 异步发送消息, 不阻塞线程, < > & 这 3 个特殊字符要使用 html 字符转义
     * @param content
     */
    public static void sendGroupMessage(String content) {
        if (!enable) return;
        executorService.execute(() -> {
            // 因为部分用户没有 JSON 库, 我这里实现了一个手动转义
            sendPostForJson(baseUrl + "/bot/api/sendGroup", String.format("{\"content\": \"%s\"}", escape(content)));
        });
    }

    /**
     * 异步发送消息, 不阻塞线程, < > & 这 3 个特殊字符要使用 html 字符转义
     * @param content
     */
    public static void sendGroupMessage(String content, String groupId) {
        if (!enable) return;
        executorService.execute(() -> {
            // 因为部分用户没有 JSON 库, 我这里实现了一个手动转义
            // 常见 JSON 库, Jackson FastJson FastJson2
            sendPostForJson(baseUrl + "/bot/api/sendGroup", String.format("{\"content\": \"%s\", \"groupId\": \"%s\"}", escape(content), escape(groupId)));
        });
    }

    private static void sendPostForJson(String url, String data) {
        // 部分老项目没有 http 库, 使用原生方式
        // 有 HttpClient OkHttp 的话, 不建议使用本方式
        HttpURLConnection connection = null;
        OutputStream outputStream = null;
        try {
            connection = (HttpURLConnection)new URL(url).openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);
            outputStream = connection.getOutputStream();
            outputStream.write(data.getBytes(StandardCharsets.UTF_8));
            connection.getResponseCode();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.disconnect();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static String escape(String s) {
        StringBuilder sb = new StringBuilder();
        for (char c : s.toCharArray()) {
            if (c == '\\') {
                sb.append("\\\\");
            } else if (c == '\"') {
                sb.append("\\\"");
            } else if (c == '\t') {
                sb.append("\\t");
            } else if (c == '\r') {
                sb.append("\\r");
            } else if (c == '\b') {
                sb.append("\\b");
            } else if (c == '\n') {
                sb.append("\\n");
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

class CM {
    /**
     * 发送群消息
     * 可变参
     * 1. message
     * 1. message groupId
     */
    public void sendGroup(String... args){
        if (args == null || args.length == 0) {
            // ignore
        } else if (args.length == 1) {
            Bot.sendGroupMessage(args[0]);
        } else if (args.length == 2) {
            Bot.sendGroupMessage(args[0], args[1]);
        }
    }

    /**
     * 更新群消息开关(是否能发送)
     * @param enable
     */
    public void updateBotEnable(boolean enable){
        if (enable) {
            Bot.enable();
        } else {
            Bot.disable();
        }
    }
}
js item code
js
function getItemName(item){
	return Packages.server.MapleItemInformationProvider.getInstance().getName(item.getItemId())
}

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

下载

js
Packages.nange.bot.sendGroupMessage('内容')