zoukankan      html  css  js  c++  java
  • 使用 Python 读取火狐的 cookies

    这事本来是有个 browsercookie 库可以做的,但是初看它就有不少问题:

    1. 不能指定要使用的火狐 profile(后来发现可以指定数据库文件)。
    2. 找不到 sessionstore.js 文件时会向标准输出打印一行信息。对于 cron 脚本,这种行为是非常非常讨厌的。

    我在尝试解决这些问题时,又发现了额外的问题:它每次都要把所有的 cookie 全部读取。再加上不必要地导入 keyring、Crypto 等库,让我想放弃了。

    于是我考虑自己实现一个 cookiejar。但发现它有如下问题:

    • 公开接口和实现细节没有清晰地分离
    • 没有提供存储和读取 cookie 的抽象,而是存在一个字典里

    这样扩展起来就十分令人不爽了,也不知道能正常工作多久。

    也罢,cookiejar 是个十分复杂的东西,我不如实现一个获取匹配的 cookie 的独立功能,然后通过各种姿势传给 HTTP 客户端库好了。

    火狐的 cookie 数据库文件「cookies.sqlite」里就一个「moz_cookies」表,其结构也挺简单的。但是,怎么做 cookie 的匹配呢?既然决定放弃 Python 自带的 cookiejar,那就不看它,直接看火狐的源码好了。

    于是去 DXR 上搜索火狐的源码。没费多少力气就找到了相关的部分,然后跟着代码就能知道是怎么匹配的了:

    1. 通过祼域名查得候选 cookie
    2. 根据域名、路径和 secure 等属性来过滤 cookie
    3. 就这样,没有第三步了

    祼域名使用 tldextract 库来做,其它属性的匹配算法直接看火狐的代码。虽然是不熟悉的 C++ 代码,但是写得很棒,很容易理解。

    把自己需要的部分写成 Python,得一新模块——firefoxcookies。就一个方法,返回一个 cookie 的字典,用起来也很方便。比如在我的 requestsutils.RequestsBase 中,这么干就可以了:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class FireRequests(RequestsBase):
      def initialize(self):
        self._fc = FirefoxCookies(os.path.expanduser(
          '~/.mozilla/firefox/nightly/cookies.sqlite'))
     
      def request(self, url, method=None, *args, **kwargs):
        if self.baseurl:
          url = urljoin(self.baseurl, url)
     
        cookies = self._fc.get_cookies(url)
     
        return super().request(url, method=method, cookies=cookies)

    就这样就满足我的需求了。以后再有别的需求,再慢慢扩展。

  • 相关阅读:
    1、PHP入门二维数组与循环
    Nginx 配置反向代理后,页面中取绝对URL地址的问题显示代理端口
    苹果手机上点击WEUI日期控件不容易点中
    ios 不支持-,-时间。
    Newtonsoft.Json添加项
    Baidu地图Map api直接加https不起作用
    腾讯云cos封装
    linux连接工具隧道模式
    微信调试工具测试时有时候复制URL没有corpid解决
    WEUI控件JS用法
  • 原文地址:https://www.cnblogs.com/pyxiaomangshe/p/7842687.html
Copyright © 2011-2022 走看看