Edited at

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

More than 3 years have passed since last update.

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