目次
前回の記事(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アプリにメッセージを送信してみます。
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 Notifyと同様にトークンが必要です。ただし、LINE Messaging API のトークンは手動ではなく、同APIを使って取得する必要があります。このトークンを「チャネルアクセストークン」と呼んでいます。
本稿で紹介するプログラムでは、個人での利用かつ簡易な用途を想定し、15分間だけ有効なステートレスのチャネルアクセストークンを使用しています。
方式 | トークン取得方法 | トークンの種類・有効期限・最大発行数 |
LINE Notify | 受信者が専用ページで取得する | 1種類・期限なし・最大100個 |
LINE Messaging API | Messaging API で取得する | 4種類・期限15分~無期限・発行件数1~制限なし(トークンの種類によって異なる) |
LINE Messaging API のアクセス手順
LINE Messaging API のステートレス・チャネルアクセス・トークンを使ってLINEにメッセージ送信する手順を、以下に示します。
- Wi-Fi接続用のSSIDとパスワードを使って、インターネットに接続する(Wi-Fiの場合)
- チャネルIDとチャネルシークレットを使って、ステートレス・チャネルアクセス・トークンを取得する
- 取得したステートレス・チャネルアクセス・トークンを使って(取得後15分以内に)、LINEへメッセージを送信する
Arduino IDE用プログラムの解説
以下に、LINE Messaging API のステートレス・チャネルアクセス・トークンを使ったメッセージ送信プログラムについて説明します。
下図は M5Stack CORE 上のESP32用プログラムでメッセージ「こんにちは」を10分ごとに送信した時のようすです。
プログラムは下記に保存してあります。
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に通知します。
ESP32用(M5 ATOM 兼用)は、ダウンロードしたプログラム一式の「esp32」フォルダ内のex02_swに収録しました。M5Stack用は「m5_core」フォルダ内にあります。
ESP32 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