Как открыть URL методом POST в QWebEnginePage-pyqt5 - PullRequest
0 голосов
/ 29 января 2019

Как открыть URL с помощью метода POST в QWebEnginePage-pyqt5, мне также нужно читать и публиковать куки с каждым запросом.

def __init__(self, url):
    self.app = QApplication(sys.argv)
    QWebEnginePage.__init__(self)
    self.html = ''
    self.loadFinished.connect(self._on_load_finished)
    self.load(QUrl(url))
    self.app.exec_()

def _on_load_finished(self):
    self.html = self.toHtml(self.Callable)

def Callable(self, html_str):
    self.html = html_str
    self.app.quit()

1 Ответ

0 голосов
/ 29 января 2019

Вы не можете сделать запрос POST с QWebEnginePage, если не используете Javascript.

Вот пример того, как сделать это с классами Qt (не проверял, но должен работать).

Сначала мы делаем запрос на получение cookie-файла (для этого необходимо указать конкретный URL), затем мы сохраняем cookie-файл для целевого адреса и выполняем почтовый запрос с некоторыми данными:

from PyQt5.QtCore import pyqtSignal, QUrl, QUrlQuery
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply, QNetworkRequest,QNetworkCookieJar


class NetworkManager(QNetworkAccessManager):
    requestFinished = pyqtSignal(QNetworkReply)

    def __init__(self):
        super().__init__()

    def finished(self, reply):
        super().finished(reply)
        self.requestFinished.emit(reply)


class Request:
    def __init__(self):
        super().__init__()

        self.network_manager = NetworkManager()
        self.network_manager.requestFinished.connect(self.request_finished)

        self.network_manager.setCookieJar(QNetworkCookieJar())

        self.url = ''
        self.cookie_url = ''

    def _read_cookie(self):
        request = QNetworkRequest(QUrl(self.cookie_url))
        request.setHeader(QNetworkRequest.ContentTypeHeader, "application/x-www-form-urlencoded")
        self.network_manager.get(request)

    def _post(self):
        post_data = QUrlQuery()
        post_data.addQueryItem("param1", "value")
        post_data.addQueryItem("param2", "value")

        request = QNetworkRequest(QUrl(self.url))
        request.setHeader(QNetworkRequest.ContentTypeHeader, "application/x-www-form-urlencoded")

         self.network_manager.post(request, post_data.toString(QUrl.FullyEncoded).toUtf8())

    def post_request(self, url, cookie_url):
        self.url = url
        self.cookie_url = cookie_url

        self._read_cookie()

    def request_finished(self, reply: QNetworkReply):
        reply.deleteLater()

        cookies = reply.header(QNetworkRequest.SetCookieHeader)
        if cookies:
            self.network_manager.cookieJar().setCookiesFromUrl(cookies, self.url)

        self._post()

Обратите внимание, что эта реализация не является поточно-ориентированной.

Кроме того, в Python есть более простые способы сделать это, используя запросы:

Как отправлять куки в постезапрос с библиотекой Python Requests?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...