サンプル・プログラムの実行例
サンプル・プログラム
expandURL.php | サンプル・プログラム本体。 |
解説:復元処理
124: /**
125: * 短縮URLを復元する
126: * @param string $short 短縮URL
127: * @return string 元のURL/FALSE:未対応サービス,復元に失敗
128: */
129: function expandURL($short) {
130: global $Services;
131:
132: //対応サービスかどうか調べる
133: $arr = parse_url($short);
134: if (! in_array($arr['host'], $Services)) return FALSE;
135:
136: //短縮URLをソケット通信で呼び出す
137: $request = "GET {$arr['path']} HTTP/1.1\r\n";
138: $request .= "Host: {$arr['host']}\r\n";
139: $request .= "User-Agent: PHP/" . phpversion() . "\r\n\r\n";
140: $fp = fsockopen($arr['host'], 80);
141: if (! $fp) return FALSE;
142: fputs($fp, $request);
143:
144: //レスポンス解析
145: while (! feof($fp)) {
146: $res = fgets($fp);
147: //復元URL検出
148: if (preg_match('/^Location: (.*)$/i', $res, $arr) > 0) {
149: return $arr[1];
150: }
151: }
152: fclose($fp);
153:
154: return FALSE;
155: }
bit.ly や TinyURL.com は、短縮URLを受け取ると Location ヘッダで元のURLへリダイレクトするようになっている。そこで、httpヘッダをトラップし、このLocationヘッダをつかまえてやればよい。
PHPでは、関数 fsockopen を使うことで通信中のhttpヘッダをトラップすることができる。
Locationヘッダをつかまえるには、正規表現関数 preg_match を利用した。
対応している短縮URLサービスのドメインは、グローバル変数 $Services に定義した。
こうしてできたユーザー関数 expandURL は、短縮URLを受け取り、復元したURLを返す。
ただし、グローバル変数 $Services に無いドメインならFALSEを返すようにしている。
参考サイト
- bit.ly
- TinyURL.com
- PHPでbit.lyを使ってURLを短縮する:ぱふぅ家のホームページ
一方で、短縮したURLを元のURLに戻したいニーズもあるようだ。そこで今回は、ly.bit と tinyurl.com を対象に、短縮URLを元に戻すスクリプトを作ってみることにする。
(2021年5月3日)PHP8対応,リファラチェック追加