這篇文章主要針對(duì)女生科技體驗(yàn)節(jié)Wechaty專場,同學(xué)們問的問題的匯總。因?yàn)楹芏嗤瑢W(xué)沒有太多編程基礎(chǔ),所以這篇文章講解會(huì)比較基礎(chǔ)。
故事從哪里說起呢?通過這次女生科技體驗(yàn)節(jié)活動(dòng),同學(xué)們遇到的問題主要來自三方面,第一,是docker安裝方面的問題;第二,是對(duì)一些專有名詞的不理解;第三,是程序運(yùn)行和代碼編寫方面的問題。那么,我會(huì)把重心放在,程序編寫和運(yùn)行中遇到的問題,和對(duì)同學(xué)們來說比較陌生的專業(yè)術(shù)語的解釋上。因?yàn)椋惭b的問題五花八門,安裝好以后大家都就可以隨心所欲的寫自己的機(jī)器人了,遇到更多的是程序代碼上的問題。還有,我對(duì)安裝真的不是特別在行。。。。
So,這篇文章主要以問答的形式來寫,并且,后面遇到新的問題,也可以告訴我,我會(huì)及時(shí)的補(bǔ)充。
1. Wechaty微信機(jī)器人可以用到公眾號(hào)上嗎?
不能用于公眾號(hào),公眾號(hào)本身有自動(dòng)回復(fù)的功能,可以直接調(diào)用公眾號(hào)的接口,具體可以查看文檔,使用Wechaty制作微信機(jī)器人只能用在個(gè)人微信號(hào)上。
2. docker的鏡像加速器
因?yàn)閲鴥?nèi)訪問Docker 官方的Docker Hub有時(shí)候速度會(huì)很慢,此時(shí)就可以配置鏡像加速器。比如:阿里云加速器,DaoCloud加速器等。
配置方法就是,我們注冊(cè)新用戶之后,申請(qǐng)加速器,會(huì)獲得一個(gè)地址,然后我們將這個(gè)地址配置給Docker引擎,添加到docker的registry-mirrors中。
Docker Hub是倉庫集中存放鏡像的地方,Docker官方維護(hù)了一個(gè)公共的倉庫Docker Hub,可以通過docker pull來將需要的鏡像下到本地。
這里我們的雨鳥助教將wechaty的鏡像直接放在了registry.docker-cn.com一個(gè)國內(nèi)的hub ,我們就可以很快速的拉取鏡像。
拉取鏡像的命令:
docker pull registry.docker-cn.com/zixia/wechaty
將Wechaty版本號(hào)指定到最新的版本
docker tag zixia/wechaty:latest
啟動(dòng)程序
docker run zixia/wechaty
3.在運(yùn)行李佳芮講師的get start代碼的時(shí)候,為什么自己發(fā)的信息不能回復(fù)
其實(shí)單從Wechaty來說是可以自己發(fā)信息,自己回復(fù)的,但是自己給自己發(fā)信息會(huì)進(jìn)入一個(gè)死循環(huán)。
講師提供的get start 的代碼,有這么一句
if(m.self()){
return;
}
當(dāng)接收到的消息是自己發(fā)出的,就直接終止代碼繼續(xù)往后執(zhí)行。
4. Windows7下發(fā)送不了中文message
MinGW 是一組包含文件和端口庫,其功能是允許控制臺(tái)模式的程序使用微軟的標(biāo)準(zhǔn)C運(yùn)行時(shí)(C Runtime)庫。
簡單的說,有一些軟件必須在Linux的環(huán)境下運(yùn)行,MinGW可以在Windows上提供一套Linux的運(yùn)行的環(huán)境,表象的說就是可以在Windows上執(zhí)行Linux的命令。但是MinGW對(duì)中文的支持很不友好。 我們?cè)诎惭bgit的時(shí)候會(huì)自動(dòng)安裝MinGW。所以導(dǎo)致同學(xué)們發(fā)送不了中文的message。
具體的解決方法就是:使用命令docker-machine ssh,ssh連接到docker鏡像內(nèi)部,然后再運(yùn)行。ssh是一種網(wǎng)絡(luò)協(xié)議。用戶想要通過本地計(jì)算機(jī)登錄到遠(yuǎn)程計(jì)算機(jī),就要使用ssh。具體想要多了解的可以看阮一峰的這篇小白入門文章:http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 。這里我們使用docker-machine ssh訪問到docker鏡像,因?yàn)閐ocker內(nèi)部就是linux環(huán)境,所以內(nèi)部沒有用到MinGW,這樣就解決了系統(tǒng)的兼容性問題。
但是ssh進(jìn)入內(nèi)部,就不能直接使用docker run -t掛載本地目錄,因?yàn)楝F(xiàn)在命令的執(zhí)行是直接在虛擬機(jī)內(nèi)部的,操作不了宿主機(jī)的文件。解決的方法是,把本地的目錄掛在到docer虛擬機(jī)內(nèi)部,然后ssh連接進(jìn)虛擬機(jī),docker run -t是掛載虛擬機(jī)內(nèi)部的目錄。
這里感謝我們的遠(yuǎn)程助教杉木和Fery提供的解決方案。
5.正則表達(dá)式
因?yàn)樵跈C(jī)器人拉人入群的時(shí)候,我們主要采用的是,好友輸入入群的關(guān)鍵詞,然后機(jī)器人匹配關(guān)鍵詞,自動(dòng)拉人入群。這里我們就要用到正則表達(dá)式。
首先理一下什么是正則表達(dá)式:正則表達(dá)式是一種文本模式,可以是普通的字符,也可以是特殊字符。正則表達(dá)式使用單個(gè)字符串來描述、匹配一系列某個(gè)句法規(guī)則的字符串。可能這樣說大家還不是很明白,舉一個(gè)例子:
我們希望拉人到test群,希望好友向機(jī)器人發(fā)送“room”,機(jī)器人收到這個(gè)詞,才會(huì)將好友自動(dòng)添加到test群里。那么我們就需要用到正則表達(dá)式來匹配。
這里提一下一位同學(xué)寫的非常具有教育意義的代碼??梢钥闯鲞@位同學(xué)有一定的編程基礎(chǔ),她想實(shí)現(xiàn)的功能是,當(dāng)好友在輸入:“Hello”或者”Hi”的時(shí)候,都能自動(dòng)添加到群里。下面是代碼:
if(/Hello || Hi/.test(content)){
...
}
js的正則表達(dá)式中“或”是這么寫的/Hello|Hi/,并且中間不能有空格,如果有空格,正則也將匹配到空格,好友必須輸入”Hello ”或者” Hi”才能匹配上。
正則表達(dá)式學(xué)起來很繁瑣,但是功能很強(qiáng)大,感興趣的同學(xué)需要自己下來花時(shí)間學(xué)習(xí)。
6. Typescript
Javascript是一個(gè)弱類型語言,就是說變量類型是不確定的,比如:
var x = 5;
x = x + 'A'
聲明x的時(shí)候是一個(gè)數(shù)值,但是第二句直接把x變成了一個(gè)字符串。也就是說js中變量的類型完全是由當(dāng)前的值來決定的。這樣對(duì)于最初的js作為一個(gè)腳本語言來說是很方便簡單的,但是隨著項(xiàng)目的逐漸變大,用這種弱類型的語言一直要到程序運(yùn)行的時(shí)候才能檢測出錯(cuò)誤,為了開發(fā)人員能夠在編譯時(shí)就能發(fā)現(xiàn)代碼的問題,現(xiàn)在很多大型的項(xiàng)目都希望Js能夠支持強(qiáng)類型,就是指定變量的類型,比如Flow,Typescript。Typescript 是微軟2012年推出的一種編程語言,屬于 JavaScript 的超集,可以編譯為 JavaScript 執(zhí)行。 它的最大特點(diǎn)就是支持強(qiáng)類型和 ES6 class。
Wechaty本身是使用的Typescript編寫。我們?cè)诰帉憴C(jī)器人的時(shí)候,也可以使用Typescript。
7.怎么知道好友自動(dòng)通過的條件
有同學(xué)問,不想通過所有的好友請(qǐng)求,怎么辦呢?
這里可以參考這個(gè)示例:https://github.com/Chatie/wechaty/blob/master/example/friend-bot.ts
和friend Event API:
http://chatie.io/wechaty/#Wechaty+on
Wechaty提供的接口可以通過驗(yàn)證信息來過濾掉一部分發(fā)送請(qǐng)求的好友。具體的的代碼:
.on('friend', async (contact, request) => {
if (request && request.hello == ‘ding’) {
request.accept()
}
})
當(dāng)驗(yàn)證信息是’ding’才會(huì)自動(dòng)添加好友。
8.支持紅包類型的消息嗎?
Wechaty提供的接口可以識(shí)別機(jī)器人接收到的消息時(shí)什么類型的,因?yàn)閃echaty是基于web的,所以不能做領(lǐng)取紅包的操作。
可以參考我的這個(gè)代碼:
https://github.com/TingYinHelen/wechaty-test/blob/master/index.js
在49行的地方,判斷message的類型,紅包信息的m.type() =10000,當(dāng)m.type() == 10000的時(shí)候,說明是紅包,機(jī)器人就會(huì)@一下我自己,提醒我趕緊搶紅包。
9. 如何防止封號(hào)
需要控制消息發(fā)送頻率,過高的發(fā)送頻率會(huì)容易被識(shí)別。另外賬號(hào)最好是經(jīng)過認(rèn)證、綁定過銀行卡,日常也在手機(jī)端正常使用(如發(fā)朋友圈之類)。總而言之,讓你的號(hào)行為看起來像是一個(gè)真人在用。
還有很重要的,別用于發(fā)廣告、騷擾,否則被舉報(bào)很容易被封。
10.自己的賬號(hào)登錄不了網(wǎng)頁版微信
微信賬號(hào)太年輕,需要換一個(gè)早期注冊(cè)的賬號(hào)。其實(shí)就是遭遇了上面所說的號(hào)被封了。
11.機(jī)器人掉線問題解決
這里建議使用Server醬。網(wǎng)頁版微信會(huì)經(jīng)常把用戶踢下線,Server醬可以幫助我們知道Wechaty發(fā)生了哪些異常。 Server醬,他是一個(gè)能從服務(wù)器推報(bào)警和日志到手機(jī)的工具,非常簡單易操作:
1.用GitHub賬號(hào)登入后,獲得一個(gè)SCKEY(在「發(fā)送消息」頁面) 按照引導(dǎo),點(diǎn)擊“微信推送”,掃碼關(guān)注“方糖”后即可完成綁定
2.在login、logout、scan、和error事件觸發(fā)后,將一些關(guān)鍵信息往 http://sc.ftqq.com/SCKEY.send 發(fā)Get請(qǐng)求,我自己的微信里就收到消息了。
這樣,當(dāng)我的機(jī)器人出現(xiàn)各種異常情況,我隨時(shí)隨地都可以知道,需要再掃碼進(jìn)入的時(shí)候,方糖這公眾號(hào)就會(huì)把二維碼推到我的手機(jī)上,我只要用機(jī)器人的微信掃碼就可以了。
12. 怎么終止程序
終止程序命令: ctrl + c
13.怎么區(qū)分群和私聊
機(jī)器人在獲取message的時(shí)候可以判斷message.room()方法返回值,當(dāng)返回是null,就說明是私聊,返回不是null就是群聊。null在js 中轉(zhuǎn)為Boolean之后是false。所以直接看代碼
const room = m.room()
if(room){
//這里是群聊
}else{
//這里是私聊
}
14.wechaty的適用場景
Wechaty的適用場景非常的廣泛,Wechaty 提供了一套非常方便的接口。以前我們總是去App store中安裝App,然后使用App來滿足我們對(duì)應(yīng)用場景的一些需求。然后現(xiàn)在使用手機(jī),大多數(shù)的時(shí)間都花在了微信上。不管是私聊,群聊還是看朋友圈,我們不得不承認(rèn),微信占據(jù)了我們生活的很大一部分時(shí)間。那么為何不省去下載App的時(shí)間,就在微信上滿足我們對(duì)應(yīng)用的需求。預(yù)定機(jī)票,酒店,租房,天氣查詢,周邊美食查詢??梢哉f,chat bot可以實(shí)現(xiàn)大多數(shù)App實(shí)現(xiàn)的功能,只是需要開發(fā)者自己設(shè)計(jì)。chat bot能簡化一切機(jī)械的人力成本,比如:拉人入群,發(fā)送歡迎語,自動(dòng)添加好友,自動(dòng)踢人。說到自動(dòng)踢人,其實(shí)很多群里是群主手動(dòng)踢人,在wechaty developer home微信群中,實(shí)現(xiàn)自動(dòng)踢人,當(dāng)有人在群里發(fā)送無關(guān)消息時(shí),群里的成員可以@此人,用微信表情投票,得票超過三個(gè),機(jī)器人將自動(dòng)踢人。所以chat bot能做的事情是在太多了。如果你感興趣在可以在Wechaty的blog中有發(fā)現(xiàn)很多開發(fā)者寫得技術(shù)文章https://blog.chatie.io/,和wechaty的實(shí)際應(yīng)用。當(dāng)然你也可以發(fā)揮想象,做出更加有意思的微信機(jī)器人。
15.執(zhí)行docker run要在項(xiàng)目目錄下
很多同學(xué)都有這個(gè)問題,在下載get start項(xiàng)目之后,沒有進(jìn)入到項(xiàng)目目錄就開始運(yùn)行代碼了,需要進(jìn)入到項(xiàng)目目錄下再運(yùn)行
cd wechaty-getting-started
下面是五花八門的安裝問題
16.安裝docker的問題
Error with pre-create check: "This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory"
Looks like something went wrong in step ′Checking if machine default exists′... Press any key to continue...
重啟進(jìn)Bios設(shè)置一下
Security->Virtualization->Intel(R)Virtualization Technology From Disabled->Enabled
17.ash.exe找不到的問題
如果安裝路徑不在C盤可能遇到這個(gè)的問題,手工瀏覽一下就好
18.boot2docker下載不了
手工下載下來,放在C:\users\用戶名.docker\machine\cache下
19.bash.exe找不到問題
下載下面提供的鏈接,然后安裝。
https://github.com/boot2docker/boot2docker/releases/download/v18.01.0-ce/boot2docker.iso