Edited at

Cloud Functions (Python3)入門用に LINE BOTを作ってみる


はじめに

今回の目的は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を選択

チャネル作成を選んでMessageAPIを選択


チャネル作成完了

チャネル完成


 チャネルの基本設定の確認

以下は後ほどアプリケーション内で使う。


Channel Secretの確認

基本設定 > 基本情報 > Channel Secret


AccessTokenを作成し、確認

基本設定 > メッセージ送受信設定 > AccessToken

チャネル詳細


Cloud Functions


Google Cloud

以下から登録

https://cloud.google.com/

迷うことはないと思いますが、わからなくてもググればいい記事が出てくるはずなので割愛。


Cloud Functionsの作成


  • Cloud Functions API を有効化
    スクリーンショット 2018-12-25 0.29.46.png

  • 作成ボタンを押す
    スクリーンショット 2018-12-25 0.30.23.png

  • 各種項目を設定する

ひとまず以下のようにうめる

項目

名前
(任意)

割り当てられるメモリ
256MB

トリガー
HTTP

URL
(自動)

ソースコード
インラインエディタ

ランタイム
Python3.7

実行する関数
(任意。main.pyの中にある関数を指定)

スクリーンショット 2018-12-25 0.30.55.png

- 項目を埋めたら作成

スクリーンショット 2018-12-25 0.33.38.png


実装

コードはローカルで実装し、git管理して、gcloudコマンドでデプロイしてもいいし、今回くらいの規模なら、直接インラインエディタで書いてもいいかもしれない。


ディレクトリ構造

 project/

    ├ main.py
    └ requirements.txt


Python3での実装

実行される関数をかく


main.py

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 しないといけないものをここに記載する


requirements.txt

# 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コンソールから

スクリーンショット 2018-12-25 0.42.53.png


コマンドから

gcloud functions deploy hogehoge --trigger-http --set-env-vars LINE_CHANNEL_SECRET=123456789qwert123456789qwert,LINE_CHANNEL_ACCESS_TOKEN=123456789qwert


挙動


LINE BOT


友だち追加

チャネル基本設定に「LINEアプリへのQRコード」という項目があるので、

スクリーンショット 2018-12-26 8.24.35.png

それを読み取ると作ったBOTを友だちに追加できる。

IMG_2049.PNG


チャット

追加すると、チャットをはじめられる。

IMG_2050.PNG

今回はオウム返しするサンプルコードを使ったのでこんな感じ。

とりあえずこれで最低限の挙動は確認できた。

IMG_2052.PNG


まとめ

以下の簡単な使い方だけまとめました。

 - LINE Messaging API

 - Google Cloud Functions

 - Python3

やったこととしては、LINEで公開されているサンプルコードにあるオウム返しするアプリを、

Cloud Functions(Python)でうごかしてみた。

基本的にLINEとGoogleの公式ドキュメントが丁寧なので、それを見ていれば問題なさそう。

(特にLINEのドキュメントにはPythonのコードが多いので、Pythonで実装していると楽かもしれない)


参考


展望

今回つくったものを基に、他APIと連携などしてちゃんとしたアプリケーションを作っていく。

Python3は現時点でベータ版なので、今後仕様がいろいろかわるかもしれないが・・・。

(ローカルエミュレータはやく対応してくれ)