LINEbotって1on1ですよね。よくあるボットみたいにグループに加えるって出来ないですかね?
さて、LINE botですがSSLなサーバが必要なところがハードル上げています。
ここはhttpsレディーなGAEでさくっと作っちゃいましょう。
問題は、meg send時にIPを固定する方法ですがここは泥臭くやります。後ほど記述します。
Pythonのライブラリ
flask使いますので、プロジェクトフォルダー内にlib掘ってpipしちゃいましょう
$ pip install -t lib flask
GAEソース
# !/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)
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から返事が来るようになります。

注意
この実装はあくまでチェック用の実装です。
シンプルなテキストのみなので、ビデオだったり画像だったりtypeを変えてみてどうなるか?チェックする程度にしてください。理由は、ある程度のトラフィックさえ捌けないためです。 詳細はコチラをチェック
今後TQ使って非同期に受け流すバージョンを作成する予定です。