2

Mon bot Facebook fonctionne mais il renvoie plusieurs messages après mon message initial. Ceci est mon script webhook (je l'apprécie est un exemple de travail très rude):Facebook Chat bot (PHP webhook) envoi de plusieurs réponses

$challenge = $_REQUEST['hub_challenge']; 
$verify_token = $_REQUEST['hub_verify_token']; 

if ($verify_token === 'MY_VERIFICATION_TOKEN') { 
    echo $challenge; 
} 

$input = json_decode(file_get_contents('php://input'), true); 

$sender = $input['entry'][0]['messaging'][0]['sender']['id']; 
$message = $input['entry'][0]['messaging'][0]['message']['text']; 


//API Url 
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<my-token>'; 

//Initiate cURL. 
$ch = curl_init($url); 

//The JSON data. 
$jsonData = '{ 
    "recipient":{ 
     "id":"'.$sender.'" 
    }, 
    "message":{ 
     "text":"Hey Lee!" 
    } 
}'; 

//Encode the array into JSON. 
$jsonDataEncoded = $jsonData; 

//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, $jsonDataEncoded); 

//Set the content type to application/json 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 

//Execute the request 
$result = curl_exec($ch); 

Répondre

8

je pense qu'il est parce que vous ne vérifiez pas si les messages envoyés sont vides:

essayer ceci:

$challenge = $_REQUEST['hub_challenge']; 
$verify_token = $_REQUEST['hub_verify_token']; 

if ($verify_token === 'MY_VERIFICATION_TOKEN') { 
    echo $challenge; 
} 

$input = json_decode(file_get_contents('php://input'), true); 

$sender = $input['entry'][0]['messaging'][0]['sender']['id']; 
$message = $input['entry'][0]['messaging'][0]['message']['text']; 


//API Url 
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<my-token>'; 

//Initiate cURL. 
$ch = curl_init($url); 

//The JSON data. 
$jsonData = '{ 
    "recipient":{ 
     "id":"'.$sender.'" 
    }, 
    "message":{ 
     "text":"Hey Lee!" 
    } 
}'; 

//Encode the array into JSON. 
$jsonDataEncoded = $jsonData; 

//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, $jsonDataEncoded); 

//Set the content type to application/json 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 

//Execute the request 
if(!empty($input['entry'][0]['messaging'][0]['message'])){ 
$result = curl_exec($ch); 
} 
+0

Obtenir ces erreurs étranges: au lieu '
Obsolète: automatiquement peuplant HTTP_RAW_POST_DATA $ est dépréciée et seront supprimées dans une version ultérieure. Pour éviter cet avertissement, réglez 'always_populate_raw_post_data' sur '-1' dans php.ini et utilisez plutôt le flux d'entrée php: //. dans inconnu en ligne

Attention: Impossible de modifier les informations d'en-tête - en-têtes ont déjà été envoyés Unknown en ligne
{ "erreur": { "message": "Accès non valide OAuth jeton. "," type ":" OAuthException "," code ": 190," fbtrace_id ":" BsNG \/mJVYem "}} ^ Comme – Volatil3

+0

Vous devez mettre exit(); après l'écho $ challenge; ligne – mileusna

+0

Je suis également confronté à un problème similaire, mais j'ai ajouté un chèque pour le message vide (livraison). Quand j'ai vérifié l'URL du webhook, il semble que l'on tape deux fois. J'utilise ngrok avec le serveur local comme webhook et je peux clairement voir que l'URL de webhook est accédée deux fois avec le champ de message rempli les deux fois. Une idée?? – thekosmix

8

FB frappe votre url webhook avec le message entrant original et vous traiter. Vous envoyez ensuite une réponse à l'utilisateur et le script se termine. Ensuite, une fois le message remis à l'utilisateur, FB envoie une confirmation de livraison à l'URL du webhook. Puisque votre script est toujours configuré pour envoyer "Hey Lee!" à chaque fois que cela est appelé, le rappel de livraison déclenche réellement l'envoi d'un autre message, puis une autre confirmation de livraison arrive, puis ce processus se répète. Pour résoudre ce problème, mettez une instruction if autour de votre code pour envoyer un message. Voici un exemple.

$challenge = $_REQUEST['hub_challenge']; 
 
$verify_token = $_REQUEST['hub_verify_token']; 
 

 
if ($verify_token === 'MY_VERIFICATION_TOKEN') { 
 
    echo $challenge; 
 
} 
 

 
$input = json_decode(file_get_contents('php://input'), true); 
 

 
$sender = $input['entry'][0]['messaging'][0]['sender']['id']; 
 
$message = $input['entry'][0]['messaging'][0]['message']['text']; 
 

 

 
//API Url 
 
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<my-token>'; 
 

 
//Initiate cURL. 
 
$ch = curl_init($url); 
 

 
if($message=="hello") 
 
{ 
 
     //The JSON data. 
 
     $jsonData = '{ 
 
     "recipient":{ 
 
       "id":"'.$sender.'" 
 
     }, 
 
     "message":{ 
 
       "text":"Hey Lee!" 
 
     } 
 
     }'; 
 
} 
 

 
//Encode the array into JSON. 
 
$jsonDataEncoded = $jsonData; 
 

 
//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, $jsonDataEncoded); 
 

 
//Set the content type to application/json 
 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
 

 
//Execute the request 
 
$result = curl_exec($ch);

Hope qui aide.

+0

J'utilise l'exemple. Webhook a été vérifié, Lorsque j'essaie de signaler mon bot, il ne renvoie rien. Je ne sais pas non plus comment déboguer la page Webhooked – Volatil3

+0

J'ai eu le défi de déboguer aussi mais parce que Drupal (la plate-forme backend pour mon Chatbot) bascule il a une fonction appelée Watchdog qui est un module de journalisation pour que vous puissiez tout envoyer à Watchdog déboguer. Rend le processus très très facile. Comme ceci: $ input = json_decode (file_get_contents ('php: // input'), true); watchdog ("Webhook Data Received", "

' . print_r($input, true) . '
"); –

+0

Le fait qu'un webhook soit posté pour la confirmation de la livraison m'a eu. Merci beaucoup @Drew. –

0

Essayé même, la première requête contient le message d'utilisateur réel, l'autre demandes non. Je viens envoyer une réponse si le
$message = $input['entry'][0]['messaging'][0]['message']['text']; est non nul:

if ($message){ 
//send your message here 
} 
+0

Comment envoyer une réponse multiple à un seul message, si quelqu'un dit Salut, Bot devrait répondre Salut (1er message), Quel est votre nom (2e message) .. – Srinivas08