Webhookを使って独自の連携を構築する

2026年10月12日に更新 読了時間:2分

「Webhookに投稿」ルールを使うと、新しいRSSフィードの記事が取得され次第、指定したWebhookエンドポイントに自動送信できます。キーワードを設定して、送信する記事を絞り込むこともできます。条件に一致する新しい記事があると、JSON形式のPOSTリクエストとしてWebhookエンドポイントに送信されます。

JSONペイロードの形式

Webhookに送信される各POSTリクエストには、postとfeedの2つの主要な要素が含まれます。

Webhookメッセージを識別するためのメタデータも含まれています。versionフィールドは、送信されるFeeder Webhook APIのバージョンを示します。バージョンは常に2023-06-26で、互換性を損なう変更が行われた場合に更新されます。

{
  "version": "2023-06-26",
  "message_id": "a unique UUID for this message, will be constant during retries",
  "feed": { ... },
  "post": { ... }
}

post要素には、個々の記事に関する情報が含まれます。

{
  "id": "The unique identifier of the post",
  "title": "The title of the post",
  "url": "The URL where the post can be accessed",
  "published": "The date and time when the post was published",
  "content": "The content of the post",
  "audio_url": "link to mp3 attached to post (if present)",
  "image_url": "link to image attached to post (if present)
}

注: RSSフィードに有効な公開日時が指定されていない場合、publishedはnullになります。

feed要素には、記事の配信元フィードに関する情報が含まれます。

{
  "id": "The unique identifier of the feed",
  "source_url": "The URL of the source, for example RSS/Atom feed URL",
  "public_url": "The source's self identified public URL",
  "title": "The title of the feed",
  "favicon": "The URL of the feed's favicon"
}

これらのオブジェクトには、今後項目が追加される場合があります。必要な情報が不足している場合は、お知らせください。

再試行の仕組み

リクエストが失敗すると、Feederは自動的に再試行します。POSTリクエストが200〜399のHTTPレスポンスコードを受け取らなかった場合、以下の間隔(秒単位)で再送を試みます。

  • 1回目: 5秒後
  • 2回目: 30秒後
  • 3回目: 60秒後
  • 4回目: 5分後
  • 5回目: 10分後
  • 6回目: 30分後
  • 7回目: 30分後
  • 8回目: 30分後

この再試行の仕組みは、実際の記事の配信時にのみ実行され、テスト通知には適用されません。また、再試行のタイミングは変更される場合があります。

デバッグ

エラーが発生した場合は、アクションの実行ログで確認できます。動作していないルールを開き、「エラーログを開く」を押してください。

失敗したWebhookについて、詳しい情報を確認できます。

Webhookの設定

Webhookを設定する手順は次のとおりです。

  1. ルールページを開きます。
  2. 新しいルールを作成します。
  3. 名前、フィード、条件を設定します。
  4. 「どうするべき?」セクションで「Webhookに投稿」を選択します。
  5. 入力欄にWebhook URLを入力します。
  6. 設定が正しいことを確認するには、「テストメッセージを投稿」ボタンを押して、エンドポイントにテスト通知を送信できます。これはテストであり、失敗しても再試行の仕組みは実行されません。また、テスト投稿を送信するには、投稿が追加されたフィードがアカウントに1つ以上必要です。

セキュリティ: Webhook署名の検証

受信したWebhookリクエストがFeederから送信されたものであり、改ざんされていないことを確認するには、Webhookごとに生成されるWebhookシークレットを使って検証できます。各Webhookリクエストには、リクエスト本文のHMAC-SHA256署名を含むX-Feeder-Signatureヘッダーが付与されます。

仕組み

  1. ルール設定で「アドバンスト」をオンにします。「Webhook Secret」欄に文字列が表示されます。
  2. FeederがエンドポイントにWebhookを送信するとき、シークレットをキーとしてJSONリクエスト本文のHMAC-SHA256ハッシュを計算します。
  3. 生成された署名は、sha256=を先頭に付けてX-Feeder-Signatureヘッダーに送信されます。例:
   X-Feeder-Signature: sha256=a1b2c3d4e5f6...
  1. サーバー側で、未加工のリクエスト本文と手元のシークレットを使って同じHMAC-SHA256ハッシュを再計算し、ヘッダーの値と比較します。

検証する理由

  • 正当性: リクエストが第三者ではなくFeederから送信されたことを確認できます。
  • 完全性: 送信中にペイロードが変更されていないことを保証します。

署名の検証方法

検証手順:

  1. 未加工のリクエスト本文を文字列として読み込みます。先に解析しないでください。
  2. シークレットを使って、その文字列のHMAC-SHA256を計算します。
  3. タイミング攻撃を防ぐため、タイミングセーフな比較を使って、計算した署名とX-Feeder-Signatureヘッダーの値を比較します。

例: Node.js (Express)

const crypto = require("crypto");

const WEBHOOK_SECRET = process.env.FEEDER_WEBHOOK_SECRET;

function verifyFeederSignature(req, res, next) {
  const signature = req.headers["x-feeder-signature"];
  if (!signature) {
    return res.status(401).send("Missing signature");
  }

  const expectedSignature =
    "sha256=" +
    crypto.createHmac("sha256", WEBHOOK_SECRET).update(req.body).digest("hex");

  const isValid = crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSignature)
  );

  if (!isValid) {
    return res.status(401).send("Invalid signature");
  }

  next();
}

// Important: use express.raw() so req.body is the raw string, not parsed JSON
app.post(
  "/webhook",
  express.raw({ type: "application/json" }),
  verifyFeederSignature,
  (req, res) => {
    const payload = JSON.parse(req.body);
    // Handle the webhook payload
    console.log("Received verified webhook:", payload);
    res.sendStatus(200);
  }
);

重要: 署名を検証するには、未加工のリクエスト本文を取得する必要があります。HMACの計算前にフレームワークがJSON本文を解析すると、再シリアライズされた文字列が元の文字列と異なる場合があり、署名が一致しません。Expressでは、上記のようにWebhookルートでexpress.raw({ type: "application/json" })を使用してください。

ほかにご質問はありますか?

ご質問は support@feeder.co までメールでお問い合わせください。

まだサポートが必要ですか?

サポートチームがすべてのメッセージに目を通しています。困っていることを教えてください。解決をお手伝いします。

サポートに連絡して