При преобразовании PHP file_get_contents не удается подключить API поиска Bing с помощью Windows Azure

При попытке создать новый запрос API с помощью нового API Windows Azure на основе Bing, используя приведенный ниже код.

$url= 'https://'.$this->m_host.'/Web?Query={keyword}&Adult=%27Off%27&$top=50&$format=Atom';     

        $url=str_replace('{keyword}', urlencode($this->m_keywords), $url);

        // Replace this value with your account key
                    $accountKey = $this->key;

                    $WebSearchURL = $url;

                    $context = stream_context_create(array(
                        'http' => array(
                            'proxy' => 'tcp://127.0.0.1:8888',
                            'request_fulluri' => true,
                            'header'  => "Authorization: Basic " . base64_encode($accountKey . ":" . $accountKey)
                        )
                    ));

                    $request = $WebSearchURL;
                    $response = file_get_contents($request, 0, $context);

        print_r($response);

я получаю следующую ошибку.

Warning: file_get_contents() [function.file-get-contents]: 
Couldn't connect to server in /home/xxxxx on line 43

Warning: file_get_contents(https://api.datamarket.azure.com/ 
failed to open stream: operation failed in /home/xxxx/ bing_search.php on line 43

Любая идея, почему это не удается? или лучше использовать библиотеку CURL, чем file_get_contents()?


person mahen3d    schedule 03.07.2012    source источник


Ответы (4)


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

Просто замените ключ приложения на свой, оставьте имя пользователя как есть (например, username), так как оно игнорируется сервером.

function getBingResult($keyword)
{
    $credentials = "username:appkey";
    $url= "https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/News?Query=%27{keyword}%27". "&\$format=json";        
    $url=str_replace('{keyword}', urlencode($keyword), $url);
    $ch = curl_init();
    $headers = array(
       "Authorization: Basic " . base64_encode($credentials)
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,5);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($session, CURLOPT_VERBOSE, TRUE); 

    $rs = curl_exec($ch);
    $jsonobj = json_decode($rs);
    curl_close($ch);    
    return $jsonobj;
}

Проверка функции:

$bingResult = getBingResult("John");
foreach($bingResult->d->results as $value)
{   
    echo '<pre>'."URL:". $value->Url.'</pre>';
    echo '<pre>'."Title:". $value->Title.'</pre>';
    echo '<pre>'."Description:". $value->Description.'</pre>';   
    echo '<pre>'."Source:". $value->Source.'</pre>';   
    echo '<pre>'."Date:". $value->Date.'</pre>';   
}
person marco    schedule 11.10.2012

Для Bing API будет работать либо file_get_contents, либо CURL, вы можете использовать то, что будет работать в вашей системе и что вам удобно.

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

Я не уверен, что у вас установлено $this->m_host, но новый API Bing должен быть по адресу: https://api.datamarket.azure.com/Bing/Search/ или https://api.datamarket.azure.com/Bing/SearchWeb/. URL-адрес https://api.datamarket.azure.com/Web возвращается как недействительный.

person John C    schedule 03.07.2012
comment
как указано в этом сообщении, я прокомментировал 2 параметра [ссылка] stackoverflow.com/questions/10845672/ (stackoverflow.com/questions/10845672/) 'proxy' => 'tcp://127.0 .0.1:8888', 'request_fulluri' => true, но все же я получаю ошибку 401 - Неавторизованный доступ: доступ запрещен из-за неверных учетных данных. У вас нет разрешения на просмотр этого каталога или страницы с использованием предоставленных вами учетных данных. - person mahen3d; 03.07.2012
comment
Попробуйте перейти на страницу api.datamarket.azure.com/Bing/SearchWeb/?query. =test в браузере и введите свой ключ в качестве имени пользователя и пароля, чтобы убедиться, что у вас есть действительные учетные данные. - person John C; 03.07.2012
comment
да, это работает для прямого URL-адреса, все хорошо, просто соединение прерывается, не знаю, почему может быть проблема с сетью. - person mahen3d; 03.07.2012
comment
$context = stream_context_create(array( 'http' =› array( 'method'=›'GET', //'proxy' =› 'tcp://127.0.0.1:8888', 'request_fulluri' =› true, ' header' =› Авторизация: Базовая .base64_encode(:.$this-›key) ) )); $ запрос = $ URL; $ ответ = file_get_contents ($ запрос, 0, $ контекст); - person mahen3d; 03.07.2012
comment
Вы пробовали использовать фиктивное имя пользователя? 'header' => "Authorization: Basic " . base64_encode("test:".$this->key) - person John C; 03.07.2012

Вот рабочий пример API поиска, просто замените ключ доступа на «XXXX». Даже я потратил довольно много часов, чтобы заставить его работать с помощью cURL, но это не помогло из-за «CURLOPT_SSL_VERIFYPEER» на локальном компьютере :(

$process = curl_init('https://api.datamarket.azure.com/Bing/Search/Web?Query=%27xbox%27');
curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($process, CURLOPT_USERPWD, "username:XXXX");
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($process);

# Deliver
return $response;

# Have a great day!
curl_close($process);
person Kailash Yadav    schedule 17.04.2013

1.) Вам не нужна функция str_replace(). Используйте переменную непосредственно внутри URL:
$url= 'https://'.$this->m_host.'/Web?Query='.urlencode($this->m_keywords).'&Adult=%27Off%27&$top=50&$format=Atom';

2.) Вы определили три разные переменные с одинаковым значением:
$WebSearchURL = $url;
$request = $WebSearchURL;

Используйте только $url.

3.) base64_encode($accountKey . ":" . $accountKey) можно уменьшить до base64_encode(":" . $accountKey)

4.) Добавьте Accept-Encoding: gzip в заголовок, чтобы уменьшить трафик и увеличить скорость.

5.) Ваша проблема должна заключаться в этой строке:
'proxy' => 'tcp://127.0.0.1:8888',

Удалите его или измените на правильное значение.

person mgutt    schedule 24.02.2015