我的电报机器人不断地发送消息

Posted

技术标签:

【中文标题】我的电报机器人不断地发送消息【英文标题】: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>');
    
    
?>

【问题讨论】:

【参考方案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】:

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

【讨论】:

这就像一个魅力。另外,我使用这个解决方案***.com/a/46256172/1642423【参考方案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函数 这将解决删除此功能后的问题。如果您在代码中更改了时间模板,请将其删除。

【讨论】:

以上是关于我的电报机器人不断地发送消息的主要内容,如果未能解决你的问题,请参考以下文章

如何限制对电报机器人的访问

删除我的机器人在电报组中由机器人发送的消息

如何使用我的电报机器人使用他们的用户名向某人发送消息

使用电报机器人 api、python 3 和 JobQueue 将消息发送到通道的方法

为什么我的Telegram机器人无休止地发送消息

我无法访问我在电报机器人中使用 getupdates 发送的消息