摘要:項(xiàng)目背景龐大的用戶安裝量和恐怖的用戶使用時(shí)間,微信已成為國(guó)內(nèi)移動(dòng)互聯(lián)網(wǎng)上基礎(chǔ)設(shè)施級(jí)的應(yīng)用。以一周時(shí)間開發(fā)的微信天氣查詢助手,就是一次技術(shù)驗(yàn)證性嘗試。但就針對(duì)微信來說,不是最好的解決方案。
項(xiàng)目背景
龐大的用戶安裝量和恐怖的用戶使用時(shí)間,微信已成為國(guó)內(nèi)移動(dòng)互聯(lián)網(wǎng)上基礎(chǔ)設(shè)施級(jí)的應(yīng)用。
以微信為平臺(tái)的客服服務(wù)有很多方式,比如訂閱號(hào),服務(wù)號(hào),小程序,但受到微信官方的限制,如果想做一個(gè)聊天群的自助客服, 或者私人訂制的客服,那就沒有了官方的自動(dòng)化方案。例如場(chǎng)景一:折扣商品導(dǎo)購(gòu)群里,只要@客服+產(chǎn)品名,就可以馬上反饋一條產(chǎn)品折扣信息。場(chǎng)景二:徒步群里參加一個(gè)活動(dòng)報(bào)名,只需要@客服+活動(dòng)名稱 就可以自助報(bào)名參加活動(dòng)。
以Electron-nightmare一周時(shí)間開發(fā)的微信天氣查詢助手 ,就是一次技術(shù)驗(yàn)證性嘗試。
依賴項(xiàng)
-
技術(shù)選擇 python、phantomjs 對(duì)比 Electron-nightmarepython的優(yōu)點(diǎn),python是非常棒的語言,有著廣闊的舞臺(tái),在可預(yù)見的未來,python的熱度還將大幅提升。python有大量的三方庫(kù)支持,各種重量級(jí)的應(yīng)用框架、前瞻性產(chǎn)品基本上都提供python接口,有大量的社區(qū)。就微信機(jī)器人來說,有非常優(yōu)秀的itchat。但就針對(duì)微信來說,python不是最好的解決方案。因?yàn)閜ython需要從底層web通訊協(xié)議開始分析,需要用抓包、分解、組裝,完完全全的實(shí)現(xiàn)一個(gè)web協(xié)議的機(jī)器人,這其間的開發(fā)工作量過大。而且越陷入web底層,將來隨著官方協(xié)議變更,維護(hù)版本的工作量也不容忽視。這背離了我們的初衷:在松耦合基礎(chǔ)上盡可能的專注業(yè)務(wù)本身。而且python還面臨2與3的不兼容的坑,也是需要考慮的問題。
phantomjs 一個(gè)headless的瀏覽器框架,基于webkit。第一次了解到phantomjs是用來做爬蟲,phantomjs非常適合動(dòng)態(tài)頁(yè)面的內(nèi)容爬取,而且phantomjs可以很方便的運(yùn)行在linux服務(wù)器上,相對(duì)于普通的瀏覽器,phantomjs消耗的內(nèi)存要少太多。但phantomjs也有一些問題。最大的問題就是phantomjs的headless,無法很簡(jiǎn)單的測(cè)試代碼片段。而這幾年瀏覽器前端發(fā)展迅速,各種js新的特性不斷涌現(xiàn),但phantomjs兼容性問題也凸顯:例如phantomjs對(duì)set Object就不支持。而且就整體性能而言,沒有V8引擎的支持的js,在執(zhí)行效率上也要打折扣。所以我們還是要盡可能站在巨人的肩膀上拓展業(yè)務(wù)。
站在巨人的肩上,Electron。Electron是基于Google的Chromium框架,本來是專注快速開發(fā)跨平臺(tái)桌面應(yīng)用。但基于高性能瀏覽器的Electron是天生的web自動(dòng)化框架。配合Node.js的express,可以很簡(jiǎn)單的實(shí)現(xiàn)一個(gè)RESTFul服務(wù)。而瀏覽器的可視化調(diào)試工具也大大提高了測(cè)試、調(diào)試效率。在Electron上做微信網(wǎng)頁(yè)版自動(dòng)化更像是做一個(gè)plugin,這將減少了大量的的開發(fā)工作。
python, phantomjs, Electron在微信自動(dòng)化上的對(duì)比功能 | python | phantomjs | Electron | |
---|---|---|---|---|
三方庫(kù) | ★★★★★ | ★★★★ | ★★★★☆ | |
學(xué)習(xí)容易 | ★★★☆ | ★★★☆ | ★★★☆ | |
開發(fā)效率 | ★★ | ★★★☆ | ★★★★☆ | |
方便測(cè)試 | ★★☆ | ★★☆ | ★★★★☆ | |
運(yùn)行效率 | ★★★★☆ | ★★☆ | ★★★☆ | |
維護(hù)簡(jiǎn)單 | ★★☆ | ★★★☆ | ★★★★☆ | |
硬件要求低 | ★★★★☆ | ★★★☆ | ★★☆ |
從模塊分離的原則,在設(shè)計(jì)上,將微信機(jī)器人作為服務(wù)提供出來,這樣即可以在以后按照其約定方式(RESTFul)提供新的對(duì)接方式,也隔離的本身業(yè)務(wù)與機(jī)器人服務(wù)之間的耦合性,而且分離后,基礎(chǔ)服務(wù)可以遠(yuǎn)程部署。設(shè)計(jì)思路如下圖
系統(tǒng)分解圖
微信網(wǎng)頁(yè)版代碼分析(模塊分析)當(dāng)前(2017-11-30日)微信網(wǎng)頁(yè)版是基于AngularJS v1.2.28開發(fā)的,采用MVC分離模式。通過分析最主要的index.js源碼我們可以大概知道各個(gè)功能模塊的組合方式。
模塊分解圖
在了解網(wǎng)頁(yè)版模式后,接下來就是獲取,并調(diào)用對(duì)應(yīng)的功能模塊,具體實(shí)現(xiàn)位于 wxinjector.js
var injector = angular.element(document.body).injector(); var F = { chatFactory:injector.get("chatFactory"), contactFactory:injector.get("contactFactory"), confFactory:injector.get("confFactory"), loginFactory:injector.get("loginFactory"), accountFactory:injector.get("accountFactory"), utilFactory:injector.get("utilFactory"), } var CTRLS = { appController: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(), }編寫測(cè)試片段代碼
chrome的dev-tools是非常好用的可視化測(cè)試工具,我們可以將功能片段一點(diǎn)一點(diǎn)的在console中測(cè)試后,再添加到項(xiàng)目的代碼中
測(cè)試獲得聯(lián)系人列表
angular.element(document.body).injector().get("contactFactory").getAllContacts();
測(cè)試發(fā)送文本消息
function SendMessage(ToUserName, msg){ var a = angular.element(document.querySelector("#editArea")).scope(); var confFactory = angular.element(document.body).injector().get("confFactory") var chatFactory = angular.element(document.body).injector().get("chatFactory"); a.editAreaCtn = msg; var e = chatFactory.createMessage({ ToUserName:ToUserName, MsgType: confFactory.MSGTYPE_TEXT, Content: a.editAreaCtn }); chatFactory.appendMessage(e), chatFactory.sendMessage(e), // O[chatFactory.getCurrentUserName()] = "", a.editAreaCtn = ""; }項(xiàng)目代碼組織
|____conf # 程序配置文件 | |____service.json | |____wxconf.js | |____cities.json # 城市氣象編碼表 |____lib # 模塊代碼 | |____weather.js | |____inject | | |____wxinjector.js | |____wxbot.js |____test # 測(cè)試代碼目錄 |____.gitignore |____package.json |____README.md |____sy-cli.js # 天氣問答業(yè)務(wù)程序 |____syaya.js # 微信基礎(chǔ)服務(wù)程序運(yùn)行項(xiàng)目
cnpm install
啟動(dòng)微信基礎(chǔ)服務(wù) node syaya.js
啟動(dòng)天氣問答業(yè)務(wù) node sy-cli.js
掃碼登錄微信賬號(hào)(業(yè)務(wù)賬號(hào))
用另一個(gè)微信賬號(hào)給業(yè)務(wù)賬號(hào)發(fā)信息測(cè)試
ubuntu server上運(yùn)行electron
$sudo apt-get install xvfb libgtk2.0-0 libnotify-bin libgconf-2-4 libnss3 libasound2 libcap2-bin libcups2 libxtst6 libxss1 $xvfb-run node --harmony syaya.js
window.reload后,重新加載注入腳本的時(shí)機(jī): 在事件"dom-ready"中注入
page.engin.on("dom-ready", function () { console.log("DOM-READY for inject..."); page.engin.inject("js", WX_HELPER_JS); });
express下,讓curl的post正常工作
var bodyParser = require("body-parser"); var app = express(); app.use(bodyParser.json({ limit: "100kb", type: "application/x-www-form-urlencoded" }));
js的sleep等待
async function sleep(ms) { return new Promise(resolve => { var tm = setTimeout(() => { console.log("clear", tm); clearTimeout(tm); resolve(0); }, ms); }); } async function test_sleep(){ var r = await sleep(2000); console.log(r); } test_sleep();
js協(xié)程處理單條消息, 偽代碼
var co = require("co"); function process_one_message(msg){ co(function *(message) { var action = yield extract_action(message); var r = yield action.do_step1(); if(r.status == "success"){ r = yield action.do_step2(); } r = yield action.do_final(); r = yield make_response(action, message); }, msg); }參考
在線XML、JSON數(shù)據(jù)互轉(zhuǎn)
有哪些免費(fèi)開放且收錄城市較完整的天氣 API 接口
http://itchat.readthedocs.io/...
https://github.com/Chatie/wec...
https://shields.io
問題和建議如果有什么問題或者建議都可以在這個(gè)Issue和我討論
或者也可以在微博上聯(lián)系我:rockee阿木
或者微信聯(lián)系:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90126.html
摘要:在我看來,很多人起床第一件事情就是看微信消息,既然這樣,我就勉為其難每天早晨給小姐姐發(fā)送一則天氣預(yù)報(bào)吧。聯(lián)想起之前看到的一個(gè)開源庫(kù),一個(gè)非常強(qiáng)大的微信調(diào)用類庫(kù),正好滿足我當(dāng)前的需要,那話不多說,開干。 前言 事情是這樣的,最近認(rèn)識(shí)的一位小姐姐有每天早晨看天氣預(yù)報(bào)的習(xí)慣。在我看來,很多人起床第...
摘要:背景介紹智能語音助手作為物聯(lián)網(wǎng)領(lǐng)域的一個(gè)重要生態(tài)成員,是一種全新的交互方式,它能夠解放雙手,隨時(shí)提供服務(wù),無須借助任何按鍵。學(xué)完該案例讓你對(duì)智能語音助手有一個(gè)全新的認(rèn)識(shí)??靵泶蛟炷愕闹悄苷Z音助手吧 1. 背景介紹 智能語音助手作為物聯(lián)網(wǎng)領(lǐng)域的一個(gè)重要生態(tài)成員,是一種全新的交互方式,它能夠解...
摘要:作為一名菜雞,時(shí)常瞻仰大佬們的開源項(xiàng)目是非常必要的。后臺(tái)部分在這地址動(dòng)漫你的名字同款開源,原文效果圖簡(jiǎn)詩(shī)地址一款優(yōu)雅的中國(guó)風(fēng)記錄,包括端和端原文相關(guān)博客如何在一天之內(nèi)完成一款具備屬性的產(chǎn)品簡(jiǎn)書地址一個(gè)基于豆瓣仿網(wǎng)易云音樂的開源項(xiàng)目。 作為一名菜雞Android,時(shí)常瞻仰大佬們的開源項(xiàng)目是非常必要的。這里我為大家收集整理了10個(gè)優(yōu)秀的開源項(xiàng)目,方便我們?nèi)粘i_發(fā)中學(xué)習(xí)! 作者:Listen...
閱讀 3260·2021-11-22 15:22
閱讀 2847·2021-10-12 10:12
閱讀 2138·2021-08-21 14:10
閱讀 3797·2021-08-19 11:13
閱讀 2820·2019-08-30 15:43
閱讀 3202·2019-08-29 16:52
閱讀 387·2019-08-29 16:41
閱讀 1412·2019-08-29 12:53