1. 程式人生 > >APP版微信機器人技術方案詳解

APP版微信機器人技術方案詳解

GitHub上有很多關於微信機器人的實現版本,這裡講一下如何在安卓手機上實現一個微信聊天機器人。思路大致都是一樣的,突破口都是呼叫微信的網頁版的介面,進行網頁登入,進而獲取到微信裡的聊天內容,然後呼叫聊天傳送介面將內容傳送給微信。

一、網頁版的介面大致分為五類:
1.登入相關;介面jslogin、qrcode、webwxnewloginpage、webwxlogout
2.初始化相關;介面:webwxinit
3.獲取聯絡人、群組資訊;介面:webwxgetcontact、webwxbatchgetcontact
4.心跳及接收微信新訊息;介面:synccheck、webwxsync


5.傳送聊天資訊;介面:webwxsendmsg、webwxuploadmedia、webwxsendmsgimg、webwxsendappmsg

二、手機上登入網頁版介面的實現:
網頁版的登入

三、遇見的坑及解決方案:
1.以k-v方式儲存下所有介面下發下來的cookie值,後續再次發起請求時,將儲存的cookie值全部帶上,以保證每個介面的所需。

2.webwxnewloginpage介面的Get和Post區別,這個介面的Get和Post請求是有區別的,以Get方式發起請求時,skey、wxsid等資訊是在Response的Set-Cookie裡儲存的;以Post方式發起請求時,這些資訊是在Response的body裡返回的;

3.webwxinit介面的Ret返回1101錯誤碼,這常見於在已經是網頁版登入的情況下發起的二次網頁登入;解決辦法是,每次登入前,先進行webwxlogout,然後再正式開始登入操作。

4.心跳請求synccheck,錯誤碼是1102時,說明請求時cookie的值有遺漏或者請求引數拼接得不對;錯誤碼是1101時,是說明此刻網頁版登入掉線了;錯誤碼是retcode:0,selector:7時,請檢查一下請求引數裡”synckey”的值傳得是否對,這裡要注意,不要對”synckey”的值進行UrlEncode!!!

5.傳送檔案介面webwxsendappmsg,錯誤碼是1時,除了檢查其他請求引數外,請確保content引數的值"<appmsg appid='wxeb7ec651dd0aefa9' sdkver=''><title>%s</title><des></des><action></action><type>6</type><content></content><url></url><lowurl></lowurl><appattach><totallen>%d</totallen><attachid>%s</attachid><fileext>%s</fileext></appattach><extinfo></extinfo></appmsg>",在進行JSON的格式轉換時,避免其中的字元'/'被加上轉義字元'\'!!!!解決辦法就是在放入request body之前,進行一次replace。


6.在進行登入的過程中,需要將獲取到的二維碼進行二次改造。具體過程如下圖:
掃碼圖片的生成
根據原始二維碼生成一張預覽圖片,二維碼縮小尺寸居中放入。其中預覽圖片的尺寸必須嚴格是介面onPreviewFrame(Byte[],Camera)中,第二個引數Camera的預覽尺寸。在紅米手機上得到的camera.getParameters().getPreviewSize()是w=768,h=432,getPreviewFormat是17,即NV21格式的編碼。

7.其他疑問,可以參考網上的資料。有一點需要強調,遇到有疑問或者調不通的情況,最可靠的辦法就是與PC上的網頁版登入進行一一比對。每個引數的有無,值的異同、是否Encode,都要比對和確認。不同的地方就是你APP上錯誤的地方。