PyQt5 QtWebEngine设置自定义Cookie后页面无法自动登录问题
问题描述
实现多账号快速登录功能:输入账号名后从存储匹配对应Token,将Cookie设置到QtWebEngineView中。目前Cookie已通过on_cookie_added函数确认成功添加,但页面加载后仍处于未登录状态。
Cookie详情
Name: ACCESS_INFO Value: 00000000%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx The 0s are the fixed user Id from Twitch, the x are generated characters generated by Stream Raiders. From the tokens I checked, it always has 111 characters in total Domain: .www.streamraiders.com Path: / Expires: Time in ISO 8601 Size: 122 HttpOnly: True Secure: True SameSite: Lax Priority: Medium
现有代码
import time from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage from PyQt5.QtCore import QUrl, QDateTime from PyQt5.QtNetwork import QNetworkCookie from PyQt5.QtWidgets import QApplication from utils import constants from utils.settings import open_file name = input("Please insert the account name you want to access: ") accounts = open_file(constants.py_accounts) ACCESS_INFO = None for account in accounts: if account["name"] == name: ACCESS_INFO = account["token"] break else: print("Please insert the account you would like to access.") sys.exit() app = QApplication([]) view = QWebEngineView() page = QWebEnginePage() store = page.profile().cookieStore() store.deleteAllCookies() cookie = QNetworkCookie() cookie.setName(b"ACCESS_INFO") cookie.setValue(ACCESS_INFO.encode("utf-8")) cookie.setDomain(".www.streamraiders.com") cookie.setPath("/") expiration_date = QDateTime.currentDateTime().addDays(5) cookie.setExpirationDate(expiration_date) cookie.setHttpOnly(True) cookie.setSecure(True) store.setCookie(cookie, QUrl("https://www.streamraiders.com")) view.setPage(page) def on_cookie_added(cookie): cookie_name = cookie.name().data().decode() cookie_value = cookie.value().data().decode() if cookie_name == "ACCESS_INFO": print(cookie_value) time.sleep(5) view.setUrl(view.url()) store.cookieAdded.connect(on_cookie_added) url = QUrl("https://www.streamraiders.com") view.setUrl(url) view.show() app.exec_()
排查方向与解决方案
1. 修正Cookie域名匹配范围
原代码中Cookie的Domain设置为.www.streamraiders.com,这种带前缀点的子域名匹配范围较窄,改为.streamraiders.com可覆盖所有子域名(包括www.streamraiders.com),避免域名不匹配导致Cookie无法被请求携带。
2. 补充SameSite属性
原Cookie包含SameSite: Lax属性,但现有代码未设置。Qt 5.15及以上版本支持setSameSite方法,缺失该属性会导致QtWebEngine在请求时不发送Cookie,需添加该设置。
3. 替换阻塞事件循环的time.sleep
time.sleep(5)会阻塞Qt的事件循环,导致页面加载和Cookie处理异常,改用QTimer实现延迟刷新,保证事件循环正常运行。
4. 确保删除旧Cookie完成后再添加新Cookie
deleteAllCookies是异步操作,直接添加新Cookie可能被未完成的删除操作覆盖,需等待cookiesDeleted信号触发后再执行添加逻辑。
修改后的完整代码
import sys from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage from PyQt5.QtCore import QUrl, QDateTime, QTimer, QEventLoop from PyQt5.QtNetwork import QNetworkCookie from PyQt5.QtWidgets import QApplication from utils import constants from utils.settings import open_file name = input("Please insert the account name you want to access: ") accounts = open_file(constants.py_accounts) ACCESS_INFO = None for account in accounts: if account["name"] == name: ACCESS_INFO = account["token"] break else: print("Account not found.") sys.exit() app = QApplication([]) view = QWebEngineView() page = QWebEnginePage() store = page.profile().cookieStore() # 等待所有旧Cookie删除完成 loop = QEventLoop() store.deleteAllCookies() store.cookiesDeleted.connect(loop.quit) loop.exec_() # 构建Cookie cookie = QNetworkCookie() cookie.setName(b"ACCESS_INFO") # 确保Token编码正确,若含特殊字符可改用QUrl.toPercentEncoding处理 cookie.setValue(ACCESS_INFO.encode("utf-8")) # 扩大域名匹配范围 cookie.setDomain(".streamraiders.com") cookie.setPath("/") cookie.setExpirationDate(QDateTime.currentDateTime().addDays(5)) cookie.setHttpOnly(True) cookie.setSecure(True) # 添加SameSite属性(Qt 5.15+支持) if hasattr(QNetworkCookie, "SameSite"): cookie.setSameSite(QNetworkCookie.SameSite.Lax) # 将Cookie绑定到目标URL store.setCookie(cookie, QUrl("https://www.streamraiders.com")) view.setPage(page) def on_cookie_added(cookie): cookie_name = cookie.name().data().decode() cookie_value = cookie.value().data().decode() if cookie_name == "ACCESS_INFO": print("Cookie added:", cookie_value) # 延迟1秒刷新页面,确保Cookie生效 QTimer.singleShot(1000, lambda: view.setUrl(QUrl("https://www.streamraiders.com"))) store.cookieAdded.connect(on_cookie_added) # 开启开发者工具(可选,用于调试Cookie) page.settings().setAttribute(page.settings().DeveloperExtrasEnabled, True) # 初始加载页面 view.setUrl(QUrl("https://www.streamraiders.com")) view.show() app.exec_()
额外调试建议
- 打开开发者工具:代码中已添加开启开发者工具的代码,可在页面右键选择"检查",查看
Application -> Cookies确认Cookie是否存在,以及Network标签页查看请求是否携带该Cookie。 - 验证Token有效性:对比存储中的Token与浏览器正常登录时的
ACCESS_INFO值,确保完全一致(包括长度、特殊字符)。 - 检查Qt版本:若使用Qt 5.15以下版本,SameSite属性无法设置,需升级Qt或确认网站是否允许无SameSite的Cookie。
内容的提问来源于stack exchange,提问作者Leonardo Luiz
相关产品推荐
相关产品推荐

