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

my telegram bot keeps sending messages endlessly

我开始编写电报机器人程序,但遇到了问题。当我发送 /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>');
    }
    
?>

如果您 pollinggetUpdates,您需要增加偏移量。

偏移量 = 1 + latest_update_id

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

The update‘s unique identifier. Update identifiers start from a certain positive number and increase sequentially. This ID becomes especially handy if you’re using Webhooks, since it allows you to ignore repeated updates or to restore the correct update sequence, should they get out of order.

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

In case of an unsuccessful request, we will give up after a reasonable amount of attempts.

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

正如 Yoily L 所说,在电报认为请求失败之前,你必须 return 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 在文档中的评论:

The script will still occupy a FPM process after fastcgi_finish_request(). So using it excessively for long running tasks may occupy all your FPM threads up to pm.max_children. This will lead to gateway errors on the webserver.

Another important thing is session handling. Sessions are locked as long as they're active (see the documentation for session_write_close()). This means subsequent requests will block until the session is closed.

You should therefore call session_write_close() as soon as possible (even before fastcgi_finish_request()) to allow subsequent requests and a good user experience.

This also applies for all other locking techniques as flock or database locks for example. As long as a lock is active subsequent requests might bock.

您可能需要查看

if (is_callable('fastcgi_finish_request')) {
    ...
}

相关问题的更多信息:

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

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

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