這是一款借助chrome 插件的微信機器人
阿新 • • 發佈:2017-09-14
自己的 batch 文字 ont .com sed script cnblogs 發送
1.chrome kit微信機器人簡介(github:https://github.com/LinuxForYQH/chrome_kit)
- 借助chrome 插件 js註入來實現消息的發送
- chrome devtool api的調用來監聽https請求
- 打開微信登錄界面,在掃碼登錄前必須先打開toolbar(F12 或者 鼠標右鍵檢查),如上所說因為借助了chrome devtool api所以需要打開toolbar才能執行相關dev域的js。
2.相關開發原理介紹
- https://developer.chrome.com/extensions/devtools 。(需要FQ)這個文檔介紹了三個域之間的關系,了解對使用非常有幫助。
- content scripts 是註入域,可以註入javascript到打開的頁面中。
- Backgroud 域在第一次加載插件就執行,可以用來做各類監聽
- dev -tool是在打開toolbar調試的時候才會執行,它有很多對應自己的api,如network的api,可以監聽所有的請求。
- 三個域之間如何通訊,該圖也描述得很清楚了,具體內容不過多描述,看上面的文檔或者我的代碼例子即可。
3.使用操作說明
1.加載插件 , 如下
把我整個github文件夾下載下來加載即可:https://github.com/LinuxForYQH/chrome_kit
2.打開網頁版微信登錄界面,同時打開toolbar(記住這個非常重要,不然監聽不到鏈接請求),如下圖
3.掃碼登錄,等待5秒左右初始化,會有一個同步信號發送到手機微信的“同步助手”中,即表示成功登錄。如果太久沒有反應關掉瀏覽器從新來(非常小的概率),如下圖
4.如何調試和進一步開發
1.content註入域的調試如下
2.backgroud域的調試如下
3.dev-tool域的調試說明:dev-tool沒有控制臺可以調試,而且出現錯誤也不會有提示,調試只能把相應的javascript註入到content層來查看輸出,或者把消息發送到backgroud域查看執行結果。
5,我設計的原理圖和代碼如下
1.原理圖如下
2代碼如下:
devtools01.js
1 /** 2 * Created by hua on 2017/9/12. 3 */ 4 5 6 //聯系人列表 7 var Contact; 8 //微信初始化 9 var wxInit; 10 //群聯系 11 var webwxbatchgetcontact=null; 12 var webwxbatchgetcontact_si; 13 14 var signal_a; 15 16 var signal_b; 17 18 /** 19 * dev域用於toolbar的網絡監聽 20 * 21 * 22 */ 23 chrome.devtools.network.onRequestFinished.addListener( 24 function (request) { 25 26 27 //匹配地址 28 signal_a = request.request.url.indexOf(‘wx2.qq.com‘); 29 30 signal_b = request.request.url.indexOf(‘wx2.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact‘); 31 32 33 if (signal_b > 0&&request.request.url.indexOf("me=me")<0) {//me=me是循環標誌 34 request.getContent(function (body) { 35 36 //判斷數據來存儲聯系群 37 if (!webwxbatchgetcontact) { 38 webwxbatchgetcontact = body; 39 webwxbatchgetcontact_si=request.request; 40 } else if (JSON.parse(webwxbatchgetcontact).Count < JSON.parse(body).Count&&body!=null) { 41 webwxbatchgetcontact = body; 42 webwxbatchgetcontact_si=request.request; 43 } 44 45 //發送初始化好的消息給background層 46 chrome.extension.sendRequest({ 47 Contact: Contact, 48 tabId: chrome.devtools.inspectedWindow.tabId, 49 BaseRequest: request.request, 50 wxInit: wxInit, 51 webwxbatchgetcontact: webwxbatchgetcontact_si, 52 url: request.request.url, 53 }); 54 }); 55 } else if (signal_a > 0&&request.request.url.indexOf("me=me")<0) {//me=me是循環標誌 56 request.getContent(function (body,base64) { 57 //初始化監聽 58 if (request.request.url.indexOf("wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit") > 0&&body!=null) { 59 wxInit = request.request; 60 } 61 62 //獲取聯系人 63 if (request.request.url.indexOf("wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact") > 0&& 64 request.request.url.indexOf(‘skey‘)>0&&body!=null) { 65 Contact = request.request; 66 67 } 68 69 //所有消息均發送到background層 70 chrome.extension.sendRequest({ 71 tabId: chrome.devtools.inspectedWindow.tabId, 72 url: request.request.url, 73 params: request.request, 74 content: body, 75 base64:base64 76 }); 77 }); 78 } 79 });View Code
backgroud01.js
1 /** 2 * Created by hua on 2017/9/11. 3 */ 4 5 6 var tabId; 7 8 /** 9 * 接收來自dev域的消息 10 * 11 * 12 */ 13 chrome.extension.onRequest.addListener(function (request) { 14 15 console.log(request); 16 tabId = request.tabId; 17 //發送消息content層 18 chrome.tabs.sendRequest(tabId, request , function (results) { 19 20 }) 21 22 });View Code
content01.js
1 /** 2 * Created by hua on 2017/9/12. 3 */ 4 5 //聯系人列表 6 var Contact; 7 //基礎參數 8 var BaseRequest; 9 //最新的消息 10 var news; 11 //微信初始化 12 var wxInit; 13 //群聯系 14 var webwxbatchgetcontact; 15 16 var Msg = { 17 Type: 1, 18 Content: "0", 19 FromUserName: "0", 20 ToUserName: "0", 21 LocalID: "0", 22 ClientMsgId: "0" 23 } 24 25 26 /** 27 * 接收來自background的消息 28 * 29 */ 30 chrome.extension.onRequest.addListener(function (request) { 31 32 console.log(request); 33 34 //監聽最新的消息 35 if (request.url.indexOf("wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync") >= 0) { 36 if (!request.content) return; 37 news = JSON.parse(request.content); 38 if (news.AddMsgCount && news.AddMsgCount > 0 && wxInit != null && (news.AddMsgList[0].Content != ‘‘)) { 39 $.ajax({ 40 url: request.url + "&me=me",//避開循環標誌 41 type: ‘POST‘, 42 contentType: ‘application/json;charset=UTF-8‘, 43 data: JSON.stringify(JSON.parse(request.params.postData.text)), 44 dataType: "json", 45 success: function (data) { 46 Msg.Content = "機器人:" + data.AddMsgList[0].Content; 47 Msg.ToUserName = "filehelper"; 48 Msg.FromUserName = wxInit.User.UserName; 49 webwxsendmsg(BaseRequest, Msg) 50 } 51 }) 52 } 53 } 54 55 //初始化監聽 56 if (request.url.indexOf("wx2.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact") >= 0) { 57 if (!request.Contact || !request.BaseRequest || !request.wxInit || !request.webwxbatchgetcontact) return; 58 59 wxInit_a(request); 60 Contact_a(request); 61 webwxbatchgetcontact_a(request); 62 63 BaseRequest = JSON.parse(request.BaseRequest.postData.text) 64 } 65 66 67 }); 68 69 70 /** 71 *發送文字消息 72 *格式如下 73 { 74 BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, 75 Msg: { 76 Type: 1 文字消息, 77 Content: 要發送的消息, 78 FromUserName: 自己的ID, 79 ToUserName: 好友的ID, 80 LocalID: 與clientMsgId相同, 81 ClientMsgId: 時間戳左移4位隨後補上4位隨機數 82 } 83 } 84 */ 85 86 var clientMsgId; 87 function webwxsendmsg(BaseRequest, Msg) { 88 89 clientMsgId = new Date().getTime() 90 + (Math.random() + "").substring(2, 6); 91 Msg.LocalID = clientMsgId; 92 Msg.ClientMsgId = clientMsgId; 93 $.ajax({ 94 url: ‘https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg‘, 95 type: ‘POST‘, 96 contentType: ‘application/json;charset=UTF-8‘, 97 data: JSON.stringify({ 98 BaseRequest: BaseRequest.BaseRequest, 99 Msg: Msg, 100 Scene: 0 101 }), 102 dataType: "json", 103 success: function (data) { 104 console.log(data) 105 } 106 }) 107 108 } 109 110 /** 111 *初始化個個人 112 * @param request 113 */ 114 function wxInit_a(request) { 115 $.ajax({ 116 url: request.wxInit.url, 117 type: ‘POST‘, 118 contentType: ‘application/json;charset=UTF-8‘, 119 data: JSON.stringify(JSON.parse(request.wxInit.postData.text)), 120 dataType: "json", 121 success: function (data) { 122 wxInit = data 123 }, 124 timeout: 3000, 125 complete: function (XMLHttpRequest, status) { 126 if (status == ‘timeout‘) wxInit_a(request); 127 } 128 }) 129 } 130 /** 131 *初始化聯系人 132 * @param request 133 */ 134 function Contact_a(request) { 135 $.ajax({ 136 url: request.Contact.url, 137 type: ‘GET‘, 138 contentType: ‘application/json;charset=UTF-8‘, 139 dataType: "json", 140 success: function (data) { 141 if (data.MemberCount == 0) Contact_a(request); 142 Contact = data 143 }, 144 timeout: 4000, 145 complete: function (XMLHttpRequest, status) { 146 if (status == ‘timeout‘) Contact_a(request); 147 } 148 }) 149 } 150 /** 151 *初始化聯系人群 152 * @param request 153 */ 154 function webwxbatchgetcontact_a(request) { 155 $.ajax({ 156 url: request.webwxbatchgetcontact.url + "&me=me",//避開循環標誌 157 type: ‘POST‘, 158 contentType: ‘application/json;charset=UTF-8‘, 159 data: JSON.stringify(JSON.parse(request.webwxbatchgetcontact.postData.text)), 160 dataType: "json", 161 success: function (data) { 162 if (data.Count == 0) webwxbatchgetcontact_a(request); 163 webwxbatchgetcontact = data 164 }, 165 timeout: 3000, 166 complete: function (XMLHttpRequest, status) { 167 if (status == ‘timeout‘) webwxbatchgetcontact_a(request); 168 } 169 }) 170 } 171 172 173 /** 174 * 用來保持在線 175 * 176 */ 177 var click=0; 178 function timedCount01() { 179 setTimeout("timedCount01()", 10000) 180 if (!wxInit || !BaseRequest) return; 181 //模擬點擊 182 if(click==0) { 183 click=1; 184 $(‘.web_wechat_tab_chat‘).click() 185 }else { 186 click=0; 187 $(‘.web_wechat_tab_friends‘).click() 188 } 189 console.log("保持在線") 190 Msg.Content = "保持在線:" + new Date(); 191 Msg.ToUserName = "filehelper"; 192 Msg.FromUserName = wxInit.User.UserName; 193 webwxsendmsg(BaseRequest, Msg) 194 } 195 timedCount01()View Code
這是一款借助chrome 插件的微信機器人