LINEbotを作成してみる(phpから変更)

提供:sufeeWiki
ナビゲーションに移動 検索に移動

概要

使用例

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
    )

メッセージのデコレーション