使用Web hook

时间:2015-07-29 17:28:53

标签: telegram-bot

我正在写一个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);

提前致谢。

4 个答案:

答案 0 :(得分:4)

当您启动服务器时,您可以记录时间戳,然后使用它来与传入的消息date值进行比较。如果日期是> =您开始时的时间戳...可以处理该消息。

我不确定您是否有办法告诉Telegram您只对新的更新感兴趣,他们的重试机制是一项功能,以便不会错过消息...即使您的机器人处于脱机状态。

答案 1 :(得分:0)

我有同样的问题,然后我尝试用

重置默认的webhook

https://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响应。 所以我建议这些步骤:

  1. 检查您的webhook程序,将其地址指定为setWebhook方法的url参数。在浏览器中调用其地址。它不会生成要查看的输出,但会清除程序中可能没有错误。
  2. 包含一个产生' 200 OK状态的命令'程序中的标头输出,以确保程序将此标头发送到Telegram服务器。

答案 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)。享受那段代码!