198 lines
8.7 KiB
Bash
Executable File
198 lines
8.7 KiB
Bash
Executable File
#!/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
|
||
|
||
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.me/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.51"
|
||
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 "download.php" -B 2 | grep topictitle | sed 's/.*<a href=\([^>]*\).*/\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 'download.php' -B 2 | 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
|
||
|
||
# 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 "$FORUM-$FORUMNAME"
|
||
while read line
|
||
do
|
||
pushd "$FORUM-${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/.*<a href=\([^>]*\).*/\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
|