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)

解説:準備

0013: // 初期化処理 ================================================================
0014: define('INTERNAL_ENCODING', 'UTF-8');
0015: mb_internal_encoding(INTERNAL_ENCODING);
0016: mb_regex_encoding(INTERNAL_ENCODING);
0017: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
0018: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php06/php06-26-01.shtm');
0019: 
0020: //プログラム・タイトル
0021: define('TITLE', 'bit.lyを使ってURLを短縮する');
0022: 
0023: //リファラチェック+リリースフラグの設定
0024: if (isset($_SERVER['HTTP_HOST']) && ($_SERVER['HTTP_HOST'] == 'localhost')) {
0025:     define('FLAG_RELEASE', FALSE);
0026:     define('REFER_ON', '');
0027:     ini_set('display_errors', 1);
0028:     ini_set('error_reporting', E_ALL);
0029: else {
0030:     //リリース・フラグ(公開時にはTRUEにすること)
0031:     define('FLAG_RELEASE', TRUE);
0032:     //リファラ・チェック(直リン防止用;空文字ならチェックしない)
0033:     define('REFER_ON', 'www.pahoo.org');
0034: }
0035: 
0036: //表示幅(ピクセル)
0037: define('WIDTH', 550);
0038: 
0039: //bit.lyアクセストークン
0040: // https://www.pahoo.org/e-soul/webtech/php06/php06-01-02.shtm#bitly参照
0041: define('BITLY_TOKEN', '*************************************');
0042: 
0043: //URL短縮API【変更不可】
0044: define('BITLYv4_SHORTEN', 'https://api-ssl.bitly.com/v4/shorten');

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

解説:bit.ly API 呼び出し

0172: /**
0173:  * bit.ly API呼び出し
0174:  * @param string $urlリクエストURL
0175:  * @param array  $header HTTP HEADER変数を格納した連想配列("変数名"=>"値") 
0176:  * @param array  $post   POST変数を格納した連想配列("変数名"=>"値") 
0177:  * @return string取得したコンテンツ/FALSE取得エラー
0178: */
0179: function callBitlyAPI($url$header$post) {
0180:     //cURL送信
0181:     $curl = curl_init();
0182:     curl_setopt($curlCURLOPT_URL , $url);
0183:     curl_setopt($curlCURLOPT_HEADER, 1) ; 
0184:     curl_setopt($curlCURLOPT_POSTTRUE);
0185:     curl_setopt($curlCURLOPT_RETURNTRANSFERTRUE);    //結果を文字列で
0186:     curl_setopt($curlCURLOPT_POSTFIELDSjson_encode($post));
0187:     curl_setopt($curlCURLOPT_HTTPHEADER$header);
0188:     curl_setopt($curlCURLOPT_SSL_VERIFYPEERFALSE);
0189:     curl_setopt($curlCURLOPT_SSL_VERIFYHOSTFALSE);
0190:     curl_setopt($curlCURLOPT_RETURNTRANSFERTRUE);
0191:     curl_setopt($curlCURLOPT_TIMEOUT, 5);
0192:     $res1 = @curl_exec($curl);
0193:     $res2 = @curl_getinfo($curl);
0194:     curl_close($curl);
0195: 
0196:     //結果処理
0197:     if ($res1 != FALSE) {
0198:         $json = substr($res1$res2['header_size']);
0199:     } else {
0200:         $json = FALSE;
0201:     }
0202: 
0203:     return $json;
0204: }

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

解説:URLを短縮する

0206: /**
0207:  * URLを短縮する
0208:  * @param string $url    短縮したいURL
0209:  * @param string $token  アクセストークン
0210:  * @param string $errmsgエラーメッセージ格納用
0211:  * @return string 短縮URL
0212: */
0213: function bitlyShortenURL($url$token, &$errmsg) {
0214:     $api = BITLYv4_SHORTEN;
0215:     $post = array(
0216:         'long_url' => $url,
0217:         'domain'   => 'bit.ly'
0218:     );
0219:     $header = array(
0220:         'Authorization: Bearer ' . $token,
0221:         'Content-Type: application/json'
0222:     );
0223: 
0224:     //URL短縮
0225:     $json = @callBitlyAPI(BITLYv4_SHORTEN$header$post);
0226:     $items = json_decode($json);
0227:     //エラーチェック
0228:     if ($items == FALSE) {
0229:         $errmsg = 'bit.ly APIを利用できません';
0230:         return FALSE;
0231:     } else if (isset($items->link)) {
0232:         $res = (string)$items->link;
0233:     } else {
0234:         $errmsg = 'bit.ly API -- GUIDを取得できません';
0235:         return FALSE;
0236:     }
0237: 
0238:     return $res;
0239: }

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

参考サイト

(この項おわり)
header