我正在编写一个电报机器人来报告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...我还尝试在我的 vps 上使用curl 联系相同的端点(api.telegram.org/bothash/sendMessage),它返回 json(带有错误消息,因为我没有发送任何参数,但仍然是json)。
我无法理解为什么会发生这种情况。有什么帮助吗?
最佳答案
您的 VPN 上似乎没有包含 token 的文件,或者 token 不正确。
你可以自己检查一下:
当您向 api.telegram.org/{token}/sendMessage
发出请求时,如果 {token}
不正确,它会将您重定向到 this page ,它会使用您在问题中提到的 HTML 进行响应。
因此,您必须调试 store.get
和 store.get
函数以及文件和 token 的行为,以确保您使用的是正确的函数。
此外,我建议在使用任何其他 Telegram API 方法之前运行 bot.getMe()
,以确保您指定了正确的机器人 token 。
关于javascript - Telegram API 返回 HTML 而不是 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40191373/