За последнее время рапида убрала с себя капчу, сделала не столь долгим ожидание между загрузками, в общем, всем своим видом показывает, что с ней очень приятно работать. А если это можно делать ещё и бесплатно… так почему же нет?!
Интерес в автоматизации некоторых процессов, например, автоматическое сохранение звуковых файлов произношения, стянутых с translate.google.com при заучивании новых слов; или же получение прямой ссылки с видео-хранилищ, для просмотре потом mplayer'ом на таблетке nokia N810; заставил поискать способы коммуникации с вебсерверами через консоль, по возможности, не прибегая к вмешательству пользователя, т.е. полной автоматизации. Самым популярным средством, пожалуй, является wget. Но используют его чаще всего для банальной скачки прямых линков на файлы. Это мы попробуем поправить этой статьёй. Но кроме wget так же есть и чуть менее известные программы, такие как например curl. Последний, скажем, отсутствует в дефолтовой установки линукса от широко известной в узких кругах Canonical Ltd.
Именно с curl и начнем. Всего пару слов, что бы показать на что он способен.
Примеры использования автоматизации скачивания можно найти на английских просторах всяких интернетов. Попробуем на их базе описать сам процесс.
Пусть первым будет:
Code
curl -s
Опция просто «затыкает» цюрл, что бы лишнего не болтал… Опция действительно полезная, если нет желания потом разбираться в горе статусной информации. Эта же опция в полной форме:
Code
curl --silent.
Отправить POST запрос на HTTP сервер можно с помощью:
Code
curl -d DATA_TO_SEND
curl --data DATA_TO_SEND
Пост используется браузером при отправки значений форм на HTML странице при нажатии пользователем кнопки «submit». И мы теперь сможем этим параметром сообщать серверу какую кнопку мы нажали, или что ввели в поле на странице и т.д.
Сразу для примера — способ с помощью curl получать прямой линк на рапиде:
Code
#!/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'ом.
» Скрипт в студию: «
Code
#!/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
#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]*")
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 переписывается обратно в инпут, а скаченные линки удаляются.