#!/bin/bash # For NNM-Club Uploaders # Copyright (c) 2012 Valdos Sine # # Usage: # # ./massdl.sh [mode] [forum] # # For getting help, execute ./massdl.sh without params UNIXTIME=`date +%s` TMPDIR=`mktemp -d` CURDIR=`pwd` LOG_FILE="$UNIXTIME-massdl.log" SUBFORUMSDL=0 wget_func () { # Wget helper, which makes many wget usages more stable # Usage wget_func [path_to_redirect] [anything (wget params, such as -O...)] wget -t 99 --wait=1 --post-data="username=$USERNAME&password=$PASSWORD&autologin=on&login=%C2%F5%EE%E4&redirect=${1}" "http://nnm-club.ru/forum/login.php" ${2} -a $CURDIR/$LOG_FILE if [[ $? -gt 0 ]] ; then echo -ne "..ошибка загрузки, повтор.." wget_func "${1}" "${2}" fi } # Checking if we have parameter, otherwise show help in Russian if [[ ${@} == "" ]] ; then echo "massdl.sh — скрипт для пакетной загрузки торрент-файлов из разделов NNM-club.ru." echo "Использование:" echo -ne "\n\t./massdl.sh [режим] [номер_раздела]\n\n" echo "где [режим] это режим загрузки (от имени пользователя, указанного в конфигурации скрипта — значение user, или же от имени фрилич-пользователя — значение freeleech), а [номер_форума] — номер раздела на NNM-club.ru (например, для форума '*Nix Игры' это 316)." echo -ne "Примеры:\n\n\t./massdl.sh freeleech 316 — скачивание форума '*Nix Игры' от фрилич-пользователя\n\t./massdl.sh user 332 — скачивание форума 'Русский рок' от собственного, указанного в скрипте, имени\n\n" echo "Автор: Valdos 'fat0troll' Sine." echo "Основано на технологиях GNU." echo "Версия 0.5" exit 0 else echo "Выполняется скрипт ${0}." echo "Строка параметров работы: ${@}." echo -ne "Проводим разбор строки..." # Script configuration case "x${1}" in "xuser" ) # TYPE YOUR USERNAME AND PASSWORD HERE! USERNAME=user PASSWORD=password echo -ne "пользователь $USERNAME" ;; "xfreeleech" ) # Freeleech user credentials USERNAME=freeleech_user PASSWORD=freeleech_password echo -ne "фрилич" ;; * ) # ERROR! echo -ne "ошибка, неправильный режим работы скрипта! Разрешённые режимы — freeleech или же user.\nЗавершение...\n" exit 1 ;; esac FORUM=${2} echo -ne ", номер форума ${FORUM}.\n" echo "Начинаем работу..." fi # Heading log file cat > $LOG_FILE << EOF ================================================================================ = Скрипт скачки раздела NNM-Club для Linux и Unix-like ОС. = = Построен на технологиях GNU. = Дата запуска: `date`. ================================================================================ EOF # Downloading main page of the selected forum wget_func `echo 'viewforum.php?f='$FORUM` "-O $TMPDIR/page0.html" FORUMNAME=`cat $TMPDIR/page0.html | iconv -f cp1251 -t utf-8 | grep maintitle | cut -d '>' -f 4 | cut -d '<' -f 1 | sed 's/\//_/g'` echo "Скачиваем форум \"${FORUMNAME}\"..." ITERATOR=0 THREADS=0 # Downloading all pages while [ `cat $TMPDIR/page$ITERATOR.html | iconv -f cp1251 -t utf-8 | grep "След."| grep 'start' | wc -l` == "2" ] do iconv -f cp1251 -t utf-8 $TMPDIR/page$ITERATOR.html > $TMPDIR/page$ITERATOR.utf8.html cat $TMPDIR/page$ITERATOR.utf8.html | grep "DL:" | grep topictitle | sed 's/.*]*\).*/\1/' | cut -d '"' -f 2 >> $TMPDIR/alllinkz.txt THREADS=$(($THREADS + 50)) ITERATOR=$(($ITERATOR + 1)) START=$(($ITERATOR * 50)) echo "Скачиваем страницу $((${ITERATOR} + 1))..." wget_func `echo 'viewforum.php?f='$FORUM'%26start='$START` "-O $TMPDIR/page$ITERATOR.html" done # Last loop ending :) iconv -f cp1251 -t utf-8 $TMPDIR/page$ITERATOR.html > $TMPDIR/page$ITERATOR.utf8.html cat $TMPDIR/page$ITERATOR.utf8.html | grep "DL:" | grep topictitle | sed 's/.*]*\).*/\1/' | cut -d '"' -f 2 >> $TMPDIR/alllinkz.txt # Detecting subforums cat $TMPDIR/page0.utf8.html | grep viewforum | grep forumlink | grep -v "images" | cut -d '"' -f 14 | cut -d '=' -f 2 >> $TMPDIR/subforumz.txt if [[ `cat $TMPDIR/subforumz.txt | wc -l` -gt 0 ]] ; then echo "Выявлены подфорумы!" while read subline do echo "Добавляем в очередь закачки форум $subline..." echo "${0} ${1} $subline" >> $TMPDIR/$UNIXTIME-subforumsdl.sh done < $TMPDIR/subforumz.txt chmod +x $TMPDIR/$UNIXTIME-subforumsdl.sh SUBFORUMSDL=1 fi # You can use it as statistic :) THREADS=`cat $TMPDIR/alllinkz.txt | wc -l` echo -ne "Выявлено $THREADS топиков, содержащих торренты! Скачиваем...\n" # And this is what we need -- getting threads and torrents! # Torrents will be saved in folders like 100, 200, 300... Every folder contains # 100 torrents (except the last one). THREAD=0 mkdir "$FORUMNAME" while read line do pushd "${FORUMNAME}" >> /dev/null mkdir "$(($THREAD / 100))" 2>> /dev/null THREAD=$(($THREAD + 1)) echo -ne "Скачиваем торрент $THREAD/$THREADS." # Temporary solution until will be finded way to use cookie.txt... wget_func $line "-O $TMPDIR/out_$THREAD.html" # :3 TOPICHDR=`cat $TMPDIR/out_$THREAD.html | grep maintitle | cut -d '>' -f 4 | cut -d '<' -f 1 | iconv -f cp1251 -t utf-8` TOPICLNK=`cat $TMPDIR/out_$THREAD.html | grep maintitle | cut -d '"' -f 10` echo -ne "." wget_func `cat $TMPDIR/out_$THREAD.html | iconv -f cp1251 -t utf-8 | grep download.php | sed 's/.*]*\).*/\1/' | cut -d '"' -f 2 | tail -1 -` "-P "$(($THREAD / 100))/" --content-disposition" # Check for bad wget saving... if [[ -f login.php ]] ; then echo -ne ".имя файла потеряно. используется сгенерированное скриптом.." mv login.php "$(($THREAD / 100 ))"/$THREAD.torrent # Check if file is real torrent. If not... get an error if [[ `file "$(($THREAD / 100 ))"/$THREAD.torrent | grep BitTorrent` ]] ; then echo -ne ".файл сохранён как $(($THREAD / 100 ))/$THREAD.torrent.." else echo -ne ".скачан не BitTorrent-файл! После завершения работы скрипта проверьте файл $UNIXTIME-error.log — там будет ссылка на нескачанный топик!\n" echo -ne "Пишем информацию в лог-файл.." echo "Топик $THREAD: ошибка скачивания $TOPICHDR [https://nnm-club.ru/forum/$TOPICLNK]" >> $CURDIR/$UNIXTIME-error.log rm "$(($THREAD / 100 ))"/$THREAD.torrent fi fi echo -ne "." # Check sanity: torrents must equal threads. If not -- post a warning ;) sanity_error () { echo -ne ".кажется, топик не отдал нам файла. После завершения работы скрипта проверьте $UNIXTIME-error.log — там будет ссылка на проблемный топик!\n" echo -ne "Пишем информацию в лог-файл.." echo "Топик $THREAD: подозрительный $TOPICHDR [https://nnm-club.ru/forum/$TOPICLNK]" >> $CURDIR/$UNIXTIME-error.log } actualize_delta () { # Actualizes delta between files count and expected count: when we switching # folder delta should be nulled! if [[ $(($THREAD / 100)) -gt $LAST_ERROR ]] ; then ERROR_DELTA=0 else if [[ x$ERROR_DELTA == "x" ]] ; then ERROR_DELTA=0 fi fi } add_delta () { # Adding delta LAST_ERROR=$(($THREAD / 100)) ERROR_DELTA=$(($ERROR_DELTA + 1)) } actualize_delta if [[ $(($THREAD / 100)) -eq '0' ]] ; then if [[ `ls $(($THREAD / 100))/*.torrent | wc -l` -eq $(($THREAD - $(($THREAD / 100 * 100)) - $ERROR_DELTA)) ]] ; then echo -ne "" else sanity_error add_delta fi else if [[ `ls $(($THREAD / 100))/*.torrent | wc -l` -eq $(($THREAD - $(($THREAD / 100 * 100)) + 1 - $ERROR_DELTA)) ]] ; then echo -ne "" else sanity_error add_delta fi fi echo -ne ".\n" popd >> /dev/null done < $TMPDIR/alllinkz.txt # Downloading subforums if [[ "x$SUBFORUMSDL" == "x1" ]] ; then $TMPDIR/$UNIXTIME-subforumsdl.sh fi # Cleaning up... rm -r $TMPDIR