首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP电报Bot多次发送相同的消息

PHP电报Bot多次发送相同的消息
EN

Stack Overflow用户
提问于 2018-11-28 14:58:21
回答 1查看 2.2K关注 0票数 2

我有一台电报机,它能正常工作几个月。大约3-4周前,电报机器人有时会发送(!)同样的信息有几次--不仅仅是一次!

我已经尝试过很多方法来解决这个问题:

  1. 我将update_id保存在数据库中。如果新的update_id高于保存的,则bot发送消息。如果没有,则会发生错误。(昨天发现每个重复的消息都有一个新的(更高的) update_id,所以这个方法是无用的)
  2. 我尝试将exit();添加到每个PHP函数中--没有工作。
  3. 如果没有闭环,我检查了整个代码。但一切都很好。
  4. 我在函数中添加了一个?limit=1,但也没有机会。

慢慢地,我的想法到了尽头。也许有人能给出一个很好的答案。

我总是有$update和聊天ID:

代码语言:javascript
复制
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"];

我的功能如下:

代码语言:javascript
复制
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名”,我想发送一条消息:

代码语言:javascript
复制
if(callback($update) and $cbdata == "top_10"){
    tg_send_message($cbid, "This is my message!");  
}

一切都很好,而且现在也在工作--机器人只是在某个时候发送一条消息多次。

额外的消息总是有一个新的update_id!如果另一个API有一个可变值(比如比特币价格),它也在发生变化。就像你点击了22次按钮(但你只点击了一次)

我非常感谢每一个有用的答案!非常感谢。

诚挚的问候。

编辑:我也尝试过以下几种方法:

代码语言:javascript
复制
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

但也没用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-28 21:38:02

如果有人有同样的问题,这里的解决方案是:

代码语言:javascript
复制
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(回调($update))的末尾运行此代码(而不是在它之后!)而且起作用了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53522294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档