LINE Notifyの代替に!Discord APIで実現するメッセージ・画像通知システム

はじめに

LINE notifyのサービスが終了してしまいました。定期的な通知機能は便利でしたので代わりになるものを探しましたので紹介します。
以下の記事のサンプルプログラムは使用できなくなりましたが、APIの説明については下記を参照ください。

Discordについて

Discordは、もともとゲーマー向けに開発されたチャット・通話ツールです。最近ではビジネスや学習、コミュニティなど幅広い分野で使われるようになり、Slackのようなコラボレーションツールとしても注目されています。

Discordでは、ボイスチャットやテキストチャット、ファイル共有などが可能で、BotやWebhookなどを活用することで、自動化や通知機能を追加できます。

LINE Notifyの代替になる?

LINE Notifyは手軽にLINEに通知を送れる便利なサービスでしたが、以下のような制約がありました

 ・通知先が自分のLINEアカウントまたはグループに限定される
 ・ファイル送信に制限がある
 ・カスタマイズ性が低い

一方、DiscordのWebhookやBotを使えば

 ・複数のチャンネルに柔軟に通知
 ・ファイル添付や埋め込み(embed)形式のメッセージ

かなり自由度が高く、LINE Notifyより高機能な通知が可能です。デメリットは日常的にDiscordを使っている人は少ないことでしょうか(致命的な気もしますが

Discord APIの使い方

LINE Notify同様、まずはPCでの作業になりますので、ご注意ください

STEP
アカウントを取得し、Discord Developer Portalにログインする
STEP
左のタブApplications → 右上のNew Applicationを選択

アプリケーション名を入力します。実現したい機能の名称をつけておきましょう

STEP
Botの作成

左のメニューから「Bot」を選択し、usernameを付与する。これが通知してくれるbotの名前になります

STEP
Botの設定

左のメニューから「Installation」を選択し、以下を実施。

・User Installのチェックを外す
・(最下層)SCOPESに「bot」を追加
・PERMISSONSに「Adminstrator」と「Send Messages」を追加。

STEP
サーバーの作成

BOTを参加させる部屋(サーバー)を作ります。PCで作ったほうが後で楽だと思います。

STEP
サーバーにBotを追加する

左のメニューから「Installation」を選択し、Install Linkにある、「Copy」を押下。
ブラウザに貼り付ける。
サーバーにbotを追加する画面に遷移するため、許可すればBotが追加されます

STEP
チャンネルIDを取得する

部屋の中で右クリックし、「チャンネルIDをコピー」を選択します。

STEP
TOKENを入手する

TOKENは左のメニューの「Bot」にあります。「Reset Token」を押下した後、スマホでQRコードを読み取るなどの作業が発生します。

メッセージと写真を送信するプログラム

LINE Notifyと同じことを実現してみます。LINEより若干複雑になっていますが、使い方はシンプルです。
取得したトークン、チャンネルIDを入力し、discord_send_message.pyとして保存してください。

import requests
import os

class DiscordSendMessage:
    __default_token: str = '****.*********'  #トークン
    __default_channel_id: str = '*********'  #チャンネルID

    def __init__(self, token: str = __default_token, channel_id: str = __default_channel_id):
        self.__token = token
        self.__channel_id = channel_id

    def send_discord_message(self, file_path: str = None, message: str = ""):
        url = f"https://discord.com/api/v10/channels/{self.__channel_id}/messages"
        headers = {
            "Authorization": f"Bot {self.__token}"
        }

        # ファイルが指定されていない or 存在しない場合は、メッセージのみ送信
        if not file_path or not os.path.isfile(file_path):
            headers["Content-Type"] = "application/json"
            data = {
                "content": message
            }
            response = requests.post(url, headers=headers, json=data)
            if response.status_code == 200:
                print("メッセージのみ送信完了")
            else:
                print(f"メッセージ送信失敗: {response.status_code}, {response.text}")
            return

        # ファイルが存在する場合は、ファイル + メッセージを送信
        try:
            with open(file_path, 'rb') as file:
                files = {
                    'file': (os.path.basename(file_path), file)
                }
                data = {
                    "content": message
                }
                response = requests.post(url, headers=headers, data=data, files=files)

            if response.status_code == 200:
                print(f"ファイル送信完了: {file_path}")
            else:
                print(f"ファイル送信失敗: {response.status_code}, {response.text}")
        except Exception as e:
            print(f"ファイル送信中にエラーが発生しました: {e}")
            # 送信失敗しても、メッセージだけ送る
            self.send_file(file_path=None, message=message)

if __name__ == "__main__":
    discord_bot = DiscordSendMessage()
    file_path = r'C:\Users\***\***.jpg'
    message = 'abcdefg'
    discord_bot.send_discord_message(file_path=file_path,message=message)

別のプログラム(main.py)で使用するコードです。
わかりやすいように、discord_send_message.pyとmain.pyは同じ階層に保存してください。

import requests
import os

import discord_send_message

discord_bot = discord_send_message.DiscordSendMessage() # インスタンス化
file_path = 'C:\***\***\***\***.jpg' # 送信したいファイルパス
message = 'abcdef' # 送信したい文字列
discord_bot.send_discord_message(file_path=file_path,message=message)

まとめ

LINE Notifyの代わりにDiscordを使ってみました。ふつうに便利だと思います。
LINEの代わりになるのではないでしょうか。周りの人が許せば日常使いもLINEからの乗り換えたいくらいです。
ぜひやってみてください!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする