LINEログインとMessaging APIでユーザーにメッセージを送る|Python実装例

LINEログインとMessaging APIでユーザーにメッセージを送る|Python実装例

前回のLINEログイン+AWS Cognitoの記事に続き、同じユーザーをMessaging APIでも識別し、Pythonからメッセージを送る構成を説明します。LINEログインによる認証と、公式アカウントからのメッセージ送信には、それぞれ別の条件があります。

更新範囲(2026年9月8日): 公式資料に基づきチャネルの開設手順、送信条件、Pythonコードを見直しました。旧画面による直接作成手順は置き換えています。コードの構文は確認していますが、今回の更新では実アカウントへの送信や、Cognito/Amplifyを含む認証の実機再検証は行っていません。

先に確認する送信条件

この例では、LINE公式アカウントを友だち追加したテスト用ユーザーへPushメッセージを送ります。ログインしただけのユーザー全員へ販促メッセージを送れるわけではありません。

確認することこの例での条件
ユーザーの識別LINEログインチャネルとMessaging APIチャネルを同じプロバイダー配下にする
メッセージの宛先表示名や友だち検索用のLINE IDではなく、LINEプラットフォームのユーザーIDを指定する
送信対象テスト用ユーザーが対象の公式アカウントを友だち追加し、ブロックしていないことを確認する
利用目的登録完了通知など、ユーザーに案内した目的と送信内容を合わせる
実行場所チャネルアクセストークンを保持するサーバー側で実行する

Pushの対象には、友だちのほか、公式アカウントが参加しているグループ等と、直近7日以内に公式アカウントへ1対1でメッセージを送ったユーザーも含まれます。ただし、ブロック中などの条件ではHTTP 200でも配信されません。200を到達確認として使わないでください。LINE公式のPush送信条件

LINEログインと同じユーザーIDを使う

前編のCognito連携で使うLINEログインチャネルと、今回のMessaging APIチャネルを同じプロバイダーに置きます。同じLINEユーザーに対して、同じプロバイダー内ではチャネルの種類によらず同じユーザーIDが発行されます。別のプロバイダーで得たIDをそのまま使う構成にはできません。ユーザーIDが発行される単位

自社会員ID、Cognitoのユーザー識別子、LINEのユーザーIDは、名前が似ていても同じ値とは限りません。本番では認証を検証したサーバー側で対応関係を管理します。ブラウザが送ってきた任意のLINEユーザーIDを、そのまま送信先に採用しない設計にします。

Messaging APIチャネルを準備する

現在は、LINE公式アカウントでMessaging APIを有効にしてチャネルを作成します。2024年9月4日以降、LINE Developersコンソールからの直接作成はできません。

  1. 利用するLINE公式アカウントを用意します。既存アカウントを使う場合は管理権限を確認します。
  2. LINE Official Account ManagerでMessaging APIの利用を有効にします。
  3. プロバイダーの選択では、連携するLINEログインチャネルと同じプロバイダーを選びます。一度選択したプロバイダーは後から変更できないため、運営会社と管理担当を確認します。
  4. LINE Developersコンソールで、選択したプロバイダーの配下にMessaging APIチャネルがあることを確認します。
  5. チャネルの設定でアクセストークンを準備し、サーバーの環境変数として管理します。

画面の最新の名称や手順はMessaging APIを始めようを参照してください。ユーザーのメッセージを受信するBotを作る場合は、これに加えてWebhookと署名検証が必要です。今回はサーバーからのPush送信に範囲を絞ります。

Python SDKによる送信例

この例は公式Python SDKのlinebot.v3を利用します。公式リポジトリで案内されているPythonの要件は3.10以上です。導入時には検証したSDKの具体的な版を依存ファイルに固定し、更新時にも確認してください。Python SDK公式リポジトリ

python -m pip install 'line-bot-sdk>=3,<4'

実行環境に次の値を設定します。値はコードに直接書かず、共有ログにも出力しません。

環境変数設定する値
LINE_BOT_ACCESS_TOKEN今回のMessaging APIチャネルのアクセストークン
LINE_TARGET_USER_ID送信条件を満たすテスト用ユーザーのLINEユーザーID

開発者本人のユーザーIDは、LINEアカウントと連携したビジネスIDでチャネルの「あなたのユーザーID」を確認できます。一般ユーザーのID取得方法は公式のユーザーID取得ガイドを参照してください。

import os
import re

from linebot.v3.messaging import (
    ApiClient,
    ApiException,
    Configuration,
    MessagingApi,
    PushMessageRequest,
    TextMessage,
)


def main():
    access_token = os.environ["LINE_BOT_ACCESS_TOKEN"]
    line_user_id = os.environ["LINE_TARGET_USER_ID"]
    if not re.fullmatch(r"U[0-9a-f]{32}", line_user_id):
        raise ValueError("LINEユーザーIDの形式を確認してください")

    configuration = Configuration(access_token=access_token)
    with ApiClient(configuration) as client:
        api = MessagingApi(client)
        try:
            api.push_message(
                PushMessageRequest(
                    to=line_user_id,
                    messages=[TextMessage(text="登録完了しました。")],
                )
            )
        except ApiException as error:
            # HTTP応答だけで自動再送の可否を決めず、原因を確認する。
            raise RuntimeError(
                f"送信APIのエラーを確認してください(HTTP {error.status})"
            ) from None

    print("送信APIがリクエストを受け付けました。到達は別途確認してください。")


if __name__ == "__main__":
    main()

このコードは単発送信の説明例です。送信ジョブの永続化や再試行は含めていません。本番で通知を再試行する場合は、同じ通知を二重に送らない仕組みを加えます。実装の検討項目はLINE Bot本番運用の設計を参照してください。

実アカウントで確認する項目

確認判定の仕方
想定ユーザーへ届くか管理下のテスト用アカウントで送信し、実際のトーク画面と照合する
ログインと会員が結び付くか別のテスト用会員を含め、宛先の取り違えがないことを確認する
エラーを処理できるかトークン・宛先・送信量などの原因を分け、無条件に再送しないことを確認する
API受付と到達を分けているかブロック時等の200応答を、到達や開封として集計しないことを確認する
通知内容が妥当か登録完了等の業務イベントと一致し、取消済み・重複イベントで送らないことを確認する

サービスの構成やAPIの制約から整理する場合は、LINE APIでできること・できないことへ進んでください。


この記事に関連するサービス

TodoONadaでは、LINEログインと会員基盤の連携、Messaging APIによる通知、既存システムとの接続を支援しています。対応範囲・参考価格・開発事例を確認し、自社サービスへの組み込みをご相談いただけます。

LINEアプリ開発のサービス・相談窓口を見る

出典・参照

技術ブログ一覧へ戻る