nodejs下载器,通过chrome代理下载http资源
var config={
//不想访问的东西,节约流量
"404":[
"http://qidian.qpic.cn/qdbimg"
],
//奇数为需要下载的,偶数为不需要下载的
needLoad:[
//匹配需要下载的
[
"/*.js",
"/*.css",
"/*.png"
],
//匹配不需要下载的
[
"/a.js"
]
],
//修改文件保存的地方,默认按照url来的
saveFiles:[
//防止太深文件夹
["(//*/*/*/*/*/)**/","$1"],
//过滤无效文件夹字符
[/(\/\w*)\?+(\w*\/)/gi,"$1$2"]
],
//代理的端口号
port:100
} function regDir(str){
var reg=str
if(typeof reg=="string"){
reg=reg.replace(/[\[\]\\\^\:\.\?\+]/g,function(m){
return "\\"+m;
})
reg=reg.replace(/\*\*|\*/g,function(m){
if(m=="**"){
return "[\\w\\W]*";
}else{
return "[^\\\/]*";
} })
reg=new RegExp(reg,"gi")
}
return reg
}
String.prototype.Test=function(regStr){
var reg=regDir(regStr)
return reg.test(this)
}
String.prototype.Replace=function(regStr,fn){
var reg=regDir(regStr)
return this.replace(reg,fn);
}
var fs=require("fs")
function mkdir(filepath){
var path=require("path")
if(!fs.existsSync(path.dirname(filepath))){
mkdir(path.dirname(filepath))
}
if(!fs.existsSync(filepath)){
fs.mkdirSync(filepath)
}
} function eachHeader (obj, fn) {
if (Array.isArray(obj.rawHeaders)) {
// ideal scenario... >= node v0.11.x
// every even entry is a "key", every odd entry is a "value"
var key = null;
obj.rawHeaders.forEach(function (v) {
if (key === null) {
key = v;
} else {
fn(key, v);
key = null;
}
});
} else {
// otherwise we can *only* proxy the header names as lowercase'd
var headers = obj.headers;
if (!headers) return;
Object.keys(headers).forEach(function (key) {
var value = headers[key];
if (Array.isArray(value)) {
// set-cookie
value.forEach(function (val) {
fn(key, val);
});
} else {
fn(key, value);
}
});
}
}
var hopByHopHeaders = [
'Connection',
'Keep-Alive',
'Proxy-Authenticate',
'Proxy-Authorization',
'TE',
'Trailers',
'Transfer-Encoding',
'Upgrade'
];
// create a case-insensitive RegExp to match "hop by hop" headers
var isHopByHop = new RegExp('^(' + hopByHopHeaders.join('|') + ')$', 'i');
//伪造http
function parse (req, server) { var parsed = require("url").parse(req.url);
var socket = req.socket;
parsed.uri=parsed.href;
parsed.gzip=true;
// proxy the request HTTP method
parsed.method = req.method; // setup outbound proxy request HTTP headers
var headers = {};
var hasXForwardedFor = false;
parsed.headers = headers;
eachHeader(req, function (key, value) {
var keyLower = key.toLowerCase();
if (!hasXForwardedFor && 'x-forwarded-for' === keyLower) {
// append to existing "X-Forwarded-For" header
// http://en.wikipedia.org/wiki/X-Forwarded-For
hasXForwardedFor = true;
value += ', ' + socket.remoteAddress;
}
if (isHopByHop.test(key)) {
} else {
var v = headers[key];
if (Array.isArray(v)) {
v.push(value);
} else if (null != v) {
headers[key] = [ v, value ];
} else {
headers[key] = value;
}
}
}); if (!hasXForwardedFor) {
headers['X-Forwarded-For'] = socket.remoteAddress;
}
if (null == parsed.port) {
// default the port number if not specified, for >= node v0.11.6...
// https://github.com/joyent/node/issues/6199
parsed.port = 80;
}
return parsed
} function getPath(url){
var filename=url.Replace("(**)?*","$1").Replace("http://(**/*)","$1")
var dirname=filename.Replace("(**)/*","$1")
mkdir("www/"+dirname)
return "www/"+filename
}
var api={
parse:parse,
mkdir:mkdir,
getPath:getPath
}
/************************************/
var http = require('http');
var fs=require("fs")
var request = require('request'); var server = http.createServer();
server.listen(config.port||100, function () {
var port = server.address().port;
console.log('HTTP(s) proxy server listening on port %d', port);
}); server.on('request', function (req, res) { var url=req.url
var arr404=config["404"]
var is404=false
arr404.forEach(function(v,k){
if(url.Test(v)){
is404=true
}
})
if(is404){
res.end()
return
}
var parsed=api.parse(req,this)
//是否下载
var isLoaded=false; //是否下载的列表
var regArr=config.needLoad
var back=false
regArr.forEach(function(v,k){
back=!back
v.forEach(function(v2,k2){
if(url.Test(v2)){
isLoaded=back
}
})
})
//修改保存文件路径
/*
* 匹配规则
* 修改后 */
var saveFiles=config.saveFiles
// isLoaded=false
if(isLoaded){
saveFiles.forEach(function(v,k){
url=url.Replace(v[0],v[1])
})
console.log(url)
var path=api.getPath(url)
console.log(path)
//下载
var reque=request(parsed,function(err,resp,body){
if(err){
return
}
if(path.Test("/*.css")){
res.writeHead(200,{
"content-type":"text/css"
})
}
fs.createReadStream(path).pipe(res)
})
reque.pipe(fs.createWriteStream(path))
reque.on("error",function(){
console.error(url)
}) }else{
//不下载
var reque=request(parsed)
reque.pipe(res)
reque.on("error",function(){
console.error(url)
}) } })
nodejs下载器,通过chrome代理下载http资源的更多相关文章
- IDM下载器添加支持自动下载的文件类型
不知道各位读者老爷有没有试过IDM下载器的自动下载功能,对于经常需要下载素材资源的朋友来说,一个个的选择图片或者其他什么素材来下载也是够烦的,IDM的自动下载功能可谓是十分好用,而且自动下载+批量下载 ...
- 如何在苹果电脑下载器Folx中管理下载列表
Folx是一款Mas OS专用的下载器,提供了便捷的下载管理.灵活的设置.今天小编准备跟大家聊一聊关于Folx中常见的几种下载管理方式. 一.管理任务状态栏 在Folx下载面板上,可以通过类别查看任务 ...
- 使用Python开发小说下载器,不再为下载小说而发愁 #华为云·寻找黑马程序员#
需求分析 免费的小说网比较多,我看的比较多的是笔趣阁.这个网站基本收费的章节刚更新,它就能同步更新,简直不要太叼.既然要批量下载小说,肯定要分析这个网站了- 在搜索栏输入地址后,发送post请求获取数 ...
- scrapy中的下载器中间件
scrapy中的下载器中间件 下载中间件 下载器中间件是介于Scrapy的request/response处理的钩子框架. 是用于全局修改Scrapy request和response的一个轻量.底层 ...
- 基于iOS 10、realm封装的下载器
代码地址如下:http://www.demodashi.com/demo/11653.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重,再加上iOS10和X ...
- .NET破解之太乐地图下载器【非暴破】
不知不觉,接触破解逆向已经三个月了,从当初的门外汉到现在的小白,这个过程只有经历过才知道其中的苦与乐: 有无知.困惑.痛苦.惊喜.彻悟.欣慰…… 有无助的软件脱壳,茫然的代码分析,有无趣的反复测试, ...
- python多进程断点续传分片下载器
python多进程断点续传分片下载器 标签:python 下载器 多进程 因为爬虫要用到下载器,但是直接用urllib下载很慢,所以找了很久终于找到一个让我欣喜的下载器.他能够断点续传分片下载,极大提 ...
- SongTaste音乐下载器
SongTaste音乐下载器 Songtaste是一个非常好的音乐推荐网站, 奈何和duomi搅合在一起, 导致下载音乐非常的麻烦, 现在写了一个简单的"下载器", 通过它可以下载 ...
- 使用Via浏览器+ADM下载器突破百度网盘下载限速
1.下载必要工具 via浏览器 ADM下载器 2.自定义 UA UA 是一串特殊字符,用来告诉所访问的网站,手机使用的操作系统及版本.CPU 类型.浏览器及版本等信息.UA 内容如下: Mozilla ...
随机推荐
- Linux Valgrind命令
一.简介 C/C++程序,最常见的错误之一就是内存泄露.Valgrind 是一款 Linux下的内存调试工具,它可以对编译后的二进制程序进行内存使用监测找出内存泄漏问题. Valgrind通常包括如下 ...
- Java虚拟机学习总结之OutOfMemoryError异常
参考:深入理解java虚拟机一书 开始之前,我们也应当搞清楚连个概念,内存泄漏Memory Leak 内存溢出: 内存泄漏:程序中间动态分配了内存,但是在程序结束时没有释放内存,造成这部分内存不可用. ...
- [GO]数组指针做函数参数
package main import "fmt" //p指向实现数组a,它是指向数组,它是数组指针//*p指向指针指向的内存,就是实参a func modify1(p *[]in ...
- web大文件上传控件-监控fd_create流程-Xproer.HttpUploader6
监控fd_create流程 1.打开ie,f12 2.启动网络监控 点击开始捕获 上传文件夹,然后查看监控 将监控信息转到详细视图
- JAVA WEB第0课
在这学期内要掌握JAVA WAB高级网站开发的所有知识,并可以实际运用到.每周将花费20小时左右的时间来学习此门课程,每一天,在当天其他课程任务完成后将开始学习该课程,具体时间要看当天 ...
- 深入理解python中可迭代对象,迭代器,生成器
英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...
- Java集合类总结 (五)
集合框架 为了避免进行不必要的随机访问操作,Java引入了一种标签接口RandomAccess, 这个接口没有任何方法,只是一个标签,用来标记一个集合是否应该进行随机访问操作: if (c insta ...
- ComicEnhancerPro 系列教程二十:用“文件比较”看有损、无损
作者:马健邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程二十:用“文件比较” ...
- [.net 多线程]Mutex
Mutex是可以进程间同步的同步基元. 名称 说明 Mutex() 使用默认属性初始化 Mutex 类的新实例. Mutex(Boolean) 使用 Boolean 值(指示调用线程是否应具有互斥 ...
- 1、认识Socket
专业术语定义:(不易理解浏览大体意思即可) 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本 ...