webkit_qt.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from PyQt4 import QtCore, QtGui, QtWebKit
  2. CHECK_AUTH_JS = """
  3. var code = document.getElementById("code");
  4. var access_denied = document.getElementById("access_denied");
  5. var result;
  6. if (code) {
  7. result = {authorized: true, code: code.value};
  8. } else if (access_denied) {
  9. result = {authorized: false, message: access_denied.innerText};
  10. } else {
  11. result = {};
  12. }
  13. result;
  14. """
  15. def _on_qt_page_load_finished(dialog, webview):
  16. to_s = lambda x: (str(x.toUtf8()) if isinstance(x, QtCore.QString) else x)
  17. frame = webview.page().currentFrame()
  18. jscode = QtCore.QString(CHECK_AUTH_JS)
  19. res = frame.evaluateJavaScript(jscode)
  20. authorization = dict((to_s(k), to_s(v)) for (k, v) in res.toPyObject().items())
  21. if authorization.has_key("authorized"):
  22. dialog.authorization_code = authorization.get("code")
  23. dialog.close()
  24. def get_code(url, size=(640, 480), title="Google authentication"):
  25. """Open a QT webkit window and return the access code."""
  26. app = QtGui.QApplication([])
  27. dialog = QtGui.QDialog()
  28. dialog.setWindowTitle(title)
  29. dialog.resize(*size)
  30. webview = QtWebKit.QWebView()
  31. webpage = QtWebKit.QWebPage()
  32. webview.setPage(webpage)
  33. webpage.loadFinished.connect(lambda: _on_qt_page_load_finished(dialog, webview))
  34. webview.setUrl(QtCore.QUrl.fromEncoded(url))
  35. layout = QtGui.QGridLayout()
  36. layout.addWidget(webview)
  37. dialog.setLayout(layout)
  38. dialog.authorization_code = None
  39. dialog.show()
  40. app.exec_()
  41. return dialog.authorization_code