2016-04-19 7 views
0

Im Entwickeln eines Telegramm-Bot mit Qt C++, und ich habe Probleme beim Versuch, einen Webhook einzustellen.Verwenden von SetWebhook von Qt für ein Telegramm Bot

SSL Server

Zunächst einmal, ich habe einen ssl-Server mit QTcpServer und QSslSocket erstellt. Einige Erklärungen dazu finden Sie in der QSslSocket doc. Außerdem erzeugte i ein selbst signiertes Zertifikat als Telegramm-doc here erklärt, mit dem Befehl:

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" 

Das Ergebnis ist ein Paar von Dateien, eine private.key-Datei und eine public.pem Datei. Also habe ich sie in den QSslSockets verwendet, um die Verbindung zu sichern.

Das Ergebnis davon ist ein SSL-Server in der Lage, Verbindungen zu hören und zu akzeptieren. Wenn ich einen Browser verwende, um eine Verbindung mit meinem SSL-Server herzustellen, erhalte ich eine Warnung über die Verwendung eines selbstsignierten Zertifikats (was ich für normal halte), kann aber eine Verbindung zum Server herstellen. Vom Server kann ich die Daten lesen, die der Browser gesendet hat. Also, ich denke, die Server-Seite ist gut.

Antrag auf setWebhook

Um einen Antrag auf setWebhook API method auszuführen, ich verwende QHttpMultipart Klasse eine MIME-Multipart Anfrage zu erstellen. Die API-Methode benötigt die zu kontaktierende URL und das öffentliche Zertifikat. Also, ich benutze diesen Code die URL-Parameter zu generieren:

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

Und diesen Code das Zertifikat Parameter zu generieren:

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

ich eine richtige Antwort erhalten, mit der Meldung, dass „die Webhook gesetzt wurde ". Aber, wenn Telegram sich mit meinem ssl-Server verbindet, wird der ssl-Handshake nicht korrekt beendet (weder verschlüsselte() noch sslError() - Signale werden ausgegeben). Ich denke, dass das Problem ist die Art, wie ich das öffentliche Zertifikat hochladen. Wie Sie sehen können, setze ich für die Datei QHttpPart den Inhaltstyp-Header nicht, weil ich nicht weiß, welchen Wert zu verwenden ist. Ich weiß nicht, ob das das Problem sein kann. Ich benutze "text/plain" für die URL, weiß aber nicht, was ich für die Zertifikatsdatei verwenden soll.

Also, ich weiß nicht, was mein Problem sein könnte. Sogar, ich bin mir nicht sicher, ob es der Datei-Upload sein könnte oder nicht. Die Verwendung eines selbstsignierten Zertifikats ist kein Problem, da die Dokumentation dies als einen gültigen Weg anzeigt. Jede Hilfe wäre willkommen.

Vielen Dank im Voraus.

+0

nur um zu überprüfen, ich startete den Server, führte aber die SetWebhook Anfrage mit einem anderen Programm, eine Browser-Erweiterung (Postman) zum Testen von REST-APIs gemacht. Es funktionierte, und eingehende Verbindungen sind nun in der Lage, die SSL-Verhandlung zu beenden und ich erhalte die Daten. Also, klar, ich mache die mehrteilige SetWebhook Anfrage in einer falschen Weise, aber ich kann nicht erraten, warum :( –

Antwort

0

Ich endlich gefunden das Problem, und es war der Inhaltstyp. Ich habe den Inhaltstyp des ersten Parameters, den URLPart, entfernt. Außerdem wurde der Inhaltstyp zum Dateipfad hinzugefügt, wobei als Wert "application/x-x509-ca-cert" verwendet wurde. Es funktioniert jetzt wie ein Zauber.

Verwandte Themen