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 。(需要翻墙)这个文档介绍了三个域之间的关系,了解对使用非常有帮助。
  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

 /**
* Created by hua on 2017/9/12.
*/ //联系人列表
var Contact;
//微信初始化
var wxInit;
//群联系
var webwxbatchgetcontact=null;
var webwxbatchgetcontact_si; var signal_a; var signal_b; /**
* dev域用于toolbar的网络监听
*
*
*/
chrome.devtools.network.onRequestFinished.addListener(
function (request) { //匹配地址
signal_a = request.request.url.indexOf('wx2.qq.com'); signal_b = request.request.url.indexOf('wx2.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact'); if (signal_b > 0&&request.request.url.indexOf("me=me")<0) {//me=me是循环标志
request.getContent(function (body) { //判断数据来存储联系群
if (!webwxbatchgetcontact) {
webwxbatchgetcontact = body;
webwxbatchgetcontact_si=request.request;
} else if (JSON.parse(webwxbatchgetcontact).Count < JSON.parse(body).Count&&body!=null) {
webwxbatchgetcontact = body;
webwxbatchgetcontact_si=request.request;
} //发送初始化好的消息给background层
chrome.extension.sendRequest({
Contact: Contact,
tabId: chrome.devtools.inspectedWindow.tabId,
BaseRequest: request.request,
wxInit: wxInit,
webwxbatchgetcontact: webwxbatchgetcontact_si,
url: request.request.url,
});
});
} else if (signal_a > 0&&request.request.url.indexOf("me=me")<0) {//me=me是循环标志
request.getContent(function (body,base64) {
//初始化监听
if (request.request.url.indexOf("wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit") > 0&&body!=null) {
wxInit = request.request;
} //获取联系人
if (request.request.url.indexOf("wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact") > 0&&
request.request.url.indexOf('skey')>0&&body!=null) {
Contact = request.request; } //所有消息均发送到background层
chrome.extension.sendRequest({
tabId: chrome.devtools.inspectedWindow.tabId,
url: request.request.url,
params: request.request,
content: body,
base64:base64
});
});
}
});

backgroud01.js

 /**
* Created by hua on 2017/9/11.
*/ var tabId; /**
* 接收来自dev域的消息
*
*
*/
chrome.extension.onRequest.addListener(function (request) { console.log(request);
tabId = request.tabId;
//发送消息content层
chrome.tabs.sendRequest(tabId, request , function (results) { }) });

content01.js

 /**
* Created by hua on 2017/9/12.
*/ //联系人列表
var Contact;
//基础参数
var BaseRequest;
//最新的消息
var news;
//微信初始化
var wxInit;
//群联系
var webwxbatchgetcontact; var Msg = {
Type: 1,
Content: "0",
FromUserName: "0",
ToUserName: "0",
LocalID: "0",
ClientMsgId: "0"
} /**
* 接收来自background的消息
*
*/
chrome.extension.onRequest.addListener(function (request) { console.log(request); //监听最新的消息
if (request.url.indexOf("wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync") >= 0) {
if (!request.content) return;
news = JSON.parse(request.content);
if (news.AddMsgCount && news.AddMsgCount > 0 && wxInit != null && (news.AddMsgList[0].Content != '')) {
$.ajax({
url: request.url + "&me=me",//避开循环标志
type: 'POST',
contentType: 'application/json;charset=UTF-8',
data: JSON.stringify(JSON.parse(request.params.postData.text)),
dataType: "json",
success: function (data) {
Msg.Content = "机器人:" + data.AddMsgList[0].Content;
Msg.ToUserName = "filehelper";
Msg.FromUserName = wxInit.User.UserName;
webwxsendmsg(BaseRequest, Msg)
}
})
}
} //初始化监听
if (request.url.indexOf("wx2.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact") >= 0) {
if (!request.Contact || !request.BaseRequest || !request.wxInit || !request.webwxbatchgetcontact) return; wxInit_a(request);
Contact_a(request);
webwxbatchgetcontact_a(request); BaseRequest = JSON.parse(request.BaseRequest.postData.text)
} }); /**
*发送文字消息
*格式如下
{
BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx },
Msg: {
Type: 1 文字消息,
Content: 要发送的消息,
FromUserName: 自己的ID,
ToUserName: 好友的ID,
LocalID: 与clientMsgId相同,
ClientMsgId: 时间戳左移4位随后补上4位随机数
}
}
*/ var clientMsgId;
function webwxsendmsg(BaseRequest, Msg) { clientMsgId = new Date().getTime()
+ (Math.random() + "").substring(2, 6);
Msg.LocalID = clientMsgId;
Msg.ClientMsgId = clientMsgId;
$.ajax({
url: 'https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg',
type: 'POST',
contentType: 'application/json;charset=UTF-8',
data: JSON.stringify({
BaseRequest: BaseRequest.BaseRequest,
Msg: Msg,
Scene: 0
}),
dataType: "json",
success: function (data) {
console.log(data)
}
}) } /**
*初始化个个人
* @param request
*/
function wxInit_a(request) {
$.ajax({
url: request.wxInit.url,
type: 'POST',
contentType: 'application/json;charset=UTF-8',
data: JSON.stringify(JSON.parse(request.wxInit.postData.text)),
dataType: "json",
success: function (data) {
wxInit = data
},
timeout: 3000,
complete: function (XMLHttpRequest, status) {
if (status == 'timeout') wxInit_a(request);
}
})
}
/**
*初始化联系人
* @param request
*/
function Contact_a(request) {
$.ajax({
url: request.Contact.url,
type: 'GET',
contentType: 'application/json;charset=UTF-8',
dataType: "json",
success: function (data) {
if (data.MemberCount == 0) Contact_a(request);
Contact = data
},
timeout: 4000,
complete: function (XMLHttpRequest, status) {
if (status == 'timeout') Contact_a(request);
}
})
}
/**
*初始化联系人群
* @param request
*/
function webwxbatchgetcontact_a(request) {
$.ajax({
url: request.webwxbatchgetcontact.url + "&me=me",//避开循环标志
type: 'POST',
contentType: 'application/json;charset=UTF-8',
data: JSON.stringify(JSON.parse(request.webwxbatchgetcontact.postData.text)),
dataType: "json",
success: function (data) {
if (data.Count == 0) webwxbatchgetcontact_a(request);
webwxbatchgetcontact = data
},
timeout: 3000,
complete: function (XMLHttpRequest, status) {
if (status == 'timeout') webwxbatchgetcontact_a(request);
}
})
} /**
* 用来保持在线
*
*/
var click=0;
function timedCount01() {
setTimeout("timedCount01()", 10000)
if (!wxInit || !BaseRequest) return;
//模拟点击
if(click==0) {
click=1;
$('.web_wechat_tab_chat').click()
}else {
click=0;
$('.web_wechat_tab_friends').click()
}
console.log("保持在线")
Msg.Content = "保持在线:" + new Date();
Msg.ToUserName = "filehelper";
Msg.FromUserName = wxInit.User.UserName;
webwxsendmsg(BaseRequest, Msg)
}
timedCount01()

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

  1. 推荐15款Google Chrome 插件

    Google Chrome是由Google开发的免费网页浏览器.Chrome是化学元素“铬”的英文名称,过去也用Chrome称呼浏览器的外框.Chrome相应的开放源代码计划名为Chromium,而G ...

  2. 11款插件让你的Chrome成为全世界最好用的浏览器|Chrome插件推荐

    文章来源:知乎 收录于:风云社区(SCOEE)[提供mac软件下载] 更多专题,可关注小编[磨人的小妖精],查看我的文章,也可上[风云社区 SCOEE],查找和下载相关软件资源. (一)综合类: 新买 ...

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

    我用的chrome插件挺多的,所谓工欲善其事必先利其器,我热衷于搜寻好用的工具来让我平时的工作事半功倍.下面介绍几款我正在用的感觉还不错的插件,如果大家还有其它好用的(肯定有,chrome插件库太庞大 ...

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

    请先看:推荐几款我一直在用的chrome插件(上) 6. Pocket 可以很方便的保存文章.视频等供以后查看,即实现了“Read it later”功能.有了 Pocket,您可以将所有想下次读的内 ...

  5. 借助Chrome和插件爬取数据

    工具 Chrome浏览器 TamperMonkey ReRes Chrome浏览器 chrome浏览器是目前最受欢迎的浏览器,没有之一,它兼容大部分的w3c标准和ecma标准,对于前端工程师在开发过程 ...

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

    先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱jia6235@163.com 可以内部推荐. DHC是一款 ...

  7. 开发者常用的十款Chrome插件

    本文是稀土掘金投稿,虽然其中有倔金的私货,是篇推广文,但我看过后认为内容确实不错,有些好插件还是第一次知道,对我很有帮助,考虑过后还是决定推荐给大家,最近我比较关注各种提高开发效率的工具与技巧,今后看 ...

  8. 十款开发者常用的Chrome插件,让chrome成为开发利器!

    Chrome浏览器无论是作为浏览器市场的NO1还是其强大的跨平台能力以及丰富的扩展插件,一直是许多开发者的首要选择的浏览器.chrome浏览器也因为其丰富的Chrome插件,帮助开发者们在开发流程中极 ...

  9. 作为一个程序员,分享一下我自己常用的几款非常方便的chrome插件

    作为一名资深码农,结合身边一群IT民工的真实体验,小编有那么一点权威给各位推荐几款程序员必备.常用的chrome扩展插件. 1.Click&Clean Click&Clean插件可以监 ...

随机推荐

  1. Python爬虫初学(一)—— 爬取段子

    最近开始学Python的爬虫,是在这个博客跟着学习的,该博主用的是Python 2.7版本,而我使用的是3.5版本,很多不兼容的地方,不过没关系,自己改改就好了. 我们想针对网站的内容进行筛选,只获取 ...

  2. 16. leetcode 404. Sum of Left Leaves

    Find the sum of all left leaves in a given binary tree. Example:     3    / \   9  20     /  \    15 ...

  3. NYOJ--水池数目

    //NYOJ--水池数目 #include<iostream> #include<cstring> }; using namespace std; void dfs(int,i ...

  4. 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换 a 和 b 的值。

    这不具有可移植性.它试图在序列点之间两次修改变量 a, 而这是无定义的. 例如,有人报告如下代码: int a = 123, b = 7654; a ^= b ^= a ^= b; 在 SCO 优化 ...

  5. 白话ASP.NET MVC之三:Controller是如何解析出来的

    我们在上一篇文章中介绍Controller激活系统中所涉及到的一些类型,比如有关Controller类型的相关定义类型就包括了IController类型,IAsyncController类型,Cont ...

  6. Git 深入浅出

    如果你是一个开发人员,想用上这个世界上目前最先进的分布式版本控制系统,那么,赶快开始学习吧!(耐心读下去,收获满满) Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git ...

  7. python伪装浏览器爬虫

    待完善 import urllib2,urllib,cookielib urllib.getproxies_registry=lambda:{} request=urllib2.Request(&qu ...

  8. Discuz 7.2 faq.php漏洞分析

    漏洞发生在页面faq.php中,源码如下: elseif($action == 'grouppermission') {ksort($gids); $groupids = array(); forea ...

  9. Github 开源:使用 .NET WinForm 开发所见即所得的 IDE 开发环境(Sheng.Winform.IDE)【2.源代码简要说明】

    GitHub:https://github.com/iccb1013/Sheng.Winform.IDE 在上一篇文章中,简要的介绍了  Sheng.Winform.IDE 的基本功能和要实现的目标: ...

  10. webService接口交互

    1.需要在XXXXX.wsdl中配置相应的类与service方法. 2.启动你的项目,打开浏览器,输入地址:http://localhost:8080/lis/services,就能看到你XXXXX. ...