javascript - Telegram API 返回 HTML 而不是 JSON

标签 javascript json node.js telegram-bot

我正在编写一个电报机器人来报告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.getstore.get 函数以及文件和 token 的行为,以确保您使用的是正确的函数。

此外,我建议在使用任何其他 Telegram API 方法之前运行 bot.getMe(),以确保您指定了正确的机器人 token 。

关于javascript - Telegram API 返回 HTML 而不是 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40191373/

相关文章:

javascript - 如何将 Prop 传递给 react 组件?

javascript - jquery 将第一个表单元素聚焦在 Final 的选项卡上

javascript - 创建电子表格并用特定数据填充它们

PHP-JSON : Check broken links

node.js - 如何获取前端上传的文件并本地存储

javascript - 在 React 中获取关键 Prop 警告,即使组件没有重复

javascript - insertAdjacentHTML 无法读取 null 的属性

php - 在客户端使用 JSON 获取 fb 访问 token

javascript - 了解 Passport.authenticate ('local' ) 语法位

node.js - 如何使用 Request js(Node js 模块)池