Войти

Показать полную графическую версию : [решено] Патчер торрентов (AutoIt некорректно вносит изменения в торрент файлы)


vkupriyanov
17-04-2010, 10:46
Необходимо внести изменения в торрент файл (добавить ретрекер). Для начала пробую с помощью AutoIt (3.3.6.0) открыть файл и без изменений скопировать содержимое в новый файл.
$file = FileOpen("E:\tor.torrent")
dim $line[200]
dim $nl
While 1
$line[$nl] = FileReadLine($file)
If @error = -1 Then ExitLoop
$nl=$nl+1
Wend
FileClose($file)

$file = FileOpen("E:\tor.torrent", 2)
for $a=0 to $nl-1
FileWriteLine($file, $line[$a])
next
FileClose($file)
В результате торрент-файл неидентичен исходному (uTorrent выдает ошибку). AutoIt в конце каждой строки добавляет символ в шестнадцатеричном виде обозначенный OA. Подскажите как решить эту проблему не обращаюсь к бинарному режиму.

Библиотечные функции теряют в процессе выполнения скрипта почти все содержимое торрент файла. Например
#Include <File.au3>
Dim $aRecords
_FileReadToArray("E:\tor.torrent",$aRecords)
_FileWriteFromArray("E:\tor2.torrent",$aRecords,1)
В результате в tor2.torrent записывается одна строчка исходного
Подскажите решение проблемы. Спасибо

kaster
17-04-2010, 11:14
торрент файл не текст. поэтому для него символ перевода каретки даже если и есть то только потому, что это какой-нибудь байт от другого блока данных.
другими словами, надо считывать файл в двоичном виде. записывать тоже.
$file = FileOpen("E:\tor.torrent", 16 + 0)
$iSize = FileGetSize("E:\tor.torrent")
$dim = Int($iSize/100) + 1
dim $line[$dim]
dim $nl
While 1
$line[$nl] = FileRead($file, 100)
If @error = -1 Then ExitLoop
$nl=$nl+1
Wend
FileClose($file)

$file = FileOpen("E:\tor.torrent", 16 + 2)
for $a=0 to $nl-1
FileWrite($file, $line[$a])
next
FileClose($file)

madmasles
17-04-2010, 12:09
vkupriyanov,
kaster,
А у меня так работает:$sFile = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & '\1.torrent'
$sFile_new = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & '\2.torrent'
$hRead = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile)
$hWrite = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile_new, 2)
$Buf = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($hRead)
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hWrite, $Buf)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hRead)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hWrite)
kaster,
А на Ваш код у меня SciTE ругается:(7) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$line[$nl] = FileRead($file, 100)
^ ERROR

kaster
17-04-2010, 12:25
А у меня так работает: »
что неудивительно. прочитать содержимое и переписать его снова. у автора проблемы изза ReadLine, т.к. при записи автоит сам добавляет после каждой строки CRLF, хотя изначально в исходном файле вполне мог бы оказаться CR или LF по отдельности.
А на Ваш код у меня SciTE ругается: »
да. это я недоглядел код автора, и внес туда только то, что касалось бинарного чтения/записи
вот так будет правильнее
$file = FileOpen("E:\tor.torrent", 16 + 0)
$iSize = FileGetSize("E:\tor.torrent")
$dim = Int($iSize/100) + 1
dim $line[$dim]
dim $nl = 0
While 1
$sline = FileRead($file, 100)
if @error = -1 then exitloop
$line[$nl] = $sline
$nl += 1
WEnd
FileClose($file)

$file = FileOpen("E:\tor.torrent", 16 + 2)
for $a=0 to $nl-1
FileWrite($file, $line[$a])
next
FileClose($file)

kaster
17-04-2010, 19:35
вот код добавляет трекер указанный в переменной $sNewTracker в общий список трекеров. если изначально в торрент-файле был всего один трекер то создает список трекеров из основного трекера и указанного трекера. если трекеров было изначально несколько то добавляет указанный в список последним
$sPath = "d:\tor1.torrent"
$hFile = FileOpen($sPath, 0)
$sLine = FileRead($hFile, 11); Read d8:announce
$sNewTracker = 'http://mynewtrack.tr/passkey'
$iTrackerSize = _SizeFinder($hFile)
$sLine &= $iTrackerSize & ':'
$sMainTracker = FileRead($hFile, $iTrackerSize)
$sLine &= $sMainTracker
$sDigit = Number(FileRead($hFile, 2))
If $sDigit = 10 Then
$sLine &= '13:announce-listll'
$sLine &= $iTrackerSize & ':'
$sLine &= $sMainTracker
$sLine &= 'el'
$sLine &= StringLen($sNewTracker) & ':'
$sLine &= $sNewTracker
$sLine &= 'ee' & $sDigit
$sLine &= FileRead($hFile)
ElseIf $sDigit = 13 Then
$sLine &= $sDigit
$sLine &= FileRead($hFile, 16)
$sLine &= FileRead($hFile, StringLen($iTrackerSize) + 1)
$sLine &= FileRead($hFile, $iTrackerSize)
While 1
$sID = FileRead($hFile, 2)
If $sID = 'ee' Then ExitLoop
$sLine &= $sID
$iSize = _SizeFinder($hFile)
$sLine &= $iSize & ':'
$sLine &= FileRead($hFile, $iSize)
WEnd
$sLine &= 'el'
$sLine &= StringLen($sNewTracker) & ':'
$sLine &= $sNewTracker
$sLine &= $sID
$sLine &= FileRead($hFile)
EndIf

ConsoleWrite($sLine & @CRLF)
FileWrite('d:\tor8.torrent', $sLine)

Func _SizeFinder(ByRef $hFile)
$sDigit = ''
While 1
$tmp = FileRead($hFile, 1); Read 1st digit for tracker name size
If $tmp = ':' Then ExitLoop
$sDigit &= $tmp
WEnd
Return Number($sDigit)
EndFunc

kaster
17-04-2010, 19:54
а чем не устроила функция добавления трекеров, которая присутствует во мгоих клиентах?

vkupriyanov
17-04-2010, 20:07
madmasles, Ваш код мне подошел.
kaster, спасибо, что указали на различие в деле добавления возврата каретки в случае использования FileWriteLine. В русскоязычной справке от Valery Ivanov (http://www.autoitscript.com/autoit3/docs.shtml) о FileWriteLine написано
Строка текста. Символы перехода на новую строку автоматически не добавляются.
Зачем вводят в заблуждение?!....
В оригинальной справке, идущей с версией 3.3.6.0:
The line of text to write to the text file. If the line does NOT end in @CR or @LF then a DOS linefeed (@CRLF) will be automatically added.
Сверяю справки постоянно, но этот момент упустил.

торрент файл не текст »
Торрент файл имеет текстовую область в формате UTF-8 (http://wiki.theory.org/BitTorrentSpecification#Metainfo_File_Structure)
The content of a metainfo file (the file ending in ".torrent") is a bencoded dictionary, containing the keys listed below. All character string values are UTF-8 encoded.
В ТоталКомандере можно просмотреть ее по F3 перейдя в кодировку utf-8. В эту область вношу изменения.

А трекер в изначальном торренте всего один? Или возможен случай что их несколько? »
Трекеров и ретрекеров несколько. Мне нужно добавить еще несколько в свой анонс-лист. Вот здесь (http://re-tracker.ru/index.php?showtopic=353) человек с ником Evolgr разжевывает кодирование торрент файла в части добавления трекеров.

Вот примерный код, которым вношу изменения торрент файл (помещаю новый анонс-лист со списком трекеров перед фразой "7:comment"
$hRead = FileOpen("E:\tor.torrent")
$hWrite = FileOpen("E:\tor2.torrent", 2)
$Buf = FileRead($hRead)
$location=StringInStr($Buf, "7:comment")
$Buf=StringLeft($Buf,$location-1) & "13:announce-listll32:http://normex.no-ip.org/announceel31:http://retracker.local/announceee" & StringMid($Buf,$location)
FileWrite($hWrite, $Buf)
FileClose($hRead)
FileClose($hWrite)

С бинарным режимом чтения/записи работать не решился - не знаю как добавлять данные к прочитанным из файла

p.s. kaster последний присланный Вами код изучаю

а чем не устроила функция добавления трекеров, которая присутствует во мгоих клиентах? »
В моем случае торрент патчер выполняет еще несколько функций.

kaster
18-04-2010, 01:01
Строка текста. Символы перехода на новую строку автоматически не добавляются. »
ну, та справка настолько стара, что порой мне кажется что вреда от нее больше чем пользы, судя по вопросам возникающим у пользователей
Торрент файл имеет текстовую область в формате UTF-8 »
да я уже понял, пока разбирался с протоколом. правда скрипт написал на основе исключительно экспериментов с торрент файлом
Мне нужно добавить еще несколько в свой анонс-лист »
ну в моем скрипте добавляется всего один трекер за раз, но думаю приспособить его для своих целей не составит труда. например в цикле

vkupriyanov
18-04-2010, 14:18
Спасибо.
На счет анонс-листов я погорячился. Он всегда должен быть один. Если добавить второй, то он не отобразится в свойствах торрента, загруженного в uTorrent и, наверное, не будет работать.
Тему закрою.

kaster
18-04-2010, 15:24
vkupriyanov, так я не понял, мой скрипт тебе подошел или нет? я пробовал на своем клиенте, трекер исправно добавляется в список трекеров, неважно был там один или изначально несколько

shadowbat
14-06-2010, 09:59
kaster, очень прошу скомпилируйте патчер в exe. чтобы запрашивал какой трекер добавить в торрент-файл.

мне тоже нужна эта функция. сегодня весь день ищу. ничего не могу найти. а создавать заново по 30 минут торрент-файл для 10 трекеров только для изменения announce - смысла совсем нет

kaster
14-06-2010, 15:14
shadowbat, уточни пож-та, что ты имеешь в виду. ты хочешь чтобы скрипт запрашивал каждый раз имя трекера? может подойдет вариант с созданием одного файла рядом со скриптом в котором по одному на строку перечислены все нужные трекеры? а скрипт просто считает оттуда нужные URL и внесет по одному в торрент?

shadowbat
14-06-2010, 15:36
не дождался, нашел сайт http://www.torrenteditor.com.
делает то, что мне нужно - загружает с компа торрент файл. я прописываю какие трекеры добавить (можно несколько) и сохраняю себе на комп назад торрент-файл с трекерами :) лучше чем ничего !

kaster
14-06-2010, 15:43
shadowbat, рад за тебя ;)

shadowbat
14-06-2010, 15:49
kaster, выложите тут програмку, вдруг кому то пригодится, все-таки тема то нужная

vkupriyanov
14-06-2010, 21:13
shadowbat
надо было в личку стукнуть для оперативности. Сейчас посмотрю...

vkupriyanov
20-06-2010, 12:53
shadowbat
Прежде чем писать патчер торрентов нужно разобраться в схеме работы обоих. Объяснение нашел вот тут (http://re-tracker.ru/index.php?showtopic=353). А за подробными разъяснениями обратился к Evolgr (http://re-tracker.ru/index.php?showuser=1791). За что ему большое спасибо. Переписка в личке:
Спасибо за простое изложение добавления ретрекера здесь (http://re-tracker.ru/index.php?showtopic=353) . Вы рекомендуете добавлять ретрекер в свой (отдельный) анонс-лист. Но в этом случае он не отображается в списке трекеров в свойствах торрента, загруженного в uTorrent. Если открыть этот торрент файл в BEncode Editor, то видно 2 анонс листа и все трекеры. Действительно ли необходим отдельный анонс-лист?

два анонс-листа в торент файле быть не должно.

на сколько помню, если трекер только один, тогда может даже не быть ключа announce-list. только в этом случае нужно добавлять ключ announce-list в торент, содержимым которого будет трекер из поля announce + наш трекер (тогда торент-клиент будет игнорировать ключ announce и считывать трекеры с ключа announce-list).

если же ключ announce-list уже присутствует в торенте, тогда добавляем свой трекер в этот ключ:
13:announce-listll80:http://tracker.calitko.org/torrents.php?passkey=d7c034325e7274bb2s346c6fc5b71307el32:http://somehost.com/announce.phpee.

Понятно. А трекер и ретрекер, помещенные в один анонс-лист будут работать параллельно? или как Вы указали:
будут работать в случайном порядке (чтобы уменьшить нагрузку на сервера)

это зависит от того, как они записаны.

если два трекера (или трекер и ретрекер) записаны в одном списке (l...e), например 13:announce-listll80:http://tracker.calitko.org/torrents.php?passkey=d7c034325e7274bb2s346c6fc5b7130732:http://somehost.com/announce.phpee, тогда они будут работать в случайном порядке.

если же они записаны в разных списках (как в предыдущем моем сообщении), тогда они будут работать параллельно.

Вот эскиз:

;открываю файл на чтение, который был передан в параметре командной строки торрент-патчера ($CmdLineRaw описан в справке)
$hRead = FileOpen($CmdLineRaw)
;читаю его содержимое
$Buf = FileRead($hRead)
FileClose($hRead)

;ищу позицию текста "7:comment"
$location=StringInStr($Buf, "7:comment")
;и перед ним вставляю свой ретрекер http://normex.no-ip.org:2710/announce
$Buf=StringLeft($Buf,$location-1) & "13:announce-listll37:http://normex.no-ip.org:2710/announceel31:http://retracker.local/announceee" & StringMid($Buf,$location)

;открываю файл на чтение и записываю новое содержание
$hWrite = FileOpen($CmdLineRaw, 2)
FileWrite($hWrite, $Buf)
FileClose($hWrite)

;добавление в utorrent
Run("C:\Program Files\uTorrent\uTorrent.exe" & " " & $CmdLineRaw)

shadowbat
20-06-2010, 13:58
я не программер, не жесткий автоитер, я писал о програмке (скомпилированном exe-файле), которая пригодится всем кто зайдет сюда и также не знаком с автоитом. поскольку тема торрентов - довольно широкая, а рабочей такой програмки что то в сети нет




© OSzone.net 2001-2012