/ 昌里大金猪的空间 / node.js 下的短网址还原

node.js 下的短网址还原

2011-06-10 posted in [node]

阮一峰在他的个人博客中提供了短网址还原的Bookmarklet,文中提及的unshort.me提供了短网址还原的API,目前支持三种返回格式:XML/JSON/JSONP。在此我选择JSON,具体实现如下:

  1. var sys = require("sys"),  
  2.     http = require("http"),  
  3.     url = require("url"),  
  4.     events = require("events"),  
  5.     emitter = new events.EventEmitter();  
  6. // unshorten url  
  7. function _unshorten(){  
  8.     var _body = '',  
  9.         _host = "api.unshort.me",  
  10.         _client = http.createClient(80, _host),  
  11.         _request = _client.request("GET", api, {"host": _host});  
  12.     _request.on("response"function(_response){  
  13.         _response.on("data"function(_data){  
  14.             _body += _data;  
  15.         });  
  16.         _response.on("end"function(){  
  17.             console.log(_body);  
  18.             var _data = JSON.parse(_body);  
  19.             emitter.emit("urldata", _data);  
  20.         });  
  21.     });  
  22.     _request.end();  
  23. };  
  24. // 创建http服务器实例  
  25. http.createServer(function(_request, _response){  
  26.     var _url = url.parse(_request.url),   
  27.         _uri = _url.pathname;  
  28.     if (_uri === "/") {  
  29.         var _search = _url.search || '?r=';  
  30.         api = _search + '&t=json';  
  31.         emitter.once("urldata"function(_data){  
  32.             _response.writeHead(200, {"Content-Type":"text/html"});  
  33.             _response.write(''+  
  34.                 '<h2>' +   
  35.                 (_data['success'] == 'true' ?   
  36.                 ('解析后的URL — ' + _data['resolvedURL']) :   
  37.                 ('URL无法解析 - ' + (_data['requestedURL']||'(空)'))) +   
  38.                 '</h2>');  
  39.             _response.end();  
  40.         });  
  41.         _unshorten();  
  42.     }  
  43. }).listen(8080);  
  44.   
  45. process.on('uncaughtException'function(_error){  
  46.     console.log('Caught exception: ' + _error);  
  47. });  
  48.   
  49. // 打印启动信息  
  50. sys.puts("Server running at http://localhost:8080/"); 
源代码@github

解析成功:
node.js下的短网址还原 - nomospace(昌里大金猪) - Nomospace

 解析失败:
node.js下的短网址还原 - nomospace(昌里大金猪) - Nomospace
 
推荐fengmk2缩址还原一文,实现原理是通过httpclient递归请求短网址。

参考资料:
构建简易unshorter
Google短网址的API
How to UNshorten Any URL
Unshorten - URL Expander