AnyProxy 知识点

2017年07月12日

终端输入以下命令可以启用 AnyProxy ,-i 参数的意思时启用 HTTPS 传输模式

sudo anyproxy -i

HTTP 通信过程的各个阶段进行抽离,分解成三个阶段:

对于上述每个阶段,AnyProxy 都提供了 API 接口,引入开发者编写自己的规则代码,实时干预通信过程,以此满足各类自定义需求。

具体提供的接口包括:

可以通过查看/usr/local/lib/node_modules/anyproxy/rule_sample 熟悉对应的规则。

解析 HTTPS

AnyProxy 解析 HTTPS 的原理是自制根证书(rootCA),待终端信任这份证书之后,再用它签发各个域名的二级证书,此时二级证书可以重新对各个页面进行解析。这种方案和 HTTPS 的“中间人攻击”(MITM)是一致的。

所以此证书是需要先安装的。安装参考:http://anyproxy.io/cn.html#osx 系统信任 ca 证书

更多参考网址:

微信查看历史消息程序中的知识点总结

判断一些网页请求

1// 通过Request头部accept判断请求的文件类型是否为图片
2if (/image/.test(req.headers.accept)) {
3  // 返回本地图片
4  callback(200, { 'content-type': 'image/png' }, fs.readFileSync('/Users/liqiang/Desktop/1.png'));
5}
6
7// 判断url时
8/profile_ext/.test(req.url); // 历史消息页
9/getappmsgext/.test(req.url); // 阅读量和点赞量的url

rule_default.js

shouldUseLocalResponse 这个接口中编写拦截代码,只让属于微信的Request请求通过,屏蔽其他网页和图片请求。具体代码如下:

 1// 屏蔽除微信外其他网络连接
 2if (/[weixin|wx].qq.com/.test(req.headers.host)) {
 3  // 历史消息抓取完成之后由发出的Ajax请求
 4  if ('/startAnother' == req.url) {
 5    return true;
 6  } else {
 7    return false;
 8  }
 9} else {
10  return true;
11}

dealLocalResponse 中不做任何反应,这样来自客户端的请求就不会无限发出了。当然需要对之后发出的 Ajax 请求作出回应:

1if (req.url == '/startAnother') {
2  // 调用打印PDF的程序接口
3  myRule.toPdf();
4  callback(200, { 'content-type': 'text/plain' }, '');
5}

通过上面的两个接口,就可以只让微信的请求真正的发出去。然后接收到的响应数据便可以通过replaceServerResDataAsync 此接口来提取历史文章链接,以及注入返回至微信客户端的自动翻页 js 代码。

 1replaceServerResDataAsync: function(req,res,serverResData,callback){
 2
 3    // 历史消息页判断,调用自己写的规则
 4    if (/profile_ext.+__biz/.test(req.url)){
 5        myRule.getProfile(req,res,serverResData,callback);
 6    } else {
 7        callback(serverResData);
 8    }
 9
10},

此时便引用到了myRule 此模块文件了。前提是需要在开头通过require来引用:

1var myRule = require('./myRule');

myRule.js

此文件中导出了两个方法,可以在上面文件引用:

1exports.getProfile = getProfile;
2exports.toPdf = toPdf;

getProfile方法即通过分析Response数据,提取历史文章的链接,然后保存在文本文件中。具体细节部分:

toPdf方法是提取完成后,发出调用直接爬虫的程序请求。