最新QQ与MUD消息互通 相对简单。

效果

file


要实现这种效果需要用到的文档及工具

  1. 泥芯框架的HTTP类【也可以手搓,造车轮确实有***】
  2. napcatQQ协议实现工具

实现方法

第一步:

将napcatQQ协议工具下载到自己服务器上。下载地址 如果服务器是windows server 下载无头绿色版本,解压后即可。 linux服务器使用此命令一键安装 curl -o napcat.sh https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.sh && sudo bash napcat.sh windos版解压后,双击napcat.bat文件启动即可。 启动后需要扫码登录QQ。 这个QQ可以选择一个不常用或者新注册一个。登录后不可在其他平台同时登录。 登录成功后进入解压目录->versions->9.9.16-29927->resources->app->napcat->config 文件夹。在此文件夹下有webui.json文件。 查看文件内登录端口tocken。 服务器放行此端口后,在浏览器输入 服务器IP地址:端口/webui 例如 135.222.255.255:6099/webui 在打开的界面下输入tocken即可,就进入了管理后台。

后台管理页面

file

选择网络配置,添加配置,添加http服务器websocket服务器。 名称随意。 file 添加成功后多读此QQ协议文档。

第二步:

有泥芯框架的跳过。没有的需要下载泥芯框架或者直接将Http.c文件放到自己的inherit文件夹中,做继承使用。(注:在不熟悉LPC语言的情况下不要去更改此文件内任何内容。)

新建文件 /adm/daemons/qq_mud.c //此文件主要用于创建ws连接,并处理qq事件。比如群消息传入到游戏中等。

#include <ansi.h>
inherit CORE_HTTP; //继承Http.c类
private void cl_message(mapping data){
      //处理bot上报事件数据 如发送到聊天
}
// 接收到数据时调用的回调函数
private void receive_data(int fd, mixed result)
{
  mapping data;
    data=by_jsdencoding(result); //将上报事件数据处理为mapping数据
  cl_message(data); // 处理数据

}
private void write_data(int fd)
{
    string key=get_socket_key(); //生成随机sec-websockey-key
  string header="GET /event HTTP/1.1\r\nHost:127.0.0.1:33322\r\nConnection:Upgrade\r\nUpgrade:websocket\r\nSec-WebSocket-Key:"+key+"\r\nSec-WebSocket-Version: 13\r\n\r\n";
  socket_write(fd,header); //传入协议头 建立ws连接。

}
private void receive_callback(int fd, mixed result, string addr)
{
  debug(result);
    // 此方法无效
}

private void socket_shutdown(int fd)
{
    socket_close(fd); //关闭socket连接
}
void write_callback(int fd)
{
 socket_close(fd); 
}

protected void read_callback(int fd, string str)
{
  debug("read_callback:   "+str);
}

void create(){
    mapping body=([]);
    string url = "ws://127.0.0.1:33322";
    seteuid(getuid());
    Http::ws(url, body);
}

测试此文件,如果回调函数有传回数据,且为napcat正常响应数据则连接成功。

创建文件 /adm/daemons/qq_msg.c //此文件用于主动发送数据到QQ中。

#include <ansi.h>
inherit CORE_HTTP;

void send_msg(string arg,int qqh){  //mud消息发送到QQ  不指定后面的参数发送到群,指定后面的参数发送给参数qq号
    string qq;
    string body;
    string url="http://127.0.0.1:3000/send_msg";
  qq=qqh+"";
    if(!qqh){
        body = @RAW
{
        "message_type": "group",
        "group_id": 208046183,
        "message":[
          {
            "type": "text",
            "data": {
                    "text": "%^msg%^"
                         }
          }
    ]
}
RAW;
    body = terminal_colour(body, ([
        "msg":arg,
    ]));
    }else{
        body = @RAW
{
        "message_type": "private",
        "user_id": %^used%^,
        "message":[
          {
            "type": "text",
            "data": {
                    "text": "%^msg%^"
              }
          }
    ]
}
RAW;
    body = terminal_colour(body, ([
        "used":qq,
        "msg":arg,
    ]));

    }

     Http::post(url, body);

}

测试 send_msg函数。

至此通信完成。 至于发送数据为啥用http不用ws,是因为我还没搞懂ws发送数据的问题。 现在协议头有问题,用ws发送数据一直出错。所以暂时用http发送数据将就。 写在最后: http服务器端口设置为多少,qq_msg.c文件中的url中的端口就写为多少,我的是3000就用的3000举例。同理,websocket端口设置为多少,qq_mud.c中url和head协议头中的端口都更改为你设置的端口。 会python的直接用python更加省力。 如有更好方法的可随时沟通交流。

京ICP备13031296号-4