LINE Bot ハンズオン

# はじめに
Messaging APIを使ってLINE Botを作成するハンズオン記事です。
ユーザーが送ったメッセージをそのままオウム返しで返すLINE Botを作成します。



# 前提条件
* LINEアカウントを持っていること
* VS Codeがインストールされていること
* VS CodeへGitHub or Microsoftアカウントでサインインしていること
* Node.js v18以上がインストールされていること



# ハンズオン

## LINE Developersコンソールへログイン
[Messaging APIページ](https://developers.line.biz/ja/services/messaging-api/)へアクセスし画面右上の「コンソールにログイン」ボタンをクリックし、ログインします。

https://developers.line.biz/ja/services/messaging-api/

![image](https://gist.github.com/assets/22117028/948e5423-85a3-4c9c-ac21-b485f07785ae)
![image](https://gist.github.com/assets/22117028/69d86895-3c1e-4490-bdb7-4dea576afc4f)
<br>



## プロバイダーの作成
はじめてLINE Botを作成する際はプロバイダーを作成します。
「プロバイダー」の項目横にある「作成」ボタンをクリックします。

:::note info
プロバイダーは1つのLINEアカウントに複数作成できます。
:::

![image](https://gist.github.com/assets/22117028/701f3b03-7e05-4067-b449-72ddaf1b9fe4)
<br>



新規プロバイダー作成ウインドウが表示されるので「プロバイダー名」に任意の名称を入力し「作成」ボタンをクリックします。

![image](https://gist.github.com/assets/22117028/5c9eae75-3418-4d3d-8b0f-e0fa6304186d)
<br>



## Messaging APIチャネルの新規作成

「新規チャネル作成」をクリックします。

![image](https://gist.github.com/assets/22117028/f3736d90-a2d3-4880-ae80-01634d6a78a8)
<br>



「Messaging API」を選択します。

![image](https://gist.github.com/assets/22117028/9ab59de6-f88b-4614-9a47-cd098da8919d)
<br>



チャネル情報を以下のように入力していきます。
以下に記載のない項目は変更しなくて大丈夫です。

* 会社・事業者の所在国・地域：　該当する国を選択します
* チャネル名：　Bot名を入力します
* チャネル説明：　Bot名をそのまま入力したりと適当で大丈夫です
* 大業種・小業種：　適当に選択して大丈夫です
* 「LINE公式アカウント利用規約の内容に同意します」チェックボックスをオンにします
* 「LINE公式アカウントAPI利用規約の内容に同意します」チェックボックスをオンにします

最後に「作成」ボタンをクリックします。

![image](https://gist.github.com/assets/22117028/93921b07-91d4-41ed-99d8-fba62812d4ee)
![image](https://gist.github.com/assets/22117028/dc0c9d5c-64f0-4dd9-b46b-dd14f7fbf625)
![image](https://gist.github.com/assets/22117028/eac0bdcc-716a-492f-b8ec-617538ac3fb2)
<br>



内容を確認し「OK」を選択します。

![image](https://gist.github.com/assets/22117028/761f2491-eb44-46fb-a89a-8ce0457fb9cc)
<br>



同意確認が2つ表示されるのでそれぞれ内容確認し問題なければ「同意する」をクリックします。

![image](https://gist.github.com/assets/22117028/7191d0e3-cabc-4a9c-82a8-154a894dc755)
![image](https://gist.github.com/assets/22117028/d7106d80-98ac-4f38-9aa8-80f394e5c583)
<br>



## Botの応答設定

Messaging APIチャネルが新規作成されるとBot設定画面になります。

Botはデフォルトでは友達追加時やメッセージを送った際に定型文を返す設定となっています。
BotからのメッセージはMessaging APIにより制御するため、これらの応答設定を解除します。

Bot設定画面にて「Messaging API設定」タブを選択します。

![image](https://gist.github.com/assets/22117028/96b93c21-d5ba-4f8a-9a51-f2d77d859d60)
<br>



画面を下の方にスクロールすると「応答メッセージ」という項目があるので、項目右にある「編集」リンクをクリックします。

![image](https://gist.github.com/assets/22117028/02a95dfb-83ed-4b68-bfd8-e99f1f3ede51)
<br>



LINE Official Account Manager画面が開かれます。
応答機能より「あいさつメッセージ」と「応答メッセージ」の項目をそれぞれオフにします。

![image](https://gist.github.com/assets/22117028/298a0e26-92fc-4398-bde6-4f850ce897e6)
<br>



## Botの友達追加

続いてBotをLINEアプリにて友達追加します。

LINE Developers コンソール画面に戻り、「Messaging API設定」タブの先頭までスクロールします。
画面に表示されているQRコードをスマートフォンで読み取ります。

![image](https://gist.github.com/assets/22117028/c43c4477-1f29-4812-bf92-5c447a322049)
<br>



LINEアプリにてBotの友達追加画面に遷移するので「追加」をタップします。

![image](https://gist.github.com/assets/22117028/6235b70a-ff00-4882-aa35-c7ae81ced85c)
<br>




## Botプログラムの作成

Messaging APIを使用したBotプログラムを作成します。
まずはBotプログラム用ディレクトリを作成し、VS Codeで開きます。

```sh
mkdir messaging-api
code messaging-api
```



次にBotのSDKやHTTPサーバーとなるexpressのNode.jsパッケージをインストールします。

```sh
npm i @line/bot-sdk@9 express@4
```



そして以下のコードを`bot.mjs`としてファイル保存します。


```sh
touch bot.mjs
```

```js: bot.mjs
import { messagingApi, middleware } from "@line/bot-sdk"
import express from "express"

const channelSecret = "<channel secret>"
const channelAccessToken = "<channel access token>"
const port = 3000

const client = new messagingApi.MessagingApiClient({ channelAccessToken })



const app = express()
app.post("/", middleware({ channelSecret }), (req, res) => {
	console.log(req.body.events)
	handleEvents(req.body.events)
	res.send({ status: 200 })
})
app.listen(port, () => console.log("Start server!"))



const handleEvents = (events) => {
	for (const event of events) {
		switch (event.type) {
			case "message": client.replyMessage({
				replyToken: event.replyToken,
				messages: [event.message]
			}); break
		}
	}
}
```



## チャネルシークレットとチャネルアクセストークンの取得

さきほど作成したコードでは`channelAccessToken`と`channelSecret`の値が正しく設定されていないため動作しません。
LINE Developers コンソールのBot設定画面よりそれぞれの値を取得しコードを書き換えます。

まずはチャンネルシークレットを取得します。
Bot設定画面の「チャネル基本設定」タブを開き、下の方にスクロールすると「チャネルシークレット」という項目があるのでその値をコピーします。

そしてbotコードの4行目の`channelSecret`にコピーした値を貼り付けます。

![image](https://gist.github.com/assets/22117028/d51bc721-47f5-4c65-9eae-01bd7f852ac1)
<br>



次にBot設定画面の「Messaging API設定」タブを開き、下の方にスクロールすると「チャネルアクセストークン（長期）」という項目があります。
「発行」ボタンをクリックするとチャネルアクセストークンが発行されるので、その値をコピーします。

そしてbotコードの5行目の`channelAccessToken`にコピーした値を貼り付けます。

![image](https://gist.github.com/assets/22117028/dec468fe-b296-4bce-993f-53df82c8d040)
<br>



## Botプログラムの実行

チャネルシークレットとチャネルアクセストークンをコードに反映できたら以下のコマンドを実行しプログラムを起動します。
`Start server!`と表示されれば正常に起動している状態です。

```sh
$ node bot.mjs
Start server!
```



## VS Codeのポート転送機能によるトンネリング

この段階ではPCローカル上でプログラムが起動している状態ですので、LINEサーバーからBotプログラムへアクセスできません。
そこでVS Codeのポート転送機能を使ってBotプログラムをグローバルネットワークからアクセス可能な状態にします。

ポート転送機能を使用するにはVS CodeへGitHub or Microsoftアカウントでサインインしている必要があります。
サインインされていない場合はVS Codeの左下のアイコンよりサインインを行ってください。

![image](https://gist.github.com/assets/22117028/22eb3781-12f0-4ace-baca-fde70c3cb4d0)
<br>



ポート転送機能を呼び出すにはVS Codeのコマンドパレットを起動し（ctrl + shift + p）「Forward a Port」と入力します。
入力の途中で候補が表示されるので、選択してEnterキーを押し実行してください。

![image](https://gist.github.com/assets/22117028/41e85122-0da0-4c71-9a38-c8533c6c6de3)
<br>



するとポート番号の入力フォームが表示されるので「3000」と入力します。

![image](https://gist.github.com/assets/22117028/67d8ca45-4e4f-470e-b75a-dc2294a96525)
<br>



ポート転送機能の使用許可確認が表示されるので「許可」をクリックします。

![image](https://gist.github.com/assets/22117028/68be688b-2292-44e3-9657-d1c60623fbff)
<br>



ポートパネルへ3000ポートに対する転送用URLが発行されます。
しかしこの時点ですとこのURLはグローバルネットワークへは非公開の状態です。

URLを右クリックして表示されるメニューより「ポートの表示範囲」 > 「公開」と選択し、公開状態に変更します。

![image](https://gist.github.com/assets/22117028/903ab990-e2ec-4e62-9f19-81986893d3b8)
<br>



URL公開に関する注意が表示されるので「続行」をクリックします。

![image](https://gist.github.com/assets/22117028/a0c6c778-bc68-4210-977b-fcb43b5f542e)
<br>



これでグローバルネットワークからPC上で起動しているBotプログラムへアクセス可能な状態になりました。
ポートパネルに表示されているURLにカーソルを合わせ、URLコピーアイコンをクリックします。

![image](https://gist.github.com/assets/22117028/83e65f50-3e23-4e55-ad85-dd06cdf3b7b1)
<br>



## BotのWebhook URL設定

VS Codeのポート転送機能により払い出されたグローバルネットワークアクセス可能なURLをBot設定画面よりWebhook URLに設定します。

LINE Developers コンソールのBot設定画面より「Messaging API設定」タブを開き、少し下にスクロールします。
「Webhook URL」という項目があるので「編集」ボタンをクリックします。

![image](https://gist.github.com/assets/22117028/fe4a7aaa-83f3-480e-a470-0b1b3784741b)
<br>



URLを入力できるテキストボックスが表示されるので、VS Codeのポート転送機能にて払い出したURLを貼り付け「更新」ボタンをクリックします。

![image](https://gist.github.com/assets/22117028/8fff889a-8c2b-4198-9139-78e0c726c095)
<br>



これでWebhook URLがセットされ、LINE BotとPC上で起動しているBotプログラムが紐づけられました。

正常に疎通できているか確認のため「検証」ボタンをクリックします。
問題なければ「成功」というポップアップが表示されます。

![image](https://gist.github.com/assets/22117028/214ee82d-d162-477a-97b8-ac5f3f9adf32)
![image](https://gist.github.com/assets/22117028/88a82379-0214-4ac3-af44-f3db3481f270)
<br>



最後に「Webhookの利用」という項目をオンにします。

![image](https://gist.github.com/assets/22117028/fd1dd38a-f6b1-4989-ac32-81e9b695fdb7)
<br>




以上でLINE Botの設定は完了です。



## Botへのメッセージ送信

LINEアプリより友達になったボットへメッセージを送ってみましょう。
送ったメッセージと同じメッセージがオウム返しで返ってくれば成功です🎉

![image](https://gist.github.com/assets/22117028/2cdf8033-9fb9-4c02-9b9e-10d26332e1b2)
<br>



LINE Botハンズオンは以上です。
お疲れ様でした🎊