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

(1/1)
Twitter では一度に140文字しか投稿できないため、長いURLは短縮される。この短縮処理には、bit.ly というWebサービスが使われている。
そこで今回は、PHPでbit.lyを利用し、入力したURLを短縮するプログラムを作ってみることにする。

(2021年4月29日)bit.ly API v4対応, PHP8対応

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

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

サンプル・プログラム

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)

解説:準備

  13: // 初期化処理 ================================================================
  14: define('INTERNAL_ENCODING', 'UTF-8');
  15: mb_internal_encoding(INTERNAL_ENCODING);
  16: mb_regex_encoding(INTERNAL_ENCODING);
  17: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
  18: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php06/php06-26-01.shtm');
  19: 
  20: //プログラム・タイトル
  21: define('TITLE', 'bit.lyを使ってURLを短縮する');
  22: 
  23: //リファラチェック+リリースフラグの設定
  24: if (isset($_SERVER['HTTP_HOST']) && ($_SERVER['HTTP_HOST'] == 'localhost')) {
  25:     define('FLAG_RELEASE', FALSE);
  26:     define('REFER_ON', '');
  27:     ini_set('display_errors', 1);
  28:     ini_set('error_reporting', E_ALL);
  29: else {
  30:     //リリース・フラグ(公開時にはTRUEにすること)
  31:     define('FLAG_RELEASE', TRUE);
  32:     //リファラ・チェック(直リン防止用;空文字ならチェックしない)
  33:     define('REFER_ON', 'www.pahoo.org');
  34: }
  35: 
  36: //表示幅(ピクセル)
  37: define('WIDTH', 550);
  38: 
  39: //bit.lyアクセストークン
  40: // https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#bitly 参照
  41: define('BITLY_TOKEN', '*************************************');
  42: 
  43: //URL短縮API【変更不可】
  44: define('BITLYv4_SHORTEN', 'https://api-ssl.bitly.com/v4/shorten');

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

解説:bit.ly API 呼び出し

 172: /**
 173:  * bit.ly API 呼び出し
 174:  * @param   string $url リクエストURL
 175:  * @param   array  $header HTTP HEADER変数を格納した連想配列("変数名"=>"値") 
 176:  * @param   array  $post   POST変数を格納した連想配列("変数名"=>"値") 
 177:  * @return  string 取得したコンテンツ/FALSE 取得エラー
 178: */
 179: function callBitlyAPI($url, $header, $post) {
 180:     //cURL送信
 181:     $curl = curl_init();
 182:     curl_setopt($curl, CURLOPT_URL , $url);
 183:     curl_setopt($curl, CURLOPT_HEADER, 1) ; 
 184:     curl_setopt($curl, CURLOPT_POST, TRUE);
 185:     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);   //結果を文字列で
 186:     curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post));
 187:     curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
 188:     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
 189:     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
 190:     curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
 191:     curl_setopt($curl, CURLOPT_TIMEOUT, 5);
 192:     $res1 = @curl_exec($curl);
 193:     $res2 = @curl_getinfo($curl);
 194:     curl_close($curl);
 195: 
 196:     //結果処理
 197:     if ($res1 !FALSE) {
 198:         $json = substr($res1, $res2['header_size']);
 199:     } else {
 200:         $json = FALSE;
 201:     }
 202: 
 203:     return $json;
 204: }

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

解説:URLを短縮する

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

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

参考サイト

(この項おわり)
header