16
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?

はじめに

LINE で Bot を作ろうとすると、最初の設定から思わぬところでつまずくことがあります。
本記事では、そんな つまずきポイントの解消方法、開発時に気づきにくいポイントを分かりやすくまとめました。

1. 利用制限の掛け方

利用制限がかけられないのか?どうすればいいのか?

LINE Messaging APIは、「友だち追加されたBotは誰からのメッセージでも受け取る」という仕様を持っています。そのためたとえそのユーザーが想定した利用者でなくても、友だちさえ追加すればそのBotを利用することができてしまいます。

そのためBotを動かしているサーバー側で利用制限を掛ける必要があります。この時利用できる方法がLINEのユーザーIDです。

ユーザーIDとはなにか

公式ドキュメントより引用

ユーザーIDとは、ユーザーの一意な識別子です。ユーザーIDは、LINEで登録されているユーザーの表示名や、LINEでの友だち検索に利用するLINE IDとは異なります。ユーザーIDはLINEプラットフォームが発行する値で、U8189cf6745fc0d808977bdb0b9f22995のように、U[0-9a-f]{32}の正規表現にマッチする文字列です。

このユーザーIDを利用すればユーザーを識別、サーバー側でホワイトリストを管理し、許可していないユーザーからのアクセスをコードで弾くことが可能となります

しかしこのユーザーIDはLINE公式アプリ(LINEアプリ単体)等からユーザーIDを取得する方法はありません。

つまり、ユーザー自身であっても、もちろん他の人であっても、個人情報保護ポリシーと Messaging API の仕様の観点から確認できなくなっています。

そしてこれらの情報は、スクリプトとユーザーが実際に接点を持ったときに限って提供されます。

このことから以下の取得手順を踏むことが必要となります。

手順

LINE Developersの設定

  1. LINE Developers で Botアカウントを作る
    上記リンクにアクセスしビジネスアカウントを作成
  2. 新規プロバイダー作成
  3. 新規チャネル作成(Messaging API)
  4. チャネルができたら「Messaging API設定」を開きWebhookの利用をオンにする
  5. チャネルアクセストークンを確認する
  6. LINE Official Account Managerを開き応答設定からあいさつメッセージをオフにする

Google Apps Script(GAS)の設定

  1. GASのプロジェクトを作成する
  2. スクリプト プロパティにCHANNEL_ACCESS_TOKENを追加し値も追加する
  3. 下記のコードをペースト
  4. そのアカウントにメッセージを何でもいいので送る
  5. 返信でそのアカウントのユーザーIDが返信される

これでユーザーID取得することができます。

また、この設定をしておくとそのままコードを差し替えるだけでBotをデプロイできるので便利です。

const CHANNEL_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('CHANNEL_ACCESS_TOKEN');

function doPost(e) {
  try {
    if (!e?.postData?.contents) return ContentService.createTextOutput('OK');
    const events = JSON.parse(e.postData.contents).events || [];
    events.forEach(event => {
      if (event.type === 'message' && event.message.type === 'text') {
        const userId = event.source.userId;
        const message = `【あなたのUser ID】\n${userId}`;
        replyToUser(event.replyToken, message);
      }
    });
    return ContentService.createTextOutput('OK');
  } catch (error) {
    return ContentService.createTextOutput('OK');
  }
}

function replyToUser(replyToken, message) {
  UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', {
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${CHANNEL_ACCESS_TOKEN}`
    },
    payload: JSON.stringify({
      replyToken: replyToken,
      messages: [{ type: 'text', text: message }]
    }),
    muteHttpExceptions: true
  });
}

ホワイトリストを追加する

Webhookでイベントを受け取ったあとに、ユーザーIDを確認して許可するかどうか判定する。この流れが最もシンプルでかつ安全、確実です。

// 許可するユーザーIDのリスト
const ALLOWED_USER_IDS = [
  'Uxxxxxxxxxxxxxxxxxx',
];

/**
 * ユーザーが許可されているかをチェック
 * @param {string} userId - チェック対象のユーザーID
 * @return {boolean} 許可されている場合true、そうでない場合false
 */
function isUserAllowed(userId) {
  if (ALLOWED_USER_IDS.length === 0) return true;
  return ALLOWED_USER_IDS.includes(userId);
}

Webhook(doPost)内でこのチェックを行えば、許可していないユーザーを完全に拒否できます。

function doPost(e) {
  const json = JSON.parse(e.postData.contents);
  const event = json.events[0];
  const userId = event.source.userId;

  // ホワイトリストチェック
  if (!isUserAllowed(userId)) {
    // 何も返信しない or 拒否メッセージを返す
    return ContentService.createTextOutput('OK');
  }

  // ---- ここから通常のBot処理 ----
}

2.Webhook周りの設定

Webhook周りでミス、詰まりやすい点は2つあります。

  • URLの更新し忘れ
  • 検証でのエラー

URLの更新し忘れ

これ自体は簡単ですがとても起こりやすいミスです。
GAS等で新しいコードをデプロイする、もしくは既存のコードを更新しデプロイした場合デプロイ後に表示されるURLをLINE Developers側で設定する必要があります。
特に再デプロイの場合URLを更新するのを忘れ更新がうまくいってないと勘違いしてしまうことがあるので注意が必要です。
スクリーンショット 2025-12-03 001755.png

検証でのエラー

image.png

上記のようにURLを更新後検証ボタンを押すように書かれていたりここで検証できることが知られていますが、ここで検証ボタンを押すと タイムアウト/302エラー とされることがあります。

タイムアウト

  • イベントが空
  • サーバー起動が遅い

上記の理由で起きることがあります。

302エラー
Webhook URL がリダイレクトを返していると 302 になります。この場合は検証の下側にあるWebhookの再送 がオンになっていると考えられます。そのためその機能をオフにして再度検証しましょう。

このようなエラーが検証で出た場合でもBot側は正常に動作しており利用できる場合があります。検証ボタンは万能でないため一度メッセージを送りデバッグすることをお勧めします。

3.replyとpushの違い

私も最近まで勘違いしていたのがこの違いです。LINE Developersから遷移できるLINE Official Account Managerにて下記のような料金体系が表示されています。

image.png

これを見ると無料のアカウントでBotを運用する場合月200件しかメッセージを送れないような書き方になっています。
しかしこれはpushメッセージを200件しか送信できないという意味で書かれています。
???と思う人もいるかもしれませんが以下で解説していきます。

replyとpushとは

replyとpushには以下の表の通りです。

種類 説明
reply 送信できるタイミングはユーザーが Bot にメッセージを送った直後のみである。 配信数に「カウントされない」
push 送信できるタイミングはいつでもOK(ユーザーからの入力なしで送れる) 配信数に「カウントされる」

Botは多くの場合何かのアクションに対してreplyを送る場合が多いため無料で対話することが可能です。
しかし定期的に何かを通知リマインドのため自動的に送られてくるようにしたい場合pushにあたるため月200件までしか送れません。ここは注意が必要です。

私の場合replyとpushがあるのは知っていたのですが、それらが合計されて200件/月だと勘違いしていました。

最後に

LINE Bot 開発は比較的簡単に行えることですが、上記のように意外とわからないことやつまずくポイントがあります。特に今回紹介したWebhook検証の仕組み、reply/push の違い、ユーザーID取得の条件、友だち制限(ホワイトリスト)の正しいやり方など、仕組みと制約を知っているかどうかで開発体験が大きく変わります。
つまずくポイントの多くは、LINE プラットフォーム側の仕様を「知らずにハマる」ものばかりです。今回まとめた内容を押さえておけば、余計なハマりを避け、よりスムーズに開発を進められるはずです。

16
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
16
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?