pyqt5的QWebEngineView实现登录百度网盘账号并储存cookies

  • A+
所属分类:编程语言

在很多百度网盘登录的软件中,常常通过百度网盘提供的api接口然后使用命令行模式进行登录,需要输入验证码同时需要进行二次验证输入短信或邮箱验证码,相对比较繁琐。因此,最好是有一种直接通过web界面进行登录,然后保存登录的cookies信息再使用requests进行后续处理。下面讲解如何进行web登录保存cookies信息,登录微信、支付宝或其他界面处理类似,减去了抓包解析api的麻烦。

一、使用环境准备

准备基本的环境,Python、pycharm、pyqt5 等,具体安装配置已有很多说明教程,直接百度。

二、使用方法介绍

主要需要使用到的是pyqt5的QWebEngineViewQWebEngineProfile 组件,实现原理是在QWebEngineView加载登录网页过程中会获取到cookie,通过设置浏览器的默认配置项,实现将

QWebEngineProfile.defaultProfile().cookieStore().cookieAdded

信号连接到自定义的槽函数上,然后输出出来,如打印或保存,具体的存储逻辑代码可以自己去实现。

三、实现源代码

首先是通过函数init_setup 初始化软件界面,其次是创建generate_cookie的槽函数,并将cookieAdded 信号连接到创建的槽函数上。若网页有获取到一条cookie就会发射一个信号,并将cookie的键值对解析出来添加到初始化的self.cookies 字典中。cookie是一条条进行添加进入的,若是需要存储cookies 则可通过网页加载完成的信号(或者urlchanged信号跳转到了登录成功的url)来进行判断,若加载完成就会发射信号并开始调用存储的功能。

  1. # -*-coding:utf-8-*-
  2. import sys
  3. from PyQt5.QtCore import QUrl
  4. from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication
  5. from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineProfile
  6. class BrowserWindow(QWidget):
  7.     def __init__(self, parent=None, *args, **kwargs):
  8.         super(BrowserWindow, self).__init__(parent)
  9.         self.init_setup()
  10.     def init_setup(self):
  11.         self.cookies = dict()
  12.         browser = QWebEngineView()
  13.         QWebEngineProfile.defaultProfile().cookieStore().cookieAdded.connect(self._generate_cookie)
  14.         browser.load(QUrl("http://pan.baidu.com"))
  15.         layout = QVBoxLayout()
  16.         layout.addWidget(browser)
  17.         self.setLayout(layout)
  18.     def _generate_cookie(self, cookie):
  19.         name = cookie.name().data().decode('utf-8')  # 先获取cookie的名字,再把编码处理一下
  20.         value = cookie.value().data().decode('utf-8')  # 先获取cookie值,再把编码处理一下
  21.         self.cookies[name] = value
  22.         print(self.cookies)
  23. if __name__ == '__main__':
  24.     app = QApplication(sys.argv)
  25.     window = BrowserWindow()
  26.     window.show()
  27.     sys.exit(app.exec_())

四、知识拓展

在实现获取网页登录的cookie信息过程中也走过弯路,想通过

browser.page().runJavaScript

来调用javascript的document.cookie来获取登录后的cookie信息,但是获取到的是不完整的,不可行。

另外,还想到一种方式是直接获取浏览器默认在本地保存的cookie 信息,通过解析存储在sqlite中的cookie来实现。网上有这种解析的代码,但具体没在pyqt5中的QWebEngineView进行实现验证,若有兴趣大家可以试试。一是要找到缓存等信息的存储路径,二是要通过sqlite进行解析。

 

 

 

weinxin
我的微信公众号
爱真理,得永生!          爱在灵灵久博客,网罗天下,福利大家!

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: