【问题标题】:QWebEngineView - Javascript CallbackQWebEngineView - Javascript 回调
【发布时间】:2017-07-21 06:53:16
【问题描述】:

我最终要完成的是捕获用户输入网站的用户名和密码。例如,如果用户在 Facebook 的登录中输入“test@example.com”作为电子邮件地址,然后单击提交,我想将该电子邮件地址存储在我的 PyQt 应用程序中。

我最接近实现这一点的方法是使用一系列 JavaScript 命令在“登录按钮”上放置一个侦听器,该侦听器返回用户参数的当前值。我的问题是 PyQt 提供的回调是针对 runJavaScript 函数完成时的回调,而不是 JavaScript 事件侦听器。我想知道是否有任何方法可以从 JavaScript 函数中捕获回调函数,或者我是否有更好的方法来做到这一点。

import os
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget
from PyQt5.QtCore import QUrl, QEventLoop
from PyQt5.QtWebEngineWidgets import QWebEngineView

class WebPage(QWebEngineView):
    def __init__(self):
        QWebEngineView.__init__(self)
        self.load(QUrl("https://facebook.com"))
        self.loadFinished.connect(self._on_load_finished)
        #self.page().runJavaScript("document.getElementById("myBtn").addEventListener("click", displayDate)", print)

    def _on_load_finished(self):
        print("Finished Loading")
        cmds = ["btn=document.getElementById('u_0_r')",  # Login Button
                "user=document.getElementsByName('email')[0]",
                "function get_username(){return user.value}",
                "btn.addEventListener('click', get_username)"]
        self.page().runJavaScript("; ".join(cmds), lambda x: print("test: %s"  % x))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    web = WebPage()
    web.show()
    sys.exit(app.exec_())  # only need one app, one running event loop

【问题讨论】:

  • 您正在尝试获取用户名密码??
  • 是的,这个例子只显示了用户名/电子邮件,因为(如果我错了,请纠正我)原则应该是一样的
  • 但是您似乎是在试图窃取用户的密码...
  • @ekhumoro 更少关于窃取,更多关于在每次进入浏览器时记住/自动填充用户密码。想想 dashlane/lastpass/chrome-autofill。如果您有其他建议,我们很乐意采纳

标签: python pyqt pyqt5 qwebview


【解决方案1】:

我发现了一个使用“urlChanged”信号的解决方法,到目前为止它似乎对我的应用程序有效

import os
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget
from PyQt5.QtCore import QUrl, QEventLoop
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInterceptor

class WebPage(QWebEngineView):
    def __init__(self):
        QWebEngineView.__init__(self)
        self.current_url = ''
        self.load(QUrl("https://facebook.com"))
        self.loadFinished.connect(self._on_load_finished)
        self.urlChanged.connect(self._on_url_change)

    def _on_load_finished(self):
        self.current_url = self.url().toString()

    def _on_url_change(self):
        self.page().runJavaScript("document.getElementsByName('email')[0].value", self.store_value)

    def store_value(self, param):
        self.value = param
        print("Param: " +str(param))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    web = WebPage()
    web.show()
    sys.exit(app.exec_())  # only need one app, one running event loop

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 2019-02-05
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多