Как качать с Rapidshare.com «free user», используя curl или wget

Опубликовано admin в Пнд, 26/07/2010 - 11:38

Появившаяся почти год назад статья (_http://alexandr.sysoev.ru/node/19) про скачивание с многими любимого кладезя почти легальной вами же забэкапленной информации Rapidshare.com вызвала одобрение у публики хабра. За последнее время рапида убрала с себя капчу, сделала не столь долгим ожидание между загрузками, в общем, всем своим видом показывает, что с ней очень приятно работать. А если это можно делать ещё и бесплатно… так почему же нет?!

Ввиду последних (_http://habrahabr.ru/blogs/lenta/58504/) событий, рекомендуется очень осмысленно подходить к процессу получения и раздачи информации другим пользователям сети. И автор этого поста не собирается нести какую либо ответственность за нарушение Вами, уважаемые хабровчане, лицензионных соглашений, авторских прав и т.д.

Чуть-чуть лирики в начале. Интерес в автоматизации некоторых процессов, например, автоматическое сохранение звуковых файлов произношения, стянутых с translate.google.com при заучивании новых слов; или же получение прямой ссылки с видео-хранилищ, для просмотре потом mplayer'ом на таблетке nokia N810; заставил поискать способы коммуникации с вебсерверами через консоль, по возможности, не прибегая к вмешательству пользователя, т.е. полной автоматизации. Самым популярным средством, пожалуй, является wget. Но используют его чаще всего для банальной скачки прямых линков на файлы. Это мы попробуем поправить этой статьёй. Но кроме wget так же есть и чуть менее известные программы, такие как например curl. Последний, скажем, отсутствует в дефолтовой установки линукса от широко известной в узких кругах Canonical Ltd.

Именно с curl и начну. Всего пару слов, что бы показать на что он способен.

Примеры использования автоматизации скачивания можно найти на английских (_http://emkay.unpointless.com/Blog/?p=63) просторах всяких интернетов. Попробуем на их базе описать сам процесс.

Пусть первым будет:

curl -s

Опция просто «затыкает» цюрл, что бы лишнего не болтал… Опция действительно полезная, если нет желания потом разбираться в горе статусной информации. Эта же опция в полной форме:

curl --silent.

Отправить POST запрос на HTTP сервер можно с помощью:

curl -d DATA_TO_SEND
curl --data DATA_TO_SEND


Пост используется браузером при отправки значений форм на HTML странице при нажатии пользователем кнопки «submit». И мы теперь сможем этим параметром сообщать серверу какую кнопку мы нажали, или что ввели в поле на странице и т.д.

Сразу для примера дам способ с помощью curl получать прямой линк на рапиде:

#!/bin/bash
while read urlline; do

pageurl=$(curl -s $urlline | grep "<form id=\"ff\" action=\"" | grep -o ‘http://[^"]*rar’)
fileurl=$(curl -s -d "dl.start=Free" "$pageurl" | grep "document.dlf.action=" | grep -o ‘http://[^"]*rar’ | head -n 1)
sleep 60
wget $fileurl

done < URLS.txt


Коротенько про этот bash скрипт — считывается построчно URLы из URLS.txt файла, в переменную pageurl вытягиваем линк на страницу с выбором premium/free user. В переменную fileurl кидается прямой линк на файл. Получаем его отсылая серверу, что мы желаем получать от жизни всё бесплатно, фильтруя grep'ом юрлы, а так как их может быть несколько — оставляем head'ом только первую строчку. Ждём 60 секунд и качаем файл. Вот такой вот скриптик.
 

А теперь банановый...


Попробуем это же всё изобразить с wget'ом.

Скрипт в студию:

#!/bin/bash

################################################
#Purpose: Automate the downloading of files from rapidshare using the free account
#using simple unix tools.
#Date: 14-7-2008
#Authors: Slith, Tune, Itay
#Improvements, Feedback, comments: Please go to emkay.unpointless.com/Blog/?p=63 (_http://emkay.unpointless.com/Blog/?p=63)
#Notes: To use curl instead of wget use 'curl -s' and 'curl -s -d'
#Version: 1.?
################################################

#ВАЖНО! - ДЕЛИТЕСЬ УСОВЕРШЕНСТВОВАНИЯМИ СКРИПТА С ОБЩЕСТВЕННОСТЬЮ

#Спасибо Tune за изчленения curl-зависимости в скрипте, вытаскивания точного времяни
#ожидания и скачивания разных файлов, не только .rar

#TODO: организовать работу с проксями
#TODO: восстанавливать докачку с зеркал, если первый сервер перестал отвечать

###
echo "test"
in=input.txt

timer()
{
TIME=${1:-960}
/bin/echo -ne "${2:-""}\033[s"
for i in `seq $TIME -1 1`; do
/bin/echo -ne "\033[u $(printf "%02d" `expr $i / 60`)m$(printf "%02d" `expr $i % 60`)s ${3:-""}"
sleep 1
done
/bin/echo -ne "\033[u 00m00s"
echo
}

while [ `wc -l $in | cut -d " " -f 1` != 0 ]; do
read line < $in
URL=$(wget -q -O - $line | grep "<form id=\"ff\" action=\"" | grep -o 'http://[^"]*');
output=$(wget -q -O - --post-data "dl.start=Free" "$URL");

# проверка занят ли сервер
serverbusy=$(echo "$output" | egrep "Currently a lot of users are downloading files. Please try again in.*minutes" | grep -o "[0-9]{1,0}")
if [ "$serverbusy" != "" ]; then
timer `expr $serverbusy '*' 60` "Сервер занят. Ожидаем." "перед переподключением..."
continue; # try again
fi

# проверка как долго мы должны ждать между загрузками (долгое время)
longtime=$(echo "$output" | egrep "Or try again in about.*minutes" | egrep -o "[0-9]*")
if [ "$longtime" != "" ]; then
timer `expr '(' $longtime + 1 ')' '*' 60` "Подождём." "(лимит для бесплатного пользователя) ..."
URL=$(wget -q -O - $line | grep "<form id=\"ff\" action=\"" | grep -o 'http://[^"]*');
output=$(wget -q -O - --post-data "dl.start=Free" "$URL");
fi

# как долго ждать перед началом загрузки (короткое время, меньше минуты)
time=$(echo "$output" | grep "var c=[0-9]*;" | grep -o "[0-9]\{1,3\}");

time=$(echo "$time" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') # trim ws
if [ "$time" = "" ]; then
echo "Загрузка \"`basename "$line"`\" не удалась".
echo $line >> fail.txt
sed -i '1 d' $in; #удаляем линию из input файла
continue
fi
ourfile=$(echo "$output" | grep "document.dlf.action=" | grep checked | grep -o "http://[^\\]*");
timer $time "Ожидание" "загрузки файла `basename "$ourfile"`";
if ! wget -c $ourfile; then
echo 'Загрузка не удалась. Похоже на проблемы со стороны сервера.'
else
sed -i '1 d' $in; #удаляем линию из input файла
fi
done

if [ -e fail.txt ]; then
mv fail.txt $in # пишем неудавшиеся загрузки обратно в инпут файл.
fi


Очень красивый скрипт. Нашёл для себя пару интересных реализаций. Так что оставляю его как есть, с указанием авторов. Сделал только полный перевод комментариев.

Кидаем список линков в input.txt и запускаем скрипт — он нам сам сообщит, что он делает. Если файл не удалось записать — он отправляется в файл fail.txt. При проходе всего input.txt файл fail.txt переписывается обратно в инпут, а скаченные линки удаляются.

Удачного вам скачивания своих бекапов.

PS:

  • русифицировал фразы в скрипте;
  • заметил баг: если ссылка кидается в файл, без перехода на новую строку — скрипт не хочет вчитывать такую строку. Выход: добавлять пустую строку в конец файла.
  • Для особо ленивых копипастить — выкладываю скрипт отдельно (_http://aurora.physics.ncsu.edu/download/downloadFromRSh.sh). Вчера (27 Окт 09) он был не доступен, т.к. на сервере поднимался django framework. По новой ссылке файл будет доступен ещё долгое время.


Статья взята с http://habrahabr.ru (_http://habrahabr.ru/blogs/linux/58603/)