这事本来是有个 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)

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

使用 Python 读取火狐的 cookies的更多相关文章

  1. qpython3 读取安卓lastpass Cookies

    之前我的博客写了python读取windows chrome Cookies,沿着同样的思路,这次本来想尝试读取安卓chrome Cookies, 但是可能是chrome的sqlite3版本比较高读取 ...

  2. python读取excel一例-------从工资表逐行提取信息

    在工作中经常要用到python操作excel,比如笔者公司中一个人事MM在发工资单的时候,需要从几百行的excel表中逐条的粘出信息,然后逐个的发送到员工的邮箱中.人事MM对此事不胜其烦,终于在某天请 ...

  3. python读取xml文件

    关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码.这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件. 什么是 ...

  4. python读取mnist

    python读取mnist 其实就是python怎么读取binnary file mnist的结构如下,选取train-images TRAINING SET IMAGE FILE (train-im ...

  5. [转] Windows下使用Python读取Excel表格数据

    http://www.python-excel.org/这个网站罗列了很多关于在Python下操作Excel文件的信息,这里选择了其介绍的第一个模块xlrd . xlrd 0.9.2版本跨平台同时支持 ...

  6. Python读取txt文件

    Python读取txt文件,有两种方式: (1)逐行读取 data=open("data.txt") line=data.readline() while line: print ...

  7. Python读取Yaml文件

    近期看到好多使用Yaml文件做为配置文件或者数据文件的工程,随即也研究了下,发现Yaml有几个优点:可读性好.和脚本语言的交互性好(确实非常好).使用实现语言的数据类型.有一个一致的数据模型.易于实现 ...

  8. python读取中文文件编码问题

    python 读取中文文件后,作为参数使用,经常会遇到乱码或者报错asii错误等. 我们需要对中文进行decode('gbk') 如我有一个data.txt文件有如下内容: 百度 谷歌 现在想读取文件 ...

  9. Python读取Excel数据并根据列名取值

    一直想将自己接触到的东西梳理一遍,可就是迈不出第一步,希望从这篇总结开始不要再做行动的矮人了. 最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用 ...

随机推荐

  1. 20155201 2016-2017-2 《Java程序设计》第六周学习总结

    20155201 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 输入/输出 字节输入类: Java将输入/输出抽象化为串流,数据有来源及目的地,衔接 ...

  2. java数字转字符串前面自动补0或者其他数字

    /**  * Java里数字转字符串前面自动补0的实现.  *  * @author  xiaomo *  */  public class TestStringFormat {    public ...

  3. C# WebClient、 jsonp实现跨域

    WebClient 无传输数据获取 Uri uri = new Uri(allURL); WebClient wc = new WebClient(); wc.Encoding = System.Te ...

  4. SQL自定义排序 ORDER BY

    将id为30002 排在最前面 50第二 其他 不变 SELECT TOP 10 * FROM [表名] t1 ORDER BY case t1.ID when 30002 then 0 WHEN 5 ...

  5. 【h5标签转小程序标签】小程序使用wxParse解析html教程

    一.先下载所需文件,下载地址:https://pan.baidu.com/s/1umZO9uI24zUTRd7VqaWbAg  ,下载完毕后会得到一个wxParse文件夹,后面会用到: 二.先拷贝cs ...

  6. 【小程序开发】购物车加减几件demo

    <!-- 主容器 --> <view class="stepper"> <!-- 减号 --> <text class="{{m ...

  7. 【本地服务器】用nodejs搭建最简单、轻量化的http server

    1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后台语言. 但是你制作出来的网页总要运行.总要测试吧?——那就免不了用到http server.我先前都是用vis ...

  8. No.2 selenium学习之路之八种基本定位

    selenium的八种定位方式 1.通过id定位     find_element_by_id() send_keys() 输入框输入字符串 click()  鼠标点击事件 注:send_keys输入 ...

  9. three.js是什么,能干嘛,和webgl什么关系

    如今浏览器的功能越来越强大,而且这些功能可能通过JavaScript直接调用.你可以用HTML5标签轻松地添加音频和视频,而且可以在HTML5画布上创建各种交互组件.现在这个功能集合里又有了一个新成员 ...

  10. Selenium_多线程执行测试用例

    多线程执行测试用例 这里以百度搜索为例,通过不同的浏览器来启动不同的线程. #!/usr/bin/env python # _*_ coding:utf-8 _*_ __author__ = 'Yin ...