ラズパイ 読む時間 約7分

ラズパイから LINE で知らせる:Messaging API で自分にだけ送り、声やベルと一緒に使う

LINE Notify が終わったあとの、ラズパイから LINE に通知を送る方法です。LINE 公式アカウントの Messaging API で、送り先を自分のユーザー ID だけにして送ります。Python の標準ライブラリだけで動くスクリプトと、すでに使っている公式アカウントで自分にだけ送るときの注意も紹介します。

ラズパイから LINE で知らせる:Messaging API で自分にだけ送り、声やベルと一緒に使う

ラズパイからの知らせを、家では声とベルで受けています。ただ、家にいないときは聞こえません。そこで、同じ知らせを LINE でも受けられるようにしました。スマホに届くので、外出先でも気づけます。

以前は「LINE Notify」で手軽に送れましたが、LINE Notify は 2025 年 3 月 31 日でサービスを終了しました。この記事では、今使える方法として、LINE 公式アカウントの Messaging API で、ラズパイから自分の LINE に送る仕組みを作ります。送り先は自分だけにするので、友だちやお客さんに届くことはありません。

この記事の前にできていること

  • ラズパイに PC から SSH で接続できる(第 3 回まで)
  • LINE のアカウント(スマホの LINE)

この記事でできるようになること

  • ラズパイから、自分の LINE にだけメッセージを送る
  • 声やベルの知らせと同じきっかけで、LINE にも送る

先に知っておくこと

  • 無料で送れる数に上限がある:LINE 公式アカウントの無料のプラン(コミュニケーションプラン)は、送れるメッセージが月 200 通までです。自分 1 人に送るなら、1 日 6 通ほどまでなら収まります。大事な知らせだけにします。
  • トークンは鍵と同じ:チャネルアクセストークンがあれば、だれでもそのアカウントからメッセージを送れます。ラズパイの設定ファイルにだけ置き、コードやブログには書きません。
  • 送り先は自分のユーザー ID だけ:Messaging API には友だち全員に送る方法(ブロードキャスト)もありますが、通知では使いません。送り先を自分の ID だけにしておけば、まちがって友だちに届くことはありません。

手順 A:LINE 公式アカウントを作る

LINE 公式アカウントの作成のページから、通知用のアカウントを作ります。通知のためだけなら、新しく通知用のアカウントを作るのがおすすめです。

すでにお店などのアカウントがあれば、それを使うこともできます(送り先を自分だけにするので、お客さんには届きません)。ただし、次の 2 つに気をつけます。

  • Messaging API を有効にするときに選んだプロバイダーは、あとから変えられません。Messaging API との連携を解除することもできません。
  • ラズパイから送った数は、お店の配信と同じ月 200 通の枠から引かれます。
LINE Official Account Manager のアカウントリストの画面
LINE Official Account Manager のアカウントリスト。左の「作成」から新しいアカウントを作ります
LINE 公式アカウントの作成の入力画面
アカウント名・メールアドレス・業種などを入力して作ります(通知用なら名前は分かりやすいものに)

手順 B:Messaging API を使えるようにして、トークンを発行する

LINE 公式アカウントの管理画面の「設定」→「Messaging API」で、Messaging API を使えるようにします。このときにプロバイダー(開発者の名前のようなもの)を選びます。あとから変えられないので、通知用なら自分の名前などにしておきます。LINE Developers を初めて使うときは、名前とメールアドレスの登録の画面が先に出ます。そのあと LINE Developers のチャネルの「Messaging API 設定」で、チャネルアクセストークン(長期)を発行します。

LINE 公式アカウントの管理画面のアカウント設定
管理画面の右上の「設定」を開くと、左に「Messaging API」があります
Messaging API が利用中になった画面
Messaging API を使えるようにすると、ステータスが「利用中」になります(Channel ID・Channel secret は人に見せない)
LINE Developers の Messaging API 設定の画面
LINE Developers の「Messaging API 設定」タブ。いちばん下でチャネルアクセストークン(長期)を発行します(初めてのときは「発行」のボタン。この画像は発行したあとなので「再発行」)。上の QR コードで友だちに追加できます

手順 C:自分のユーザー ID を調べる

LINE Developers のチャネルの「チャネル基本設定」の下のほうに、「あなたのユーザー ID」(U で始まる 33 文字)が出ています。これが自分あての送り先です。

この欄は、LINE のビジネス ID を LINE アカウントと連携していないと表示されません。メールアドレスでビジネス ID を作った場合は、LINE アカウントでログインし直すと表示されます。

あわせて、スマホの LINE でこの公式アカウントを友だちに追加しておきます(友だちでないと届きません)。「Messaging API 設定」タブの QR コードを読むと追加できます。

LINE Developers のチャネル基本設定の画面
「チャネル基本設定」タブのいちばん下に「あなたのユーザー ID」があります

手順 D:ラズパイにスクリプトと設定を置く

ラズパイの ~/notify に、次の 2 つのファイルを作ります。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ラズパイから、自分の LINE にメッセージを送る(LINE 公式アカウントの Messaging API・push)
使い方:python3 line_notify.py "サイトが止まりました"
        ほかの Python からは:import line_notify; line_notify.send("サイトが止まりました")
設定は同じフォルダの line.ini(トークンと、送り先のユーザー ID)。Python の標準ライブラリだけで動く。
"""
import configparser
import json
import os
import re
import sys
import urllib.error
import urllib.request
HERE = os.path.dirname(os.path.abspath(__file__))
API = "https://api.line.me/v2/bot/message/push"
def load():
    cfg = configparser.ConfigParser(interpolation=None)
    path = os.path.join(HERE, "line.ini")
    try:
        if not cfg.read(path, encoding="utf-8-sig") or not cfg.has_section("line"):
            raise RuntimeError("設定ファイル line.ini([line])がありません")
        token = cfg.get("line", "channel_access_token", fallback="").strip()
        to = [u.strip() for u in cfg.get("line", "to", fallback="").split(",") if u.strip()]
    except configparser.Error as e:
        raise RuntimeError("line.ini の書き方がちがいます(%s)" % e.__class__.__name__)
    if not token or not token.isascii():
        raise RuntimeError("line.ini の channel_access_token が入っていません")
    if not to or not all(re.fullmatch(r"U[0-9a-f]{32}", u) for u in to):
        raise RuntimeError("line.ini の to が、U で始まる 33 文字のユーザー ID になっていません")
    return token, to
def send(text):
    """送れたら True。送り先は line.ini の to(自分のユーザー ID だけにしておく)"""
    try:
        token, to = load()
    except RuntimeError as e:
        print("送れませんでした:%s" % e, file=sys.stderr)
        return False
    ok = True
    for user_id in to:
        body = json.dumps({"to": user_id, "messages": [{"type": "text", "text": text[:2000]}]}).encode("utf-8")
        req = urllib.request.Request(API, data=body, method="POST", headers={
            "Content-Type": "application/json",
            "Authorization": "Bearer " + token,
        })
        try:
            with urllib.request.urlopen(req, timeout=15) as r:
                ok = ok and r.status == 200
        except urllib.error.HTTPError as e:
            # 401:トークンが違う・429:送れる数の上限 など。トークンは表示しない
            print("送れませんでした:HTTP %d %s" % (e.code, e.read()[:200].decode("utf-8", "replace")), file=sys.stderr)
            ok = False
        except OSError as e:
            print("送れませんでした:%s" % e, file=sys.stderr)
            ok = False
    return ok
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(__doc__)
        sys.exit(1)
    sys.exit(0 if send(sys.argv[1]) else 2)
[line]
channel_access_token = (手順 B のチャネルアクセストークン)
to = (手順 C のあなたのユーザー ID)
chmod 600 ~/notify/line.ini

書き方と役目

  • push:決まった相手(ユーザー ID)にだけ送る API。友だち全員に送る broadcast は使わない
  • to:送り先。自分の ID だけにしておく(カンマで区切ると複数にもできるが、通知では自分だけがおすすめ)
  • トークンは表示しない:送れなかったときも、画面に出すのは HTTP の番号と LINE からの理由だけ
  • text[:2000]:LINE のテキストの上限は 5,000 字。通知は短いので、念のため 2,000 字で切っておく
  • 設定ファイルを先に確認する:トークンが空のとき・送り先が U で始まる 33 文字になっていないときは、送らずに理由を出して止まる

手順 E:送ってみる

cd ~/notify
python3 line_notify.py "ラズパイからのテストの通知です"

スマホの LINE に、公式アカウントからメッセージが届けば成功です。トークンがまちがっていると、「送れませんでした:HTTP 401」のあとに、英語の理由が出て止まります(このときは、メッセージは送られません)。

line.ini の送り先(to)が見本のままのときなど、書き方がちがうときは、送らずに次のように出ます。

送れませんでした:line.ini の to が、U で始まる 33 文字のユーザー ID になっていません

何も出ずに終わったのに届かないときは、スマホの LINE でその公式アカウントを友だちに追加しているか、ブロックしていないかを確認します。友だちでない相手には、LINE は「受け付けた」と返しますが、実際には届きません。

家で試したこと:ほかの用事で使っているアカウントで、自分にだけ送る

家では、ふだん別の用事で使っている LINE 公式アカウント(ほかにも管理者がいる)を使って、自分にだけテストの通知を送りました。送り先を自分のユーザー ID だけにしたので、届いたのは自分の LINE だけでした。

スマホの LINE に届いたテストの通知
スマホの LINE に届いたテストの通知(公式アカウントからのメッセージとして届きます)

このように、すでに使っているアカウントでも、送り先を自分だけにすれば通知に使えます。ただし、手順 A の 2 つの注意(プロバイダーは変えられない・月 200 通の枠を分け合う)は先に確認しておきます。

声やベルと一緒に使う

売れたメールを声で知らせる仕組みなどで、声を順番待ちに置いている所に 1 行足せば、同じきっかけで LINE にも届きます。

import line_notify
enqueue("siteb_down.wav")                       # 家では声で
line_notify.send("ホームページが止まりました")    # 外出先では LINE で

声のスクリプトが ~/notify とは別のフォルダにあるときは、import line_notify の前に sys.path.insert(0, os.path.expanduser("~/notify")) を足します。LINE に送るときは最長 15 秒待つので、声を先に置く今の順番のままにしておくと、声が遅れません。

家にいるときは声で、外出先では LINE で気づけます。夜に LINE の通知が鳴るのが気になるときは、スマホの LINE の側で、その公式アカウントの通知を夜だけ切ることもできます。

まとめ

LINE 公式アカウントの Messaging API で、ラズパイから自分の LINE にだけ知らせる仕組みを作りました。トークンと送り先の ID を設定ファイルに置き、1 行で送れます。月 200 通の上限があるので、すぐ知りたい大事な知らせに使うのがおすすめです。

次に読む

この記事を書いた人

フリースタイル

Web の仕事 25 年以上。WordPress の保守・引っ越しと、PHP の業務の仕組みづくり。 プロフィール →

まずは、お気軽にご相談ください。

相談と見積りは無料です。急ぎのときは、フォームで「急ぎ」を選んでください。