Группа в контакте несколько раз генерирует одни и те же запросы!

93
11 декабря 2021, 08:10

Написал чат бота и после того как ему задаёшь вопрос он отвечает но постоянно повторяет сообщение после отправки. Потом отключил его, но сегодня посмотрел запросы и увидел что даже когда робот не подключен группа генерирует запросы на которые бот должен был бы среагировать. Я уже голову сломал чтобы понять в чём проблема и где ошибка в коде бота или в настройках сообщества! Подскажи пожалуйста может вместе сможем найти ответ.

Вот такие запросы генерирует сообщество

вот часть кода бота Если вдруг ошибка там.

$rand = mt_rand(0000000000, 9999999999);
//Функции
function vk_send($method, $request) {
    $get_params = http_build_query($request);
    json_decode(file_get_contents(VK_API_ENDPOINT.$method.$get_params.'&access_token='.VK_API_TOKEN.'&v='.VK_API_VERSION));
}
function vk_print($user, $group_id) {
    $req = VK_API_ENDPOINT.'messages.setActivity?user_id='.$user.'&type=typing&peer_id='.$user.'&group_id='.$group_id.'&access_token='.VK_API_TOKEN.'&v='.VK_API_VERSION;
    json_decode(file_get_contents($req));
}
// ----------------------------------------------------------------------------------------------------------------------------------------------------
if (!isset($_REQUEST)) {
    return;
}
// Получаем и декодируем уведомление
$data = json_decode(file_get_contents('php://input'));
// Проверяем secretKey
if (strcmp($data->secret, VK_API_SECRETKEY) !== 0 && strcmp($data->type, 'confirmation') !== 0) {
    return;
}
// Используя switch проверим, что находится в поле «type» (какое событие сработало и в зависимости от этого сформируем ответ).
// Проверяем, что находится в поле "type"
switch ($data->type) {
    // Запрос для подтверждения адреса сервера (посылает ВК)
    case 'confirmation':
        // Отправляем строку для подтверждения адреса 
        echo VK_API_CONFIRMATIONTOKEN;
    break;
//--------------------------------------------------------------------------------------------------
    // Поиск нужного слова в сообщении
    case 'message_new':
    $userId = $data->object->peer_id;
        if (stripos($data->object->text,'сколько') !== false && stripos($data->object->text,'семейная') !== false ||
            stripos($data->object->text,'Сколько') !== false && stripos($data->object->text,'семейная') !== false 
            ) {
            //Если сообщение не первое то не будет здороваться
            if ($data->object->conversation_message_id > 1) {
                //Задержка
                sleep(3);
                // Через messages.send используя токен сообщества отправляем ответ
                $request_params = array(
                    'random_id' => $rand,
                    'user_id' => $userId,
                    'message' => "Стоимость"
                );
                //Отправление сообщения
                vk_print($userId, '35320184');
                sleep(12);
                vk_send('messages.send?', $request_params);

            }else{
                // через users.get получаем данные об авторе
                $request = VK_API_ENDPOINT.'users.get?user_ids='.$userId.'&access_token='.VK_API_TOKEN.'&v='.VK_API_VERSION;
                $response = file_get_contents($request);
                $response = json_decode($response,true);
                // Вытаскиваем имя отправителя
                $user_name = $response['response'][0]['first_name'];
                //Задержка
                sleep(3);
                // Через messages.send используя токен сообщества отправляем ответ
                $request_params = array(
                    'random_id' => $rand,
                    'user_id' => $userId,
                    'message' => "Здравствуйте, ".$user_name.".",
                );
                //Отправление сообщения
                vk_print($userId, '35320184');
                vk_send('messages.send?', $request_params);
            }
        }elseif (stripos($data->object->text,'сколько') !== false && stripos($data->object->text,'свадебная') !== false || 
                stripos($data->object->text,'сколько') !== false && stripos($data->object->text,'свадьбы') !== false
                ) {
            if ($data->object->conversation_message_id > 1) {
                //Задержка
                sleep(3);
                // Через messages.send используя токен сообщества отправляем ответ
                $request_params = array(
                    'random_id' => $rand,
                    'user_id' => $userId,
                    'message' => "Стоимость",
                    'dont_parse_links' => 0,
                    'disable_mentions' => 0
                );
                //Отправление сообщения
                vk_print($userId, '35320184');
                vk_send('messages.send?', $request_params);         
            }else{
                // через users.get получаем данные об авторе
                $request = VK_API_ENDPOINT.'users.get?user_ids='.$userId.'&access_token='.VK_API_TOKEN.'&v='.VK_API_VERSION;
                $response = file_get_contents($request);
                $response = json_decode($response,true);
                // Вытаскиваем имя отправителя
                $user_name = $response['response'][0]['first_name'];
                //Задержка
                sleep(3);
                // Через messages.send используя токен сообщества отправляем ответ
                $request_params = array(
                    'random_id' => $rand,
                    'user_id' => $userId,
                    'message' => "Здравствуйте, ".$user_name.,
                );
                //Отправление сообщения
                vk_print($userId, '35320184');
                vk_send('messages.send?', $request_params);
            }
        }
        // header('HTTP/1.1 200 OK');
        echo 'ok';
    break;
Answer 1

Как-то так:

class MessageSend
{  
    public function send ($msg, $user_id, $access_token)
    {   
        $request_params = array (
            "peer_id" => $user_id,
            "random_id" => "0",
            "message" => $msg,
            "access_token" => $access_token,
            "v" => "5.103");
        $get_params = http_build_query($request_params);
        file_get_contents("https://api.vk.com/method/messages.send?".$get_params);
    }
}
$ms = new MessageSend();
$root = json_decode(file_get_contents("php://input"));
$message = $data->message->text;
switch ($root->type) {
    case "confirmation":
        echo "000000";
        break;
                
    case "message_new":
        echo ("ok");
        switch ($message) {
            case "привет":
                sleep (2);  //Задержка
                $ms->send("Hello", "141435963", $access_token); //Отправляем сообщение
                break;
                
            case "мир":
                sleep (2); //Задержка
                $ms->send("World", "141435963", $access_token); //Отправляем сообщение
                break;
        }
        break;
        
}

В данном примере ВК в первую очередь получает сообщение что все "ок", а потом уже выполняет условия. Тем самым можно спокойно юзать sleep.

READ ALSO
Проверка пользователя ajax

Проверка пользователя ajax

Есть кнопка в игре "Купить"При нажатии на неё через Ajax отправляются данные о юзере (Id, имя) и обрабатываются далее php скриптом (снимается баланс,...

253
Отношения многие ко многим, как добавлять существующие значения в таблицу, если они уникальны?

Отношения многие ко многим, как добавлять существующие значения в таблицу, если они уникальны?

Вообщем у меня есть код, который добавляет Теги из ArticleController - в таблицу Tag значения(поле алиас уникальное), и сохраняется в промежуточную таблицу...

89
Laravel переодическое удаление старых записей

Laravel переодическое удаление старых записей

В БД есть таблица нотификаций, из которой нужно раз в месяц удалять устаревшие записи

116
On dublicate key Ошибка Mysqli

On dublicate key Ошибка Mysqli

Не пойму, что не нравится то ему?

120