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. [js高手之路]es6系列教程 - 解构详解

    解构通俗点说,就是通过一种特定格式,快捷的读取对象/数组中的数据的方法, es6之前,我们通过对象名称[键] 读取数据 var User = { 'name' : 'ghostwu', 'age' : ...

  2. ORA-01036: 非法的变量名/编号 解决方案

    今天又一次遇到了 ORA-01036: 非法的变量名/编号 的问题,之前在项目中也遇见过这个问题,但是具体怎么解决的忘记了,今天又是遇见了,花了半个小时才解决.我今天遇到的情况是这样的: 存储过程中有 ...

  3. Spring框架集成mybatis框架的配置(笔记)

    <!-- 0.注解扫描 --><!-- 1.导入外部文件 --><!-- 2.数据源 --><!-- 3.session Factory -->< ...

  4. Koa框架教程,Koa框架开发指南,Koa框架中文使用手册,Koa框架中文文档

    我的博客:CODE大全:www.codedq.net:业余草:www.xttblog.com:爱分享:www.ndislwf.com或ifxvn.com. Koa -- 基于 Node.js 平台的下 ...

  5. js判断移动终端(手机浏览器)

    方法1: <script type="text/javascript">         var browser = {             versions: f ...

  6. AsyncTask用法解析-下载文件动态更新进度条

    1. 泛型 AysncTask<Params, Progress, Result> Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. ...

  7. 脱壳练习之bitarts 5.0

    运行界面 一开始不是PUSHAD,这里我们跟到PUSHAD指令处,按F7执行该指令,接着在寄存器窗口中定位到ESP寄存器的值,在其上面单击鼠标右键选择-Follow in Dump. 仅允许非商业转载 ...

  8. 手脱UPX(堆栈平衡原理)

    一开始看到pushad F8执行直到只有esp,eip,变化 在esp处follow in dump 下硬件访问断点 F9运行在硬件断点停下 到达一个长跳转(跳到OEP) 完成 ----------- ...

  9. [BZOJ 3629][ JLOI2014 ]聪明的燕姿

    这道题考试选择打表,完美爆零.. 算数基本定理: 任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P₁^a₁ P₂^a₂…Pn^an,这里P₁<P₂<…<Pn均为质数, ...

  10. 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测

    本文结构: 时间序列分析? 什么是ARIMA? ARIMA数学模型? input,output 是什么? 怎么用?-代码实例 常见问题? 时间序列分析? 时间序列,就是按时间顺序排列的,随时间变化的数 ...