这是一款借助chrome 插件的微信机器人
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()
这是一款借助chrome 插件的微信机器人的更多相关文章
- 推荐15款Google Chrome 插件
Google Chrome是由Google开发的免费网页浏览器.Chrome是化学元素“铬”的英文名称,过去也用Chrome称呼浏览器的外框.Chrome相应的开放源代码计划名为Chromium,而G ...
- 11款插件让你的Chrome成为全世界最好用的浏览器|Chrome插件推荐
文章来源:知乎 收录于:风云社区(SCOEE)[提供mac软件下载] 更多专题,可关注小编[磨人的小妖精],查看我的文章,也可上[风云社区 SCOEE],查找和下载相关软件资源. (一)综合类: 新买 ...
- 推荐几款我一直在用的chrome插件(上)
我用的chrome插件挺多的,所谓工欲善其事必先利其器,我热衷于搜寻好用的工具来让我平时的工作事半功倍.下面介绍几款我正在用的感觉还不错的插件,如果大家还有其它好用的(肯定有,chrome插件库太庞大 ...
- 推荐几款我一直在用的chrome插件(下)
请先看:推荐几款我一直在用的chrome插件(上) 6. Pocket 可以很方便的保存文章.视频等供以后查看,即实现了“Read it later”功能.有了 Pocket,您可以将所有想下次读的内 ...
- 借助Chrome和插件爬取数据
工具 Chrome浏览器 TamperMonkey ReRes Chrome浏览器 chrome浏览器是目前最受欢迎的浏览器,没有之一,它兼容大部分的w3c标准和ecma标准,对于前端工程师在开发过程 ...
- 介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件
先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱jia6235@163.com 可以内部推荐. DHC是一款 ...
- 开发者常用的十款Chrome插件
本文是稀土掘金投稿,虽然其中有倔金的私货,是篇推广文,但我看过后认为内容确实不错,有些好插件还是第一次知道,对我很有帮助,考虑过后还是决定推荐给大家,最近我比较关注各种提高开发效率的工具与技巧,今后看 ...
- 十款开发者常用的Chrome插件,让chrome成为开发利器!
Chrome浏览器无论是作为浏览器市场的NO1还是其强大的跨平台能力以及丰富的扩展插件,一直是许多开发者的首要选择的浏览器.chrome浏览器也因为其丰富的Chrome插件,帮助开发者们在开发流程中极 ...
- 作为一个程序员,分享一下我自己常用的几款非常方便的chrome插件
作为一名资深码农,结合身边一群IT民工的真实体验,小编有那么一点权威给各位推荐几款程序员必备.常用的chrome扩展插件. 1.Click&Clean Click&Clean插件可以监 ...
随机推荐
- Modular javascript(javascript模块化编程)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- UE4 C++ 跳转网页
FString TheURL = "https://home.cnblogs.com/u/huojiaoqingchun0123/"; FPlatformProcess::Laun ...
- Hbase集群监控
Hbase集群监控 Hbase Jmx监控 监控每个regionServer的总请求数,readRequestsCount,writeRequestCount,region分裂,region合并,St ...
- python发布及调用基于SOAP的webservice
现如今面向服务(SOA)的架构设计已经成为主流,把公用的服务打包成一个个webservice供各方调用是一种非常常用的做法,而应用最广泛的则是基于SOAP协议和wsdl的webservice.本文讲解 ...
- Orcle导入导出dmp文件
--Orcle导入导出dmp文件 --------------------------2013/12/06 导出表: exp scott/tiger@mycon tables=(dept,emp) ...
- Python 搭建环境踩过的那些坑
实践出真知,学习 Python 第六天,准备开始尝试写一些 Python 的实例.之前学习过程主要是参照的 廖雪峰老师的教程.搭建环境的过程,被很多坑围绕着. 版本选择 版本选择 Python 3.5 ...
- HTML-CSS相关(1)
一 浮动 1.标准流中的块级盒子,宽度将会自动伸展为100%而浮动的块级盒子,宽度不会自动伸展,而是由内容撑开. 2.当一个盒子浮动,标准流中未浮动的其他盒子,将视浮动盒子不存在而占据浮动盒子原来的 ...
- JSP 标准标签库(JSTL)(JSP Standard Tag Library)
[1] JSTL简介 > JSTL是JSP的标准标签库 > JSTL为我们提供了一些常用的标签,供我们日常开发使用(if . if...else .遍历 . 日期格式化) ...
- You don't know js
"Give me a chance to know you. " 更多内容: 移步这里 1. 作用域 1.1. 编译原理 尽管通常将 JavaScript 归类为"动态& ...
- 怎么检测JDK环境变量是否配置正确
怎么检测JDK环境变量是否配置正确.. 点击开始--运行--输入cmd,点击确定. 在命令行窗口输入java 然后Enter.没有出现java既不是内部命令也不是外部命令.说明配置是正确的. 在命令 ...