Totem
Totem

Reputation: 474

Telegram API returning HTML instead of JSON

I'm writing a telegram bot to report fail2ban bans. It's very simple and dirty, written hastily, but it can be used to report any message to a single telegram user:

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;
}

On my developer machine it works fine. I invoke:

node bot.js report message whatever message i want

And I correctly received "whatever message i want" on telegram. However, once I gitted it on my digitalocean vps, it no longer worked. It turns out the problem is with the telegram library:

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

Which apparently returns an html page instead of json... I also tried to contact the same endpoint (api.telegram.org/bothash/sendMessage) with curl on my vps and it returned json (with an error message because i didnt send any parameters, but still json).

I cannot fathom why this happens. Any help?

Upvotes: 1

Views: 1380

Answers (1)

Nazar
Nazar

Reputation: 1799

It seems like either you don't have a file with token on your VPN or the token is incorrect.

You can check it by yourself:

When you make a request to api.telegram.org/{token}/sendMessage, and {token} is incorrect, it redirects you to this page, which responds with HTML you've mentioned in your question.

So you have to debug a behavior of your store.get and store.get functions along with files and tokens to make sure you are using a correct one.

Also, I'd recommend to run bot.getMe() before using any other Telegram API methods to ensure you specified a correct bot token.

Upvotes: 1

Related Questions