Nodejs做整站转发

刚接触nodejs,做个东西练下手,通过nodejs直接转发整站,原本想把内容全翻译成英文,但google对流量行审查,被封IP,所以就没啥用了, 效果像这样

var b = function (a, b) {
	for (var d = 0; d < b.length - 2; d += 3) {
		var c = b.charAt(d + 2),
			c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
			c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
		a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
	}
	return a
}

var gettk =  function (a,TKK) {
	//console.log(a,TKK);
	for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
		var c = a.charCodeAt(f);
		128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
	}
	a = h;
	for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
	a = b(a, "+-3^+b+-f");
	a ^= Number(e[1]) || 0;
	0 > a && (a = (a & 2147483647) + 2147483648);
	a %= 1E6;
	return a.toString() + "." + (a ^ h)
} 

function getTransRecursive(text,allrs,callback)
{
	console.log(text.length);
	var surplus=text.substring(4000);
	text=text.substring(0,4000);
	getTrans(text,function(rs){
		allrs+=rs;
		if(surplus.length>0)
		{
			getTransRecursive(surplus,allrs,callback);
		}else{
			callback(allrs);
		}
	});
}
 function getTrans(text,callback)
 { 

	 var tk=gettk(text, "424997.418814026");
	 var url=‘/translate_a/single?client=t&sl=zh-CN&tl=en&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&pc=1&otf=1&ssel=6&tsel=3&kc=0&tk=‘+ tk ;
	 var options = {
			hostname: ‘translate.google.cn‘,
			port: 80,
			path: url,
			method: ‘POST‘,
			headers: { // 必选信息,  可以抓包工看一下
				"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"
			}
		 };
	 var tbody="";
	 var req = http.request(options, function (remoteRes) {
			remoteRes.setEncoding(‘utf8‘);
			remoteRes.on(‘data‘, function (chunk) {
				 tbody+=chunk;
			});
			remoteRes.on("end",function(){
						  try
						  {
							tbody=eval(tbody);
							tbody=tbody[0];
							var rstext="";
							for(var i in tbody)
							{
								rstext+=tbody[i][0];
							}
							callback(rstext);
						  }
						  catch(err)
						  {
							console.log("transErr1:");
							console.log(err);
							callback(text);
						  }
				  });
		});
		req.on(‘error‘, function (e) {
			console.log(‘transErr2:‘ + e.message);
			callback(text);
		});
		req.write("q="+ encodeURI(text));
		req.end();
 } 

function handleStr(newhost,url,str,isHtml,callback)
{
	if(!isHtml||url==""||url=="/")
	{
		callback(str);
		return;
	}
	str= str.replace(/<script (([\s\S])*?)<\/script>/g,"");
	//替换掉所有列表中的网址
	for(var key in hostList){
		str= str.replace(hostList[key],key);
	} 

	//callback(str); 

	//根据域名进行翻译
	switch(newhost)
	{
		case "www.guancha.cn":
			var $ = cheerio.load(str);
			var headtitle=$("head>title").text();
			headtitle=unescape(headtitle.replace(/&#x/g,‘%u‘).replace(/;/g,‘‘)); 

			var nav=$(".nav").html();
			nav=unescape(nav.replace(/&#x/g,‘%u‘).replace(/;/g,‘‘)); 

			var str = $(‘.all-txt‘).text();
			var title= $(‘.left-main‘).find(‘h3‘).text();

			getTransRecursive(str,"",function(str){
				$(‘.all-txt‘).text(str);
				getTransRecursive(title,"",function(title){
					$(‘.left-main‘).find(‘h3‘).text(title);
					getTransRecursive(headtitle,"",function(head){
						$("head>title").text(title);
						getTransRecursive(nav,"",function(nav){
							$(".nav").html(nav);
							callback($.html());
						});
					});
				});
			}); 

		break;
		default:
			callback(str);
		break;
	}
}
var hostList={"www.thiscnnews.com":"www.guancha.cn","localhost1:8080":"user.guancha.cn"}
var noCatchList=[‘/?s=dhshouye‘,‘/internation?s=dhguoji‘,‘/military-affairs?s=dhjunshi‘,‘/economy?s=dhcaijing‘,‘/industry-science?s=dhkeji‘,‘/TMT?s=dhtmt‘,‘/car?s=dhqiche‘,‘/thinktank?s=dhzhiku‘,‘/GuanWangKanPian?s=dhshipin‘];

function isInArray3(arr,value){
    if(arr.indexOf&&typeof(arr.indexOf)==‘function‘){
        var index = arr.indexOf(value);
        if(index >= 0){
            return true;
        }
    }
    return false;
}

function getNewHost(host)
{
	if(host in hostList)
	{
		return hostList[host];
	}else{
		return "www.guancha.cn";
	}
}
function getRemote(newhost,url,res,file)
{

	var body="";
	var options = {
			hostname: newhost,
			port: 80,
			path:url,
			method: ‘GET‘
		};
	var req = http.request(options, function (remoteRes) {
			remoteRes.setEncoding(‘utf8‘);
			remoteRes.on(‘data‘, function (chunk) {
				 body+=chunk;
			});
			remoteRes.on("end",function(){
					  handleStr(newhost,url,body,remoteRes.headers[‘content-type‘].indexOf("text/html") != -1,function(rs){
						  if(file!=‘‘){
							  fs.writeFile(file, rs, {flag: ‘a‘}, function (err) {
									   if(err) {
											console.error(err);
										}
									});
						  }
						  res.end(rs);
					  });
				  });
		});
		req.on(‘error‘, function (e) {
			res.end( e.message);
			console.log(‘problem with request: ‘ + e.message);
		});
		req.end();
}
var mkdirs = module.exports.mkdirs = function(dirpath, mode, callback) {
    fs.exists(dirpath, function(exists) {
        if(exists) {
                callback(dirpath);
        } else {
                //尝试创建父目录,然后再创建当前目录
                mkdirs(path.dirname(dirpath), mode, function(){
                        fs.mkdir(dirpath, mode, callback);
                });
        }
    });
};

function getCatch(newhost,url,callback)
{
	var file=__dirname+‘/tmp/‘+newhost.replace(‘:‘,‘‘);
	mkdirs(file,777,function(){
		file+=‘/‘+cryptos.md5(url);
		fs.exists(file,function(exists){
			 if(exists)
			 {
				 fs.readFile(file,‘utf-8‘,function(err,data){
					 if(err){
							 callback(false,file);
						 }
						 else{
							 callback(true,file,data);
						}
				  });
			 }else{
				callback(false,file);
			 }
		});
	});
}
var useCatch=true;
//html解析器
var cheerio = require(‘cheerio‘);
//文件操作模块
var fs = require(‘fs‘),path = require(‘path‘);
//加密模块
var cryptos=require("./cryptos");
//引入http模块
var http = require("http");
//设置主机名
 var hostName = ‘127.0.0.1‘;
//设置端口
var port = 9000;
//创建服务
var server = http.createServer(function(req,res){
		var newhost= getNewHost(req.headers.host);
		var url=req.url;
		if(useCatch&&!isInArray3(noCatchList,url))
		{
			getCatch(newhost,url,function(hasData,file,data){
				if(hasData)
				{
					res.end(data);
				}else{
					getRemote(newhost,url,res,file);
				}
			});
		}else{
			getRemote(newhost,url,res,‘‘);
		}

});
server.listen(port,hostName,function(){
    console.log(‘run‘);
});

  

原文地址:https://www.cnblogs.com/meieiem/p/9244751.html

时间: 2024-10-12 12:08:04

Nodejs做整站转发的相关文章

Linux系统下利用wget命令把整站下载做镜像网站

Linux系统下利用wget命令把整站下载做镜像网站 2011-05-28 18:13:01 | 1次阅读 | 评论:0 条 | itokit  在linux下完整的用wget命令整站采集网站做镜像 的命令是及无视网站根目录下的robots.txt限制.并且可以模拟一个正常浏览者的信息下载该网站. C/C++ Code复制内容到剪贴板 wget -m -e robots=off -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.

301跳转:IIS服务器网站整站301永久重定向设置方法(阿里云)

欢迎来到重庆SEO俱乐部:搜索引擎优化学习交流QQ群224306761. 承接:seo优化.网站建设.论坛搭建.博客制作.全网营销 博主可接:百度百家.今日头条.一点资讯等软文发布,有需要请联系PE! 点击与站长互动 301跳转:IIS服务器网站整站301永久重定向设置方法(阿里云) 首页 > 主机 > 正文 Panoeade / 2016-04-24 / 1975 views / 0 Replies / 悦读模式 / 百度已收录 欢迎投稿SEO/SEM及互联网相关文章:百度百家.今日头条.一

前端资源多个产品整站一键打包&amp;包版本管理(一)

来新公司工作的第五个月.整站资源打包管理也提上了日程. 问题: 首先.什么是整站的打包管理呢? 我们公司的几个重要产品都在同一个webapp里面,但是,不同的开发部门独立开发不同的产品,长期以来,我们就不知道其他部门的在做什么,或许我们正在头疼的问题,隔壁部门已经早早解决了呢? 各个部门的前端资源也是到处都是.难以管理.于是就提出了整站资源共享.整站资源共享的前提就是资源打包能统一.在几个产品里面.既有使用grunt的也有使用glup的,各个产品引入的包的版本也不一样. 目标: 统一打包工具 对

WordPress整站轻松开启HTTPS

近两年来HTTPS取代HTTP已经成为大势所趋.早在2014年google Chromium安全团队提议将所有的HTTP协议网站标注为不安全.现在,Chrome浏览器已经开始执行这一标准了.从 Chrome 56 开始,任何网页,如果有输入密码或者信用卡资料的,却没有使用 HTTPS,将被 Chrome 浏览器标识为不安全:逐步的,任何没有使用 HTTPS 协议的网页chrome浏览器都会被标识为”不安全”,或者 “Not Secure”. 从chrome 56 版本开始,查看网站的SSL证书的

5款整站下载器

本文转载:http://www.cnblogs.com/fumj/archive/2012/05/30/2526062.html 有的人利用整站下载工具下载网站到本地进行慢慢的欣赏,有的人利用全站下载工具创建垃圾站.不管你是出于什么样的目的,下面这些工具软件你可以会需要. TeleportUltra Teleport Ultra所能做的,不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能),它可以从Internet的任何地方抓回你想要的任何文件,它可以在你指定的时间自

几款整站抓取的工具

TeleportUltra Teleport Ultra所能做的,不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能),它可以从Internet的任何地方抓回你想要的任何文件,它可以在你指定的时间自动登录到你指定的网站下载你指定的内容,你还可以用它来创建某个网站的完整的镜象,作为创建你自己的网站的参考. WebZip WebZip 把一个网站下载并压缩到一个单独的 ZIP 文件中,可以帮您将某个站台全部或部份之资料以ZIP格式压缩起来,可供你日后快速浏览这个网站.且新

对整站的a链接进行监控,对匹配规则进行指定页面的跳转

项目中有个需求,就是将非本站的链接跳转到过渡页(提示即将离开本站的那种页面).这个时候想起了腾讯邮箱,不安全链接会有新的页面提示,如下图: 本以为ASP.NET中有全局的方法获取到点击或者跳转的链接,结果也没找到.Request和Response都取不到的,HttpModule,HttpHandle,Global中也一样,毕竟跳转之后是到别人的网站上去了.不晓得IIS上能否监控的到.最后只能在a标签上加Onclick了.由于a标签的onclick要比href先执行,所以把a标签统一加上oncli

5款整站下载工具

有的人利用整站下载工具下载网站到本地进行慢慢的欣赏,有的人利用全站下载工具创建垃圾站.不管你是出于什么样的目的,下面这些工具软件你可以会需要. TeleportUltra Teleport Ultra所能做的,不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能),它可以从Internet的任何地方抓回你想要的任何文件,它可以在你指定的时间自动登录到你指定的网站下载你指定的内容,你还可以用它来创建某个网站的完整的镜象,作为创建你自己的网站的参考. WebZip WebZ

整站(网页)下载工具

有的人利用整站下载工具下载网站到本地进行慢慢的欣赏,有的人利用全站下载工具创建垃圾站.不管你是出于什么样的目的,下面这些工具软件你可以会需要. TeleportUltra Teleport Ultra所能做的,不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能),它可以从Internet的任何地方抓回你想 要的任何文件,它可以在你指定的时间自动登录到你指定的网站下载你指定的内容,你还可以用它来创建某个网站的完整的镜象,作为创建你自己的网站的参考. WebZip Web