Pull to refresh

Автоматическая проверка новых серий на rutracker.org

Приветствую уважаемое Хабрасообщество!

Несколько дней назад у меня возникло желание автоматизировать получение моих любимых сериалов. Таким образом задача была ясна.

Материальная база уже имелась.
1) Домашний компьютер с debian 6.0 консольный.
2) Установленный на нем Transmission.
3)Желание.


После некоторого поиска был выбран нужный скрипт и работа пошла.

Устанавливаем transmission, следующей командой:

sudo apt-get install transmission-daemon

После установки переходим к его настройке. Для начала остановим демон, это нужно чтобы корректно внести настройки.

/etc/init.d/transmission-daemon stop

После остановки переходим к конфиг файлу

nano /etc/transmission-daemon/settings.json

В этом файле содержаться различные параметры. Более подробно вы можете найти в google.com. Однако нас интересуют только определенные.

«download-dir»: "/home/ftp", — куда будут качаться файлы.
«rpc-username»: «admin», — устанавливаем логин к веб интерфейсу
«rpc-password»: «admin», — устанавливаем пароль к веб интерфейсу
«rpc-whitelist»: «127.0.0.1», — устанавливаем диапазон ip, которые будут иметь доступ.
«rpc-whitelist-enabled»: false, — отключаем предыдущий пункт, по желанию.

Так же в конце файла допишем две строки. Эти строки необходимы для автоматической проверки папки на наличие торрент файла.
Обратите внимание что последняя строка конфига перед знаком “}” запятая не должна стоять, во всех остальных случая обязательно ставте запятую.

«watch-dir»: "/home/ftp",
«watch-dir-enabled»: true


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

nano /etc/init.d/transmission-daemon

В этом файле меняем параметр запуска демона, debian-transmission меняем на root.

User=debian-transmission

И в конце запускаем запускаем демон

/etc/init.d/transmission-daemon start

Для более автоматизированной работы с rutracker.org сделаем следующие действия. Создами файл rutracker.org

nano /home/rutracker.org

И записываем в него следующий конфиг, немного подправив его под себя, введя свой логин пароль и папку для сохранения.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# created by x0x01 (aka.x0x01[AT]gmail[dot]com)

import urllib, urllib2, cookielib
from string import strip

LOGIN = 'Ваш логин'
PASS = 'Ваш пароль'
# путь для сохранения torrent файла
OUT_DIR = '/home/ftp/'
#OUT_DIR = '/tmp/gettor/'

# формирование кук
post_params = urllib.urlencode({
'login_username' : LOGIN,
'login_password' : PASS,
'login' : '%C2%F5%EE%E4'
})

# инит обработчика кук
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
urllib2.install_opener(opener)

# авторизация + сессия с куками
web_obj = opener.open('http://login.rutracker.org/forum/login.php', post_params)
data = web_obj.read()

try:
# читаем файл со ссылками, формируем список
fl_url_list = open('urls.lst', 'r')
url_arr = fl_url_list.readlines()
fl_url_list.close()
# чтение файла "размеров", формируем список
fl_dta_list = open('last.lst', 'r')
dta_arr = fl_dta_list.readlines()
fl_dta_list.close()
except IOError:
print 'err'
dta_arr = []

# открытие на запись для новых "размеров" в last.lst
fl_dta_list = open('last.lst', 'w')

# из списка "размеров" формируем словарь ID:SIZE
dta_dic = {}
for curr in dta_arr:
# отрезаем переносы строк
curr = strip(curr)
# делим строку по пробелу и создаем словарь
dta_dic[str.split(curr)[0]] = str.split(curr)[1]

# сохранение torrent файла
def dw_torrent_f(b_data, f_name):
f = open(OUT_DIR+f_name+'.torrent', 'w')
f.write(b_data)
f.close()

# обработка ссылок
for thread_url in url_arr:
# отрезаем переносы строк
thread_url = strip(thread_url)
# делим ссылку на 2 части (получение id форума)
topic_id = str.split(thread_url,'=')[1]
dl_torrent_url = 'http://dl.rutracker.org/forum/dl.php?t='+topic_id
# получение torrent файла по ссылке
web_obj = opener.open(dl_torrent_url, post_params)
data = web_obj.read()
# сравнение размеров полученного файла и в last.lst
try:
if len(data) <> int(dta_dic[topic_id]):
# этот обновился, сохраняем
print '[^]', thread_url
dw_torrent_f(data, topic_id)
except (IndexError, KeyError):
# этот новый, сохраняем
print '[+]', thread_url
dw_torrent_f(data, topic_id)
#print 'UPD:', dl_torrent_url, 'new:', len(data), 'old:', m_dic[topic_id]
# пишем в last.lst новые значения id и размер
fl_dta_list.write(str(topic_id)+' '+str(len(data))+'\n')

# закрытие файла
fl_dta_list.close()


Чтобы наш конфиг смог быть выполнен пишем следующую строчку

Chmod +x rutraker.org

Для выполнения скрипта нам понадобиться Python. Установим Python следующей командой

аpt-get-install python

Затем создаем файл urls.lts, в этот файл мы будем писать полностью ссылки на те топики которые нас интересуют.

nano /home/urls.lst

И вписываем к примеру

rutracker.org/forum/viewtopic.php?t=3175410

Сохраняем и создаем файл, который будет хранить инфо о последнем изменении торрент файла на сервере.

nano /home/last.lst

Записываем к примеру цифру один и сохраняем и всё. Теперь скрипт будет качать файлы пофакту выполнения, однако каждый раз запускать скрипт есть не кошерно.
Исправить эту ситуацию нам поможет cron и его магический файл crontab. Открываем файл Crontab

nano /etc/crontab

И видим приблизительно такой текст
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#


Дальше добавляем следующую строку в файл перед последним знаком “#”, то есть приводим файл в такой вид

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* */2 * * * root /root/rutracker.org
#
Теперь более подробно о тех звездочках, что мы наблюдаем.
* * * * *
— — — — — | | | | |
| | | | — День недели (0 — 7) (Воскресенье =0 или =7)
| | | — Месяц (1 — 12)
| | — День (1 — 31)
| — Час (0 — 23)
— Минута (0 — 59)

Таким образом мы видим, что если вместо первой звездочки мы поставим 0-59, то это будет значить что каждую минуту будет выполняться наш скрипт.
А если напиши */5, то в таком случае скрипт будет выполняться каждые 5 минут.
Более оптимальным временем выполнения скрипта было бы каждые 2 или 4 часа, для этого просто заменим вторую звездочку на */2 или */4
В первом варианте строка примет вид

* */2 * * * root /root/rutracker.org

Во втором

* */4 * * * root /root/rutracker.org
Минимальный интервал проверки стоит ставить порядка 30 минут. Причина тому кукис.
После звездочек идет запись “root” это указатель пользователя от которого будет запускаться наш скрипт.
Собственно после всех манипуляций мы сохраняем файл и перезапускам cron

/etc/init.d/cron restart

Всё. Может откинуться на спинку кресла и насладиться новой серией любимого сериала.

Источники.
Скрипт для проверки
Cron (wiki)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.