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 相关文章推荐
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
Nodejs实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
nodejs教程之入门
Nov 21 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
详解nodejs http请求相关总结
Mar 31 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 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
Php图像处理类代码分享
2012/01/19 PHP
初品cakephp 入门基础
2012/02/16 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
php多文件上传实现代码
2014/02/20 PHP
php获取url参数方法总结
2014/11/13 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
python通过zabbix api获取主机
2018/09/17 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
linux面试相关问题
2012/08/11 面试题
幼儿园教师工作感言
2014/02/15 职场文书
和解协议书
2014/04/16 职场文书
小学老师对学生的评语
2014/12/29 职场文书
扬州个园导游词
2015/02/06 职场文书
安全保证书格式
2015/02/28 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
六年级作文之家庭作文
2019/12/12 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android