nodejs实用示例 缩址还原


Posted in NodeJs onDecember 28, 2010

思路非常简单:
1. httpserver获取需要还原的url;
2. 使用httpclient递归请求这个url,直到发现http status not in (302, 301)为止。
3. 返回还原的原url。

好吧,代码如下:

var net = require('net'), 
http = require('http'), 
url = require('url'), 
fs = require('fs'); 
var DEFAULT_PORTS = { 
'http:': 80, 
'https:': 443 
}; 
var INDEX_TPL = fs.readFileSync('index.html'); 
function _write(str, res, content_type) { 
if(res.jsonp_cb) { 
str = res.jsonp_cb + '("' + str + '")'; 
} 
res.writeHead(200, { 
'Content-Length': str.length, 
'Content-Type': content_type || 'text/plain' 
}); 
res.end(str); 
}; 
function expand(short_url, res) { 
var info = url.parse(short_url); 
// console.log('info: ' + JSON.stringify(info)); 
if(info.protocol != 'http:') { // 无法请求https的url? 
_write(short_url, res); 
return; 
} 
var client = http.createClient(info.port || DEFAULT_PORTS[info.protocol], info.hostname); 
var path = info.pathname || '/'; 
if(info.search) { 
path += info.search; 
} 
var headers = { 
host: info.hostname, 
'User-Agent': 'NodejsSpider/1.0' 
}; 
var request = client.request('GET', path, headers); 
request.end(); 
request.on('response', function (response) { 
if(response.statusCode == 302 || response.statusCode == 301) { 
expand(response.headers.location, res); 
} else { 
_write(short_url, res); 
} 
}); 
}; 
//expand('http://sinaurl.cn/hbMUII'); 
// http服务 
http.createServer(function(req, res){ 
if(req.url.indexOf('/api?') == 0) { 
var params = url.parse(req.url, true); 
if(params.query && params.query.u) { 
if(params.query.cb) { // 支持jsonp跨域请求 
res.jsonp_cb = params.query.cb; 
} 
expand(params.query.u, res); 
} else { 
_write('', res); 
} 
} else { 
_write(INDEX_TPL, res, 'text/html'); 
} 
}).listen(1235); 
process.on('uncaughtException', function (err) { 
console.log('Caught exception: ' + err); 
});

启动你的web服务器吧:
$ node urlexpand.js
打开浏览器直接访问:
http://127.0.0.1:1235/api?u=http://is.gd/imWyT
或者访问我的测试服务器:
http://yongwo.de:1235/api?u=http://is.gd/imWyT&cb=foo
NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
将nodejs打包工具整合到鼠标右键的方法
May 11 NodeJs
初始Nodejs
Nov 08 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
详解nodejs操作mongodb数据库封装DB类
Apr 10 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
nodejs中解决异步嵌套循环和循环嵌套异步的问题
Jul 12 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 NodeJs
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 #NodeJs
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 #NodeJs
nodejs 后缀名判断限制代码
Mar 31 #NodeJs
NodeJS框架Express的模板视图机制分析
Jul 19 #NodeJs
用nodejs访问ActiveX对象,以操作Access数据库为例。
Dec 15 #NodeJs
NodeJS 模块开发及发布详解分享
Mar 07 #NodeJs
nodejs入门详解(多篇文章结合)
Mar 07 #NodeJs
You might like
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
js location.replace与location.reload的区别
2010/09/08 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
Python中DJANGO简单测试实例
2015/05/11 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python实现Linux中的du命令
2017/06/12 Python
对python中return和print的一些理解
2017/08/18 Python
itchat接口使用示例
2017/10/23 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
什么是GWT的Module
2013/01/20 面试题
2014年工会工作总结
2014/11/12 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js