GoogleAppEngine/pyでLINE bot作る。シンプル全裸バージョン

  • 47
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

LINEbotって1on1ですよね。よくあるボットみたいにグループに加えるって出来ないですかね?

さて、LINE botですがSSLなサーバが必要なところがハードル上げています。
ここはhttpsレディーなGAEでさくっと作っちゃいましょう。
問題は、meg send時にIPを固定する方法ですがここは泥臭くやります。後ほど記述します。

Pythonのライブラリ

flask使いますので、プロジェクトフォルダー内にlib掘ってpipしちゃいましょう

sh
$ pip install -t lib flask

GAEソース

python

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import urllib
import json
from google.appengine.ext import vendor
vendor.add('lib')
from google.appengine.api import urlfetch

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')
def index():
  return 'hello my line bot'

@app.route('/callback', methods=["POST"])
def linebot():
  args = json.loads(request.get_data().decode('utf-8'))
  logging.debug('kick from line server,\n %s'%(args['result']))
  for msg in args['result']:
    kickBot( msg["content"]["from"], msg["eventType"], msg["content"]["text"] )
  return "{}"

def kickBot(tgt_id, event_type, msg_data):
  url = "https://trialbot-api.line.me/v1/events"
  form_fields = {
      "to": [str(tgt_id)],
      "toChannel": 1383378250,
      "eventType": 138311608800106203,
      "content":{
        "contentType":1,
        "toType":1,
        "text":u"全裸で %s !"%(msg_data)
        }
      }
  logging.debug(form_fields)
  form_data = urllib.urlencode(form_fields)
  result = urlfetch.fetch(
    url=url,
    payload=json.dumps(form_fields,ensure_ascii=False),
    method=urlfetch.POST,
    headers={
                'Content-type':'application/json; charset=UTF-8',
                'X-Line-ChannelID':'<YOUR-ID>',
                'X-Line-ChannelSecret':'<YOUR-SECRET>',
                'X-Line-Trusted-User-With-ACL':'<YOUR-ACL>?',
            }
    )
  if result.status_code == 200:
    logging.debug(result.content)
  else:
    logging.debug(result.content)

yaml
application: <YOUR-GAE-NAME>
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app

LINE botの設定

CallBackの設定

/callback にLINEサーバメッセージを送ってもらうようにします。
https://developers.line.me/channels/<YOUR-CHANNEL-ID>
LINEのDevコンソールでCallback URLに登録しておきます。

https://your-gae.appspot.com:443/callback

Whitelist IPの登録方法

上記GAEアプリをリリースして、botにつぶやいてみましょう。
この時点では返信が来ません。LINEbotサーバに、IPを登録してないからです。
GAEで、公開したアプリ名に紐付いているIPと、urlfetchが実行されるサーバのIPは
同一じゃないため、実際にGAEからLINEbotを叩いてIPを調査する必要があります。

GCPのLoggingコンソールに、そんなIPしらんがな! みたいなエラーが出ていると思います。こんなやつです。

{"statusCode":"427","statusMessage":"Your ip address [今回のアドレス] is not allowed to access this API."}

この 今回のアドレス に出ているIPを、LINEのDevコンソールのWhiteListに登録しちゃいます。何回かやったらいくつか違うのが出るかもしれません。都度登録してください。
私の場合3つほど登録したところで、それ以上増えませんでした。(GAEのバージョン変えたり、デプロイもしています)

これで、botから返事が来るようになります。

スクショ.png

注意

この実装はあくまでチェック用の実装です。
シンプルなテキストのみなので、ビデオだったり画像だったりtypeを変えてみてどうなるか?チェックする程度にしてください。理由は、ある程度のトラフィックさえ捌けないためです。 詳細はコチラをチェック

今後TQ使って非同期に受け流すバージョンを作成する予定です。