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

时间:2016-11-14 16:58:24

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

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

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

?>

6 个答案:

答案 0 :(得分:6)

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

  

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

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

答案 1 :(得分:1)

如果您polling getUpdates,则需要增加偏移量。

offset = 1 + latest_update_id

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

  

更新的唯一标识符。更新标识符从a开始   某些正数并按顺序增加。 此ID已成为   如果您使用Webhooks ,尤其方便,因为它允许您使用    忽略重复更新 或恢复正确的更新顺序,   如果它们失灵了。

答案 2 :(得分:0)

正如 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()之前)以允许后续请求   和良好的用户体验。

     

这也适用于所有其他锁定技术,如flock或   数据库锁例如。只要锁定后续活动   请求可能会被打包。

你可能想检查

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

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

答案 3 :(得分:0)

当我的Telegram-bot继续发送消息时,我在数据库中创建了一个记录帖子表。 当我在Telegram-bot中发送帖子时,用PHP alghorythm编写的代码会检查数据库中是否已存在新帖子: *如果这样做,我们将停止发送帖子的过程; *如果没有,我们将继续以电报形式发送。 所描述的方法可以停止重复发送帖子的周期。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我最近遇到此问题,并通过向聊天室发送空白消息来停止了此问题。您从电报中收到一个错误,但没有再发送任何消息。