FX / EA Python 個人開発

【サンプルコードあり】PythonでDiscordへ通知する方法|FX自動売買を例に解説

本ページにはプロモーションが含まれています。

Pythonで自動処理を動かしていると、「処理が終わったのか」「エラーが出ていないか」「結果をすぐ確認したい」と思う場面があります。

PythonからDiscordへ通知できるようにしておけば、エントリー情報や処理結果をスマホやPCからすぐに確認できます。

しかし、実際にDiscord通知を実装しようとすると、

  • PythonからDiscordへどうやって通知するのか
  • Discord Webhook URLはどこで取得するのか
  • Webhook URLはソースコードに直接書いていいのか
  • FX自動売買の注文情報をどうやって通知するのか

といった疑問を持つ方も多いのではないでしょうか。

そこで本記事では、PythonとDiscord Webhookを使って、Discordへ通知を送る方法を3ステップで解説します

まずはPythonからテスト通知を送れるところまで実装し、その後、FX自動売買を例にlive_trade.pyへ通知処理を組み込みます。

Pythonのサンプルコードも掲載しているので、FX自動売買はもちろん、スクレイピングやバッチ処理など、Pythonの処理結果をDiscordへ通知したい方はぜひ参考にしてください!

PythonからDiscordへ通知する仕組み

PythonからDiscordへ通知を送るには、DiscordのWebhook機能を利用します。

Webhookとは、外部のアプリやプログラムからDiscordのチャンネルへメッセージを送信するための仕組みです。

Pythonから指定したWebhook URLへメッセージを送信すると、Discordのチャンネルに通知が表示されます。

今回の記事では、以下のような流れでDiscord通知を実装します。

Pythonスクリプト
↓
Discord Webhook URLへメッセージを送信
↓
Discordのチャンネルに通知が届く

Webhookを使えば、Discord Botを作成しなくても比較的簡単に通知を送ることができます。

例えば、Pythonで次のような処理を行ったタイミングで通知を送ることが可能です。

  • プログラムの処理が完了したとき
  • エラーが発生したとき
  • スクレイピングで新しいデータを取得したとき
  • FX自動売買でエントリーや決済が行われたとき

今回はFX自動売買を例に、エントリーや決済の結果をDiscordへ通知します。

ただし、Discordへ通知する部分はFX専用ではありません。

Webhook URLへメッセージを送る仕組みは同じなので、ほかのPythonスクリプトにもそのまま応用できます。

次からは、実際にWebhook URLを取得し、PythonからDiscordへ通知を送る方法を3ステップで解説していきます。

PythonでDiscord通知を実装する3ステップ

ここからは、PythonからDiscordへ通知を送る方法を3ステップで解説します。

今回行う作業は、以下の3つです。

  • DiscordでWebhook URLを取得する
  • Discord通知用のPythonスクリプトを作成する
  • Pythonスクリプトを実行してテスト通知を送る

一度Webhook URLを取得して通知用スクリプトを作成しておけば、あとは通知したいタイミングで処理を呼び出すだけです。

まずは、Discord側でWebhook URLを取得していきましょう。

ステップ1|Discord Webhook URLを取得する

最初に、Pythonから通知を送るためのWebhook URLをDiscordで取得します。

Discordを開き、通知を送りたいチャンネルがあるサーバーを選択してください。

チャンネルを開いたら、「テキストチャンネル」の中の通知を送りたいチャンネルの「歯車マーク(⚙️)」の「チャンネルの編集」をクリックします。

編集画面を開いたら、左側のメニューから「連携サービス」を選択し、「ウェブフックを作成」をクリックします。

「ウェブフックURlを作コピー」をクリックすると、WebhookのURLがコピーされます。

URL:https://discord.com/api/webhooks/1.....

※必要であれば、Webhookの名前も分かりやすいものへ変更しておきましょう。特に変えなくても問題ありません。

このWebhook URLをPythonから使用することで、指定したDiscordチャンネルへ通知を送信できます。

なお、Webhook URLを知っている人は、そのURLを使ってメッセージを送信できてしまいます。

そのため、ブログやGitHubなどへWebhook URLをそのまま公開しないよう注意してください。

ステップ2|Discord通知用のPythonスクリプトを作成する

Webhook URLを取得できたら、PythonからDiscordへ通知するスクリプトを作成します。

今回はdiscord_notify.pyというファイルを作成し、以下のコードを記述してください。

discord_notify.py(通知テスト用)
import os

import requests


DISCORD_WEBHOOK_URL = os.environ.get("DISCORD_WEBHOOK_URL")


def send_discord_notification(message: str) -> None:
    if not DISCORD_WEBHOOK_URL:
        raise RuntimeError(
            "環境変数DISCORD_WEBHOOK_URLを設定してください。"
        )

    payload = {
        "content": message
    }

    response = requests.post(
        DISCORD_WEBHOOK_URL,
        json=payload,
        timeout=10,
    )

    response.raise_for_status()


if __name__ == "__main__":
    send_discord_notification("Pythonからのテスト通知です!")
    print("Discordへテスト通知を送信しました。")

このスクリプトでは、requests.post()を使ってDiscordのWebhook URLへメッセージを送信します。

Discordへ表示する内容は、以下のcontentに指定します。

payload = {
    "content": message
}

また、Webhook URLはソースコードへ直接記述せず、DISCORD_WEBHOOK_URLという環境変数から取得しています。

DISCORD_WEBHOOK_URL = os.environ.get("DISCORD_WEBHOOK_URL")

Webhook URLは第三者に知られると不正に利用される可能性があるため、GitHubなどへソースコードを公開する場合も、URLを直接書かないようにしましょう。

なお、requestsをインストールしていない場合は、以下のコマンドでインストールできます。

pip install requests

今すぐPythonからDiscordへ通知してみたい方は、このdiscord_notify.pyだけで試すことができます。

次のステップでWebhook URLを環境変数へ設定し、実際にDiscordへテスト通知を送信してみましょう。

ステップ3|環境変数を設定してDiscordへテスト通知を送信する

最後に、ステップ1でコピーしたWebhook URLを環境変数へ設定して、Discordへテスト通知を送ります。

WindowsのPowerShellを開き、以下のようにWebhook URLを設定してください。

$env:DISCORD_WEBHOOK_URL="ここに取得したWebhook URLを入力"

例えば、Webhook URLが以下だった場合、

https://discord.com/api/webhooks/XXXXXXXX/XXXXXXXX

次のように設定します。

$env:DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/XXXXXXXX/XXXXXXXX"

続いて、discord_notify.pyを保存したフォルダへ移動します。

cd ファイルパス

Webhook URLの設定とフォルダ移動ができたら、以下のコマンドを実行します。

python discord_notify.py

今回作成したdiscord_notify.pyは、単体で実行するとDiscordへテストメッセージを送信するようになっています。

実行後、ターミナルに以下のように表示されれば送信処理は完了です。

Discordへテスト通知を送信しました。

Discordを開き、設定したチャンネルに通知が届いているか確認してください。

Discordにメッセージが表示されていれば、PythonからDiscordへ通知する仕組みは完成です。

ここまでの処理だけでも、Pythonプログラムの処理完了やエラー発生など、さまざまな場面でDiscord通知を利用できます。

作成したDiscord通知をFX自動売買に組み込む

ここまでで、discord_notify.pyを単体で実行し、PythonからDiscordへ通知できることを確認しました。

次は、FX通知ように作成した以下の、fx_discord_notify.pyFX自動売買のスクリプトへ組み込みます

discord_notify.py(通知テスト用)とは異なりますので、注意してください。

以下がFX通知用のfx_discord_notify.pyです。

fx_discord_notify.py(FX通知用)
"""FX自動売買のエントリー情報をDiscordへ通知するサンプル。"""

import json
import os
from urllib.request import Request, urlopen

# 使い方:
# 1. Discordで通知先チャンネルのWebhook URLを取得します。
# 2. Webhook URLをソースコードへ直接書かず、環境変数へ設定します。
# 3. PowerShellなどを開き、このファイルを保存したフォルダへ移動します。
#    cd GMO-API
# 4. 次のコマンドを実行すると、Discordへテスト通知が届きます。
#    python fx_discord_notify.py
# 5. FX自動売買から使う場合は、発注後にnotify_fx_entry(order)を呼び出します。

# Webhook URLを読み込む環境変数の名前です。
# この文字列自体はWebhook URLではありません。
WEBHOOK_URL_ENV = "DISCORD_WEBHOOK_URL"


def send_discord_message(message, webhook_url=None):
    """Discord Webhookへメッセージを送信する。"""

    # 引数でURLが渡された場合はその値を使い、省略された場合は環境変数から読み込みます。
    # Webhook URLは第三者に知られると不正利用される可能性があるため、公開しないでください。
    url = webhook_url or os.environ.get(WEBHOOK_URL_ENV)

    # Webhook URLが見つからない場合は、Discordへ送信できないため処理を止めます。
    if not url:
        raise RuntimeError(
            f"環境変数{WEBHOOK_URL_ENV}へDiscord Webhook URLを設定してください。"
        )

    # Discordへ送る本文を、Webhookが受け取れるJSON形式に変換します。
    # ensure_ascii=Falseを指定すると、日本語をそのままUTF-8で送信できます。
    request_body = json.dumps(
        {"content": message}, ensure_ascii=False
    ).encode("utf-8")

    # Webhook URL、JSON本文、データ形式を指定してPOSTリクエストを作ります。
    request = Request(
        url,
        data=request_body,
        headers={"Content-Type": "application/json"},
        method="POST",
    )

    # Discordへリクエストを送り、応答がない場合は10秒でタイムアウトします。
    with urlopen(request, timeout=10) as response:
        # Discord Webhookは、通知に成功すると通常204を返します。
        # 204以外の場合は送信失敗としてエラーを表示します。
        if response.status != 204:
            raise RuntimeError(f"Discord通知に失敗しました(HTTP {response.status})。")


def notify_fx_entry(order, webhook_url=None):
    """live_trade.pyで作成した注文内容をDiscordへ通知する。"""

    # live_trade.pyのmake_ifd_oco_order()が作った注文情報から、
    # ターミナルに表示している主な項目を取り出して通知文を作ります。
    message = "\n".join(
        [
            "エントリーしました!",
            f"通貨ペア: {order['symbol']}",
            f"売買方向: {order['firstSide']}",
            f"注文方法: IFDOCO / {order['firstExecutionType']}",
            f"注文数量: {order['firstSize']}",
            f"エントリー価格: {order['firstPrice']}",
            f"利益確定価格: {order['secondLimitPrice']}",
            f"損切り価格: {order['secondStopPrice']}",
        ]
    )

    # 作成したエントリー通知文をDiscordへ送信します。
    send_discord_message(message, webhook_url)


def main():
    """Discordとの接続を確認するためのテスト通知を送る。"""

    # このファイルを単独で実行した場合は、固定のテストメッセージを送ります。
    send_discord_message("エントリーしました!")
    print("Discordへテスト通知を送信しました。")


# このファイルを直接実行したときだけmain()を動かします。
# live_trade.pyからimportした場合、テスト通知は自動送信されません。
if __name__ == "__main__":
    main()

今回は、別の記事で作成したlive_trade.pyを使用します

まだlive_trade.pyを作成していない場合は、先に以下の記事を参考に用意してください。

今回のlive_trade.pyでは、ローソク足の更新からエントリー判定、IFDOCO注文の作成・送信までを行います。

そこへ今回作成したDiscord通知を追加し、注文情報をDiscordから確認できるようにします。

ステップ1:fx_discord_notify.pyをlive_trade.pyと同じフォルダに配置する

まず、作成したfx_discord_notify.pylive_trade.pyと同じフォルダへ配置してください。

例えば、以下のような構成になります。

GMO-API/
├─ live_trade.py
├─ fx_discord_notify.py
├─ live_config.py
├─ backtest_config.py
├─ entry_signal.py
└─ ...

今回使用するfx_discord_notify.pyには、live_trade.pyで作成した注文情報を受け取り、Discordへ通知するnotify_fx_entry()を用意しています。

notify_fx_entry()では、以下の情報をDiscordへ送信します。

  • 通貨ペア
  • 売買方向
  • 注文方法
  • 注文数量
  • エントリー価格
  • 利益確定価格
  • 損切り価格

実際のfx_discord_notify.pyでも、orderからこれらの値を取得して通知文を作成しています。

また、Webhook URLはソースコードへ直接書かず、DISCORD_WEBHOOK_URLという環境変数から読み込むようにしています。

ステップ2:live_trade.pyにDiscord通知を追加する

次に、live_trade.pyへDiscord通知を追加します。

変更する箇所は2か所です。

まず、live_trade.pyのimport部分へ以下を追加してください。

from fx_discord_notify import notify_fx_entry

追加後は、以下のようになります。

import backtest_config as strategy
import candle_updater
import entry_signal
import live_config as config
from discord_notify import notify_entry
from order_recorder import save_order_record

これで、fx_discord_notify.pyに作成したnotify_fx_entry()live_trade.pyから呼び出せるようになります。

続いて、実際にDiscord通知を送信する処理を追加します。

live_trade.pyの後半にある、以下の部分を探してください。

save_order_record(config.ORDER_HISTORY_PATH, record)
print(f"保存先: {config.ORDER_HISTORY_PATH}")

if order_error is not None:
    raise order_error

save_order_record()の直後、if order_error is not None:の前へ、以下を追加します。

if order_error is None:
    notify_fx_entry(order)

変更後は、以下のようになります。

save_order_record(config.ORDER_HISTORY_PATH, record)
print(f"保存先: {config.ORDER_HISTORY_PATH}")

if order_error is None:
    notify_fx_entry(order)

if order_error is not None:
    raise order_error

これで、注文処理でエラーが発生していない場合に、orderの内容がfx_discord_notify.pyへ渡されます。

fx_discord_notify.py側では、受け取ったorderから通知文を作成し、Discord Webhookへ送信します。

つまり、処理の流れは以下のようになります。

エントリー条件を判定
↓
IFDOCO注文を作成
↓
デモ発注または実注文を処理
↓
注文履歴をCSVへ保存
↓
notify_fx_entry(order)を実行
↓
Discordへ注文情報を通知

通知文をlive_trade.pyの中で作成する必要はありません。

通貨ペアやエントリー価格などの整形は、すべてfx_discord_notify.pynotify_fx_entry()側で行います。

そのため、FX自動売買側へ追加するコードは、

from discord_notify import notify_entry

と、

if order_error is None:
    notify_fx_entry(order)

の2か所だけです。

ステップ3:Discordに届いた注文情報を確認する

live_trade.pyの追加が完了したら、実際にスクリプトを実行して確認します

なお、Discord通知にはWebhook URLが必要なので、PowerShellで事前に環境変数を設定しておいてください。

$env:DISCORD_WEBHOOK_URL="ここにWebhook URLを入力"

その後、live_trade.pyを実行します。

python live_trade.py

エントリー条件を満たして注文処理まで進むと、notify_fx_entry(order)が実行され、Discordへ注文情報が送信されます。

今回のfx_discord_notify.pyでは、以下のような内容が通知されます。

エントリーしました!
通貨ペア: USD_JPY
売買方向: BUY
注文方法: IFDOCO / LIMIT
注文数量: 10000
エントリー価格: 147.250
利益確定価格: 147.650
損切り価格: 146.950

これで、

FX自動売買でエントリー条件を判定
↓
GMO FXの注文情報を作成
↓
Discordへ注文内容を通知

という流れを作ることができました。

なお、今回の通知ではfx_discord_notify.py内で「エントリーしました!」と表示していますが、live_trade.pyでLIMIT注文を使用している場合、注文を送信した時点ではまだ約定していない可能性があります。

実際に注文が約定したかどうかや、利益確定・損切りで決済されたかどうかは、注文結果を取得する処理で確認します。

注文結果の取得方法については、以下の記事で詳しく解説しています。

PythonでDiscord通知を使用する際の注意点

PythonからDiscordへ通知する仕組み自体はシンプルですが、Webhook URLの扱いには注意が必要です

特に、Webhook URLが第三者に知られると、そのURLを使ってDiscordへメッセージを送信される可能性があります。

安全に利用するためにも、以下の2点は必ず意識しておきましょう。

Webhook URLをソースコードへ直接書かない

Webhook URLは、Pythonのソースコードへ直接記述しないようにしましょう。

例えば、以下のような書き方はおすすめできません。

DISCORD_WEBHOOK_URL = "https://discord.com/api/webhooks/..."

この状態でソースコードを共有したり、GitHubへアップロードしたりすると、Webhook URLまで一緒に公開される可能性があります。

今回作成したfx_discord_notify.pyでは、Webhook URLをソースコードへ直接書かず、DISCORD_WEBHOOK_URLという環境変数から取得するようにしています。

WEBHOOK_URL_ENV = "DISCORD_WEBHOOK_URL"

url = webhook_url or os.environ.get(WEBHOOK_URL_ENV)

実行時にPowerShellから以下のようにWebhook URLを設定すれば、Pythonコード内へURLを残さずに利用できます。

$env:DISCORD_WEBHOOK_URL="ここにWebhook URLを入力"

APIキーやパスワードなどと同様に、Webhook URLも外部へ公開しない情報として管理しておきましょう。

Webhook URLをGitHubなどへ公開しない

Webhook URLは、GitHubやブログ、SNSなどへ公開しないようにしてください。

Webhook URLを知っている人は、そのURLを利用して設定したDiscordチャンネルへメッセージを送信できる可能性があります。

そのため、以下のような場所にはWebhook URLをそのまま載せないようにしましょう。

  • GitHubなどの公開リポジトリ
  • ブログ記事のサンプルコード
  • XなどのSNS
  • Discordやチャットへ投稿するスクリーンショット

特にスクリーンショットをブログへ掲載する場合は、Webhook URLが画面に映り込んでいないか確認してください。

もし誤ってWebhook URLを公開してしまった場合は、そのURLをそのまま使い続けず、Discord側でWebhookを削除または再作成して、新しいWebhook URLへ切り替えるのがおすすめです。

今回の記事でも、サンプルコード内へWebhook URLを直接記載せず、環境変数から読み込む方法を使用しています。

このように、Webhook URLとPythonコードを分けて管理しておけば、ソースコードを公開する場合でも安全に扱いやすくなります。

PythonのDiscord通知に関するよくある質問

ここでは、PythonからDiscordへ通知する際によくある質問をまとめます。

Discordへの通知は無料で使えますか?

はい、今回紹介しているDiscord Webhookを使った通知は無料で利用できます。

DiscordでWebhook URLを作成し、PythonからそのURLへメッセージを送信するだけなので、通知するために追加料金はかかりません。

また、今回の記事で使用しているPythonも無料で利用できます。

そのため、

  • Discord
  • Discord Webhook
  • Python

を使った今回の通知機能は、基本的に無料で実装できます

FX自動売買だけでなく、スクレイピング結果やバッチ処理の完了通知などにも無料で応用できます。

Discord Botを作成しなくても通知できますか?

はい、できます。

今回の記事では、Discord Botを作成せず、Webhookを使ってPythonからDiscordへ通知しています。

通知先のチャンネルでWebhook URLを取得し、そのURLへPythonからメッセージを送信するだけなので、比較的簡単に実装できます。

単純に「Pythonの処理結果をDiscordへ送りたい」という場合は、Webhookを使う方法が分かりやすいです。

Discordへ通知が届かない場合はどうすればいいですか?

まずは、Webhook URLと環境変数が正しく設定されているか確認してください。

今回の記事では、Webhook URLをDISCORD_WEBHOOK_URLという環境変数から取得しています。

PowerShellの場合は、以下のように設定します。

$env:DISCORD_WEBHOOK_URL="ここにWebhook URLを入力"

その後、同じPowerShell上でPythonスクリプトを実行してください。

また、Webhookを作成したチャンネルが通知先として正しく設定されているかも確認しましょう。

Webhook URLは毎回設定する必要がありますか?

今回紹介しているPowerShellの以下の方法では、基本的にそのPowerShellを開いている間だけ環境変数が有効です。

$env:DISCORD_WEBHOOK_URL="ここにWebhook URLを入力"

PowerShellを閉じて新しく開いた場合は、再度設定する必要があります。

常に同じWebhook URLを使用する場合は、Windowsの環境変数として登録する方法もあります。

ただし、Webhook URLは第三者へ公開しないように管理してください。

FX自動売買以外でも利用できますか?

はい、利用できます。

今回の記事ではFX自動売買の注文情報を通知する例を紹介していますが、Discordへメッセージを送信する仕組み自体はFX専用ではありません。

例えば、以下のようなPythonプログラムでも利用できます。

  • スクレイピング結果の通知
  • バッチ処理の完了通知
  • エラー発生時の通知
  • 定期実行した処理の結果通知
  • Webアプリや個人開発ツールからの通知

Discordへ送りたい文字列を変更すれば、さまざまな用途へ応用できます。

まとめ

今回は、PythonからDiscordへ通知する方法を、FX自動売買を例に解説しました。

DiscordのWebhookを使えば、Pythonから比較的簡単にメッセージを送信できます。

今回行った内容は以下の通りです。

  • DiscordでWebhook URLを取得
  • PythonからDiscordへ通知するスクリプトを作成
  • Webhook URLを環境変数で管理
  • Pythonからテスト通知を送信
  • fx_discord_notify.pylive_trade.pyへ組み込み
  • FX自動売買の注文情報をDiscordへ通知

今回作成したDiscord通知は、FX自動売買専用ではありません。

通知するメッセージや呼び出すタイミングを変更すれば、スクレイピング結果やバッチ処理、エラー通知など、ほかのPythonプログラムにも応用できます。

また、Webhook URLは第三者に知られないよう、ソースコードへ直接書かず、環境変数などで管理するようにしましょう。

これで、FX自動売買で注文が発生した際に、PCを確認しなくてもDiscordから注文内容を確認できるようになります。

-FX / EA, Python, 個人開発