MATLABからDiscordに通知を送ろう!Webhookを使って設定してみよう

技術

大学院生として日々MATLABにはお世話になっているGTBです.一度プログラムを回し始めると短いものでも6時間もかかるものもあります.

これまではプログラム終了の通知をTwitter 𝕏で行っていましたが,APIの有料化や制限の波が押し寄せてきたため,使用不可能になってしまいました.

𝕏に代わる通知プログラムを構築するべくいろいろ考えた結果,普段よく使っているDiscordに通知が来るように今回はコードを組んでみました.参考にしてみてください.

スポンサーリンク

システムの概要

このシステムは、MATLABのプログラムからDiscordに通知を送信する仕組みです.

通知は、DiscordのWebhookを使用して送信されます.Webhookは、Discordのチャンネルに対して外部のアプリケーションからメッセージを送信できます.

このシステムは、以下のように動作します.

MATLABのプログラムにsendDiscordNotification関数(後述)を組み込みます.この関数は、通知メッセージをDiscordに送信する役割を果たします.

sendDiscordNotification関数の中で、webwrite関数を使ってDiscordのWebhookにPOSTリクエストを送信します.POSTリクエストには通知の内容が含まれます.

DiscordのWebhookが正常に受信し、通知が成功した場合、Discordからのレスポンスが返されます.

システムはレスポンスを確認し、通知が成功したかどうかを判定します.もし通知が成功していれば、「Discord通知が送信されました。」と表示され、失敗していれば「Discord通知の送信に失敗しました。」と表示されます.

このシステムを利用することで、MATLABのコードの実行状況や結果をリアルタイムでDiscord上で確認できるようになります.長時間かかる計算が終了した際に通知を受け取ることで、作業の進捗を把握できたり、エラーが発生した際にすぐに気づくことができる便利なシステムとなっています.

DiscordのWebhook用URLの取得方法

WebhookはDiscordサーバーと外部のサービスを連携できる機能のことです.

外部サービスの通知を特定のチャンネルに飛ばす目的でよく使われています.

通知したいチャンネルの設定から「連携サービス」を選択します.

連携サービスの中には「新しいウェブフック」という項目があるので,こちらを選択.

名前と通知するチャンネルを選択して,URLをコピーしておいてください.

具体的なコードの内容

今回コードは2種類用意が必要です.一つは実行したいコードで,内部に通知用のコードを呼び出すための細工をします.

もう一つは通知を送信するコードです.順番に説明します.

実行したいコード内の変更点

今回プログラムが終了したと通知したい元となるプログラムを以下のものにします.

% "Hello World"を表示するコード
disp('Hello World');

テストなので”Hello World”と表示されるだけの簡単なものになります.ご自身の使用しているプログラムをここに割り当ててください.

% 通知を送信する関数を呼び出します
    try
        sendDiscordNotification('Your Discord Webhook URL', 'MATLABコードが終了しました。');
    catch exception
        disp('エラーが発生しました。');
        disp(exception.message); % エラーメッセージを表示
    end
% "Hello World"を表示するコード
disp('Hello World');

sendDiscordNotification関数の呼び出し:

この部分は,先に定義されたsendDiscordNotification関数(後述)を呼び出しています.関数には2つの引数が渡されています.1つ目の引数は,DiscordのWebhookのURLを表す文字列です.

2つ目の引数は,通知メッセージの内容を表す文字列です.この関数の役割は,指定されたWebhookに対して通知メッセージをPOSTリクエストで送信することです.

try-catchブロック:

tryブロックでは,sendDiscordNotification関数の呼び出しが試行されます.catchブロックでは,もしsendDiscordNotification関数の呼び出しでエラーが発生した場合にエラーメッセージを表示します

catchブロックは,エラーが発生したときのための例外処理を行います.エラーメッセージはexception.messageで取得して,ディスプレイに表示されます.

sendDiscordNotification関数

function sendDiscordNotification(webhookURL, message)
    % Discordに通知を送信する関数
    % 送信するJSONデータを作成
    jsonData = struct('content', message);
    jsonData = jsonencode(jsonData);
    % Webhook URLにPOSTリクエストを送信
    try
        options = weboptions('RequestMethod', 'post', 'HeaderFields', {'Content-Type', 'application/json'});
        % 通知が成功したことを表示する
        disp('Discord通知が送信されました。');
    catch exception
        % 通知の送信に失敗したことを表示する
        disp('Discord通知の送信に失敗しました。エラーが発生しました。');
        disp(exception.message); % エラーメッセージを表示
    end
end

この関数は,MATLABのプログラムからDiscordに通知を送信するための関数です.以下に関数の動作と内容を説明します.

  1. 関数の引数
    • webhookURL:DiscordのWebhookのURLを指定する文字列型の引数です.通知を送信する先のWebhookのURLを指定します.
    • message:送信する通知メッセージの内容を表す文字列型の引数です.このメッセージがDiscordに通知として送信されます.
  2. JSONデータの作成: 関数内で,通知メッセージをJSONデータとして扱えるようにします.jsonDataという変数に通知メッセージをstruct('content', message)という形式で格納し,jsonencode関数を使用してJSON形式に変換します.これにより,メッセージがJSONデータとして送信されることが準備されます.
  3. WebhookにPOSTリクエストを送信weboptions関数を使用してPOSTリクエストのオプションを設定し,webwrite関数によってwebhookURLに対してPOSTリクエストを送信します.このリクエストには,先ほど作成したJSONデータが含まれており,DiscordのWebhookに通知メッセージが送信されます.
  4. 例外処理: 通信が正常に完了した場合,Discordからのレスポンスは取得されません.そのため,成功したことを示すレスポンスチェックは行われていません.ただし,エラーが発生した場合には例外処理が行われます.もし通信エラーやその他のエラーが発生した場合,catchブロック内のコードが実行されます.エラーメッセージはexception.messageで取得し,disp(exception.message)によってディスプレイに表示されます.
  5. 通知の送信結果の表示try-catchブロック内に,通知の送信結果を示す表示コードがあります.ただし,このコードは実際に通知が送信される処理が行われる前に置かれているため,通知が成功したかどうかは実際には判定されません.

通知成功!

先ほどのコードを実行してみます.無事コマンドウィンドウ内で”Hello World”が表示され,Discordに通知が送信されたと表示されていますね.

Discord側にもきちんとMATALABのコードが終了したという通知が来ています.

これで長時間プログラムを回した時でも,終了したことが瞬時に通知でわかるようになりました!

まとめ

今回はMATLABからDiscordに通知を送る方法についてまとめました.

私はDiscord初心者なので,もっといい方法もあるかもしれませんが,とりあえず今欲しい機能は手に入れられて満足ですね.

今後の展望としてはtoc関数等を用いて,かかった時間なんかも一緒にDiscordに通知できるように出来たらもっと便利になると思います.今後も改良していきます.

ご参考になれば幸いです.

コメント

タイトルとURLをコピーしました