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

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

morgan1991 13-04-2010 17:15 1391667

Отделить заголовок от html
 
Вложений: 1
Здравствуйте!
Отправляю серверу по 80 порту заголовок, получаю заголовок и файл png.
Необходимо отделить заголовок в отдельную переменную и правильно сохранить файл 1.png.

То что возвращает сервер во вложениях.
Помогите плиз.....

morgan1991 13-04-2010 21:28 1391852

пробовал браузером приконнектиться к скрипту чтобы он вернул ему картинку, дак браузер выдаёт:
0x485454502F312E3120323030204F4B0D0A5365и т.д.
никак не пойму как всётаки просмотреть эту картинку в программе, а не через браузер.
InetGet не подходит... Там есть свой косяк...
Хотябы намекните ктонибудь, что это за данные вообще передаются от сервера???
почемуто если прямо через браузер зайти по ссылке, то картинка отображается нормально, а если скриптом получить весь код и передать браузеру он выводит - писал выше что выводит...
Помогите пожалуйста, очень, очень нужно...

kaster 13-04-2010 22:37 1391897

morgan1991, там бинарный код картинки. запиши эти данные (0x485454502F312E3120323030204F4B0D0A5365и т.д.) в файл в бинарном режиме. к примеру, запиши эти данные в какую нибудь переменную, предположим $s, а потом уже пиши его в предварительно открытый в бинарном режиме файл
Код:

$hWrite = FileOpen(@ScriptDir & '\test.png', 16 + 2)
FileWrite($hWrite, $s)
FileClose($hWrite)

по идее, получившийся файл должен быть искомым

morgan1991 13-04-2010 22:46 1391904

kaster, дак в том то и косяк...
данные передаются бинарные, но в них и заголовок, т.е. нужно получить данные
Код:

TCPRecv($ConnectedSocet, 2048, 0)
С этим флагом они автоматом переведутся из бинарного вида в строку, затем отделить заголовок сервера от данных файла, затем перевести данные файла обратно в бинарный вид и записать в файл в бинарном режиме. Но это теория, а на практике я не могу отделить заголовок, а если вручную в созданном файле удалить заголовок, то файл становится не читаемым для просмотрщиков изображений.

kaster 13-04-2010 22:54 1391908

По всей видимости, какие-то косяки при конвертации из бинарного в текстовый и обратно. я тоже не смог переделать код в картинку. попробуй принимать данные сразу в бинарном виде, сохранить поток в файл, открыть любым умным редактором и удалить все, что до ‰PNG

morgan1991 13-04-2010 23:21 1391929

Цитата:

Цитата kaster
открыть любым умным редактором и удалить все, что до ‰PNG »

Открыл через Notepade++ и всё получилось, картинка стала рабочей, но как это сделать на Autoit ???

А если через Scite удаляю всё до ‰PNG, тогда картинка не открывается

kaster 13-04-2010 23:30 1391936

Цитата:

Цитата morgan1991
но как это сделать на Autoit ? »

точно так же :)
после сохранения, по идее при открытии и закрытии подобных подстав уже не должно быть

Код:

$sFile = @Script & '\test.png'
$sFile_new = @Script & '\test2.png'
$hRead = FileOpen($sFile, 0)
$hWrite = FileOpen($sFile_new, 2)
Do
  $line = FileReadLine($hRead)
Until StringInStr($line, '‰PNG')
$line &= FileRead($hRead)
FileClose($hRead)
FileWrite($hWrite, $line)
FileClose($hWrite)


morgan1991 13-04-2010 23:57 1391959

kaster, вообщем подправил немного ошибки и коечто изменил.

Код:

$sFile = @ScriptDir & '\test1.png'
                                $sFile_new = @ScriptDir & '\test2.png'
                                $hRead = FileOpen($sFile, 0)
                                $hWrite = FileOpen($sFile_new, 2)
                                Do
                                        $line = FileReadLine($hRead)
                                Until StringInStr($line, '‰PNG')
                                Do
                                        $line &= @CRLF & FileReadLine($hRead)
                                Until @error = -1
                                $line &= @CRLF & FileRead($hRead)
                                FileClose($hRead)
                                FileWrite($hWrite, $line)
                                FileClose($hWrite)

$line &= FileRead($hRead) - не подходит, т.к. он не читает до конца а только следующие две строчки, т.к. дальще в файле такая строка:
NULNULNUL
поэтому заменил на:
Код:

Do
    $line &= @CRLF & FileReadLine($hRead)
Until @error = -1

И всеравно не помогло, скрипт игнорит:
NUL, как будто их нет, я даже в не могу вручную скопировать эту строку и вставить на форум, винда её просто игнорит...

kaster 14-04-2010 00:08 1391970

А если так
Код:

$sFile = @Script & '\test.png'
$sFile_new = @Script & '\test2.png'
$hRead = FileOpen($sFile, 16)
$hWrite = FileOpen($sFile_new, 16 + 2)
Do
  $line = FileReadLine($hRead)
Until StringInStr($line, '‰PNG')
$line &= FileRead($hRead)
FileClose($hRead)
FileWrite($hWrite, $line)
FileClose($hWrite)


morgan1991 14-04-2010 00:27 1391983

Тоже не катит, он ‰PNG вставляет как есть а остальное в бинарном виде и получается:
Код:

‰PNG0x41E9A0A2485144309A8888800521108DA222112536343131и т.д.

kaster 14-04-2010 00:54 1391999

Код:

$sFile = @Script & '\test.png'
$sFile_new = @Script & '\test2.png'
$hRead = FileOpen($sFile, 16)
$hWrite = FileOpen($sFile_new, 16 + 2)
Do
  $line = FileReadLine($hRead)
Until StringInStr($line, '‰PNG')
FileWrite($hWrite, $line)
FileClose($hWrite)
$Content = FileRead($hRead)
FileClose($hRead)
$hWrite = FileOpen($sFile_new, 16 + 1)
FileWrite($hWrite, $Content)
FileClose($hWrite)


madmasles 14-04-2010 00:54 1392000

У меня, вроде, так получилось:
Код:

$sFile = @ScriptDir & '\test.png'
$sFile_new = @ScriptDir & '\test2.png'
$hRead = FileOpen($sFile)
$hWrite = FileOpen($sFile_new, 2)
Do
    $line = FileReadLine($hRead)
Until StringLen($line) = 0
$Buf = FileRead($hRead)
FileWrite($hWrite, $Buf)
FileClose($hRead)
FileClose($hWrite)


morgan1991 14-04-2010 01:26 1392010

kaster, madmasles, не так не так не работает...

madmasles 14-04-2010 01:47 1392017

morgan1991,
Я переименовал Ваш файл 1.txt в test.png и своим скриптом его обработал. Держите оба файла:

morgan1991 14-04-2010 12:05 1392228

madmasles, всё верно, но косяк в том что заголовок может быть и таким:
Код:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 14 Apr 2010 06:30:22 GMT
Content-Type: image/png
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: PHPSESSID=d60c21e5cc25be80aa294dad7955eb0b; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: no-cache
Content-Length: 4601

‰PNG

А может и таким:
Код:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 14 Apr 2010 06:30:22 GMT
Content-Type: image/png
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: PHPSESSID=d60c21e5cc25be80aa294dad7955eb0b; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: no-cache

12dc5
‰PNG

Тогда ваш скрипт не работает:
12dc5 - меняется... Причём я незнаю при каких обстоятельствах...

madmasles 14-04-2010 13:12 1392277

morgan1991,
Не знаю, случайно это или нет, но в Ваших обоих примерах строка с ‰PNG под № 13. Если так всегда, то так попробуйте:
Код:

$sFile = @ScriptDir & '\test.png'
$sFile_new = @ScriptDir & '\test2.png'
$hRead = FileOpen($sFile)
$hWrite = FileOpen($sFile_new, 2)
For $i = 1 To 12
    $line = FileReadLine($hRead)
Next
$Buf = FileRead($hRead)
FileWrite($hWrite, $Buf)
FileClose($hRead)
FileClose($hWrite)

У меня так с обоими заголовками работает.

PS
А так не важно, с какой строки начинается ‰PNG:
Код:

#include <file.au3>

Dim $aFile
$sFile
= @ScriptDir & '\test.png'
$sFile_new = @ScriptDir & '\test2.png'
_FileReadToArray($sFile, $aFile)
For $ii = 1 To $aFile[0]
    If StringInStr($aFile[$ii], "‰PNG") <> 0 Then ExitLoop
Next
$hRead = FileOpen($sFile)
$hWrite = FileOpen($sFile_new, 2)
For $i = 1 To $ii - 1
    $line = FileReadLine($hRead)
Next
$Buf = FileRead($hRead)
FileWrite($hWrite, $Buf)
FileClose($hRead)
FileClose($hWrite)


morgan1991 14-04-2010 13:29 1392283

Неа не работает...
$Buf = FileRead($hRead) - считывает только строчку ‰PNG и следующую а остальное игнорирует...
А если забить в цикл $Buf = FileReadLine($hRead) - то он игнорить часть данных, например NUL и в добавок к этому:
Цитата:

Цитата madmasles
но в Ваших обоих примерах строка с ‰PNG под № 13 »

Иногда №14 а иногда №13...
А на какой вы версии AutoIt роверяли? У меня стоит: 3.3.0.0

madmasles 14-04-2010 13:37 1392291

morgan1991,
У меня AutoIt 3.3.6.0 и все отрабатывает. Я проверил.

morgan1991 14-04-2010 13:45 1392303

madmasles, поставил 3.3.6.0 и всё действительно заработало, но заголовок по прежнему возвращается иногда такой:
Код:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 14 Apr 2010 08:11:06 GMT
Content-Type: image/png
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: PHPSESSID=a011606fac4847769797371c247a50e4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: no-cache
Content-Length: 4707

‰PNG

А иногда такой:
Код:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 14 Apr 2010 08:12:37 GMT
Content-Type: image/png
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: PHPSESSID=07618803a61b299120d3709617ee59c1; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: no-cache

1255
‰PNG

Может можно какимто регулярным выражением удалить всё до ‰PNG ???

madmasles 14-04-2010 14:04 1392320

morgan1991,
Попробуйте моим последним кодом обработать test.png. У меня так обрабатывает нормально независимо от заголовка.

morgan1991 14-04-2010 14:36 1392361

Цитата:

Цитата madmasles
Попробуйте моим последним кодом обработать test.png »

неа, не получается...
Ладно раз ничего не сделать, тогда сделаю обновление изображения пока не скачается то что нужно...

madmasles 14-04-2010 17:13 1392504

morgan1991,
Я ведь все свои эксперименты проводил с Вашим файлом из первого поста. С этим файлом у меня работает, а с другими... ? не знаю.
Прикрепите хотя бы 2 файла с разными заголовками, может что и получится.

morgan1991 14-04-2010 19:40 1392617

Решил сам, заметил если появляется эта строчка перед пнг 12156, то добавляется
Transfer-Encoding: chunked
Вот я и сделал так:
Код:

Local $FileReadBody = FileOpen($sFile, 0)
                If StringInStr(FileRead($FileReadBody), "Transfer-Encoding: chunked") > 0 Then
                    For
$i = 1 To 13
                        $Body &= FileReadLine($hRead) & @CRLF
                    Next
                Else
                    For $i = 1 To 12
                        $Body &= FileReadLine($hRead) & @CRLF
                    Next
                EndIf

Вместо:
Код:

For $i = 1 To 12
    $line = FileReadLine($hRead)
Next

madmasles, а как вы так код расскрашиваете, что он с ссылками выводится?

madmasles 14-04-2010 19:51 1392624

morgan1991,
В Опциях посмотрите.

266903582 14-04-2010 19:57 1392630

А так?
Код:

$somedata=FileOpen("1.txt",16)
$filtered=BinaryToString(FileRead($somedata))
while StringLeft($filtered,1)<>"‰"
        $filtered=StringTrimLeft($filtered,1)
WEnd
FileWrite("1.png",StringToBinary($filtered))


madmasles 14-04-2010 20:13 1392643

266903582,
Ваш код у меня отрабатывает, как надо. :)

morgan1991 18-05-2010 01:15 1415649

Вот ещё возник вопрос,необходимо получить весь код который присылает сервер, но как это сделать?
Вот мои мысли:
Получить заголовок
Затем из заголовка выковырять длинну контента и затем уже принимать данные через tcprecv пока колличество полученных данных меньше Content-lenght.
НО как обычно есть но. Не могу отделить заголовок до того как начинаю получать html, чтобы знать сколько данных принято и непонимаю почему иногда в заголовке приходит Content-lenght: число, а иногда просто число...

Sp01LeR 18-05-2010 20:29 1416254

А что, - для закачки картинки нужно обязательно сокеты использовать?
Может есть смысл качнуть Wget'ом - он дополнительно может сохранять заголовки ответа сервера в отдельный файл и куки обрабатывает...
Во-первых насчет прикола с Content-Lenght - там сервер(а точнее скрипт) не корректное тело отдает... Я так понимаю, что грузятся капчи :smirk:
Вобщем если все-таки нужно коннектится именно через сокеты и грузить бинарные данные то заголовки от содержимого в теле ответа отделяются так:
Код:

#include <String.au3>
#include <Array.au3>

;$serv_resp_data - данные полученые через tcprecv

$content = _StringExplode($serv_resp_data, @CRLF&@CRLF, 1)

$heads=$content ; - заголовки ответа
$body=$content ; - тело ответа

Ну а уже вышеописаную проблему добавления отсебятины в тело ответа можно решать через фильтрацию HEX-данных, например если нужно грузить только картинки форматов JPG/GIF/PNG - делаем вот так:
Код:

$jpg_hdr="FFD8FFE000104A464946"
$gif_hdr="47494638"
$png_hdr="89504E470D0A"

$body2hex=_StringToHex($body) ; конвертируем тело ответа в HEX-строку
$jpg_hdr_res=StringInStr($body2hex, $jpg_hdr)
$gif_hdr_res=StringInStr($body2hex, $gif_hdr)
$png_hdr_res=StringInStr($body2hex, $png_hdr)

If $jpg_hdr_res Then
        $trim_body_hex=StringTrimLeft($body2hex, $jpg_hdr_res-1)
Elsif $gif_hdr_res Then
        $trim_body_hex=StringTrimLeft($body2hex, $gif_hdr_res-1)
Elsif $png_hdr_res Then
        $trim_body_hex=StringTrimLeft($body2hex, $png_hdr_res-1)
Else
        MsgBox(4096, "", "Неккоректный формат бинарных данных в теле ответа!")
        Exit
EndIf

$body2str=_HexToString($trim_body_hex)



Время: 09:08.

Время: 09:08.
© OSzone.net 2001-