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

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

malev 28-10-2009 15:36 1254802

Как получить картинку методом Get запросов
 
Объясните кто знает как получить картинку методом отправки Get запросов, InetGet - не интересует. Сам пробовал не получается. Вот что настрадалось на текущий момент:
Код:

#include <HTTP.au3>

 $sHost2 = "ya.ru"
 $sPage="/"

;~  msgbox (0,"привет",_HTTPGetHeader($sHost2))

Func _HTTPGetHeader($sHost)
TCPStartup()
    Local $sName_To_IP = TCPNameToIP($sHost)
    Local $iSocket = TCPConnect($sName_To_IP, 80)
    If $iSocket = -1 Then
        TCPCloseSocket($iSocket)

        Return SetError(1, 0, "")
    EndIf
    Local
$sCommand = "GET /logo.png HTTP/1.0" & @CRLF
    $sCommand &= "Host: " & $sHost2 & @CRLF & @CRLF

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

    Local $sRecv = "", $sCurrentRecv
    While 1
        $sCurrentRecv = TCPRecv($iSocket, 16)
        If @error <> 0 Then ExitLoop
        If
$sCurrentRecv <> "" Then $sRecv &= $sCurrentRecv
    WEnd

    ConsoleWrite ($sRecv)
TCPCloseSocket($iSocket)
TCPShutdown()
    Return $sRecv
EndFunc
;~ ****1 метод******
$Sock=_HTTPConnect($sHost2)
ConsoleWrite(_HTTPGet($sHost2,"logo.png") & @CR)
$aRes=_HTTPRead($Sock,0)
ConsoleWrite($aRes & @CR & "***********************" & @CR)
_HTTPClose()
;~ ****2 метод******
_HTTPGetHeader($sHost2)

2- ой метод более похож на правду но данные почему то начинаются неправильно должно быть PNG%
Библиотека HTTP.au3 - http://forum.oszone.net/thread-154449.html

malev 30-10-2009 13:34 1256572

Попробовал уменьшит параметр в функции TCPRecv($iSocket, 16) с 16 до 1 появился заголовок %PNG но все равно встречается мусор типа - 0x000x000x00

beve 31-10-2009 00:41 1257095

Цитата:

Цитата malev
но все равно встречается мусор типа - 0x000x000x00 »

Это не мусор. "0x00" - это hex представление "знака или символа" Nul. Если например открыть это изображение (предварительно его сохранив из сайта, как *.png) в SciTE, то можно увидеть как этот символ отображается, типа NUL в чорном квадратике. Плохо то, что этот символ нельзя ни копировать, ни конвертировать, чтоб заменить в нашем случае 0x00 на Nul, ибо если просто заменить на 00, то ничего не совпадет, ибо 0 в hex отображении будет иметь значение 30, а нужно, чтобы в hex отображении было именно 00.Единственное что можно сделать в этом случае, это загрузить код этого рисунка, с помощью описанной функции _HTTPGetHeader($sHost), изменив код в соответствующем месте, на:
Код:

$sCurrentRecv = TCPRecv($iSocket, 1)
       
If @error <> 0 Then ExitLoop
        If
$sCurrentRecv <> "" Then
            If 
$sCurrentRecv ="0x00" Then 
               
$sRecv &= "1_2_3_4_5"
; заменяем, чтоб можно было тогда найти в бинарном виде, именно это.
           
Else
           
$sRecv &= $sCurrentRecv
           
EndIf

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

$BinnaryData=StringReplace ( $BinnaryData, "315F325F335F345F35", "00") ; заменяем "1_2_3_4_5", которое в бинарном виде выглядит как "315F325F335F345F35" на Nul
ищем и заменяем совпадения. После чего сохраняем, данные в файл (не забыв про то что файл для этого нужно открыть в бинарном режиме и для записи 16+2). Вот теперь рисунок должен бы был открыться, код вроде как совпадает, но если открыть этот "рисунок" в SciTe например, и включить - показывать Символы перевода строк, то можно увидеть что в некоторых местах по сравнению с оригиналом, нет совместимости в отображении этих самых символов, например отображается как CR, а в оригинале LF или CRLF и тому подобное. Поэтому я сделал вывод, что тут дело в том, что сам Autoit, что то "химичит" при получении кода через TCPRecv ...


Время: 02:11.

Время: 02:11.
© OSzone.net 2001-