【问题标题】:my telegram bot keeps sending messages endlessly我的电报机器人不断地发送消息
【发布时间】:2017-03-28 09:36:12
【问题描述】:

我开始编写电报机器人程序,但遇到了问题。当我发送 /start 命令时,它会向我发送一条欢迎消息(正如我编写的那样),但它不会发送一次!它像循环一样不断地发送它! 这是来源:

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

【问题讨论】:

    标签: bots telegram telegram-bot php-telegram-bot


    【解决方案1】:

    您可能正在使用 webhook。
    如果您没有以 http 状态 200 响应,电报机器人 API 会认为您的服务器有问题,并每隔几秒再次请求 mentioned in the API documentation

    如果请求不成功,我们将在合理后放弃 尝试次数。

    所以只需将header("HTTP/1.1 200 OK"); 添加到您的脚本中,瞧!
    (如果你的php版本大于5.4可以使用http_response_code(200);

    【讨论】:

      【解决方案2】:

      如果你是pollinggetUpdates,你需要增加你的偏移量。

      偏移量 = 1 + latest_update_id

      如果您使用的是WebHooks ... https://core.telegram.org/bots/api#update update_id

      更新的唯一标识符。更新标识符从 一定的正数并依次增加。 此 ID 变为 如果您使用 Webhooks,则特别方便,因为它允许您 忽略重复更新或恢复正确的更新顺序, 他们是否会出现故障。

      【讨论】:

      • 你是在使用 webhook 还是在投票?
      • 我正在使用 webhook
      • 好的,那么对于 webhook 我应该如何做增量?只是$result ['update_id'] = ++$update; ? @CharlesOkwuagwu
      • 您可以忽略重复的更新 ID Telegram 只会向您发送最新的更新集。你不需要做任何事情,如果你得到一个重复的update_id,直接忽略
      【解决方案3】:

      我最近遇到了这个问题,并通过向聊天发送一条空白消息来阻止它。您从电报中收到错误消息,但不再发送消息。

      【讨论】:

      【解决方案4】:

      正如 Yoily L 所说,您必须在电报认为请求失败之前返回 200。

      您可以使用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')) {
          ...
      }
      

      相关问题的更多信息:continue processing php after sending http response

      【讨论】:

        【解决方案5】:

        当我的 Telegram-bot 不断发送消息时,我在数据库中创建了一个记录帖子表。 当我在 Telegram-bot 中发送帖子时,用 PHP alghorythm 编写会检查数据库中是否已存在新帖子: * 如果是,我们停止发送帖子的过程; * 如果没有,我们会继续在 Telegram 中发送。 所描述的方法允许停止一次又一次发送帖子的循环。

        【讨论】:

          【解决方案6】:

          Telegram 机器人由于 hooks 的结构以及以指定时间格式发送和接收消息 它对时间非常敏感。 我有同样的问题,发现使用date_default_timezone_set函数 这将解决删除此功能后的问题。如果您在代码中更改了时间模板,请将其删除。

          【讨论】:

            猜你喜欢
            • 2017-03-19
            • 2017-09-01
            • 2021-03-29
            • 2016-03-11
            • 1970-01-01
            • 2019-12-31
            • 2019-10-30
            • 2017-05-11
            • 2021-01-29
            相关资源
            最近更新 更多