1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

API Lab for LINE WORKSAdvent Calendar 2024

Day 8

一問一答形式の LINE WORKS Bot を Flask + Cloudflare Tunnel で実行してみる

Last updated at Posted at 2024-12-07

LINE WORKS Bot を使った一問一答形式の対話アプリ構築

この記事では、LINE WORKS Bot API を使用して、一問一答形式の対話アプリを構築する方法を解説します。Google Colab を活用して簡単にセットアップできる手順をご紹介します。

以下の URL で Google Colab を使って簡単に試せます。
Google Colab で試す

必要な準備

1. LINE WORKS Developer Console の設定

  • Bot ID の取得: Bot を作成し、Bot ID を取得します。
  • 認証情報の確認: Client ID, Client Secret, Bot Secret を確認します。
  • Callback URL設定: スクリプト実行後に Bot の Callback URL を設定します。

2. Google Colab 環境の準備

  • Google Colab のノートブックを開き、以下のスクリプトを実行します。

スクリプト

以下は、一問一答形式の対話アプリの構築に必要な Google Colab スクリプトです。各質問や認証情報は、パラメータとして指定可能です。

# 必要なライブラリのインストール(既にインストール済みならスキップされます)
!pip install requests flask

# Cloudflareトンネルツールをダウンロード、設定(既にダウンロード済みならスキップ)
!wget -N https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
!chmod +x cloudflared-linux-amd64

from flask import Flask, request, jsonify
import threading
import subprocess
import requests
import asyncio

# 認証情報の設定(Google Colab のパラメータ形式で入力)
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"  # @param {type:"string"}
BOT_ID = 2000001  # @param {type:"integer"}
QUESTIONS = [
    "質問1: 最初の質問内容はこちら",  # @param {type:"string"}
    "質問2: 次の質問内容はこちら",  # @param {type:"string"}
    "質問3: 三番目の質問内容はこちら",  # @param {type:"string"}
    "質問4: 四番目の質問内容はこちら",  # @param {type:"string"}
    "質問5: 最後の質問内容はこちら"  # @param {type:"string"}
]

# ユーザーごとの進行状況と回答を管理
user_progress = {}
user_responses = {}

def get_next_question(user_id, user_response=None):
    if user_response is not None:
        user_responses.setdefault(user_id, []).append(user_response)
    question_index = user_progress.get(user_id, 0)
    if question_index < len(QUESTIONS):
        next_question = QUESTIONS[question_index]
        user_progress[user_id] = question_index + 1
        return next_question
    else:
        responses = "
".join(f"回答{idx + 1}: {response}" for idx, response in enumerate(user_responses[user_id]))
        user_progress.pop(user_id, None)
        user_responses.pop(user_id, None)
        return f"質問は全て終了しました!

あなたの回答:
{responses}"

def send_message(user_id, message):
    url = f"https://www.worksapis.com/v1.0/bots/{BOT_ID}/users/{user_id}/messages"
    headers = {"Authorization": f"Bearer {ACCESS_TOKEN}", "Content-Type": "application/json"}
    body = {"content": {"type": "text", "text": message}}
    requests.post(url, headers=headers, json=body)

async def handle_message(event):
    user_id = event["source"]["userId"]
    user_message = event["content"]["text"]
    response_message = get_next_question(user_id, user_message)
    if response_message:
        send_message(user_id, response_message)

app = Flask(__name__)

@app.route('/callback', methods=['POST'])
def callback():
    event = request.json
    asyncio.run(handle_message(event))
    return jsonify({'status': 'ok'}), 200

def run():
    app.run(host='0.0.0.0', port=5000)

thread = threading.Thread(target=run)
thread.start()

!./cloudflared-linux-amd64 tunnel --url http://127.0.0.1:5000

実行結果

  • 起動成功時:

    Your quick Tunnel has been created! Visit it at:
    https://example-tunnel.trycloudflare.com/callback
    
  • Bot の動作例:

    1. ユーザーがメッセージを送信すると、質問が進行します。
    2. 質問がすべて完了すると、回答がまとめて返されます。

まとめ

このスクリプトを使用すれば、一問一答形式の対話アプリを簡単に構築できます。LINE WORKS Bot を活用して、カスタマイズ可能な質問フローを実現しましょう!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?