【笔记】NodeJS微信公众号自动回复开发

这段时间一直想给家里搞个常用工具集,比如撸羊毛推荐,图片识别,图片OCR,在线桌游等。只要联网就能用。于是搜索了一下公有云,搞了台host。除了等备案然后serve网站,想想反正大家都在用微信,不如搭一个类似于小黄鸡的server,能响应各种需求。直接开使做吧。

https://github.com/stallpool/wxchat

上面给出的链接就是一个chatbot的框架,可以实现:

  • 向公众号发送“时间”,会得到当前时间的回复;
  • 向公众号发送“计算”和算式,比如 计算 sin(pi/2) + sqrt(6-2*(1-3)+6),会得到算式计算结果的回复

框架同时实现了消息的AES加密,就是即使是http服务,和微信公众号互动的消息是加密的。

我们来说一说代码:https://github.com/stallpool/wxchat/blob/master/server/wx.js
微信官方给出的加密解密代码只有Python, Java, C/C++ 还有PHP,没有NodeJS的,所以就得自己实现一遍加密解密 class WXBizMsgCodec;加密是严格按照官方加密方法来执行,使用 aes-256-cbc 算法;这个没啥好说的;解密有点坑,其中有几个问题:

  • 第一是经常看到大家说有 EVP_DecryptFinal_ex 执行失败的问题,应该是和解密的长度有关,所以两种解法,一种是直接 try...catch... 一下看能不能执行final,一个是算清楚文本长度;这里我们还是简单点,直接 try...catch...
  • 第二是微信发过来的消息并不是都按照官方给的格式…所以解密函数并没有直接按照官方的方法来;有些消息,解密了以后发现存储消息长度的那项没了,所以就直接按照消息开始的 < 和结束的 > 去标识消息本身,然后最后一段把尾部padding去除就是 appid

两个例子“时间”和“计算”的代码入口是在 https://github.com/stallpool/wxchat/blob/master/server/wx_chatbot.js 的 rpl_text 函数里。表达式计算器因为10min写完的,就没有太管表达式语法正确性验证,大家可以自行完善。

在测试发图片给公众号的时候,发现微信给出了一个图片URL,是没有任何认证的;也就是说在有效期内,谁都可以访问图片。所以微信上聊天还是不要涉及太多私人数据,尤其是密码之类的。好了,框架写完了,下面就可以试试更高级的feature了:
比如 Tesseract-OCR 去处理图片 ( https://github.com/naptha/tesseract.js 是JS版 ),这样比如拍一个电子收据就可以直接得到文字了;
比如看一下小黄鸡的api ( http://www.simsimi.com/ http://developer.simsimi.com/ ),当收到消息的时候,直接去call小黄鸡的api得到回复,然后将这个回复发送出去,就是一个小黄鸡公众号了。
敞开去play吧。

J.Y.Liu
2019.08.20

你可能感兴趣的:(数据处理,NodeJS,javascript)