LINEbot開発、ローカル環境で動作確認したい

この記事は**動作確認のたびにherokuにpushするのどうにかしてぇ！！** って思う方を対象にしています。
## 動作環境
+ Ubuntu 18.04
+ Python 3.8.1

## herokuを使う意味
問題を解決する前に、そもそもどうしてherokuを使っていたのか考えます。
LINEbotとherokuはアクセストークン、シークレットキーと**webhookURL**を介して繋がっていました。
「図」
herokuのアプリは公開(デプロイ)されるとURL（〜herokuapp.comのやつ）を持つことができます。
これが**webhookURL**として使うやつです。
このwebhookURLを**自前で用意**できたらいいのですが、なかなか**できない**ですよね。
なので仕方なくデプロイして、アプリのURLをゲットするためにherokuを利用していたのです(それだけじゃないけど)。

## じゃあどうするか
**自分のlocalhost**をherokuを使わず、**外部に公開**します。
こうすることでwebhookURLを用意できます。
（localhostを公開ってセキュリティ的にどーなんやろとか思ってしまいますが、置いときます）
使うツールは**ngrok**ってやつです。

## やりかた
* **ngrokのインストール**

[ngrok公式サイト](https://dashboard.ngrok.com/get-started)の赤いボタンでzipファイルをダウンロード
![Screenshot from 2020-02-19 03-45-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587912/125218d8-77ce-d4c9-3f9c-aa1cb4eddc61.png)

次に以下のコマンドで解凍〜version確認までを行います

```shell:ngrokのインストール
cd ~/Downloads
unzip ngrok-stable-linux-amd64.zip
sudo cp ngrok /usr/bin/
ngrok version
```
これでngrokが使えるようになりました。実際に使うときは

```shell:ngrokで外部公開
ngrok http [port番号]
```
でローカルサーバーの[port番号]が外部に公開されます。

```shell:ngrok実行結果
ngrok by @inconshreveable    (Ctrl+C to quit)
Session Status                online
Session Expires               7 hours, 59 minutes
Version                       2.3.35
Region                        United States (us)
Web Interface                 http://127.0.0.1:☓☓☓☓
Forwarding                    http://☓☓☓☓☓☓☓☓.ngrok.io -> http://localhost:5000 
Forwarding                    https://☓☓☓☓☓☓☓☓.ngrok.io -> http://localhost:5000
Connections
ttl     opn     rt1     rt5     p50     p90
0       0       0.00    0.00    0.00    0.00  
```
`Forwarding`の横にある`https://☓☓☓☓☓☓☓☓.ngrok.io`がlocalhostを外部公開したときのURL(port番号は5000)。これを**webhookURLとして使えばいい！**

* **LINEbot関係の準備**
たくさん記事があるのでググってみてください

* **環境変数設定**
環境変数は設定する。
.envってファイルをプロジェクト配下につくっていつもの２つをLINEdevelopersからコピペしてくる（' とか " とか一切つけない、そのまま）。
> .envは環境変数を設定するファイルなのでGitHubとかにはpushしてはいけない。pushしないためには.gitignoreってファイルの使い方とかを調べてください。

```python:.env
LINE_CHANNEL_ACCESS_TOKEN = ☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓
LINE_CHANNEL_SECRET = ☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓
```
・**main.pyを走らせる**
ターミナルを２つ用意して、片方でもう一度ngrokを実行する。
（ngrokは実行するたびに異なったURLを紐つけるので、さっきと値は変わっているはず）。
それを実行したままで、LINEdevelopersのwebhookURLを

```
https://☓☓☓☓☓☓☓☓.ngrok.io/callback
```
に設定する(httpsであること！)。
最後にもう一つのターミナルでmain.pyを以下のようにして走らせる。

```main.pyを実行
pipenv shell //仮想環境にin
pipenv run python3.8 main.py
```
うまくいけばサンプルが動く。

**エラーの場合**
`Error: the command python3.8 could not be found within PATH or Pipfile's [scripts].`
上記のようなエラーが出た場合は、
`python3.8`を自分の環境にあったものに変更するとよい。

```main.pyを実行
pipenv run python main.py
```
`python` や `python3` など。


* **連続して動作確認する**   
さらに、ngrokは実行したままでmain.pyを止める。  
つぎにmain.pyをかきかえて（例えば「OK」って返信するように）保存。   
再度、main.pyを実行して動作確認してみると「OK」が返ってくるはず！

## まとめ
毎回herokuにpushしなくてもローカルで動作確認できた。
main.pyを 編集 ⇒ 実行 ⇒ 編集 するだけなので開発がスムーズ。

ただ、**ngrokは実行するたびにURLを変更する**のでngrokを止めるたびにLINEdevelopersのwebhookURLを変更しないといけない。
また、localhostを外部に公開って**セキュリティ的にまずい**気もする（詳しいことはわかりません）。

以上！
## 参考記事
ngrokは安全か危険か、無料か有料か、などいろいろあるみたい。
[webhook周りのアクションをローカルホストで検証](https://qiita.com/SuguruOoki/items/928e524de9ac2cd80d62)
[ngrokが便利すぎる](https://qiita.com/mininobu/items/b45dbc70faedf30f484e)
[少しでも安全にngrokを使用する(Basic認証)](https://qiita.com/da-sugi/items/77f5b9bbbd32d8a79bf3)