Jak korzystać z plików cookie Firefox z Wget?

15

wget --load-cookieszaładuje pliki cookie jako „plik tekstowy w formacie pierwotnie używanym przez plik cookie.txt firmy Netscape”. Jednak Firefox przechowuje swoje pliki cookie w bazie danych SQLite .

Czy istnieje sposób na wyodrębnienie „pliku cookie.txt Netscape” z cookies.sqlitepliku Firefox ?

sds
źródło

Odpowiedzi:

12

Istnieją rozszerzenia eksportera plików cookie, których można użyć do wyeksportowania pliku w formacie cookie.txt, którego można używać z wget.

Alternatywnie możesz stworzyć swój własny. Pliki cookie są widoczne w Options / Privacy / remove individual cookies. Możesz znaleźć poszukiwany plik cookie i utworzyć plik .txt zawierający informacje:

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.

Można by na przykład wyglądać tak:

.domain.com TRUE  / FALSE 4102358400 SESSIONID dfjdfkjsjwere090fusfdkljf
Paweł
źródło
1
Export Cookies rozszerzenie dla Firefoksa wydaje się działać prawidłowo.
mivk
2
Niestety, nowsze wersje FF sprawią, że będzie to jeszcze bardziej uciążliwe - wydaje się, że nie obsługuje wieloprocesowego i jest spuścizną, więc przestanie działać w FF 57+.
SomeoneSomewhereSupportsMonica
9

Jeśli używasz wget, prawdopodobnie czujesz się komfortowo z poziomu wiersza poleceń. W takim przypadku zamiast rozszerzenia Firefoksa można użyć prostego skryptu powłoki:

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

Możesz pobrać skrypt extract_cookies.sh ze strony https://gist.github.com/hackerb9/d382e09683a52dcac492ebcdaf1b79af lub wytnij i wklej następujące elementy:

#!/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
źródło
1
Nie działa to w przypadku plików cookie przechowywanych tylko podczas danej sesji przeglądarki. (tak prawdopodobnie wszystkie ciasteczka sesyjne)
Krzysztof Krasoń
Podsumowałem to poleceniem o nazwie curlfire . curlfire http://www.example.com/orazculfire -P newprofile http://www.example.com
Att Righ,
1
To jest świetne. Nie koliduje z wieloprocesowymi lub nowszymi wersjami FF i może być skryptowany.
SomeoneSomewhereSupportsMonica
1

Sposób, w jaki znajdujesz plik sqlite, nie działa w większości systemów.

Co również, jeśli masz wiele plików sqlite, ponieważ masz wiele profili Firefox.

Oto jak to robię:

Pobierz wszystkie pliki cookie.sqlite, posortuj je według numeru linii i załóż, że ten, który ma najwięcej wierszy, jest tym, którego faktycznie używasz. Następnie zwróć ścieżkę do tego pliku.

Więc zmieniłem twój wiersz na to:

SQLFILE=$(find ~ -type f -name cookies.sqlite -exec wc -l {} \+ | sort -rn |grep -v total| head -1 |egrep -o "/.*")
Brad Allison
źródło
Ciekawy. Więc jakiej wersji Firefox używasz, że mój skrypt domyślnie nie znajduje wszystkich profili? Gdzie są przechowywane pliki cookie? Na pewno nie musisz przeszukiwać całego katalogu domowego użytkownika, aby je znaleźć.
hackerb9
Myślę, że błędem jest domyślnie używać pliku SQLite, który ma najwięcej nowych wierszy, a nie ostatnio używany. Często tworzę niepotrzebne profile Firefoksa, aby uzyskać ciasteczka ze strony, która daje wgetżal, więc odpowiedni słoik z ciasteczkami będzie mały, ale ostatnio zaktualizowany. Nawiasem mówiąc, po co liczyć liczbę nowych wierszy w bazie danych, która jest binarna, zamiast używać rozmiaru pliku? W tym celu nie trzeba dużo zmieniać mojego skryptu; po prostu zamień ls -tz ls -S. (Lub możesz użyć mojego skryptu jako filtru, przesyłając go do niego, jeśli wolisz find).
hackerb9