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. C#去掉JSON字符串中的最后一个数字

    这个问题总结起来就是去掉字符串中的最后一个"," 字符串:string s = "1,2,3,4,5," 目标:删除最后一个 "," 方法: ...

  2. zzuli--2134: 维克兹的进制转换(规律)

    2134: 维克兹的进制转换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 287  Solved: 63SubmitStatusWeb Board D ...

  3. 今天聊一聊nuxt.js(上)

    背景 近期在做内部系统的重构,从一线业务彻底的重构,经过充分的考虑我们准备把这个项目打造成前台业务的试验站,比如ssr和一些其他的前沿技术的探索,积累充分的经验后待合适的契机应用到C端的项目中. 既然 ...

  4. HTML的正确入门姿势——基本结构与基本标签

    一.什么是HTML HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML文档的结构 HTML文档主要包括三大部分:文档声明部分.<head>头部部 ...

  5. [bzoj 2438][中山市选2011]杀人游戏 概率+tarjan

    考试的时候想了很多,不知道它那个概率究竟是怎么算..没想到能蒙30分.rp爆发hhh 题解转自不知道哪里来的老师发的(代码出自自己). 实际上警察就是两种结果——查到犯人或死亡,而死亡事件一定是包含在 ...

  6. 使用Spring Boot快速构建基于SQLite数据源的应用

    为了提供一个单包易部署的服务器应用,考虑使用Spring Boot,因为其集成了Apache Tomcat,易于运行,免去绝大部分了服务器配置的步骤. 项目初始化 首先从mvn archetype:g ...

  7. 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(四)之插入SQL

  8. 一个普通的 Zepto 源码分析(三) - event 模块

    一个普通的 Zepto 源码分析(三) - event 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块, ...

  9. JUnit4在Eclipse中的使用

    测试是项目开发中很重要的一环.实际上,建议的项目前期编写过程是:构思-> 编写单元测试代码-> 编写接口->编写实现类-> 测试实现类->编写主类....JUnit是一个 ...

  10. ECharts的简单使用

    ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻 ...