Проблема с ботом, дублирует сообщения
Добрый день столкнулся с такой проблемой что бот вк дублирует мои сообщения.
$user_id = $data->object->from_id; //получение id пользователя
$id = ($user_id == $data->object->peer_id) ? $user_id : $data->object->peer_id; //id пользователя или беседы
$message = explode(" ", $data->object->text);
$cmd = explode(" ",mb_strtolower($data->object->text));
if ($data->type == 'message_new') {
if (in_array($cmd[0], $checker)){
if ($message[1] == ''){
} else {
$result = $db->query("SELECT * from states_core_members WHERE name = '?s' AND status = 0", $message[1]);
while ($row = $result->fetch_assoc()) {
$cont .= "--> \nНик: $row[name] \nУровень Администратора: $row[admin]\n Активонсть: $row[last]";
}
if ($cont){
$vk->sendMessage($id, 'Результаты:'.$cont);
}
}
}
}```
[1]: https://i.stack.imgur.com/4XaC4.jpg
Ответы (2 шт):
Вообще есть несколько причин из-за чего это может происходить:
Хостинг вводит ваш проект в режим сна, а, когда вконтакте отправляет запрос, проект начинает просыпаться и отправлять ответ, но не успевает и вконтакте приходится отправлять второй запрос. Такое явление наблюдается на популярном хостинге Heroku. Понять, что у вас именно это проблема можно так: обратитесь к боту два раза (допустим написав какую-то команду или слово в сообщения), если на первое обращение(команду) он ответит дублированием, а на второе нет, то у вас именно это проблема. Решением может служить только смена хостинга
Если сообщения дублируются много раз и постоянно, то это именно этот случай. Проблема тут заключается не в вас, а в вконтакте, это баг, который они не особо хотят фиксить. Чтобы устранить данный недуг нужно отправлять запросы методом POST, а не GET, хотя в документации про это ни слово.
Для начала нам понадобится массив с данными для запроса
$request_params = array(
'message' => "", //сообщение
'access_token' => TOKEN_VK_BOT, //токен для отправки от имени сообщества
'peer_id' => $data->object->message->from_id, //айди пользователя
'random_id' => 0, //0 - не рассылка
'read_state' => 1, //Хз зачем но надо
'user_ids' => 0, // Отправляете только 1 пользователю
'v' => VERSION_API_VK, //Версия API Vk
'payload' => 1000, //Хз зачем но надо
'attachment' => '' //Вложение
);
Изменить какой-то параметр, например, чтобы указать сообщение, можно так:
$request_params['message'] = "hello world!";
Дальше для отправки нам понадобится эта функция
function sendPOST($request_params){
$myCurl = curl_init();
curl_setopt_array($myCurl, array(
CURLOPT_URL => 'https://api.vk.com/method/messages.send',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($request_params),
));
curl_exec($myCurl);
curl_close($myCurl);
}
И наконец отправляем
sendPOST($request_params);
echo "ok";
И чтобы всё это заработало необходимо добавить curl зависимость в ваш composer.json
{
"require" : {
...
"ext-curl": "*"
},
}
Вообще есть ещё одно решение проблемы, но это говно код и я вообще не понимаю почему это работает. Нужно вывести ok разными способами одновременно, например return, echo, die и т.д., например вот
echo 'ok';
return 'ok';
die 'ok';
У вк есть параметр сообщений random_id. Как раз против такой шляпы сделан. Он не отправит второе сообщение, если первое уже отправилось. Не нужно менять хост/ещё что-то, можно просто использовать random_id.