Я разрабатываю бот Telegram с использованием Qt C++, и у меня возникают проблемы с попыткой установить Webhook.Использование setWebhook от Qt для бота Telegram
SSL сервер
Прежде всего, я создал сервер с помощью SSL QTcpServer и QSslSocket. Некоторые объяснения об этом можно найти в QSslSocket doc. Кроме того, я произвел самостоятельно подписанный сертификат, как Телеграмма документ объясняет 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, но не знаю, что использовать для файла сертификата.
Итак, я не знаю, что может быть моей проблемой. Даже, я не уверен, что это может быть загрузка файла или нет. Использование самоподписанного сертификата не является проблемой, поскольку документация указывает это как действительный способ. Любая помощь будет оценена по достоинству.
Заранее спасибо.
только для проверки, я запустил сервер, но выполнил запрос setWebhook с другой программой, расширением браузера (почтальоном), созданной для тестирования API REST. Он работал, и входящие соединения теперь могут завершить реакцию ssl, и я получаю данные. Итак, ясно, что я делаю множественный запрос setWebhook неправильно, но я не могу догадаться, почему :( –