Дописал скрипт
#Загрузка обновлённых торрентов с rutracker.org
#python 3.2
#обозначаем переменные и пр.
import http.cookiejar, urllib.request, urllib.parse
torrent_link = 'http://dl.rutracker.org/forum/dl.php?t='
thread_link = 'http://rutracker.org/forum/viewtopic.php?t='
tmp_dir = 'tmp\\'
true_dir = 'torr\\'
db_file = 'db'
rls_file = "releases.txt"
list_id = [] # сюда читаем id раздач из файла .txt
load = [] # (id, размер), прочитанные из загруженных файлов
read = [] # (id, размер), прочитанные из файла бд
#load_updated = [] # (id, размер), прочитанные из загруженных файлов и отличающиеся от прочитанных из бд
#
def log_write(log_message):
"""Пишем лог"""
from datetime import datetime
log_time = datetime.now()
text_file = open("rutracker_downloader.log", "a")
write_message = str(log_time) + " " + str(log_message) + "\n"
text_file.write(write_message)
text_file.close()
def cp_file(torrent_id):
'''копируем обновлённый .торрент'''
import shutil
shutil.copyfile(tmp_dir + '\\' + torrent_id + '.torrent', true_dir + '\\' + torrent_id + '.torrent')
print('обновлённый файл', torrent_id + '.torrent скопирован в постоянную директорию')
def check_file_size(file_check):
'''измеряем размер файла'''
import os
size_of_file = os.path.getsize(file_check)
return size_of_file
def releases_read():
'''читаем файл с ссылками на треды'''
releases_file = open(rls_file, "r")
for releases_text_line in releases_file: #перебираем строки файла
strip_url = releases_text_line.strip('http://rutracker.org/forum/viewtopic.php?t=\n') #вычленяем id раздачи
list_id.append(strip_url) #пишем id раздач в кортеж
releases_file.close() #закрываем файл
return list_id
def db_read():
'''читаем файл бд'''
import shelve, pickle
try:
db = shelve.open(db_file, 'r')
count = 0
read = []
list_db = list(db)
while count < len(db):
value = list_db[count]
read.append((value, db[value][1]))
count += 1
return read
except:
read = []
return read
def db_write(torrent_id, torrent_size):
'''обновляем файл бд'''
import shelve, pickle
db = shelve.open(db_file)
tmp_list = ['описание', torrent_size]
db[torrent_id] = tmp_list
db.close()
def db_remove(torrent_id):
'''удаляем из бд отсутствующие в releases.txt раздачи'''
'''обновляем файл бд'''
import shelve, pickle
db = shelve.open(db_file)
del(db[torrent_id])
print('db', torrent_id, 'удалён')
db.close()
read = db_read()
releases_read()
#авторизируемся на рутрекере
LOGIN = ' '
PASS = ' '
# генерация cookies
post_argument = urllib.parse.urlencode({
'login_username' : LOGIN,
'login_password' : PASS,
'login' : '%C2%F5%EE%E4'
})
###post_argument = post_argument.encode('utf8')
post_argument = str.encode(post_argument)
# обработка cookies
cookie = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
# прикидываемся браузером, не обязательно
opener.addheaders = [('User-agent', 'Opera/9.80 (Windows NT 6.1; WOW64; U; ru) Presto/2.10.229 Version/11.62')]
# коннект
urllib.request.install_opener(opener)
# авторизация и подсовывание cookies
tracker = opener.open('http://login.rutracker.org/forum/login.php', post_argument)
###data = tracker.read()
###print("Подсовываемый линк к рутрекеру:", post_argument)
#качаем все .торренты
count = 0
while count < len(list_id):
torrent = opener.open(torrent_link + list_id[count], post_argument) #генерация линка на .торрент
#т.к. рутрекер не отдаёт .торренты по директ линкам, говорим, что пришли с треда
torrent.addheaders = [('Referer', thread_link + list_id[count])]
data = torrent.read()
#путь до файла + его имя
f = open(tmp_dir + list_id[count] + '.torrent', 'wb')
f.write(data)
f.close()
file_check = check_file_size(tmp_dir + list_id[count] + '.torrent')#передаём функции измерения размера файла текущий файл
load.append((list_id[count], file_check)) #записываем размеры в кортеж
print('Файл ' + list_id[count] + '.torrent размером', file_check, 'загружен')
count += 1
print(len(load))
print(len(read))
#проверяем удаление ссылок из releases.txt
if len(load) < len(read):
count = 0
while count < len(read):
if read[count] not in load:
print(read[count])
db_remove(read[count][0])
count += 1
#копирование обновлённых .torrent
elif read == []:
count = 0
while count < len(load):
print('#если файл бд не открылся, то все .torrent считаются новыми')
cp_file(load[count][0])
db_write(load[count][0], load[count][1])
count += 1
#предыдущие условия не выполнились, тогда сравним кортежи
else:
count = 0
while count < len(load):
if load[count] not in read:
print('этот обновился, качаем', load[count][0]+'.torrent')
cp_file(load[count][0])
db_write(load[count][0], load[count][1])
count += 1
Для работы скрипт нужно немного подредактировать:
Строка 9 tmp_dir = ‘tmp\\’ Вместо tmp можно указать путь до временной директории
Строка 10 true_dir = ‘torr\\’ Вместо torr можно указать путь до директории, которую загрузчик торрентов будет проверять на наличие новых файлов
Строка 12 rls_file = “releases.txt” Вместо releases.txt можно указать название файла с ссылками на раздачи. Файл должен находиться в папке со скриптом.
Строка 87 LOGIN = ‘ваш_логин’ Внутри кавычек написать свой логин от рутрекера
Строка 88 PASS = ‘ваш_пароль’ Внутри кавычек написать свой пароль от рутрекера
Создать директории tmp_dir и true_dir. Проверял на относительных ссылках, думаю, на абсолютных тоже заработает.
Создать файлик rls_file, заполнить его построчно ссылками на раздачи
В линуксах бэкслеши нужно заменить на слеши (\ на /): в строках 9, 10, 32
Требования: python 3 (проверен в python 3.2.2 и 3.2.3 в окошках и 3.1 в debian 6)
В коде есть самописный логгер (функция log_write; правда в стандартной библиотеке пайтона есть свой логгер), он не включён (т.е. вызовы убрал, но пока тестировал скрипт - работал ) + много сообщений выдаётся в консоль.
Буду рад критике кода

Скачать можно
здесь