qt - 将 Qt 中的 setWebhook 用于 Telegram 机器人

标签 qt ssl multipartform-data telegram-bot qnetworkrequest

我正在使用 Qt c++ 开发 Telegram 机器人,但我在尝试设置 Webhook 时遇到了问题。

SSL 服务器

首先,我使用 QTcpServer 和 QSslSocket 创建了一个 ssl 服务器。关于此的一些解释可以在 QSslSocket doc 中找到。 .此外,我生成了一个自签名证书,正如 Telegram 文档所解释的那样 here ,使用命令:

openssl req -newkey rsa:2048 -sha256 -nodes -keyout YOURPRIVATE.key -x509 -days 365 -out YOURPUBLIC.pem -subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=YOURDOMAIN.EXAMPLE"

结果是一对文件,一个private.key 文件和一个public.pem 文件。因此,我在 QSslSockets 中使用它们来保护连接。

结果是一个能够监听和接受连接的 ssl 服务器。当我使用浏览器连接到我的 ssl 服务器时,我收到关于使用自签名证书的警告(我认为这是正常的),但可以连接到服务器。从服务器,我能够读取浏览器发送的数据。所以,我认为服务器端很好。

请求setWebhook

为了执行 setWebhook API method 的请求, 我用 QHttpMultipart类来创建 MIME Multipart 请求。 API 方法需要要联系的 Url 和公共(public)证书。所以,我使用这段代码生成 url 参数:

QList<QHttpPart> parameters;
QHttpPart urlPart;
urlPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
urlPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"url\""));
urlPart.setBody(_url.toLatin1());
parameters.append(urlPart);

以及生成证书参数的代码:

QHttpPart filePath;
    filePath.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"certificate\""));
    QFile *file = new QFile(_filePath);
    file->open(QIODevice::ReadOnly);
    filePath.setBodyDevice(file);
    file->setParent(this);
    parameters.append(filePath);

我收到了正确的响应,其中包含“已设置 webhook”的消息。但是,当 Telegram 连接到我的 ssl 服务器时,ssl 握手没有以正确的方式完成(既没有发出 encrypted() 也没有发出 sslError() 信号)。我认为问题是我上传公共(public)证书的方式。如您所见,对于文件 QHttpPart,我没有设置内容类型 header ,因为我不知道要使用什么值。我不知道这是否是问题所在。我使用“text/plain”作为 url,但不知道证书文件使用什么。

所以,我不知道我的问题是什么。甚至,我不确定它是否可能是文件上传。使用自签名证书不是问题,因为文档表明这是一种有效的方式。任何帮助将不胜感激。

提前致谢。

最佳答案

终于找到问题所在了,就是content-type。我删除了第一个参数的内容类型,即 urlPart。并且还将内容类型添加到文件路径,使用值“application/x-x509-ca-cert”。它现在就像一个魅力。

关于qt - 将 Qt 中的 setWebhook 用于 Telegram 机器人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36731015/

相关文章:

c++ - Q_ENUMS 与 BOOST_SCOPED_ENUM

c++ - QScrollArea 内的 QSpinBox : How to prevent Spin Box from stealing focus when scrolling?

node.js - 用于 PostgreSQL 连接 nodejs 的 SSL

javascript - 使用返回错误 500 的 FormData 删除请求

c++ - 在 QToolBar 中移动 QMenuBar

css - 如何更改 QScrollBar 箭头的大小?

php - simplexml_load_file() : Failed to enable crypto

java - 为 SSLSocket 握手设置超时

python - 如何使用 django Rest 框架解析多部分表单数据中的多个文件?

java - Apache HttpClient postman