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