¿Cómo uso las cookies de Firefox con Wget?

15

wget --load-cookiescargará cookies como un "archivo de texto en el formato utilizado originalmente por el archivo cookies.txt de Netscape". Sin embargo, Firefox mantiene sus cookies en una base de datos SQLite .

¿Hay alguna forma de extraer el "archivo Netscape's cookies.txt" del cookies.sqlitearchivo Firefox ?

sds
fuente

Respuestas:

12

Existen extensiones de exportador de cookies que puede usar para exportar un archivo de formato cookie.txt que se puede usar con wget.

Alternativamente, puede crear el suyo. Las cookies se pueden ver en Options / Privacy / remove individual cookies. Puede encontrar la cookie que busca y crear un archivo .txt que contenga la información:

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.

Entonces uno podría verse así, por ejemplo:

.domain.com TRUE  / FALSE 4102358400 SESSIONID dfjdfkjsjwere090fusfdkljf
Pablo
fuente
1
La extensión Exportar cookies para Firefox parece funcionar bien.
mivk
2
Desafortunadamente, las versiones más nuevas de FF harán que esto sea más difícil: no parece admitir multiproceso, y es un legado, por lo que dejará de funcionar en FF 57+.
SomeoneSomewhereSupportsMonica
8

Si está utilizando wget, probablemente se sienta cómodo desde la línea de comandos. En ese caso, en lugar de una extensión de Firefox, puede usar un script de shell simple:

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

Puede descargar el script extract_cookies.sh desde https://gist.github.com/hackerb9/d382e09683a52dcac492ebcdaf1b79af o cortar y pegar lo siguiente:

#!/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
fuente
1
Esto no funciona para las cookies que se guardan solo durante una sesión de navegador determinada. (así que probablemente todas las cookies de sesión)
Krzysztof Krasoń
He envuelto esto en un comando llamado curlfire . curlfire http://www.example.com/yculfire -P newprofile http://www.example.com
Att Righ
1
Esto es genial. No interfiere con el multiproceso o las versiones más recientes de FF, y puede ser programado.
SomeoneSomewhereSupportsMonica
1

La forma en que encuentra el archivo sqlite no funciona en la mayoría de los sistemas.

Además, ¿qué pasa si tiene varios archivos sqlite porque tiene varios perfiles de Firefox?

Así que así es como lo hago:

Obtenga todos los archivos cookies.sqlite, ordénelos por número de línea y suponga que el que tiene más líneas es el que realmente está usando más. Luego devuelva la ruta para ese archivo.

Así que cambié tu línea a esto:

SQLFILE=$(find ~ -type f -name cookies.sqlite -exec wc -l {} \+ | sort -rn |grep -v total| head -1 |egrep -o "/.*")
Brad Allison
fuente
Interesante. Entonces, ¿qué versión de Firefox estás usando para que mi script no encuentre todos los perfiles por defecto? ¿Dónde se almacenan las cookies? Seguramente, no tiene que buscar el directorio de inicio completo de un usuario para encontrarlo.
hackerb9
Creo que es un error usar de manera predeterminada el archivo SQLite que tiene la mayoría de las nuevas líneas en lugar de las más recientes. A menudo crearé perfiles de Firefox desechables solo para obtener algunas cookies de un sitio que está causando wgetdolor, por lo que el tarro de cookies relevante será pequeño, pero el más reciente actualizado. Por cierto, ¿por qué contar el número de nuevas líneas en la base de datos, que es binaria, en lugar de usar el tamaño de archivo? No necesitas cambiar mucho mi script para hacerlo; solo intercambia ls -tcon ls -S. (O puede usar mi script como filtro si lo prefiere find).
hackerb9