LINE Messaging API＋Ngrok＋Python　で実験的にLINEボットを開発してみよう　Part2簡易動作と応用の準備

# ０．お久しぶりです！！
前回の[記事](https://qiita.com/Antareskkudo/items/bedd28326f57a5d80092)投稿からかなり経ってしまいました！申し訳ありません！私の大学での事情と就活等諸々大変でして...
この記事のPart1で意外と反響がありましたので続けていきます。
では今回は前回準備したコードを実際に動かしていきます！前回から時間が経ちRaspberry piやVscodeのバージョンがアップしていますが操作の違いや環境設定の変更などは必要ないです。
# １．復習と補足
前回やったことをまとめます。

* 準備（IPアドレス固定化、必要機能インストール）
* ディレクトリ構成
* コードを書く
* コード解説

上の「コードを書く」のところでアクセストークンやチャネルシークレットがどこにあるかを記載していませんでしたのでそれを補足します。

## アクセストークン・チャンネルシークレットの場所
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/0d7e7d2e-771d-16c1-8ff7-962a8f830d92.png)
では[LINE Developers](https://developers.line.biz/ja/services/messaging-api/)にアクセスしてください。右上のログインボタンを押して自分のアカウントにログインします。
＊アカウントやプロバイダー、チャンネルを作成していない方や方法が分からない方は[【入門用】PythonによるLINEbot作り方](https://www.tomotaku.com/line-repeat-bot)を参照して作成してください。
ログインできましたら作成したチャネル（botアカウント）をクリックし以下の場所を参照して下さい。＊アクセストークンなどは発行ボタンで発行する場合があります。

```
アクセストークン：Messaging api - Channel access token(チャネルアクセストークン)
チャネルシークレット：Basic Settings(チャネル基本設定) - Channel secret(チャネルシークレット)
```
上記をメモしたら前回のconfig.pyに記入してください。
# ２．動作準備
では前回のコードを動かしていきましょう！
説明を始める前に前回、ngrokの事についてはあまり触れませんでしたが今回は少しだけ触れていきます。
**ngrokとはローカルのWebサイトや今回使用するWebアプリケーションなどを外部に公開することができるシステムです**。通常はポート開放などを行いローカル環境を外部に公開しますが、セキュリティの問題から使用するには抵抗があります。またドメイン関連の作業が有るので面倒です（ここら辺はあんまり知らないのでどんな面倒さがあるのかわかりません）。しかしngrokはこれらの面倒さを肩代わりしてくれるほか、セキュリティについても短期間であれば問題無いものになっています（勿論、絶対とは言い切れません）。ngrokのインストールなどについては前回の記事を参照してください。

## コードの始動
下図のようにRaspberry piをSSHを用いてVscodeで作業できる状態にしています。[^1]
今下図のように前回書いたapp.pyを表示しておりディレクトリ構成も前回と同じものにしています。[^2] 
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/e22a6b35-ff1e-7eec-2a5a-e9d9468d734d.png)
vscodeは沢山の拡張機能がありますので便利なものを入れておきましょう！[^3]

ターミナルを起動したら（上図の下側）実行コマンドを打ちましょう！Vscodeの拡張機能PylanceならRunのボタン（上図の右上の三角▷ボタン）で実行できます。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/8315691f-d00c-9850-b5a8-2d6685b64843.png)
実行すると上図のようになります。もしここでエラーが出た場合はFlaskなどのインストールや環境設定に問題がありますのでその辺を調べて直してみてください。
これでコードの始動は完了です。

## ngrokの始動
次にngrokを始動させていきます。
上のコードを始動させているターミナルとは**別の新しいターミナル**を開いて下さい。下の印をつけた＋マークで開くことができます。
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/5f115a00-623c-0d0d-49d2-a4f215c13fd9.png)
ではターミナルに下記のコマンドを入れます。

```
ngrok http 8080
```
このコマンドはローカルの8080ポートを外部に公開・共有するという意味です。app.pyでは最後にポートを8080に指定していましたのでコマンドでも辻褄を合わせるために8080と入力しています。

コマンドを実行すると
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/baa15c2c-eca9-8e17-d4be-9f50dad3cecf.png)
となります。
もしエラーがあった場合はngrokのインストール関連で問題があると思いますので前回の記事をみて再度構築してみてください。

いまngrokの始動画面にあるhttpsから始まり、.ioまでのURLをコピーしてください。
注意：httpから始まるURLもありますがLINE側でhttpsしか対応していません。
これでRaspberry pi側（サーバー側）での操作は終了です。

## LINE messaging apiの設定
次に上記動作を実際にbotに適応させる操作をしていきます。まずはLINE Developersにログインして自分のチャネル（botアカウント）の設定を開きます。その中のMessaging apiタブを選択して、下のようにWebhookのWebhook URLを編集していきます。
注意：Webhookの利用がオフの場合はオンにしてから編集してください
先ほどコピーしたhttpsから始まるアドレスをここに記入します。そして**最後の.ioの後に必ず<code>/callback</code>を入れてください。** 
今回は下のように記入しました。
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/77fff304-3a05-d159-add9-efaa0fe8c852.png)
更新又は設定ボタンを押してください。その後検証ボタンを押して、下のような画面が出れば大丈夫です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/b3fc1222-8f9d-049c-b946-3b3ca6e8e4f2.png)
このとき、<code>/callback</code>をつけていないと別のエラー表示が出ます。
では検証した時のRaspberry piのターミナルも見ていきましょう。
下のようになっていました。 

* python実行中のターミナル画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/57a23fab-eca1-83c1-5274-aa590a423822.png)

* ngrok実行中のターミナル画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/f4261e26-6899-82be-0acc-49dc407ca573.png)

もし、python側で<code>Invalid signature. Please check your channel access token/channel secret.</code>が出ている場合はチャネルシークレットやアクセストークンが間違っている場合があります。またngrok側でもBAD RequestやNot Foundなどが表示されていたらcallbackの付け忘れかチャネルシークレット、アクセストークンの間違いなどがあるかもしれませんので記事を読み直して再度編集してみてください。

## 停止・再起動時の注意
**ngrokのURLは一人一人違います、さらにngrokを起動するたびに変化しますのでngrokを停止して再度起動した場合は上記操作を再度行う必要があります。**[^4] プログラムを変えて続けて使用する場合はngrokは停止せず、app.pyのみを停止するようにしましょう。[^5]


これでLINE側の操作も終了です。動作確認をしてみましょう！
#３．動作検証
ではLINEに移り、自分の作成したbotと会話できるようにしましょう！会話をするには友達登録が必要です、LINE Developers>チャネル（botアカウント）>Messaging apiのQRコードやIDから友達登録できます。
会話を開き何か文字を打ち込んでみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/2b9ecdbf-4d1b-d468-1e45-0b53f6f14537.png)

出来ましたね。**現時点でbotはどんな言葉に対しても「こんにちは」しか言えないです。**これでは会話とは言えませんね。今回の目的は会話をするのと会話からRaspberry piを操作するような応用を目的としています。では改良を考えていきましょう！

# ４．ちょっと改良（応用を探る）
まずは会話を成り立たせることから始めます。
前回説明した中で下のコードをうまく使用できれば会話できるとお話ししました。

```py
def selectwords(commandtext):  # 対応する言葉を選択
    reply = "こんにちは"
    return reply
```
おさらいしておきますと引数のcommandtextに、送られてくるメッセージが入っています。
ではこの引数を使用して条件分岐を作成してあげれば会話のまねのようなものができます。
そこで下のように書き換えてみました。[^6]

```py
def selectwords(commandtext):  # 対応する言葉を選択
    if commandtext == "おはよう":
        reply = "おはようございます！"
    elif commandtext == "こんにちは":
        reply = "こんにちは"
    elif commandtext == "こんばんは":
        reply = "こんばんは"
    else:
        reply = "分からない単語です。"
    
    return reply
```
ではプログラムのみを停止・再起動します。LINEで改めて会話してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/d2f11d11-97dc-7257-1fc4-b1b39f39f076.png)
会話っぽいですね。「こんばんは」と「おはよう」については会話が成立しています。しかし「ごはん」では単語の条件分岐を作成しておらずうまく会話ができません。では「ごはん」についての条件分岐を作成すればよいのではないかと思うかもしれませんがそのように、**単語一つ一つ条件分岐を作成していたらコードも大変多くなり、カッコ悪くなります。**

#５．応用に向けてアプローチ方法を探る
そこで、別ファイルに会話パターンを記録しその会話パターンを読み込ませて会話するという方式を取ります。この方法を取る利点は次の通りです。

- プログラムをコンパクトにできる
- 同じような動作をする場合はまとめることができる
- プログラムの動作を止めなくても外部データを変更するだけで会話パターンを変更できる
- 会話に伴う追加情報を付加できる

上記の様に更なる応用を図ろうとした時にその応用機能を導入しやすくできます。また会話パターンを記録するファイル形式にもこだわります。ファイル形式はCSVです。表形式にする事で可視性とプログラムを書きやすくできます。前回作成したディレクトリ構成の中にactiondata.csvを活用していきます！
この後の詳細は次回にしますが上記をまとめると下のような概要図になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/ed3cb6e8-0c09-4637-2f35-f5c286f577bb.png)
次回以降になりますが、Raspberry piの特徴でもある多彩な外部インターフェースや他のAPIを合わせて使用することもやっていきます。

# ６．まとめ
これでPart2は終了です。いかがだったでしょうか？理論的な話を踏まえて進めていきましたのでプログラムの方はあまり進んでいませんが、理論はだいぶ詰めましたので次回からはバリバリ書いていきます。次の記事投稿はいつになるかわかりませんが私の大学の講義と課外活動、就活が落ち着いてからになるかもです。
前回と同様に質問などありましたらコメント欄によろしくお願いします。時間がある時に回答いたします。
では！

続編出しました！ > [LINE Messaging API＋Ngrok＋Python　で実験的にLINEボットを開発してみよう　Part3会話盛りだくさん編](https://qiita.com/Antareskkudo/items/d3601c2c9888712ec49e)

# 参考資料

* [Part1](https://qiita.com/Antareskkudo/items/bedd28326f57a5d80092)
* [【入門用】PythonによるLINEbot作り方](https://www.tomotaku.com/line-repeat-bot) < とても参考にさせていただきました
* [Raspberry Pi】ngrokのインストールからローカル環境の公開まで](https://qiita.com/sunaga70/items/6821772a9bcbdbbc2c03)
* [Messaging APIを始めよう](https://developers.line.biz/ja/docs/messaging-api/getting-started)
* [LINE Developers](https://developers.line.biz/ja/services/messaging-api/)


[^1]: 参考：[VSCodeのSSH接続機能で、RaspberryPi内のコードを編集してデバッグ](https://qiita.com/c60evaporator/items/26ab9cfb9cd36facc8fd)
[^2]: ディレクトリ構成はセキュリティ上表示していません
[^3]: 個人的には、**Pylance**や**Edit CSV**などがお勧め拡張機能です。
[^4]: ngrokの画面で制限時間が設けられていますがngrokのアカウントを作成し認証操作を行えば”無料”でも制限時間なしに動作させることができます。また有料版に加入すれば固定できます。
[^5]: 停止の方法はngrokもapp.pyも共通で、停止したいターミナルを開いて<code>Ctrl + C</code>でできます。
[^6]: 他のプログラムは変えていませんので、selectwords関数だけを置き換えてあげればそのまま動きます。