电报Bot收到“错误请求:消息文本为空”

时间:2018-02-14 22:03:07

标签: telegram-bot

当我的Telegram bot将sendMessage发送到Telegram服务器时,它会收到错误消息:

{"ok":false,"error_code":400,"description":"Bad Request: message text is empty"}

问题出现在今天早上,之前我的机器人工作了整整一年没有错误。 GetUpdates命令与以前一样运行良好。我使用GET HTTP方法发送逗号:

https://api.telegram.org/bot<MyToken>/sendMessage

附加了UTF-8编码数据:

{"chat_id":123456789,"text":"any text"}

有没有人遇到过这个?

5 个答案:

答案 0 :(得分:1)

如果问题仍然存在,请尝试修改您的curl请求。对我来说添加标题 'Content-Type: application/json'-d '{"chat_id":133057877,"text":"any text"}'已解决的问题

答案 1 :(得分:0)

您的漫游器处于发送空消息的状态。在某种状态下,它将不处理同一URL上的任何其他请求。您是否正在打印一个可能为空的列表,就像我在待办事项列表机器人中所做的那样。您可以考虑一对一地运行代码段,直到找到空消息打印段。

答案 2 :(得分:0)

我也收到此错误。 我仅将sendMessage()方法与“低级” Node https一起使用:

const https = require('https');

const data = JSON.stringify({
  chat_id: config.telegram.chatId,
  text: 'some ASCII text'),
});

const options = {
  hostname: 'api.telegram.org',
  port: 443,
  path: `/bot${config.telegram.botToken}/sendMessage`,
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': data.length
  }
};

const req = https.request(options, (res) => {
  let chunks = [];
  res.on('data', chunk => chunks.push(chunk));
  res.on('end', () => {
    const resBody = Buffer.concat(chunks).toString('utf8');
    if (res.statusCode === 200) {
      console.log(`Message sent`);
    } else {
      console.error(`${res.statusCode} ${res.statusMessage} ${res.headers['content-type']}
${resBody}`)
    }
  });
});

req.on('error', (error) => {
  reject(error)
});

req.write(data);
req.end();

对于ASCII文本来说还可以,但是对于某些非ASCII文本,我得到了:

const data = JSON.stringify({
  chat_id: config.telegram.chatId,
  text: 'Привет Мир!'),
});

错误:

400 Bad Request application/json
{"ok":false,"error_code":400,"description":"Bad Request: message text is empty"}

在我的情况下,内容长度是用无效长度'Content-Length': data.length计算的(对于电报无效?),因此我注释掉了此标头,现在它适用于UTF-8

  headers: {
    'Content-Type': 'application/json',
    //'Content-Length': data.length
  }

答案 3 :(得分:0)

通过模拟表单发送消息的另一种方法:

curl -s -X POST https://api.telegram.org/bot{apitoken}/sendMessage \ -F chat_id='-1234567890' -F text='test message'

答案 4 :(得分:0)

好吧,我编写了 C 语言的包装器,以便通过 SSL 与电报机器人 API 进行通信。所以现在我可以清楚地回答有关电报 API 规范的问题了。

问题一

首先,如果我们谈论原始查询,我们需要记住规范。
默认情况下,HTTP/HTTPS 发布请求应包括:

  1. [space] <\r\n>
  2. <内容类型有效的正则表达式><\r\n>
  3. POST 正文数据的长度><\r\n>
  4. <\r\n 在正文之前>

所以,我尝试发送没有 Content-Length 的原始查询,但我遇到了与您相同的错误。这是第一个问题。

问题二

默认情况下,如果您尝试使用 sendMessage 方法发送无效请求 - 电报机器人 API 将响应与您相同的错误。所以,是的,这是一个非常棘手的调试错误......
如果您尝试发送原始查询,请确保您的 JSON 数据序列化良好,并且没有屏蔽等错误。

总结

请求:

POST /bot<token>/sendMessage HTTP/1.1
Host: api.telegram.org:443
Connection: close
Content-Type: application/json
Content-Length: 36

{"chat_id":<integer>, "text":"test \\lol"}

第二个反斜杠如果屏蔽。

C 上的代码

sprintf(reqeustCtx.request,
            "POST /bot%s/%s HTTP/1.1\r\n"
            "Host: %s\r\n"
            "Connection: close\r\n"
            "Content-Type: application/json\r\n"
            "Content-Length: %d\r\n"
            "\r\n"
            "%s\r\n", bot_token, bot_method,
            reqeustCtx.res_addr, strlen(body), body);
    BIO_puts(bio, reqeustCtx.request);
    BIO_flush(bio);

    memset(reqeustCtx.response, '\0', BUFFSIZE);
    read_bytes = BIO_read(bio, reqeustCtx.response, BUFFSIZE);
    if (read_bytes <= 0) {
        printf("No response");
        exit(-1);
    }

    cert_free(cert_store, ssl_ctx, ca_cert_bio);
    // free memory //
    reqeustCtx.method(reqeustCtx.res_addr, reqeustCtx.request,
                      reqeustCtx.current_work_dir, reqeustCtx.current_cert);

    /* json response, need to parse */
    return reqeustCtx.response;