这是一款借助chrome 插件的微信机器人

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     });

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 });

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()

时间: 2024-08-02 02:27:22

这是一款借助chrome 插件的微信机器人的相关文章

介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件

先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱[email protected] 可以内部推荐. DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件. DHC的开发背景 在web开发中,服务器端和客户端的开发和测试必不可少,但是测试的工作往往需要服务器端完成之后,客户端才能进行测试,这无疑延后了测试流程,导致服务器端开发完成后,无法进行充分的数据测试,很容易造成服务器端和

Uploadify—借助Uploadify插件实现图片预览时如何解决Chrome浏览器报“喔唷,崩溃啦”

今天借助Uploadify插件实现了图片预览及其上传的功能,可是在Chrome浏览器中会时不时地出现如下图所示的情况: 解决方法:使用这种方法引用该插件js文件: <script type="text/javascript"> document.write("<script type='text/javascript' src='<%=basePath %>js/uploadify/jquery.uploadify.min.js?" +

开发者常用的十款Chrome插件

本文是稀土掘金投稿,虽然其中有倔金的私货,是篇推广文,但我看过后认为内容确实不错,有些好插件还是第一次知道,对我很有帮助,考虑过后还是决定推荐给大家,最近我比较关注各种提高开发效率的工具与技巧,今后看到这样主题的内容,也会多多推荐给大家:) 在掘金的第十二期沸点活动中,掘金上的开发者们纷纷亮出了自己正在使用的 Chrome 插件,这里面有开发利器,也有各种实用工具.我们筛选出了评论中的各种 Chrome 开发插件,各位开发者们,快来看看,有没有你需要的工具吧. 1. 掘金 Chrome 插件 :

推荐几款我一直在用的chrome插件(上)

我用的chrome插件挺多的,所谓工欲善其事必先利其器,我热衷于搜寻好用的工具来让我平时的工作事半功倍.下面介绍几款我正在用的感觉还不错的插件,如果大家还有其它好用的(肯定有,chrome插件库太庞大了),一定要互相分享!! 1. LastPass 用的最爽的一款,强烈推荐.LastPass是一款Freemium的跨平台在线密码管理工具,用于管理大量网站的密码,可按要求生成随机密码,支持自动登录,支持手机两步验证.可能有人会问:1Password.KeyPass就够用了吧,还要这个干嘛?请注意,

推荐几款我一直在用的chrome插件(下)

请先看:推荐几款我一直在用的chrome插件(上) 6. Pocket 可以很方便的保存文章.视频等供以后查看,即实现了"Read it later"功能.有了 Pocket,您可以将所有想下次读的内容汇聚到一个地方,然后在任何设备上随时查看.Pocket还提供了另外一个功能,即可以通过发送邮件的方式来保存内容(不需要点击这个插件),发送链接URL到[email protected]即可保存(发送的Email是你注册pocket时使用的Email),当然这种方式比较麻烦,不过可以在没有

推荐几款专门为Github党量身定做的Chrome插件

GitHub是世界知名的代码托管网站,在中国也有相当多的项目托管在GitHub,给广大程序员和编程爱好者带来了方便,GitHub是很多开发者远程协作的重要工具,其社交化编码的理念伴随着开源运动改变着整个开发社区的生态,无数优质项目依托GitHub在全球开源开发者的参与下蓬勃发展.GitHub作为一款基于Git的代码管理工具和协同工具是很优秀的,然而作为代码浏览和搜索工具,就和IDE差的很远了.不然为什么到今天GitHub连个侧栏的文件树没有,很多开发者要专门去下载浏览器插件才能有文件树.当然,今

借助Chrome和插件爬取数据

工具 Chrome浏览器 TamperMonkey ReRes Chrome浏览器 chrome浏览器是目前最受欢迎的浏览器,没有之一,它兼容大部分的w3c标准和ecma标准,对于前端工程师在开发过程中提供了devtools和插件等工具,非常方便使用.在爬取数据的过程中,最常用的应该是开发工具中的Element.Source和Network功能,分别查看DOM结构,源码和网络请求.同时,有很多基于Chrome浏览器的插件又给我们赋予了浏览器级别的能力,来处理数据. TamperMonkey Ta

实用chrome插件

2015年最实用的9款chrome插件 随着14年chrome浏览器的市场超过IE浏览器,chrome凭借它强劲性能和出色的使用体验真正的登上了平民级的殿堂.今天小编就为大家推荐9款自己常用的chrome插件神器. 1.非常实用的chrome新标签页---Infinity新标签页 Infinity新标签页插件是一款可以把chrome默认新标签页换成一个美观实用的infinity新标签页,不仅有简洁美观的页面,还有快速拨号,邮件提醒,天气预报,笔记功能,待办事项,壁纸,历史记录管理等. 2.Chr

收集几个有用的谷歌Chrome插件

谷歌Chrome自推出以来已经从一个简单的浏览器演变成一个复杂的浏览器,这得益于根据浏览器写出的非常有用和强大的扩展.作为一名开发人员,我们关注的是网页设计和开发部分的那些插件对我们有帮助,几个比较熟悉的插件像Firebug Lite和Web Developer大家都知道,我就不扯了,今天扯一下那些你可能不知道的对于开发非常有帮助的插件,在此做个总结,看看你用过几个,我敢肯定你会发现它们非常有用. Refresh Monkey 在设定的时间间隔自动刷新页面.监视页面的变化,如果有变化的会通知你.