我正在使用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和公共证书。所以,我使用此代码生成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握手没有以正确的方式完成(既没有加密()也没有发出sslError()信号。我认为问题是我上传公共证书的方式。如您所见,对于文件QHttpPart,我没有设置内容类型标头,因为我不知道要使用什么值。我不知道这是不是问题。我使用“text / plain”作为url,但不知道如何使用证书文件。
所以,我不知道可能是什么问题。甚至,我不确定它是否可以是文件上传。使用自签名证书不是问题,因为文档表明这是一种有效的方法。任何帮助将不胜感激。
提前致谢。
答案 0 :(得分:0)
我终于找到了问题,这是内容类型。我删除了第一个参数的内容类型urlPart。并且还使用值&#34; application / x-x509-ca-cert&#34;将内容类型添加到filePath中。它现在就像一个魅力。