題 如何在Wget中使用Firefox Cookie?


wget --load-cookies 將cookie加載為“Netscape的cookies.txt文件最初使用的格式的文本文件”。但是,Firefox保留其cookie SQLite的 數據庫。

有沒有辦法從Firefox中提取“Netscape的cookies.txt文件” cookies.sqlite 文件?


12
2017-10-28 01:58


起源




答案:


您可以使用cookie導出器擴展來導出可與wget一起使用的cookie.txt格式文件。

或者,您可以創建自己的。 Cookie可以查看 Options / Privacy / remove individual cookies。您可以找到您所追求的cookie並創建包含以下信息的.txt文件:

domain - The domain that created AND that can read the variable. 
flag - A TRUE/FALSE value indicating if all machines within a given domain can access the variable.  Say "true" 
path - The path within the domain that the variable is valid for.  Use / for any url
secure - A TRUE/FALSE value indicating if a secure connection with the domain is needed to access the variable. Use false to allow http://
expiration - The UNIX time that the variable will expire on.  Set something far in the future
name - The name of the variable. 
value - The value of the variable.

所以有人可能看起來像這樣:

.domain.com TRUE  / FALSE 4102358400 SESSIONID dfjdfkjsjwere090fusfdkljf

11
2017-10-28 02:16



該 導出Cookie Firefox的擴展似乎工作正常。 - mivk
不幸的是,較新版本的FF將使這更加痛苦 - 它似乎不支持多進程,並且是遺留的,因此將停止在FF 57+中工作。 - Someone Somewhere


如果你正在使用 wget,你可能對命令行很滿意。在這種情況下,您可以使用簡單的shell腳本而不是Firefox擴展:

extract_cookies.sh > mycookies.txt
wget --load-cookies mycookies.txt examplehost.com

您可以 下載extract_cookies.sh腳本 從 https://gist.github.com/hackerb9/d382e09683a52dcac492ebcdaf1b79af 或者剪切並粘貼以下內容:

#!/bin/sh -e
# extract_cookies.sh:
#
# Convert from Firefox's cookies.sqlite format to Netscape cookies,
# which can then be used by wget and curl. (Why don't wget and curl
# just use libsqlite if it's installed? Mysteries abound.)

# USAGE:
#
# $ extract_cookies.sh > /tmp/cookies.txt
# or
# $ extract_cookies.sh ~/.mozilla/firefox/*default*/cookies.sqlite > /tmp/cookies.txt

# USING WITH WGET:
# $ wget --load-cookies=/tmp/cookies.txt http://example.com

# USING WITH CURL:
# $ curl --cookie /tmp/cookies.txt http://example.com

# Note: If you do not specify an SQLite filename, this script will
# intelligently find it for you.
#
# A) Usually it will check all profiles under ~/.mozilla/firefox/ and
# use the cookies.sqlite that was updated most recently.
#
# B) If you've redirected stdin (with < or |) , then that will be used.


# HISTORY: I believe this is circa 2010 from:
# http://slacy.com/blog/2010/02/using-cookies-sqlite-in-wget-or-curl/
# However, that site is down now.

# Cleaned up by Hackerb9 (2017) to be more robust and require less typing.


cleanup() {
    rm -f $TMPFILE
    exit 0
}
trap cleanup  EXIT INT QUIT TERM


if [ "$#" -ge 1 ]; then
    SQLFILE="$1"
else
    if tty -s; then
    SQLFILE=$(ls -t ~/.mozilla/firefox/*/cookies.sqlite | head -1)
    else
    SQLFILE="-"     # Will use 'cat' below to read stdin
    fi
fi

if [ "$SQLFILE" != "-" -a ! -r "$SQLFILE" ]; then
    echo "Error. File $SQLFILE is not readable." >&2
    exit 1
fi

# We have to copy cookies.sqlite, because FireFox has a lock on it
TMPFILE=`mktemp /tmp/cookies.sqlite.XXXXXXXXXX`
cat "$SQLFILE" >> $TMPFILE


# This is the format of the sqlite database:
# CREATE TABLE moz_cookies (id INTEGER PRIMARY KEY, name TEXT, value TEXT, host TEXT, path TEXT,expiry INTEGER, lastAccessed INTEGER, isSecure INTEGER, isHttpOnly INTEGER);

echo "# Netscape HTTP Cookie File"
sqlite3 -separator $'\t' $TMPFILE <<- 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

cleanup

7
2017-08-09 06:10



這不適用於僅在給定瀏覽器會話期間保留的cookie。 (所以會議cookie都是probalby) - Krzysztof Krasoń
我把它包裝在一個名為的命令中 curlfire。 curlfire http://www.example.com/ 和 culfire -P newprofile http://www.example.com - Att Righ
這很棒。不會干擾多進程或更新版本的FF,並且可以編寫腳本。 - Someone Somewhere


您找到sqlite文件的方式在大多數係統上都不起作用。

如果您有多個sqlite文件,因為您有多個Firefox配置文件,那該怎麼辦?

所以這就是我的方式:

獲取所有cookies.sqlite文件,按行號對它們進行排序,並假設行數最多的那個是您實際使用最多的那個。然後返回該文件的路徑。

所以我改變了你的路線:

SQLFILE=$(find ~ -type f -name cookies.sqlite -exec wc -l {} \+ | sort -rn |grep -v total| head -1 |egrep -o "/.*")

1
2017-08-19 16:19



有趣。那麼你使用的是什麼版本的Firefox,我的腳本默認找不到所有的配置文件?餅乾存放在哪裡?當然,您不必搜索用戶的整個主目錄來查找它們。 - hackerb9
我認為默認使用具有最多新行而不是最近使用的SQLite文件是錯誤的。我會經常創建一次性的Firefox配置文件,只是為了從一個提供的網站獲取一些cookie wget 悲傷,所以相關的餅乾罐將很小,但最近更新。那麼,為什麼要計算數據庫中的換行符數,這是二進制的,而不是使用filesize?您不需要更改我的腳本就可以這樣做;只是交換 ls -t 同 ls -S。 (或者,如果您願意,可以通過管道將我的腳本用作過濾器 find)。 - hackerb9