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中转换URL字符串与查询字符串详解
Nov 26 NodeJs
NodeJS中Buffer模块详解
Jan 07 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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&java(三)
2006/10/09 PHP
用PHP实现维护文件代码
2007/06/14 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
php模板中出现空行解决方法
2011/03/08 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
python各种语言间时间的转化实现代码
2016/03/23 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python3.6简单反射操作示例
2018/06/14 Python
python django model联合主键的例子
2019/08/06 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
python画环形图的方法
2020/03/25 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
佳能德国网上商店:Canon德国
2017/03/18 全球购物
StringBuilder和String的区别
2015/05/18 面试题
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
自我评价优秀范文分享
2013/11/30 职场文书
审计主管岗位职责
2014/01/31 职场文书
辞职信如何写
2015/02/27 职场文书
小学班主任研修日志
2015/11/13 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis