Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >autMan奥特曼机器人-对接gewechat教程

autMan奥特曼机器人-对接gewechat教程

作者头像
季春二九
发布于 2025-01-11 02:11:04
发布于 2025-01-11 02:11:04
1.3K00
代码可运行
举报
文章被收录于专栏:季春二九季春二九
运行总次数:0
代码可运行

autMan与Gewechat对接操作步骤

前提要求

需将autMan更新至3.3.6及以上版本。

Gewe项目地址

Gewe的项目地址为:https://github.com/Devo919/Gewechat

一、搭建Gewe

拉取镜像: 执行命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull registry.cn-hangzhou.aliyuncs.com/gewe/gewe:latest

然后使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker tag registry.cn-hangzhou.aliyuncs.com/gewe/gewe gewe

命令进行标记。

创建目录并运行容器

  • 先执行创建目录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /root/temp
  • 再运行命令来启动容器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -itd -v /root/temp:/root/temp -p 2531:2531 -p 2532:2532 --privileged=true --name=gewe gewe /usr/sbin/init
  • 注意事项:启动基本正常,但要关闭访问国外网站环境,否则登录不上微信号。启动后查看docker的日志,若无异常提醒,等两分钟后再去通过访问管理地址(IP+端口号2531)查看是否正常运行。
2025-01-10T07:51:46.png
2025-01-10T07:51:46.png

解决可能出现的问题: 若运行该镜像后日志出现bash Failed to allocate manager object, freezing 1提示:

  • 解决方法1

使用第三方粉丝重新打包的镜像registry.cn-chengdu.aliyuncs.com/tu1h/wechotd:alpine,此镜像仅提升系统版本,不会出现上述错误,使用该镜像后无需看解决方法2的内容。 第三方粉丝重新打包的镜像,操作如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull registry.cn-chengdu.aliyuncs.com/tu1h/wechotd:alpine
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker tag registry.cn-chengdu.aliyuncs.com/tu1h/wechotd:alpine gewe
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir temp
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -itd \
 -v /root/temp:/root/temp \
 -p 2531:2531 \
 -p 2532:2532 \
 --privileged=true \
 --restart unless-stopped \
 --name=gewe_autman \
 gewe
  • 解决方法2

让系统同时兼容cgroup v1和v2,操作如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 - 编辑`/etc/default/grub`文件,添加内容`GRUB_CMDLINE_LINUX="SYSTEMD_CGROUP_ENABLE_LEGACY_FORCE=1 systemd.unified_cgroup_hierarchy=0"`- 执行`regenerate grub.cfg`(实际操作可能是对应的生成配置文件命令,如`grub-mkconfig -o /boot/grub/grub.cfg`)。
 - 执行`reboot system`命令重启系统,重启后再次运行创建的容器。

访问管理地址IP+端口号2531访问 如图:

2025-01-10T07:52:20.png
2025-01-10T07:52:20.png
二、登录Gewechat

更新autMan官方市场最新的Gewechat登录器插件,设置好配参之后,给你的bot发送指令gewechat,然后根据提示操作。注意最后填写回调地址时不要写autman文件里面那个ws地址,要写http://奥特曼ip:端口/gw/receive

三、进行autman和gewechat的对接

将以下代码复制到文件adapter_gw_http.js中(文件名固定,不要修改),并将adapter_gw_http.js文件放进autMan主文件夹中plugin/adapters下面,然后重启autMan。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//[param: {"required":true,"key":"im.gw.gewe_url","bool":false,"placeholder":"","name":"Gewechat接口地址","desc":"示例:http://192.168.31.49:2531"}]
//[param: {"required":true,"key":"im.gw.gewe_token","bool":false,"placeholder":"","name":"Gewechat的Token","desc":"示例:203ae5a1028b4299a5d9cc6168e5ab88"}]
//[param: {"required":true,"key":"im.gw.gewe_appId","bool":false,"placeholder":"","name":"Gewechat的appId","desc":"示例:wx_9iXhu-hi8NE_NIuDHKPV_"}]
//[param: {"required":true,"key":"im.gw.gewe_uuid","bool":false,"placeholder":"","name":"Gewechat的uuid","desc":""}]
const { WebSocket } = require('ws');
const axios = require('axios');
const middleware = require('./plugin/scripts/middleware.js');
var imHttpApi, token, appId, port;

// 接收自动数据
async function receiveAutData(websocketAut) {
    websocketAut.on('message', async (message) => {
        try {
            console.log(`【gewechat适配器】Received from gewe: `);
            const messageJson = JSON.parse(message);
            console.log(`【gewechat适配器】解析json信息完成`);
            // 判断消息来源,并传递给对应的处理函数
            if ("Data" in messageJson && "TypeName" in messageJson) {
                // 消息来自社交平台,调用fromgw处理
                await fromgw(websocketAut, messageJson);
            } else if ("aut_echo" in messageJson) {
                // 消息来自aut,调用fromaut处理
                await fromaut(websocketAut, messageJson);
            }
        } catch (e) {
            console.log(`【gewechat适配器】JSON解析错误: `);
        }
    });
}

// 处理来自gewechat的消息
async function fromgw(websocketAut, messageJson) {
    const wxid = messageJson.Wxid; // 发送者微信ID
    const msg_data = messageJson.Data; // 消息数据
    if (msg_data) {
        // 判断是否为自己发送的消息
        if (msg_data['FromUserName']['string'] === wxid) {
            console.log("【gewechat适配器】自己的消息不做处理");
            return; // 自己的消息不处理
        }
        console.log("【gewechat适配器】开始处理消息:", JSON.stringify(msg_data));
        // 判断是群聊还是私聊
        const isGroupChat = msg_data['FromUserName']['string'].includes('@chatroom');
        const fromUserName = msg_data['FromUserName']['string'];
        const toUserName = messageJson.Wxid; // 使用发送方的微信ID作为toUserName
        const pushContent = msg_data['PushContent']? msg_data['PushContent'] : msg_data["Content"]["string"]; // 消息内容
        const content = msg_data["Content"]["string"].split(":\n").length > 1? msg_data["Content"]["string"].split(":\n")[1] : msg_data["Content"]["string"];
        const msgId = msg_data['MsgId']? msg_data['MsgId'].toString() : "";
        // 提取用户名(冒号前的部分)
        let userName = pushContent? pushContent.split(':')[0].trim() : ""; // 从PushContent中提取用户名
        const commsg = {
            bot_id: toUserName, // 使用发送方的微信ID作为bot_id
            user_name: userName, // 从PushContent中提取的用户名
            im_type: "gw",
            message_id: msgId, // 使用NewMsgId作为消息ID
            content: content // 消息内容(冒号后的部分)
        };
        // 根据消息类型确定chat_id和user_id
        if (isGroupChat) {
            commsg["chat_id"] = fromUserName; // 群聊ID
            commsg["user_id"] = userName; // 发消息的用户ID
        } else {
            commsg["user_id"] = fromUserName; // 单聊对方ID
        }
        var str = JSON.stringify(commsg);
        await websocketAut.send(str);
    } else {
        console.log("【gewechat适配器】data is null or undefined");
    }
}

// 处理来自aut的消息
async function fromaut(websocketAut, messageJson) {
    if (messageJson["aut_action"] === "reply_message" || messageJson["aut_action"] === "push_message") {
        const autEcho = messageJson["aut_echo"];
        var send_content = messageJson['aut_params']['content'];
        let final_text = send_content;
        let images = [];
        try {
            const regex = /\[CQ:image,file=.*?\]/g;
            // 判断正则表达式匹配图片链接
            if (send_content.match(regex) === null) {
                // 没有图片链接,直接发送文本消息
                const replyMessage = {
                    appId: appId, // 替换成实际的设备ID
                    toWxid: messageJson["aut_params"]["chat_id"]? messageJson["aut_params"]["chat_id"] : messageJson["aut_params"]["user_id"],
                    content: final_text,
                };
                const messageId = await postData(replyMessage, imHttpApi + '/v2/api/message/postText');
                //必须给autMan发送回执
                const echoMessage = {
                    aut_echo: autEcho,
                    aut_params: messageId? `` : "",
                };
                await websocketAut.send(JSON.stringify(echoMessage));
                return;
            }
            // 有图片链接,提取图片链接
            const matches = send_content.match(regex);
            for (let index = 0; index < matches.length; index++) {
                const image = matches[index];
                final_text = final_text.replace(image, '');
                var tmp = image.replace("[CQ:image,file=", "").replace("]", "");
                if (tmp) {
                    images.push(tmp);
                }
            }
        } catch (error) {
            console.log("【gewechat适配器】提取图片出错:", error);
        }
        final_text = final_text.replace(/\s*\n\s*\n/g, '\n'); // 去掉连续的空行
        let echo_messageIds = [];
        // 发送文本消息
        if (final_text.length > 0) {
            const replyMessage = {
                appId: appId, // 替换成实际的设备ID
                toWxid: messageJson["aut_params"]["chat_id"]? messageJson["aut_params"]["chat_id"] : messageJson["aut_params"]["user_id"],
                content: final_text,
            };
            const messageId = await postData(replyMessage, imHttpApi + '/v2/api/message/postText');
            if (messageId) {
                echo_messageIds.push(``);
            }
        }
        // 发送图片消息
        if (images.length > 0) {
            for (let index = 0; index < images.length; index++) {
                const image = images[index];
                const replyMessage = {
                    appId: appId, // 替换成实际的设备ID
                    toWxid: messageJson["aut_params"]["chat_id"]? messageJson["aut_params"]["chat_id"] : messageJson["aut_params"]["user_id"],
                    imgUrl: image, // 图片URL
                };
                const messageId = await postData(replyMessage, imHttpApi + '/v2/api/message/postImage');
                console.log("【gewechat适配器】发送图片消息的返回值:", messageId);
                if (messageId) {
                    echo_messageIds.push(``);
                }
            }
        }
        //必须给autMan发送回执且只能发送一次
        const echoMessage = {
            aut_echo: autEcho,
            aut_params: echo_messageIds? echo_messageIds : "",
        };
        await websocketAut.send(JSON.stringify(echoMessage));
    }
}

// 发送数据到HTTP接口,返回msgId或null
async function postData(data, url) {
    try {
        const headers = {
            'Content-Type': 'application/json',
            'X-GEWE-TOKEN': token,
        };
        const response = await axios.post(url, data, { headers });
        console.log('【gewechat适配器】Response:', response.data);
        return response.data.data.msgId; // 根据API文档,msgId在data对象内
    } catch (error) {
        console.error('【gewechat适配器】Error sending POST request:', error);
        return null;
    }
}

//获取token,返回token或null
async function getToken() {
    try {
        const headers = {
            'Content-Type': 'application/json',
        };
        const response = await axios.post(imHttpApi + "/v2/api/tools/getTokenId", {}, { headers });
        console.log('【gewechat适配器】Response:', response.data);
        return response.data.data;
    } catch (error) {
        console.error('【gewechat适配器】Error sending POST request:', error);
        return token;
    }
}

// 主函数,启动WebSocket连接
async function main() {
    // //不断更新token
    // setInterval(async () => {
    //   token = await getToken();
    // }, 1000 * 60); //每分钟获取一次token
    //下面的地址需要根据自己autMan的端口修改一下
    while (true) {
        port = await middleware.port();
        imHttpApi = await middleware.bucketGet("im.gw", "gewe_url");
        token = await middleware.bucketGet("im.gw", "gewe_token");
        appId = await middleware.bucketGet("im.gw", "gewe_appId");
        if (imHttpApi && token && appId && port) {
            break;
        } else {
            //等待5s
            await new Promise((resolve) => setTimeout(resolve, 5000));
        }
    }
    let uriAut = `ws://127.0.0.1:/gw/adapter`;
    console.log(`【gewechat适配器】Connecting to autMan at `);
    const websocketAut = new WebSocket(uriAut);
    await receiveAutData(websocketAut);
}
main();
2025-01-10T07:52:55.png
2025-01-10T07:52:55.png

若使用Gewechat设置器成功登陆后会自动生成相关3个参数,无需自己填写。

2025-01-10T07:53:02.png
2025-01-10T07:53:02.png
四、适配器设置,启用并重启autMan
2025-01-10T07:53:12.png
2025-01-10T07:53:12.png

完成上述对接操作后,启用相关设置并重启autMan,使其生效。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你在飞书中搭建机器人
大家好,我是潇潇雨声。飞书是一款在国内广受欢迎的企业内部管理和协同工具,同时也可以作为一个强大的个人知识管理工具。在本文中,我将帮助你迅速创建一个飞书对话机器人,并嵌入 chatGPT 的功能。这个机器人可以直接回答你的问题,也可以在群聊中被@,从而以 chatGPT 的方式提供回应。通过这样的操作,你的飞书机器人将迅速蜕变成一个支持 chatGPT 的智能助手。
用户10517932
2023/12/24
2.1K0
手把手教你在飞书中搭建机器人
unicloud云函数开发微信客服消息自动回复图片消息(完整步骤)
此时点击提交,会提示你Token校验失败,请检查确认,不要慌,只是云函数里面没有写而已。这个时候就可以去写云函数的代码了~~
猿来是前端
2022/09/19
1.5K0
unicloud云函数开发微信客服消息自动回复图片消息(完整步骤)
手把手教你用uniCloud云函数开发微信客服消息机器人
我们回到咱们的uniCloud项目,新建一个云函数,命名为xcxcontact(命名可以自己定)
大帅老猿
2022/03/03
2K1
手把手教你用uniCloud云函数开发微信客服消息机器人
基于 Python 后端的聊天软件机器人开发
其中 intents 表示监听事件,监听事件后通过实现 client 的 on_XX 方法可以获取并响应对应事件
dandelion1990
2024/03/11
8440
nodejs微信公众号开发
网上关于node开发公众号的资料相当缺乏,本文旨在以node的视角对公众号开发做一个阐述。
一粒小麦
2019/08/06
6.4K4
微信 接入机器人 java_Java版微信机器人代码
package com.eiyoung.wechat.web.controller;
全栈程序员站长
2022/07/04
1.3K0
小程序客服功能开发之对接闲聊机器人
button组件设置open-type="contact"支持打开客服会话,但实际上很多人都不知道此功能如何使用,没必要去申请第三方平台,也不用认证企业号,什么类型的小程序都行,几行代码搞定
许坏
2019/07/18
1.7K0
小程序客服功能开发之对接闲聊机器人
给公众号接入FastWiki智能AI知识库,让您的公众号加入智能行列
在FastWiki.Service项目中的Service目录创建WeChatService用于实现微信公众号接入功能,具体代码如下,
用户10786849
2024/05/18
2160
给公众号接入FastWiki智能AI知识库,让您的公众号加入智能行列
微信公众号接入智能聊天机器人
本文主要介绍如何接入智能聊天机器人实现对用户消息的回复。 实现思路 用户在公众号会话内发送消息后,后台接收用户的文本消息并将消息发送至智能机器人API后转发API的返回结果给用户(是不是很简单?
薛定喵君
2020/08/24
3.3K0
微信公众号接入智能聊天机器人
【教程】如何用腾讯云服务器搭建微信公众号机器人?
我们经常在一些公众号里回复信息,微信公众号都会自动回复信息,区别于微信平台的自动回复,有的公众号上面的自动回复,则更像是一个机器人客服。下面小编就教大家如何搭建微信公众号机器人。
云上云
2019/07/10
13.7K0
【教程】如何用腾讯云服务器搭建微信公众号机器人?
独立开发微信公众号服务的一次复盘
上篇文章主要分享了异步编程的一些经验。主要包括回调函数,发布订阅,Promise,async await以及yield关键字。
terrence386
2022/07/14
4530
独立开发微信公众号服务的一次复盘
超全60000多字详解 14 种设计模式 (多图+代码+总结+Demo)
沉浸式趣谈
2024/03/13
1120
超全60000多字详解 14 种设计模式 (多图+代码+总结+Demo)
微信公众号开放接口自定义收发消息
文档地址:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Explanation_of_interface_privileges.html
biaoblog.cn 个人博客
2025/05/21
1380
小程序开发知识点总结
我承认,最近比较懒了,博客也很久没更新了,太对不住自己了,做了一段时间小程序开发,总结了一些知识点,直接上菜。
用户1141560
2018/08/20
1.3K0
小程序开发知识点总结
[译]Chainlink去中心化预言机桥接区块链与现实世界
Chainlink 是一个去中心化的预言机网络,它可以让区块链中的智能合约安全地 访问外部世界的数据。在这个文章中,我们将探索 chainlink 预言机网络的搭建,并学习如何使用预置或自定义的适配器实现智能合约与外部世界数据的桥接。
Tiny熊
2020/02/18
1.3K0
[译]Chainlink去中心化预言机桥接区块链与现实世界
万字长文保姆级教你制作自己的多功能QQ机器人
QQ、微信是我们平常使用最多的通讯工具,网上也有很多通过软件去控制QQ/微信的开源工具,通过这些工具,我们可以实现许多有意思的效果,而不仅仅局限于消息聊天。 自从微信网页版被官方禁用后,微信的软件工具几乎已经失效了,现有的一些是通过hook微信本身来实现,这种很容易被官方检测并封号。另一些是通过注册企业号来控制,但不直观且功能受限。 这里我们借助相对更开放的QQ来制作我们的机器人,对比几款工具后,最终选择了mirai。
小锋学长生活大爆炸
2022/09/27
5K6
万字长文保姆级教你制作自己的多功能QQ机器人
autMan奥特曼机器人-对接Docker版本NTQQ详细教程
复制以下代码,在服务器发送即可。按照提示步骤输入正确参数,如果出现输错可以自行去文件夹内修改!搞好后就跳转下面的VNC连接接着连接操作
季春二九
2024/10/28
5830
微信公众号推送消息笔记
根据业务需要,开发一个微信公众号的相关开发,根据相关开发和整理总结了一下相关的流程和需要,进行一些整理和总结分享给大家,最近都在加班和忙碌,博客已经很久未更新了,打气精神,再接再厉,申请、认证公众号的一系列流程就不在这里赘述了,主要进行的是技术的分享,要达到的效果如下图:
stark张宇
2024/07/23
3120
钉钉发送报警消息的Python实现
我司使用钉钉作为主要的内部通讯工具,基本上大家在电脑和手机上都开着,消息可以第一时间查看,报警消息的即时性要求比较高,我们计划使用钉钉来发送报警通知。本文将简要介绍发送消息的API使用样例。钉钉的API接口文档,请查阅钉钉开放平台。
Debian中国
2018/12/21
3.4K2
分享一个微信公众号开发封装类
<?php /** * 微信公众平台PHP-SDK, 官方API部分 *  @author  dodge <dodgepudding@gmail.com> *  @link https://gi
仙士可
2019/12/19
9600
推荐阅读
相关推荐
手把手教你在飞书中搭建机器人
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验