LINE Bot の無料枠は月200件——一日で上限に当たって Slack に乗り換えた話

« 前の記事 次の記事 »

前回、LINE Bot 経由で Claude Code を操作する環境を作った話を書いた。スマホから AI に指示を出せるようになって満足していたら、翌日にボットが無反応になった。

前回のおさらい

前回の記事では、LINE Messaging API と Claude Code を繋いで、スマホのトーク画面からサーバー上の AI に指示を出せる環境を作った。外出先でも「ログ見て」「この設定どうなってる?」と話しかければ返答が届く仕組みで、体験としてはかなり快適だった。

今回はその続き——というか、トラブルの話だ。

ボットが黙り込んだ

環境を作った翌日、LINE に話しかけたら返事が来なくなった。前日まで動いていたのに突然の無反応。

最初はサーバー側のプロセスが落ちたと思った。ログを確認すると、Webhook の受信記録はある。Claude Code の呼び出し記録もある。なのに LINE には何も返っていない。

サーバーのログをちゃんと取っておいてよかった。ログがなければ「LINE に届いているのか、サーバーで落ちているのか、返信が失敗しているのか」の切り分けができなかった。

しばらく調べて気づいた。LINE の Messaging API には無料枠の制限があり、月200通を超えると Push Message が送信できなくなる。環境のテストで試し打ちを繰り返していたら、一日で使い切っていた。

LINE 無料枠の壁

LINE の Messaging API 無料プランでは、Push Message が月200通まで。Reply Message はカウント対象外だが、30秒のタイムアウトがあるため Claude Code の返答には使いにくく、Push Message を使っていた。

有料プランは月5,000円(3,000通)から。個人の自宅サーバー用途にしては高いので、継続は断念した。

LINE vs Slack:何が違うか

代替を探す前に、両者の違いを整理した。

LINE Messaging APISlack
無料枠のメッセージ数Push Message 月200通制限なし
返信のタイムアウトReply Token が30秒なし(非同期で送れる)
Bot の作成LINE Developers でチャネル作成api.slack.com/apps でアプリ作成
署名検証HMAC-SHA256(必須)HMAC-SHA256(必須)
個人利用のしやすさスマホに入っている分手軽アプリ追加が必要だが無料枠が広い

タイムアウトがない点が特に大きい。Claude Code の応答は数秒〜数十秒かかることがあり、LINE の Reply Token 30秒制限は実運用で何度か引っかかっていた。

Slack に乗り換えた

Slack 自体は使ったことがなかったが、Claude Code に実装方法を聞きながら進めたら、LINE のときとほぼ同じ難度で完成した。

1. Slack App を作成する

api.slack.com/apps から「Create New App」→「From scratch」でアプリを作成。Bot Token Scopes に chat:writechannels:history(またはメッセージ購読に必要なスコープ)を追加して、ワークスペースにインストールする。

控えておく値は2つ。

  • Bot User OAuth Tokenxoxb-...):メッセージ送信に使う
  • Signing Secret:Webhook の署名検証に使う

2. Events API を有効にする

「Event Subscriptions」を ON にして Request URL にサーバーの Webhook エンドポイントを登録。Subscribe to bot events で message.channels を追加する。

3. サーバー側(Node.js)の実装

const express = require('express');
const crypto  = require('crypto');
const { execSync } = require('child_process');

const app = express();
app.use(express.json());

// 署名検証(LINE と同じく HMAC-SHA256)
function verifySlackSignature(req) {
  const timestamp = req.headers['x-slack-request-timestamp'];
  const sig       = req.headers['x-slack-signature'];
  const base      = ;
  const expected  = 'v0=' + crypto
    .createHmac('sha256', process.env.SLACK_SIGNING_SECRET)
    .update(base)
    .digest('hex');
  return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}

app.post('/slack/events', (req, res) => {
  // Slack の URL 検証チャレンジ
  if (req.body.type === 'url_verification') {
    return res.json({ challenge: req.body.challenge });
  }

  if (!verifySlackSignature(req)) return res.sendStatus(403);

  const event = req.body.event;
  if (!event || event.type !== 'message' || event.bot_id) return res.sendStatus(200);

  res.sendStatus(200); // Slack には即 200 を返す

  // Claude Code を呼び出して結果を返信
  try {
    const result = execSync(
      ,
      { cwd: '/path/to/repo', timeout: 120000 }
    ).toString();

    fetch('https://slack.com/api/chat.postMessage', {
      method: 'POST',
      headers: {
        Authorization: ,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ channel: event.channel, text: result }),
    });
  } catch (e) {
    console.error(e);
  }
});

app.listen(3001);

LINE との大きな違いは res.sendStatus(200) を先に返してから Claude Code を呼び出せる点。Slack はタイムアウトを気にしなくていいので、処理が長引いても問題ない。

この記事は Slack ボット経由で書いた

実は、この記事の下書きそのものが Slack ボットで作成している。流れはこうだ。

Slack でメッセージ送信
   │
   ▼
自宅サーバー(Node.js Webhook)
   │
   ▼
Claude Code CLI(リポジトリ内で実行)
   │  scripts/post-draft-slack-article.js を作成
   ▼
WordPress REST API へ下書き投稿
   │
   ▼
Slack に「下書き作成完了: id=XXXX」と返信

Slack に「Slack 乗り換え記事の下書きを書いてWordPressに投稿して」と送っただけで、Claude Code がスクリプトを書き、WordPress に下書きを投稿し、「完了しました」と Slack に返してきた。乗り換えたその場で乗り換え記事を書くという、少しメタな体験だった。

Slackで記事のメンテをするイメージ

まとめ

  • LINE Bot の無料枠(Push Message)は月200通。テストを込みで使うと一日で枯渇する
  • ログをちゃんと取っておくとデバッグが格段に楽になる
  • Slack は無料枠のメッセージ制限がなく、タイムアウトも気にしなくていいので Claude Code との相性がいい
  • Slack への乗り換えは、やってみると LINE と大差ない難度だった
  • 乗り換えたその場でこの記事を Slack ボット経由で書いた——ちゃんと使い物になっている

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です