FirebaseとPostmanを使って短縮URLを複数取得する方法

#はじめに
短縮URLサービスは、一般的に1つのURLの短縮を想定されていることが多い。
（例）https://bitly.com

今回、パラメータが異なる複数のURLを短縮したいと思ったが、そういうサービスはぱっと探した感じなかったので、[Firebase](https://firebase.google.com/)と[Postman](https://www.postman.com/)を使って実現した。

#動機
GoogleFormでアンケートに回答してもらう際、あらかじめ[回答を事前に入力できる機能](https://support.google.com/a/users/answer/9308781?hl=ja)がある。
（例）https://docs.google.com/forms/d/e/1FAIpQLSdVnE7pHvFJ6-9Y5XZDy8Yz6MdBFEkj9QTR_qwNuDnSTNaQXw/viewform?usp=pp_url&entry.1563907928=1
上のURL中、`entry.1563907928=1`で回答値を設定している。`entry.1563907928`は設問項目名、`1`の値を変えることで事前入力値を設定できる。

目的としては、上記機能を使って、異なる事前入力値を持つ複数のURLを発行することだが、だいぶ長いので短縮したいなと思ったのがきっかけ。

#Firebaseとは

少し前まで「Google URL Shortener」があったがサービス終了し、今は[Firebase](https://firebase.google.com/)のDynamic Linksで発行できる。
[独自ドメインでの発行](https://firebase.google.com/docs/dynamic-links/custom-domains?hl=ja)もできることから、今回はFirebaseを使う。
Firebaseの詳細は[別記事](https://qiita.com/kohashi/items/43ea22f61ade45972881)を参照。

**本記事では短縮URL発行だけが目的なので、プロジェクトだけ作成すればOK。**
> 参考：[[Firebase] プロジェクトを新規に作成する](https://blog.katsubemakito.net/firebase/firebase-make-newproject)

#Firebaseを使った短縮URL発行 (REST API経由)
Dynamic Linksでリンクを発行する方法は[４つある](https://firebase.google.com/docs/dynamic-links/create-links?hl=ja)。

1. Firebase コンソールを使用
2. iOS と Android で Dynamic Link Builder API を使用
3. REST API を使用
4. 手動

> 引用：https://firebase.google.com/docs/dynamic-links/create-links?hl=ja

1のFirebase コンソールにはそのような機能はなく、2だと別途アプリ開発環境が必要なので、今回は`3.REST API`でリンクを発行する。

REST APIで短縮URLを発行する方法は、すでにGoogleがまとめているので下記記事を参照。
> [(Google)REST API を使用したダイナミック リンクの作成](https://firebase.google.com/docs/dynamic-links/rest?hl=ja)

**上記記事に沿って、[始める前に](https://firebase.google.com/docs/dynamic-links/rest?hl=ja#before_you_begin)の１，２，３を実行。**

これでFirebase側の設定は完了。


#Postmanのインストール

PostmanはRESTサービスの一つ。自動化しやすいのが特徴とのこと。詳しくは[こちら](https://www.xlsoft.com/jp/blog/blog/2017/06/23/post-1638/)。
**ネイティブアプリが必要なので下記からインストール。**
[Postman](https://www.postman.com)

#Postmanを使って複数の短縮URLを発行

Firebase側のREST APIをたたく。
サンプルコードは↓。

```
POST https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=api_key
Content-Type: application/json

{
  "dynamicLinkInfo": {
    "domainUriPrefix": "https://example.page.link",
    "link": "https://www.example.com/",
    "androidInfo": {
      "androidPackageName": "com.example.android"
    },
    "iosInfo": {
      "iosBundleId": "com.example.ios"
    }
  }
}
```
> 引用：[(Google)パラメータから短いリンクを作成する](https://firebase.google.com/docs/dynamic-links/rest?hl=ja#create_a_short_link_from_parameters)

これをPostmanでたたく方法は下記の通り。

####1. リクエストを作成：New → Request → プロジェクト名を入れてSave.

<img width="1279" alt="スクリーンショット 2020-04-12 20.17.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/310e520d-f78c-abb0-aaa5-4861edae6319.png">

<img width="1280" alt="スクリーンショット 2020-04-12 20.18.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/c9234321-6daf-ec7c-261d-90767e433ca8.png">


####2. パラメータ（Params）の設定

- 「POST」に変更
- key-valueを設定。VALUEにはFirebaseで取得したapi_keyを入力。
<img width="1280" alt="スクリーンショット 2020-04-12 20.19.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/c59ffd19-97f2-73bb-f8c6-8a91f7ec1a2b.png">

####3. Bodyの設定

<img width="1280" alt="スクリーンショット 2020-04-12 20.19.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/6b62128b-2632-09d3-7f2d-5df89d98342b.png">


```
{
    "dynamicLinkInfo": {
        "domainUriPrefix": "https://{yourDomain}", //設定している場合はドメイン名。
        "link": "https://docs.google.com/forms/d/e/1FAIpQLSdVnE7pHvFJ6-9Y5XZDy8Yz6MdBFEkj9QTR_qwNuDnSTNaQXw/viewform?usp=pp_url&entry.1563907928={{num}}" //GoogleFormのURL。`{{num}}`は変数なのでそのまま。
    },
    "suffix": {
        "option": "SHORT" //`SHORT`にすると最低文字数4文字で生成される。
    }
}
```

####4. 環境変数の設定

アンケートフォームの事前入力値を「1,2,3…」とインクリメントさせるため、環境変数とTestsでnumを操作。

右上の歯車マーク → Globals → 変数を追加

<img width="1280" alt="スクリーンショット 2020-04-12 20.19.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/b05c4099-6091-0a29-0fe1-6f402a550e28.png">

<img width="1278" alt="スクリーンショット 2020-04-12 20.19.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/bfc2fc5a-b264-e68c-e5f6-5916aea1a05b.png">

|VARIABLE|INITIAL VALUE|CURRENT VALUE|
|:-------------|:-----------:|:------------:|
|num|1|1|


####5. Testsの設定

<img width="1280" alt="スクリーンショット 2020-04-12 20.19.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/61d037d7-5667-b241-e829-58a9dd149f68.png">

```
var num = Number(environment.num); //環境変数numの取得
tests["counter:" + num] = true; //結果の取得用。
pm.environment.set("num", ++num); //次の実行のためnumをインクリメント
```

####6. クエリを複数回実行するためのRunnerを設定

Runner機能は[こちら](https://sendgrid.kke.co.jp/blog/?p=8796#5)を参照。
下記からRunnerを起動。
<img width="1280" alt="スクリーンショット 2020-04-12 20.19.22 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/ba14a99c-c92b-697c-0ee9-9fd46972fe08.png">


作成したPOSTを選択し、`Save responses`にチェック。
Iterationsは実行回数。
`Run`で実行。
<img width="1280" alt="スクリーンショット 2020-04-12 20.21.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/605b7660-073e-093c-848f-6069807dc56b.png">

結果、Response Bodyで短縮URLが得られる。
<img width="1280" alt="スクリーンショット 2020-04-12 20.22.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/3c5da203-1d2c-843b-3a3f-5a58ccf37cff.png">

#Postmanの実行結果「Responses」をファイルで取得

複数の短縮URLは生成されたが、Postman上ではプロパティから値を確認できるだけ。一個一個確認するのは手間なので、実行結果を一気にファイル出力したいと思う。

調べたらファイル書き出し用のコードが用意されていたので、下記手順で実行することでファイルが書き出された。
[Write Responses To File](https://documenter.getpostman.com/view/3407886/RWgp1fB5?version=latest)
[(Github)ResponseToFile-Postman](https://github.com/sivcan/ResponseToFile-Postman)


日本語の説明が見当たらなかったので、念のため記載。

1. Postmanのネイティブアプリを立ち上げておく
2. [Write Responses To File](https://documenter.getpostman.com/view/3407886/RWgp1fB5?version=latest)にアクセス
3. `► Run In Postman`をクリック。アプリが立ち上がるので、collectionをインポート。
4. [ResponseToFile-Postman](https://github.com/sivcan/ResponseToFile-Postman)を自機にクローン。あるいはコマンドでクローン。`git clone https://github.com/sivcan/ResponseToFile-Postman`
5. クローンしたディレクトリを開いてインストール。コマンドは`npm i`
6. ローカルサーバを起動。コマンドは`node script.js`
7. これで実行結果は、新しく生成されるResponsesディレクトリに格納される。

保存されるファイルの拡張子や保存場所を変更したい場合、↑の3でインポートしたcollection「Write Responses To File」を、Edit Collectionで編集。
<img width="1280" alt="スクリーンショット 2020-04-13 0.03.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37048/1cf26100-0db0-4c43-4ac8-79103247f3f3.png">

取得例↓
ファイル名：「test_post_1.csv」

```
{"shortLink": "{Firebaseで生成された短縮URL}}
```

ファイルは実行回数分生成される。

#おわりに
あとは生成されたファイルをcatでマージし、まとめられたファイルから`shortLink`の行を抽出、valueのみ切り出せば、全ての短縮URLが得られる。

>参考
>[ファイルを結合するには](https://www.atmarkit.co.jp/flinux/rensai/linuxtips/155convnfile.html)
>[[Excel] データを抽出する方法（フィルター機能）](http://faq.mypage.otsuka-shokai.co.jp/app/answers/detail/a_id/140971/~/%5Bexcel%5D-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%88%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E6%A9%9F%E8%83%BD%EF%BC%89)


対象URLのQRコードもほしかったので、GoogleSpreadSheetでQRコードを生成した。
>[GoogleスプレッドシートのIMAGE関数でQRコードを作成する方法](https://tonari-it.com/google-sheets-image-qrcode/)


---
#追記
短縮URLを複数取得する方法、他にも全然あった笑
・[URLShorter(フリーソフト)](https://freesoft-100.com/review/urlshorter.html)　→bit.ly / j.mp
・[[非エンジニア向け]短縮URLを一括で大量に作る方法](https://katanash.com/post-290)　→bit.ly

まあFirebaseなら、「[1 つの IP アドレスで 1 秒あたり 5 回、1 日あたり 200,000 回という制限](https://firebase.google.com/docs/dynamic-links/rest?hl=ja#next_steps)」、bit.lyは「[1 分あたり最大 10,000 個のリンクを短縮する。月次最大数は、1 カ月あたり 10,000 個](https://www.ibm.com/support/knowledgecenter/ja/SSWU4L/Mobile/imc_Mobile/Bitly_Account_Limits_for_SMS_acct_limits_rate_increases.html)」らしいので、用途に応じて選ぶと良いかも。