Скрипт автоскачивания с Rapidshare
Идея написать данную статью вызвана очень резкой необходимостью скачать n-ное количество файлов с всемирноизвестного файлового хранилища Rapidshare. А теперь поподробнее. С недавних пор решил всерьез заняться изучением английского языка. После консультаций у специалистов решил прослушать курс A.J.Hoge. На сайте автора уроки оказались платными. А мы, естественно, сторонники халявы =). После некоторого времени, потраченного на поиск всего курса, наткнулся на сайт, где пользователь выложил весь материал на Rapidshare. Ура, радости было много, но недолго…. Объем оказался размером 4.4 Гб, разбитым на архивы размером по 200Мб!!! Вручную ставить каждый файл по посинения особо не хочется =)) Имеем рабочий ПК с установленной системой Ubuntu 10.04. Создадим небольшой скрипт:
- mkdir ~/rapidshare
- cd rapidshare/
- touch rapidshare.sh
- содержимое скрипта:
#!/bin/bash
################################################
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
- touch input.txt
- touch fail.txt
- вставляем ссылки в файл input.txt
- запускаем скрипт bash rapidshare.sh – он нам сам сообщит, что он делает. Если файл не удалось записать — он отправляется в файл fail.txt. При проходе всего input.txt файл fail.txt переписывается обратно в input.txt, а скаченные линки удаляются.
- наблюдаем процесс как на изображении.
Существует баг: если ссылка кидается в файл, без перехода на новую строку — скрипт не хочет считывать такую строку. Выход: добавлять пустую строку в конец файла.
Удачного вам скачивания своих бекапов.
Источник detected