使用 NodeJS 实现的微信公众平台机器人
使用 NodeJS 实现的微信公众平台机器人
微信公共帐号 是个很好玩的东西,因为他们最近开放了自动回复消息的接口,所以就更好玩了……
因为别的语言不会写,就用 JavaScript 写了个自动回复的小脚本,后来想让他变得更智能,就慢慢扩展成了这样一个还算方便使用的机器人……
代码公开在:https://github.com/ktmud/weixin-robot
不涉及任何算法和人工智能,也不需要数据库,只是一个单纯地类似于 url 路由的东西,只不过这里的 “url” 是用户说的话而已。
理论上来说,这东西可以并不只服务于微信,只要约定好消息来往的格式,也可以很方便地搭建起一个可以自动回复的客服系统。因为它是因微信公众平台而生的,故姑且还是叫 weixin-robot 。
大家可以尝试用微信关注“豆瓣同城”公共帐号试一下效果:
使用 NodeJS 实现的微信公众平台机器人
简介
微信公共帐号是个很好玩的东西,尤其是他们最近开放了自动回复消息的接口,使得它变得更加有趣。作为一个 IT 专家,我决定用 JavaScript 来编写一个自动回复的小脚本,并逐步将其扩展成一个更智能的机器人。
项目介绍
该项目名为 weixin-robot
,其代码托管在 GitHub 上。通过这个项目,我们能够实现一个简单的自动回复机器人,用于处理来自微信公共帐号的消息。该项目不仅限于微信,也可以作为其他自动回复系统的基础框架。
技术栈
- Node.js: 用于服务器端逻辑的编写。
- Express: 用于构建 HTTP 服务和路由。
- XML2JS: 用于解析微信发送过来的 XML 消息。
代码示例
const express = require('express');
const bodyParser = require('body-parser');
const xml2js = require('xml2js');
const app = express();
app.use(bodyParser.text({ type: 'text/xml' }));
// 解析微信发送的 XML 消息
app.post('/wechat', (req, res) => {
const parser = new xml2js.Parser();
parser.parseString(req.body, (err, result) => {
if (err) {
console.error(err);
return res.status(500).send('Error parsing message.');
}
const fromUser = result.xml.FromUserName[0];
const content = result.xml.Content[0] || '你好!';
// 构造回复消息
const responseXML = `
<xml>
<ToUserName><![CDATA[${fromUser}]]></ToUserName>
<FromUserName><![CDATA[${result.xml.ToUserName[0]}]]></FromUserName>
<CreateTime>${Date.now()}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[${content}]]></Content>
</xml>
`;
return res.send(responseXML);
});
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
功能说明
上述代码实现了以下功能:
- 接收消息: 通过 Express 创建一个 HTTP 服务,并监听
/wechat
路径上的 POST 请求。 - 解析 XML: 使用
xml2js
库解析微信发送的 XML 消息。 - 构造回复: 根据接收到的消息内容构造一个 XML 格式的回复消息。
- 发送回复: 将构造好的回复消息发送回微信服务器。
总结
这个项目是一个简单的微信公众平台机器人,主要用于自动回复消息。虽然它目前没有涉及到复杂的算法或人工智能,但它的灵活性使其可以很容易地扩展为一个更智能的客服系统。如果你对这个项目感兴趣,欢迎访问 GitHub 并参与贡献。
非常开心找到这样有用的东西 我是一个node的纯新手 想使用您的这个程序
安装npm i weixin-robot后 我需要怎样做 让他监听我的80呢? node \node_modules\weixin-robot\examples\app.js?
实在抱歉提这样的问题 纯新手 请谅解。(网吧技术员 刚接触编程)
modules已安装 用app.js可以成功收取发送
修改 examples/app.js 倒数第三行设定的 port 为 80 端口即可,比较建议用 nginx 或者 apache 做一层 proxy…
感谢您对我的帮助 问下跟程序无关的~~ 80已经更改 token 我更改为自己的 或者不更改 都无法再公众平台进行验证成功 我向腾讯的URL是带有端口号的 不知道会不会因此产生影响 导致无法token验证成功 我的外网IP 80被封掉了 期望得到您的回答。
已经通过域名转发的方式搞定了 通讯问题
使用内网机器3000映射到了服务器3000上 然后服务器绑定根域名
A记录 wx1.superjue.net 通过隐藏域名转发到www.superjue.net:3000上
本地webot可以连接上 但是无论输入什么只能回复‘ 听不懂你说什么’ 即error 400
但是公众平台始终无法token认证
恩,我听说现在确实只支持80端口……
本地webot可以连接上 但是无论输入什么只能回复‘ 听不懂你说什么’ 即error 400 但是公众平台始终无法token认证
windoes环境下
通过域名隐藏转发 把非80端口转成了80端口 在公众平台验证的时候 通过本地抓包获取到腾讯向我非80端口发送: name=%E5%BC%A0%E5%8B%89&mobile=186065XXXXX&email=zhengzha1234%40hotmail.com&url=http%3A%2F%2Fwx1.superjue.net&token=XXXXX&ajax=1
手动测试到返回为
{ "r": 403, "msg": "Where is your key?" }
issues 可以到 github 上去提,论坛这边不便回复
你本地抓的…… 是编辑后台点保存时,腾讯向他们服务器提交的信息吧…… =。=
微信服务器发给你的请求应该是这种格式的:
"GET /?signature=29d1a5e85dcdafcb6bd660c55ee6f6f81afa&echostr=5814915060441739089×tamp=1353903953&nonce=1353890419 HTTP/1.0"
最新版本欢迎大家试试
已经上传。地址:http://myzhbit.cloudfoundry.com/
一直无法验证Token。
代理部分改为
//微信后台只允许 80 端口,你可能需要自己做一层 proxy
//app.listen(3000, ‘127.0.0.1’, function(){
//log(“WeBot Start… God bless love…”);
//});
app.listen(80);
if(!process.env.DEBUG){
console.log("use SET DEBUG=webot.*
to got debug info. current env is: %s ", process.env.DEBUG);
}
还是不行。。。请问要怎么设置代理?
关注一个,前段时间也做了个自动回复小机器人,比你这个简陋很多,你这个给我很多启发,顶
如何实现 s+内容 发布到指定微博?
欢迎加入一起开发
这个类库只是帮你分析到有收到 s+内容 这个消息进来, 后面的处理你可以自己在process里面连接微博然后发送, 具体看微博的api或者github上的那个第三方nodejs类库
运行vmc push 发生了以下错误: Uploading app_name… FAILED Upload failed. Try again with ‘vmc push’. TypeError: can’t convert nil into String For more information, see ~/.vmc/crash
你是如何上传的?vmc版本多少?谢谢
不知道楼主实现微信支付了吗
微信支付算是另外一个单独的事情了
目前一些基本的API可以试下用这个:https://github.com/ktmud/wechat-api
mark
要实现一个基于 Node.js 的微信公众平台机器人,我们需要处理微信公众平台发来的消息,并作出相应的回复。下面是一个简单的示例代码,展示如何设置一个基本的微信机器人。
示例代码
首先,你需要安装 express
和 wechat-middleware
:
npm install express wechat-middleware
然后创建一个基本的 Express 应用来接收和处理来自微信服务器的消息:
const express = require('express');
const wechatMiddleware = require('wechat-middleware');
const app = express();
const token = 'your_token_here';
app.use('/wechat', wechatMiddleware(token, (message, req, res, next) => {
let content;
switch (message.MsgType) {
case 'text':
if (message.Content === '你好') {
content = '你好!很高兴为您服务。';
} else {
content = '抱歉,我没有理解你的意思。';
}
break;
default:
content = '暂时只支持文本消息哦。';
break;
}
res.reply({
content,
type: 'text',
match: message.Content
});
}));
app.listen(3000, () => {
console.log('App is running at port 3000');
});
代码解释
- 引入依赖:首先引入必要的模块,包括 Express 和微信中间件。
- 配置中间件:使用微信中间件,设置一个路由
/wechat
来处理微信发送的消息。这里需要提供一个 token,确保安全。 - 处理消息:通过
wechat-middleware
提供的回调函数处理不同的消息类型。在这个例子中,我们只处理文本消息,并根据消息内容回复特定的文本。 - 启动应用:最后启动 Express 应用监听在 3000 端口。
扩展功能
你可以在此基础上添加更多的功能,比如接入自然语言处理库(如 node-nlp
)或简单的关键词匹配逻辑,以实现更复杂的对话流程。
这样的机器人可以作为一个基础框架,用于开发针对微信或其他平台的自动回复系统。