以前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通にする改善を次の記事で書こうと思います。

