Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用QWebEngine登录SAML授权页面,等待cookie,然后清除/退出_Python_Python 3.x_Pyqt5 - Fatal编程技术网

Python 使用QWebEngine登录SAML授权页面,等待cookie,然后清除/退出

Python 使用QWebEngine登录SAML授权页面,等待cookie,然后清除/退出,python,python-3.x,pyqt5,Python,Python 3.x,Pyqt5,我正在尝试编写一个PyQT QWebEngineView,它打开一个网站,对AAD进行SAML登录,返回,一旦它看到一个特定的cookie(openconnect webvpn cookie),就会获取该值并将其返回到“控制台”脚本,该脚本可以继续处理和/或返回到命令提示符 我已经将足够多的代码粘在一起,可以弹出一个浏览器窗口,逐步通过SAML授权,查看cookie和cookie值。我不知道如何自动关闭/退出WebView窗口,并将cookie值和/或数组“返回”到Python本身,以便继续处理

我正在尝试编写一个PyQT QWebEngineView,它打开一个网站,对AAD进行SAML登录,返回,一旦它看到一个特定的cookie(openconnect webvpn cookie),就会获取该值并将其返回到“控制台”脚本,该脚本可以继续处理和/或返回到命令提示符

我已经将足够多的代码粘在一起,可以弹出一个浏览器窗口,逐步通过SAML授权,查看cookie和cookie值。我不知道如何自动关闭/退出WebView窗口,并将cookie值和/或数组“返回”到Python本身,以便继续处理和/或退出。也不太清楚如何“清理”我的对象

我可能确实伪造了我的类、启动器和对象变量。这是一个难题

想法?想法

这是ArchLinux,通过包repo提供了最新的Python和pyqt

守则:

#!/usr/bin/python

#core python
import sys

#PyQT libraries
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtNetwork import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *

#functions / classes
class OpenconnectSamlAuth(QMainWindow):
   #init self object
   def __init__(self):
      #inherit parents functions, classes, etc....
      super(OpenconnectSamlAuth, self).__init__()

      #create webview object
      self.webview = QWebEngineView()

      #grab profile
      self.profile = QWebEngineProfile("storage", self.webview)
      self.cookie_store = self.profile.cookieStore()
      self.cookie_store.cookieAdded.connect(self.onCookieAdded)

      #empty array of cookies
      self.samlcookies = []

      #set some window options
      #window width x height
      self.resize(1024, 768);

      #default settings
      self.mySettings = QWebEngineSettings.defaultSettings()
      self.mySettings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)


   #load URL / process login
   def samlLogin(self,url):
      #create page and load URL
      webpage = QWebEnginePage(self.profile, self.webview)
      self.webview.setPage(webpage)
      self.webview.load(QUrl(url))

      #windows options
      self.setCentralWidget(self.webview)

      #window title
      self.webview.setWindowTitle('Loading...')
      self.webview.titleChanged.connect(self.updateTitle)


   #update title window       
   def updateTitle(self):
      self.webview.setWindowTitle(self.webview.title())


   #handle cookies being added
   def onCookieAdded(self, cookie):
      #check if cookies exists
      #for c in self.cookies:
      #   if c.hasSameIdentifier(cookie):
      #      return
      #self.cookies.append(QNetworkCookie(cookie))      return;
      #bytearray(c.name()).decode()
      print(bytearray( QNetworkCookie(cookie).name() ).decode() )
      print(bytearray( QNetworkCookie(cookie).value() ).decode() )
      return
         

#main loop
def main():
   #initialize QT application object
   App = QApplication(sys.argv)

   #setup webkit window / browser session
   OpenconnectWebObj = OpenconnectSamlAuth()

   #load URL
   OpenconnectWebObj.samlLogin("https://vpnserverurl/groupname")

   #show connection window
   OpenconnectWebObj.show()

   #execute the app and grab the returned cookie
   cookie = App.exec_()
   print(cookie)

   #exit
   sys.exit()


#if called via command line; run this
if __name__ == '__main__':
   main()

如果要关闭窗口,则必须调用close()方法,但在本例中,似乎需要终止Qt eventloop,因此应使用QCoreApplication.quit()方法。另一方面,cookie可以存储为属性,然后使用:

导入系统 从PyQt5.QtCore导入QCoreApplication,QUrl 从PyQt5.QT网络导入QNetworkCookie 从PyQt5.QtWidgets导入QApplication,QMainWindow 从PyQt5.QtWebEngineWidgets导入( QWebEnginePage, QWebEngineProfile, QWebEngineSettings, QWebEngineView, ) 类OpenconnectSamlAuth(QMainWindow): def uuu init uuu(self,parent=None): 超级(OpenconnectSamlAuth,self)。\uuuu init\uuuu(父级) self.\u cookie=无 self.webview=QWebEngineView() self.profile=QWebEngineProfile(“存储”,self.webview) self.cookie\u store=self.profile.cookieStore() self.cookie\u store.cookieAdded.connect(self.handle\u cookie\u added) self.profile.settings().setAttribute(QWebEngineSettings.JavascriptEnabled,True) 网页=QWebEnginePage(self.profile,self) self.webview.setPage(网页) self.webview.titleChanged.connect(self.update\u title) self.setCentralWidget(self.webview) 自我调整大小(1024768) @财产 def cookie(自我): 返回自我 def登录(自我,url): self.webview.load(QUrl.fromUserInput(url)) self.webview.setWindowTitle(“加载…”) def更新标题(自我): self.webview.setWindowTitle(self.webview.title()) 添加了def handle_cookie_(self,cookie): 打印(“添加了{name}:{value}.”格式(name=cookie.name(),value=cookie.value()) 如果cookie.name()==b“cookie的名称”: self.\u cookie=QNetworkCookie(cookie) QCoreApplication.quit() #主回路 def main(): app=QApplication(sys.argv) openconnect_webobj=OpenconnectSamlAuth() openconnect_webobj.login(“https://vpnserverurl/groupname") openconnect_webobj.show() ret=app.exec cookie=openconnect\u webobj.cookie 如果cookie不是无: 打印(“结果:”,cookie.name(),cookie.value(),cookie.toRawForm()) 系统退出(ret) 如果名称=“\uuuuu main\uuuuuuuu”: main()
我不知道需要进行什么函数/类对象调用才能从“内部”关闭QMainWindow对象,以及在关闭时如何将cookie传递回“主”python循环。谢谢。我明天会玩它,看看它怎么样。感谢您的帮助。@HenrikHudson如果答案对您有帮助,请不要忘记标记为正确,如果您不知道如何做,请检查Yeap。刚从床上滚下来。将
QCoreApplication.quit()
和cookie添加到对象本身,并通过对象函数进行访问,效果良好。再次感谢。