Tạo tích hợp riêng bằng Webhook

Cập nhật 13 Tháng mười, 2026 Đọc trong 5 phút

Quy tắc “Gửi đến Webhook” giúp bạn tự động gửi bài viết RSS mới đến endpoint webhook đã chỉ định ngay khi bài viết xuất hiện. Bạn cũng có thể lọc bài viết được gửi bằng cách thiết lập từ khóa. Khi bài viết mới khớp với tiêu chí, bài viết sẽ được gửi đến endpoint webhook của bạn bằng yêu cầu POST có định dạng JSON.

Định dạng dữ liệu JSON

Mỗi yêu cầu POST gửi đến webhook của bạn gồm hai thành phần chính: post và feed.

Yêu cầu cũng chứa siêu dữ liệu để nhận diện thông điệp webhook. Trường version cho biết phiên bản API webhook Feeder được sử dụng. Giá trị phiên bản luôn là 2023-06-26 và sẽ được cập nhật nếu có thay đổi không tương thích ngược.

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

Thành phần post chứa thông tin về từng bài viết:

{
  "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)
}

Lưu ý: published sẽ có giá trị null nếu nguồn cấp RSS không cung cấp ngày xuất bản hợp lệ.

Thành phần feed cung cấp thông tin về nguồn cấp chứa bài viết:

{
  "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"
}

Trong tương lai, chúng tôi có thể bổ sung các trường vào những đối tượng này. Nếu bạn cần thêm thông tin nào, hãy cho chúng tôi biết.

Thử gửi lại khi lỗi

Nếu yêu cầu thất bại, Feeder sẽ tự động thử gửi lại. Nếu yêu cầu POST không nhận được mã phản hồi HTTP từ 200 đến 399, chúng tôi sẽ thử gửi lại theo lịch cụ thể sau, tính bằng giây:

  • Lần thử 1: Sau 5 giây
  • Lần thử 2: Sau 30 giây
  • Lần thử 3: Sau 60 giây
  • Lần thử 4: Sau 5 phút
  • Lần thử 5: Sau 10 phút
  • Lần thử 6: Sau 30 phút
  • Lần thử 7: Sau 30 phút
  • Lần thử 8: Sau 30 phút

Lưu ý, cơ chế thử gửi lại chỉ được kích hoạt khi có sự kiện bài viết thực tế, không áp dụng cho thông báo thử nghiệm. Thời gian chờ cũng có thể thay đổi.

Gỡ lỗi

Nếu xảy ra lỗi, bạn có thể xem lỗi trong nhật ký chạy hành động. Mở quy tắc đang gặp sự cố rồi nhấn “Mở nhật ký lỗi”.

Tại đó, bạn sẽ thấy thêm chi tiết về các webhook gửi thất bại.

Thiết lập webhook

Cách thiết lập webhook:

  1. Mở trang Quy tắc.
  2. Tạo Quy tắc mới.
  3. Nhập tên, chọn nguồn cấp và tiêu chí.
  4. Trong phần “Hành động sẽ diễn ra là gì?”, chọn “Gửi đến Webhook”.
  5. Nhập URL webhook vào trường văn bản được cung cấp.
  6. Để đảm bảo mọi thứ đã được thiết lập chính xác, bạn có thể dùng nút “Gửi tin nhắn thử” để gửi thông báo thử nghiệm đến endpoint của mình. Lưu ý, đây chỉ là lần thử nghiệm và nếu thất bại thì sẽ không kích hoạt cơ chế thử gửi lại. Ngoài ra, để gửi được bài viết thử nghiệm, tài khoản của bạn cần có ít nhất 1 nguồn cấp đã thêm bài viết.

Bảo mật: Xác minh chữ ký webhook

Để đảm bảo các yêu cầu webhook nhận được thực sự đến từ Feeder và không bị giả mạo, bạn có thể xác minh webhook secret được tạo cho mỗi webhook. Mỗi yêu cầu webhook đều có header X-Feeder-Signature chứa chữ ký HMAC-SHA256 của nội dung yêu cầu.

Cách hoạt động

  1. Trong phần cài đặt Quy tắc, bật tùy chọn “Nâng cao”. Bạn sẽ thấy một chuỗi trong trường “Webhook Secret”.
  2. Khi Feeder gửi webhook đến endpoint của bạn, hệ thống sẽ tính mã băm HMAC-SHA256 của nội dung yêu cầu JSON, dùng secret của bạn làm khóa.
  3. Chữ ký được tạo sẽ gửi trong header X-Feeder-Signature, với tiền tố sha256=. Ví dụ:
   X-Feeder-Signature: sha256=a1b2c3d4e5f6...
  1. Trên máy chủ, bạn tính lại mã băm HMAC-SHA256 bằng nội dung yêu cầu thô và bản sao secret của mình, sau đó so sánh với giá trị trong header.

Tại sao nên dùng?

  • Tính xác thực: Xác nhận yêu cầu do Feeder gửi, không phải bên thứ ba.
  • Tính toàn vẹn: Đảm bảo dữ liệu gửi đi không bị sửa đổi trong quá trình truyền.

Xác minh chữ ký

Cách xác minh:

  1. Đọc nội dung yêu cầu thô dưới dạng chuỗi, không phân tích cú pháp trước.
  2. Tính HMAC-SHA256 của chuỗi đó bằng secret của bạn.
  3. So sánh chữ ký vừa tính với giá trị trong header X-Feeder-Signature bằng phương pháp so sánh an toàn về thời gian để ngăn chặn các cuộc tấn công phân tích thời gian.

Ví dụ: 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);
  }
);

Quan trọng: Bạn phải truy cập nội dung yêu cầu thô để xác minh chữ ký. Nếu framework phân tích cú pháp nội dung JSON trước khi bạn tính HMAC, chuỗi được tuần tự hóa lại có thể khác với chuỗi gốc và chữ ký sẽ không khớp. Trong Express, hãy dùng express.raw({ type: "application/json" }) trên tuyến webhook như minh họa ở trên.

Còn câu hỏi nào không?

Có câu hỏi? Hãy gửi email cho chúng tôi theo địa chỉ support@feeder.co.

Bạn vẫn cần trợ giúp?

Đội ngũ hỗ trợ của chúng tôi đọc mọi tin nhắn. Hãy cho chúng tôi biết vấn đề bạn đang gặp phải và chúng tôi sẽ hỗ trợ.

Liên hệ hỗ trợ