当我的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"}
有没有人遇到过这个?
答案 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 发布请求应包括:
所以,我尝试发送没有 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"}
第二个反斜杠如果屏蔽。
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;