成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用Electron-nightmare快速實(shí)現(xiàn)微信天氣助手Syaya

jiekechoo / 3119人閱讀

摘要:項(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-nightmare

python的優(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)單 ★★☆ ★★★☆ ★★★★☆
硬件要求低 ★★★★☆ ★★★☆ ★★☆
syaya的系統(tǒng)說明

從模塊分離的原則,在設(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è)試


開發(fā)過程中的一些備忘經(jīng)驗(yàn)

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

相關(guān)文章

  • 海王必備,我python寫了一個(gè)微信機(jī)器人和她聊天之后把我拉黑了

    摘要:在我看來,很多人起床第一件事情就是看微信消息,既然這樣,我就勉為其難每天早晨給小姐姐發(fā)送一則天氣預(yù)報(bào)吧。聯(lián)想起之前看到的一個(gè)開源庫(kù),一個(gè)非常強(qiáng)大的微信調(diào)用類庫(kù),正好滿足我當(dāng)前的需要,那話不多說,開干。 前言 事情是這樣的,最近認(rèn)識(shí)的一位小姐姐有每天早晨看天氣預(yù)報(bào)的習(xí)慣。在我看來,很多人起床第...

    lixiang 評(píng)論0 收藏0
  • 爆肝一周,Python在物聯(lián)網(wǎng)設(shè)備上寫了個(gè)智能語音助手

    摘要:背景介紹智能語音助手作為物聯(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)成員,是一種全新的交互方式,它能夠解...

    I_Am 評(píng)論0 收藏0
  • 快速開發(fā)android,離不開這10個(gè)優(yōu)秀的開源項(xiàng)目

    摘要:作為一名菜雞,時(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...

    wangshijun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<