мой бот телеграммы продолжает отправлять сообщения бесконечно

Я начал программировать бота для телеграмм, и у меня возникла проблема. когда я отправляю / запускаю команду, он отправляет мне приветственное сообщение (как я его запрограммировал), но не отправляет его ни разу! он продолжает посылать его бесконечно, как цикл! это источник:

<?php
    define('API_KEY','<token>');
    
    function makereq($method,$datas=[])
    {
        $url = "https://api.telegram.org/bot".API_KEY."/".$method;
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($datas));
        $res = curl_exec($ch);
        if(curl_error($ch)){
            var_dump(curl_error($ch));
        }else{
            return json_decode($res);
        }
    }
    
    $website = "https://api.telegram.org/bot".API_KEY;
    
    $update = json_decode(file_get_contents('php://input'));
    
    $chat_id = $update->message->chat->id;
    $message_id = $update->message->message_id;
    $from_id = $update->message->from->id;
    $name = $update->message->from->first_name;
    $username = $update->message->from->username;
    $textmessage = isset($update->message->text)?$update->message->text:'';
    $reply = $update->message->reply_to_message->forward_from->id;
    $stickerid = $update->message->reply_to_message->sticker->file_id;
    $messageEntity = $update->messageentity->type;
    
    function SendMessage($ChatId, $TextMsg)
    {
     makereq('sendMessage',[
    'chat_id'=>$ChatId,
    'text'=>$TextMsg,
    'parse_mode'=>"MarkDown"]
     );
    }
    if($textmessage == '/start')
    {
      SendMessage($chat_id,'<welcome message>');
    }
    
?>

person Hamidreza Ahmadzadeh    schedule 14.11.2016    source источник


Ответы (6)


Вероятно, вы используете веб-перехватчик.
Если вы не отвечаете со статусом http 200, API телеграмм-бота считает, что с вашим сервером что-то не так, и снова запрашивает каждые несколько секунд как упомянутый в документации API:

В случае неудачного запроса мы откажемся от него после разумного количества попыток.

Так что просто добавьте header("HTTP/1.1 200 OK"); в свой скрипт и вуаля!
(Если ваша версия php выше 5.4, вы можете использовать http_response_code(200);)

person Yoily L    schedule 15.11.2016

Если у вас polling с getUpdates, вам нужно увеличить смещение.

смещение = 1 + latest_update_id

ЕСЛИ вы используете WebHooks ... https://core.telegram.org/bots/api#update update_id

Уникальный идентификатор обновления. Идентификаторы обновления начинаются с определенного положительного числа и последовательно увеличиваются. Этот идентификатор становится особенно удобным, если вы используете Webhooks, поскольку он позволяет вам игнорировать повторяющиеся обновления или восстановите правильную последовательность обновлений, если они выйдут из строя.

person Charles Okwuagwu    schedule 14.11.2016
comment
вы используете веб-перехватчики или проводите опросы? - person Charles Okwuagwu; 14.11.2016
comment
Я использую веб-перехватчики - person Hamidreza Ahmadzadeh; 14.11.2016
comment
хорошо, так что для веб-перехватчика, как мне сделать приращение? только 1_ ? @CharlesOkwuagwu - person Amir; 04.03.2020
comment
вы можете игнорировать повторяющиеся идентификаторы обновлений. Telegram просто отправит вам последний набор обновлений. вам не нужно ничего делать, если вы получите повторяющийся update_id, просто игнорируйте - person Charles Okwuagwu; 04.03.2020

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

person Toby Allen    schedule 23.09.2020
comment
Это работает как шарм. Кроме того, я использую это решение stackoverflow.com/a/46256172/1642423 - person JuanFernandoz; 11.04.2021

Как сказал Йойли Л, вы должны вернуть 200, прежде чем Telegram сочтет запрос неудачным.

Вы можете использовать fastcgi_finish_request() для передачи данных ответа клиенту. http://php.net/manual/en/function.fastcgi-finish-request.php

http_response_code(200);
fastcgi_finish_request();

// continue execution, send messages and whatever

Также обратите внимание на то, что tuxrampage прокомментировал в документации:

Сценарий по-прежнему будет выполнять FPM-процесс после fastcgi_finish_request(). Поэтому его чрезмерное использование для длительных задач может занять все ваши потоки FPM до pm.max_children. Это приведет к ошибкам шлюза на веб-сервере.

Еще одна важная вещь - это обработка сеанса. Сессии заблокированы, пока они активны (см. Документацию для session_write_close()). Это означает, что последующие запросы будут блокироваться до закрытия сеанса.

Поэтому вам следует позвонить session_write_close() как можно скорее (даже до fastcgi_finish_request()), чтобы разрешить последующие запросы и улучшить взаимодействие с пользователем.

Это также применимо ко всем другим методам блокировки, например, к блокировке стая или блокировке базы данных. Пока блокировка активна, последующие запросы могут блокироваться.

Вы, вероятно, захотите проверить

if (is_callable('fastcgi_finish_request')) {
    ...
}

Дополнительная информация в соответствующем вопросе: продолжить обработку php после отправки HTTP-ответа

person nikans    schedule 17.11.2017

Когда мой Telegram-бот продолжал отправлять сообщения, я создал таблицу записи сообщений в базе данных. Когда я отправляю сообщение в моем Telegram-боте, написанный на PHP алгоритм проверяет, существует ли уже новое сообщение в базе данных: * если это так, мы останавливаем процесс отправки сообщения; * если нет, продолжаем отправлять в Telegram. Описанный метод позволяет останавливать цикл отправки поста снова и снова.

person Yer Bol    schedule 14.02.2020

Робот Telegram из-за структуры перехватчиков и отправки и получения сообщений в заданных форматах времени. Он очень чувствителен ко времени. У меня была такая же проблема, и я обнаружил, что использование функции date_default_timezone_set Это решит проблему после удаления этой функции. Если вы изменили шаблоны времени в своем коде, удалите их.

person mamal    schedule 11.05.2020