微信小助手之wechaty模塊(個人筆記,於人無用)


//請注意,這是一篇自言自語的筆記,不是科普文。

目前在做一個項目,通過微信的方式接收日程信息以及發送提醒的信息。

這就需要能夠在服務端登陸微信,並且能夠接收信息,以及能定時發送提醒信息的功能了。

分一下,就是

1 服務端登陸微信

2 能夠接收別人發送來的信息,也即信息可以被服務端取到。

3 能通過微信發送提醒。

在github上轉了一圈,盯上了一個叫wechaty的開源項目,github.com/wechaty/wechaty,經過一番研究,發現滿足了登陸,接收要求,發送的要求,也即箭頭所示。

接下來怎么放到我的項目中,可以很優雅的使用呢(egg.js)?

----------待研究

在github上 發現了一個相關項目:

https://github.com/Guing/Wechat-Admin-API

可以研究下在egg下怎么用。

運行不起來,需要端口6379,難道是因為用到了redis的緣故?

 經過研究這個項目的router.js,發現好像是通過http接口的形式觸發的,那現在我想要啟動egg.js的項目時就要啟動這個進程~

解決辦法,在app.js這里寫。

async didLoad() {
    // 所有的配置已經加載完畢
    // 可以用來加載應用自定義的文件,啟動自定義的服務

    // 例如:創建自定義應用的示例
    this.app.queue = new Queue(this.app.config.queue);
    await this.app.queue.init();
    
  }
這個生命周期函數~

 

現在繼續了解下,wechaty這個插件怎么用,要了解插件怎么用,肯定是要上npm官網去了解。https://www.npmjs.com/

發現:

async didLoad() {
    // 所有的配置已經加載完畢
    // 可以用來加載應用自定義的文件,啟動自定義的服務

    // 例如:創建自定義應用的示例
    Wechaty.instance() // Global Instance
    .on('scan', (qrcode, status) => console.log(`Scan QR Code to login: ${status}\nhttps://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(qrcode)}`))
    .on('login',            user => console.log(`User ${user} logined`))
    .on('message',       message => console.log(`Message: ${message}`))
    .start()
    
  }
啟動了之后沒有進行登陸操作,很奇怪,難道是因為

 

不是哦 是可以直接用哦,可能是第一次使用,要用node.js下載什么配置文件?所以現在登錄了。

現在要不要拆分成兩個啟動項目?也即同一個項目,但是不同啟動,這樣子可以互不干擾?

 又在github上逛了一圈,發現了一個寶藏https://github.com/gengchen528/wechat-assistant

看到里面的功能,恰好就有

 

 很需要這個定時提醒功能,定時功能底層應該是schdule這個庫實現的。

 他的另一個庫我發現就是合在一起寫的,分開寫的目的是什么呢?合起來的目的又是什么呢?

https://github.com/gengchen528/wechatBot

現在有個疑惑就是,假設拆分成兩個項目,能不能公用哪些service層的代碼?

 

終於明白了分開兩個項目的目的,因為wechat是前端部分,koa是后端部分~~~

 

 這個微信項目不要影響到本來的網站項目,要想辦法共享資源,(高內聚低耦合?)反正就是不會造成一方完蛋了,另一方就運行不了的局面,而要想共用資源,它們的技術(?)應該是要一致的,編程風格應該要一致這就是我為什么執着要用egg.js來寫的原因。

工具函數應該放在middleWare中。看了一下egg.js文檔,middleWare是用來攔截http請求,處理消息的。那是否應該放在extend文件夾下?又瀏覽了一下,發現extend文件夾下只能放固定的幾個文件,而且是自動合並到相關的變量(字段?)上去,不用顯性require的。

感覺對egg不是很熟悉,算了,看看有沒有前人栽樹,github上轉了一圈,發現還沒有前人,尷尬。

 發現egg.js里面有定時任務的配置,不需要另外配置schdule庫,猜想應該是內置了。

 

疑問,怎么把這個項目融進去?

現在遇到個困難,class好像每一次調用都會造成this.data數值改變(js基礎都忘了,尷尬)

那就只有弄一個 全局變量存起來先。

發現在extend文件夾下好像可以export一個變量,全局都可以調用。

現在已經把所有代碼修改成class的形式了,現在有一個問題,就是bot.on('message',func)的時候,func里面this的綁定的問題,只要用上了()=>func()的時候,func里面執行的this就不再指向wechaty了,這個很糟糕,換成function(msg){return func(msg,ctx)}也是不行,也就是說現在要解決this 的指向問題?如何在事件監聽定義這里不改變this的指向?

 解決辦法就是把wechaty實例傳過去。(hhhh)

 

現在怎么把兩個庫合在一起?一個是用戶庫 一個是日程庫 一個是wechat

現在就是要把wechat用戶的唯一id作為憑證?使用pad的方式登錄,詳情看

https://github.com/wechaty/wechaty/issues/1644

https://github.com/wechaty/wechaty/issues/1307

 https://github.com/wechaty/wechaty/issues/1804

拆分成兩個egg項目,這樣子就不會兩個都崩了。

 

有一個疑問,wechaty是怎么做到准確無誤地把信息發給正在聊天的人的?

 就是通過什么記錄狀態?socket?

 

現在呢,通過alias查找聯系人,並且

 

 

 現在發現了一個問題,就是下面的問題:

 疑問,怎么知道后台啟動微信服務成功了?就是等待異步動作完成之后再響應?

只有異步才能解決異步,是時候看一下es6 promise的知識了。

 

 

-----------------還是先了解下wechaty這個模塊有哪些api?是怎么做到登陸的?

https://github.com/wechaty/wechaty-getting-started


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM