PHP cURL и карты Яндекса
У меня проблема. Необходимо получить страницу типа
[HTML]http://maps.yandex.ru/?text=Россия,Москва,Электродная улица[/HTML]
Но функция file_get_contents не работает. Я почитал немного и понял что это из-за недостатка заголовков которые браузер отправляет серверу.
Так и узнал про сURL
Скачал его, установил. Да, кстати, все делаю на локальной машине, стоит Denwer(apache2,php5...)
Так вот собственно вопрос. Как мне с помощью сURL получить желанную страницу. Использовал следующий скрипт:
[HTML]<?php
$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4" ;
// ставим, что наш броузер читает только файлы в html формате
$header [] = "Accept: text/html;q=0.9, text/plain;q=0.8, image/png, */*;q=0.5" ;
$header [] = "Accept_charset: windows-1251, utf-8, utf-16;q=0.6, *;q=0.1";
// говорим, что броузер не читает файлы в gzip формате
$header [] = "Accept_encoding: identity";
$header [] = "Accept_language: en-us,en;q=0.5";
$header [] = "Connection: close";
$header [] = "Cache-Control: no-store, no-cache, must-revalidate";
$header [] = "Keep_alive: 300";
$header [] = "Expires: Thu, 01 Jan 1970 00:00:01 GMT";
function data_encode ( $data , $keyprefix = "" , $keypostfix = "" ) {
assert ( is_array ( $data ) );
$vars = null ;
foreach ( $data as $key => $value ) {
if ( is_array ( $value )) $vars .= data_encode ( $value , $keyprefix . $key . $keypostfix . urlencode ( "[" ), urlencode ( "]" ));
else $vars .= $keyprefix . $key . $keypostfix . "=" . urlencode ( $value ). "&" ;
}
return $vars ;
}
// функция вывода страники
function CurlPage ( $path ) {
// $path - страничка, какую смотрим
global $agent, $header, $referer, $arr_cookie, $cookie_file;
// вызываем сеанс Curl
$ch = curl_init ( $path );
// CURL будет возвращать результат, а не выводить его в печать
@curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
// выводим подробные сообщения о всех действиях
@curl_setopt ( $ch , CURLOPT_VERBOSE , 1 );
// считываем страничку с хедером от сервера
@curl_setopt ( $ch , CURLOPT_HEADER , 1 );
// отправим серверу user_agent сформированный нами самими
@curl_setopt ( $ch , CURLOPT_USERAGENT , $agent );
// оправляем $referer, что пришли с первой страницы сайта
@curl_setopt ( $ch , CURLOPT_REFERER , $referer );
// оправляем на сервер хедер, который мы сами сформировали
@curl_setopt ( $ch , CURLOPT_HTTPHEADER , $header );
// при получении HTTP заголовка "Location: " будет
// происходить перенаправление
@curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , 1 );
// запретить проверку сертификата удаленного сервера
@curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER, 0 );
// не будем проверять существование имени
@curl_setopt ( $ch , CURLOPT_SSL_VERIFYHOST, 0 );
// если есть массив с cookie, то отправим серверу, эти cookie
if ( @is_array ($arr_cookie)){
while (list($key, $val) = @each ($arr_cookie)){
$COKKIES .= trim ($val[0])."=". trim ($val[1])."; ";
}
@curl_setopt ( $ch , CURLOPT_COOKIE , $COKKIES." expires=Mon, 14-Apr-08 10:34:13 GMT" );
}
// если с сервера пришло cookie, то запишем его в файл $cookie_file
@curl_setopt ( $ch , CURLOPT_COOKIEJAR , $cookie_file );
@curl_setopt ( $ch , CURLOPT_COOKIEFILE , $cookie_file );
// если мы послали данные из формы, которая стоит
// на страничке $path, добавляем метод $_POST
/*if (isset($_POST) and $_SERVER["REQUEST_METHOD"]=="POST"){
@curl_setopt ( $ch , CURLOPT_POST , 1 );
@curl_setopt ( $ch , CURLOPT_POSTFIELDS , substr ( data_encode ( $_POST ), 0 , - 1 ) );
}*/
// получаем страничку $path с хедером
$tmp = @curl_exec ( $ch );
// закрываем сеанс Curl
curl_close ( $ch );
return $tmp;
}
echo CurlPage ( 'http://maps.yandex.ru/?text=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F%2C+%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0%2C+%D0%9C%D0%B8%D0%BD%D0%B8%D0%BD%D1%81%D0%BA%D0%B8%D0%B9+%D0%BF%D0%B5%D1%80%D0%B5%D1%83%D0%BB%D0%BE%D0%BA%2C+4%2F6' );
?> [/HTML]
И еще с помощью firebug'a посмотрел залоловки, вот они
[HTML]Заголовки запроса
Host maps.yandex.ru
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language ru,en-us;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Cookie yandexuid=1227030401259185272; yabs-frequency=/2/tKT_09458JoQTG2H1I4N3te0aGL1uuvd0945VFn9Vm2H1I76J470aGKy00015R9-09459rguVG2H1KVXPdu0aGM7e2ji0945OQUDVG2H1MUEPNK0aGLXLgvl0945GUowTm2H1M40//fGAH1G42/f0AH1G43; fuid01=4aecc7f128b36f39.qyTxG7QQsmHXugoPOSD3sCebNm3AHR7rYbVm54robDUIKU5nuZ-G44D-Jnm4g2mwtZNF7DjKJGx7vt9oiznJ4J7pXE41zO9iT4FZlZ1UUITyrmSf_PSzXS-ue4IJgdkJ; t=p[/HTML]
Не прошу решить эту проблему за меня. просто прошу направить на истинный путь, может укажите корректный запрос для ПС или на литературу, которую надо подчитать. Буду рад любой помощи.
А в чем проблема-то?
Для начала стоит убрать все @ перед всеми функциями и посмотреть, будут ли ошибки.
А что вообще означают @ перед функциями?
Этот оператор отключает предупреждения.Если разместить его перед любым выражением(вомзожно,включающим вызовы функций,генерирующих предупреждения),то собщения об ошибках в этом выражении будут подавлены и в окне браузера не отображены
Спасибо, тогда понятно. Ну в общем я @ отключил но все равно не получил желаемого результата.
И как посмотреть запрос который мой локальный серверпосылает серверу яндекса?
либо сниффером