从 QWebEngineView 自动登录到网站
Automatic Login from QWebEngineView to Website
我正在尝试使用下面的代码在 PySide2 应用程序中创建 monday.com 的视图。我希望能够直接从代码登录,而不必输入我的电子邮件和密码。我发现了一些与下面显示的代码非常相似的代码,并根据 monday.com 的登录页面的结构对其进行了调整。
我目前可以输入我的电子邮件和密码,也可以单击登录按钮。但是,出于某种原因,尽管您可以直观地看到这些条目,但该页面似乎没有检测到这些条目。
我试图在“handle_load_finished”之后放置 运行s 的第二个函数,并包含 JavaScript 用于单击那里的按钮,但它仍然 运行 而没有检测到条目在那里。
from PySide2.QtCore import QUrl
from PySide2.QtWidgets import QMainWindow, QApplication
from PySide2.QtWebEngineWidgets import QWebEngineView
import os
import sys
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.browser = QWebEngineView()
self.browser.setUrl(QUrl("https://miu2021.monday.com/auth/login_monday/email_password"))
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.handle_load_finished)
def handle_load_finished(self, ok):
if ok:
print("Page loaded successfully")
self.browser.page().runJavaScript("let ap = document.querySelector('#user_email');"
"ap.value = 'email@email.com';"
"let pa = document.querySelector('#user_password');"
"pa.value = 'password';"
"let btn = document.getElementsByTagName('button')[0];"
"btn.click();")
else:
print("Could not load page")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
应用图片:
网站似乎检测到触摸以验证用户是否键入,这不是自动任务。一种可能的解决方案是通过发送 QKeyEvents 来使 Qt 写入,如下所示。
import sys
from PySide2.QtCore import QCoreApplication, QEvent, Qt, QTimer, QUrl
from PySide2.QtGui import QKeyEvent
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtWebEngineWidgets import QWebEngineView
KEYMAP = {
"a": Qt.Key_A,
"b": Qt.Key_B,
"c": Qt.Key_C,
"d": Qt.Key_D,
"e": Qt.Key_E,
"f": Qt.Key_F,
"g": Qt.Key_G,
"h": Qt.Key_H,
"i": Qt.Key_I,
"j": Qt.Key_J,
"k": Qt.Key_K,
"l": Qt.Key_L,
"m": Qt.Key_M,
"n": Qt.Key_N,
"o": Qt.Key_O,
"p": Qt.Key_P,
"q": Qt.Key_Q,
"r": Qt.Key_R,
"s": Qt.Key_S,
"t": Qt.Key_T,
"u": Qt.Key_U,
"v": Qt.Key_V,
"w": Qt.Key_W,
"x": Qt.Key_X,
"y": Qt.Key_Y,
"z": Qt.Key_Z,
"1": Qt.Key_1,
"2": Qt.Key_2,
"3": Qt.Key_3,
"4": Qt.Key_4,
"5": Qt.Key_5,
"6": Qt.Key_6,
"7": Qt.Key_7,
"8": Qt.Key_8,
"9": Qt.Key_9,
"0": Qt.Key_0,
".": Qt.Key_Period,
"'": Qt.Key_Apostrophe,
}
def write_text(widget, text):
for letter in text:
key = KEYMAP.get(letter.lower(), Qt.Key_unknown)
event = QKeyEvent(QEvent.KeyPress, key, Qt.NoModifier, letter)
QCoreApplication.postEvent(widget.focusProxy(), event)
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.browser = QWebEngineView()
self.browser.load(
QUrl("https://miu2021.monday.com/auth/login_monday/email_password")
)
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.handle_load_finished)
def handle_load_finished(self, ok):
if ok:
QTimer.singleShot(100, self.write_email)
else:
print("Could not load page")
def write_email(self, *args):
self.browser.page().runJavaScript(
"""let ap = document.querySelector('#user_email')
ap.focus();""",
0,
self.callback_email,
)
def callback_email(self, *args):
write_text(self.browser, "email@email.com")
QTimer.singleShot(100, self.write_password)
def write_password(self):
self.browser.page().runJavaScript(
"""let pa = document.querySelector('#user_password');
pa.focus();""",
0,
self.callback_password,
)
def callback_password(self, *args):
write_text(self.browser, "password")
QTimer.singleShot(100, self.click)
def click(self):
self.browser.page().runJavaScript(
"""let btn = document.getElementsByTagName('button')[0];
btn.focus();
btn.click();"""
)
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
我正在尝试使用下面的代码在 PySide2 应用程序中创建 monday.com 的视图。我希望能够直接从代码登录,而不必输入我的电子邮件和密码。我发现了一些与下面显示的代码非常相似的代码,并根据 monday.com 的登录页面的结构对其进行了调整。
我目前可以输入我的电子邮件和密码,也可以单击登录按钮。但是,出于某种原因,尽管您可以直观地看到这些条目,但该页面似乎没有检测到这些条目。
我试图在“handle_load_finished”之后放置 运行s 的第二个函数,并包含 JavaScript 用于单击那里的按钮,但它仍然 运行 而没有检测到条目在那里。
from PySide2.QtCore import QUrl
from PySide2.QtWidgets import QMainWindow, QApplication
from PySide2.QtWebEngineWidgets import QWebEngineView
import os
import sys
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.browser = QWebEngineView()
self.browser.setUrl(QUrl("https://miu2021.monday.com/auth/login_monday/email_password"))
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.handle_load_finished)
def handle_load_finished(self, ok):
if ok:
print("Page loaded successfully")
self.browser.page().runJavaScript("let ap = document.querySelector('#user_email');"
"ap.value = 'email@email.com';"
"let pa = document.querySelector('#user_password');"
"pa.value = 'password';"
"let btn = document.getElementsByTagName('button')[0];"
"btn.click();")
else:
print("Could not load page")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
应用图片:
网站似乎检测到触摸以验证用户是否键入,这不是自动任务。一种可能的解决方案是通过发送 QKeyEvents 来使 Qt 写入,如下所示。
import sys
from PySide2.QtCore import QCoreApplication, QEvent, Qt, QTimer, QUrl
from PySide2.QtGui import QKeyEvent
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtWebEngineWidgets import QWebEngineView
KEYMAP = {
"a": Qt.Key_A,
"b": Qt.Key_B,
"c": Qt.Key_C,
"d": Qt.Key_D,
"e": Qt.Key_E,
"f": Qt.Key_F,
"g": Qt.Key_G,
"h": Qt.Key_H,
"i": Qt.Key_I,
"j": Qt.Key_J,
"k": Qt.Key_K,
"l": Qt.Key_L,
"m": Qt.Key_M,
"n": Qt.Key_N,
"o": Qt.Key_O,
"p": Qt.Key_P,
"q": Qt.Key_Q,
"r": Qt.Key_R,
"s": Qt.Key_S,
"t": Qt.Key_T,
"u": Qt.Key_U,
"v": Qt.Key_V,
"w": Qt.Key_W,
"x": Qt.Key_X,
"y": Qt.Key_Y,
"z": Qt.Key_Z,
"1": Qt.Key_1,
"2": Qt.Key_2,
"3": Qt.Key_3,
"4": Qt.Key_4,
"5": Qt.Key_5,
"6": Qt.Key_6,
"7": Qt.Key_7,
"8": Qt.Key_8,
"9": Qt.Key_9,
"0": Qt.Key_0,
".": Qt.Key_Period,
"'": Qt.Key_Apostrophe,
}
def write_text(widget, text):
for letter in text:
key = KEYMAP.get(letter.lower(), Qt.Key_unknown)
event = QKeyEvent(QEvent.KeyPress, key, Qt.NoModifier, letter)
QCoreApplication.postEvent(widget.focusProxy(), event)
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.browser = QWebEngineView()
self.browser.load(
QUrl("https://miu2021.monday.com/auth/login_monday/email_password")
)
self.setCentralWidget(self.browser)
self.browser.loadFinished.connect(self.handle_load_finished)
def handle_load_finished(self, ok):
if ok:
QTimer.singleShot(100, self.write_email)
else:
print("Could not load page")
def write_email(self, *args):
self.browser.page().runJavaScript(
"""let ap = document.querySelector('#user_email')
ap.focus();""",
0,
self.callback_email,
)
def callback_email(self, *args):
write_text(self.browser, "email@email.com")
QTimer.singleShot(100, self.write_password)
def write_password(self):
self.browser.page().runJavaScript(
"""let pa = document.querySelector('#user_password');
pa.focus();""",
0,
self.callback_password,
)
def callback_password(self, *args):
write_text(self.browser, "password")
QTimer.singleShot(100, self.click)
def click(self):
self.browser.page().runJavaScript(
"""let btn = document.getElementsByTagName('button')[0];
btn.focus();
btn.click();"""
)
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()