LINE messageAPI richmenu 소기

소개



회사의 후배로부터, LINE의 messageAPI를 사용해 약간의 접수 BOT같은 것을
만들 수 없는가와 상담되어, 만들고 있을 때 생각해 낸 richmenu의 소기입니다. (큰 일은 없지만)

문서 안에 있는 아래의 한 문장으로 생각해 냈습니다(즉시 반영되는 거~)



전제



・BOT가 이미 있다(Flask로 짜고 있다)

코드



main.py
# -*- coding: utf-8 -*-

#  Licensed under the Apache License, Version 2.0 (the "License"); you may
#  not use this file except in compliance with the License. You may obtain
#  a copy of the License at
#
#       https://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#  License for the specific language governing permissions and limitations
#  under the License.

import os
import sys
from argparse import ArgumentParser

from flask import Flask, request, abort,render_template,redirect,url_for
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,FollowEvent,UnfollowEvent,CarouselTemplate, CarouselColumn,URIAction,PostbackAction,MessageAction,TemplateSendMessage,ConfirmTemplate,PostbackEvent,StickerMessage, StickerSendMessage, LocationMessage,LocationSendMessage,ImageMessage, VideoMessage, AudioMessage, FileMessage)



import os
import time

def richmenu(userID):

    r=YOUR_richmenuId_1
    default=YOUR_richmenuId_2


    line_bot_api.link_rich_menu_to_user(userID,r)
    time.sleep(1)
    line_bot_api.link_rich_menu_to_user(userID,default)

app = Flask(__name__)

line_bot_api = LineBotApi('YOUR_LINE_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_LINE_CHANNEL_SECRET')


@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: "+body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(PostbackEvent)
def handle_postback(event):
    profile=line_bot_api.get_profile(event.source.user_id)
    userID=event.source.user_id
    name=profile.display_name
    url="https://api.line.me/v2/bot/message/push"
    if (event.postback.data=="r"):
        richmenu(userID)

    else:
        line_bot_api.reply_message(event.reply_token,TextSendMessage(text="Check"))
        pass

if __name__=="__main__":
    app.debug=True
    app.run(host="0.0.0.0")


richmenu



rich.sh
 curl -v -X POST https://api.line.me/v2/bot/richmenu \
  -H 'Authorization: Bearer YOUR_LINE_CHANNEL_ACCESS_TOKEN' \
  -H 'Content-Type:application/json' \
  -d \
  '{
    "size":{
        "width":2500,
        "height":843
    },
    "selected":true,
    "name":"default2",
    "chatBarText":"menu",
    "areas":[
        {
          "bounds":{
              "x":91,
              "y":258,
              "width":430,
              "height":583
          },
          "action":{
              "type":"postback",
              "data":"r"
          }
        },
        {
          "bounds":{
              "x":697,
              "y":258,
              "width":430,
              "height":583
          },
          "action":{
              "type":"postback",
              "data":"b"
          }
        },
        {
          "bounds":{
              "x":1303,
              "y":258,
              "width":430,
              "height":583
          },
          "action":{
              "type":"postback",
              "data":"w"
          }
        },
        {
          "bounds":{
              "x":1909,
              "y":258,
              "width":430,
              "height":583
          },
          "action":{
              "type":"postback",
              "data":"s"
          }
        }
       ] 
  }'


이미지



default





r





설명



richmenu의 왼쪽 가장자리에 있는 아이콘을 탭하면 postback에서 'r'을 보낼 수 있습니다.
(※richmenu로부터의 데이터 송신은 postback으로 하는 것이 여분의 메시지가 토크 화면에 나오지 않기 때문에 좋을까라고 생각합니다)

postback을 수신하면 보내준 사용자의 richmenu를 YOUR_richmenuId_1(이미지는 r)에 등록된 것으로 합니다.
1 초 후에 YOUR_richmenuId_2 (이미지가 default)로 변경됩니다.

그러면 탭되면 그 탭된 부분의 아이콘이 움직인 것 같은 표현이 됩니다.

마지막으로



LINEBot은 만들어 보면 재미 있습니다! (UI를 생각하지 않아도 되므로)

또 하나 아무래도 좋은 소기 (기술이라고 할 정도의 것도 아닙니다만)는, 레퍼런스에는 캐러셀 템플릿의
썸네일은 jpeg나 png로 있습니다만 GIF의 URL을 지정해도 괜찮은 것 같습니다(webkit 사용하고 있기 때문일까.richmenu의 이미지도 어쩌면
GIF라도 좋을까)

좋은 웹페이지 즐겨찾기