PHPでbit.lyを使ってURLを短縮する

(1/1)
ブログなどで長いURLを掲載すると読みにくくなる。そこで、URLを短縮化するサービスが登場した。
今回は、PHPで bit.lyを利用し、入力したURLを短縮するプログラムを作ってみることにする。

(2024年10月9日)pahooInputData.php 導入

サンプル・プログラムの実行例

PHPでly.bitを使ってURLを短縮する
このスクリプトを実行すると、上図のような画面が現れる。
使い方は、URL欄にURLを入力し、[短縮]ボタンを押下するだけというシンプルなものだ。

目次

サンプル・プログラム

圧縮ファイルの内容
shortURL.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
shortURL.php 更新履歴
バージョン 更新日 内容
2.1.0 2021/04/29 pahooInputData.php 導入
2.0 2021/04/29 bit.ly API v4対応, PHP8対応
1.1 2017/04/08 PHP7 対応
1.0 2010/01/04 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
1.7.0 2024/10/09 validURL() validEmail() 追加
1.6.0 2024/10/07 isButton() -- buttonタグに対応
1.5.0 2024/01/28 exitIfExceedVersion() 追加
1.4.2 2024/01/28 exitIfLessVersion() メッセージ修正
1.4.1 2023/09/30 コメントの訂正

bit.ly 利用準備

bit.ly APIを利用するには、事前にアカウント登録を行い、アクセストークンを入手する必要がある。その手順は「各種WebAPIの登録方法 - bit.ly」をご覧いただきたい。

bit.ly によるURL短縮

bit.ly にはいくつかのAPIが用意されている。今回は、URL短縮を行うshortenコマンドを使う。
入力パラメータ(IN)をPOST(JSON形式)で渡し、出力結果(OUT)はJSONで戻るというAPIである。今回はXMLで戻るようにする。
WebAPI
URL
https://api-ssl.bitly.com/v4/shorten
入力パラメータ
フィールド名 要否 内  容
long_url 必須 短縮したいURL
domain ドメイン bit.ly固定
応答データ構造(json) created_at 作成日時 id ID link 短縮URL long_url 短縮したいURL references group GUID(URL)

解説:定数など

shortURL.php

  27: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php06/php06-26-01.shtm');
  28: 
  29: //プログラム・タイトル
  30: define('TITLE', 'bit.lyを使ってURLを短縮する');
  31: 
  32: //データ入力に関わる関数群:include_pathに配置すること
  33: require_once('pahooInputData.php');
  34: 
  35: //PHPバージョン・チェック
  36: exitIfLessVersion(MINUMUM_VERSION);

shortURL.php

  55: //表示幅(ピクセル)
  56: define('WIDTH', 600);
  57: 
  58: //URLの初期値
  59: define('DEF_URL', 'https://www.pahoo.org/');
  60: 
  61: //bit.lyアクセストークン
  62: // https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#bitly 参照
  63: define('BITLY_TOKEN', '54383f0a964eed7c41269220951598afd8b82aa7');
  64: 
  65: //URL短縮API【変更不可】
  66: define('BITLYv4_SHORTEN', 'https://api-ssl.bitly.com/v4/shorten');

取得したアクセストークンは定数 BITLY_TOKEN に代入する。
【変更不可】以外の部分は適宜変更することができる。

解説:URLバリデーション

pahooInputData.php

 416: /**
 417:  * URLバリデーションを行う.
 418:  * RFC 1738 Uniform Resource Locators にマッチするかどうかを照合する。
 419:  * @参考URL https://www.pahoo.org/e-soul/webtech/php05/php05-02-01.shtm
 420:  * @param   string $url    url(http(s)を含む)
 421:  * @param   string $errmsg エラーメッセージを格納する
 422:  * @return  bool TRUE:成功/FALSE:失敗
 423: */
 424: function validURL($url, &$errmsg) {
 425:     $patterns[] = '/^https?\:\/\/[\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]+$/i';
 426:     $errmsg = '';
 427: 
 428:     $res = validString($url, $errmsg, 1, 9999, TRUE, $patterns);
 429:     if ($errmsg == '受容できない文字が含まれています') {
 430:         $errmsg = 'URLではありません';
 431:     }
 432: 
 433:     return $res;
 434: }

入力したURLが正しいか(規格に則ったものか)を判定するのに、"pahooInputData.php" にある関数 validURL を用いる。この関数は、同じ "pahooInputData.php" にある関数 validString を利用している。詳しくは「PHPセキュリティ対策:文字列入力とバリデーション」をご覧いただきたい。

解説:bit.ly API 呼び出し

shortURL.php

 148: /**
 149:  * bit.ly API 呼び出し
 150:  * @param   string $url リクエストURL
 151:  * @param   array  $header HTTP HEADER変数を格納した連想配列("変数名"=>"値") 
 152:  * @param   array  $post   POST変数を格納した連想配列("変数名"=>"値") 
 153:  * @return  string 取得したコンテンツ/FALSE 取得エラー
 154: */
 155: function callBitlyAPI($url, $header, $post) {
 156:     //cURL送信
 157:     $curl = curl_init();
 158:     curl_setopt($curl, CURLOPT_URL , $url);
 159:     curl_setopt($curl, CURLOPT_HEADER, 1) ; 
 160:     curl_setopt($curl, CURLOPT_POST, TRUE);
 161:     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);   //結果を文字列で
 162:     curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post));
 163:     curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
 164:     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
 165:     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
 166:     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
 167:     curl_setopt($curl, CURLOPT_TIMEOUT, 5);
 168:     $res1 = @curl_exec($curl);
 169:     $res2 = @curl_getinfo($curl);
 170:     curl_close($curl);
 171: 
 172:     //結果処理
 173:     if ($res1 !FALSE) {
 174:         $json = substr($res1, $res2['header_size']);
 175:     } else {
 176:         $json = FALSE;
 177:     }
 178: 
 179:     return $json;
 180: }

bit.ly API の呼び出しは独特なので、ユーザー関数 callBitlyAPI を用意した。
入力パラメータはJSON形式に変換してからPOST渡しする必要がある。配列引数を使って渡す。
また、HTTP HEADER として、アクセストークンContent-Typeを指定してやる必要がある。こちらも配列引数で指定するようにした。

解説:URLを短縮する

shortURL.php

 182: /**
 183:  * URLを短縮する
 184:  * @param   string $url    短縮したいURL
 185:  * @param   string $token  アクセストークン
 186:  * @param   string $errmsg エラーメッセージ格納用
 187:  * @return  string 短縮URL
 188: */
 189: function bitlyShortenURL($url, $token, &$errmsg) {
 190:     $api = BITLYv4_SHORTEN;
 191:     $post = array(
 192:         'long_url' => $url,
 193:         'domain'   => 'bit.ly'
 194:     );
 195:     $header = array(
 196:         'Authorization: Bearer ' . $token,
 197:         'Content-Type: application/json'
 198:     );
 199: 
 200:     //URL短縮
 201:     $json = @callBitlyAPI(BITLYv4_SHORTEN, $header, $post);
 202:     $items = json_decode($json);
 203:     //エラーチェック
 204:     if ($items == FALSE) {
 205:         $errmsg = 'bit.ly APIを利用できません';
 206:         return FALSE;
 207:     } else if (isset($items->link)) {
 208:         $res = (string)$items->link;
 209:     } else {
 210:         $errmsg = 'bit.ly API -- GUIDを取得できません';
 211:         return FALSE;
 212:     }
 213: 
 214:     return $res;
 215: }

URLを短縮するユーザー関数が bitlyShortenURL である。
ユーザー関数 callBitlyAPI の戻り値を  json_decode  で展開し、エラーチェックしたのち、短縮URLを戻す。

参考サイト

(この項おわり)
header