LINEbotを作成してみる(phpから変更)
ナビゲーションに移動
検索に移動
概要
使用例
flaskから
conf.jsonファイル
{
"CHANNEL_SECRET": "SECRETを入力",
"CHANNEL_ACCESS_TOKEN": "アクセストークンを入力"
}
main
with open('conf.json', 'r', encoding="utf-8") as f:
CONF_DATA = json.load(f)
CHANNEL_ACCESS_TOKEN = CONF_DATA['CHANNEL_ACCESS_TOKEN']
CHANNEL_SECRET = CONF_DATA['CHANNEL_SECRET']
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(CHANNEL_SECRET)
errorHandler = handler
#もしアカウントごとにセッションを保持したければこちらを使っても良い
#簡易的なものだから雑
#たとえば、前の会話を記録して「さっきの話をして」などに対応できる。
class lineUser:
def __init__(self):
self.history = {"name": "ラーメン"}
self.msg = ""
def set(self, user, cmd):
self.history[user] = cmd
def get(self, user):
try:
return self.history.pop(user)
except:
return ""
def log(self,msg):
self.msg = msg
return msg
def getLog(self):
if not(self.msg):
self.msg = '時間内に処理できませんでした。org'
return self.msg
def setLog(self,msg):
self.msg = str(msg)
#個チャかグループかオープンチャットの否を識別させます。
def isEndUserType(self,event,command):
if type(command) == str:
return event.source.type == "user" or (
(event.source.type == "group" or event.source.type == "room") and ("all" == command))
elif command == None:
return event.source.type == "user"
else:
event.source.type == "group" or event.source.type == "room"
linebotUser = lineUser()
@app.route("/api/line/callback", methods=['POST'])
def callback():
try:
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
#body = request.raw_body.decode('utf8')
body = request.get_data(as_text=True)
# 署名を検証、問題なければhandleに定義されている関数を呼び出す
handler.handle(body, signature)
# handle webhook body
except InvalidSignatureError as e:
if debug:
return e, 403
else:
return "参照する権限がありませんでした。", 403
except Exception as e:
try:
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
# 署名を検証、問題なければhandleに定義されている関数を呼び出す
errorHandler.handle(body, signature)
except:
with open("DEBUG.log","a",encoding="utf-8") as f:
f.write("{}\n".format(traceback.format_exc()))
f.write("->'{}'<-\n".format(linebotUser.getLog()))
if debug:
return e, 503
else:
return "APIError: Sorry. try again.", 400
return 'OK'
@errorHandler.add(MessageEvent, message=TextMessage)
def ErrorHandle_message(event):
line_bot_api.reply_message(
event.reply_token, TextSendMessage(text=linebotUser.getLog()))
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token, TextSendMessage(text='ここにメッセージ')
)
@handler.add(MessageEvent, message=ImageMessage)
def handle_image(event):
if lineUser.isEndUserType(event,command=None):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="画像への返信"))
@handler.add(MessageEvent, message=VideoMessage)
def handle_video(event):
if lineUser.isEndUserType(event,command=None):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="動画への返信"))
#LINEスタンプの送信
@handler.add(MessageEvent, message=StickerMessage)
def handle_sticker(event):
# https://developers.line.biz/media/messaging-api/sticker_list.pdf
sticker_ids = []
for i in range(42, 66):
sticker_ids.append(f"165812{i}")
random.shuffle(sticker_ids)
sticker_message = StickerSendMessage(
package_id='8515',
sticker_id=sticker_ids[0]
)
line_bot_api.reply_message(
event.reply_token,
sticker_message
)