如何让Emacs使用Firefox的Cookie文件
Firefox cookie 文件的位置与格式
- 在 Windows 系统中, Firefox cookie 文件为
%APPDATA%\Mozilla\Firefox\Profiles\<profile name>\cookies.sqlite - 在 Linux 系统中, Firefox cookie 文件为
~/.mozilla/firefox/<profile name>/cookies.sqlite
Firefox cookie 文件是一个 SQLite3 的数据库,可以通过 sqlite3 打开,其中有一个名为 moz_cookies 的表存储着 cookie 的每条记录。
该表的阿结构如下:
PRAGMA table_info(moz_cookies);
| cid | name | type | notnull | dflt_value | pk |
| 0 | id | INTEGER | 0 | 1 | |
| 1 | originAttributes | TEXT | 1 | '' | 0 |
| 2 | name | TEXT | 0 | 0 | |
| 3 | value | TEXT | 0 | 0 | |
| 4 | host | TEXT | 0 | 0 | |
| 5 | path | TEXT | 0 | 0 | |
| 6 | expiry | INTEGER | 0 | 0 | |
| 7 | lastAccessed | INTEGER | 0 | 0 | |
| 8 | creationTime | INTEGER | 0 | 0 | |
| 9 | isSecure | INTEGER | 0 | 0 | |
| 10 | isHttpOnly | INTEGER | 0 | 0 | |
| 11 | inBrowserElement | INTEGER | 0 | 0 | 0 |
| 12 | sameSite | INTEGER | 0 | 0 | 0 |
| 13 | rawSameSite | INTEGER | 0 | 0 | 0 |
| 14 | schemeMap | INTEGER | 0 | 0 | 0 |
Cookie 文件格式
Cookie 文件其实就是一个文本文件,每行存储着一个 cookie 记录(# 开头的行除外,这是注释)。每条 cookie 记录由7个字段组成,通过 TAB 进行分隔。
这些字段分别为:
- domain - cookie 所适用的域名
- flag - TRUE/FALSE 值,表示是否适用于所有
domain下的子域名。 - path - 该cookie 适用的域名路径,
/表示任意路径都适用 - secure - TRUE/FALSE 值,表示是否只能通过 HTTPS 协议传递该 cookie 值。
- expiration - cookie 过期时间,它是从1970年1月1日起开始的秒数,或者0表示永不过期
- name - cookie 名
- value - cookie 值
导出 Cookie 文件
由于 Emacs 不支持直接读写 sqlite 数据库,因此需要通过 sqlite3 命令将 cookies.sqlite 转换为标准的 Cookie 文件。
脚本如下:
echo "# Netscape HTTP Cookie File" > $COOKIEFILE # url package 在加载外部 Cookie 文件时会检查这一行Cookie标志,因此这行注释不可缺少。 sqlite3 -separator "\t" $COOKIEDB >> $COOKIEFILE <<- EOF .mode tabs .header off select host, case substr(host,1,1)='.' when 0 then 'FALSE' else 'TRUE' end, path, case isSecure when 0 then 'FALSE' else 'TRUE' end, expiry, name, value from moz_cookies; EOF
Emacs 中使用 Cookie 文件
url package
url 是 Emacs 自带的网络访问package,它将 Cookie 内容以 elisp form 的形式存储在了 url-cookie-file 所指代的文件中。不过它同时也提供了函数 url-cookie-parse-file-netscape 来加载外部的 Cookie 文件。
(url-cookie-parse-file-netscape FILENAME &optional LONG-SESSION) Load cookies from FILENAME in Netscape/Mozilla format. When LONG-SESSION is non-nil, session cookies (expiring at t=0 i.e. 1970-1-1) are loaded as expiring one year from now instead.
例如:
(url-cookie-parse-file-netscape COOKIEFILE)
added 1073 cookies from file /tmp/cookie.txt
request package
request 有两个后端,一个是 url package 一个 curl 命令,当使用 url package 时使用 Cookie 文件的方式跟上面一样的。
当使用 curl 命令是,它会从从 request-storage-directory 所指目录下的 curl-cookie-jar 中读取 Cookie 记录。
因此,只需要将外部 Cookie 文件的内容添加到这个文件中就行了:
(with-temp-file (request--curl-cookie-jar)
(insert-file-contents (request--curl-cookie-jar))
(goto-char (point-max))
(insert-file-contents COOKIEFILE))
| /tmp/cookie.txt | 109313 |
