凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Google の URL 短縮サービスを Node.js で使う

はじめに

Google の URL 短縮サービス  goo.gl を使ってみようと思って Node.js で書いてみました。

goo.gl について

に書いてあるようにこんな感じに使えます。

$ curl https://www.googleapis.com/urlshortener/v1/url \
  -H 'Content-Type: application/json' \
  -d '{"longUrl": "http://www.google.com/"}'
{
 "kind": "urlshortener#url",
 "id": "http://goo.gl/fbsS",
 "longUrl": "http://www.google.com/"
}

url の後ろに ?key=[api key] と入力すると API call などのデータがダッシュボードで管理できるようになります。api key は https://code.google.com/apis/console/:Google APIs Console から取得できます。

コード

この取得とパース部分を書くとこんな感じになります。

var https = require('https');

var req = https.request({
	host    : 'www.googleapis.com',
	path    : '/urlshortener/v1/url',
	method  : 'POST',
	headers : {'Content-Type': 'application/json'}
}, function(res) {
	var jsonStr = '';
	res.on('data', function(chunk) {
		jsonStr += chunk.toString();
	}).on('end', function() {
		var url = JSON.parse(jsonStr).id;
		console.log(url);
	});
});
req.write('{"longUrl" : "http://d.hatena.ne.jp/hecomi/"}\n');
req.end();

API Key の利用も含めて関数化すると以下のようになります。

var https = require('https');

function shortenUrl(param, callback) {
	if ( typeof(param) == 'string') {
		param = { url: param };
	}
	var req = https.request({
		host    : 'www.googleapis.com',
		path    : '/urlshortener/v1/url' + ('apiKey' in param ? '?key=' + param.apiKey : ''),
		method  : 'POST',
		headers : {'Content-Type': 'application/json'}
	}, function(res) {
		var jsonStr = '';
		res.on('data', function(chunk) {
			jsonStr += chunk.toString();
		}).on('end', function() {
			var url = JSON.parse(jsonStr).id;
			callback(url);
		});
	});
	req.write('{"longUrl" : "' + param.url + '"}\n');
	req.end();
}

shortenUrl('http://d.hatena.ne.jp', function(url) {
	console.log(url);
});

shortenUrl({
	url    : 'http://d.hatena.ne.jp/',
	apiKey : 'XXXXXXXXXXXXXXXX',
}, function(url) {
	console.log(url);
});

と紹介しましたが、goo.gl という Node モジュールがあるので、これを利用するともっと簡単に出来ます。

$ npm install goo.gl

以下 goo.gl の test のソースコードから抜粋。

var googl = require('../lib/googl.js'),
    assert = require('assert');

googl.shorten('http://www.google.com/', function (result) {
    assert.equal(result.id, 'http://goo.gl/fbsS');
});

googl.expand('http://goo.gl/fbsS', function (result) {
    assert.equal(result.longUrl, 'http://www.google.com/');
});

googl.setKey('ABCDEFGabcdefg01234567');
assert.equal(googl.key, 'ABCDEFGabcdefg01234567');