Bitly API v4で短縮URLを展開、クリック数を取得する方法

bit.ly API v3が終了してしまったので、bit.ly API v4に移行しようと使い方を調べたものの情報があまりないので、メモがてら置いておきます。

bitlyのダッシュボードがとんでもなく見辛いので見やすくするために書きました。
（棒グラフにマウスオーバーしないと数字がわからないって本当にどうかと思う）

ここでは、短縮URLの展開（元のURLに戻す）と、短縮URLがクリックされた数を取得する方法を記載しています。
APIを使用して、短縮URLを取得する方法は、以下のサイトを参考にしてください。

》[短縮URL生成サイト「bit.ly」のAPIv4へのマイグレーションの方法](https://another.rocomotion.net/15831289905945.html)

# bit.ly API を使い始める前に
bit.ly APIを使用するには、アクセストークンが必要になります。
アカウントを取得→アクセストークンを取得しておいてください。

アクセストークンを取得する方法は、以下のサイトがわかりやすいと思います。
》[bitlyのAPIアクセストークンを取得できない？パスワード入力の場所が変わってた](https://mahoro7.net/bitly-api-accesstoken-9465)

# bit.ly APIで短縮URLを展開する

```index.php
function LinkExpand($url, $token){
	$baseurl = 'https://api-ssl.bitly.com/v4/expand';
	if(strpos($url,'https') !== false){
		$url = substr($url, 8);
	}else{
		$url = substr($url, 7);
	}
	$ch = curl_init($baseurl);
	curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['bitlink_id' => $url]));
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_HTTPHEADER, [
		"Authorization: Bearer ". $token,
		"Content-Type: application/json",
		"Host: api-ssl.bitly.com",
		"Accept: application/json"
	]);
	$results = json_decode(curl_exec($ch));
	$link = $results->long_url;
	echo $link;
}
```
`$url`に短縮URL、`$token`にアクセストークンを入れて叩きます。

`bitlink_id`は、短縮URLから`https://`を削除したものみたいです。

# bit.ly API でクリック数を取得する

```index.php
function LinkAnalysis($url, $token){
	date_default_timezone_set("Asia/Tokyo");
	if(strpos($url,'https') !== false){
		$url = substr($url, 8);
	}else{
		$url = substr($url, 7);
	}
	$api = 'https://api-ssl.bitly.com/v4/bitlinks/'.$url.'/clicks';
	$ch = curl_init($api);
	curl_setopt($ch, CURLOPT_GETFIELDS, json_encode(['unit'=>'day','units'=>-1]));
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_HTTPHEADER, [
		"Authorization: Bearer ".$token,
		"Content-Type: application/json"
	]);

	$obj = json_decode(curl_exec($ch), true);
	if(!$obj){
		echo 'データを取得できませんでした';
	}else{
		$revData = array_reverse($obj['link_clicks']);
		$allNum = 0;
		echo '<table><tr>';
		foreach ($revData as $result){
			$getDate = $result['date'];
			$getDate = date('m/d', strtotime($getDate));
			echo '<th>'.$getDate.'</th>';
		}
		echo '</tr><tr>';
		foreach ($revData as $result){
			$getClick = $result['clicks'];
			echo '<td>'.$getClick.'</td>';
			$allNum += $getClick;
		}
		echo '</tr></table>';
		echo '<p>合計：'.$allNum.'</p>';
	}
}
```
`$url`に短縮URL、`$token`にアクセストークンを入れて叩きます。

↓みたいな表組みで表示されるようにしてます。
<img width="423" alt="スクリーンショット 2020-05-18 12.19.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592738/9d7c842f-9a30-e388-2910-3f95e0bae381.png">

`'unit'=>'day'`で取得データの形式を指定できます。
day（日別）の他、`"minute"`、`"hour"`、`"day"`、`"week"`、`"month"`が指定できます。

`'units'=>-1`で取得数を指定できます。`-1`で全てのデータを取得します。
30日分しか取得できないので、`'unit'=>'day'`の場合は`-1`でいいと思います。

途中で`array_reverse`してますが、そのままだと配列の順番が「現在→過去」になっているので、「過去→現在」に直しているだけです。

そのほかの指定はAPIドキュメントをみてください。
》[Bitly API V4 - Get Clicks for a Bitlink](https://dev.bitly.com/v4/#operation/getClicksForBitlink)

#bit.ly API v3 との違い
実は、v3ではフリーアカウントでも古いURLの30日以上前のカウント数が取れたのですが、v4が稼働してからは取れなくなりました。
API叩けば有料と同等の数が取れちゃうのどうなのかなって思ってたので、予想はしてましたけど。

[Pricing](https://bitly.com/pages/pricing)を見る限り、CUSTOMIZEDじゃないとあんまり旨味はないですね。
FreeもBasicも、Link Reporting が30dayになっています。なので、APIで取得できる日数も30dayまでに制限がされています。

Basicで60dayとかにしたらユーザー増えそうなのになぁ。