Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Патчер торрентов (AutoIt некорректно вносит изменения в торрент файлы) (http://forum.oszone.net/showthread.php?t=173363)

vkupriyanov 17-04-2010 10:46 1394674

Патчер торрентов (AutoIt некорректно вносит изменения в торрент файлы)
 
Необходимо внести изменения в торрент файл (добавить ретрекер). Для начала пробую с помощью 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 1394686

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

$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 1394712

vkupriyanov,
kaster,
А у меня так работает:
Код:

$sFile = @ScriptDir & '\1.torrent'
$sFile_new = @ScriptDir & '\2.torrent'
$hRead = FileOpen($sFile)
$hWrite = FileOpen($sFile_new, 2)
$Buf = FileRead($hRead)
FileWrite($hWrite, $Buf)
FileClose($hRead)
FileClose($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 1394722

Цитата:

Цитата madmasles
А у меня так работает: »

что неудивительно. прочитать содержимое и переписать его снова. у автора проблемы изза ReadLine, т.к. при записи автоит сам добавляет после каждой строки CRLF, хотя изначально в исходном файле вполне мог бы оказаться CR или LF по отдельности.
Цитата:

Цитата madmasles
А на Ваш код у меня 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 1395005

вот код добавляет трекер указанный в переменной $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 1395022

а чем не устроила функция добавления трекеров, которая присутствует во мгоих клиентах?

vkupriyanov 17-04-2010 20:07 1395033

madmasles, Ваш код мне подошел.
kaster, спасибо, что указали на различие в деле добавления возврата каретки в случае использования FileWriteLine. В русскоязычной справке от Valery Ivanov о 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.
Сверяю справки постоянно, но этот момент упустил.

Цитата:

Цитата kaster
торрент файл не текст »

Торрент файл имеет текстовую область в формате UTF-8
Цитата:

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. В эту область вношу изменения.

Цитата:

Цитата kaster
А трекер в изначальном торренте всего один? Или возможен случай что их несколько? »

Трекеров и ретрекеров несколько. Мне нужно добавить еще несколько в свой анонс-лист. Вот здесь человек с ником 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
а чем не устроила функция добавления трекеров, которая присутствует во мгоих клиентах? »

В моем случае торрент патчер выполняет еще несколько функций.

kaster 18-04-2010 01:01 1395197

Цитата:

Цитата vkupriyanov
Строка текста. Символы перехода на новую строку автоматически не добавляются. »

ну, та справка настолько стара, что порой мне кажется что вреда от нее больше чем пользы, судя по вопросам возникающим у пользователей
Цитата:

Цитата vkupriyanov
Торрент файл имеет текстовую область в формате UTF-8 »

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

Цитата vkupriyanov
Мне нужно добавить еще несколько в свой анонс-лист »

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

vkupriyanov 18-04-2010 14:18 1395511

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

kaster 18-04-2010 15:24 1395581

vkupriyanov, так я не понял, мой скрипт тебе подошел или нет? я пробовал на своем клиенте, трекер исправно добавляется в список трекеров, неважно был там один или изначально несколько

shadowbat 14-06-2010 09:59 1433690

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

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

kaster 14-06-2010 15:14 1433847

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

shadowbat 14-06-2010 15:36 1433856

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

kaster 14-06-2010 15:43 1433861

shadowbat, рад за тебя ;)

shadowbat 14-06-2010 15:49 1433866

kaster, выложите тут програмку, вдруг кому то пригодится, все-таки тема то нужная

vkupriyanov 14-06-2010 21:13 1434079

shadowbat
надо было в личку стукнуть для оперативности. Сейчас посмотрю...

vkupriyanov 20-06-2010 12:53 1437811

shadowbat
Прежде чем писать патчер торрентов нужно разобраться в схеме работы обоих. Объяснение нашел вот тут. А за подробными разъяснениями обратился к Evolgr. За что ему большое спасибо. Переписка в личке:
Цитата:

Спасибо за простое изложение добавления ретрекера здесь . Вы рекомендуете добавлять ретрекер в свой (отдельный) анонс-лист. Но в этом случае он не отображается в списке трекеров в свойствах торрента, загруженного в 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 1437849

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


Время: 20:53.

Время: 20:53.
© OSzone.net 2001-