私はfail2ban禁止を報告するために電報のロボットを書いています。それは急いで書かれた、非常にシンプルで汚いですが、単一の電報のユーザーへのメッセージを報告するために使用することができます。私の開発マシン上でJSONの代わりにHTMLを返すテレグラム
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
そして、私は電報で「何でもほしいメッセージを」受け取った。しかし、いったん私はデジタル海洋のvpsでそれをgitted、それはもはや働いた。それは問題が電報ライブラリである判明:
Unhandled rejection Error: Error parsing Telegram response: <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Bots: An introduction for developers</title>
...
明らかに代わりにJSONのHTMLページを返します...私も同じエンドポイント(api.telegram.org/bothash/sendMessage)とを連絡してみました私のvpsでカールし、それはjsonを返しました(私は何もパラメータを送信しなかったので、エラーメッセージで、しかしまだjson)。
これはどうして起こるかわかりません。どんな助け?
あなたはあなたのリモートVPN上で 'npm install'をやったのですか? – walialu
はい、そうでなければ私はnode-telegram-bot-apiを持っていません – Totem
あなたのローカル環境でそれを実行した場合、gitはノードモジュールフォルダを追加し、コミットしてリモートでチェックアウトします。そして、これは確かにこの奇妙な振る舞いを説明するでしょう。 – walialu