我开始编程电报机器人,我遇到了问题。当我发送/启动命令时,它向我发送一条欢迎消息(正如我编程的那样),但它不发送一次!它像循环一样无休止地发送它! 这是来源:
<?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>');
}
?>
答案 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)
我最近遇到此问题,并通过向聊天室发送空白消息来停止了此问题。您从电报中收到一个错误,但没有再发送任何消息。