「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を設定する手順は次のとおりです。
- ルールページを開きます。
- 新しいルールを作成します。
- 名前、フィード、条件を設定します。
- 「どうするべき?」セクションで「Webhookに投稿」を選択します。
- 入力欄にWebhook URLを入力します。
- 設定が正しいことを確認するには、「テストメッセージを投稿」ボタンを押して、エンドポイントにテスト通知を送信できます。これはテストであり、失敗しても再試行の仕組みは実行されません。また、テスト投稿を送信するには、投稿が追加されたフィードがアカウントに1つ以上必要です。
セキュリティ: Webhook署名の検証
受信したWebhookリクエストがFeederから送信されたものであり、改ざんされていないことを確認するには、Webhookごとに生成されるWebhookシークレットを使って検証できます。各Webhookリクエストには、リクエスト本文のHMAC-SHA256署名を含むX-Feeder-Signatureヘッダーが付与されます。
仕組み

- ルール設定で「アドバンスト」をオンにします。「Webhook Secret」欄に文字列が表示されます。
- FeederがエンドポイントにWebhookを送信するとき、シークレットをキーとしてJSONリクエスト本文のHMAC-SHA256ハッシュを計算します。
- 生成された署名は、
sha256=を先頭に付けてX-Feeder-Signatureヘッダーに送信されます。例:
X-Feeder-Signature: sha256=a1b2c3d4e5f6...
- サーバー側で、未加工のリクエスト本文と手元のシークレットを使って同じHMAC-SHA256ハッシュを再計算し、ヘッダーの値と比較します。
検証する理由
- 正当性: リクエストが第三者ではなくFeederから送信されたことを確認できます。
- 完全性: 送信中にペイロードが変更されていないことを保証します。
署名の検証方法
検証手順:
- 未加工のリクエスト本文を文字列として読み込みます。先に解析しないでください。
- シークレットを使って、その文字列のHMAC-SHA256を計算します。
- タイミング攻撃を防ぐため、タイミングセーフな比較を使って、計算した署名と
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 までメールでお問い合わせください。