LINUX.ORG.RU

wget, cookies, authentication и basecamp

 , ,


0

1

Приветствую.

Переходим на работе с одного инструмента управления проектами (Basecamp) на другой (Trello). В связи с этим появилась необходимость сделать бэкап всей информации, что накопилась за несколько лет в нашем Basecamp'е. Попробовал заюзать для этой цели wget:

~ $ wget --save-cookies cookies.txt --post-data='username=%username%&password=%password%&product=basecamp&subdomain=%company_name%' --keep-session-cookies https://launchpad.37signals.com/authentication

~ $ wget --load-cookies cookies.txt -p -r -e robots=off -P basecamp https://%company_name%.basecamphq.com/clients

Результат — wget говорит, что отработал успешно

FINISHED --2014-04-03 14:24:02--
Total wall clock time: 2m 56s
Downloaded: 108 files, 508K in 3.4s (150 KB/s)

, однако на практике имеются следующие проблемы:

  • Ни одна из ссылок со страницы, которая была указана в качестве «стартовой», не работает — при переходе по ним получаю «File not found» в Firefox'е. При этом сами файлы соответствующих страниц на харде существуют. Думал, что, может быть, что-то не так с путями. Заглянул в исходники «стартовой страницы» — все href'ы имеют вид <a href=«/projects/%project_name%»>. Там они реально и находятся — «ls basecamp/%company_name%.basecamphq.com/projects» выдаёт список файлов, относящихся ко всем проектам, в том числе и к тем, переходы на которые я пытался осуществить.
  • В случае открытия любой страницы, кроме «стартовой», я наблюдаю окно с просьбой залогиниться

Почему это происходит? Что я делаю не так? Как это можно исправить?

~ $ wget --version
GNU Wget 1.13.4 built on linux-gnu.

+digest +https +ipv6 +iri +large-file +nls -ntlm +opie +ssl/gnutls 

Wgetrc: 
    /etc/wgetrc (system)
Locale: /usr/share/locale 
Compile: gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC=«/etc/wgetrc» 
    -DLOCALEDIR=«/usr/share/locale» -I. -I../lib -I../lib 
    -D_FORTIFY_SOURCE=2 -Iyes/include -g -O2 -fstack-protector 
    --param=ssp-buffer-size=4 -Wformat -Wformat-security 
    -Werror=format-security -DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall 
Link: gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat 
    -Wformat-security -Werror=format-security -DNO_SSLv2 
    -D_FILE_OFFSET_BITS=64 -g -Wall -Wl,-z,relro -Lyes/lib -lgnutls 
    -lgcrypt -lgpg-error -lz -lidn -lrt ftp-opie.o gnutls.o 
    ../lib/libgnu.a

За совет по поводу любого другого рабочего варианта скачивания информации с Basecamp'а буду также признателен.

Заранее благодарю за возможные ответы.

Стоит посмотреть на Ctrl+Shift+I, раздел Network в Chrome, там есть функция Copy as cURL. Сравнить результаты с тем, что вы пытаетесь делать скриптом.

anonymous ()
Ответ на: комментарий от anonymous

Если Вы про попытку логина, то вот, что показывает «Copy as cURL»:

curl 'https://launchpad.37signals.com/authentication' -H 'Cookie: _launchpad_session=%session%' -H 'Origin: https://%company_name%.basecamphq.com' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Referer: https://%company_name%.basecamphq.com/login' -H 'Connection: keep-alive' --data 'utf8=%smth%&authenticity_token=%token%&product=basecamp&subdomain=%company_name%&username=%username%&password=%password%&commit=Sign+in' --compressed

В post-data имеются также «authenticity_token» и «utf-8», которые я не прописываю руками в случае использования wget.

b0r3d0m ()

Первая проблема решается путём явного указания того, что файлы, которые указаны в href'ах, лежат относительно working directory. Например,

<a href=«./projects/%project_name%»>

вместо

<a href=«/projects/%project_name%»>

Почему wget так делает по умолчанию? Как это можно изменить?

И что делать со второй проблемой?

b0r3d0m ()

может вас заинтересует ключ -k?

anonymous ()
Ответ на: комментарий от anonymous

Да, ключ -k, похоже, как раз то, что мне надо. Попробую, как только вернусь домой. На работе wget убивает ядро. Судя по всему, из-за слишком большого потребления памяти:

# cat /var/log/kern.log | grep wget
Apr  4 06:28:43 debian kernel: [14390.930809] wget invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
Apr  4 06:28:43 debian kernel: [14390.930813] wget cpuset=/ mems_allowed=0
Apr  4 06:28:43 debian kernel: [14390.930816] Pid: 6607, comm: wget Tainted: G           O 3.2.0-4-amd64 #1 Debian 3.2.51-1
Apr  4 06:28:43 debian kernel: [14390.936200] [ 6607]  1000  6607  1350472   454445   0       0             0 wget
Apr  4 06:28:43 debian kernel: [14390.936202] Out of memory: Kill process 6607 (wget) score 859 or sacrifice child
Apr  4 06:28:43 debian kernel: [14390.936206] Killed process 6607 (wget) total-vm:5401888kB, anon-rss:1817632kB, file-rss:148kB
Apr  4 06:43:17 debian kernel: [15265.581092] [ 6648]     0  6648  1378444   461548   0       0             0 wget
Apr  4 06:43:17 debian kernel: [15265.581095] Out of memory: Kill process 6648 (wget) score 837 or sacrifice child
Apr  4 06:43:17 debian kernel: [15265.581101] Killed process 6648 (wget) total-vm:5513776kB, anon-rss:1846176kB, file-rss:16kB
Apr  4 06:43:17 debian kernel: [15265.581810] wget: page allocation failure: order:0, mode:0x20058
Apr  4 06:43:17 debian kernel: [15265.581815] Pid: 6648, comm: wget Tainted: G           O 3.2.0-4-amd64 #1 Debian 3.2.51-1

Мне теперь гораздо интереснее понять, что делать со второй проблемой.

b0r3d0m ()
Ответ на: комментарий от b0r3d0m

В post-data имеются также «authenticity_token» и «utf-8», которые я не прописываю руками в случае использования wget.

Я basecamp в глаза не видел, но разве тут authenticity_token это не защита от CSRF?

На работе wget убивает ядро. Судя по всему, из-за слишком большого потребления памяти:

Переходи на curl

xtraeft ★★☆☆ ()
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

Я basecamp в глаза не видел, но разве тут authenticity_token это не защита от CSRF?

Не в курсе.

Переходи на curl

Зачем? И как при помощи него выполнять рекурсивные загрузки, чтобы скачать весь сайт целиком?

curl --help | grep recursive
ничего не говорит.

b0r3d0m ()

Поставил WebHTTrack — так он вообще тут же завершает свою работу, так ничего и не скачав.

b0r3d0m ()
Ответ на: комментарий от b0r3d0m

Не в курсе.

Ты уверен, что логин (твой первый POST запрос) проходит нормально?

xtraeft ★★☆☆ ()
Ответ на: комментарий от xtraeft

Судя по всему, да, потому что та страница, которая была указана в качестве «стартовой» в одном из аргументов wget, сохранилась со всем контентом, который виден лишь после выполнения входа на сайт.

И да, curl, я так понимаю, всё же не может выполнять рекурсивные загрузки, так что мне придётся писать свой скрипт, который вытаскивает по одной странице, верно?

b0r3d0m ()
Ответ на: комментарий от b0r3d0m

потому что та страница, которая была указана в качестве «стартовой» в одном из аргументов wget, сохранилась со всем контентом, который виден лишь после выполнения входа на сайт.

Тогда ок. Я предполагал, что проблема может быть в этом.

curl, я так понимаю, всё же не может выполнять рекурсивные загрузки

Не может, я не сразу обратил внимание на то что нужна рекурсивность.

В случае открытия любой страницы, кроме «стартовой», я наблюдаю окно с просьбой залогиниться

Так а что в исходниках страниц, кроме стартовой?

xtraeft ★★☆☆ ()
Ответ на: комментарий от xtraeft

Так а что в исходниках страниц, кроме стартовой?

А сейчас в этом плане всё нормально. Может, флаг "-k" на это повлиял? Что именно он делает? По описанию из help'а следует, что влияет он лишь на то, что я описывал в качестве первой проблемы:

~ $ wget --help | grep -A 1 «\--convert-links»
  -k,  --convert-links      make links in downloaded HTML or CSS point to
                            local files.

Больше ничего не менял.

В общем, приду домой — запущу весь процесс заново.

b0r3d0m ()
Ответ на: комментарий от b0r3d0m

У wget есть опция --mirror, которая и предназначена для сохранения копии сайта.

yars068 ★★★★ ()
Ответ на: комментарий от yars068

Да, но опцию -k всё равно приходится отдельно указывать, например, т.к. --mirror её не добавляет.

b0r3d0m ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.