#はじめに
今回の目的はLINE BOTの下地をCloud Functions(GCF)を使って作ること。
言語としては、最近サポートされはじめたPython3を使用する。
LINEで公開しているサンプルコードにあるオウム返しするアプリを、Cloud Functionsでうごかしてみる。
#今回つかってみるもの
- LINE Messaging API
- Google Cloud Functions
- Python3
#準備
## LINE BOT
### LINE Developersへ登録
以下のURLからLINE Developersへサインアップ
https://developers.line.biz/ja/
###プロバイダーとチャネルの作成
プロバイダーとチャネルという概念があるが、
####プロバイダーを作成
####チャネル作成を選び、MessageAPIを選択
####チャネル作成完了
#### チャネルの基本設定の確認
以下は後ほどアプリケーション内で使う。
#####Channel Secretの確認
基本設定 > 基本情報 > Channel Secret
#####AccessTokenを作成し、確認
基本設定 > メッセージ送受信設定 > AccessToken
##Cloud Functions
###Google Cloud
以下から登録
https://cloud.google.com/
迷うことはないと思いますが、わからなくてもググればいい記事が出てくるはずなので割愛。
###Cloud Functionsの作成
- Cloud Functions API を有効化
ひとまず以下のようにうめる
項目 | 値 |
---|---|
名前 | (任意) |
割り当てられるメモリ | 256MB |
トリガー | HTTP |
URL | (自動) |
ソースコード | インラインエディタ |
ランタイム | Python3.7 |
実行する関数 | (任意。main.pyの中にある関数を指定) |
#実装
コードはローカルで実装し、git管理して、gcloudコマンドでデプロイしてもいいし、今回くらいの規模なら、直接インラインエディタで書いてもいいかもしれない。
##ディレクトリ構造
project/
├ main.py
└ requirements.txt
##Python3での実装
実行される関数をかく
import os
import base64, hashlib, hmac
import logging
from flask import abort, jsonify
from linebot import (
LineBotApi, WebhookParser
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage
)
def main(request):
channel_secret = os.environ.get('LINE_CHANNEL_SECRET')
channel_access_token = os.environ.get('LINE_CHANNEL_ACCESS_TOKEN')
line_bot_api = LineBotApi(channel_access_token)
parser = WebhookParser(channel_secret)
body = request.get_data(as_text=True)
hash = hmac.new(channel_secret.encode('utf-8'),
body.encode('utf-8'), hashlib.sha256).digest()
signature = base64.b64encode(hash).decode()
if signature != request.headers['X_LINE_SIGNATURE']:
return abort(405)
try:
events = parser.parse(body, signature)
except InvalidSignatureError:
return abort(405)
for event in events:
if not isinstance(event, MessageEvent):
continue
if not isinstance(event.message, TextMessage):
continue
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text)
)
return jsonify({ 'message': 'ok'})
pip install しないといけないものをここに記載する
# Function dependencies, for example:
# package>=version
line-bot-sdk
##Cloud Functionsのローカルエミュレータについて
残念ながら、Python3は対応していないので割愛
##Cloud Functions へデプロイ
gcloud functions deploy hogehoge --trigger-http
## Cloud Functions の環境変数の設定
上述したように、チャネル設定を確認し、
Channel SecretをLINE_CHANNEL_SECRET
として
AccessTokenをLINE_CHANNEL_ACCESS_TOKEN
として設定する。
Cloudコンソールから
###コマンドから
gcloud functions deploy hogehoge --trigger-http --set-env-vars LINE_CHANNEL_SECRET=123456789qwert123456789qwert,LINE_CHANNEL_ACCESS_TOKEN=123456789qwert
#挙動
##LINE BOT
###友だち追加
チャネル基本設定に「LINEアプリへのQRコード」という項目があるので、
今回はオウム返しするサンプルコードを使ったのでこんな感じ。
とりあえずこれで最低限の挙動は確認できた。
#まとめ
以下の簡単な使い方だけまとめました。
- LINE Messaging API
- Google Cloud Functions
- Python3
やったこととしては、LINEで公開されているサンプルコードにあるオウム返しするアプリを、
Cloud Functions(Python)でうごかしてみた。
基本的にLINEとGoogleの公式ドキュメントが丁寧なので、それを見ていれば問題なさそう。
(特にLINEのドキュメントにはPythonのコードが多いので、Pythonで実装していると楽かもしれない)
#参考
- https://developers.line.biz/ja/reference/messaging-api/
- https://cloud.google.com/functions/docs/concepts/python-runtime
#展望
今回つくったものを基に、他APIと連携などしてちゃんとしたアプリケーションを作っていく。
Python3は現時点でベータ版なので、今後仕様がいろいろかわるかもしれないが・・・。
(ローカルエミュレータはやく対応してくれ)