PHP Telegram Bot отправляет одно и то же сообщение много раз - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть бот Telegram, который работал несколько месяцев.Около 3-4 недель назад бот Telegram отправляет иногда (!) Одни и те же сообщения несколько раз, а не один раз!

Я уже много чего пытался исправить:

  1. Я сохраняю update_id в базе данных.Если новый update_id выше сохраненного, бот отправляет сообщение.Если нет, то возникает ошибка.(Вчера выяснилось, что каждое повторяющееся сообщение имеет новый (более высокий) update_id - поэтому этот метод бесполезен)

  2. Я пытался добавить exit ();для каждой функции PHP - не работал.

  3. Я проверил весь код, если есть не замкнутый цикл.Но все в порядке.

  4. Я добавил? Limit = 1 к функции, но тоже нет шансов.

Медленно я нахожусь наконец моих идей.Возможно, у кого-то есть хороший ответ на этот вопрос.

У меня всегда есть обновление $ и идентификатор чата:

define('api', 'https://api.telegram.org/bot'.token.'/');

$data = file_get_contents("php://input");
$update = json_decode($data, true);
$cbid = $update["callback_query"]["from"]["id"];

Моя функция выглядит так:

function callback($up){
    return $up["callback_query"];
}

function tg_send_message($id, $text) {

    $params=[
        'chat_id' => $id,
        'text' => $text,
        'parse_mode' => 'Markdown',
    ];

    $ch = curl_init('https://api.telegram.org/bot'.token.'/sendMessage?limit=1');
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 3500);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 3500);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, ($params));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);

}

Если я хочу отправить сообщение, если кто-то нажимает на встроенную кнопку. Топ 10:

if(callback($update) and $cbdata == "top_10"){
    tg_send_message($cbid, "This is my message!");  
}

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

Дополнительные сообщения всегда имеют новый update_id!И если есть значение переменной из другого API (например, цена биткойна), оно также меняется.Как будто вы нажали 22 раза на кнопку (но вы только что нажали один раз)

Я очень благодарен за каждый полезный ответ!Большое спасибо.

С наилучшими пожеланиями.

РЕДАКТИРОВАТЬ: Я также попробовал следующее:

function tg_btn_click_send_message($id, $text) {

    $response = $update["callback_query"];
    $botUrl = "https://api.telegram.org/bot" . BOT_TOKEN . "/answerCallbackQuery";
    $postFields = array('callback_query_id' =>  $callback_query_id, 'text' => $response);
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:multipart/form-data"));
    curl_setopt($ch, CURLOPT_URL, $botUrl); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
    $output = curl_exec($ch);

    //send Text
    header("Content-Type: application/json");
    $parameters = array('chat_id' => $id, "text" => $text);
    $parameters["method"] = "sendMessage";
    echo json_encode($parameters);

}

Как здесь предлагается: php telegram answerercallbackquery sendmessage

Но тоже не работает.

1 Ответ

0 голосов
/ 29 ноября 2018

Если у кого-то есть такая же проблема, вот решение:

function tg_answer_callback_query($cbq_id) {

    $params=[
        'callback_query_id' => $cbq_id
    ];

    $ch = curl_init('https://api.telegram.org/bot'.token.'/answerCallbackQuery');
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 3500);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 3500);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, ($params));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);

}

Запустите этот код в конце if (callback ($ update)) (не после него!), И это сработает!

...