[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Коварная функция fopen(). Нужна помощь!!!
zabytyi
Приветствую вас, господа программисты!
Ох, как бы мне этого не хотелось, но обратиться за помощью я вынужден!

Есть удаленная (чужой хост) страничка вида
http://www.somehost.com/cgi-bin/results.dtw/disp - которая выдает результаты некого поиска...
Страничка не простая, попасть на нее можно только после авторизации на другой страничке
http://www.somehost.com/cgi-bin/login.dtw/disp2

Процесс авторизации легко обойти создав свою страничку с формой, которая передаст по адресу
http://www.somehost.com/cgi-bin/login.dtw/disp2
три параметра userid, password и URL, причем последний параметр - есть страничка на которуюмы попадем после авторизации...

Задача состоит в следующем. Открыть и "добыть" некоторые данные со странички результатов...

Есть страничка на своем хосте...
log.php

<body onload="document.form1.submit();">
<form action="http://www.somehost.com/cgi-bin/login.dtw/disp2" method="post" name="form1" id="form1">
<input type="hidden" name="URL" value="http://www.myhost.com/download.php"> <!-- Страничка на моем хосте с которой будем пытаться получить информацию с удаленной странички -->
<input type="hidden" name="userid" value="123">
<input type="hidden" name="password" value="321">
</form>
</body>


download.php

<?
$fp = fopen("http://www.somehost.com/cgi-bin/results.dtw/disp?param1=1¶m2=2", "r"); <!-- Собственно, открываем файл (аторизацию то мы уже прошли) -->

$file = fread($fp, 1500000); <!-- Читаем наверняка -->
$file = trim(chop($file)); <!-- Обрезаем пробелы и т.д. -->
$file = convert_cyr_string($file, "k", "w"); <!-- Небольшие манипуляции с кодировкой -->


preg_match_all("!<b>(.*)</b>!", $file, $res); <!-- Находим нужное и помещаем в массив-->
for ($i = 0; $i < 10; $i++)
{
echo $res[1][$i]."<br>"; <!-- Смотрим результаты. Известно что их не более 10 -->

}

echo $file; <!-- Ну и для наглядности посмотрим открылась ли вообще страничка -->
?>


ВНИМАНИЕ ВОПРОС!!!

С локальной машины все проходит на ура.
НО на своем хосте дела обстоят иначе. Авторизацию проходит, перенаправляет на необходимую страничку, а почему то функции fopen() все равно передается страничка авторизации http://www.somehost.com/cgi-bin/login.dtw/disp2.

ПОЧЕМУ?
Есть соображения, что нужно каким-то боком пристыковать сюда cookie...

мыло для связи



Спустя 5 часов, 6 минут, 42 секунды (26.12.2007 - 03:49) PollyMorph написал(а):
Здесь потребуется работа с сокетами, а не с файлами. Открываешь сокет, получаешь страницу, парсишь данные.

Спустя 2 дня, 7 часов, 24 минуты, 32 секунды (28.12.2007 - 11:14) Clark Kent написал(а):
Легче всего в этом случае юзать CURL.

Спустя 12 часов, 46 минут, 34 секунды (29.12.2007 - 00:00) lenich написал(а):
А блин поздно увидел тему. Знаете, я думаю, что тут дело в сессиях. Куки врядли использовали бы для авторизации, т.к. у некоторых они отключены. Когда вы авторизируетесь, на сервере создается сессия и вам отсылается ее id. Этот id браузер хранит и добавляет в следующий запрос. Благодаря этому сервер понимает что клиент уже автроизован. Вы же ее не добавляте в запрос как я понял. Для начала скачайте сниффер и посмотрите весь траффик который идет между вами и сайтом, когда вы пользуетесь браузером. Выложите эти логи на форум - посмотрим как вам лучше сделать.

Спустя 7 дней, 15 часов, 6 минут, 3 секунды (6.01.2008 - 15:06) zabytyi написал(а):
Цитата(lenich @ 28.12.2007, 23:00) [snapback]31160[/snapback]
А блин поздно увидел тему. Знаете, я думаю, что тут дело в сессиях. Куки врядли использовали бы для авторизации, т.к. у некоторых они отключены. Когда вы авторизируетесь, на сервере создается сессия и вам отсылается ее id. Этот id браузер хранит и добавляет в следующий запрос. Благодаря этому сервер понимает что клиент уже автроизован. Вы же ее не добавляте в запрос как я понял. Для начала скачайте сниффер и посмотрите весь траффик который идет между вами и сайтом, когда вы пользуетесь браузером. Выложите эти логи на форум - посмотрим как вам лучше сделать.



Значит дела обстоят так:

Запрос на главную страницу
GET / HTTP/1.1
Accept: */*
Referer:
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; FDM; .NET CLR 1.1.4322)
Host: www.somehost.com
Proxy-Connection: Keep-Alive
Cookie: COUNTLOGIN=; COPARTURL=

Ответ
HTTP/1.0 302 Redirect
Date: Sun, 06 Jan 2008 11:54:49 GMT
Removed-Header: 257
Content-Type: text/html
Server: NetCache appliance (NetApp/6.0.5)
RemovedHdr: keep-alive
Proxy-Connection: keep-alive
Location:
Expires: 0



Запрос со страницы авторизации после ввода логина и пароля
GET / HTTP/1.1
Accept: */*
Referer:
Accept-Language: ru
Accept-Encoding: gzip, deflate
If-Modified-Since: Sat, 04 Dec 1982 23:17:24 GMT; length=4571
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; FDM; .NET CLR 1.1.4322)
Host: www.somehost.com
Proxy-Connection: Keep-Alive
Cookie: COUNTLOGIN=338731:10756905185; COPARTURL=

Ответ
HTTP/1.0 304 Not Modified
Date: Sun, 06 Jan 2008 11:58:03 GMT
Server: Apache/2.0.58 (iSeries)
Connection: Keep-Alive
Keep-Alive: timeout=300, max=100
ETag: "d2e5-11db-3efd4000"
proxy-connection: keep-alive

Запрос со страницы результатов
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, application/x-icq, */*
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; FDM; .NET CLR 1.1.4322)
Host: www.somehost.com
Proxy-Connection: Keep-Alive
Cookie: COUNTLOGIN=338731:10756905185; COPARTURL=

Ответ
HTTP/1.0 200 OK
Date: Sun, 06 Jan 2008 12:01:22 GMT
Server: Apache/2.0.58 (iSeries)
Content-Length: 8580
Keep-Alive: timeout=300, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=ISO-8859-1


Что можете предложить глядя на эти данные? Как я понимаю необходимо передавать хедер "Cookie". Но хотелось бы узнать каким должен быть запрос в идеале и собственно как достать из запроса этот хедер "Cookie"???

Пока не все ясно и не все понятно... Хелп...

Спустя 3 часа, 8 минут, 42 секунды (6.01.2008 - 18:15) lenich написал(а):
Да похоже что так. Но вообще очень странно сделано:
1. Данные на авторизацию передаются не post'ом а get'ом и не видно где там вообще значения логин/пароль.
2. Используются куки вместо сессии.
Т.е. складывается такое ощущение, что сайт хранит логин/пароль просто в куках и при входе проверяет куки, а не делает как таковую авторизацию.
Значение у Cookie при каждом входе кстати разное или одинаковое?

Теперь вам надо самому формировать запросы и посылать их на сервер с помощью сокетов примерно так:

Код
$request = 'GET / HTTP/1.1\r\n
Accept: */*\r\n
Referer: \r\n
Accept-Language: ru\r\n
Accept-Encoding: gzip, deflate\r\n
If-Modified-Since: Sat, 04 Dec 1982 23:17:24 GMT; length=4571\r\n
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2; FDM; .NET CLR 1.1.4322)\r\n
Host: www.somehost.com\r\n
Proxy-Connection: Keep-Alive\r\n
Cookie: COUNTLOGIN=338731:10756905185; COPARTURL=\r\n\r\n';

//Аккуратнее - может я где - то с \r\n смудил - там их полно. Посмторите http://ru2.php.net/manual/ru/function.fsockopen.php - там есть примеры запросов.

$fp = fsockopen("www.somehost.com", 80); // www.somehost.com

fputs($fp, $request); //посылаете запрос

while(!feof($fp)){
$result .= fgets($fp, 1024);//получаете ответ
}
fclose($fp);


Потом парсите $result - там будет хранится ответ т.е. как раз хедеры и html контент который вам нужен, если все нормально прошло. И так делаете 1 или 2 запроса (если кука одна и таже, то 1 запрос наверное можно не делать) : 1.'Запрос со страницы авторизации после ввода логина и пароля' а потом 2.'Запрос со страницы результатов'. Сокет наверное можно не переоткрывать.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.