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

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

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

以下の URL で Google Colab を使って簡単に試せます。  
[Google Colab で試す](https://colab.research.google.com/drive/1jrUhPNDSJheEzM33shg_nvFtMSzDuKvN?usp=sharing)

## 必要な準備

### 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 スクリプトです。各質問や認証情報は、パラメータとして指定可能です。

```python
# 必要なライブラリのインストール（既にインストール済みならスキップされます）
!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 を活用して、カスタマイズ可能な質問フローを実現しましょう！