Comment utiliser les cookies de Firefox avec Wget?

15

wget --load-cookieschargera les cookies sous la forme d'un "fichier texte au format utilisé à l'origine par le fichier cookies.txt de Netscape". Cependant, Firefox conserve ses cookies dans une base de données SQLite .

Existe-t-il un moyen d'extraire le "fichier cookies.txt de Netscape" du cookies.sqlitefichier Firefox ?

sds
la source

Réponses:

12

Il existe des extensions d'exportateur de cookies que vous pouvez utiliser pour exporter un fichier au format cookie.txt qui peut être utilisé avec wget.

Alternativement, vous pouvez créer le vôtre. Les cookies sont visibles dans Options / Privacy / remove individual cookies. Vous pouvez trouver le cookie que vous recherchez et créer un fichier .txt contenant les informations:

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.

On pourrait donc ressembler à ceci par exemple:

.domain.com TRUE  / FALSE 4102358400 SESSIONID dfjdfkjsjwere090fusfdkljf
Paul
la source
1
L' extension Export Cookies pour Firefox semble fonctionner correctement.
mivk
2
Malheureusement, les nouvelles versions de FF vont rendre cela encore plus pénible - il ne semble pas prendre en charge le multiprocessus et est hérité, il cessera donc de fonctionner dans FF 57+.
SomeoneSomewhereSupportsMonica
8

Si vous utilisez wget, vous êtes probablement à l'aise depuis la ligne de commande. Dans ce cas, au lieu d'une extension Firefox, vous pouvez utiliser un simple script shell:

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

Vous pouvez télécharger le script extract_cookies.sh à partir de https://gist.github.com/hackerb9/d382e09683a52dcac492ebcdaf1b79af ou couper et coller les éléments suivants:

#!/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
la source
1
Cela ne fonctionne pas pour les cookies qui ne sont conservés que pendant une session de navigateur donnée. (donc probalby tous les cookies de session)
Krzysztof Krasoń
J'ai enveloppé cela dans une commande appelée curlfire . curlfire http://www.example.com/etculfire -P newprofile http://www.example.com
Att Righ
1
C'est bien. N'interfère pas avec les versions multiprocessus ou plus récentes de FF et peut être scriptée.
SomeoneSomewhereSupportsMonica
1

La façon dont vous trouvez le fichier sqlite ne fonctionne pas sur la plupart des systèmes.

Et si vous avez plusieurs fichiers sqlite parce que vous avez plusieurs profils Firefox.

Alors, voici comment je le fais:

Obtenez tous les fichiers cookies.sqlite, triez-les par numéro de ligne et supposez que celle avec le plus de lignes est celle que vous utilisez le plus. Renvoyez ensuite le chemin d'accès à ce fichier.

J'ai donc changé votre ligne en ceci:

SQLFILE=$(find ~ -type f -name cookies.sqlite -exec wc -l {} \+ | sort -rn |grep -v total| head -1 |egrep -o "/.*")
Brad Allison
la source
Intéressant. Alors, quelle version de Firefox utilisez-vous pour que mon script ne trouve pas tous les profils par défaut? Où sont stockés les cookies? Certes, vous n'avez pas besoin de rechercher dans le répertoire personnel d'un utilisateur pour les trouver.
hackerb9
Je pense que c'est une erreur d'utiliser par défaut le fichier SQLite qui a le plus de nouvelles lignes plutôt que le plus récemment utilisé. Je vais souvent créer des profils Firefox jetables juste pour obtenir des cookies d'un site qui pose wgetproblème, donc le pot de cookies correspondant sera minuscule, mais le plus récemment mis à jour. Au fait, pourquoi compter le nombre de sauts de ligne dans la base de données, qui est binaire, au lieu d'utiliser la taille du fichier? Vous n'avez pas besoin de beaucoup changer mon script pour le faire; échangez simplement ls -tavec ls -S. (Ou vous pouvez utiliser mon script comme filtre en y ajoutant un tuyau si vous préférez find).
hackerb9