1. 程式人生 > >這是一款借助chrome 插件的微信機器人

這是一款借助chrome 插件的微信機器人

自己的 batch 文字 ont .com sed script cnblogs 發送

1.chrome kit微信機器人簡介(github:https://github.com/LinuxForYQH/chrome_kit)

  1. 借助chrome 插件 js註入來實現消息的發送
  2. chrome devtool api的調用來監聽https請求
  3. 打開微信登錄界面,在掃碼登錄前必須先打開toolbar(F12 或者 鼠標右鍵檢查),如上所說因為借助了chrome devtool api所以需要打開toolbar才能執行相關dev域的js。

2.相關開發原理介紹

  1. https://developer.chrome.com/extensions/devtools 。(需要FQ)這個文檔介紹了三個域之間的關系,了解對使用非常有幫助。
  2. content scripts 是註入域,可以註入javascript到打開的頁面中。
  3. Backgroud 域在第一次加載插件就執行,可以用來做各類監聽
  4. dev -tool是在打開toolbar調試的時候才會執行,它有很多對應自己的api,如network的api,可以監聽所有的請求。
  5. 三個域之間如何通訊,該圖也描述得很清楚了,具體內容不過多描述,看上面的文檔或者我的代碼例子即可。

技術分享

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 插件的微信機器人