PythonでDiscord Webhook通知!株価アラートを製造メーカー銘柄に設定する方法

Python実装・コード

以前LINEで株価アラートを実装した記事を書いたんですが、最近は投資仲間のDiscordサーバーに通知を飛ばしたくなりまして。。。しかも子供が生まれてからスマホ通知を妻に見られると「また株やってるの?」ってなるのがつらい。Discordならミュート設定も細かくできるし、PCだけで完結するので移植してみました。

なぜLINEからDiscordに移行しようと思ったか

LINEアラートは便利なんですが、スマホとPCの両方に通知が来てしまうんですよね。製造メーカー銘柄(トヨタ・コマツ・ファナックあたり)を監視していると、仕事中にもアラートが飛んできて会議中にスマホが震える→妻にバレる、という悪循環でした。Discordだと「PCのみ通知」にできるし、チャンネルを分けてカテゴリ管理もできる。投資仲間のサーバーで共有もしやすい。ということで乗り換えを決めました。

Discord Webhookとは?

Webhookとは、外部のプログラムからDiscordのチャンネルにメッセージを送るためのURLです。Botを作成したり認証を実装したりする必要がなく、URLにPOSTリクエストを送るだけで投稿できます。つまりPythonのrequestsライブラリだけで完結するんです。これが初心者にとって最高に楽なポイント。

WebhookのURLを取得する手順

まずDiscordサーバーの「サーバー設定」→「連携サービス」→「ウェブフック」から新しいWebhookを作成します。通知を送りたいチャンネルを選んでURLをコピーしておきましょう。このURLは絶対に公開しないように。GitHubにプッシュする際も環境変数に分離するのが鉄則です。

基本実装:シンプルなテキスト通知

まずは最もシンプルな形から。requestsでWebhook URLにPOSTするだけです。

import requests

webhook_url = "https://discord.com/api/webhooks/xxxx/あなたのWebhookURL"

def send_simple_message(text):
    payload = {"content": text}
    res = requests.post(webhook_url, json=payload)
    return res.status_code

# テスト
send_simple_message("テスト通知です!")

これだけで動きます。正直最初にこれを知ったとき「え、こんな簡単なの?」って声に出ました。

本命:Embedメッセージで見やすいアラートを作る

テキストだけでは味気ないので、Discord の「Embed(埋め込み)」機能を使って色付きの見やすいアラートにします。株価の上昇なら緑、下落なら赤にするだけで直感的になります。

import requests
import yfinance as yf
from datetime import datetime

webhook_url = "https://discord.com/api/webhooks/xxxx/あなたのWebhookURL"

def get_price_change(ticker):
    """前日比の価格変化率を返す"""
    stock = yf.Ticker(ticker)
    hist = stock.history(period="2d")
    if len(hist) < 2:
        return None, None, None
    prev_close = hist["Close"].iloc[-2]
    curr_price = hist["Close"].iloc[-1]
    pct_change = (curr_price - prev_close) / prev_close * 100
    return curr_price, prev_close, pct_change

def send_discord_alert(name, ticker, price, pct_change):
    """Discord Embedで株価アラートを送信"""
    # 上昇なら緑(0x34d399)、下落なら赤(0xf87171)
    color = 0x34d399 if pct_change >= 0 else 0xf87171
    direction = "📈" if pct_change >= 0 else "📉"

    embed = {
        "title": f"{direction} 株価アラート: {name}",
        "description": f"**{ticker}**",
        "color": color,
        "fields": [
            {
                "name": "現在株価",
                "value": f"{price:,.0f} 円",
                "inline": True
            },
            {
                "name": "前日比",
                "value": f"{pct_change:+.2f}%",
                "inline": True
            }
        ],
        "footer": {"text": "algo-trading.tokyo"},
        "timestamp": datetime.utcnow().isoformat()
    }

    payload = {"embeds": }
    res = requests.post(webhook_url, json=payload)
    return res.status_code

# 監視銘柄リスト(製造メーカー中心)
watchlist = {
    "7203.T": {"name": "トヨタ自動車", "threshold": 2.5},
    "6301.T": {"name": "コマツ",       "threshold": 3.0},
    "6954.T": {"name": "ファナック",   "threshold": 3.0},
    "7267.T": {"name": "ホンダ",       "threshold": 2.5},
}

print("株価アラート監視開始...")
for ticker, info in watchlist.items():
    price, prev, pct = get_price_change(ticker)
    if price is None:
        print(f"  {ticker}: データ取得失敗")
        continue

    if abs(pct) >= info["threshold"]:
        status = send_discord_alert(info["name"], ticker, price, pct)
        print(f"  ✅ {info['name']}: {pct:+.2f}% → Discord通知送信 (HTTP {status})")
    else:
        print(f"  ➖ {info['name']}: {pct:+.2f}% → 閾値以下、スキップ")

定期実行させる:Windowsタスクスケジューラと組み合わせる

このスクリプトを毎日市場が開く前(8:50頃)と引け後(15:30頃)に自動実行させるには、以前の記事で紹介したWindowsタスクスケジューラが使えます。バッチファイル(run_alert.bat)を作ってスケジュール登録するだけ。

@echo off
REM run_alert.bat
cd /d C:\Users\ken\algo-trading
python discord_alert.py

Webhook URLは.envファイルに入れてpython-dotenvで読み込む形にすると、GitHubにうっかりプッシュしてしまうリスクを減らせます。

# .env ファイル
DISCORD_webhook_url=https://discord.com/api/webhooks/xxxx/your-secret-url

# Python側での読み込み
from dotenv import load_dotenv
import os
load_dotenv()
webhook_url = os.getenv("DISCORD_webhook_url")

実際に動かしてみた感想

実装してみてよかったのは、Discordのチャンネルを「日本株アラート」「FXアラート」「エラーログ」に分けられること。LINEだと全部同じトーク画面に流れてきてごちゃごちゃになっていたので、これはかなり快適になりました。

あとEmbedの色分けが意外と便利で、Discord開いた瞬間に赤いメッセージが目に入ると「あ、どこかが下がってる」って瞬時にわかります。テキストオンリーだと読まないといけないので、地味に助かっています。

まとめ

Discord WebhookはBotを作らなくてもrequests.post()一発でメッセージが送れる、初心者にとって最もコスパの高い通知手段です。Embedで色付き・フィールド付きのリッチなメッセージにするのも10行追加するだけ。製造メーカー銘柄を監視している僕の場合、閾値を±2.5〜3.0%に設定したら通知の頻度もちょうどよくなりました。

個人的には次にやってみたいのが「複数銘柄をまとめて1つのEmbedにする」こと。今は銘柄ごとに別メッセージが飛んでくるので、朝の引け前後に5件くらい通知が来てちょっとうるさいんですよね。→ まとめて1通にする改善を次の記事で書こうと思います。

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