line-bot-sdk-javaを使ってSpring bootでLINE Botを作る

## 概要
LINEが配布しているサンプルコードの[line-bot-sdk-java](https://github.com/line/line-bot-sdk-java)を使って、とりあえずLINE Botを動かしてみる手順。このサンプルコードは、LINE Botを作る上で必要なコードが一式揃っているので、これを元に拡張していくと効率がよいと思われる。
Javaのversionは11.02で実施。

## 関連
[Spring boot + JPA + Flyway on herokuでLINE Botを作る](https://qiita.com/Esfahan/items/854fe119f90c6abe37d6)
こちらはline-bot-sdk-javaに手を加えてDB接続など行ったもの。

## 環境
- Java 11.02
- Spring Boot 2.4.9 (line-bot-sdk-javaで使われているversion)

## LINE Channelの作成
以下を参考にChannelを作成する。
[ボット用のチャネルを作成](https://developers.line.biz/ja/docs/messaging-api/getting-started/)

## herokuでアプリを作成
herokuでアプリを作成する。
https://signup.heroku.com/

### herokuに環境変数の登録
[LINE Developersコンソール](https://developers.line.biz/console/)で、Messaging APIチャネルのチャネルシークレットとチャネルアクセストークンを確認し、herokuの管理画面のConfig Varsに以下を登録する。

CHANNEL_TOKEN：LINEのChannel access token
CHANNEL_SECRET：LINEのChannel secret

## ソースコードの作成
### サンプルコードを取得
サンプルコードには色々なものが入っているが、その中のsample-spring-boot-kitchensinkを使う。

```console
$ git clone https://github.com/line/line-bot-sdk-java.git
```

### Intellijでbuild.gradleを開く
[TOP階層のbuild.gradle](https://github.com/line/line-bot-sdk-java/blob/master/build.gradle)をIntellijで開く。

### Procfileを編集
sample-spring-boot-kitchensinkを利用するため、Procfileを以下のように書き換える。

```diff
-web: java $JAVA_OPTS -jar sample-spring-boot-echo/build/libs/sample-spring-boot-echo-*.jar --server.port=$PORT
+web: java $JAVA_OPTS -jar sample-spring-boot-kitchensink/build/libs/sample-spring-boot-kitchensink-*.jar --server.port=$PORT
```

### 設定ファイルを作成、編集
templateをコピーする。

```console
$ cd sample-spring-boot-kitchensink/src/main/resources/
$ cp application-template.yml application.yml
```

以下の文字列は削除して、以下の様に環境変数を使ってLINEのTOKENとSECRETを定義する。
> This is a template for the configuration file.
> Make a copy called `application.yml` and change the values below.

```yaml:application.yml
line.bot:
  channel-token: ${CHANNEL_TOKEN}
  channel-secret: ${CHANNEL_SECRET}
  handler.path: /callback
```

## Deploy
### gitにherokuの情報を登録

```
$ heroku git:remote -a {HEROKU_APP_NAME}
```

### Deploy

```
$ git add Procfile
$ git commit -m 'Initial commit'
$ git push heroku master
```

## LINE Developer Console
LINEの管理画面で、herokuアプリのURLをwebhookとして登録する。

Webhook URL: https://{HEROKU_APP_NAME}.herokuapp.com/callback
Use webhook: onにする

![Screen Shot 2021-07-18 at 19.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/ab362bd3-76b7-daa1-8877-a6aa92797fdc.png)

Verifyをクリックしてテスト
![Screen Shot 2021-07-18 at 19.54.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/f02fe034-4103-6893-f2e0-25b8f9e0d028.png)

OKとなればLINE BOTが正常に起動している。


## 動作確認
LINEアプリで該当Channelにメッセージを送ってみる。以下はすべてサンプルコードに実装されている機能。

### 「profile」と入力して、ユーザープロフィールを取得する
![Screen Shot 2021-07-18 at 20.07.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/57088a04-296e-7d45-b507-e99861025ed2.png)

### 「buttons」と入力して、テンプレートメッセージを送る
![Screen Shot 2021-07-18 at 20.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/7dd3843a-5840-fd76-ebba-83db12718aba.png)

### 「confirm」と入力して、テンプレートメッセージを送る
 ![Screen Shot 2021-07-18 at 20.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/d2a313ec-e966-abc7-aef4-d6684e7fdcd4.png)

###「carousel」と入力して、テンプレートメッセージを送る
![Screen Shot 2021-07-18 at 20.08.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/f8cbd83d-b811-c332-993e-f550d2296698.png)

###「imagemap」と入力して、イメージマップメッセージを送る
![Screen Shot 2021-07-18 at 20.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/8370c67d-9437-0245-886d-65613275d396.png)


### LINE公式アカウントをグループチャットに招待してから「bye」と入力
グループチャットからLINE公式アカウントを退出させられる。

### LINE公式アカウントに画像、音声、動画、位置情報などを送る
ボットはこれらのコンテンツを取得し、同じものを送り返してくる。

## ソースコード

| ファイル | 処理内容 |
| --- | --- |
| [KitchenSinkApplication.java](https://github.com/line/line-bot-sdk-java/blob/master/sample-spring-boot-kitchensink/src/main/java/com/example/bot/spring/KitchenSinkApplication.java) | メインのクラス |
| [KitchenSinkController.java](https://github.com/line/line-bot-sdk-java/blob/master/sample-spring-boot-kitchensink/src/main/java/com/example/bot/spring/KitchenSinkController.java) | controller。テキスト、スタンプ、画像投稿など様々な投稿方法ごとの返信処理の窓口 |
| [ExampleFlexMessageSupplier.java](https://github.com/line/line-bot-sdk-java/blob/master/sample-spring-boot-kitchensink/src/main/java/com/example/bot/spring/ExampleFlexMessageSupplier.java) | FlexMessage用 |
| [MessageWithQuickReplySupplier.java](https://github.com/line/line-bot-sdk-java/blob/master/sample-spring-boot-kitchensink/src/main/java/com/example/bot/spring/MessageWithQuickReplySupplier.java) | quickReply用  |
| [KitchenSinkWebMvcConfigurer.java](https://github.com/line/line-bot-sdk-java/blob/master/sample-spring-boot-kitchensink/src/main/java/com/example/bot/spring/KitchenSinkWebMvcConfigurer.java) | |

## gradleのversionが低い
サンプルコードはgradleのversionが6.7.1なので必要であればアップグレードする。

```
$ ./gradlew -v

------------------------------------------------------------
Gradle 6.7.1
------------------------------------------------------------

Build time:   2020-11-16 17:09:24 UTC
Revision:     2972ff02f3210d2ceed2f1ea880f026acfbab5c0

Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          13.0.2 (Oracle Corporation 13.0.2+8)
OS:           Mac OS X 10.14.6 x86_64
```

## 関連
[Spring boot + JPA + Flyway on herokuでLINE Botを作る](https://qiita.com/Esfahan/items/854fe119f90c6abe37d6)

## 参考
- [Herokuでサンプルボットを作成する](https://developers.line.biz/ja/docs/messaging-api/building-sample-bot-with-heroku/)
- https://github.com/line/line-bot-sdk-java