💬

発言が少なくなったLINEグループをBotで活性化した話

に公開

本記事はGENDA Advent Calendar 2025 シリーズ2 Day 17の記事です。

はじめに

皆さんにも、動かなくなっているLINEグループはありませんか?

学生時代は毎日のように連絡を取り合っていたのに、社会人になって忙しくなり、結婚や子供が生まれて…気づけば誰も発言しなくなっている。
よくある話だと思います。

でもこれって、連絡したくなくなったわけじゃないですよね。忙しい相手に遠慮して、きっかけがなくなっただけなんじゃないかと。

そこで、誕生日をお祝いするBotを作ってグループに導入しました。
Botがきっかけを作ってくれれば、自然と会話が生まれるんじゃないか?という狙いです。

1年間運用してみた結果をまとめます。

作ったBotの機能

  • 誕生日お祝い: メンバーの誕生日に自動でお祝いメッセージを送信
  • 特定日のメッセージ送信: 記念日やイベント日にメッセージを送信

毎回同じメッセージだと味気ないので、Gemini APIでお祝いメッセージを生成するようにしました。

お祝いメッセージの生成では、「誰が祝うか」を重要な要素として扱っています。
単に「誕生日おめでとう」と言わせるのではなく、お祝いする側のキャラクター設定をデータで管理し、「どんな人格で」「どんな距離感で」「どんな口調で」話すべきかを生成AIに制約させています。

同じクラスの人たちのグループでは担任の先生や旅行先で出会った人、同じ部活の人たちのグループでは外部指導者や合宿先の人に祝わせたりと、内輪ネタを色々入れて楽しんでいます。

Botが送信した誕生日メッセージの例
Botが送信した誕生日メッセージの例

技術構成

項目 内容
言語 Python
実行環境 GitHub Actions
API LINE Messaging API, Gemini API
費用 月10円以下

現行の最上位モデルgemini-3-pro-previewを誕生日発生時など月に数回呼ぶ運用で、
直近1か月の実績は約4円でした。

なぜGitHub Actionsを選んだか

正直、深い理由はありません。

  • 無料で使える
  • 普段から使い慣れている
  • 1日1回、誕生日を確認してメッセージを送るだけなら十分

Webhook受信が不要で、定時実行だけできれば成立するので、常時稼働のサーバーを持たない方針にしました。
それならGitHub Actionsで十分でした。

実装方法

LINE Messaging APIの設定

LINE Messaging APIの設定方法は以下の記事が参考になります。

メッセージを送るグループのIDは以下の記事を参考に取得しました。

誕生日データの管理

LINE Messaging APIからメンバーの誕生日を取得することはできません(そもそも登録していない人もいる)。
そこで、privateリポジトリ内のJSONファイルで管理することにしました。

メンバーに関しては、所属するLINEグループのIDと、判定やお祝いメッセージに必要な誕生日・名前を管理しています。

イベントに関しては、送信先のグループID、日付、送信するメッセージを以下のように管理しています。

{
  "events": [
    {
      "name": "年末、飲み会呼びかけ",
      "group_id": "Cxxxxxxxxxxxxx",
      "month": 10,
      "day": 31,
      "messages": [
        "皆さんは年末の予定は決まっていますか?",
        "今年もこの学年で飲み会をしませんか?"
      ]
    }
  ]
}

Pythonのコード

処理の流れをシンプルにまとめると以下のようになります。

main.py
from datetime import datetime
from zoneinfo import ZoneInfo
from linebot.v3.messaging import MessagingApi, Configuration, ApiClient, PushMessageRequest
from linebot.v3.messaging.models import TextMessage
from google import genai
import os

# LINE APIの設定
line_config = Configuration(access_token=os.environ["LINE_CHANNEL_ACCESS_TOKEN"])

# Gemini APIの設定
gemini_client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])

def send_message(group_id: str, messages: list[str]) -> None:
    """指定されたグループにメッセージを送信"""
    with ApiClient(configuration=line_config) as api_client:
        messaging_api = MessagingApi(api_client)
        text_messages = [TextMessage(text=msg) for msg in messages]
        messaging_api.push_message(
            PushMessageRequest(to=group_id, messages=text_messages)
        )

def load_birthday_info():
    """JSONから誕生日データを読み込む"""
    # 省略

def generate_birthday_message(member, today) -> list[str]:
    """Gemini APIでお祝いメッセージを生成"""
    prompt = f"""誕生日のお祝いメッセージを作成してください。
名前: {member.name}さん
日付: {today.month}月{today.day}日
要件: 3〜5行程度、親しみやすい内容で"""

    response = gemini_client.models.generate_content(
        model="gemini-3-pro-preview",
        contents=prompt
    )
    return [
        f"今日は{member.name}さんのお誕生日です!",
        response.text.strip()
    ]

def main():
    # 今日の日付を取得(日本時間)
    today = datetime.now(ZoneInfo("Asia/Tokyo"))

    # 誕生日データを読み込む
    groups = load_birthday_info()

    # 今日が誕生日のメンバーを探してメッセージ送信
    for group in groups:
        for member in group.members:
            if member.birth_month == today.month and member.birth_day == today.day:
                messages = generate_birthday_message(member, today)
                send_message(group.group_id, messages)

if __name__ == "__main__":
    main()

GitHub Actionsの設定

毎日朝6時(JST)にスクリプトを実行するだけのシンプルな構成です。

name: Run LINE Bot Script

on:
  schedule:
    - cron: "0 21 * * *"  # UTCで21時 = JSTで朝6時

  workflow_dispatch:  # 手動実行も可能

jobs:
  run-bot:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.9"

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run Python Script
        env:
          LINE_CHANNEL_ACCESS_TOKEN: ${{ secrets.LINE_CHANNEL_ACCESS_TOKEN }}
          GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        run: |
          python main.py

privateリポジトリなのでGitHub Actionsには月2,000分の上限がありますが、1日30秒程度の実行なので全く問題ありません。

ハマりポイント:生成AIをサービスに組み込む難しさ

生成AIをサービスに組み込むのは初挑戦で、試行錯誤しました。

学んだのは、生成AIに丸投げするのではなく、コード側で機械的に判断できる情報をできる限りプロンプトに含めることが大事だということです。

例えば今回のBotでは、誕生日を迎える人の名前や年齢、お祝いする側のキャラクター設定、現在の日付などをすべてプロンプトに埋め込んでいます。
生成AIに任せるのは「それらの情報を元にメッセージを組み立てる」部分だけです。

生成AIはいろんなことができるからこそ、どれだけレールに乗せられるかが重要だと実感しました。

また、時事ネタを含めるためにGeminiの検索グラウンディング機能を使っていますが、めちゃくちゃマイナーなニュースを持ってくることがあります。
たとえばローカルなイベントやニッチな記念日を拾ってきて、グループの温度感とズレることがありました。
こういう部分はRSSから情報を取得して、機械的な動きでAIをサポートする方が良いかもしれません。

ハマりポイント:無料枠のサイレント縮小

gemini-2.5-proを利用していましたが、ある朝いきなり利用可能枠が0になってしまい、固定のお祝い文しか送られなくなりました。

幸いエラー時は固定のお祝い文にフォールバックする実装にしていたので、Botが完全に止まることはありませんでしたが、気づくまで数日かかりました。

無料枠はいつ減らされるかわからないし、文句も言えません。
安定して稼働させるためには、少額でもお金を払うプランに移行しておくのが大事かもしれません(まだ10円も払っていないですが…)。

1年間運用してみて

Botの運用を始めたのは2024年12月。ちょうど1年が経ちました。

実際にメッセージ数を数えてみました(Botのメッセージは除外)。

年 メッセージ件数
2023年 17件
2024年 76件
2025年 145件

毎月0〜2人の誕生日があり、Botがお祝いメッセージを送ると、それに続いて他のメンバーも「おめでとう!」と送るようになりました。

もちろん、コロナ明けやライフステージの変化など、Bot以外の要因もあるかもしれません。
ただ、Botのお祝いメッセージをきっかけに会話が始まるパターンが多いので、Botが最初のきっかけを作ってくれることで、発言のハードルが下がったのではないかと思っています。

さらに10月末には「年末の予定どうですか?」というメッセージを自動送信するようにしたところ、そこから話が進み、今年は忘年会を開催することになりました。

発言するのに少し緊張感があったグループが、気軽にやり取りできる雰囲気に変わったのではないかと思っています。
Botを作ってよかったです。

今後の課題

Botの稼働状況を確認できる仕組みを作りたいと思っています。

今回、Geminiの仕様変更で動かなくなった経験から、外的要因で動かなくなることを考慮して、定期的に生成AIの動きも含めて確認すべきだと感じました。

具体的には、数日おきに監視用グループへテスト送信し、Geminiの応答が返ること・フォールバックが発動していないことを確認できるようにしようと思っています。

まとめ

GitHub Actions + LINE Messaging APIは無料枠、Gemini APIも月10円以下で運用できています。

一度作ってしまえば365日自動で動いてくれるので、個人開発にはちょうどいい構成だと思います。

同じように眠っているLINEグループがある方は、ぜひ試してみてください。

年末の忘年会、楽しみです。

Discussion