电报API返回HTML而不是JSON

我正在写一个电报机器人来报告fail2ban禁令。 这是非常简单和肮脏,草率写,但它可以用来报告任何消息给一个电报用户:

var TelegramBot = require('node-telegram-bot-api'); var fs = require('fs'); var store = { get: function (key) { return fs.readFileSync(__dirname + '/' + key, { encoding: 'utf-8' }); }, set: function (key, value) { fs.writeFileSync(__dirname + '/' + key, value, { encoding: 'utf-8' }); } }; var token = store.get('token'); var args = process.argv.slice(2); if (args.length == 0) { console.error('No mode specified'); process.exit(0); } TelegramBot.prototype.unregisterText = function (regexp) { for (var i = 0; i < bot.textRegexpCallbacks.length; ++i) { if (bot.textRegexpCallbacks[i].regexp.toString() == regexp) { bot.textRegexpCallbacks.splice(i, 1); return; } } }; fs.appendFileSync(__dirname + '/logs', '[' + (new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')) + '] ' + args.join(' ') + '\n', { encoding: 'utf-8' }); switch (args[0]) { case 'setup': var bot = new TelegramBot(token, { polling: true }); var step = 'none'; bot.onText(/\/setup/, function (msg, match) { var fromId = msg.from.id; step = 'setup-started'; bot.sendMessage(fromId, 'Starting setup. Please enter the verification key.'); bot.onText(/(.+)/, function (msg, match) { if (step == 'setup-started') { var key = match[1]; var verification = store.get('key'); if (key == verification) { store.set('owner', msg.from.id); step = 'verified'; bot.sendMessage(msg.from.id, 'Correct. Setup complete.'); } else { step = 'none'; bot.unregisterText(/(.+)/); bot.sendMessage(msg.from.id, 'Wrong. Setup aborted.'); } } }); }); break; case 'report': var bot = new TelegramBot(token, { polling: false }); var owner = store.get('owner'); var subject = args[1]; if (subject == 'message') { var message = args.slice(2).join(' '); bot.sendMessage(owner, message); } else if (subject == 'file') { var content = fs.readFileSync(args[2], { encoding: 'utf-8' }); bot.sendMessage(owner, content); } break; default: console.error('Unrecognized mode', args[0]); break; } 

在我的开发者机器上,它工作正常。 我调用:

 node bot.js report message whatever message i want 

我在电报上正确地收到了“我想要的任何消息”。 但是,一旦我把它放在我的digitalocean vps上,它就不再起作用了。 原来问题出在电报图书馆:

 Unhandled rejection Error: Error parsing Telegram response: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Bots: An introduction for developers</title> ... 

这显然返回一个HTML页面,而不是JSON …我也尝试联系相同的端点(api.telegram.org/bothash/sendMessage)curl在我的VPS和它返回JSON(带有错误消息,因为我没有发送任何参数,但仍json)。

我无法理解为什么会发生这种情况。 任何帮助?

看起来好像你没有在VPN上有令牌的文件,或者令牌不正确。

你可以自己检查一下:

当您向api.telegram.org/{token}/sendMessage发送请求,并且{token}不正确时,会将您redirect到此页面 , 该页面将回应您在问题中提到的HTML。

因此,您必须debuggingstore.getstore.get函数的行为以及文件和标记,以确保您使用的是正确的。

另外,我build议在使用任何其他电报API方法之前运行bot.getMe() ,以确保您指定了正确的bot标记。