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

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

AlexM 27-01-2011 17:55 1598561

скачать с помощью inetget - как определить перенаправление
 
inetget не читает файлы с перенаправлением. Про частную случай спрашивал в
http://forum.oszone.net/thread-197103.html
как прочить файл напр
http://www.oszone.net/go.php?url=htt..._notes&ext=pdf
и получил ответ.

Решение моего прошлого вопроса работает, но посоветованный код следует применять только для определенного синтаксиса в ссылке.
Понял, что назрел общий вопрос, который возможно нужно было сразу спросить.
Может кто знает, чем отличаются ссылки http с перенаправлением или без? Есть необходимое и достаточное условие чтобы узнать, читать просто по ссылке или узнавать куда перенаправляют и как?
Спасибо!

Creat0R 27-01-2011 19:31 1598623

Цитата:

Цитата AlexM
как прочить файл напр »

А браузер тут тоже ничего не выдаёт.

По идее нужно делать запрос и получать заголовок, если в нём есть Location: то читать оттуда новую ссылку, если нет, читать тело страницы и парсировать на придмет перенаправления, ну и если там нет ничего нового, тогда сохранять содержимое этой самой страницы в файл.

AlexM 28-01-2011 12:44 1599094

Цитата:

Цитата Creat0R
парсировать на придмет перенаправления, »

Это какие символы искать?

Creat0R 28-01-2011 18:35 1599351

Цитата:

Цитата AlexM
Это какие символы искать? »

Вот как то так:

Код:

$sURL = "http://www.oszone.net/go.php?url=http://www.lada-auto.ru/cgi-bin/viewlist.pl?id=85544&fld=file_&tbl=vaz_catalogue_notes&ext=pdf"

$sFileName = StringRegExpReplace($sURL, '^.*/', '')
_HTTPGetFile($sURL, @DesktopDir)

Func _HTTPGetFile($sURL, $sFile, $iOptions = 0, $iBackground = 0)
    Local $sHost, $sPage, $sName_To_IP, $iSocket, $sCommand, $iBytesSent, $sCurrentRecv, $sNew_URL, $sRecv
    Local $sFileName_Pattern = '^(/?[^/]*/)?[^/]*\.\w{1,5}$'
    Local $sHost_Pattern = '^([^:/]*://|www\.)[^/]*/.*$'
    Local $sLocation_Pattern = '(?si).*Location: (.*?)[\r\n].*'
    Local $sMeta_Pattern = '(?si).*<meta http-equiv=[''"]REFRESH[''"]\s*CONTENT=[''"]\d+;URL=(.*)[''"]>.*'
    Local $sJS1_Pattern = '(?si).*(?:window|document)\.location\.replace\([''"](.*)[''"]\).*'
    Local $sJS2_Pattern = '(?si).*(?:window|document)\.location\.href\s*=\s*[''"](.*)[''"].*'
    Local $sPHP_Pattern = '(?si).*header\([''"]Location:\s*(.*)[''"]\).*'

    $sHost = StringRegExpReplace($sURL, ".*://(.*?)/.*", "\1")
    $sPage = StringRegExpReplace($sURL, ".*://.*?(/.*)", "\1")

    TCPStartup()

    $sName_To_IP = TCPNameToIP($sHost)
    $iSocket = TCPConnect($sName_To_IP, 80)

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

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

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

    $iBytesSent = TCPSend($iSocket, $sCommand)

    If $iBytesSent = 0 Then
        TCPShutdown()
        Return SetError(2, @error, 0)
    EndIf

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

        If @error <> 0 Then
            ExitLoop
        EndIf

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

    TCPCloseSocket($iSocket)
    TCPShutdown()

    $sNew_URL = StringRegExpReplace($sRecv, $sLocation_Pattern, '\1')

    If @extended = 0 Then
        $sRecv = BinaryToString(InetRead($sURL))

        $sNew_URL = StringRegExpReplace($sRecv, $sMeta_Pattern, '\1')

        If Not StringRegExp($sNew_URL, $sFileName_Pattern) Then
            $sNew_URL = StringRegExpReplace($sRecv, $sJS1_Pattern , '\1')
        EndIf

        If Not StringRegExp($sNew_URL, $sFileName_Pattern) Then
            $sNew_URL = StringRegExpReplace($sRecv, $sJS2_Pattern, '\1')
        EndIf

        If Not StringRegExp($sNew_URL, $sFileName_Pattern) Then
            $sNew_URL = StringRegExpReplace($sRecv, $sPHP_Pattern, '\1')
        EndIf

        If Not StringRegExp($sNew_URL, $sHost_Pattern) Then
            $sNew_URL = 'http://' & $sHost & '/' & StringRegExpReplace($sNew_URL, '^/+', '')
        EndIf
    EndIf

    If StringInStr(FileGetAttrib($sFile), 'D') Then
        $sFile &= '\' & StringRegExpReplace($sNew_URL, '^.*/', '')
    EndIf

    Return InetGet($sNew_URL, $sFile, $iOptions, $iBackground)
EndFunc



Время: 07:50.

Время: 07:50.
© OSzone.net 2001-