Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Патчер торрентов (AutoIt некорректно вносит изменения в торрент файлы)

Ответить
Настройки темы
[решено] Патчер торрентов (AutoIt некорректно вносит изменения в торрент файлы)

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:46, 17-04-2010

 

Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


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

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 11:14, 17-04-2010 | #2



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

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


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:09, 17-04-2010 | #3


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


Цитата 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)

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Последний раз редактировалось kaster, 17-04-2010 в 13:07.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:25, 17-04-2010 | #4


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


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

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Последний раз редактировалось kaster, 17-04-2010 в 19:49.


Отправлено: 19:35, 17-04-2010 | #5


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


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

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 19:54, 17-04-2010 | #6


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:07, 17-04-2010 | #7


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


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

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 01:01, 18-04-2010 | #8


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:18, 18-04-2010 | #9


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


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

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 15:24, 18-04-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Патчер торрентов (AutoIt некорректно вносит изменения в торрент файлы)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Торрент загружает ненужные файлы El Scorpio Хочу все знать 5 04-03-2013 15:02
Как сделать чтобы Autoit создавал исполняемые файлы wwe AutoIt 3 15-04-2010 15:18
Аддоны - [addon] Патчер ресурсов архиватора 7z. katok888 Оформление Windows XP 5 12-07-2009 10:35
Тормоза в играх при скачивании торрентов Analog Непонятные проблемы с Железом 17 15-01-2009 23:00
Тихий патчер GrandCat Автоматическая установка Windows 2000/XP/2003 0 09-04-2006 16:12




 
Переход