![]() |
Отделить заголовок от html
Вложений: 1
Здравствуйте!
Отправляю серверу по 80 порту заголовок, получаю заголовок и файл png. Необходимо отделить заголовок в отдельную переменную и правильно сохранить файл 1.png. То что возвращает сервер во вложениях. Помогите плиз..... |
пробовал браузером приконнектиться к скрипту чтобы он вернул ему картинку, дак браузер выдаёт:
0x485454502F312E3120323030204F4B0D0A5365и т.д. никак не пойму как всётаки просмотреть эту картинку в программе, а не через браузер. InetGet не подходит... Там есть свой косяк... Хотябы намекните ктонибудь, что это за данные вообще передаются от сервера??? почемуто если прямо через браузер зайти по ссылке, то картинка отображается нормально, а если скриптом получить весь код и передать браузеру он выводит - писал выше что выводит... Помогите пожалуйста, очень, очень нужно... |
morgan1991, там бинарный код картинки. запиши эти данные (0x485454502F312E3120323030204F4B0D0A5365и т.д.) в файл в бинарном режиме. к примеру, запиши эти данные в какую нибудь переменную, предположим $s, а потом уже пиши его в предварительно открытый в бинарном режиме файл
Код:
$hWrite = FileOpen(@ScriptDir & '\test.png', 16 + 2) |
kaster, дак в том то и косяк...
данные передаются бинарные, но в них и заголовок, т.е. нужно получить данные Код:
TCPRecv($ConnectedSocet, 2048, 0) |
По всей видимости, какие-то косяки при конвертации из бинарного в текстовый и обратно. я тоже не смог переделать код в картинку. попробуй принимать данные сразу в бинарном виде, сохранить поток в файл, открыть любым умным редактором и удалить все, что до ‰PNG
|
Цитата:
А если через Scite удаляю всё до ‰PNG, тогда картинка не открывается |
Цитата:
после сохранения, по идее при открытии и закрытии подобных подстав уже не должно быть Код:
$sFile = @Script & '\test.png' |
kaster, вообщем подправил немного ошибки и коечто изменил.
Код:
$sFile = @ScriptDir & '\test1.png' NULNULNUL поэтому заменил на: Код:
Do NUL, как будто их нет, я даже в не могу вручную скопировать эту строку и вставить на форум, винда её просто игнорит... |
А если так
Код:
$sFile = @Script & '\test.png' |
Тоже не катит, он ‰PNG вставляет как есть а остальное в бинарном виде и получается:
Код:
‰PNG0x41E9A0A2485144309A8888800521108DA222112536343131и т.д. |
Код:
$sFile = @Script & '\test.png' |
У меня, вроде, так получилось:
Код:
$sFile = @ScriptDir & '\test.png' |
kaster, madmasles, не так не так не работает...
|
morgan1991,
Я переименовал Ваш файл 1.txt в test.png и своим скриптом его обработал. Держите оба файла: |
madmasles, всё верно, но косяк в том что заголовок может быть и таким:
Код:
HTTP/1.1 200 OK Код:
HTTP/1.1 200 OK 12dc5 - меняется... Причём я незнаю при каких обстоятельствах... |
morgan1991,
Не знаю, случайно это или нет, но в Ваших обоих примерах строка с ‰PNG под № 13. Если так всегда, то так попробуйте: Код:
$sFile = @ScriptDir & '\test.png' PS А так не важно, с какой строки начинается ‰PNG: Код:
#include <file.au3> |
Неа не работает...
$Buf = FileRead($hRead) - считывает только строчку ‰PNG и следующую а остальное игнорирует... А если забить в цикл $Buf = FileReadLine($hRead) - то он игнорить часть данных, например NUL и в добавок к этому: Цитата:
А на какой вы версии AutoIt роверяли? У меня стоит: 3.3.0.0 |
morgan1991,
У меня AutoIt 3.3.6.0 и все отрабатывает. Я проверил. |
madmasles, поставил 3.3.6.0 и всё действительно заработало, но заголовок по прежнему возвращается иногда такой:
Код:
HTTP/1.1 200 OK Код:
HTTP/1.1 200 OK |
morgan1991,
Попробуйте моим последним кодом обработать test.png. У меня так обрабатывает нормально независимо от заголовка. |
Цитата:
Ладно раз ничего не сделать, тогда сделаю обновление изображения пока не скачается то что нужно... |
morgan1991,
Я ведь все свои эксперименты проводил с Вашим файлом из первого поста. С этим файлом у меня работает, а с другими... ? не знаю. Прикрепите хотя бы 2 файла с разными заголовками, может что и получится. |
Решил сам, заметил если появляется эта строчка перед пнг 12156, то добавляется
Transfer-Encoding: chunked Вот я и сделал так: Код:
Local $FileReadBody = FileOpen($sFile, 0) Код:
For $i = 1 To 12 |
morgan1991,
В Опциях посмотрите. |
А так?
Код:
$somedata=FileOpen("1.txt",16) |
266903582,
Ваш код у меня отрабатывает, как надо. :) |
Вот ещё возник вопрос,необходимо получить весь код который присылает сервер, но как это сделать?
Вот мои мысли: Получить заголовок Затем из заголовка выковырять длинну контента и затем уже принимать данные через tcprecv пока колличество полученных данных меньше Content-lenght. НО как обычно есть но. Не могу отделить заголовок до того как начинаю получать html, чтобы знать сколько данных принято и непонимаю почему иногда в заголовке приходит Content-lenght: число, а иногда просто число... |
А что, - для закачки картинки нужно обязательно сокеты использовать?
Может есть смысл качнуть Wget'ом - он дополнительно может сохранять заголовки ответа сервера в отдельный файл и куки обрабатывает... Во-первых насчет прикола с Content-Lenght - там сервер(а точнее скрипт) не корректное тело отдает... Я так понимаю, что грузятся капчи :smirk: Вобщем если все-таки нужно коннектится именно через сокеты и грузить бинарные данные то заголовки от содержимого в теле ответа отделяются так: Код:
#include <String.au3> Код:
$jpg_hdr="FFD8FFE000104A464946" |
Время: 09:08. |
Время: 09:08.
© OSzone.net 2001-