2016-04-19 3 views
0

Я разрабатываю бот 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, но не знаю, что использовать для файла сертификата.

Итак, я не знаю, что может быть моей проблемой. Даже, я не уверен, что это может быть загрузка файла или нет. Использование самоподписанного сертификата не является проблемой, поскольку документация указывает это как действительный способ. Любая помощь будет оценена по достоинству.

Заранее спасибо.

+0

только для проверки, я запустил сервер, но выполнил запрос setWebhook с другой программой, расширением браузера (почтальоном), созданной для тестирования API REST. Он работал, и входящие соединения теперь могут завершить реакцию ssl, и я получаю данные. Итак, ясно, что я делаю множественный запрос setWebhook неправильно, но я не могу догадаться, почему :( –

ответ

0

Я, наконец, нашел проблему, и это был контент-тип. Я удалил контент-тип первого параметра, urlPart. А также добавлен тип содержимого в filePath, используя значение «application/x-x509-ca-cert». Теперь это работает как шарм.