LineBotメモ(1) - Kitchensinkサンプルボットアプリ(Java)をherokuにデプロイ

# やりたいこと
https://developers.line.biz/ja/docs/messaging-api/building-sample-bot-with-heroku/
の「Kitchensinkサンプルボットアプリをデプロイする」をやってみる。JavaのSDKを使う。

## 動作環境
- Surface Go
- Windows 10 Home

## LineのProvider, Channelを作成
https://developers.line.biz/console/
からログインし、ProviderとChannelを作成。
Channel typeはMessaging APIを選択。
Channel nameはNote: The channel name can't be changed for seven days. とあるので、お試し用としても気を付けないと。

Channel作成まで終わったら、
Basic settingsからChannel secretを確認しておく。
長期のアクセストークンを使うなら、Messaging API settingsからChannel access token (long-lived) をissueしておく。
任意の有効期間を指定できるチャネルアクセストークン（チャネルアクセストークンv2.1）をおすすめされるがそれは別途。

新しく作ったチャネルはあいさつメッセージと応答メッセージが有効になっているので、
https://www.linebiz.com/jp/login/
の設定->応答設定からいずれもオフにしておくとよい。

## line-bot-sdk-javaを入手

- git clone

```
PS C:\Users\nabec\work\line> git clone https://github.com/line/line-bot-sdk-java.git
Cloning into 'line-bot-sdk-java'...
remote: Enumerating objects: 159, done.
remote: Counting objects: 100% (159/159), done.
remote: Compressing objects: 100% (101/101), done.
remote: Total 11691 (delta 39), reused 74 (delta 10), pack-reused 11532
Receiving objects: 100% (11691/11691), 5.34 MiB | 933.00 KiB/s, done.
Resolving deltas: 100% (4510/4510), done.
Updating files: 100% (492/492), done.
```

- line-bot-sdk-java/Procfileのechoをkitchensinkに置き換える
 - sed s/echo/kitchensink/g的な
- 変更後

```
PS C:\Users\nabec\work\line\line-bot-sdk-java> cat Procfile
web: java $JAVA_OPTS -jar sample-spring-boot-kitchensink/build/libs/sample-spring-boot-kitchensink-*.jar --server.port=$PORT
```

- application.ymlの作成
 - sample-spring-boot-kitchensink/src/main/resources/application-template.ymlファイルをコピーしてapplication.ymlに名前を変更します。手順1で確認した値を使って、channel-secretフィールドとchannel-tokenフィールドに入力します。「This is a template for the configuration file. Make a copy called application.yml and change the values below.」の部分は削除します。
- やった結果

```
PS C:\Users\nabec\work\line\line-bot-sdk-java\sample-spring-boot-kitchensink\src\main\resources> cat .\application.yml
#
# Copyright 2016 LINE Corporation
#
# LINE Corporation licenses this file to you under the Apache License,
# version 2.0 (the "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at:
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

line.bot:
  channel-token: 'xxxx'
  channel-secret: 'xxxx'
  handler.path: /callback

# To remove Client wire logs. Please comment out following lines.
# See: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html
#
#logging.level:
#   com.linecorp.bot.client.wire: INFO
```

## herokuにpush

- https://dashboard.heroku.com/apps からログインしてダッシュボード表示
 - New -> Create new app
- gitリモートを追加 

```
PS C:\Users\nabec\work\line\line-bot-sdk-java> heroku git:remote -a nabechiki-bot-java
```

- remote.heroku.urlが追加されている

```
PS C:\Users\nabec\work\line\line-bot-sdk-java> heroku git:remote -a nabechiki-bot-java
set git remote heroku to https://git.heroku.com/nabechiki-bot-java.git
PS C:\Users\nabec\work\line\line-bot-sdk-java> git config --list                                                        diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
credential.helper=manager
user.name=xxxx
user.email=xxxx
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=https://github.com/line/line-bot-sdk-java.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.heroku.url=https://git.heroku.com/nabechiki-bot-java.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*
```

- herokuへpush
 - 5分くらいかかる

```
PS C:\Users\nabec\work\line\line-bot-sdk-java> git add .                                                                PS C:\Users\nabec\work\line\line-bot-sdk-java> git commit -m "First commit"
PS C:\Users\nabec\work\line\line-bot-sdk-java> git push heroku master
```

## LineのWebhook URL
LineコンソールのMessaging API settingsからWebhook URLを登録。
この例だとhttps://{HEROKU_APP_NAME}.herokuapp.com/callback(この例だと{HEROKU_APP_NAME}はnabechiki-bot-java)。
Use webhookも有効にする。
Verifyで確認、signatureの問題が出ることがあるが後述。

## 動作確認

Line側から以下の動作を確認

- 「profile」と入力して、ユーザープロフィールを取得する。
- 「buttons」、「confirm」、または「carousel」と入力して、テンプレートメッセージを送る。
- 「imagemap」と入力して、イメージマップメッセージを送る。
- LINE公式アカウントをグループチャットに招待する。「bye」と入力すると、グループチャットからLINE公式アカウントを退出させられます。
- LINE公式アカウントに画像、音声、動画、位置情報などを送る。ボットはこれらのコンテンツを取得し、同じものを送り返してきます。