繁体   English   中英

将Qt的setWebhook用于Telegram机器人

[英]Using setWebhook from Qt for a Telegram bot

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

SSL服务器

首先,我使用QTcpServer和QSslSocket创建了一个SSL服务器。 有关此问题的一些解释可以在QSslSocket doc中找到。 此外,我使用以下命令生成了一份自签名证书,如Telegram doc 在此说明:

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方法的请求,我使用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);

并用以下代码生成certificate参数:

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);

我收到正确的答复,并提示“已设置网络挂钩”。 但是,当Telegram连接到我的ssl服务器时,ssl握手无法正确完成(既不会发出crypto()也不会发出sslError()信号)。 我认为问题在于我上传公共证书的方式。 如您所见,对于文件QHttpPart,我没有设置content-type标头,因为我不知道要使用什么值。 我不知道这是否可能是问题。 我为网址使用“文本/纯文本”,但不知道该证书文件使用什么。

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

提前致谢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM