За последние 24 часа нас посетили 17214 программистов и 1639 роботов. Сейчас ищут 1785 программистов ...

Бот для вк

Тема в разделе "Прочее", создана пользователем Teel, 7 май 2020.

  1. Teel

    Teel Новичок

    С нами с:
    7 май 2020
    Сообщения:
    4
    Симпатии:
    1
    Пишу бота для вк. Для отправки сообщений, клавиатур и прочих функций использую библиотеку vk_api. Сами функции рабочие и по отдельности работают без нареканий. Однако возникает проблема когда пытаюсь в одном кейсе вызвать поочерёдно две функции. Срабатывает только та, что идёт первой, а последующая игнорируется. В чём может быть проблема?

    Вот сам код бота
    PHP:
    1. <?php
    2.  
    3. include "vk_api.php";
    4. include "buttons.php";
    5.  
    6. const VK_KEY = "Тут токен";  // Токен сообщества
    7. const ACCESS_KEY = "Тут ключ";  //ключ из сообщества
    8. const VERSION = "5.102"; // Версия API VK
    9.  
    10. $vk = new vk_api(VK_KEY, VERSION);
    11. $data = json_decode(file_get_contents('php://input'));
    12.  
    13.  
    14. // ====== Наши переменные ============
    15. $peer_id = $data->object->peer_id;// Узнаем ID пользователя, кто написал нам
    16. $message = $data->object->text; // Само сообщение от пользователя
    17. $random_id = rand(0,9999);
    18. // ==================
    19.  
    20. switch ($data->type) {
    21.     case 'confirmation':
    22.         exit(ACCESS_KEY);
    23.         break;
    24.  
    25.     case 'message_new':
    26.         switch (mb_strtolower($message)){
    27.             case 'привет':
    28.                 $vk->sendButton($peer_id, "Вот список кнопок, выбирайте :-)", [[BTN_BACK], [BTN_HIDE]], $random_id); // вызов кнопок
    29.                 $vk->sendMessage($peer_id, "Вы выбрали кнопку, любой ответ на это событие", $random_id);
    30.                 break;
    31.  
    32.             case 'пока':
    33.                 $vk->sendButton($peer_id, "Вот список кнопок2, выбирайте :-)", [[BTN_NAVIGATE, BTN_QA], [BTN_3], [BTN_HIDE]], $random_id); // вызов кнопок
    34.                 break;
    35.             }
    36.         echo('ok');
    37.         break;
    38.  
    39. }
    40. ?>
    Описание двух использованных функций:
    Функция sendMessage

    PHP:
    1. public function sendMessage($sendID,$msg,$random_id){
    2.         if ($sendID != 0 and $sendID != '0') {
    3.             return $this->request('messages.send',array('message'=>$msg, 'peer_id'=>$sendID, 'random_id'=>$random_id));
    4.         } else {
    5.             return true;
    6.         }
    Функция sendButton

    PHP:
    1. public function sendButton($sendID, $message, $gl_massiv = [],$random_id, $one_time = False) {
    2.         $buttons = [];
    3.         $i = 0;
    4.         foreach ($gl_massiv as $button_str) {
    5.             $j = 0;
    6.             foreach ($button_str as $button) {
    7.                 $color = $this->replaceColor($button[2]);
    8.                 $buttons[$i][$j]["action"]["type"] = "text";
    9.                 if ($button[0] != null)
    10.                     $buttons[$i][$j]["action"]["payload"] = json_encode($button[0], JSON_UNESCAPED_UNICODE);
    11.                 $buttons[$i][$j]["action"]["label"] = $button[1];
    12.                 $buttons[$i][$j]["color"] = $color;
    13.                 $j++;
    14.             }
    15.             $i++;
    16.         }
    17.         $buttons = array(
    18.             "one_time" => $one_time,
    19.             "buttons" => $buttons);
    20.         $buttons = json_encode($buttons, JSON_UNESCAPED_UNICODE);
    21.         //echo $buttons;
    22.         return $this->request('messages.send',array('message'=>$message, 'peer_id'=>$sendID, 'keyboard'=>$buttons,'random_id'=>$random_id));
    23.     }
    Ну и сам ответ бота, где видно только то, что он присылает кнопки, но последующего сообщения нет upload_2020-5-7_18-3-43.png
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Какие? Может их нужно в одну объединить. Лучше глянуть в документацию от vk по боту на счёт твоего случая
     
  3. Teel

    Teel Новичок

    С нами с:
    7 май 2020
    Сообщения:
    4
    Симпатии:
    1
    Вот эти две, sendButton и sendMessage
    Не представляю как их можно объединить в одну, а по поводу таких ситуаций в документации ничего нет, по крайней мере я не видел :(
    PHP:
    1. case 'привет':
    2.                 $vk->sendButton($peer_id, "Вот список кнопок, выбирайте :-)", [[BTN_BACK], [BTN_HIDE]], $random_id); // вызов кнопок
    3.                 $vk->sendMessage($peer_id, "Вы выбрали кнопку, любой ответ на это событие", $random_id);
    4.                 break;
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Попробуй сформировать правильный запрос сам и отправить через Postman например, чтобы проследить реакцию.
    Те команды которые не отрабатывают, ответ от vk на них какой?
     
  5. Teel

    Teel Новичок

    С нами с:
    7 май 2020
    Сообщения:
    4
    Симпатии:
    1
    Те что не отрабатывают, на них нет никакого ответа. В Callback приходит json от выполненного запроса, однако тот, что идёт следом, он просто пропускает, будто просто выходит из этого case. Через If else также, вот пробовал, не вышло
     
  6. Teel

    Teel Новичок

    С нами с:
    7 май 2020
    Сообщения:
    4
    Симпатии:
    1
    Окей, проблема найдена, оказывается всё решалось достаточно легко. Ошибка в том, что в каждом методе использовался один и тот же random_id, от
     
    denis01 нравится это.