第三章:進化したLine体験 - 美しいバブルカードの実装(Flex Message)
もしあなたの打刻システムが、従業員の打刻後に「打刻成功」という味気ないメッセージしか返さないなら、それは大学生の期末レポートレベルの出来映えです。このような簡素なインターフェースでは、有料顧客(伝統産業のオーナー)を惹きつけることは絶対にできません。
Lineは、非常に強力で、ある意味変態的なUI機能を提供しています。それが**Flex Message(図文バブルカード)**です。 これは純粋なJSONで書かれたレイアウト言語で、チャットルーム内に高解像度画像、グラデーション背景、インタラクティブボタン、複雑なグリッドレイアウトを持つ「美しいカード」を送信できます!そのクオリティはネイティブアプリの画面に匹敵します。
🎯 本章の目標
- Line公式の秘密兵器「Flex Message Simulator」の操作を習得する。
- Vibe Promptの「コード変換術」を使って、長大なJSONをPythonコードに簡単変換する。
- ユーザーが打刻成功時に、従業員名・打刻時間・美しいデザインを含む「打刻情報カード」を返信する機能を実装する。
🎨 ステップ1:カードシミュレーターでデザインを作成
複雑なJSONの括弧を頭で想像しながら手書きするようなことは決してしません。それは命取りになります。 Line公式は、非常に優れたWYSIWYG(見たまま編集可能)のウェブベースドラッグツールを提供しています。
**Line Flex Message Simulator(カードシミュレーター)**にアクセスしてください。
これは非エンジニア向けに設計されたUIツールです。
- 画面右上の**Showcase(展示ショーケース)**をクリック。
- 公式が提供する多くの高品質なテンプレート(電子領収書、レストラン紹介、イベントチケットなど)が表示されます。
- 気に入ったテンプレート(例えば領収書風のもの)を選択。
- 画面右側のプロパティパネルで、Wordを使うようにテキストを変更したり、色を変えたり、画像を打刻システムのロゴに差し替えたりできます。
左側のプレビュー画面でカードが100%満足いく状態になったら、右上の**</> View JSON**ボタンをクリック。 長大な(100行に及ぶこともある)JSONコードが表示されるので、すべて選択してコピーしてください!

🪄 ステップ2:AIにJSONをPython関数に変換してもらう
この長くて複雑な、引用符だらけのJSON文字列をFastAPIのmain.pyに直接貼り付けると、コードが肥大化してメンテナンスが困難になります。
Line Bot SDKはFlexSendMessage、BubbleContainer、BoxComponentなどのPythonクラスを提供していますが、その書き方は非常に冗長です。
ここで最も賢くエレガントな解決策は:AIを翻訳官にして、JSONを辞書(Dictionary)として扱うことです!
🔥【Vibe Prompt実践呪文】
Python Line Botを開発中です。Flex Simulatorからコピーした以下のJSONをご覧ください:(100行のJSONコードを貼り付け)
独立したPython関数を作成してください:def create_punch_card(user_name: str, punch_time: str, status: str):この関数の責務は:1. 上記JSONをPythonのdict変数(bubble_dictという名前にする)に入れる。2. dict内の固定値「人員名称」をuser_name変数に、「打刻時間」をpunch_timeに置き換える。3. line-bot-sdk v3のFlexMessageクラスを使って、このdictをFlexMessageオブジェクトに変換してreturnする。4. (重要)alt_textは「新しい打刻記録があります!」と設定する。
AIは即座に静的なJSONを、動的変数を含むPython関数に変換してくれます。このテクニックは非常に強力です!
from linebot.v3.messaging import FlexMessage
def create_punch_card(user_name: str, punch_time: str, status: str):
# AIが長いJSONをクリーンなPython Dictionaryに変換
bubble_dict = {
"type": "bubble",
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{ "type": "text", "text": f"打刻成功 {status} ✅", "weight": "bold", "size": "xl", "color": "#1DB446" },
{ "type": "text", "text": f"従業員名:{user_name}", "margin": "md" },
{ "type": "text", "text": f"記録時間:{punch_time}", "color": "#888888" }
]
}
}
# dictをLineサーバーが理解できるFlexMessageオブジェクトにラップ
return FlexMessage(
alt_text="新しい打刻記録があります!",
contents=bubble_dict
)
🚀 ステップ3:Webhookでこのカードを発射!
main.pyのメッセージ処理を行うWebhook関数に戻り、つまらないプレーンテキスト(TextMessage)を返していた部分を、先ほど作成した豪華なカード関数の呼び出しに置き換えます!
from your_module import create_punch_card # 別ファイルに書いたと仮定
@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
# ...Supabaseデータベースへの書き込みロジック...
# 1. カードジェネレーターを呼び出し、実際の動的データを挿入
import datetime
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
flex_msg = create_punch_card(
user_name="王小明(テスター)",
punch_time=current_time,
status="[出勤]"
)
# 2. この美しいFlexカードをモバイル端末に返信
with ApiClient(configuration) as api_client:
line_bot_api = MessagingApi(api_client)
line_bot_api.reply_message_with_http_info(
ReplyMessageRequest(
reply_token=event.reply_token,
messages=[flex_msg] # ここがflex_msgに変更されている点に注意
)
)
💼 [ビジネス応用シナリオ] Alt Textを活用して開封率向上
上記のコードでalt_text="新しい打刻記録があります!"という設定に気づきましたか?
これは非常に重要なマーケティングの細部です。
LineボットがこのFlexカードをユーザーにプッシュ通知する際、ユーザーの携帯がロック画面状態だったり、チャットリスト画面にある場合、Lineはカード全体を表示できないため、代わりにこのalt_textを表示します。
もしalt_text="flex message"などと適当に書いてしまうと、クライアントの携帯には「ボットがflex messageを送信しました」と表示され、これは完全に詐欺のように見えてしまいます。クリックされることはないでしょう。
alt_textには、好奇心をそそる、またはクリックしたくなるようなコピーを必ず書いてください!これであなたの企業向け製品の品質感が大幅に向上します。
✅ 本章のまとめ
Flex Messageを習得したことで、あなたのLine Botは「冷たいテキストマシン」から「ブランドの魂を持った企業向けアプリ」へと進化しました。 しかし!少しコードを変更したり、カードの色を変えるたびに、Renderサーバーに再デプロイして携帯でテストするという長い待ち時間は、Vibe Codingの神速精神に完全に反していると感じているはずです。
次章では、開発者人生で最も偉大な救世主ツール**ngrok(ローカルトンネリング)**を紹介します。これを使えば、コードを変更して保存した1秒後に、携帯ですぐに変更を確認できるようになります!