GoogleAppEngine/py에서 LINE bot 만든다. 심플 알몸 버전

LINEbot은 1on1군요. 흔한 봇처럼 그룹에 추가할 수 없습니까?

그런데, LINE bot입니다만 SSL인 서버가 필요한 곳이 허들 올리고 있습니다.
여기는 https 레이디한 GAE로 빨리 만들어 버립시다.
문제는 meg send에서 IP를 고정하는 방법입니다. 나중에 설명하겠습니다.

파이썬 라이브러리



flask 사용하므로 프로젝트 폴더에 lib 파고 pip 버리자

sh
$ 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)


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 앱을 출시하고 봇에 중얼거려 보세요.
이 시점에서는 답장이 오지 않습니다. 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를 사용하여 비동기적으로 받아들이는 버전을 만들 예정입니다.

좋은 웹페이지 즐겨찾기