Python 實戰打造股票監控機器人:爬蟲資料直接發送到 Discord (Webhook 篇)

2025-12-27 03:23 | By justin | python Playwright Pandas discord
(Updated: 2025-12-27 03:23)

Python 實戰打造股票監控機器人:爬蟲資料直接發送到 Discord (Webhook 篇)

各位好!

上一篇中,我們成功把 0050 的成分股抓下來並存成了 Excel 檔。但說實話,身為一個極致懶惰的工程師,「主動去打開 Excel 檢查」這件事本身就太累了。

最好的自動化,應該是資訊要主動跳出來找我。

今天這篇我們進行最終進化:把爬蟲抓到的資料,整理成精簡的報表,直接推播到你的 Discord 頻道。

為什麼選擇 Webhook?

你可能聽過 Discord Bot,但寫一個真正的 Bot 需要申請開發者帳號、處理 Token、還要寫程式去監聽伺服器,對於只是想「單向發送通知」的需求來說,殺雞焉用牛刀。

Webhook 是一個超簡單的機制:Discord 給你一個專屬網址,你只要用 Python 往這個網址丟資料(POST Request),訊息就會出現在頻道裡。就這麼簡單。

第一步:取得 Discord Webhook 網址 打開你的 Discord,選定一個你想要接收通知的頻道(建議開一個私人伺服器測試)。

點擊頻道名稱旁的齒輪圖示 (編輯頻道)。

在左側選單點選 整合 (Integrations)。

點擊 Webhooks -> 建立 Webhook。

你可以幫機器人取名(例如:0050 監控員),然後點擊 複製 Webhook 網址。

⚠️ 注意:這串網址就像你的密碼一樣,擁有它的人都能往你的頻道發訊息,請不要隨意洩漏給別人! 第二步:安裝依賴 除了原本的 Playwright,我們需要 requests 來發送網路請求:

pip install requests playwright

第三步:撰寫程式碼

我們的邏輯如下:

Playwright:去元大官網把資料抓回來。

資料清洗:取出前 10 大權重股(全貼出來太長了,Discord 會洗版)。

Requests:把整理好的文字丟給 Discord。 完整 Python 程式碼

import time
import requests
from playwright.sync_api import Playwright, sync_playwright

# 請將這裡換成你剛剛複製的 Discord Webhook 網址,生產環境請放入.env中載入
DISCORD_WEBHOOK_URL = "https://discord.com/api/webhooks/xxxxxx/xxxxxx"

def send_discord_message(content):
    """發送訊息到 Discord"""
    data = {
        "content": content,
        "username": "0050 報價小幫手" # 你可以隨意改名
    }
    response = requests.post(DISCORD_WEBHOOK_URL, json=data)
    if response.status_code == 204:
        print("訊息已發送至 Discord")
    else:
        print(f"發送失敗: {response.status_code}")

def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=True) # 背景執行
    page = browser.new_page()

    print("正在抓取資料")
    page.goto("https://www.yuantaetfs.com/product/detail/0050/ratio")
    page.get_by_role("button", name="確定").click()
    page.get_by_text("展開").click()
    raw_text = page.locator("div:nth-child(3) > .each_table").all_inner_texts()[0]
    browser.close()
    print("正在整理報表")
    lines = raw_text.strip().split('\n')
    # 我們用 Markdown 的 Code Block (```) 讓排版變整齊
    message_lines = ["**0050 前十大成分股權重監控**", "```text"]
    message_lines.append(f"{'代號':<6} {'名稱':<6} {'權重(%)':>8}") # 表頭
    message_lines.append("-" * 24)

    count = 0
    for line in lines:
        parts = line.split()
        if len(parts) == 4 and parts[0].isdigit():
            code, name, _, weight = parts
            message_lines.append(f"{code:<6} {name:<6} {weight:>8}")

            count += 1
            if count >= 10: # 只取前 10 名
                break

    message_lines.append("```")
    message_lines.append(f"更新時間: {time.strftime('%Y-%m-%d %H:%M:%S')}")

    final_msg = "\n".join(message_lines)

    send_discord_message(final_msg)

if __name__ == "__main__":
    with sync_playwright() as playwright:
        run(playwright)

執行成果 執行程式後,你的 Discord 頻道應該會馬上收到像這樣的通知:

0050 前十大成分股權重監控
代號     名稱       權重(%)
------------------------
2330   台積電       61.31
2317   鴻海          4.59
2454   聯發科        3.41
2308   台達電        3.10
2891   中信金        1.49
2881   富邦金        1.38
3711   日月光投控     1.29
2882   國泰金        1.19
2382   廣達          1.17
2345   智邦          0.99
更新時間: 2025-12-27 09:30:00

進階技巧解析 Markdown 排版: 注意我在訊息裡用了 text ...。這在 Discord 裡會顯示成程式碼區塊,好處是它使用「等寬字體」。這樣我們在 Python 裡用空白鍵排版的表格(例如 :<6 靠左對齊),在手機或電腦上看才不會歪掉。

Webhooks 的限制: Discord Webhooks 有一些限制(例如每則訊息上限 2000 字)。所以如果你的資料量很大,建議只傳重點(如前十大),或者分段發送。

結語

至此,我們已經完成了一個微型的自動化資料 pipeline: Playwright 負責當眼睛,去網頁上看資料。 Python Logic 負責當大腦,過濾並整理資料。 Discord Webhook 負責當嘴巴,把資訊匯報給你。 這套邏輯可以應用在非常多場景:監控機票價格、搶演唱會門票通知、或是追蹤特定商品的庫存狀態。 現在,你只需要把這支程式設定在電腦的排程(Windows Task Scheduler 或 Linux Cron),每天早上它就會準時叫你起床看股票囉!


0 留言

目前沒有留言

發表留言
回覆