📬

LINE Messaging APIを使ってBotからPUSH通知を送る [Python]

2024/10/25に公開

こんにちは!

こちらの記事

にある通り初めて自分自身でLINE Messaging APIを使ったbotを作成したので,PUSH通知の送り方について備忘録を残したいと思います!不明点や間違っている点があれば教えてください.

この記事では,APIキーは取得済みであるとし,特定のトークルームにPUSHメッセージを送信するところまでを説明します.

参考にしたサイトは随時記事内に示し,まとめて記事の一番下にも再掲いたします.


この記事でわかること

  • LINEのトークルームのIDを取得する方法
  • Pythonを使って特定のトークルームにメッセージを送信する方法

おことわり

  • 本記事は,あくまでも初心者が書いているため,責任は取れません.(公式ドキュメントや色々なサイト・記事を参考にしてファクトチェックを行いながらお願いします)
  • 間違っているところなどはぜひ教えていただけると嬉しいです.

大まかな流れ

本記事は以下の流れになっています.

  1. 特定のトークルームのIDを取得する
  2. メッセージを送信する

送信先のトークルームのIDを取得する

参考: 【GAS】LINEのgroupIDを返してくれるbot

LINE Messagin APIを用いてトークルームにメッセージを送信するには,送信先のユーザのユーザIDもしくは送信先のグループIDが必要となります.
取得方法はいろいろあるのですが,今回は,グループIDについて取得する方法の一つをご紹介いたします.

今回は,メッセージ送信対象のトークルームとして,「BOT + 私 + 家族」のグループを作成してみました.グループIDを取得するためには一旦,そのグループに人間がメッセージを送り,そのイベントをサーバで受け取る必要があります.おそらく,Google Apps Scriptで受信するためのサーバを作成してグループIDを受け取るのが簡単そう,ということでその方法を紹介します.

用意するもの

  • LINE Channel Access Token (まだ作成していない場合は,メイン記事4章を参考にしてください)
  • 適当なGoogle Apps Scriptファイル
  • Botを追加したグループ

Google Apps Scriptの準備

まずは,スクリプトプロパティにLINE Channel Access Tokenを登録します.


スクリプトプロパティに登録する様子

GASは以下のように記述します.こうすることで,「メッセージが送られてきたら,ユーザーIDもしくはグループIDを返信する」ということができるようになります.

code.gas
// スクリプトプロパティからChannel Access Tokenを読み込む.
const LINE_TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_TOKEN");
// LINEの返信を行うためのエンドポイント
const LINE_URL_REPLY = 'https://api.line.me/v2/bot/message/reply';

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

  // typeを判定して、idを取得
  if (type == 'user') {
    var id = event.source.userId;
  } else if (type == 'group') {
    var id = event.source.groupId;
  } else if (type == 'room') {
    var id = event.source.roomId;
  }

  const payload = {
    'replyToken': replyToken,
    'messages': [
      {
        'type': 'text',
        'text': type + '_id = '+ id // 返信内容
      }
    ]
  };

  const options = {
    'method': 'post',
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'payload' : JSON.stringify(payload)
  };

  // メッセージを送信
  UrlFetchApp.fetch(LINE_URL_REPLY, options)
}

Google Apps Scriptをデプロイする

実際に動かすには,先ほど作成したプログラムをデプロイする必要があります.
GASのエディタの右上にある青い「デプロイ」ボタンをクリックすると以下のような画面が出てきます.

新規デプロイ画面
タイプはWeb App,アクセス権限は Anyone(全員) にしておいてください.
(もし,セキュリティ警告画面が出てきた時は,警告画面下部にある詳細設定を開き,無理やりページにアクセスしてください.)

デプロイが完了すると,URLが発行されます.

LINE BotにGASのURLを登録する

LINE Developersから,使用するBotのMessaging APIの設定ページを開いてください.
Webhook URLとして,先ほど得たGASのURLを登録してください.

Webhook URLの登録

メッセージを送って,グループIDを取得する.

実際に,Botを追加したグループで,適当なメッセージを送信します.
すると,(うまくいっていれば)返信にグループIDが記載されています.
必要となるIDを取得し終わったら,今回のGASの内容は削除もしくは変更し,ID返信機能は無くしましょう.

Pythonからメッセージを送信(PUSH通知)する

それでは実際に取得したグループIDを使って,Python側から通知を送ってみます.

用意するもの

  • LINE Channel Access Token
  • Botが追加されたLINEグループ
  • 上記グループのグループID
  • Pythonファイル

Pythonでメッセージを送る

まずは,LINE Channel Access Tokenは環境変数として登録しておきます.
環境変数の登録方法はOSによって異なると思いますが,Linuxの場合は以下のように登録ができます

~
export LINE_ACCESS_TOKEN="xxxxxx"

Pythonファイルは以下のように記述します.

line_push.py
import os
import requests

LINE_ACCESS_TOKEN = os.getenv('LINE_ACCESS_TOKEN')
LINE_BOT_URL = "https://api.line.me/v2/bot/message/push"

# messageを送信する関数
def push_message(group_id, message=""):
    headers = {
		"Content-Type": "application/json",
		"Authorization": f"Bearer {LINE_ACCESS_TOKEN}"
	}

    data = {
		"to": group_id,
		"messages": [{"type":"text", "text":message}]
	}
    # 送信
    try:
		response = requests.post(LINE_BOT_URL, headers=headers, data = json.dumps(data))
		if response.status_code == 200:
			return True # 成功
		print(f"Error: {response}")
		return False
	except e:
		print(e)
		return False

# メッセージを送ってみる
GROUP_ID = "XXXXXX" # 実際の送信先のidを記述
push_message("GROUP_ID", message="こんにちは")

このpythonファイルを実行して,目的のグループにメッセージがきたら,成功です.

参考サイト

【GAS】LINEのgroupIDを返してくれるbot

Discussion