Googleの短縮URL(goo.gl)のAPIが公開されたようですね。
ってことで、そのAPIを使って短縮URLを生成したりgoo.glの短縮URLを展開するPHPプログラムを書いてみました。
APIの操作は、PEARパッケージであるHTTP_Client を利用しています。
なお、APIの操作にあたっては事前にAPI Keyを取得しておく必要があります。
API Keyの取得は、こちら からログイン(アカウントが無い場合は作成)しページの最後の方にある「URL Shortener API」のActivateボタンをクリックして発行します。
goo.glの短縮URLを生成する
まずは、短縮URLの生成から。
- google-s.php
<?php
require_once 'HTTP/Client.php';
$api_key = 'Your API Key';
$url = 'https://www.googleapis.com/urlshortener/v1/url?key=' . $api_key;
// 短縮したい対象URL
$page = 'http://ameblo.jp/itboy/';
// JSONデータの生成
$data = json_encode(array('longUrl' => $page));
$client = new HTTP_Client(null);
// デフォルトのヘッダにContent-Type:application/jsonを指定
$client->setDefaultHeader('Content-Type', 'application/json');
$client->post($url, $data, TRUE);
$response = $client->currentResponse();
// JSONデータを連想配列に展開
$json = json_decode($response['body'], TRUE);
var_dump($json);
URLを短縮したい場合は、APIキーとあわせてJSON形式でURL情報を渡してあげる必要があります。
返り値となる短縮されたURL情報もJSON形式となっています。
また、ヘッダでContent-Typeに「application/json」を指定してあげる必要があります(詳細は後述)。
- 実行結果
array(3) {
["kind"]=>
string(16) "urlshortener#url"
["id"]=>
string(19) "http://goo.gl/6vYtT"
["longUrl"]=>
string(23) "http://ameblo.jp/itboy/"
}
JSON形式のデータの生成と展開は、JSONデータの生成をjson_encode 関数で、JSONデータをPHPの連想配列に戻したい場合はjson_decode 関数があるので、PHPの場合は非常に楽ですけどね。
ただし、上記の関数はPHP5.2以上からしか利用できないため、それ以下の場合はPECLからインストールする必要があります。
goo.glの短縮URLを展開する
お次は、短縮されたgoo.glのURLを元のURLに戻す方法です。
- googl-e.php
<?php require_once 'HTTP/Client.php'; $api_key = 'Your API Key'; // 短縮URL $short_url = 'http://goo.gl/fbsS'; $page = 'https://www.googleapis.com/urlshortener/v1/url?shortUrl=' . $short_url . '&key=' . $api_key; $client = new HTTP_Client(null); $client->get($page); $response = $client->currentResponse(); // JSONデータを連想配列に展開 $json = json_decode($response['body'], TRUE); var_dump($json);
短縮URLの展開方法は、短縮URLの生成よりもシンプルですね。
単純にAPI Keyと一緒にgoo.glで短縮されたURLを引数に渡してあげるだけで元のURLを取得することができます。
- 実行結果
array(4) {
["kind"]=>
string(16) "urlshortener#url"
["id"]=>
string(18) "http://goo.gl/fbsS"
["longUrl"]=>
string(22) "http://www.google.com/"
["status"]=>
string(2) "OK"
}
その他、詳細な仕様はマニュアル も参照してみてください。
おまけ
今回の、goo.glのAPIを使う際にはまったことのメモ。
・ Content-Typeにapplication/jsonを指定
HTTP_Clientではデフォルトで、フォームからデータをPOSTする際の「application/x-www-form-urlencoded」のContent-Typeが使用されますが、これではgoo.glのAPI側がデータを受け取ってくれません。
Unsupported content with type: application/x-www-form-urlencoded
というエラーが返ってきます。
ということで、setDefaultHeaderメソッドを使ってContent-Typeにapplication/jsonを指定する必要があります。
・ HTTP_Clientのpostメソッドの第3引数にTRUE(URLエンコード済み)を指定
HTTP_Clientの第3引数は、送信するデータがすでにURLエンコード済みであるかどうかを指定(デフォルトはFALSEなのでPOSTする際にURLエンコードされる)するオプションですが、これがFALSE(デフォルト)の場合、goo.gl API側でうまくURLデータを受け取ってくれません。
string(232) "{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Required",
"locationType": "parameter",
"location": "resource.longUrl"
}
],
"code": 400,
"message": "Required"
}
}
というようにURLデータを送っているのにURL情報を遅れというエラーメッセージが返ってきてしまいます。
これに気づくまでにだいぶはまった・・・。
[PR]
[PR]

