forked from AmusementClub/OKPGUI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWebHelper.py
134 lines (102 loc) · 4.41 KB
/
WebHelper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import sys
from PyQt6.QtCore import QUrl, QByteArray, QSize, Qt
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtWebEngineCore import QWebEngineProfile
from PyQt6.QtWidgets import QApplication, QTextEdit, QPushButton, QToolBar, QMainWindow, QDialog, QWidget, QVBoxLayout
from PyQt6.QtNetwork import QNetworkCookie, QNetworkProxy
from PyQt6.QtGui import QAction
from urllib import parse
import traceback
import datetime
def bytestostr(data):
if isinstance(data, str):
return data
if isinstance(data, QByteArray):
data = data.data()
if isinstance(data, bytes):
data = data.decode(errors='ignore')
else:
data = str(data)
return data
def cookiesToStr(cookie: QNetworkCookie):
domain = cookie.domain()
path = cookie.path()
name = bytestostr(cookie.name().data())
value = bytestostr(cookie.value().data())
flags = []
flags.append(f"{name}={value}")
flags.append(f"domain={domain}")
flags.append(f"path={path}")
if cookie.isSecure(): flags.append("Secure")
if cookie.isHttpOnly(): flags.append("HttpOnly")
match cookie.sameSitePolicy():
case QNetworkCookie.SameSite.Default:
pass
case QNetworkCookie.SameSite.Lax:
flags.append("SameSite=Lax")
case QNetworkCookie.SameSite.Strict:
flags.append("SameSite=Strict")
case QNetworkCookie.SameSite.None_:
flags.append("SameSite=None")
#now2 = datetime.datetime.fromisoformat(now.toString(Qt.DateFormat.ISODate))
#strftime("%a, %d %b %Y %H:%M:%S %Z")
if not cookie.isSessionCookie():
time = cookie.expirationDate().toString(Qt.DateFormat.ISODate)
time = datetime.datetime.fromisoformat(time).strftime("%a, %d %b %Y %H:%M:%S GMT")
flags.append(f"expires={time}")
flags = "; ".join(flags)
return f"https://{domain}\t{flags}"
def filterCookies(cookie: QNetworkCookie) -> bool:
if cookie.domain() == "share.dmhy.org":
if bytestostr(cookie.name().data()) in {"pass", "rsspass", "tid", "uname", "uid"}:
return True
if cookie.domain() == "nyaa.si":
if bytestostr(cookie.name().data()) == "session":
return True
if cookie.domain() == "acg.rip":
if bytestostr(cookie.name().data()) == "remember_user_token":
return True
if cookie.domain() == "bangumi.moe":
if bytestostr(cookie.name().data()) in {"locale", "koa:sess", "koa:sess.sig"}:
return True
return False
class WebEngineView(QWidget):
def __init__(self, url, parentWindow, *args, **kwargs):
super(QWidget, self).__init__(*args, **kwargs)
QWebEngineProfile.defaultProfile().cookieStore().cookieAdded.connect(self.onCookieAdd)
self.resize(1920, 600)
self.parentWindow = parentWindow
self.browser = QWebEngineView()
self.browser.loadFinished.connect(self.onLoadFinished)
vbox = QVBoxLayout(self)
toolbar = QToolBar('toolbar')
self.saveButton = QAction("保存 cookies", parent=self)
backButton = QAction("后退", parent=self)
refreshButton = QAction("刷新", parent=self)
backButton.triggered.connect(self.browser.back)
refreshButton.triggered.connect(self.browser.reload)
self.saveButton.triggered.connect(self.saveCookies)
toolbar.addAction(backButton)
toolbar.addAction(refreshButton)
toolbar.addAction(self.saveButton)
self.cookies = []
vbox.addWidget(toolbar)
vbox.addWidget(self.browser)
self.setLayout(vbox)
if parentWindow.menuProxyType.currentText == "HTTP":
parsed = parse.urlparse(self.parentWindow.profile['proxy'])
self.proxy = QNetworkProxy(QNetworkProxy.ProxyType.HttpProxy, hostName=parsed.hostname, port=parsed.port)
QNetworkProxy.setApplicationProxy(self.proxy)
self.browser.load(url)
def closeEvent(self, event):
self.parentWindow.addCookies("\n".join(self.cookies))
self.parentWindow.setUserAgent(self.browser.page().profile().httpUserAgent())
self.parentWindow.saveProfile()
super(WebEngineView, self).closeEvent(event)
def onLoadFinished(self):
pass
def onCookieAdd(self, cookie:QNetworkCookie):
if filterCookies(cookie):
self.cookies.append(cookiesToStr(cookie))
def saveCookies(self):
self.close()