Skip to content

Instantly share code, notes, and snippets.

@sanoyo
Last active December 8, 2019 11:27
Show Gist options
  • Save sanoyo/ea4dd620b7de0aeeff105d90c6268d30 to your computer and use it in GitHub Desktop.
Save sanoyo/ea4dd620b7de0aeeff105d90c6268d30 to your computer and use it in GitHub Desktop.
Line bot Beacon開発手順

実施手順

Python 環境構築

pkgから3.6.8のバージョンをインストール pkgファイルからのインストール方法

Python3.6.8のインストール場所を確認 which python

pip3をインストールするために、brewでpythonをインストール brew install python

virtualenvインストール pip3 install virtualenv

仮想環境作成 virtualenv --python=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 env

バージョン確認 python

下記であれば問題ない

Python 3.6.8 (v3.6.8:3c6b436a57, Dec 24 2018, 02:04:31)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

仮想環境の中に入る source bin/activate

Python3インストール(Mac編)

Lineアカウント登録

実施することは、下記3点

  • Line Developerアカウント作成
  • チェンネル作成
  • bot作成

下記手順にしたがって、「Flaskを使ってLINE botを作成」まで進める。 FlaskでLINE botを実装し,herokuにdeployするまで

Line Bot環境構築

以下から仮想環境ないに入った状態とする。

$ pip install flask 
$ pip install line-bot-sdk
$ brew cask install ngrok

使用するSDK:line-bot-sdk-python homebrew-caskとは

環境変数を使用する

pip3 install python-dotenv Flaskにおける設定ファイルのベストプラクティス 【GitHub】に載せたくない環境変数の書き方 Python

実装のテスト

Flaskが動いているかのテスト

app.pyに下記を追記し、ルートパスにアクセスし、hello world!が表示されることを確認する。

@app.route("/")
def hello_world():
    return "hello world!"

flask実行コマンド flask run --host=0.0.0.0

ngrokをしようする際のテスト

Lineのテストを行う場合には、Webhookにテスト用のURLを入力する必要がある。 この際、httpsのYRLが必須になり、その時に便利なのが、ngrok

ngrokがやっていること

httepsでローカルの開発を公開することができます。 詳しくは下記で確認してみてください。
ngrokが便利すぎる

実施すること

下記2つを実行する flask run --host=0.0.0.0 ngrok http 5000

注意事項

※ngrokのアドレスは、起動するたびに変更される。

Heroku でのログイン

$ brew install heroku/brew/heroku

# ブラウザが表示されるので、そこでログイン
$ heroku login

Herokuへデプロイする

必要なファイルの準備

下記3つを新規で作成する

  1. requirements.txt
    今仮想環境に入れているバージョンをfeezeを使って、requirements.txtに書き出します。 Python, pip list / freezeでインストール済みパッケージ一覧を確認

  2. runtime.txt
    Pythonのバージョンを記載する。

  3. Procfile

web: gunicorn app:app --log-file -

WSGI について Rails開発におけるwebサーバーとアプリケーションサーバーの違い(翻訳)

NginxはリクエストをUnicornに渡します。
UnicornはリクエストをRackに渡します。
RackはリクエストをRailsのrouterに渡します。
routerはリクエストを適切なcontrollerに渡します。
そしてレスポンスが逆の順番で返されます。

Heroku アプリケーション作成

heroku create [app名]

herokuにコードをpush

git push heroku master

herokuは、git感覚で使えば良い。

Heroku Config

# 環境変数一覧
$ heroku config

# 環境変数追加
$ heroku config:set ENV_NAME=value

【herokuコマンド】環境変数

Heroku環境にssh

heroku run bash Heroku コマンド集

ビーコンの実装

下記を実装することで、Beacon Event発生時になんのアクションを行うかを定義することができる。 イベントを変更する場合は、@handler.add(BeaconEvent)の引数(BeaconEvent)を変更する。 なので、下記のプログラムはイベント後をどのようにハンドルするかを記載する。 イベント発生条件は、Line側で実装されている。

# Beaconイベント発火
@handler.add(BeaconEvent)
def handle_beacon(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text='Hello World'))

デコレータ

上記の実装は、デコレータを使用しています。

デコレーターを使うことで、ライブラリとして提供されている関数を呼んだときに自動的に実行される処理を付加できるということになります。 Pythonのデコレータについて

処理の順番

handler = WebhookHandler(channel_secret)

# WebhookHandlerクラスをchannel_secretで初期化
handler.handle(body, signature)

## handleメソッドの挙動
# WebhookHandlerクラスのhandleメソッド実行
# WebhookParserクラスのparseメソッド実行
# bodyにeventが入っているので、eventsにappendし、eventsを返す
# eventsをfor文で回す

## decoratorの挙動
# addメソッドが呼ばれる
# decoratorを返す
# この時に,app.pyで実装している handle_messageメソッドが呼ばれる
# decoratorメソッドのなかで、__add_handlerメソッドが呼ばれて、_handlersとかにvalueがはいる

# WebhookHandlerクラスのaddメソッドがデコレートされており、decoratorが呼ばれる
# __add_handler呼ばれる


[わからないところ]
どこでaddメソッドが実行されているのかわからない
handle_messageメソッドを呼ばずとも実行できているのでhandleメソッドのどこで実行されているかわからない

SQLAlchemyを設定する

下記が参考になる。 Flask + SQLAlchemyプロジェクトを始める手順

Flaskのマイグレーション

モデルファイルからマイグレーションファイルを自動生成してくれる。 Flask-Migrateに関して自分の言葉で

マイグレーション追加時(既存のスキーマを変更する場合)

ローカルでの実行

# データベースのリビジョンを、マイグレーションを実行せずに、引数として指定されたリビジョンに設定します。
$ flask db stamp head
$ flask db migrate
$ flask db upgrade

Herokuへの実行

heroku run FLASK_APP=app.py flask db stamp head
heroku run FLASK_APP=app.py flask db migrate
heroku run FLASK_APP=app.py flask db migrate

Flask-Migrate

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment