LoginSignup
48
44

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-12

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使って非同期に受け流すバージョンを作成する予定です。

48
44
0

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
48
44