2012-04-02 23:07:16 +04:00
#!/bin/bash
# For NNM-Club Uploaders
# Copyright (c) 2012 Valdos Sine <fat0troll at yandex dot ru>
#
# Usage:
#
# ./massdl.sh [mode] [forum]
#
# For getting help, execute ./massdl.sh without params
2012-04-03 23:10:15 +04:00
UNIXTIME = ` date +%s`
2012-04-02 23:07:16 +04:00
TMPDIR = ` mktemp -d`
CURDIR = ` pwd `
2012-04-03 23:10:15 +04:00
LOG_FILE = " $UNIXTIME -massdl.log "
2012-04-07 17:42:32 +04:00
SUBFORUMSDL = 0
2012-04-02 23:07:16 +04:00
wget_func ( ) {
# Wget helper, which makes many wget usages more stable
# Usage wget_func [path_to_redirect] [anything (wget params, such as -O...)]
2012-04-03 23:10:15 +04:00
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
2012-04-05 00:20:11 +04:00
if [ [ $? -gt 0 ] ] ; then
echo -ne "..ошибка загрузки, повтор.."
wget_func " ${ 1 } " " ${ 2 } "
fi
2012-04-02 23:07:16 +04:00
}
# Checking if we have parameter, otherwise show help in Russian
if [ [ ${ @ } = = "" ] ] ; then
2012-04-03 23:10:15 +04:00
echo "massdl.sh — скрипт для пакетной загрузки торрент-файлов из разделов NNM-club.ru."
2012-04-02 23:07:16 +04:00
echo "Использование:"
echo -ne "\n\t./massdl.sh [режим] [но ме р _р а зде ла ]\n\n"
2012-04-03 23:10:15 +04:00
echo "где [режим] это режим загрузки (от имени пользователя, указанного в конфигурации скрипта — значение user, или же от имени фрилич-пользователя — значение freeleech), а [но ме р _фо р у ма ] — номер раздела на NNM-club.ru (например, для форума '*Nix Игры' это 316)."
2012-04-02 23:07:16 +04:00
echo -ne "Примеры:\n\n\t./massdl.sh freeleech 316 — скачивание форума '*Nix Игры' от фрилич-пользователя\n\t./massdl.sh user 332 — скачивание форума 'Русский рок' от собственного, указанного в скрипте, имени\n\n"
echo "Автор: Valdos 'fat0troll' Sine."
echo "Основано на технологиях GNU."
2012-04-03 23:10:15 +04:00
echo "Версия 0.5"
2012-04-02 23:07:16 +04:00
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
2012-04-05 00:20:11 +04:00
# Heading log file
cat > $LOG_FILE << EOF
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
= Скрипт скачки раздела NNM-Club для Linux и Unix-like О С . =
= Построен на технологиях GNU. =
Дата запуска: ` date` .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
EOF
2012-04-02 23:07:16 +04:00
# 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
2012-04-07 17:42:32 +04:00
2012-04-02 23:07:16 +04:00
# 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
2012-04-07 17:42:32 +04:00
cat $TMPDIR /page$ITERATOR .utf8.html | grep "DL:" | grep topictitle | sed 's/.*<a href=\([^>]*\).*/\1/' | cut -d '"' -f 2 >> $TMPDIR /alllinkz.txt
2012-04-02 23:07:16 +04:00
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
2012-04-07 17:42:32 +04:00
cat $TMPDIR /page$ITERATOR .utf8.html | grep "DL:" | grep topictitle | sed 's/.*<a href=\([^>]*\).*/\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
2012-04-02 23:07:16 +04:00
# You can use it as statistic :)
2012-04-07 17:42:32 +04:00
THREADS = ` cat $TMPDIR /alllinkz.txt | wc -l`
2012-04-02 23:07:16 +04:00
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 "
2012-04-03 23:10:15 +04:00
# :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`
2012-04-02 23:07:16 +04:00
echo -ne "."
2012-04-03 23:10:15 +04:00
wget_func ` cat $TMPDIR /out_$THREAD .html | iconv -f cp1251 -t utf-8 | grep download.php | sed 's/.*<a href=\([^>]*\).*/\1/' | cut -d '"' -f 2 | tail -1 -` "-P " $(( $THREAD / 100 )) /" --content-disposition"
2012-04-03 21:18:05 +04:00
# Check for bad wget saving...
if [ [ -f login.php ] ] ; then
echo -ne ".имя файла потеряно. используется сгенерированное скриптом.."
mv login.php " $(( $THREAD / 100 )) " /$THREAD .torrent
2012-04-03 23:10:15 +04:00
# 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 "Пишем информацию в лог-файл.."
2012-04-05 00:20:11 +04:00
echo " Топик $THREAD : ошибка скачивания $TOPICHDR [https://nnm-club.ru/forum/ $TOPICLNK ] " >> $CURDIR /$UNIXTIME -error.log
2012-04-03 23:10:15 +04:00
rm " $(( $THREAD / 100 )) " /$THREAD .torrent
fi
2012-04-03 21:18:05 +04:00
fi
2012-04-05 00:20:11 +04:00
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
2012-04-02 23:07:16 +04:00
echo -ne ".\n"
popd >> /dev/null
done < $TMPDIR /alllinkz.txt
2012-04-07 17:42:32 +04:00
# Downloading subforums
if [ [ " x $SUBFORUMSDL " = = "x1" ] ] ; then
$TMPDIR /$UNIXTIME -subforumsdl.sh
fi
2012-04-02 23:07:16 +04:00
# Cleaning up...
rm -r $TMPDIR