web-dev-qa-db-ja.com

Facebook Messenger webhookセットアップ、トリガーされない

そのため、新しいFacebook Messenger APIのボットをセットアップしようとしています。

クイックスタート をフォローしています。

Webhookをセットアップし、Webhookで確認します。

私はこれを呼んだ:

https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=%3Ctoken%3E

そして、それはエラーを投げませんでした、

ただし、アクセストークンを生成したページに移動してメッセージを送信しても、Webhookは呼び出されません。 httpaccessを確認しましたが、呼び出しません。

これやアイデアをデバッグする方法はありますか?

また、私がまだ困惑していることの1つは、1つのFacebookアプリから複数のページの管理をサポートする方法です。誰もがこれに対する答えを知っていますか、または新しいアプリを作成してすべてのページの許可を得る必要がありますか?

30
James

だから私の問題は、POSTの代わりにサブスクライブしようとするときにGETを呼び出していたということでした

https://graph.facebook.com/v2.6/:pageid/subscribed_apps?access_token=:token

GETは現在のサブスクリプションを返します(空の{[]})、POSTは{"success": "true"}を返します

私がヒットした他の落とし穴は、

  • 例では https://graph.facebook.com/v2.6/me/ ..を使用していますが、使用する必要があるように見えました https://graph.facebook.com/ v2.6 /:pageid
  • アクセストークンはメッセンジャーアクセストークンであり、APIアクセストークンではありません
  • webhookがエラーをスローすると、Facebookはしばらくの間メッセージの送信を停止します

私がまだ困惑していることの1つは、1つのFacebookアプリから複数のページの管理をサポートする方法です。誰もがこれに対する答えを知っていますか、または新しいアプリを作成してすべてのページの許可を得る必要がありますか?

10
James

最近、新しいチャットボットAPIを使用しましたが、うまくいかないことがたくさんあります。だから、ここにいくつかのアイデアがあります。

  • 製品設定タブでウェブフックを確認したことを確認してください。
  • ページアクセストークンを使用してアプリをページにサブスクライブします。すべてが順調であれば、{"success" : "true"}を返します。

重要

  • メッセージの送信元のFacebookユーザーがAdminまたはDeveloperまたはテスターアプリロール( https://developers.facebook.com/apps/YOUR_APP_ID/roles / )。アプリが承認されて一般公開されるまで、他のユーザーからのメッセージは機能しません。

  • Facebook apiからコールバックを受けましたか?それとも単なるメッセージですか? Webサーバーのログを調べて、Webhookでヒットしているかどうかを確認してください。エラーログも確認してください。

  • Webhookを手動でたたいてみて、応答するかどうかを確認してください。 curlを使用して、手動リクエストを生成できます。 Facebookからのリクエストは次のようになります。

コマンド:

curl -i -X POST -H 'Content-Type: application/json' -d '{"object":"page","entry":[{"id":43674671559,"time":1460620433256,"messaging":[{"sender":{"id":123456789},"recipient":{"id":987654321},"timestamp":1460620433123,"message":{"mid":"mid.1460620432888:f8e3412003d2d1cd93","seq":12604,"text":"Testing Chat Bot .."}}]}]}' https://www.YOUR_WEBHOOK_URL_HERE
43
Mukarram Khalid

一部の応答がWebhookに送信されないようにするもう1つのことは、メッセージタイプがキューでブロックされたときです。

特定のメッセージタイプがWebhookに配信されたが、20秒以内に200の応答を受信しない場合、そのメッセージを何時間も送信しようとし続けます。

さらにFacebookメッセンジャーは、最初のメッセージが確認されるまで、そのメッセージタイプの送信を停止します。基本的にそれらをキューに入れます。

それまでの間、他の種類のメッセージは引き続き正常に送信されます。

これは、標準メッセージを処理する未宣言の変数をコード内に誤って導入したときに起こりました。つまり、ポストバックメッセージはすべて正常に機能しましたが、迅速な返信と通常のメッセージがWebhookに送信されることはありませんでした。エラーを修正するとすぐに、それらすべてがすぐに山積みになります。

他の人が述べたように、POSTMANなどのサービスを使用してWebhookにメッセージを送信すると、この種のエラーを見つけることができます。

6
elMarquis

フレームワークを使用する場合、CSRF検証からボートルートを除外することができます。これは私にとって役立ちます(Laravel 5.4、app/Http/Middleware/VerifyCsrfToken.php):

protected $except = [
        '/your_bot_route'
    ];
4
SlowSuperman

それでも問題を解決できない場合は、プライバシーポリシーリンクを確認して更新してください。

プライバシーポリシーへの心配リンクを更新し、webhoobが検証されてもFacebookに404エラーが表示される...

0
Kin Cheng

私も数日前にボットに取り組んでいたときに同じ問題を抱えていました。これに続いて Gist を実行し、以下のようにコードを修正しました。すべて正常に動作しています。

public function index()
    {

        $challenge = $_REQUEST['hub_challenge'];
        $verify_token = $_REQUEST['hub_verify_token'];
        // Set this Verify Token Value on your Facebook App
        if ($verify_token === 'MyVerifyToken!') {
            echo $challenge;
        }
        $input = json_decode(file_get_contents('php://input'), true);
        // Get the Senders Graph ID
        $sender = $input['entry'][0]['messaging'][0]['sender']['id'];
        // Get the returned message
        $message = $input['entry'][0]['messaging'][0]['message']['text'];
        //$senderName = $input['entry'][0]['messaging'][0]['sender']['name'];

        $reply="Sorry, I don't understand you";

        switch($message)
        {
            case 'hello':
                $reply = "Hello, Greetings from MyApp.";
                break;
            case 'pricing':
                $reply = "Sample reply for pricing";
                break;
            case 'contact':
                $reply = "Sample reply for contact query";
                break;
            case 'webinar':
                $reply = "Sample reply for webinar";
                break;
            case 'support':
                $reply = "sample reply for support";
                break;
            default:
                $reply="Sorry, I don't understand you";
        }
        //API Url and Access Token, generate this token value on your Facebook App Page
        $url = 'https://graph.facebook.com/v2.6/me/messages?access_token=MYACCESSTOKEN';
        //Initiate cURL.
        $ch = curl_init($url);
        //The JSON data.
        $jsonData = '{
        "recipient":{
        "id":"' . $sender . '"
        },
        "message":{
            "text":"'.$reply.'"
            }
        }';
//Tell cURL that we want to send a POST request.
        curl_setopt($ch, CURLOPT_POST, 1);
//Attach our encoded JSON string to the POST fields.
        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
//Set the content type to application/json
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
//Execute the request but first check if the message is not empty.
        if (!empty($input['entry'][0]['messaging'][0]['message'])) {
            $result = curl_exec($ch);
        }

    }

:Webフックから応答を取得するには、アプリケーションページ内のユーザーロールを確認します。管理者とテスターユーザーを設定しました。そこだけが応答を得ることができました。これが公開されると、他のユーザーが取得します。また、検証トークンを変更し、それに応じてトークンをページングします。

このボットが使用されるビジネスの数について、アプリの公開中に尋ねられるオプションがあります。しかし、私はそれを使用する方法がわかりません。それでもそれを探しています。

0
Rajesh