pythonpython-3.xqtwebengineqtwidgetsqwebengineview

Passing cookies to QWebEngineView


so I have a python code which converts url to pdf like below

import sys
from PyQt5 import QtWidgets, QtWebEngineWidgets
from PyQt5.QtCore import QUrl, QTimer
from PyQt5.QtGui import QPageLayout, QPageSize
from PyQt5.QtWidgets import QApplication
import argparse



def _fullScreenRequested(request):
    request.accept()
    loader.showFullScreen()

def main():
    url = ''
    parser = argparse.ArgumentParser(description="Just an example", formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument("--url", help="Type url")
    args = parser.parse_args()
    config = vars(args)
    url = config['url']


    app = QtWidgets.QApplication(sys.argv)
    loader = QtWebEngineWidgets.QWebEngineView()
    loader.setZoomFactor(1)
    layout = QPageLayout()
    layout.setPageSize(QPageSize(QPageSize.A4Extra))
    layout.setOrientation(QPageLayout.Portrait)
    loader.load(QUrl(url))
    loader.page().pdfPrintingFinished.connect(lambda *args: QApplication.exit())

    def emit_pdf(finished):
        # loader.page().printToPdf("test.pdf", pageLayout=layout)
        QTimer.singleShot(2000, lambda: loader.page().printToPdf("test.pdf", pageLayout=layout))

    loader.loadFinished.connect(emit_pdf)
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

I have a cookie.txt with the content below

    [
    {
        "domain": "www.udemy.com",
        "expirationDate": 1714906174.734258,
        "hostOnly": true,
        "httpOnly": false,
        "name": "snexid",
        "path": "/",
        "sameSite": null,
        "secure": false,
        "session": false,
        "storeId": null,
        "value": "c6sdf99-1sdab-4sd1-86ff-2dc8sfs24511"
    }
]

is there a way to pass cookie.txt to QWebEngineView or QtWebEngineWidgets ??


Solution

  • ok none of the suggestions woked.

    But this example worked --> https://github.com/PyQt5/PyQt/blob/master/QWebEngineView/SetCookies.py

    This is my full code

    import sys
    from PyQt5 import QtWidgets, QtWebEngineWidgets
    from PyQt5.QtCore import QUrl, QTimer, QDateTime, Qt
    from PyQt5.QtGui import QPageLayout, QPageSize
    from PyQt5.QtWidgets import QApplication
    from PyQt5.QtNetwork import QNetworkCookie
    import argparse
    import os
    import json
    
    cookie_file = None
    
    class Window(QtWebEngineWidgets.QWebEngineView):
        def __init__(self, *args, **kwargs):
            super(Window, self).__init__(*args, **kwargs)
            self.cookieStore = self.page().profile().cookieStore()
    
        def initCookies(self, cookie_file):
            if cookie_file:
                with open("output/"+cookie_file, encoding='utf8') as f:
                    cookies = json.load(f)
    
                for cookie in cookies:
                    qcookie = QNetworkCookie()
                    qcookie.setName(cookie.get('name', '').encode())
                    qcookie.setValue(cookie.get('value', '').encode())
                    qcookie.setDomain(cookie.get('domain', ''))
                    qcookie.setPath(cookie.get('path', ''))
                    qcookie.setExpirationDate(
                        QDateTime.fromString(str(cookie.get('expirationDate', 0)),
                                             Qt.ISODate))
                    qcookie.setHttpOnly(cookie.get('httpOnly', False))
                    qcookie.setSecure(cookie.get('secure', False))
                    self.cookieStore.setCookie(qcookie, QUrl())
    
    
    def main():
        file_name = 'ABC123.pdf'
        parser = argparse.ArgumentParser(description="Just an example", formatter_class=argparse.ArgumentDefaultsHelpFormatter)
        parser.add_argument("--url", help="Type url", required=True)
        parser.add_argument("--output", help="Type output pdf file name")
        parser.add_argument("--cookie", help="Type cookie file name")
        args = parser.parse_args()
        config = vars(args)
        url = config['url']
        output = config['output']
        cookie = config['cookie']
        if output:
            file_name = output
        if cookie:
            cookie_file = cookie
    
        app = QtWidgets.QApplication(sys.argv)
        loader = Window()
        loader.initCookies(cookie_file)
        loader.setZoomFactor(1)
        layout = QPageLayout()
        layout.setPageSize(QPageSize(QPageSize.A4Extra))
        layout.setOrientation(QPageLayout.Portrait)
        loader.load(QUrl(url))
        loader.page().pdfPrintingFinished.connect(lambda *args: QApplication.exit())
    
        def emit_pdf(finished):
            directory = "/htmltopdf/output/"
            if not os.path.exists(directory):
                os.makedirs(directory)
            QTimer.singleShot(2000, lambda: loader.page().printToPdf(directory+file_name, pageLayout=layout))
    
    
        loader.loadFinished.connect(emit_pdf)
        sys.exit(app.exec_())
    
    if __name__ == '__main__':
        main()