Wie verwende ich Firefox-Cookies mit Wget?

15

wget --load-cookiesLädt Cookies als "Textdatei in dem Format, das ursprünglich von der Netscape-Datei cookies.txt verwendet wurde". Firefox speichert seine Cookies jedoch in einer SQLite- Datenbank.

Gibt es eine Möglichkeit, die Datei "cookies.txt" von Netscape aus der Firefox- cookies.sqliteDatei zu extrahieren ?

sds
quelle

Antworten:

12

Es gibt Cookie-Exporter-Erweiterungen, mit denen Sie eine Datei im cookie.txt-Format exportieren können, die mit wget verwendet werden kann.

Alternativ können Sie auch Ihre eigenen erstellen. Cookies können in angezeigt werden Options / Privacy / remove individual cookies. Sie können das gesuchte Cookie finden und eine TXT-Datei mit den folgenden Informationen erstellen:

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.

So könnte man zum Beispiel so aussehen:

.domain.com TRUE  / FALSE 4102358400 SESSIONID dfjdfkjsjwere090fusfdkljf
Paul
quelle
1
Die Erweiterung " Cookies exportieren" für Firefox scheint problemlos zu funktionieren.
Mivk
2
Leider werden neuere Versionen von FF dies noch ärgerlicher machen - es scheint Multiprozess nicht zu unterstützen, und es ist Legacy, sodass die Arbeit in FF 57+ eingestellt wird.
SomeoneSomewhereSupportsMonica
8

Wenn Sie verwenden wget, fühlen Sie sich wahrscheinlich von der Befehlszeile aus wohl. In diesem Fall können Sie anstelle einer Firefox-Erweiterung ein einfaches Shell-Skript verwenden:

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

Sie können das Skript extract_cookies.sh von https://gist.github.com/hackerb9/d382e09683a52dcac492ebcdaf1b79af herunterladen oder Folgendes ausschneiden und einfügen:

#!/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
hackerb9
quelle
1
Dies funktioniert nicht für Cookies, die nur während einer bestimmten Browsersitzung gespeichert werden. (so probalby alle Session-Cookies)
Krzysztof Krasoń
Ich habe dies in einem Befehl namens Lockenfeuer eingewickelt . curlfire http://www.example.com/undculfire -P newprofile http://www.example.com
Att Righ
1
Das ist toll. Beeinträchtigt nicht Multiprozess- oder neuere Versionen von FF und kann als Skript ausgeführt werden.
SomeoneSomewhereSupportsMonica
1

Die Art und Weise, wie Sie die SQLite-Datei finden, funktioniert auf den meisten Systemen nicht.

Was ist auch, wenn Sie mehrere SQLite-Dateien haben, weil Sie mehrere Firefox-Profile haben?

So mache ich es:

Holen Sie sich alle cookies.sqlite-Dateien, sortieren Sie sie nach der Zeilennummer und nehmen Sie an, dass die mit den meisten Zeilen diejenige ist, die Sie tatsächlich am häufigsten verwenden. Geben Sie dann den Pfad für diese Datei zurück.

Also habe ich deine Zeile folgendermaßen geändert:

SQLFILE=$(find ~ -type f -name cookies.sqlite -exec wc -l {} \+ | sort -rn |grep -v total| head -1 |egrep -o "/.*")
Brad Allison
quelle
Interessant. In welcher Firefox-Version findet mein Skript standardmäßig nicht alle Profile? Wo werden die Cookies gespeichert? Sicherlich müssen Sie nicht das gesamte Basisverzeichnis eines Benutzers durchsuchen, um sie zu finden.
Hackerb9
Ich halte es für einen Fehler, standardmäßig die SQLite-Datei zu verwenden, die die meisten Zeilenumbrüche und nicht die zuletzt verwendeten enthält. Ich erstelle häufig Firefox-Profile zum Wegwerfen, um ein paar Cookies von einer Website zu erhalten, die wgetTrauer bereitet, sodass das entsprechende Cookie-Glas winzig ist, aber das zuletzt aktualisierte. Übrigens, warum die Anzahl der Zeilenumbrüche in der Datenbank zählen, die binär sind, anstatt die Dateigröße zu verwenden? Sie müssen mein Skript nicht viel ändern, um dies zu tun. einfach tauschen ls -tmit ls -S. (Oder Sie können mein Skript als Filter verwenden, indem Sie es weiterleiten, wenn Sie dies vorziehen. find)
Hackerb9