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

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

(2026年1月11日)PHP8.5対応:curl_closeを使わない
(2024年10月9日)pahooInputData.php 導入

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

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

目次

サンプル・プログラム

圧縮ファイルの内容
shortURL.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
shortURL.php 更新履歴
バージョン 更新日 内容
2.3.0 2026/01/11 PHP8.5対応:curl_closeを使わない
2.2.0 2025/08/13 .pahooEnv 導入
2.1.0 2021/04/29 pahooInputData.php 導入
2.0 2021/04/29 bit.ly API v4対応, PHP8対応
1.1 2017/04/08 PHP7 対応
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

bit.ly 利用準備

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

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

  55: // 各種定数(START) ===========================================================
  56: 
  57: // 表示幅(ピクセル)
  58: define('WIDTH', 600);
  59: 
  60: // URLの初期値
  61: define('DEF_URL', 'https://www.pahoo.org/');
  62: 
  63: // bit.lyアクセストークン
  64: // https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#bitly
  65: // .pahooEnv ファイルもしくは下記定数に直接記入する.
  66: if (isset($_ENV['PAHOO_BITLY_TOKEN'])) {
  67:     define('BITLY_TOKEN', $_ENV['PAHOO_BITLY_TOKEN']);
  68: else {
  69:     define('BITLY_TOKEN', '');
  70: }
  71: 
  72: // URL短縮API【変更不可】
  73: define('BITLYv4_SHORTEN', 'https://api-ssl.bitly.com/v4/shorten');
  74: 
  75: // 各種定数(END) =============================================================

【変更不可】以外の部分は適宜変更することができる。

解説:URLバリデーション

pahooInputData.php

 471: /**
 472:  * URLバリデーションを行う.
 473:  * RFC 1738 Uniform Resource Locators にマッチするかどうかを照合する。
 474:  * @参考URL https://www.pahoo.org/e-soul/webtech/php05/php05-02-01.shtm
 475:  * @param   string $url    url(http(s)を含む)
 476:  * @param   string $errmsg エラーメッセージを格納する
 477:  * @return  bool TRUE:成功/FALSE:失敗
 478: */
 479: function validURL($url, &$errmsg) {
 480:     $patterns[] = '/^https?\:\/\/[\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]+$/i';
 481:     $errmsg = '';
 482: 
 483:     $res = validString($url, $errmsg, 1, 9999, TRUE, $patterns);
 484:     if ($errmsg == '受容できない文字が含まれています') {
 485:         $errmsg = 'URLではありません';
 486:     }
 487: 
 488:     return $res;
 489: }

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

解説:bit.ly API 呼び出し

shortURL.php

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

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

解説:URLを短縮する

shortURL.php

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

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

参考サイト

(この項おわり)
header