「LINEbotを作成してみる(phpから変更)」の版間の差分
ナビゲーションに移動
検索に移動
Sufee Admin (トーク | 投稿記録) ページの作成:「== 概要 == == 使用例 == === flaskから ===」 |
Sufee Admin (トーク | 投稿記録) |
||
(同じ利用者による、間の4版が非表示) | |||
4行目: | 4行目: | ||
=== flaskから === | === flaskから === | ||
==== conf.jsonファイル ==== | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"CHANNEL_SECRET": "SECRETを入力", | |||
"CHANNEL_ACCESS_TOKEN": "アクセストークンを入力" | |||
} | |||
</syntaxhighlight> | |||
==== main ==== | |||
<syntaxhighlight lang="python3"> | |||
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 | |||
) | |||
</syntaxhighlight> | |||
== メッセージのデコレーション == |
2022年2月22日 (火) 15:57時点における最新版
概要
使用例
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
)