Firebase Dynamic Linksで作る！URL短縮サービス

#１）はじめに
Googleの短縮URLサービス「[Google URL Shortener](https://goo.gl/)」が2019年3月30日で終了する（Googleにログインしていないと既に使えない）ということで、[Googleの記事](https://developers.googleblog.com/2018/03/transitioning-google-url-shortener.html)によると
> To create new short links, we recommend FDL APIs. 

「Firebase Dynamic Links（FDL）をオススメするから使ってね」とのこと。

##Dynamic Linksとは？
スマホアプリの特定のページヘ直接遷移できる、「ディープリンク」を発行可能なFirebaseのプロダクトの一つ。
一つのURLで、AndroidやiPhone、デスクトップからアクセスされた場合の、それぞれの振る舞いをコントロールすることが可能で、

- アプリが既にインストール済ならアプリ内の特定ページへ遷移
- アプリが入ってなければアプリの入手ページへ遷移
- デスクトップであればサービスのページへ遷移

といった分岐が可能です。
また、「Dynamic Links」は、規模にかかわらず、ずっと無料で使うことが可能のようです。めっちゃ太っ腹ですね！

本来はFirebaseはmBaaS（mobile Backend as a Service）であり、アプリ制作時にSDKを用いてアプリ内から動的にURLを作成するのですが、今回は（贅沢に？）Webでの遷移のみを考え、短縮URLとして利用することに焦点を当てています。

#２）Dynamic Linksを設定する
次にFirebase consoleに入り、「Dynamic Links」をメニューから選び、下記の画面で「始める」をクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/30273cc9-3181-1250-a9b2-a3106abb445f.png" width="500px">
使いたいサブドメインを決めましょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/13ffec55-f8f3-73d9-0ce7-220f6d0f4614.png" width="500px">
ここでは社内で使いたいので、「andus」としました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/4416a8e5-d7b7-c91a-0e93-a0af5b5a160f.png" width="500px">
ちなみに、一回消したドメインを再度付け直そうとすると、リリース中となって1ヶ月使えない状態になりました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/b83a6231-5fb2-937f-fb4e-9bf5718823f0.png" width="500px">
また、汎用性が高すぎる「cat」などの名称の場合、下記のような画面になりました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/916db987-140f-20b6-a788-e0a012a44e7b.png" width="500px">
設定が終わるとこのようになりました。「新しいダイナミック リンク」を押して、新規に作ってみましょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/fdc989c0-fdbc-9efb-cca2-f27c891fe348.png" width="500px">
「次へ」を押します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/205571f7-cafd-e477-71e8-8966ad29f426.png" width="500px">
適当にYahoo!ニュースの記事URLでも貼ってみます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/09b9b33c-5cde-24eb-4db4-31f3a765124d.png" width="500px">
iPhoneでもAndroidでも、リンクを開ければ良いので、そのまま作成します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/8703d6e0-ded3-86b6-0422-579807028f75.png" width="500px">
出来ました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/a52e4653-3a5f-84dc-0c11-da94a0cf7ad3.png" width="500px">
ちなみに、出来たリンクに「?d=1」パラメータを付けてアクセスするとフローチャートが生成されます。
アプリのインストール状況などで分岐があると、複雑なツリーになってくるイメージです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/64fbe353-e42d-73db-0018-b9f620d45c3a.png" width="500px">
実際にデスクトップやスマホからURLにアクセスして、**1日ほど経つと**クリック数がグラフに出てくるのが確認できます（即時反映と勘違いして焦りました…:ghost:）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/a5aeadba-d559-918f-bad1-d0d563675f80.png)
なるほど、短縮URLを管理画面から作成出来るのは分かりました。
でも、これをひたすらやるのは骨の折れる作業です…。何かいい方法は無いのでしょうか？

#３）REST APIを使ってPHPからリンクを作成する
REST APIが用意されていますので、こちらを使ってプログラムからリンク作成出来るようにしてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/5b1fff76-fd85-9eaa-eed4-d084d795d29d.png)
Firebase consoleのギアマークをクリック、「プロジェクトの設定」を選択、「ウェブ API キー」をコピーします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/95865/fbf5a262-8259-9353-8f78-632ed1b5a455.png" width="500px">

```php
// 短縮したいURL
$longlink = '●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●';

// 送るメッセージ
$recbody = '{
	"longDynamicLink": "https://●●●●●.page.link/?link='.$longlink.'",
	"suffix": {
		"option": "SHORT"
	}
}';

// リクエスト先URL
$url = 'https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=<YOUR-API-KEY>';

// cURL
$ch = curl_init();

curl_setopt_array($ch, array(
	CURLOPT_URL => $url,
	CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
	CURLOPT_RETURNTRANSFER => true,
	CURLOPT_POSTFIELDS => $recbody
));

$res = curl_exec($ch);

curl_close($ch);
```
&lt;YOUR-API-KEY&gt;には先ほどコピーした「ウェブ API キー」が入ります。
「suffix」パラメータを「SHORT」にすると最短4文字まで短縮、何も指定しないか「UNGUESSABLE」を指定で17文字となります。
上記で返ってくるJSONを整形すると下記のようになります。簡単ですね。

```json
{
	"shortLink": "https://●●●●●.page.link/●●●●",
	"previewLink": "https://●●●●●.page.link/●●●●?d=1"
}
```

ですが、実はREST APIで作成したリンクは、Firebase コンソールに表示されません。

> API やクライアント（Android / iOS）SDK で作成された短いダイナミック リンクは、Firebase コンソールに表示されません。このようなダイナミック リンクは、ユーザー間の共有に使用するためのものです。マーケティングのユースケースの場合は、引き続き Firebase コンソールの [Dynamic Links] ページからリンクを直接作成してください。

> [ダイナミック リンクを作成する  |  Firebase]
(https://firebase.google.com/docs/dynamic-links/rest?hl=ja)

クリック数が見れないなんて不便ですね！
ですが、「Firebase Dynamic Links Analytics API」を使えばコンソール以上の情報が取得出来るようです。
[Dynamic Links アナリティクス データを表示する  |  Firebase]
(https://firebase.google.com/docs/dynamic-links/analytics?hl=ja#rest_api)

#４）Dynamic Links Analytics APIを使ってクリック数を取得する
Firebase consoleのギアマークをクリック、「プロジェクトの設定」を選択、「サービス アカウント」をクリック。「新しい秘密鍵の作成」を押します。サービスア カウント JSONファイルがダウンロードされるので、適切な場所に配置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95865/7a0f1b13-938e-682b-71f9-f6f9cc0d2964.png)
[Google APIs Client Library for PHP](https://github.com/googleapis/google-api-php-client)をダウンロードし、適切な場所に設置します。ファイル数も多くサイズも約20MBと大きいので注意。また、PHPのバージョン要件は5.4.0以上です。

```php
// Google APIs Client Library for PHPをインクルード
require_once 'google-api-php-client-2.2.2/vendor/autoload.php';

// サービスアカウントJSONファイルキーへのパス
$keyfile = 'path/to/serviceAccountKey.json';

// ショートリンク
$shortlink = 'https://●●●●●.page.link/●●●●';

// 初期化
$client = new Google_Client();

// スコープの設定
$client->addScope(Google_Service_FirebaseDynamicLinks::FIREBASE);

// 認証する
$client->setAuthConfig($keyfile);

$client->fetchAccessTokenWithAssertion();

// HTTPヘッダの指定
$headers = array(
	'Content-Type: application/json',
	'Authorization: Bearer '.$client->getAccessToken()['access_token']
);

$url = 'https://firebasedynamiclinks.googleapis.com/v1/'.urlencode($shortlink).'/linkStats?durationDays=7';

// cURL
$ch = curl_init();

curl_setopt_array($ch, array(
	CURLOPT_URL => $url,
	CURLOPT_HTTPHEADER => $headers,
	CURLOPT_RETURNTRANSFER => true
));

$res = curl_exec($ch);

curl_close($ch);
```

上記で返ってくるJSONを整形すると下記のようになります。
※ 「REDIRECT」のイベントを除外しています。

```json
{
	"linkEventStats": [
		{
			"count": "2",
			"event": "CLICK",
			"platform": "ANDROID"
		},
		{
			"count": "3",
			"event": "CLICK",
			"platform": "OTHER"
		},
		{
			"count": "2",
			"event": "CLICK",
			"platform": "IOS"
		}
	]
}
```

#あとがき
##短縮URLとしてどうか？
ここまでやっておきながら、https://●●●.page.link/●●●●ってあんまり短く無いよなあと感じました…。最小でサブドメインが3文字です。これなら自分が持っているドメインによっては.htaccessでも置いてリダイレクトした方がまだ短いURLが出来そうですwあるいは「Bitly」や「Ow.ly」などの既存サービスを使うかですねw

まあ、https://●●●●●.page.link/の形式で好きなサブドメインを使えることで、ブランディングにひと役買うのかも知れませんね。
そもそも、ディープリンクのためのサービスですので「Dynamic Links」のメリットを活かせてはいない使い方ですね。今なら割とビッグワード？も取れますよ〜。

##クリック数について
短縮URLのみを使うだけなら、ここまで無理して取得しなくても、Googleアナリティクスの解析パラメータでも付ければ済みそうですね。
しかしアプリをお持ちでダイナミックリンクとして使う場合は、「Dynamic Links Analytics API」でアプリのインストールや初回起動などの数も取得できるので、有益だと思われます。

#参考リンク
- [Google Developers Japan: Firebase Dynamic Links の紹介]
(https://developers-jp.googleblog.com/2016/06/firebase-dynamic-links.html)
- [Firebase Dynamic Links | 潜在的ユーザーをアプリ内の適切な場所にディープリンク  |  Firebase]
(https://firebase.google.com/products/dynamic-links/?hl=ja)
- [ダイナミック リンクを作成する  |  Firebase]
(https://firebase.google.com/docs/dynamic-links/rest)
- [Firebase Dynamic Links Short Links API Reference  |  Firebase]
(https://firebase.google.com/docs/reference/dynamic-links/link-shortener)
- [Firebase Dynamic Links Analytics API  |  Firebase]
(https://firebase.google.com/docs/reference/dynamic-links/analytics?authuser=0)
- [Firebase DynamicLinks の イベント数を計測する ｜ DevelopersIO]
(https://dev.classmethod.jp/cloud/firebase-dynamiclinks-event-analytics/)