Что нового

[Сеть, интернет] Как обновить MozillaFirefox при помощи autoit ?

leto

Новичок
Сообщения
9
Репутация
0
Доброго дня!
Хочу реализовать такую задачу.
Установщик программ определяет какая версия MozillaFirefox установлена на компьютере. Затем сравнивает ее с версией на официальном сайте.
Если на сайте посвежее, то скачивает и устанавливает ее.

Наведите на мысль, или аналогичные примеры.

Пока на форуме нашел часть решения. Реализация закачки нужного файла по точно указанной ссылке, с отображением ProgressBar
Код:
Func Download ($FileURL, $FileName, $ProgramName)
    $FileSaveLocation = @ScriptDir & "\" & $FileName
    $FileSize = InetGetSize($FileURL)
    $FileDownload = InetGet($FileURL, $FileSaveLocation, 0, 1)
    ProgressOn("", "", "", -1)
    Do
        $Percentage = InetGetInfo($FileDownload, 0) * 100 / $FileSize
        ProgressSet($Percentage, Round($Percentage, 0) & "% Downloaded " & Round(InetGetInfo($FileDownload, 0) / 1048576, 2) & " of " & Round($FileSize / 1048576, 2) & " MB", "Downloading " & $ProgramName)
        Sleep(250)
    Until InetGetInfo($FileDownload, 2)
ProgressOff()
EndFunc


где
$FileURL = "http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/win32/en-US/Firefox%20Setup%2017.0.1.exe"

$FileName = "Mozilla Firefox(En).exe"

$ProgramName = "Mozilla Firefox"
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
А разве лиса не обновляется сама?
 
Автор
L

leto

Новичок
Сообщения
9
Репутация
0
Обновляется.
Но я пытаюсь собрать установщик программ. Cреди программ есть Firefox. Сейчас он у меня устанавливает версию 17.0.1 выкачивая ее по прямой ссылке. Допустим через месяца два я запущу этот установщик, а у меня на компьютере уже установлена версия 18.0.5 к примеру.
Установщик скачает все ту же 17.0.1 по старой ссылке и запустит ее.
Конечно, потом можно и обновиться, но хотелось что бы сразу свежак качал и устанавливал.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Что возвращает
Код:
FileGetVersion('C:\Program Files\blahblah_path\firefox.exe')

?
можно плясать от этого. например, проверяет есть ли вообще Firefox, если нет качает последнюю версию, ставит. если есть находит версию, если последняя версия - ничего не делает. если меньше, то опять же качает и ставит.
 
Автор
L

leto

Новичок
Сообщения
9
Репутация
0
При помощи FileGetVersion я получу версию программы на компьютере. Это good :smile:
А как мне узнать последнюю версию Firefox на сайте для сравнения с локальной?
Судя из пути "http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/win32/en-US/дальше название последней версии.exe, я думал в сторону ссылки на закачку и регулярных выражений. :stars:
Может есть вариант задать ссылку таким образом что бы установщик качал любой файл с расширением .exe из этой папки? Тем более, что он там всегда один.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
еще можно задать ссылку для InetGet
http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/win32/en-US
а уже оттуда вытащить ссылку на файл, раз он один. ссылка на файл прячется под тэгом
Код:
<a href="Firefox%20Setup%2017.0.1.exe">Firefox Setup 17.0.1.exe</a>
то что красным. вернее, это инкремент. его надо добавить в вышеуказанную ссылку на папку
 
Автор
L

leto

Новичок
Сообщения
9
Репутация
0
Не подскажите, при помощи каких функций вытащить ссылку на файл из тега?
Что то похожее на форуме находил, там из .ini файла информацию доставали...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Попробуй так
Код:
$sURL = 'http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/win32/en-US/'
$sHTML = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /pub/mozilla.org/firefox/releases/latest/win32/en-US</title>
 </head>
 <body>
<h1>Index of /pub/mozilla.org/firefox/releases/latest/win32/en-US</h1>
<table><tr><th><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th></tr><tr><th colspan="4"><hr></th></tr>
<tr><td valign="top"><img src="/icons/back.gif" alt="[DIR]"></td><td><a href="/pub/mozilla.org/firefox/releases/latest/win32/">Parent Directory</a></td><td> </td><td align="right">  - </td></tr>
<tr><td valign="top"><img src="/icons/binary.gif" alt="[   ]"></td><td><a href="Firefox%20Setup%2017.0.1.exe">Firefox Setup 17.0.1.exe</a></td><td align="right">29-Nov-2012 01:41  </td><td align="right"> 18M</td></tr>
<tr><th colspan="4"><hr></th></tr>
</table>
<address>Apache/2.2.14 (Ubuntu) Server at releases.mozilla.org Port 80</address>
</body></html>'
$sRegExp = '<a\shref="(Firefox\S+exe)">'
$sRes = StringRegExp($sHTML, $sRegExp, 3)
$sFF = $sRes[0]
$sURL &= $sFF
MsgBox(0, '', $sURL)

По поводу индекса $sRes не уверен, возможно 1, а не 0. надо проверять.
 
Автор
L

leto

Новичок
Сообщения
9
Репутация
0
Получился такой код. Качает файл по шаблону <a\shref="(Firefox\S+exe)"> из $URL
Код:
$URL = 'http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/win32/en-US/'
$HTML = InetRead($URL, 17) ; Качаем страничку HTML по ссылке

If @error Then                          ; Проверка на ошибки
    MsgBox(16, 'Error', 'InetRead')
    Exit
 EndIf

$HTML = BinaryToString($HTML) ; Переводим страничку HTML в строку
$HTMLString = StringRegExp($HTML, '<a\shref="(Firefox\S+exe)">', 3) ; Из строки по шаблону вынимаем название файла

If @error Then
    MsgBox(16, 'Error', 'InetRead')
    Exit
 EndIf

$HrefFileName = $HTMLString[UBound($HTMLString) - 1] ; Не совсем понимаю зачем UBound, но без него не работает :)

MsgBox(0, '', $HrefFileName)


В итоге, при помощи этого кодa:
Код:
$ver = FileGetVersion(@ProgramfilesDir&'\Mozilla Firefox\firefox.exe')
MsgBox(0, "Версия Mozilla Firefox", $ver)

получаю версию Firefox 17.0.1.4715 на компьютере.

Эта строка:
Код:
$HTMLString = StringRegExp($HTML, '<a\shref="(Firefox\S+exe)">', 3)

возвращает Firefox%20Setup%2017.0.1.exe

Завис на сравнении версий.
Хочу сделать так.
Значение переменной $ver = Firefox 17.0.1.4715 преобразовать в целые числа 17,0,1 откинув 4715. Загрузить в переменные. Посчитать сумму.
Из Firefox%20Setup%2017.0.1.exe или HTML вытянуть только значения 17.0.1 и их преобразовать в числа и загрузить переменные. Посчитать сумму.
Далее сравнить сумму чисел двух комплексных переменных. Если локальная сумма меньше суммы чисел полученных из HTML то качаем.

Наверно, можно просто сравнить два числа 1701(локальная версия) и 1702(инет версия). Но опять же способ преобразования значения 17.0.1.4715 и Firefox%20Setup%2017.0.1.exe в простое число 1701 не догоняю.

PS: Шел 5-ый день знакомства с autoit)



Добавлено:
Сообщение автоматически объединено:

Но можно проще. Нашел функцию сравнения строк.

Код:
$iResult = StringCompare("17.0.2 ", "18.0.1")
MsgBox(0, "Результат функции StringCompare (параметр 0):", $iResult)


Не знаю как регулярное выражение собрать, для выделения 17.0.1 из
переменной $ver= Firefox 17.0.1.4715
и HTML кода http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/win32/en-US
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
leto
Можно так попробовать:

Код:
$URL = 'http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest/win32/en-US/'
$HTML = InetRead($URL, 17) ; Качаем страничку HTML по ссылке

If @error Then ; Проверка на ошибки
	MsgBox(16, 'Error', 'InetRead')
	Exit
EndIf

$HTML = BinaryToString($HTML) ; Переводим страничку HTML в строку

$HrefFileName = StringRegExpReplace(StringRegExpReplace($HTML, '(?s).*?exe">(.*?)</a>?.*', '\1'), '[^0-9.]', '\1') ; Из строки по шаблону вынимаем название файла

$ver = FileGetVersion('C:\Program Files\Mozilla Firefox\firefox.exe')

$HrefFileName = StringSplit($HrefFileName, '.')
$ver = StringSplit($ver, '.')
$HrefFileName = $HrefFileName[1] & $HrefFileName[2] & $HrefFileName[3]
$ver = $ver[1] & $ver[2] & $ver[3]

ConsoleWrite($ver & @LF)
ConsoleWrite($HrefFileName & @LF)

Switch StringCompare($ver, $HrefFileName)
	Case 0
		$iResult = 'Версии совпадают'
		MsgBox(0, 'Результат функции StringCompare:', $iResult)
	Case 1
		$iResult = 'Версия на ПК новее' ; маловероятно
		MsgBox(0, 'Результат функции StringCompare:', $iResult)
	Case -1
		$iResult = 'Версия на сайте новее'
		MsgBox(0, 'Результат функции StringCompare:', $iResult)
EndSwitch
 
Автор
L

leto

Новичок
Сообщения
9
Репутация
0
Так работает! Правда всех тонкостей решения не понял...Но главное работает :D
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
$HrefFileName = StringSplit($HrefFileName, '.')
$ver = StringSplit($ver, '.')
$HrefFileName = $HrefFileName[1] & $HrefFileName[2] & $HrefFileName[3]
$ver = $ver[1] & $ver[2] & $ver[3]


Через StringReplace это делается в 1 строчку и без ошибок если соеденить не удастся :smile:

Код:
$HrefFileName = StringReplace ($HrefFileName, ".", "")
$ver = StringReplace ($ver, ".", "")
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Medic84
При установленном последнем Firefox получим две строки:
Код:
17014715
1701

И результат "Версия на ПК новее" .
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
WSWR
А, ну пардон. Тогда еще и обрезать. Ну все равно получится практически безошибочно.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
$ver = StringLeft($ver,4)
 
Верх