Cloud Functions (Python3)入門用に LINE BOTを作ってみる #GoogleCloud - Qiita
28
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Google Cloud Platform その1Advent Calendar 2018

Day 24

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

28
30
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
28
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?