Llama-2が登場!8bit+LoRAでRLHFファインチューニングを試す方法はこちら

【LINE Messaging API】Pythonでクイックリプライを簡単に作成!クイックリプライを使った簡単なLINEbotアプリも作ってみた!コピペするだけで作れる!

今回は、何かと便利なクイックリプライをpythonで作る方法を説明します。また、クイックリプライを使った簡単なLINEBOTアプリを作ったので参考にしてください。では、さっそくクイックリプライの簡単な作成方法を解説します。

目次

クイックリプライの作成

クイックリプライは関数として定義すると管理が簡単です。

def make_quick_reply(token, text):
    items = []
    items.append(QuickReplyButton(action=PostbackAction(label='start', data='start')))
    items.append(QuickReplyButton(action=PostbackAction(label='end', data='end')))
    messages = TextSendMessage(text=text,
                            quick_reply=QuickReply(items=items))
    line_bot_api.reply_message(token, messages=messages)

itemsにクイックリプライを追加していくイメージです。13個まで追加できます。アクションについては、ポストバックアクション以外にも利用可能です。詳しくはこちらをご覧ください。

定義した関数を適切な場所で呼び出すとクイックリプライを表示することができます。

例えば次のような場所です。

from flask import Flask, request, abort
import os
import random
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    TextSendMessage,
    PostbackEvent,FollowEvent,
    QuickReply, QuickReplyButton
)
from linebot.models.actions import PostbackAction
import dotenv

app = Flask(__name__)
dotenv.load_dotenv("./info/.env")
line_bot_api = LineBotApi(os.environ["CHANNEL_ACCESS_TOKEN"])
handler = WebhookHandler(os.environ["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(FollowEvent)
def on_follow(event):
    # quick replyを表示する
    make_quick_reply(event.reply_token, text="クイックリプライを表示しています。")

# クイックリプライを表示するための関数
def make_quick_reply(token, text):
    items = []
    items.append(QuickReplyButton(action=PostbackAction(label='start', data='start')))
    items.append(QuickReplyButton(action=PostbackAction(label='end', data='end')))
    messages = TextSendMessage(text=text,
                            quick_reply=QuickReply(items=items))
    line_bot_api.reply_message(token, messages=messages)

if __name__ == '__main__':
    port = int(os.getenv("PORT", 8000))
    app.run(host="0.0.0.0", port=port, debug=True)

トークンは次のように.envファイルで管理すると便利です。

CHANNEL_ACCESS_TOKEN=ここにチャンネルアクセストークンを入力してください
CHANNEL_SECRET=ここにチャンネルシークレットを入力してください

それぞれのファイルは次のような階層にしてください。

├─app.py
└─ info
    └─.env

上手くいくと友達登録したときに次のようなメッセージとともにクイックリプライが表示されます。

じゃんけんbotの作成方法

では、クリックリプライを使った簡単なじゃんけんbotを作ったので見ていきましょう。

コード全体

まずはコード全体を載せておきます。

from flask import Flask, request, abort
import os
import random
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    TextSendMessage,
    PostbackEvent,FollowEvent,
    QuickReply, QuickReplyButton
)
from linebot.models.actions import PostbackAction
import dotenv
app = Flask(__name__)
dotenv.load_dotenv("./info/.env")
line_bot_api = LineBotApi(os.environ["CHANNEL_ACCESS_TOKEN"])
handler = WebhookHandler(os.environ["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(FollowEvent)
def on_follow(event):
    make_home_screen(event.reply_token, text="私はじゃんけんbotです。\nさっそくじゃんけんを始めよう!")
# postback messageが返された時のアクション
@handler.add(PostbackEvent)
def on_postback(event):
    postback_msg = event.postback.data
    bot_hand = get_random_hand()
    player_hand = postback_msg
    result = win_draw_lose(bot_hand, player_hand)
    if postback_msg == "start":
        rock_paper_scissors(event.reply_token, text="じゃんけーん...")
    elif result == "draw":
        rock_paper_scissors(event.reply_token, text=f"bot:{bot_hand}\nyou:{player_hand}\n引き分けなのでもう一度です。\nじゃんけん...")
    elif result == "win":
        make_home_screen(event.reply_token, text=f"bot:{bot_hand}\nyou:{player_hand}\nあなたの勝ちです。")
    else:
        make_home_screen(event.reply_token, text=f"bot:{bot_hand}\nyou:{player_hand}\nあなたの負けです。")
# ランダムでじゃんけんの手を決める
def get_random_hand():
    return random.choice(["グー", "パー", "チョキ"])
# 手に対して勝ち、引き分け、負けを判断する
def win_draw_lose(bot_hand, player_hand):
    if bot_hand == player_hand:
        return "draw"
    elif ((bot_hand == "グー") and (player_hand == "パー")) or ((bot_hand == "パー") and (player_hand == "チョキ")) or ((bot_hand == "チョキ") and (player_hand == "グー")):
        return "win"
    else:
        return "lose"
# じゃんけんの手をクイックリプライで出す
def rock_paper_scissors(token, text):
    items = []
    items.append(QuickReplyButton(action=PostbackAction(label='グー', data='グー')))
    items.append(QuickReplyButton(action=PostbackAction(label='パー', data='パー')))
    items.append(QuickReplyButton(action=PostbackAction(label='チョキ', data='チョキ')))
    messages = TextSendMessage(text=text,
                            quick_reply=QuickReply(items=items))
    line_bot_api.reply_message(token, messages=messages)
# じゃんけんを始める前のクイックリプライを表示する関数
def make_home_screen(token, text):
    items = []
    items.append(QuickReplyButton(action=PostbackAction(label='じゃんけんを始める', data='start')))
    messages = TextSendMessage(text=text,
                            quick_reply=QuickReply(items=items))
    line_bot_api.reply_message(token, messages=messages)
if __name__ == '__main__':
    port = int(os.getenv("PORT", 8000))
    app.run(host="0.0.0.0", port=port, debug=True)

じゃんけんbotの流れ

友達登録されると次のようなメッセージとクイックリプライが届きます。

では、「じゃんけんを始める」ボタンを押してみます。すると次のように「グー」「パー」「チョキ」を選べるクイックリプライが出てきました。

では、「パー」を押してみましょう。

勝つことができました。そして、「じゃんけんを始める」を押すとまたじゃんけんをすることができます。

引き分けの場合は、もう一度じゃんけんが始まります。

以上がじゃんけんbotの流れになります。

コードの説明

次のコードの部分でじゃんけんの手をクイックリプライで表示できるようにしています。

# じゃんけんの手をクイックリプライで出す
def rock_paper_scissors(token, text):
    items = []
    items.append(QuickReplyButton(action=PostbackAction(label='グー', data='グー')))
    items.append(QuickReplyButton(action=PostbackAction(label='パー', data='パー')))
    items.append(QuickReplyButton(action=PostbackAction(label='チョキ', data='チョキ')))
    messages = TextSendMessage(text=text,
                            quick_reply=QuickReply(items=items))
    line_bot_api.reply_message(token, messages=messages)

次のコードの部分はじゃんけんを始めるためのクイックリプライを表示する関数です。

# じゃんけんを始めるためのクイックリプライを表示する関数
def make_home_screen(token, text):
    items = []
    items.append(QuickReplyButton(action=PostbackAction(label='じゃんけんを始める', data='start')))
    messages = TextSendMessage(text=text,
                            quick_reply=QuickReply(items=items))
    line_bot_api.reply_message(token, messages=messages)

その他の機能については、コピーしたり改変したりして確認してみましょう。

最後に

今回はクイックリプライの使い方を説明しました。

リッチメニューの作り方
あわせて読みたい
【LINE Messaging API】簡単!PythonでLINEのリッチメニューを簡単に作成! PythonでLINEのリッチメニューを作りたいという方は多いのではないでしょうか。しかし、こちらのgithubや他の記事を参考にしてみてもよく分からない方もいると思います。で今回は、classで機能をまとめることはせずにいろいろと説明していきます。
カルーセルメッセージの作り方
あわせて読みたい
【LINE Messaging API】Pythonでカルーセルメッセージは簡単に作れる!10個より多く表示させたい場合... 皆さんはカルーセルメッセージをどのように使っているでしょうか。例えば、なにか検索した結果をラインで表示できるようにするために使うなど様々な使い方がありますよね。ではさっそく基本的なPythonでカルーセルメッセージを作成していきます。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次