LIFFアプリを作ってみよう（#1 基礎編）

#目的
自称LINE Bot芸人としてのノウハウまとめその②として。

#LIFFアプリとは
まだ実際に導入している公式アカウントは少ないのですが（2019年12月現在）、例えばJR東日本さんのChatBot（<a>https://info.jreast-chat.com/</a>）が導入しています。

<img width="375" alt="MicrosoftTeams-image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/704890e2-d125-e372-e193-0e7b0a2d1964.png">

LINE内部ブラウザとよく似ていますが、大きく違う点が2つあります。

##LIFFアプリと内部ブラウザの違い

####1. アプリケーションの画面がすべてブラウザによって専有されてしまわないこと
こちらはLINEアプリの内部ブラウザです。
画面いっぱいがブラウザによって専有されており、「あれ？だれとチャットしてたんだっけ？」となる可能性がが高いです。

<img width="375" alt="MicrosoftTeams-image (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/765a43fc-fa6f-d812-adb0-2008265ea599.png">


####2. ログインしているアカウントの情報を取得する等、会話のよりリッチなインタフェースとして利用可能
上記画像でもわかるように、内部ブラウザはあくまでもただのブラウザです。LINEアプリとの関連性は皆無です。したがって、「誰がログインしているか」「誰からのリクエストなのか」という情報は、別途用意したWebアプリにて別途実装する必要があったわけです。

####つまり？
なので、上のJR東日本さんのChatBotを例に挙げるとすると、
「特定のユーザのMy路線を設定する」上では

* 内部ブラウザを立ち上げさせ
* 何らかの方法でWebシステムにログインさせ
* My路線を登録させた上で
* チャット画面に戻る

必要があります。

LIFFアプリがあることにより、この「何らかの方法でシステムにログインさせ」の部分に関してはすっとばせることになります。ユーザからすると、チャットというのは基本的に一対一のものであって、相手は自分が誰なのかを識別できているような感覚があるはずですので、よりユーザ目線で使いやすくなるはずなのです。

####実際の使いみち
やりとりはチャットで完結させるというチャットボットの考えには反するので、賛否両論かとは思いますが

* 複雑な入力フォームを実現したい場合
* ユーザの入力フォーマットを強制する場合
* チャットでは実現できない便利機能を実装する場合（LIFFアプリ上で絵を書いてトークルームに投稿するとか）

あたりですかね。

#作り方
LINE Botは構築できているものとします。
手順としては、

* 公式のLIFFアプリプロジェクトを入手（Gitからクローン）
* Herokuにデプロイ
* 公式アカウントが持つLIFFアプリとして登録（これやらないとそもそもLIFFアプリとして表示できない）
* 公式アカウントの挙動とLIFFアプリの起動を関連付ける


という感じで行きます。

##公式のLIFFアプリプロジェクトを入手（Gitからクローン）
公式のサンプルは<a href="https://github.com/line/line-liff-starter.git">ここ</a>にあります。
今回はgitコマンドを使ってインストールします。上記URLから手動でダウンロードもできます。

```shell
> git clone https://github.com/line/line-liff-starter.git
```

##Herokuにデプロイ
まずはHerokuアプリを作ります。

```shell
> heroku create
Creating app... done, ⬢ obscure-thicket-21275
```
こんな感じでランダムなアプリ名を振ってくれます。

次に、先程cloneしてきたソース群を自分のプロジェクトとしてgitで管理できるように設定していきます。

```shell
> git init
> git add .
> git commit -m "new commit"
```
これでコミットされます。

いよいよデプロイです。

```shell
> git push heroku master
#たぶん色々出てきますが、最後に'done'と表示されていればOKです
```

これでアプリケーションはデプロイされています。

##LIFFアプリとして登録
<a href="https://developers.line.biz/console">LINE Developers console</a>へアクセスし、自分のBotを選びます。

「LIFF」タブをクリックするとLIFFアプリが登録できるようになっています。
早速追加していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/b47d9c5e-207f-a268-1eb5-e586df12742c.png)

「LIFFアプリ名」は適当に入力します。
「サイズ」は、実際に表示される画面のサイズです。よく見かけるものは「Compact」または「Tall」が多いような気がします。

「エンドポイントURL」はLIFFアプリのURLです。
先程デプロイしておいたWebアプリのURLを指定しましょう。
たとえばアプリ名が「obscure-thicket-21275」の場合、エンドポイントURLは

```
https://obscure-thicket-21275.herokuapp.com/
```
になります。

「Scope」は、LIFFアプリが何をすることができるか、です。
例えばprofileにチェックを入れた場合、LIFFアプリを起動したLINEユーザのプロフィールにアクセスできるようになります。
chat_message.writeにチェックを入れた場合は、例えばユーザがLIFFアプリ上のボタンをクリックした時点でそのユーザとしてチャットを送信することができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/74105824-fdc3-531e-f19e-3b61daacbd36.png)

とりあえず設定は済んだので、作成ボタンを押します。

こんな画面に戻るので、作ったアプリを再度クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/cc0f4712-eb3b-f462-2f51-779cb563973c.png)

「LIFF URL」が振られていますが、これが重要です。
「line://」で始まっているものはLIFFアプリとして開かれることになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/cf589b32-b836-3eea-b96e-1408009c63b1.png)

##公式アカウントの挙動とLIFFアプリの起動を関連付ける
公式アカウントでリッチメニューを用意し、リッチメニューのボタンをクリックしたタイミングでLIFFアプリが起動するようにします。
リッチメニューの作り方は<a href="https://qiita.com/bowtin/items/32ac5d2b4c67bd0c1dc2">こちらの記事</a>を参照してください。

リッチメニューを作成後、アクションのタイプ部分を「リンク」に設定し、先程のLIFF URLをコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/0d0db063-671f-69fa-1ba0-4c1039e39509.png)

動作確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/6ab7a0c4-e695-69b9-c23d-715c69277b2b.png)

LIFFアプリを起動ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/36a89f9f-45da-524e-4234-b6b466b3b368.png)

初回に限り、同意を求められるので同意しておきます。

小さな画面で、LIFFアプリが立ち上がってきます。
一部情報は消していますが、ユーザのID等諸々情報がとれているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/9148816f-fbf9-d04c-b97c-60d0d2d9c3bd.png)

「Send Message」ボタンをクリックすると、そのユーザとしてメッセージが送られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/9129b48c-d337-20ca-36f1-4f6159c50894.png)


##カスタマイズしたい場合は？

* 先程Gitからcloneしたファイルの中にindex.htmlがあるのでこれを編集する
* 挙動はliff-starter.jsにJavaScriptのコードがあるのでこれを編集する

という感じです。

#まとめ
* LIFFアプリを作るなら公式サンプルをcloneしてカスタマイズすると楽！