PHP Telegram Bot多次发送相同的消息

时间:2018-11-28 14:58:21

标签: php api telegram

我有一个Telegram Bot,可以工作几个月。大约3-4周前,Telegram Bot有时(!)发送几次相同的消息-而不仅仅是一次!

我已经尝试了很多方法来解决此问题:

  1. 我将update_id保存在数据库中。如果新的update_id高于保存的update_id,则漫游器会发送该消息。否则,将发生错误。 (昨天发现,每条重复的消息都有一个新的(更高的)update_id-因此此方法无用)

  2. 我尝试添加exit();到每个PHP函数-都行不通。

  3. 我检查了整个代码,如果没有未闭合的循环。但是一切都很好。

  4. 我在函数中添加了?limit = 1,但也没有机会。

我的想法慢慢地走到了尽头。也许有人对此有很好的答案。

我总是有$ update和聊天ID:

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);

}

如果有人要单击内嵌按钮Top 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 answercallbackquery sendmessage

但也不起作用。

1 个答案:

答案 0 :(得分:0)

如果有人遇到相同的问题,请采用以下解决方案:

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))的末尾运行此代码(不执行此操作!),它可以工作!

相关问题