2016-04-19 30 views
5

Tôi đang học cách làm việc với Facebook Messenger API. Tôi đã thiết lập thành công một webhook, tôi đã đăng ký vào ứng dụng. Nhưng khi tôi gửi tin nhắn đến trang của tôi, tôi nhận được nhiều phiên bản của cùng một tin nhắn như một vụ nổ.Facebook Messenger Webhook liên tục gửi tin nhắn

Tôi đang lưu trữ thư mà tôi gửi từ ứng dụng của mình khi nhận được tại Webhook.

Chế độ xem cơ sở dữ liệu của tôi trông giống như trong ảnh chụp màn hình bên dưới.

http://prntscr.com/au3emz

Tôi đoán nó có thể là do thông điệp vẫn chưa đọc? Chỉ cần một dự đoán hoang dã có thể là một người khác biết chắc chắn. Tôi đã thử ví dụ chính xác của Văn phòng Facebook (Node) và nó cũng đang diễn ra ở đó.

Cảm ơn.

+1

Tôi cũng đã gặp sự cố này. Khi tôi gửi cho người dùng tin nhắn nút, móc web của tôi bắt đầu gửi tin nhắn nút không ngừng –

+0

Có vấn đề này bằng cách sử dụng ClaudiaJS và AWS Lambda cho một bot trò chuyện facebook. Đã được yêu cầu tăng thời gian chờ, cắm nó lên đến 3 phút và nó vẫn xảy ra. – SMT

Trả lời

0

Giải pháp

Tôi đã gửi một yêu cầu đăng ký một lần nữa để ứng dụng của tôi để ngăn chặn những tin nhắn.

Vì vậy, về cơ bản những gì tôi có kinh nghiệm là ứng dụng đăng ký lại webhook sau khi nhận được tin nhắn sẽ ngừng nhận thêm bất kỳ tin nhắn tiếp theo cho đến khi tiếp theo.

Đây là giải pháp cốt lõi của "Tại sao điều này xảy ra?" vẫn chưa được biết đến. Sẽ rất vui nếu ai đó có thể đóng góp.

Cảm ơn.

+0

Tôi nhận thấy đây là một bài đăng cũ nhưng bạn phải gửi phản hồi '200 OK' nhanh nhất có thể trở lại Facebook nếu không nó sẽ làm chậm trễ đáng kể các phản hồi tiếp theo. Về cơ bản mọi thứ trở nên kỳ quặc nếu bạn không. –

1

Tôi đã gặp vấn đề tương tự với đơn đăng ký thử nghiệm của mình. Tôi vẫn còn mới với Messenger API và giải pháp của tôi có thể ngây thơ.

Ban đầu, mã giống như:

if (text) { 
    sendTextMessage(sender, 'Response 1'); 
} else { 
    queryDB(
    sendTextMessage(sender, 'Response 2'); 
) 
} 
res.sendStatus(200); 

nào tiếp tục cử đáp ứng 1 mãi mãi. Mã đúng là:

if (text) { 
    sendTextMessage(sender, 'Response 1'); 
    res.sendStatus(200); 
} else { 
    queryDB(
    sendTextMessage(sender, 'Response 2'); 
    res.sendStatus(200); 
) 
} 

Bạn phải gửiStatus luôn sau khi gửi thư.

2

Điều này thường xảy ra nếu bạn đăng ký với thông báo echocallback event.

Từ tài liệu;

Cuộc gọi lại này sẽ xảy ra khi một tin nhắn được gửi bởi trang của bạn.

Điều này ngụ ý là bạn sẽ lấy lại bản sao của bất kỳ tin nhắn nào mà bot của bạn gửi. Từ mã của bạn, điều này sẽ gây ra một dạng vòng lặp vô hạn; bạn sẽ tiếp tục nhận được Response 1.

Bạn có thể dễ dàng xác nhận điều này bằng cách kiểm tra giá trị text; bạn sẽ tìm thấy nó cũng là Response 1 và khi kiểm tra toàn bộ tải trọng, nó sẽ có trường "is_echo":true.

Giải pháp: Chỉnh sửa đăng ký trang web của bạn để loại trừ message_echoes

enter image description here

1

tôi phát hiện rằng betwen facebook gọi và phản ứng của tôi với 200 statusCode mã của tôi đang đợi 2 giây, mã của tôi là syncronous, do đó , tổng số mã của tôi phản hồi với 200 mã 2 giây sau khi ..
Nhiều đầu dò kết quả cho tôi rằng nếu tôi không gửi 200 mã trạng thái cho facebook trong một giây gửi lại tin nhắn tới webhook. Đối với tôi, giải tích đã phân tích thông điệp gửi đến và nhận được dấu thời gian (A), sau đó tôi nhận được một dấu thời gian từ một cơ sở dữ liệu (B). so sánh A == B .. nếu là đúng, tôi không xử lý kết nối webhook và ends.my, nếu sai thì hãy ghi vào cơ sở dữ liệu dấu thời gian mới (A) và tiếp tục với việc mua sắm webhook.

Các vấn đề liên quan