Что нового

[Сеть, интернет] Как скачать последний файл в списке в файловом хранилище

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Здравствуйте.
Использую AutoIt: v3.3.8.0

На сервере выкладываются файлы, по возрастанию вниз (самый новый, в самом низу списка).
Как указать через InetGet('http:// что-бы скачивался именно последний в списке?
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Вот http://devbuilds.kaspersky-labs.com/devbuilds/AVPTool/avptool11/
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот:
Код:
#include <INet.au3>

$URL = 'http://devbuilds.kaspersky-labs.com/devbuilds/AVPTool/avptool11/'
$HTML = _INetGetSource($URL)
$Reg = StringRegExp($HTML, '<a href="(.*?)"', 3)
InetGet($URL & $Reg[UBound($Reg) - 1], @DesktopDir & '\' & $Reg[UBound($Reg) - 1])


Сохраняет на рабочий стол
skype_info.gif
 

AlexxxRu

Знающий
Сообщения
19
Репутация
6
Я думаю вам поможет winhttp.
Код:
Global $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1');
$oHTTP.Open('GET','http://devbuilds.kaspersky-labs.com/devbuilds/AVPTool/avptool11/'); МЫ "открываем" страничку с нужными нам результатами.
$oHTTP.Send('')
$oHTTP.WaitForResponse
$Response = $oHTTP.ResponseText ; получили HTML странички.
$a = StringRegExp($Response,'<a href="(.+?\.exe)">',3); Регулярное выражение, что бы получить названия файлов.
$File = $a[UBound($a)-1] ; Последнее название файла. 
InetGet('http://devbuilds.kaspersky-labs.com/devbuilds/AVPTool/avptool11/'&$File,$File); Скачиваем файл в директорию со скриптом. Или вами указанную.

Сохраняет файл в директорию со скриптом.

При этом вам не нужно подключать другие библиотеки.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ivsatel,
Можно и так.
Код:
$s_URL = 'http://devbuilds.kaspersky-labs.com/devbuilds/AVPTool/avptool11/'
$s_Sourse = InetRead($s_URL, 17)
If @error Then
	MsgBox(16, 'Error', 'InetRead')
	Exit
EndIf
$s_Sourse = BinaryToString($s_Sourse)
$aLink = StringRegExp($s_Sourse, '(?mi)href="(.*?)">setup', 3)
If @error Then
	MsgBox(16, 'Error', 'StringRegExp')
	Exit
EndIf
$sFileName = $aLink[UBound($aLink) - 1]
$sLastLink = $s_URL & $sFileName
MsgBox(64, 'Info', $sLastLink)
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
madmasles, AlexxxRu, Zaramot Спасибо

А можно в функцию вставить проверку на наличие интернет соединения с выводом сообщения если оного нет?
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А можно в функцию вставить проверку на наличие интернет соединения с выводом сообщения если оного нет?
Код:
If Not Ping('www.google.ru') > 0 Then MsgBox(0, 'Test', 'Интернета нету')

;код
 

AlexxxRu

Знающий
Сообщения
19
Репутация
6
У меня пинг почему-то всегда возвращает, что сайта нет. Пользуюсь когда-то найденным вариантом.

Код:
Global $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1');
$sServer = "http://devbuilds.kaspersky-labs.com/devbuilds/AVPTool/avptool11/"
$iPort = 80

If _HTTPServerIsOnline($sServer, $iPort) Then
    MsgBox(64, "Проверка сервера", "Сервер [" & $sServer & "] on-line.",2)
    $oHTTP.Open($sServer); МЫ "открываем" страничку с нужными нам результатами.
    $oHTTP.Send('')
    $oHTTP.WaitForResponse
    $Response = $oHTTP.ResponseText ; получили HTML странички.
    $a = StringRegExp($Response,'<a href="(.+?\.exe)">',3); Регулярное выражение, что бы получить названия файлов.
    $File = $a[UBound($a)-1] ; Последнее название файла. 
    InetGet('http://devbuilds.kaspersky-labs.com/devbuilds/AVPTool/avptool11/'&$File,$File); Скачиваем файл в директорию со скриптом. Или вами указанную.
Else
    MsgBox(48, "Проверка сервера", "Сервер [" & $sServer & "] НЕ on-line.")
EndIf

Func _HTTPServerIsOnline($sServer, $iPort = 80)
    TCPStartup()

    $sServer = StringRegExpReplace($sServer, '(?i)^[a-z]{3,6}://', '')

    Local $sName_To_IP = TCPNameToIP($sServer)
    Local $iSocket = TCPConnect($sName_To_IP, $iPort)

    If $iSocket = -1 Then
        TCPCloseSocket($iSocket)
        Return SetError(1, 0, "")
    EndIf

    Local $sCommand = "HEAD / HTTP/1.1" & @CRLF

    $sCommand &= "Host: " & $sServer & @CRLF
    $sCommand &= "User-Agent: AutoIt/" & @AutoItVersion & " (Windows; U; Windows NT 5.1; en-US; rv:1.8.1)" & @CRLF
    $sCommand &= "Referer: " & $sServer & @CRLF
    $sCommand &= "Connection: close" & @CRLF & @CRLF

    Local $iBytesSent = TCPSend($iSocket, $sCommand)
    If $iBytesSent = 0 Then Return SetError(2, @error, 0)

    Local $sRecv = "", $sCurrentRecv

    While 1
        $sCurrentRecv = TCPRecv($iSocket, 16)

        If @error <> 0 Then
            ExitLoop
        EndIf

        If $sCurrentRecv <> "" Then
            $sRecv &= $sCurrentRecv
        EndIf
    WEnd

    TCPCloseSocket($iSocket)
    TCPShutdown()

    Return StringRegExp($sRecv, "(?i)HTTP/\d.\d (200|30[1-2])") = 1
EndFunc
 
Верх