我正在写一个Telegram机器人,我正在使用official bot API。我有一个处理请求的webhook服务器,并为每个请求发送200 OK
响应。
在服务器停止之前,webhook已分离,因此Telegram不再发送更新。但是,每当我打开机器人并再次设置webhook URL时,Telegram就会开始使用旧更新充斥webhook服务器。
在我到达最后一次更新之前,我是否有任何方法可以阻止此操作而不会反复请求/getUpdates
?
以下是我的代码的大致简化版本:
var http = require('http'),
unirest = require('unirest'),
token = '***';
// Attach the webhook
unirest.post('https://api.telegram.org/bot' + token + '/setWebhook')
.field('url', 'https://example.com/api/update')
.end();
process.on('exit', function() {
// Detach the webhook
unirest.post('https://api.telegram.org/bot' + token + '/setWebhook')
.field('url', '')
.end();
});
// Handle requests
var server = http.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' })
res.end('Thanks!');
});
server.listen(80);
提前致谢。
答案 0 :(得分:4)
当您启动服务器时,您可以记录时间戳,然后使用它来与传入的消息date
值进行比较。如果日期是> =您开始时的时间戳...可以处理该消息。
我不确定您是否有办法告诉Telegram您只对新的更新感兴趣,他们的重试机制是一项功能,以便不会错过消息...即使您的机器人处于脱机状态。
答案 1 :(得分:0)
我有同样的问题,然后我尝试用
重置默认的webhookhttps://api.telegram.org/bot[mybotuniqueID]/setWebhook?url=
之后,我验证了当前的getUpdates查询是相同的旧更新,但我通过电报的机器人聊天发送了新的请求
https://api.telegram.org/bot[mybotuniqueID]/getUpdates
当我再次设置我的webhook时,webhook会读取相同的旧更新。也许getUpdates方法没有刷新JSON内容。
注意: 在我的情况下,它工作正常,直到我决定从botfather
更改/设置隐私机器人设置答案 2 :(得分:0)
在webhook模式下,Telegram服务器每分钟发送一次更新,直到收到来自webhook程序的OK响应。 所以我建议这些步骤:
答案 3 :(得分:0)
最好的方法是使用function is_new_request($requestUpdateId)
{
$filename = "./last_update_id.txt";
if (filesize($filename)) {
$file = fopen($filename, "w");
if ($file) {
fwrite($file, $requestUpdateId);
fclose($file);
return true;
} else
return null;
} else {
$file = fopen($filename, "w");
fwrite($file, 1);
fclose($file);
return false;
}
}
function set_get_updates_parameters($getUpdates)
{
$filename = "./last_update_id.txt";
if (file_exists($filename)) {
$file = fopen($filename, "r");
$lastUpdateId = fgets($file);
fclose($file);
} else {
$file = fopen($filename, "w");
$lastUpdateId = fwrite($file, 1);
fclose($file);
}
return str_replace("%offset%", $lastUpdateId, $getUpdates);
}
$updates = json_decode(file_get_contents(set_get_updates_parameters("https://api.telegram.org/bot<token>/getUpdates?offset=%offset%")), true);
// Separate every update in $updates
$isNewRequest = is_new_request($update["update_id"]); // $update["update_id"] is update_id of one of your requests; e.g. 591019242
if ($isNewRequest === false)
; // Old request
elseif ($isNewRequest === null)
; // File error
else
; // New request; time to work!
,这是每个新请求(消息)增加的特定数字。在这种情况下,通过getUpdates方法获取更新时,请使用offset参数! (Telegram bots FAQ)
请参阅:
update_id
上面的代码只是获取更新并保存您工作的最后update_id
,并获得比文件中最后一个{{1}}更新的更新(last_update_id.txt)。享受那段代码!