LoginSignup
27
29

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-24

はじめに

今回の目的は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は現時点でベータ版なので、今後仕様がいろいろかわるかもしれないが・・・。
(ローカルエミュレータはやく対応してくれ)

27
29
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
29