Tuesday, October 20, 2026

finlight の Webhooks でニュースを Slack や Discord に送る

Kevin Bartsch

finlight の Webhooks でニュースを Slack や Discord に送る

ニュースをチームの目に最速で届ける方法は、彼らがすでに見ているチャットへ流し込むことです。finlight の webhooks を使えば、ポーリングは不要です。記事がフィルター条件に一致した瞬間に、finlight があなたの エンドポイントを呼び出します。このチュートリアルでは、webhook を検証して Slack や Discord に転送する、 小さな Python エンドポイントを構築します。

finlight webhooks の仕組み

ダッシュボードで webhook を作成し、そのフィルター(ティッカー、カテゴリ など)を設定して、エンドポイント URL を finlight に渡します。記事が一致すると、finlight はその記事を あなたのエンドポイントに POST し、リクエストに署名するので、それが本当に finlight から来たものだと確認 できます。各リクエストには 2 つのヘッダーが付きます。

  • X-Webhook-Signature — ボディの HMAC-SHA256 署名です。
  • X-Webhook-Timestamp — リプレイを拒否するために使われます(5 分間の許容ウィンドウ)。

公式 SDK がこの両方をあなたの代わりに検証します。

エンドポイント

import os

import requests
from flask import Flask, request
from finlight_client import WebhookService, WebhookVerificationError

app = Flask(__name__)

WEBHOOK_SECRET = os.environ["FINLIGHT_WEBHOOK_SECRET"]
CHAT_WEBHOOK_URL = os.environ["CHAT_WEBHOOK_URL"]


@app.route("/finlight-webhook", methods=["POST"])
def finlight_webhook():
    raw_body = request.get_data(as_text=True)
    signature = request.headers.get("X-Webhook-Signature")
    timestamp = request.headers.get("X-Webhook-Timestamp")

    try:
        article = WebhookService.construct_event(
            raw_body, signature, WEBHOOK_SECRET, timestamp
        )
    except WebhookVerificationError:
        return "", 400

    text = (
        f"*{article.title}*\n"
        f"{article.sentiment} · {article.source}\n"
        f"{article.link}"
    )

    # Slack incoming webhook expects {"text": ...}
    requests.post(CHAT_WEBHOOK_URL, json={"text": text})
    return "", 200

WebhookService.construct_event(...) は署名をチェックし、タイムスタンプを検証して、パース済みの Article を返します。いずれかの段階で失敗すると WebhookVerificationError を送出するので、その場合は 400 を返します。

代わりに Discord へ送る

Discord の incoming webhook は text ではなく content フィールドを使います。この post を入れ替える だけです。

requests.post(CHAT_WEBHOOK_URL, json={"content": text})

それ以外はすべて同じです。

必ず検証する

検証は重要です。これがないと、あなたの URL を見つけた誰もが偽の記事をチャンネルに投稿できてしまいます。 必ず生の、未パースのボディを construct_event に渡してください(先に再シリアライズしないこと)。エンド ポイントのシークレットは環境変数に入れ、finlight を待たせないよう素早く応答を返しましょう。

エンリッチ版とロー版

finlight はエンリッチ版 webhook(センチメントとエンティティ付き)とロー版 webhook(軽量で高速)を提供 しています。アラートにセンチメントや関係する企業を表示したいときはエンリッチ版を、とにかく見出しを できるだけ速く受け取りたいときはロー版を使いましょう。

次に読むもの

無料 API キーを取得する →