この記事は動作確認のたびに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公式サイトの赤いボタンでzipファイルをダウンロード
次に以下のコマンドで解凍〜version確認までを行います
cd ~/Downloads
unzip ngrok-stable-linux-amd64.zip
sudo cp ngrok /usr/bin/
ngrok version
これでngrokが使えるようになりました。実際に使うときは
ngrok http [port番号]
でローカルサーバーの[port番号]が外部に公開されます。
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ってファイルをプロジェクト配下につくっていつもの2つをLINEdevelopersからコピペしてくる(' とか " とか一切つけない、そのまま)。
.envは環境変数を設定するファイルなのでGitHubとかにはpushしてはいけない。pushしないためには.gitignoreってファイルの使い方とかを調べてください。
LINE_CHANNEL_ACCESS_TOKEN = ☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓
LINE_CHANNEL_SECRET = ☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓☓
・main.pyを走らせる
ターミナルを2つ用意して、片方でもう一度ngrokを実行する。
(ngrokは実行するたびに異なったURLを紐つけるので、さっきと値は変わっているはず)。
それを実行したままで、LINEdevelopersのwebhookURLを
https://☓☓☓☓☓☓☓☓.ngrok.io/callback
に設定する(httpsであること!)。
最後にもう一つのターミナルで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
を自分の環境にあったものに変更するとよい。
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周りのアクションをローカルホストで検証
ngrokが便利すぎる
少しでも安全にngrokを使用する(Basic認証)