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


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

    <?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>');
}

?>
Author: Hamidreza Ahmadzadeh, 2016-11-14

3 answers

Вероятно, вы используете webhook. Если вы не отвечаете со статусом http 200, api telegram bot считает, что с вашим сервером что-то не так, и запрашивает снова каждые несколько секунд (как указано в документации api: "В случае неудачного запроса мы откажемся после разумного количества попыток".). Так что просто добавьте header("HTTP/1.1 200 OK"); в свой скрипт и вуаля! (Если ваша версия php больше 5.4, вы можете использовать http_response_code(200); )

 5
Author: Yoily L, 2016-11-15 19:05:33

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

Смещение = 1 + идентификатор последнего обновления

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

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

 1
Author: Charles Okwuagwu, 2016-11-14 17:33:23

Как сказал Йойли Л, вы должны вернуть 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-ответа

 0
Author: nikans, 2017-11-17 14:48:23