GoogleAppEngine/py에서 LINE bot 만든다. 심플 알몸 버전
그런데, 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)
yamlapplication: <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를 사용하여 비동기적으로 받아들이는 버전을 만들 예정입니다.
Reference
이 문제에 관하여(GoogleAppEngine/py에서 LINE bot 만든다. 심플 알몸 버전), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/atusi/items/225d51692794ecd59a06
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ pip install -t lib flask
파이썬
#!/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를 사용하여 비동기적으로 받아들이는 버전을 만들 예정입니다.
Reference
이 문제에 관하여(GoogleAppEngine/py에서 LINE bot 만든다. 심플 알몸 버전), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/atusi/items/225d51692794ecd59a06
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
{"statusCode":"427","statusMessage":"Your ip address [今回のアドレス] is not allowed to access this API."}
이 구현은 어디까지나 체크용의 구현입니다.
간단한 텍스트뿐이므로, 비디오이거나 이미지이거나 type을 바꾸어 보면 어떻게 될까? 체크하는 정도로 해 주세요. 그 이유는 어느 정도의 트래픽조차도 불가능하기 때문입니다. 자세한 것은 이쪽을 체크
앞으로 TQ를 사용하여 비동기적으로 받아들이는 버전을 만들 예정입니다.
Reference
이 문제에 관하여(GoogleAppEngine/py에서 LINE bot 만든다. 심플 알몸 버전), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/atusi/items/225d51692794ecd59a06텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)