摘要:本文不涉及到的知識如果你是沖著來的那么可能會讓你失望了前一陣子一個朋友找我問我能不能搞一個微信自動加好友的軟件在普通人眼里程序員就是專門寫木馬病毒外掛軟件的三流黑客不會寫那就連三流都不是所以為了證明我是三流黑客我隨便百度了兩個現成的給他本來
本文不涉及到 AI 的知識,如果你是沖著 AI 來的,那么可能會讓你失望了.
前一陣子一個朋友找我,問我能不能搞一個微信自動加好友的軟件,(在普通人眼里,程序員就是專門寫木馬病毒外掛軟件的三流黑客.不會寫那就連三流都不是.
所以為了證明我是三流黑客,我隨便百度了兩個現成的給他.本來事情到這里應該結束了的,不過本著探索的精神,想順便了解一下這種外掛的原理,于是百歌谷度了一下,
最終原理沒找到,倒是找到幾個有意思的 github 倉庫,利用網頁版的微信 API 做第三方微信.
先看個效果?
我們看看大致步驟
獲取 UUID
根據 UUID 獲取二維碼
掃碼登陸, 獲取登陸信息
拿登陸信息換初始化數據
拿數據初始化
獲取好友列表和消息列表
發送消息
以下為具體過程,不感興趣的可以直接拉到末尾查看源碼倉庫
需要注意的是,每一步的請求所使用的方法(POST/GET) 和 Content-Type 都是不一樣的,下面我都有標注,如果有請求不通的請參考 gtihub 源碼.一、獲取 UUID
接口地址 https://wx.qq.com/jslogin
請求方法 POST
參數類型(content-type) application/x-www-form-urlencoded
參數
{ appid: "wx782c26e4c19acffb", fun: "new", lang: "zh_CN", _: new Date().valueOf() }
除了最后一個當前時間戳不是固定的,其他的3個參數都是寫死的,照抄即可,調用成功的話,會到一個字符串 window.QRLogin.code = 200; window.QRLogin.uuid = "obizONtqZA==";, 需要自己想辦法截取到 window.QRLogin.uuid = 后面的那串字符,即 UUID.
二、獲取二維碼這一步很簡單,有了 UUID 后,我們可以直接請求 "https://wx.qq.com/qrcode/" + UUID 獲取到二維碼. 獲取到二維碼以后,先別急著去掃描二維碼,因為我們要先去監聽二維碼的掃描狀態,這樣我們才能知道什么時候被登陸.
請求方式 GET 無需參數
三、監聽二維碼的掃描結果接口地址 https://wx.qq.com/cgi-bin/mmw...
請求方法 GET
參數類型(content-type) application/x-www-form-urlencoded
參數
{ tip: 0, uuid: "obizONtqZA==", _: new Date().valueOf(), loginicon: true }
tip 取值 0 或 1, 監聽分2個階段,第一階段,監聽用戶是否掃碼,tip 為 0,第二階段,監聽用戶是否在微信上點確認登陸,tip 為 1.
uuid 就是第一步獲取到的那個 UUID
_ 當前時間戳
loginicon 我猜應該是否掃碼完返回用戶頭像,都填 true 即可.
返回結果,當你掃描二維碼的時候,接口會返回你一個這樣的對象
{ "window.code": 201, "window.userAvatar": 頭像的 base64 地址 }
得到的 code 是 201, 說明已掃碼,但并不代表已登陸,還需要繼續監聽是否在手機微信上點擊 確認登陸 按鈕(重復上面步驟,把 參數里的 tip 改為 1 即可)
這步如果成功的話,會返回一個如下對象
{ "window.code": "200", "window.redirect_uri": "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARD37_ikx-Kakd2i0W-f-E7q@qrticket_0&uuid=4f6yOkV4AA==&lang=zh_CN&scan=1548300672" } }四、獲取初始化數據(敏感數據)
上一步獲取到的數據里面的 window.redirect_uri 里包含了一個 url 和一些 查詢參數,直接請求這個地址好像沒辦法成功,需要將 url 和 參數拆分,然后加入其他參數
接口地址 就是上面的 url
請求方法 GET
參數類型(content-type) application/x-www-form-urlencoded
參數
{ ticket: 上面得到的 ticket, uuid: 上面得到的 uuid, lang: "zh_CN", // 固定 scan: 上面得到的 scan, fun: "new" // 固定 }
這一步的返回的頭部里面,會有個 cookie ,需要存起來,接來來得到請求頭里面要帶上這個 cookie,另外就是一個 xml 格式的 敏感的信息,也是要存起來.
tip: xml 格式可以用 xml2js 轉換成 json.五、初始化
呼,到這一步,終于接近登陸成功了,只需再調用以下接口,初始化以下
接口地址 https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=${~(new Date().valueOf())}
請求方法 POST
參數類型(content-type) application/json
參數
{ BaseRequest: { DeviceID: "e747337466044216", // 這個好像隨便填都可以 Sid: 上一步獲取到的 wxsid, Uin: 上一步獲取到的 wxuin, Skey: 上一步獲取到的 skey } }
這里有 2 個地方跟之前不同的,第一是地址后面要跟一個時間戳,而且這個時間戳還要按位取反,第二個是請求參數是放在 BaseRequest 下面,而不是對象的一級屬性下面.
返回的數據里面有 2 個數據需要保存起來,一個是 data.SyncKey, 一個是 res.data.User.UserName,后面都會用到
到此才真正完成登陸,下面如果你不需要好友列表的話,可以直接收取消息了
六、檢測新消息接口地址 https://webpush.wx.qq.com/cgi...
請求方法 GET
參數類型(content-type) application/json
參數
let time = new Date().getTime() let synckey = "" let sk = data.SyncKey.List || [] // data.SyncKey 就是上一步獲取到的那個 for (let i = 0; i < sk.length; i++) { synckey += `${sk[i].Key}_${sk[i].Val}` if (i !== sk.length - 1) synckey += "|" } // 傳遞的參數 { r: time, sid: 第四步拿到的 wxsid, uin: 第四步拿到的 wxuin, skey: 第四步拿到的 skey, deviceid: "e747337466044216", // 同上一步 synckey: synckey, _: time }
返回內容的 data 里面 包含如下內容
window.synccheck={retcode:"0",selector:"2"}
如果 selector 是 2, 說明有新消息,走下一步,獲取消息內容
七、獲取消息內容接口地址 https://wx.qq.com/cgi-bin/mmw...
請求方法 POST
參數類型(content-type) application/json
參數
{ BaseRequest: { Uin: 第四步拿到的 wxuin, Sid: 第四步拿到的 wxsid, Skey: 第四步拿到的 skey, DeviceID: "e747337466044216", // 同上一步 }, SyncKey: data.SyncKey, // 還記得上一步我們費盡千辛萬苦轉換這個數據嗎? 你沒看錯,這里不需要轉換,就是這么神奇 rr: ~(new Date().valueOf()) }
返回結果里面有個 data.AddMsgList 就是消息列表了,還有個 data.SyncCheckKey 就是下次請求的時候用的 SyncKey, 每次都會變的.
AddMsgList 是一個數組,里面可能包含多條消息,消息的自動比較多,就不一一說明了,這里說說 2 個比較重要的字段,其他的字段有興趣的可以自己打印出來看一下.
FromUserName 對方的微信名,說是微信名,其實是一個 @ 或 @@ 開頭的內部的id, 完全不可讀,據我猜測 @ 開頭的應該是普通好友, @@ 開頭的是群或者公眾號之類的
Content 消息內容
有了消息內容,和發消息的人,我們就可以回復對方,不過回復什么? 當然不可能寫一大堆 if else 或者 switch case 去適應各種情況,不妨網上搜索一下 價值一個億的ai代碼 哈哈哈
八、獲取自動回復內容這邊我用的是圖靈機器人的 API 地址,當然你也可以用其他的.
接口地址 http://openapi.tuling123.com/...
請求方法 POST
參數類型(content-type) application/json
參數
{
perception: { inputText: { text: "待回復的消息" } }, userInfo: { apiKey: tulingApiKey, // 在圖靈官網申請 userId: tulingUserId // 同上
}
你要是懶得去申請的話,可以在我的項目里面復制, 在 src/global.js 里面,在返回的內容里面 data.results[0].values.text 下面可以看到圖靈給你生成的自動回復內容(results是一個數組,支持一次回復多條)
九、回復消息拿到自動回復以后,我們只需要把它發給你的好友,即完成一次自動對話.
接口地址 https://wx.qq.com/cgi-bin/mmw...
請求方法 POST
參數類型(content-type) application/json
參數
let timeStamp = new Date().getTime() + "" + (9000 * Math.random() + 1000) { BaseRequest: { Uin: 同上, Sid: 同上, Skey: 同上, DeviceID: 同上 }, Msg: { Type: 1, // 消息類型 1 是文字消息,其他的暫時沒用過 Content: "回復的內容", FromUserName: "你的用戶名,在第五步有拿到", ToUserName: "對方的微信名 第七步的 FromUserName", LocalID: timeStamp, ClientMsgId: timeStamp }
發送成功的話,會返回如下內容
{ BaseResponse: { Ret: 0, ErrMsg: "" }, MsgID: "2033517278669301361", LocalID: "" }
好了,這樣我們的一個自動回復機器人就完成了.完整的代碼在這里
廣告時間我們40人的前端團隊常年招兵買馬中,在廈門的和想來廈門的童鞋們,不要吝惜你的簡歷,使勁砸過來 郵箱:atob("bnVveWFAZ2FvZGluZy5jb20="), 期待你一起來稿事
對本文有意見或者建議,請盡量在 github 上提 issue, 最近比較忙,比較不怎么逛社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/53614.html
摘要:本文不涉及到的知識如果你是沖著來的那么可能會讓你失望了前一陣子一個朋友找我問我能不能搞一個微信自動加好友的軟件在普通人眼里程序員就是專門寫木馬病毒外掛軟件的三流黑客不會寫那就連三流都不是所以為了證明我是三流黑客我隨便百度了兩個現成的給他本來 本文不涉及到 AI 的知識,如果你是沖著 AI 來的,那么可能會讓你失望了. 前一陣子一個朋友找我,問我能不能搞一個微信自動加好友的軟件,(在普通...
摘要:基于和端微信開發的聊天機器人。使用的微信賬號即充當機器人的賬號為個人賬號,可自定義指令。關閉玫瑰感謝您的使用玫瑰閃電需要開啟請在控制臺啟動程序閃電微信發出關閉口令,程序退出。 Github: https://github.com/doterlin/wechat-robot showImg(https://segmentfault.com/img/remote/1460000010601...
摘要:本文為教程的第二部分,主要以微信控制器群發助手好友刪除檢測為例演示如何調用微信。教程流程簡介這一系列教程從如何分析微信協議開始,第一部分教你如何從零開始獲取并模擬擴展個人微信號所需要的協議。 現在的日常生活已經離不開微信,本文將會拋磚引玉演示如何使用Python調用微信API做一些有意思的東西。 看完這一系列教程,你就能從頭開始實現自己關于微信的想法。 本文為教程的第二部分,主要以微信...
摘要:關于本教程有任何建議或者疑問,都歡迎郵件與我聯系,或者在上提出教程流程簡介教程將會從如何分析微信協議開始,第一部分將教你如何從零開始獲取并模擬擴展個人微信號所需要的協議。 現在的日常生活已經離不開微信,難免會生出微信有沒有什么API可以使用的想法。 那樣就可以拿自己微信做個消息聚合、開個投票什么的,可以顯然沒有這種東西。 不過還好,有網頁版微信不就等于有了API么,這個項目就是出于這個...
閱讀 3669·2021-11-23 09:51
閱讀 1661·2021-10-22 09:53
閱讀 1345·2021-10-09 09:56
閱讀 853·2019-08-30 13:47
閱讀 2155·2019-08-30 12:55
閱讀 1597·2019-08-30 12:46
閱讀 1105·2019-08-30 10:51
閱讀 2410·2019-08-29 12:43