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

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

    Ввиду последних событий, рекомендуется очень осмысленно подходить к процессу получения и раздачи информации другим пользователям сети. И автор этого поста не собирается нести какую либо ответственность за нарушение Вами, уважаемые хабровчане, лицензионных соглашений, авторских прав и т.д.

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

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

    Примеры использования автоматизации скачивания можно найти на английских просторах всяких интернетов. Попробуем на их базе описать сам процесс.

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

    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
    #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:
    • русифицировал фразы в скрипте;
    • заметил баг: если ссылка кидается в файл, без перехода на новую строку — скрипт не хочет вчитывать такую строку. Выход: добавлять пустую строку в конец файла.
    • Для особо ленивых копипастить — выкладываю скрипт отдельно. Вчера (27 Окт 09) он был не доступен, т.к. на сервере поднимался django framework. По новой ссылке файл будет доступен ещё долгое время.

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 33

      +2
      Можно ли переместить топик в блог «Линукс для Всех»?
        +1
        Сейчас еще кто-нибудь подкинет кармы и смело можете переносить.
        • НЛО прилетело и опубликовало эту надпись здесь
            0
            Тогда какой блог посоветуете? Я предпочитаю конструктивную критику…
            +2
            curl можна из под Винды использовать через cygwin например. Мне видится что место ему где-то в Администрировании
            +1
            спасибо
              0
              #!/bin/bash
              # файлики
              input_file=".list"
              premium_login=`cat .premium_login`
              premium_pass=`cat .premium_pass`
              # авторизация
              wget --delete-after --save-cookies .cookie --no-check-certificate --post-data "login=$premium_login&password=$premium_pass" https://ssl.
              rapidshare.com/cgi-bin/premiumzone.cgi
              # закачка списка
              wget --background --timeout=10 --load-cookies .cookie --input-file=$input_file

              А вот так качать список файлов с премиумом куда-нить на сервер с быстрыми каналами (просто скрипт валялся, часто пользуюсь) :)
                0
                Кстати насчет новой строки. Bash тоже не выполняет команду из последней строки, если в конце нет перехода на новую. Поэтому видимо редактор gedit добавляет в каждый текстовый файл перевод строки в конце если его нет.
                  0
                  Вот если бы сделать сервис, который качает, а потом со своего сервера на максимуме качать, вот было бы супер.
                    0
                    filepost.ru
                      –1
                      Это не то, я бы хотел скачивать, но с рапидшары, а со своего сервера и на максимальной скорости
                      0
                      а зачем? неужели так сложно написать скрипт самостоятельно
                      там 3 странички с котырых парсятся урлы на каждую последующую и далее последняя уже на сам сервер с файлом, после чего файл отдается и вы спокойно его хапаете на свой сервер.
                        0
                        сложно, вот бы к скриптам бы еще обертку с веб-интерфейсом несложную и удобную, другое дело было бы
                          0
                          а что именно сложно то там :)
                          у вас указан в интересах PHP, я как раз нем и писал (правда для премиум :) )
                          curl в помощь, вот дока к нему на php.net http://ru.php.net/curl
                        0
                        есть такой платный сервис у бел.провайдера adsl.by, iget.by называется(% (это так, для сведения просто(%)
                          0
                          спасибо, погуглю на эту тему
                          –1
                          downup.wsнапример. А если есть свой сервер, то rapidgetpro.ru/ — достаточно извесная подборка php скриптов для закачки с файлхостингов
                          0
                          Офигенно! Спасибо! Очень помогло.

                          Люблю пользоваться netbks.com, но руками лень качать было сегодня огромный список файлов (штук 50), а тут «НА ТЕБЕ!».

                          СПАСИБО!
                            +1
                            По-русски curl называется курлом, простите за занудство.
                              0
                              Я уже руки потираю.

                              Мне провайдер динамические IP прямые в инет даёт.
                              Я ещё давненько для себя скрипт для разрыва PPP соединения на ADSL модеме написал.
                              Что-бы со всяких рапид без ожидания качать, а тут и скрипт для автоматизации скачивания подоспел.
                              Осталось скрестить мой скрипт и этот скрипт и закачаться до смерти…
                                0
                                Под FreeBSD скрипт не работал, чуть изменил, вроде работает. Выложил сюда. (Правда требует wget или curl из портов) inakrin.ru/downloadFromRShFreeBSD.sh
                                • НЛО прилетело и опубликовало эту надпись здесь
                                    0
                                    По поводу #TODO: организовать работу с проксями
                                    На сколько я помню, wget для определения прокси использует переменную $http_proxy
                                    т.е. если в скрипте будет
                                    http_proxy=«proxy:3128» то он будет ломиться через эту проксю
                                    http_proxy="" — полезет напрямую
                                      0
                                      спасибо, попробую. Надеюсь будет нормальная консольная замена USDownloader
                                        0
                                        есть slimrat
                                          0
                                            0
                                            спасибо все работает!

                                            если не трудно организуйте страничку (желательно с rss) чтобы можно было отслеживать развитие скрипта :) знаю, что очень много хочу…
                                              0
                                              кстати wordrider.net/freerapid/download.html это на яве, намного удобнее в консоли на роутере запустить скрипт на ночь и пойти спать, а не разгребать там с явой и USDownloader-ом

                                              жалко ifolder не прилепеш там капчи — заморочисто, выйдет тот же USDownloader
                                                0
                                                только написал, что все работает…

                                                попобовал сначала на десктопе — стоит убунта 9,04 — 6 ссылок отработало как часы (bash, version 3.2.48)

                                                забросил скрипт на домашний шлюз, там альт (школьный сервер)
                                                во первых, скрипт удалось запустить только так: /bin/bash2 rapida.sh (bash, version 3.2.33)
                                                скрипт подхватил первую ссылку, закачал потом выдал пулеметом:
                                                Загрузка "*************.part34.rar" не удалась.
                                                Загрузка "*************33.rar" не удалась.

                                                что в башах разный синтаксис (: ??

                                                  0
                                                  а как бы можно его демонизировать, чтобы не держать всё время открытым ssh-соединение?

                                                  запуск в фоне не помогает.

                                                  (новичок, поэтому спрашиваю)
                                                    0
                                                    Просто любопытно, а как Вы пытаетесь его запустить в фоне?

                                                    Я подумал про
                                                    >./rapidshare.sh &
                                                    Должно работать.

                                                    Но вот Вам ещё один способ:
                                                    >screen -R rapida
                                                    запустит скрин сессию, если у Вас стоит скрин (скорее всего, что да).
                                                    Далее уже в этой сессии запускаем скрипт. В нём можно работать как с обычным терминалом. Т.е. cd, mkdir, ls… всё как обычно. Отпустить скрин в бекграунд — CTRL+A, CTRL+D, нажимаем комбинации по очереди. На этом всё. Если вы были на сервере по ssh или ещё как — можете спокойно отсоединяться, скрин будет продолжать работать (до перезагрузки системы).
                                                    Для восстановления сессии:
                                                    >screen -ls
                                                    покажет все сессии и их статусы.
                                                    >screen -R rapida
                                                    присоединиться к нашей первичной сессии.
                                                    Убить сессию можно командой… не помню какой. Проще в строке ввода скрина ввести
                                                    >exit
                                                    это убъёт форк и закроет сессию скрина.

                                                    Удачи на фронтах борьбы с/за линукс/линуксом.
                                                      0
                                                      Я подумал про
                                                      >./rapidshare.sh &
                                                      Должно работать.


                                                      по-моему, пробовал, но процесс всё равно убивался

                                                      Но вот Вам ещё один способ:
                                                      >screen -R rapida


                                                      да, screen поставил, но не знал, что скрин не закрывается вместе с консолью :)

                                                      Удачи на фронтах борьбы с/за линукс/линуксом.


                                                      спасибо огромное! :)
                                                        0
                                                        кстати, оказывается у меня весело аж 2 скрина :)

                                                        один — с этим скриптом, второй — с рсинком :)

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                  Самое читаемое