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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

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

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

Оффлайн BAKT

  • Автор темы
  • Любитель
  • *
  • Сообщений: 96
    • Просмотр профиля
День добрый.

По небольшим гайдам с хабра (раз и два) решил попробовать сделать свой простенький парсер для 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

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

Оффлайн victor00000

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

Оффлайн BAKT

  • Автор темы
  • Любитель
  • *
  • Сообщений: 96
    • Просмотр профиля
Для 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

  • Старожил
  • *
  • Сообщений: 14922
  • Я не слышу.
    • Просмотр профиля
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 ="
чтобы вывод строки будет понятно.
~.o

Оффлайн BAKT

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

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

dle_user_id=477289; dle_password=d0e5b499e551a4a873ed9751f085ae82; PHPSESSID=apb2tuctt77qnc052fk0ifrb31

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 14922
  • Я не слышу.
    • Просмотр профиля
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 ?
~.o

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Код: Bash
  1. #!/bin/bash
  2.  
  3. IFS=$'\n'
  4.  
  5. for i in $(curl -s http://tr.anidub.com/rss.xml \
  6.            | grep -iA 2 'Unhappy' \
  7.            | grep -i 'isPermaLink' \
  8.            | grep -ioe 'http.*.html')
  9. do
  10.  
  11.         tor_file="$(curl -sb "dle_user_id=***; dle_password=***" "$i" \
  12.                     | grep -iA 2 tv720 \
  13.                     | grep -ie 'Скачать торрент' \
  14.                     | grep --max-count 1 -ioE '/engine/download\.php\?id=[0-9]{1,5}' \
  15.                     | tail -n 1)"
  16.  
  17.         tor_name="$(curl -sb "dle_user_id=***; dle_password=***" "$i" \
  18.                     | grep -ie 'Имя файла' \
  19.                     | grep -i '720' \
  20.                     | grep -ioE 'title=\"&#91;AniDub&#93;.*.torrent\"' \
  21.                     | recode html..ascii \
  22.                     | grep -ioe '\[.*.torrent')"
  23.  
  24.         echo "$i" >> 1.txt
  25.         echo "$tor_file" >> 1.txt
  26.         echo "$tor_name" >> 1.txt
  27.         echo >> 1.txt
  28.  
  29. done
  30.  
  31.  
и посмотрите что в 1.txt

Оффлайн Azure

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

Оффлайн ReNzRv

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

Оффлайн BAKT

  • Автор темы
  • Любитель
  • *
  • Сообщений: 96
    • Просмотр профиля
что мне надо 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

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

Оффлайн BAKT

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

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

Оффлайн ReNzRv

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

Оффлайн BAKT

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


#!/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.099 секунд. Запросов: 25.