2 回答
TA贡献2021条经验 获得超8个赞
这可能不是您正在寻找的答案,但我在开发自己的聊天机器人时也遇到了同样的问题。有两种解决方案的组合可以解决此问题:
解决方案 1:如果没有输入,或者没有消息文本和有效负载,则代码退出。这是我的代码的摘录:
$input = json_decode(file_get_contents('php://input'), true);
if(empty($input))
exit();
$messageText = $input['entry'][0]['messaging'][0]['message']['text'];
$messagePayload = $input['entry'][0]['messaging'][0]['postback']['payload'];
if(empty($messageText) && empty($messagePayload)) {
exit();
}
这是必要的,因为聊天机器人似乎只是一遍又一遍地用空请求向我的入口点发送垃圾邮件。然而...
解决方案 2:我将所有消息 id-s 保存在数据库中,如果一个已经在处理中,则退出。这是必要的,因为我在 API 中不断收到某些消息 2 或 3 次,并且我不得不避免两次回答相同的消息。这是一个简短的摘录:
$mid = $input['entry'][0]['messaging'][0]['message']['mid'];
$received = $this->user->isReceived($mid); // To avoid reacting to the same message twice
if($received) {
exit();
} else {
$this->user->logMsg($mid);
}
在isReceived函数中,我检查消息 id-s 的自定义表是否已包含此消息。在logMsg函数中,我存储了 id。然而,它们有点复杂并且依赖于框架,因此您必须自己编写这些函数,因为您认为它们适合您的项目。
祝你好运,我希望有人提出更好的解决方案。
TA贡献1847条经验 获得超7个赞
try {
// Returns a `FacebookFacebookResponse` object
$response = $fb->get(
'/{to_id}?fields=conversations{messages{message}}',
$accesstoken
);
} catch(FacebookExceptionsFacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$idchk = $response->getGraphNode();
$datachk = json_decode($idchk);
if (($data->object == "page")&&(strpos($idchk,'hey')=="")) {
try {
$response = $fb->post(
'/me/messages',
array (
'recipient' => '{
"id": "{to_id}"
}',
'message' => '{
"text": "hey"
}'
),
$accesstoken
);
exit;
} catch(FacebookExceptionsFacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
}}
exit;
- 2 回答
- 0 关注
- 115 浏览
添加回答
举报