当前位置: 首页 > 后端技术 > Node.js

使用Electron-nightmare快速实现微信天气助手Syaya

时间:2023-04-03 20:24:31 Node.js

项目背景微信拥有庞大的用户安装量和恐怖的用户使用时长,已经成为国内移动互联网的基础设施级应用。微信平台提供客户服务的方式有很多,比如订阅号、服务号、小程序等。但是由于微信官方的限制,如果想做聊天群自助客服,或者定制客服,那就没有官网了。自动化方案。例如,场景一:在打折商品导购群中,只要@客服+商品名称,就可以立即反馈一条商品打折信息。场景二:报名徒步团活动,只需@客服+活动名称即可自行报名活动。Electron-nightmare一周开发的微信天气查询助手,是一次技术验证的尝试。Dependencies-技术选择Python,phantomjs相比Electron-nightmarepython的优势,python是一门非常优秀的语言,有着广阔的舞台。在可预见的将来,python的流行度将显着增加。Python有大量的第三方库支持。各种重量级的应用框架和前瞻性的产品,基本都提供python接口,并且有大量的社区。就微信机器人来说,有一个很好用的itchat。但是对于微信来说,python并不是最好的解决方案。因为python需要从底层的web通信协议入手分析,需要抓包、拆解、组装,完全实现一个web协议机器人,开发工作量太大。而且越是陷入web底层,随着日后官方协议的变化,维护版本的工作量也不容忽视。这背离了我们的初衷:在松散耦合的基础上,尽可能专注于业务本身。而且python还面临着2和3不兼容的坑,这也是需要考虑的问题。phantomjs是一个基于webkit的无头浏览器框架。第一次知道用phantomjs做爬虫。phantomjs非常适合抓取动态页面的内容,phantomjs可以很方便的运行在linux服务器上。与普通浏览器相比,phantomjs消耗的内存要少得多。但是phantomjs也存在一些问题。最大的问题是phantomjs的headless,导致无法轻松测试代码片段。近年来,浏览器前端发展迅速,各种js的新特性层出不穷,但是phantomjs的兼容性问题也变得突出:比如phantomjs不支持setObject。而且在综合性能上,没有V8引擎支持的js在执行效率上也会有一定的折扣。所以我们还是要尽可能的站在巨人的肩膀上去拓展我们的业务。站在巨人的肩膀上,Electron。Electron基于Google的Chromium框架,最初专注于跨平台桌面应用程序的快速开发。但是基于高性能浏览器的Electron是一个天然的Web自动化框架。借助Node.js的表达,可以非常简单地实现RESTFul服务。浏览器的可视化调试工具也大大提高了测试调试的效率。在Electron上做微信网页版自动化更像是做一个插件,会减少很多开发工作。python、phantomjs、Electron在微信自动化中的对比功能pythonphantomjsElectron三方库☆★★★★☆方便测试★★☆★★☆★★★★☆运行效率★★★★☆★★☆★★★☆易于维护★★☆★★★☆★★★★☆硬件要求低★★★★☆★★★☆★★☆syaya的系统解释了模块分离的原则。在设计上,将微信机器人作为服务来提供,以便日后可以按照其约定的方式(RESTFul)提供新的对接。该方法还隔离了自身业务与机器人服务之间的耦合,分离后可以远程部署基础服务。设计思路如下:系统分解图微信网页版代码分析(模块分析)当前(2017-11-30)微信网页版基于AngularJSv1.2.28开发,采用MVC分离模式。通过分析最重要的index.js源码,我们可以大致知道各个功能模块的组合。在模块分解图中,了解了网页版模式之后,接下来就是获取并调用相应的功能模块。具体实现位于wxinjector.jsvarinjector=angular.element(document.body).injector();varF={chatFactory:injector.get('chatFactory'),contactFactory:injector.get('contactFactory'),confFactory:injector.get('confFactory'),loginFactory:injector.get('loginFactory'),accountFactory:injector.get('accountFactory'),utilFactory:injector.get('utilFactory'),}varCTRLS={应用控制器:angular.element(document.body).scope(),loginController:angular.element(document.querySelector("body>div.login.ng-scope")).scope(),chatSenderController:angular.element(document.querySelector("#chatArea>div.box_ft.ng-scope")).scope(),}编写测试片段代码chrome的dev-tools是一个非常好用的可视化测试工具。我们可以在控制台中对功能片段一点一点进行测试,然后将其添加到项目的代码中进行测试,获取联系人列表angular.element(document.body).injector()。get('contactFactory').getAllContacts();测试发送短信函数SendMessage(ToUserName,msg){vara=angular.element(document.querySelector("#editArea")).scope();变量配置ry=angular.element(document.body).injector().get('confFactory')varchatFactory=angular.element(document.body).injector().get('chatFactory');a.editAreaCtn=msg;vare=chatFactory.createMessage({ToUserName:ToUserName,MsgType:confFactory.MSGTYPE_TEXT,Content:a.editAreaCtn});chatFactory.appendMessage(e),chatFactory.sendMessage(e),//O[chatFactory.getCurrentUserName()]="",a.editAreaCtn="";}项目代码组织|____conf#程序配置文件||____service.json||____wxconf.js||____cities.json#城市天气代码表|____lib#模块代码||____天气。js||____注射|||____wxinjector.js||____wxbot.js|____test#测试代码目录|____.gitignore|____package.json|____README.md|____sy-cli.js#天气问答业务程序|____syaya.js#微信基础服务程序运行项目cnpminstall启动微信基础服务节点syaya.js启动天气问答服务节点sy-cli.js扫码登录微信账号(企业号)使用其他微信账号给企业号发送消息测试一些开发过程备忘录运行electron$sudoonUbuntu服务器apt-getinstallxvfblibgtk2.0-0libnotify-binlibgconf-2-4libnss3libasound2libcap2-binlibcups2libxtst6libxss1$xvfb-runnode--harmonysyaya.jswindow.reload之后,重新加载注入脚本的时间:在事件注入'dom-ready'page.engin.on('dom-ready',function(){console.log("DOM-READYforinject...");page.engin.inject("js",WX_HELPER_JS);});express下,让curlpost正常工作varbodyParser=require('body-parser');varapp=express();app.use(bodyParser.json({limit:'100kb',type:'application/x-www-form-urlencoded'}));jssleepwaitasyncfunctionsleep(ms){returnnewPromise(resolve=>{vartm=setTimeout(()=>{console.log("clear",tm);clearTimeout(tm);resolve(0);},ms);});}asyncfunctiontest_sleep(){varr=awaitsleep(2000);console.log(r);}test_sleep();js协程处理单条消息,伪代码varco=require("co");functionprocess_one_message(msg){co(function*(message){varaction=yieldextract_action(消息);varr=yieldaction.do_step1();如果(r.status==“成功”){r=yieldaction.do_step2();}r=yieldaction.do_final();r=yieldmake_response(action,message);},msg);}参考网上有哪些免费、开放、完善的XML和JSON数据转换的天气API接口http://itchat.readthedocs.io/...https://github.com/Chatie/wec。..https://shields.ioissuesandsuggestions如果大家有什么问题或者建议,可以在本Issue中和我一起讨论或者微博联系我:rockee阿木或者微信: