5
4

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 Notifyの代替方法として、LINE Messaging APIを利用して、LINEグループに送る。

Last updated at Posted at 2024-11-17

はじめに

LINE Notifyは、2025年3月31日にサービスが終了する。
通知を送る代替方法として、LINE公式アカウントからメッセージを送信できるLINE Messaging APIを利用する。
LINE Messaging API: https://developers.line.biz/ja/services/messaging-api/
Messaging APIの料金: https://developers.line.biz/ja/docs/messaging-api/overview/#line-official-account-plan

毎月200メッセージまで無料なので、4人グループに送ると仮定すると、月50回のメッセージ送信まで無料の計算。無料枠で、使える場面も多い。

自分だけに送るのであれば、以下の記事の通り、ブロードキャストでよい。
https://qiita.com/jksoft/items/4d57a9282a56c38d0a9c

今回は、グループに送るための方法で、グループIDを取得するプロセスがある。グループIDを含めてプッシュメッセージで送る。

全体の流れのイメージ

  1. LINE Official Account Managerで公式アカウントを作成し、LINE Messaging APIをLINE Developerで設定する。
  2. LINEグループを作って、先ほどの公式アカウントを招待してグループに入れる。
    image.png

3.LINEグループ内で、自分(本人)から任意のメッセージを送信することで
グループIDを取得する。

image.png

4.M5ATOM LiteまたはGoogle Apps Scriptから、CHANNEL ACCESS TOKENとグループIDを含めたデータをプッシュメッセージすることで、LINEグループにメッセージを送る。
image.png

LINE Official Account Managerで公式アカウントを作成し、LINE Messaging APIをLINE Developerで設定する。

LINE MessagingAPIから公式アカウントを作成する。

LINE Official Account Manager https://manager.line.biz/
に、「LINEアカウントでログイン」でログインする。

作成ボタンを押す
image.png

記入欄に記入し、確認ボタンを押す。
image.png

image.png

確認ボタンを押す。
image.png

LINE Official Account Managerボタンを押す。

image.png

同意ボタンを押す
image.png

同意ボタンを押す
image.png

次へボタンを押す
image.png

ホーム画面に移動
image.png

右上の設定ボタンを押す。
image.png

アカウント設定画面から
「グループ・複数トークへの参加を許可する」に変更

image.png

応答設定画面から
応答メッセージをOFFにする
image.png

Messaging APIを利用するボタンを押す
image.png

プロバイダーを選択する。
プロバイダーを作成するか、既存のプロバイダーを選ぶかのどちらか。
image.png

プライバシーポリシーと利用規約は空白でも大丈夫。
OKボタンを押す。

image.png

OKボタンを押す
image.png

LINE Messaging APIをLINE Developerで設定する。

LINE Developersのリンクをクリックして、LINE Developersに移動する。

image.png

LINE Developersのトップページの右上のコンソールをクリック。
image.png

該当するプロバイダーのadminボタンを押す
image.png

該当する公式アカウントをクリック。
image.png

Messaging API設定タブをクリック
image.png

Messaging API設定の下にあるチャネルアクセストークン(長期)の発行ボタンを押す。
image.png

image.png

チャネルアクセストークンが発行された後に、
チャネルアクセストークンをコピーする。
image.png

ここでLINE Developersの中の操作はここまで。でも、ブラウザーは閉じずにおいておく。GASのデプロイ後のウェブURLを、LINE Developersのwebhookに設定する操作を、後に、行います。

LINEグループを作って、先ほどの公式アカウントを招待してグループに入れる。

LINEグループを作り、先ほど作成・設定した公式アカウントを招待する。
グループの作成法は以下の公式LINEのページを参照して作ってください。「友だちを選択する」の画面では、先ほど作成・設定した公式アカウントを招待してください。

LINEグループ内で、自分(本人)から任意のメッセージを送信することでグループIDを取得する。

Google SpreadSheet & GASを準備する。

Google spreadsheetを新しく作成する。
Google Driveに移動する。
左上の「+新規」ボタンを押して、spreadsheetを新規作成する。

image.png

image.png

名前を変更(例:GetGroupID等)拡張機能-->Apps Scriptで
image.png

image.png

名前を変更する(例:GetGroupID等)

image.png

image.png

初期画面にデフォルトで入っているコードをdelete(消去)する。
image.png

以下のコードをコピーペーストする。
スプレッドシートの URL から取得できます。スプレッドシート名が変わっても、スプレッドシート ID は変わりません。
スプレッドシートIDは、以下のSPREADSHEET_IDの部分です。
https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit?gid=SHEET_ID#gid=SHEET_ID
スプレッドシートID(SPREADSHEET_ID)の以下のコードのスプレッドシートIDの部分に入れてください。両端の ' は残します。

function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if (event.type === 'message' && event.source.type === 'group') {
      var groupId = event.source.groupId;

      // スプレッドシートに記録
      var sheet = SpreadsheetApp.openById('スプレッドシートID').getActiveSheet();
      sheet.appendRow([new Date(), groupId]);
    }
  });
  return ContentService.createTextOutput(JSON.stringify({ 'content': 'post received' }))
    .setMimeType(ContentService.MimeType.JSON);
}
//参考記事  https://zenn.dev/mojakun/articles/5443f647e49998

を書いて、デプロイする。

image.png

新しいデプロイ
image.png

種類の選択ボタンを押して、ウェブアプリを選択する。
image.png

image.png

アクセスできるユーザーを「自分のみ」から「全員」に変更する。
その後、デプロイボタンを押す。
image.png

アクセスを承認
image.png

自分のGoogleアカウントをクリック
image.png

advancedをクリック
image.png

Go to GetGroupID(unsafe)をクリック
image.png

Allowをクリック
image.png

以下の画面が出たら、ウェブアプリURLをコピーして、メモ帳にペーストして保存する。

image.png

LINE DevelopersでWebhookを設定する

LINE Developersのサイトに行き、MessagingAPI設定のタブ画面のWebhookについて設定する。

image.png

image.png

Google Apps Script(GAS)でデプロイして発行したウェブアプリURLを入力して、
更新ボタンを押す。

image.png

Wenhookの利用のボタンをONにする
image.png

image.png

LINE Official Account Managerに移る。
リロードボタンを押す。

image.png

リロードしたら、LINE Developersで入力設定したWebhookになるはず。確認し、保存ボタンを押す。

image.png

LINEグループからテストメッセージを送る

LINEグループからテストメッセージを送る
image.png

LINEグループIDの取得

LINEグループからテストメッセージを送ると この公式アカウントが参加しているLINEグループのグループIDが、Google Spreadsheetに記入される。

image.png

グループIDが取得できたら、LINE developersのMessaging API設定の画面で、「Webhookの利用」
のスイッチをOFFにする。
image.png

M5ATOM LiteまたはGoogle Apps Scriptから、CHANNEL ACCESS TOKENとグループIDを含めたデータをプッシュメッセージすることで、LINEグループにメッセージを送る。

M5ATOM Liteから送る。

以下のスケッチをM5ATOM LiteにArduino IDEから書き込む。

https://qiita.com/jksoft/items/4d57a9282a56c38d0a9c
の記事をベースにグループID指定とPUSH送信に変更したスケッチです。

#define CHANNEL_ACCESS_TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

#include <M5Unified.h>
#include <WiFi.h>
#include <HTTPClient.h>

// Wi-FiのSSIDとパスワード
const char* ssid = "xxxxxxxxxxxxx";
const char* password = "xxxxxxxxxxxxxxxxx";

const char* authorization ="Bearer " CHANNEL_ACCESS_TOKEN;

// LINEグループID
const char* lineGroupID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

// LINE Messaging API PUSH通知で通知
void notify(char* message) {
  HTTPClient http;
  http.begin("https://api.line.me/v2/bot/message/push");
  http.addHeader("Content-Type", "application/json");
  http.addHeader("authorization", authorization);
  char body[256];
  sprintf(body,"{\"to\":\"%s\",\"messages\":[{\"type\": \"text\",\"text\":\"%s\"}]}", lineGroupID, message);
  http.POST(body);
  Serial.println(http.getString());
  http.end();
}


void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  Serial.begin(115200);
  // Wi-Fi接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
}


void loop() {
  M5.update();
  if (M5.BtnA.wasPressed()) {
  notify("ボタンが押された");
  }
}

LINEグループにメッセージ「ボタンが押された」が送られてきます。成功。

Microsoft Edge Copilotに教えてもらったスケッチ

Microsoft EdgeのCopilotに「ESP32を搭載したM5Stackから、LINE Messaging APIを使って、LINEグループにPUSH通知するスケッチを教えてください」と聞いたところ、以下のスケッチを教えてくれました。若干改良したけれど、骨格は変更していません。Copilotは神。

#include <M5Unified.h>
#include <WiFi.h>
#include <HTTPClient.h>

// Wi-FiのSSIDとパスワード
const char* ssid = "xxxxxxxxxxxxxxxxx";
const char* password = "xxxxxxxxxxxxxxxxx";

// LINE Messaging APIのチャネルアクセストークン
const char* lineAccessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=";

// LINEグループID
const char* lineGroupID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

void sendLinePushNotification(const char* message) {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin("https://api.line.me/v2/bot/message/push");
    // HTTPヘッダーの設定
    http.addHeader("Content-Type", "application/json");
    http.addHeader("Authorization", String("Bearer ") + lineAccessToken);
    // JSONペイロードの構築
    String payload = "{\"to\":\"" + String(lineGroupID) + "\",\"messages\":[{\"type\":\"text\",\"text\":\"" + String(message) + "\"}]}";
    // HTTP POSTリクエスト
    int httpResponseCode = http.POST(payload);
    // 応答の確認
    if (httpResponseCode > 0) {
      String response = http.getString();
      Serial.println(response);
    } else {
      Serial.println("Error sending notification: " + String(httpResponseCode));
    }
    // HTTP接続を終了
    http.end();
  } else {
    Serial.println("WiFi not connected");
  }
}

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  Serial.begin(115200);
  // Wi-Fi接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
}

void loop() {
  M5.update();
  if (M5.BtnA.wasPressed()) {
  sendLinePushNotification("ボタンが押された");
  }
}

LINEグループにメッセージ「ボタンが押された」が送られてきます。成功。

Google Apps Script(GAS)から送る。

プロジェクトの設定==>スクリプトプロパティの欄で、CHANNEL_ACCESS_TOKEN とGROUP_ID を設定してください。
image.png

image.png

GASのエディタ部分に以下のスクリプトをコピーペーストして、

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


function send_text_Message() {
  let message1 = "GASからLINEグループにPUSH通知するテスト。";
  sendMessage(message1);
}


function sendMessage(message) {
  let url = "https://api.line.me/v2/bot/message/push";
  let headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN
  };

  let postData = {
    "to": GROUP_ID,
    "messages": [{
      "type": "text",
      "text": message
    }]
  };

  let options = {
    "method" : "post",
    "headers": headers,
    "payload" : JSON.stringify(postData)
  };

  UrlFetchApp.fetch(url, options);
}

保存して、function send_text_Message() を実行する。
image.png

LINEグループにメッセージ「GASからLINEグループにPUSH通知するテスト。」が送られてきます。成功。

LINE Messaging APIを利用して、LINEグループに送られてきた。

一つ目のスケッチを入れたATOMLite、2つ目のスケッチを入れたATOMLite、Google Apps Script(GAS)からのメッセージがLINEに送られてきた画面はこちら。

image.png

おわりに

LINE Notifyサービスが終了になるのはとても残念だけれど、月200メッセージ以内の用途だとLINE Messaging APIが無料で使えるので、今後もLINEに大切なメッセージは送りたい。頻繁に見ていて、一番気づきやすいアプリだと思うので。

参考にした記事

https://zenn.dev/mojakun/articles/5443f647e49998
https://qiita.com/jksoft/items/4d57a9282a56c38d0a9c

5
4
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
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?