Как использовать файлы cookie Firefox с Wget?

13

wget --load-cookies загрузит файлы cookie в виде «текстового файла в формате, который изначально использовался в файле cookies.txt Netscape». Тем не менее, Firefox хранит свои куки в SQLite база данных.

Есть ли способ извлечь «файл cookies.txt Netscape» из Firefox cookies.sqlite файл?

sds
источник

Ответы:

11

Существуют расширения для экспортеров cookie, которые можно использовать для экспорта файла формата cookie.txt, который можно использовать с wget.

Кроме того, вы можете создать свой собственный. Файлы 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
Paul
источник
1
Экспорт печенье расширение для Firefox, кажется, работает нормально.
mivk
2
К сожалению, новые версии FF сделают это более болезненным - он не поддерживает многопроцессорность и является устаревшим, поэтому перестанет работать в FF 57+.
Someone Somewhere
7

Если вы используете wgetВам, наверное, удобно из командной строки. В этом случае вместо расширения 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
hackerb9
источник
1
Это не работает для файлов cookie, которые хранятся только во время сеанса браузера. (так, вероятно, все сеансовые куки)
Krzysztof Krasoń
Я завернул это в команду под названием curlfire , curlfire http://www.example.com/ а также culfire -P newprofile http://www.example.com
Att Righ
1
Это замечательно. Не мешает многопроцессорным или более новым версиям FF, и может быть написано в сценарии.
Someone Somewhere
1

То, как вы находите файл sqlite, не работает на большинстве систем.

А также, что если у вас есть несколько файлов sqlite, потому что у вас есть несколько профилей Firefox.

Вот как я это делаю:

Получить все файлы cookie.sqlite, отсортировать их по номеру строки и предположить, что тот, который содержит наибольшее количество строк, является тем, который вы на самом деле используете чаще всего. Затем верните путь к этому файлу.

Поэтому я изменил вашу линию на это:

SQLFILE=$(find ~ -type f -name cookies.sqlite -exec wc -l {} \+ | sort -rn |grep -v total| head -1 |egrep -o "/.*")
Brad Allison
источник
Интересно. Так какую версию Firefox вы используете, чтобы мой скрипт не нашел все профили по умолчанию? Где хранятся файлы cookie? Конечно, вам не нужно искать весь домашний каталог пользователя, чтобы найти их.
hackerb9
Я думаю, что ошибкой по умолчанию является использование файла SQLite, который содержит больше новых строк, чем использованных в последнее время. Я часто буду создавать одноразовые профили Firefox просто для того, чтобы получить куки с сайта, который дает wget горе, поэтому соответствующая банка печенья будет крошечной, но самой последней обновленной. Кстати, зачем считать количество строк в базе данных, которая является двоичной, а не использовать размер файла? Вам не нужно сильно менять мой сценарий, чтобы сделать это; просто поменяй местами ls -t с ls -S, (Или вы можете использовать мой скрипт в качестве фильтра, добавив в него, если хотите, find ).
hackerb9