Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: BASH скрипт с парсером для RSS-ленты торрент трекера  (Прочитано 4488 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
День добрый.

По небольшим гайдам с хабра (раз и два) решил попробовать сделать свой простенький парсер для RSS ленты трекера tr.anidub.com. Получилось нечто подобное:


for i in $(curl -s http://tr.anidub.com/rss.xml | grep -iA 2 'Unhappy' | grep -i 'isPermaLink' | grep -ioe 'http.*.html'); do
  tor_file=$(curl -sb "dle_user_id=***; dle_password=***" $i | grep -iA 2 tv720 | grep -ie 'Скачать торрент' | grep --max-count 1 -ioE '/engine/download\.php\?id=[0-9]{1,5}| tail -n 1)
  tor_name=$(curl -sb "dle_user_id=***; dle_password=***" $i | grep -ie 'Имя файла' | grep -i '720' | grep -ioE 'title=\"[AniDub].*.torrent\"' | recode html..ascii | grep -ioe '\[.*.torrent')
done

wget -nc http://tr.anidub.com${tor_file} -O ~/torrents/${tor_name} --load-cookies=/root/cookies.txt

На выходе перед wget'ом получаю ссылку аналогичную той, что я вижу на странице со скачкой торрента и имя самого торрент файла. Вот только сам wget, даже с подключёнными кукисами, упорно ловит 302 редирект и скачивает заглавную страницу самого трекера.

Это я что-то забыл учесть или оно в принципе невозможно?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Для wget может тоже надо логин/пасс? И если пользовались curl чего переключаться на wget?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
BAKT, почему, скрытых выполнить, не нужео echo "test" ?
Wars ~.o

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Для wget может тоже надо логин/пасс? И если пользовались curl чего переключаться на wget?

Для wget у меня идёт подключение файла с кукисами.
curl тоже пробовал. Даже пробовал без переменных просто подставлять сразу ссылку. Однако с ним вообще выдаёт вот такой ответ:

# curl -sb "dle_user_id=***; dle_password=***; PHPSESSID=***" http://tr.anidub.com/engine/download.php?id=15984
Access denied!!!<br /><br />Please visit <a href="http://tr.anidub.com/">http://tr.anidub.com/</a>

BAKT, почему, скрытых выполнить, не нужео echo "test" ?

Что, простите?

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
BAKT,
Цитировать
  tor_file=$(curl -sb "dle_user_id=***; dle_password=***" $i | grep -iA 2 tv720 | grep -ie 'Скачать торрент' | grep --max-count 1 -ioE '/engine/download\.php\?id=[0-9]{1,5}| tail -n 1)
  tor_name=$(curl -sb "dle_user_id=***; dle_password=***" $i | grep -ie 'Имя файла' | grep -i '720' | grep -ioE 'title=\"[AniDub].*.torrent\"' | recode html..ascii | grep -ioe '\[.*.torrent')

эту не нужно, на echo "= $i ="
чтобы вывод строки будет понятно.
Wars ~.o

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
эту не нужно, на echo "= $i ="
чтобы вывод строки будет понятно.

Нихрена не понимаю, вы хотите, чтобы я вам дал свои кукисы?

dle_user_id=477289; dle_password=d0e5b499e551a4a873ed9751f085ae82; PHPSESSID=apb2tuctt77qnc052fk0ifrb31

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
BAKT,
1:L~$ sudo touch /root/cookies.txt
[sudo] password for victor00000:
1:L~$ ls /root/cookies.txt
ls: невозможно получить доступ к /root/cookies.txt: Отказано в доступе
1:L~$

что мне надо sudo ls /root/cookies.txt ?
Wars ~.o

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Код: (bash) [Выделить]
#!/bin/bash

IFS=$'\n'

for i in $(curl -s http://tr.anidub.com/rss.xml \
           | grep -iA 2 'Unhappy' \
           | grep -i 'isPermaLink' \
           | grep -ioe 'http.*.html')
do

tor_file="$(curl -sb "dle_user_id=***; dle_password=***" "$i" \
            | grep -iA 2 tv720 \
            | grep -ie 'Скачать торрент' \
            | grep --max-count 1 -ioE '/engine/download\.php\?id=[0-9]{1,5}' \
            | tail -n 1)"

tor_name="$(curl -sb "dle_user_id=***; dle_password=***" "$i" \
            | grep -ie 'Имя файла' \
            | grep -i '720' \
            | grep -ioE 'title=\"[AniDub].*.torrent\"' \
            | recode html..ascii \
            | grep -ioe '\[.*.torrent')"

echo "$i" >> 1.txt
echo "$tor_file" >> 1.txt
echo "$tor_name" >> 1.txt
echo >> 1.txt

done

и посмотрите что в 1.txt

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: (bash) [Выделить]
| grep -iA 2 'Unhappy' | grep -i 'isPermaLink' | grep -ioe 'http.*.html'==
Код: (bash) [Выделить]
| sed '/\n/P;/Unhappy/I,+2{/isPermaLink/Is/http:.*html/\n&\n/i};D'и т.д.
Код: (bash) [Выделить]
{
read tor_file
read tor_name
} <(
curl -sb "dle_user_id=***; dle_password=***" "$i" |
sed … #2 линии
)
1 раз надо вызывать curl
« Последнее редактирование: 11 Июля 2016, 14:01:54 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
BAKT,
Если после логина на сайте взять свежие id и ps, вставить и выполнить:
curl -b "dle_user_id=***; dle_password=***" "http://tr.anidub.com/engine/download.php?id=15984" > 1.torrentкачается?

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
что мне надо sudo ls /root/cookies.txt ?

# cat ~/cookies.txt
.tr.anidub.com TRUE / FALSE 1494880583 dle_user_id 477289
.tr.anidub.com TRUE / FALSE 1494880583 dle_password d0e5b499e551a4a873ed9751f085ae82
.tr.anidub.com TRUE / FALSE 0 PHPSESSID apb2tuctt77qnc052fk0ifrb31
.tr.anidub.com TRUE / FALSE 1499694984 dle_newpm 0

и посмотрите что в 1.txt

#!/bin/bash

IFS=$'\n'

for i in $(curl -s http://tr.anidub.com/rss.xml \
           | grep -iA 2 'Unhappy' \
           | grep -i 'isPermaLink' \
           | grep -ioe 'http.*.html')
do

        tor_file="$(curl -sb "dle_user_id=477289; dle_password=d0e5b499e551a4a873ed9751f085ae82" "$i" \
                    | grep -iA 2 tv720 \
                    | grep -ie 'Скачать торрент' \
                    | grep --max-count 1 -ioE '/engine/download\.php\?id=[0-9]{1,5}' \
                    | tail -n 1)"

        tor_name="$(curl -sb "dle_user_id=477289; dle_password=d0e5b499e551a4a873ed9751f085ae82" "$i" \
                    | grep -ie 'Имя файла' \
                    | grep -i '720' \
                    | grep -ioE 'title=\"[AniDub].*.torrent\"' \
                    | recode html..ascii \
                    | grep -ioe '\[.*.torrent')"

        echo "$i" >> 1.txt
        echo "$tor_file" >> 1.txt
        echo "$tor_name" >> 1.txt
        echo >> 1.txt

done


Эм... Ну там тот же линк на страницу с раздачей и тот же линк на скачку файла, что и в моём скрипте. А что я должен был там увидеть?

1 раз надо вызывать curl

Спасибо за совет. Учту.

качается?

Нет. По прежнему выдаёт:

cat ~/1.torrent
Access denied!!!<br /><br />Please visit <a href="http://tr.anidub.com/">http://tr.anidub.com/</a>

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Цитировать
Нет. По прежнему выдаёт:
Так вот эту команду и нужно было пилить до успеха, а потом уже скрипт.
Что нехватает не знаю. может юзер агент, или еще что.

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Так вот эту команду и нужно было пилить до успеха, а потом уже скрипт.
Что нехватает не знаю. может юзер агент, или еще что.

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
BAKT,
Какой агент, реферал, wget/curl? покажи вобщем рабочий вариант.

Оффлайн BAKT

  • Автор темы
  • Участник
  • *
  • Сообщений: 112
    • Просмотр профиля
Ну в общем получилось у меня что-то подобное.
Названия сериалов берутся из текстовика, который лежит рядом с самим скриптом. Если нужно где-то указывать куки и т.д., то они прописываются в переменных - так их проще будет потом менять.
Пока написал три штуки, под три разных трекера. Из скриптов, думаю, будет понятно что для чего :)


#!/bin/bash

tor_list=/root/parsers/anidub.txt
cook_uid="dle_user_id=***"
cook_pwd="dle_password=***"

echo "anidub -- $(date)" >> /root/parsers/lastrun.log

lastline=`tail -c 1 ${tor_list}`
  if [ "$lastline" != "" ]; then
    echo ""  >> ${tor_list}
  fi

if [ -s ${tor_list} ]; then
  cat ${tor_list} | while IFS= read -r line
    do
      curl -s http://tr.anidub.com/rss.xml | grep -iA 2 "title" | grep -iA 2 "${line}" > /dev/null 2>&1
        if [ $? -eq "0" ]; then
          page_link=$(curl -s http://tr.anidub.com/rss.xml \
                        | grep -iA 2 "title" \
                        | grep -iA 2 "${line}" \
                        | grep "link" \
                        | grep -io "http.*.html")

          tor_link=$(curl -sb "${cook_uid}; ${cook_pwd}" ${page_link} \
                        | grep -iA 2 tv720 \
                        | grep -ie 'Скачать торрент' \
                        | grep --max-count 1 -ioE '/engine/download\.php\?id=[0-9]{1,5}' \
                        | tail -n 1)

          tor_name=$(curl -sb "${cook_uid}; ${cook_pwd}" ${page_link} \
                        | grep -ie 'Имя файла' \
                        | grep -i '720' \
                        | grep -ioE 'title=\"&#091;AniDub&#093;.*.torrent\"' \
                        | sed 's/&#091;/\[/g' \
                        | sed 's/&#093;/\]/g' \
                        | grep -ioe '\[.*.torrent')

          if [ ! -e /root/parsers/torrent/anime/${tor_name}.added ]; then
            curl -s --cookie "${cook_uid}; ${cook_pwd}" \
            --referer ${page_link} \
            --user-agent "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" \
            --output /root/parsers/torrent/anime/${tor_name} \
            http://tr.anidub.com${tor_link}
          fi
        fi
    done
fi


#!/bin/bash

tor_list=/root/parsers/anifilm.txt

echo "anifilm -- $(date)" >> /root/parsers/lastrun.log

lastline=`tail -c 1 ${tor_list}`
  if [ "$lastline" != "" ]; then
    echo ""  >> ${tor_list}
  fi


if [ -s ${tor_list} ]; then
  cat ${tor_list} | sed -e 's/ /-/g' | while IFS= read -r line
    do
      curl -s http://anifilm.tv/rss.xml | grep -iE "${line}" > /dev/null 2>&1
        if [ $? -eq "0" ]; then

          page_link=$(curl -s http://anifilm.tv/rss.xml \
                        | grep -ioE "http:\/\/anifilm.tv\/releases\/(a-z|\w|-)*" \
                        | uniq \
                        | grep -iE "${line}")

          tor_link=$(curl -s ${page_link} \
                        | grep -iA 20 "Список торрентов" \
                        | grep -iA 3 "720" \
                        | grep -ioE "\/releases/download-torrent/[0-9]{1,4}")

          tor_name=$(curl -s ${page_link} \
                        | grep -m 1 "Аниме" \
                        | grep -ioE "Аниме [a-zA-Z].* \/ " \
                        | cut -c 12- \
                        | sed 's/Аниме //g' \
                        | sed 's/ \/ //g' \
                        | sed -e 's/ /_/g')

          tor_num=$(curl -s ${page_link} \
                        | grep -m 1 "Аниме" \
                        | grep -ioE "[0-9]{1,3}\-[0-9]{1,3}")

          tor_from=$(curl -s ${page_link} \
                        | grep -m 1 "Аниме" \
                        | grep -ioE "из [0-9]{1,3}" \
                        | cut -c 6-)

          full_name=${tor_name}_${tor_num}_from_${tor_from}.torrent

          wget -nc http://anifilm.tv${tor_link} -O /root/parsers/torrent/${full_name}
        fi
      done


#!/bin/bash

tor_list=/root/parsers/newstudio.txt

echo "newstudio -- $(date)" >> /root/parsers/lastrun.log

lastline=`tail -c 1 ${tor_list}`
  if [ "$lastline" != "" ]; then
    echo ""  >> ${tor_list}
  fi

if [ -s ${tor_list} ]; then
  cat ${tor_list} | while IFS= read -r line
    do
    curl -s http://newstudio.tv/rss.php | grep -A 1 "title" | grep -iA 1 "WEBDLRip" | grep -iA 1 "${line}" > /dev/null 2>&1
      if [ $? -eq "0" ]; then
        curl -s http://newstudio.tv/rss.php | grep -A 1 "title" | grep -iA 1 "WEBDLRip" | grep -iA 1 "${line}" | grep -ioE "http://.*[0-9]{1,5}" > /root/parsers/newstudio.tmp
          for plink in $(cat /root/parsers/newstudio.tmp); do
            tor_link=$(curl -s ${plink} | grep -ioE "download.php.*[0-9]{1,5}")
            full_name=$(curl -s ${plink} | grep -ioE "[a-zA-Z].*\.torrent" | sed 's/&amp;/\&/g')

              if [ ! -e /root/parsers/torrent/${full_name}.added ]; then
                wget -q http://newstudio.tv/${tor_link} -O /root/parsers/torrent/${full_name}
                sleep 5
              fi
          done
      fi
    done
  rm /root/parsers/newstudio.tmp > /dev/null 2>&1
fi

Линухом занимаюсь не так давно, так что в скриптах, вероятно, есть много костылей. :)
Тем не менее данный вариант вполне себе рабочий. Критится у меня на VDS, а потом через lftp заливается\синхронизируется с конкретной папкой на моём компе, откуда это уже и подбирает торрент.

Будут вопросы - спрашивай.

 

Страница сгенерирована за 0.043 секунд. Запросов: 25.