カテゴリー
ESP8266+ESP32+RISC-V

ESP32 や M5Stack で LINE Messaging API を使う

LINE Notify サービスの代替となる LINE Messaging API を ESP32 や M5Stack CORE で使用する方法について説明します。

前回の記事(LINE Notify代替)

LINE Notify サービス が2025年3月31日に終了することになりました。前回はその代替サービスについて説明しました。

(参考)前回の記事:
https://bokunimo.net/blog/information/5270/

今回の記事(Messaging API)

今回は、ESP32 と M5Stack CORE で LINE Messaging API を使う方法について説明します。

LINE Messaging API とは

LINE Messaging API は、LINEアプリのメッセージ通信を外部から利用するための開発者向けサービスです。

本稿では、ESP32 や M5Stack CORE を使って、スマートフォン上のLINEアプリにメッセージを送信してみます。

M5Stack CORE と Rasberry Pi が LINE MEssaging API を使ってメッセージを送信する
M5Stack CORE と Rasberry Pi が LINE MEssaging API を使ってメッセージを送信する

LINE Notify との違い

LINE Messaging API は、LINE Notify と同じく LINE ヤフー株式会社が提供しています。LINE Notify は、特定のアカウントの LINEアプリ にメッセージを通知することに特化していました。一方、LINE Messaging API は、LINEアプリ全般のメッセージ通信機能に対応しています。双方向通信も可能です。

また、LINE Messaging API は企業や店舗といった法人向けのサービスです。このため、LINE公式アカウントの開設が必要です。LINE公式アカウントは、個人で開設することも出来ます。開設方法については、前回の記事または筆者が作成したサンプル・スクリプトのダウンロードページなどを参照してください。

方式公式アカウント開設メッセージ送信先投稿されたメッセージの受信主な用途
LINE Notify不要トークンを取得した特定のアカウント不可特定のアカウントにメッセージを通知する
LINE Messaging API必要公式アカウントに登録してくれた友達可能外部からLINEアプリ全般の通信機能を扱う
LINE Messaging API と LINE Notify の違い

トークンの取得が必要

メッセージの送信には、LINE Notifyと同様にトークンが必要です。ただし、LINE Messaging API のトークンは手動ではなく、同APIを使って取得する必要があります。このトークンを「チャネルアクセストークン」と呼んでいます。

本稿で紹介するプログラムでは、個人での利用かつ簡易な用途を想定し、15分間だけ有効なステートレスのチャネルアクセストークンを使用しています。

方式トークン取得方法トークンの種類・有効期限・最大発行数
LINE Notify受信者が専用ページで取得する1種類・期限なし・最大100個
LINE Messaging APIMessaging API で取得する4種類・期限15分~無期限・発行件数1~制限なし(トークンの種類によって異なる)
LINE Messaging API と LINE Notify のトークンの違い

LINE Messaging API のアクセス手順

LINE Messaging API のステートレス・チャネルアクセス・トークンを使ってLINEにメッセージ送信する手順を、以下に示します。

  1. Wi-Fi接続用のSSIDとパスワードを使って、インターネットに接続する(Wi-Fiの場合)
  2. チャネルIDとチャネルシークレットを使って、ステートレス・チャネルアクセス・トークンを取得する
  3. 取得したステートレス・チャネルアクセス・トークンを使って(取得後15分以内に)、LINEへメッセージを送信する

Arduino IDE用プログラムの解説

以下に、LINE Messaging API のステートレス・チャネルアクセス・トークンを使ったメッセージ送信プログラムについて説明します。

下図は M5Stack CORE 上のESP32用プログラムでメッセージ「こんにちは」を10分ごとに送信した時のようすです。

M5Stack CORE 上のプログラムでメッセージ「こんにちは」を送信する
M5Stack CORE 用と ESP32 用プログラムでメッセージ「こんにちは」を送信する

プログラムは下記に保存してあります。

10分ごとに送信するESP32用プログラム:https://github.com/bokunimowakaru/line/blob/master/esp32/ex01_basic/ex01_basic.ino

ボタンで送信するM5Stack用プログラム:
https://github.com/bokunimowakaru/line/blob/master/m5_core/ex01_basic/ex01_basic.ino

main処理部setupとloop

はじめに、Wi-Fi接続用のSSIDとパスワードを使って、インターネットに接続します。この部分は、LINE Notifyでも同様です。

下記は、Arduino IDEのmain処理部であるsetup関数とloop関数です(ESP32用)。setup関数内で、Wi-Fi接続を行います。

#include <WiFi.h>
#define SSID "1234ABCD"
#define PASS "password"

void setup(){
    WiFi.mode(WIFI_STA);
    WiFi.begin(SSID,PASS);
    while(WiFi.status() != WL_CONNECTED){
        delay(500);
    }
}

void loop(){
    message_to_line("[esp32] こんにちは");
    delay(10*60*1000);
}

loop関数内では後述の関数message_to_lineを使って、メッセージを LINE Messaging API に送信します。

トークン取得関数get_token

関数get_tokenは、チャネルIDとチャネルシークレットを使って、ステートレス・チャネルアクセス・トークンを取得します。

本APIを使用するには、事前にLINE DevelopersコンソールからチャネルIDとSecretを取得してください。また、それぞれをプログラム内の#define line_ch_id と line_ch_pw に定義してください(コンパイル前に赤文字の「0000…0」の部分を書き換える)。

#include <HTTPClient.h>
#define line_ch_id "0000000000" //---ID
#define line_ch_pw "00000000000000000000000000000000" //---secret

String get_token(){
    HTTPClient http;
    String url = "https://api.line.me/oauth2/v3/token";
    String body = "grant_type=client_credentials&";
    body += "client_id=" + String(line_ch_id) + "&";
    body += "client_secret=" + String(line_ch_pw);
    http.begin(url);
    http.addHeader("Content-Type","application/x-www-form-urlencoded");
    int httpCode = http.POST(body); //---トークン取得
    String token="";
    if(httpCode == 200){
        String S = http.getString();
        int i = S.indexOf("\"access_token\"");
        if((i>0) && (S.substring(i+15, i+16).equals("\""))){
            token = S.substring(i+16, i+16+174);
        }
    }
    http.end();
    return token;
}

メッセージ関数message_to_line

関数message_to_lineは、前述の関数get_tokenを使ってトークンを取得してから変数message内のメッセージを送信します。

int message_to_line(String message){
    String token = get_token();
    int token_len = token.length(); //---トークンを取得
    HTTPClient http;
    String url = "https://api.line.me/v2/bot/message/broadcast";
    Serial.println(url);
    http.begin(url);
    http.addHeader("Content-Type","application/json");
    http.addHeader("Authorization","Bearer " + token);
    String json = "{\"messages\":[{\"type\":\"text\",\"text\":\"";
    json += message + "\"}]}";
    int httpCode = http.POST(json); //---message送信
    http.end();
    return httpCode;
}

なお、本関数は送信の度にトークンを取得していますが、15分以内に本APIを使用する場合は、同じトークンが使用できます。

プログラム一式のダウンロード

本稿で使用するプログラム一式は、筆者の GitHub Pages からダウンロードできます。

lineプログラム一式 (GitHub Pages)
https://git.bokunimo.com/line

応用サンプル・プログラム

ESP32 IoT操作機器 Wi-Fi ボタン

IO制御を行うIoT操作機器「Wi-Fi ボタン」にLINEへの通知機能を追加してみました。Wi-Fi ボタンは、照明などのON/OFF操作を行うための端末です(本稿では、照明機器側のプログラムは省略)。ON/OFF操作をするたびに、LINEに通知します。

IO制御を行うIoT操作機器「Wi-Fi ボタン」。ON/OFF操作をするたびに、LINEに通知する
IO制御を行うIoT操作機器「Wi-Fi ボタン」。ON/OFF操作をするたびに、LINEに通知する

ESP32用(M5 ATOM 兼用)は、ダウンロードしたプログラム一式の「esp32」フォルダ内のex02_swに収録しました。M5Stack用は「m5_core」フォルダ内にあります。

ESP32 IoT機器 Wi-Fi 人感センサ子機

人体などの動きを検出した時に、LINEへ通知する IoT機器 Wi-Fi 人感センサ子機の製作例を下図に示します。

人体などの動きを検出した時に、LINEへ通知する IoT機器 Wi-Fi 人感センサ子機
人体などの動きを検出した時に、LINEへ通知する IoT機器 Wi-Fi 人感センサ子機

ESP32用(M5 ATOM 兼用)は、ダウンロードしたプログラム一式の「esp32」フォルダ内のex06_pirに収録しました(M5Stack用は「m5_core」フォルダ内)。

その他(関連情報)

Raspberry Pi 用のサンプル・スクリプト

前回、Raspberry Pi 用のサンプル・スクリプトを紹介しています。ESP32やM5Stackよりも簡単に試せると思いますので、参考にしてください。

ICMP Pingでメッセージを送信する方法

下記にLAN内でICMP Pingを使ってメッセージを送信する方法について書いています。GitHubには Raspberry Pi 用だけでなく、 ESP32 用のプログラムも公開しています。

ご注意

  • メッセージ送信回数の無料枠は200回/月です。超過分は有料となります。
  • プログラムの繰り返し動作や誤作動などで無料枠を超過する場合があります。
  • 15分間だけ有効なステートレスチャネルアクセストークンを使用しています。
  • 本スクリプトでは、実行の度にTokenを取得しています。
  • 本スクリプトでは、開設した公式アカウントに参加する全アカウントにメッセージを通知します。このため、送信したメッセージの内容が漏洩する場合があります。

by bokunimo.net

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es