原文地址:https://www.lujun9972.win/blog/2021/08/17/如何让emacs使用firefox的cookie文件/index.html
目录
- Firefox cookie 文件的位置与格式
- Cookie 文件格式
- 导出 Cookie 文件
- Emacs 中使用 Cookie 文件
- url package
- request package
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 |
id | INTEGER | 1 | |||
1 | originAttributes | TEXT | 1 | '' | |
2 | name | TEXT | |||
3 | value | TEXT | |||
4 | host | TEXT | |||
5 | path | TEXT | |||
6 | expiry | INTEGER | |||
7 | lastAccessed | INTEGER | |||
8 | creationTime | INTEGER | |||
9 | isSecure | INTEGER | |||
10 | isHttpOnly | INTEGER | |||
11 | inBrowserElement | INTEGER | |||
12 | sameSite | INTEGER | |||
13 | rawSameSite | INTEGER | |||
14 | schemeMap | INTEGER |
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 |