Все знают, какие неудобства приходится испытывать при скачивании группы файлов с Рапидшары.com - ждать начала закачки, пока рапидовские часики оттикают свои мгновения, любоваться на никому не нужную рекламу и предложения, и самое досадное - долго ждать, когда скачается очередной файл, потом выждать огромный тайм-аут (десятки минут), пока Рапида снова позволит задать параметры скачивания для последующего файла.
Виндузятники давно используют свои примочки для обхода этого ограничения, но многие из них работают ненадежно, а в некоторых и вовсе заботливо подсажен свежий троянчик 
Теперь сравните, как просто и элегантно этот вопрос решен в линуксе для wget'а
:
Данный скрипт позволяет автоматизировать процесс скачивания нескольких ссылок, задав их все сразу в одном диалоге. Поэтому нет нужды ждать, пока скачается первый файл, чтобы задать параметры скачивания для второго - по сути, этот скрипт работает как робот, заменяя человека и экономя его драгоценное время.
Скрипт использовать очень просто:
1. Придаем ему атрибуты 700
2. Создаем файл под названием input.txt (атрибуты 644), в котором построчно перечисляем http-ссылки скачиваемых файлов, и помещаем его в один каталог с нашим скриптом.
3. Запускаем скрипт на выполнение.
В процессе работы скрипт будет демонстрировать время ожидания разрешения Рапиды на скачивания, затем работу wget'а.
Если с какими-то закачками возникнут проблемы, они будут перечислены в файле fail.txt.
#!/bin/bash
Скрипт рекомендуется запускать под утилитой screen
################################################
#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
Скрипт был обнаружен на хабре.
Последние комментарии