@zevilz

Почему рандомно зависает telegram бот при нажатии на кнопках и не работает remove_keyboard?

Есть бот-помощник, отвечающий на вопросы. Принцип работы - типа квеста, бот отвечает и выводит новые кнопки. Все работает нормально, кроме 2х моментов:

1. После 10-20 кликов по кнопкам (промежуток в 5 сек) бот виснет минут на 5. В ответе API только false. Зависание происходит рандомно и может произойти на любом шаге. Кто-нибудь сталкивался с этим?

2. Не работает remove_keyboard

Часть кода бота:
function get_updates($token) {
    $content = file_get_contents("php://input");
    $update = json_decode($content, TRUE);
    file_put_contents('bot.log', json_encode($content));
    $message = $update["message"];
    return $update;
}
function get_api_url($token) {
    $api_url = "https://api.telegram.org/bot".$token;
    return $api_url;
}
function send_message($message, $keyboard = false) {
    global $data;
    global $api_url;
    global $update;
    if ($update['callback_query'])
        $params['chat_id'] = $update['callback_query']['message']['chat']['id'];
    else
        $params['chat_id'] = $data["chat"]["id"];
    $params['text'] = strip_tags($message);
    if ($keyboard !== false) {
        $params['reply_markup'] = json_encode([
            'keyboard' => $keyboard,
            'resize_keyboard' => true,
            'one_time_keyboard' => true
        ]);
    }
    else {
        $params['reply_markup'] = json_encode([
            'remove_keyboard' => true
        ]);
    }
    $result = file_get_contents($api_url.'/sendmessage?'.http_build_query($params));
    file_put_contents('send.log', json_encode($result));
}
 
$token = "1234";
$update = get_updates($token);
$data = $update['message'];
$api_url = get_api_url($token);
$user_message = $data["text"];
$user = get_user_info();
$callback = $update['callback_query']['data'];
 
// пример отправки сообщения
if ($user_message == 'текст_кнопки' && /* дополнительные условия */) {
    $message = "сообщение";
    $keyboard = [
        ['1'],
        ['2']
    ];
    send_message($message, $keyboard);
}
  • Вопрос задан
  • 2342 просмотра
Пригласить эксперта
Ответы на вопрос 1
glebovgin
@glebovgin
Full Stack Web Developer
Вопрос зависания надо смотреть более детально. По части кода этого не понять. Начните с логов вашего сервера.
По удалению клавиатура: либо смотрите метод ReplyKeyboardRemove, либо, как в случае с inline_keyboard, отправляйте пустой массив:
$keyboard = array('inline_keyboard' => array());
$params['reply_markup'] = json_encode($keyboard, TRUE);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы