x0x01 25.03.2011 16:59

СкриптыКачаем обновленные торренты c rutracker.org

Как известно, многие раздачи ведутся путем добавления новых файлов к уже существующим, у rutracker.org нет прямого RSS на обновленный torrent файл.
Данный скрипт исправляет этот недостаток. Обходя ссылки из файла urls.lst, проверяет изменились ли размеры torrent файлов, в случае изменений - сохраняет обновленный и запоминает размер в last.lst

Не забудьте перед запуском создать urls.lst и пустой last.lst в каталоге со скриптом.

Собственно код:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
# created by x0x01 (aka.x0x01[AT]gmail[dot]com)

import urllib, urllib2, cookielib
from string import strip

LOGIN = 'username'
PASS = 'password'
# путь для сохранения torrent файла
OUT_DIR = './'
#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()



кусочек моего urls.lst
1
2
3
http://rutracker.org/forum/viewtopic.php?t=3414220
http://rutracker.org/forum/viewtopic.php?t=3216842
http://rutracker.org/forum/viewtopic.php?t=3157454




Тэги: python rutracker torrents
+ 0 -
Похожие Поделиться

IT.Tux.Droid 25.03.2011 18:50 #
Извините за такой глупый вопрос, но зачем нужен блок "try-exept" с вложенным "if"? Разве просто "if-else" не хватит? ;)
if len(data) != int(dta_dic):
print '<^>', thread_url
dw_torrent_f(data, topic_id)
else:
print '<+>', thread_url
dw_torrent_f(data, topic_id)

И еще немного:
# лично я бы заменил это:
topic_id = str.split(thread_url,'=')<1>

# на это:
topic_id = thread_url.split('=')<1>

# имхо, наглядней =)

PS: Очень уж сложно уследить за переменными. Как-то они одна на другую похожи, что-ли =\
x0x01 25.03.2011 21:33 #
за второй кусок - спасибо, try вообще-то "IndexError: list index out of range" обрабатывает, когда добавляется новый url и/или размера torrent еще нет в last.lst
IT.Tux.Droid 25.03.2011 22:13 #
try вообще-то "IndexError: list index out of range" обрабатывает

А если так:
if topic_id in dta_dic.keys():
if len(data) != int(dta_dic):
print '<^>', thread_url
dw_torrent_f(data, topic_id)
else:
print '<+>', thread_url
dw_torrent_f(data, topic_id)

PS: Все-таки названия ваших переменных и функций выкалывают вилкой мне глаза =(
x0x01 25.03.2011 22:25 #
а можно просто завернуть в обработчик ;)
ragesteel 25.03.2011 20:34 #
Скрипт может и полезный, но требует периодического обслуживание в виде добавления новых ссылок в urls.lst.

На мой взгляд, идельный скрипт должен делать следующие вещи:
  • подключаться к Transmission и забираться торренты со статусом «не зарегистрирован»

  • получать из торрентов ссылки на страницы форума

  • скачивать обновлённые торрент-файлы

  • добавлять новые торренты, а старые удалять (с сохранением статусов содержимого торрентов)



Было бы у меня сериалов по-больше — сам бы написал ;)
x0x01 25.03.2011 22:30 #
статусы сохранить не удастся насколько мне известно, у самого есть такая хотелка по поводу трансмишн, все упирается в разношерстную авторизацию. На лосте одна, на нове другая, на пирате 3...
ragesteel 25.03.2011 23:10 #
Статусы я имел ввиду приоритеты отдельных файлов + флаг качать/не качать внутри одного торрента. Я просто для просмотренных файлов ставлю флаг «не качать» и всегда знаю на какой серии остановился.
x0x01 26.03.2011 08:20 #
у меня XBMC просто помечает галочкой просмотренные файлы ;)
retano 06.05.2011 11:12 #
скрипт не работает с к сожалению, пишет ошибку синтаксиса в 48 строчке:
dta_dic<0>> = str.split(curr)<1>

что там не так подскажите (в питоне не шарю)?
retano 06.05.2011 12:23 #
поправка, вот эта строка:
dta_dic<0>> = str.split(curr)<1>
x0x01 10.05.2011 09:31 #
похоже "что-то" сильно поломало код ;) тут рабочий код
kstep 01.10.2012 21:37 #
Unknown Paste ID!
kstep 01.10.2012 21:38 #
Я давно уже отчаялся размещать тут более-менее сложный код, ибо парсер здесь жутко кривой и всё портит. Сам предпочитаю github и gist.
evol 01.10.2011 13:04 #
Traceback (most recent call last):
File "rutrack.py", line 69, in
data = web_obj.read()
File "/usr/lib/python2.6/socket.py", line 348, in read
data = self._sock.recv(rbufsize)
File "/usr/lib/python2.6/httplib.py", line 522, in read
return self._read_chunked(amt)
File "/usr/lib/python2.6/httplib.py", line 580, in _read_chunked
value.append(self._safe_read(chunk_left))
File "/usr/lib/python2.6/httplib.py", line 619, in _safe_read
chunk = self.fp.read(min(amt, MAXAMOUNT))
File "/usr/lib/python2.6/socket.py", line 377, in read
data = self._sock.recv(left)
socket.error: [Errno 104] Connection reset by peer

куда капать?
x0x01 03.10.2011 19:50 #
что то с интернетами/сетью, не похоже на ошибку скрипта
Dark_SS 01.10.2012 21:15 #
Глас из чата:
[20:08:06] Кот Шрёдингера: Тут http://welinux.ru/post/5344/ строку #57
f = open(OUT_DIR+f_name+'.torrent', 'w')
лучше заменить на
f = open(OUT_DIR+f_name+'.torrent', 'wb')

иначе utorrent считает торрент-файл невалидным
[20:14:19] DarknеSS: Кот Шрёдингера, Дык откомменти ;)
[20:14:37] Кот Шрёдингера: не зарегистрирован