自作アプリから簡単にスマートフォンに通知を送信できるAPIを提供していたLINE Notifyが今年2025年3月で終了すると発表があった。そこで、無料で使える代替サービスのDiscordウェブフックを使う方法として、PythonからDiscordにメッセージを送信してみよう。
長年便利に使えたLINE Notifyに感謝
これまで、LINE Notifyを使うと、自作のアプリから簡単にLINEのチャットにメッセージが送信できた。LINE NotifyはRESTベースのAPIだったので、ウェブサイトで認証用のトークンさえ取得すれば、とても手軽なプログラムでLINEに通知を送信できた。
あまりにも簡単だったので、筆者もLINE Notifyを使っていろいろ便利な仕組みを作っていた。毎日、いくつかの英単語を送って学習に利用したり、日々ゴミ出しの通知だったり、定期的な会議に遅れないようにリマインダーを送信したり…と、とても便利だった。
そんな便利なサービスも、2025年3月でサービス終了となる。とても残念だが、経営資源を後継の類似プロダクトに集中させるとのことだ。長年にわたり便利なサービスを提供してくれたLINE Notifyの運営チームに感謝したい。
LINE Notifyの代替サービスは?
なお、LINE Notifyのサービスが終了後は、LINE公式のMessaging APIへ移行するようにと案内がある。筆者もいくつかのツールでは、このAPIを利用するように移行した。
しかし、問題もある。Messaging APIは、200通以上のメッセージを送信する場合、月5000円のライトプランを契約しなくてはいけない。毎日メッセージを送ると、月200通はあっという間に超えてしまう。しかも、英単語学習やゴミ出しなど、どうでも良い用途のために、有料プランを契約するのは、もったいなく感じてしまう。そのため、LINE Notifyには恩義を感じているものの代替サービスを探してしまった。
LINE Notifyのように、自作アプリからチャットアプリにメッセージを送信できるサービスを探してみると、いくつか候補が存在する。その中でも、一番簡単なのが、Discordのウェブフックだ。簡単に自作ツールからメッセージを送信できる。
Discordとは?
Discordは無料のチャットアプリだ。テーマごとにグループを作成して、会話することができる。もともとはゲームコミュニティ向けに開発されたのだが、趣味や仕事、勉強など幅広い用途で利用されるようになった。
Discordは、こちら(https://discord.com/)からダウンロードできる。PCだけでなくスマートフォンのアプリが用意されている。また、インストールせず、ブラウザから利用することもできる。
Discordでは、LINEで言うところのグループを「サーバー」と呼ぶ。そしてサーバーの中には、会話の内容を分けるために「チャンネル」という概念が存在する。これはトピックを分けるために存在するものだ。「お知らせ用」とか「自己紹介用」「雑談用」など、特定のトピックごとに分けて会話できる。
Discordでウェブフックを取得しよう
そして、Discordには、手軽に外部アプリから特定のサーバーにメッセージを送信できる「ウェブフック」という機能が用意されている。これを使うと、Pythonから任意のチャンネルにメッセージを送信できる。
Discordのウェブ版の画面で確認してみよう。Discordにユーザー登録すると、次のような画面が表示される。一番左(1)でサーバーを選択し、(2)で表示したいチャンネルを選択しよう。そして、Pythonからチャンネルにメッセージを送信するために、ウェブフックと呼ばれるURLを得るには、(3)のチャンネルの設定をクリックしよう。
チャンネルの設定画面を出したら、「連携サービス > ウェブフックを作成」ボタンをクリックしよう。そして、表示されたボットをクリックすると「ウェブフックURLをコピー」というボタンが表示されるので、URLをコピーしよう。以上で準備は完了だ。
プログラムを作ろう
ウェブフックURLを取得したら、プログラムを作ろう。手軽にウェブフックにメッセージを送信するために、requestsパッケージをインストールしよう。ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して次のコマンドを実行しよう。(macOSの場合はpythonコマンドをpython3に読み替えよう。)
python -m pip install requests
次に、プログラムを作ろう。以下のプログラムを「send.py」という名前で保存しよう。取得したウェブフックのURLを下記のプログラム(*1)の部分に書き換えよう。
import requests
import json
# 以下にウェブフックのURLを指定(書き換えが必要) --- (*1)
WEBHOOK_URL = "https://discord.com/api/webhooks/1340248450578645034/iQ2ohwK7TVEmmMSWYp3NjXYMhhtDtLWRXoCrIqMNoVFbAtpNMMTJwUTj0K1FqBTQKsCP"
def send_message(content):
# メッセージを送信 --- (*2)
payload = {"content": content}
headers = {"Content-Type": "application/json"}
response = requests.post(WEBHOOK_URL, data=json.dumps(payload), headers=headers)
# 実行結果を調べる --- (*3)
if response.status_code == 204:
print("メッセージを送信しました!")
else:
print(f"エラー: {response.status_code} - {response.text}")
if __name__ == "__main__": # --- (*4)
message = "心配事があると心が沈み😭良い言葉によって心が晴れる😊"
send_message(message)
プログラムを確認してみよう。(*1)の部分にウェブフックURLを指定する。(*2)の部分でメッセージを送信する。(*3)ではメッセージの送信結果を確認する。失敗した場合には、その理由を表示する。(*4)の部分で関数send_messageを呼び出して、メッセージを送信する。
次のコマンドを実行してプログラムを実行できる。