Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с file_get_contents и api Яндекс.услуг 
:(
    Опции темы
hetfield
Дата 26.1.2012, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 26.11.2007

Репутация: нет
Всего: нет



Всем привет. Делаю сервис на основе сервиса Яндекса - Яндекс.Услуги.

Получил уникальный ключ для домена, который нужно использовать в запросах, но при попытке скачать xml получаю 

Код

Warning: file_get_contents(http://api.uslugi.yandex.ru/1.0/banks?key=КЛЮЧ&region=%D0%9E%D0%B4%D0%B5%D1%81%D1%81%D0%B0) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.0 401 Unauthorized in ...


При этом, если ввести 

http://api.uslugi.yandex.ru/1.0/banks?key=...%81%D1%81%D0%B0

в адресную строку, то xml открывается

Облазил Гугл, народ пишет что ключ не правильный, что сомнительно, потому что в адресной строке открывается xml. 

В чем может быть проблема? 
PM MAIL   Вверх
$дмитрий
Дата 26.1.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 17
Всего: 45



Проблема в file_get_contents. Через сокеты отправляй так будет работать

Код

<?
function urlContent($sURL)
{
    $arURL = parse_url($sURL);
    $sQuery = $arURL['path'];
    if($arURL['query']){
        $sQuery .= '?'.$arURL['query'];
    }
    if(!$sQuery){
        $sQuery = '/';
    }
    if(!($socket = fsockopen($arURL['host'], 80, $eCode, $eText, 5))){
        return false;
    }

    $content = '';
    $headers  = "GET ".$sQuery." HTTP/1.0\r\n"
    ."Host: ".$arURL['host']."\r\n"
    ."Referer: ".$arURL['scheme']."://".$arURL['host']."\r\n"
    ."User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.6) Gecko/2009011913 MRA 5.3 (build 02557) Firefox/3.0.6\r\n"
    ."Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
    ."Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n"
    ."Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"
    ."\r\n";
    fputs($socket, $headers);
    while(!feof($socket))
    {
        $content .= fgets($socket, 128);
    }
    fclose($socket);
    return preg_replace("#.*?(\x0D\x0A){2}(.*)#sm", "$2", $content);
}

echo urlContent('http://api.uslugi.yandex.ru/1.0/banks?key=Ключ&region=%D0%9E%D0%B4%D0%B5%D1%81%D1%81%D0%B0');
?>

PM MAIL   Вверх
Sanchezzz
Дата 27.1.2012, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



умня такаежа похожая ситуация с услугами пробовал curl пишет  Invalid credentials file_get_contents с заголовками браузера тоже)

Попробую дмитрий вашу функцию.

Добавлено @ 07:06
тоже самое..

Я вот так пользовался 
Код

function YaGet2($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_REFERER , "http://" .$_SERVER['HTTP_HOST'] ); // http обязательно или сервер выдаст нам бу...  12 .04.12 9:44 update post
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array($url, 'GET'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $return = curl_exec($ch);
        if(curl_errno($ch)){
            $error = 'curl'.curl_errno($ch);
            return $error;
        }
        $http_code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
        
        if ($http_code != 200)
        {
            $error = 'http '.$http_code;
            return $error 
            . "<br>".$return ;
        } else {
            return $return;
        }
    }


    $keys = array(
        'realty.ekaraganda.kz' => 'Суда ключ'
        'realty.ekar.kz' => 'Суда ключ 2',
    );

    $sum=20000; //сума
    $period=10;   //срок 
    $currency = "KZT"; //валюта
    
    $yakey = $keys[ $_SERVER['HTTP_HOST'] ]; //вычисляем кеу
    
    $url_uslugi = 'http://api.uslugi.yandex.ru/1.0/banks/mortgages/search?'
    .'key='.$yakey
    .'&region=Караганда'
    .'&currency='.$currency
    .'&period='.$period 
    .'&sum='.$sum;


print YaGet2($url_uslugi);



Это сообщение отредактировал(а) Sanchezzz - 12.4.2012, 06:45


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
hetfield
Дата 27.1.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 26.11.2007

Репутация: нет
Всего: нет



У меня в обоих случаях пишет Invalid credentials

Написал в саппорт Яндекса, ответили вот что:

Это 401 ошибка, неправильно выполнена авторизация (см. подраздел "Использование ключа"
http://api.yandex.ru/uslugi/doc/banks-dg/concepts/apikey.xml ). Также, вероятно, неправильно написан php-код, который обращается к сервису, что возможно приводит к неправильному формирования URL.
PM MAIL   Вверх
zammar
Дата 27.1.2012, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



А за чем вам file_get_contents? Да и сокеты зачем?
Вам же нужно с xml работать?  Ну так simplexml_load_file вам в помощь.

Скиньте еще сюда саму строку запроса, и то как вы ее формируете. Так как я тоже думаю что дело именно в самой строке запроса.

И почему регион имеет такой формат?
Код

/banks?key=Ключ&region=%D0%9E%D0%B4%D0%B5%D1%81%D1%81%D0%B0


Я с API не знаком но думаю там должно быть что-то вроде ru или en

Это сообщение отредактировал(а) zammar - 27.1.2012, 20:05
PM   Вверх
hetfield
Дата 30.1.2012, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 26.11.2007

Репутация: нет
Всего: нет



Делаю просто так:  

Код

$xml = simplexml_load_file('http://api.uslugi.yandex.ru/1.0/banks?key=CFs72AACAAABMosZdKcV9FLQoz9G0Hy6zbByF1NOKyErZg&region=Одесса');



пишет: 
Код


Warning: simplexml_load_file(http://api.uslugi.yandex.ru/1.0/banks?key=CFs72AACAAABMosZdKcV9FLQoz9G0Hy6zbByF1NOKyErZg&region=%D0%9E%D0%B4%D0%B5%D1%81%D1%81%D0%B0) 
[function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.0 401 Unauthorized in ....

Warning: simplexml_load_file() [function.simplexml-load-file]: 
I/O warning : failed to load external entity 
"http://api.uslugi.yandex.ru/1.0/banks?key=CFs72AACAAABMosZdKcV9FLQoz9G0Hy6zbByF1NOKyErZg&region=%D0%9E%D0%B4%D0%B5%D1%81%D1%81%D0%B0" ....


Добавлено через 10 минут и 40 секунд
Если сделать так:

Код

header("Location: http://api.uslugi.yandex.ru/1.0/banks?key=CFs72AACAAABMosZdKcV9FLQoz9G0Hy6zbByF1NOKyErZg&region=%D0%9E%D0%B4%D0%B5%D1%81%D1%81%D0%B0"); 


то в браузере xml нормально открывается....

если, например так

Код

header('Content-Type: text/html; charset=utf-8');

$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://api.uslugi.yandex.ru/1.0/banks?key=CFs72AACAAABMosZdKcV9FLQoz9G0Hy6zbByF1NOKyErZg&region=%D0%9E%D0%B4%D0%B5%D1%81%D1%81%D0%B0');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data=curl_exec($ch);
curl_close($ch);

$xml=simplexml_load_string($data);

print_r($xml);



то ошибка, Invalid credentials, не правильный ключ

Это сообщение отредактировал(а) hetfield - 30.1.2012, 16:52
PM MAIL   Вверх
Sanchezzz
Дата 12.4.2012, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Наконец то добрался до услуг Яндекса
Кстати я решил проблему с неверным ключом в рефери не было http

переделал отправку гета


Код


   // ключи для доменов-поддоменов если есть несколько как в моем случи
    $keys = array(
        'realty.site.kz' => 'СУДА КЛЮЧ' 
    );
    //тестовые данные
    $sum =   !Empty($_POST['sum'])?  $_POST['sum']: 500000;
    $period= !Empty($_POST['period'])?  $_POST['period'] . " years" : "year";
    $currency = !empty($_POST['currency'])? $_POST['currency'] : "KZT";
    //узнаем ключ по хосту сайта
    $yakey = $keys[ $_SERVER['HTTP_HOST'] ];


    $url_uslugi = 'http://api.uslugi.yandex.ru/1.0/banks/mortgages/search?'
    .http_build_query(
        array(
        'key'=>$yakey,
        'region'=>'Караганда',
        'currency'=>$currency,
        'period'=>$period ,
        'sum'=>$sum
        )
    );

   // запрашиваем данные 
    $data  = YaGet2($url_uslugi);
  // парсим через XMLReader() для криворуких можно через  simple xml...
  //    
    $reader = new XMLReader();
    $reader->xml($data);
    $reader->read();
 

Единственное я не понял что делать с  period параметром 
Срок ипотеки.   документация 
Допустимые значения:
  • n days (только для депозитов)
  • n months
  • n years
  • year
если year оставляешь то норм если пишешь число год ошибка если years ошибка.








Это сообщение отредактировал(а) Sanchezzz - 12.4.2012, 07:07


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
BackToSeo
Дата 19.4.2012, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 19.4.2012

Репутация: нет
Всего: нет



проблема с доступом к данным скриптом
 
при переходе с внутренней страницы сайта по ссылке
http://api.uslugi.yandex.ru/1.0/banks/depo...iod=12%20months
 
браузер нормально открывает xml данные
 
для доступа используется следующий код php:
Код

<?php
if( $curl = curl_init() ) {
    curl_setopt($curl, CURLOPT_URL, 'http://api.uslugi.yandex.ru/1.0/banks/deposits/search?key=fw5Z-wACAAABNsDe5NehG_o3IvHnQLDsJHUABIGCLYFm3w&region=%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80&sum=100000&currency=RUB&period=12%20months');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($curl, CURLOPT_REFERER, "http://mysite.com/");
    $out = curl_exec($curl);
    echo $out;

    curl_close($curl);
  }
 ?>

 
в ответ получаю - 403 Доступ запрещён
 
 
если заменить в коде адреса сайтов на другие, то скрипт отрабатывает нормально.
 
 
Подскажите в чем может быть проблема. представленные в интернете решиния у меня также не заработали :(


Это сообщение отредактировал(а) BackToSeo - 19.4.2012, 09:01
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.