API поиска Bing и Azure

Я пытаюсь программно выполнить поиск в поисковой системе Microsoft Bing.

Вот мое понимание:

  • Был Bing Search API 2.0, который скоро будет заменен (1 августа 2012 г.)
  • Новый API известен как Windows Azure Marketplace.
  • Вы используете разные URL-адреса для двух.

В старом API (Bing Search API 2.0) вы указываете ключ (идентификатор приложения) в URL-адресе, и этот ключ будет использоваться для аутентификации запроса. Пока у вас есть ключ в качестве параметра в URL-адресе, вы можете получать результаты.

В новом API (Windows Azure Marketplace) вы НЕ включаете ключ (ключ учетной записи) в URL-адрес. Вместо этого вы вводите URL-адрес запроса, после чего сервер запрашивает ваши учетные данные. При использовании браузера появится всплывающее окно с запросом имени / пароля и пароля. Инструкция заключалась в том, чтобы оставить имя учетной записи пустым и вставить свой ключ в поле пароля.

Хорошо, я сделал все это и могу видеть результаты своего поиска в формате JSON на странице своего браузера.

Как мне сделать это программно на PHP? Я попытался найти документацию и образец кода из библиотеки Microsoft MSDN, но либо искал не в том месте, либо ресурсы там крайне ограничены.

Кто-нибудь может сказать мне, как вы выполняете часть «введите ключ в поле пароля во всплывающем окне» в PHP, пожалуйста?

Заранее большое спасибо.


person Gapton    schedule 01.06.2012    source источник
comment
А как насчет Translate api через Azure? любые ссылки на советы были бы мне очень признательны.   -  person Petr Velký    schedule 01.09.2012


Ответы (7)


Документация по новым сервисам может показаться немного интересной - особенно в кроличьей лабиринте MSDN. Наиболее четкое объяснение, которое я могу найти, можно найти в Руководстве по миграции из этого страница API поиска Bing. Лучше всего в конце руководства по миграции есть хороший простой пример на PHP.

РЕДАКТИРОВАТЬ: Хорошо, руководство по миграции является отправной точкой, но это не лучший пример. Вот два метода, которые мне подходят (без вмешательства прокси, межсетевых экранов и т. Д.):

Использование file_get_contents

Примечание. Чтобы это работало, необходимо включить allow_url_fopen. Вы можете использовать ini_set (или изменить php.ini и т. Д.), Если это не так.

if (isset($_POST['submit'])) 
{

    // Replace this value with your account key
    $accountKey = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';            
    $ServiceRootURL =  'https://api.datamarket.azure.com/Bing/Search/';                    
    $WebSearchURL = $ServiceRootURL . 'Web?$format=json&Query=';

    $cred = sprintf('Authorization: Basic %s', 
      base64_encode($accountKey . ":" . $accountKey) );

    $context = stream_context_create(array(
        'http' => array(
            'header'  => $cred
        )
    ));

    $request = $WebSearchURL . urlencode( '\'' . $_POST["searchText"] . '\'');

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

    $jsonobj = json_decode($response);

    echo('<ul ID="resultList">');

    foreach($jsonobj->d->results as $value)
    {                        
        echo('<li class="resultlistitem"><a href="' 
                . $value->URL . '">'.$value->Title.'</a>');
    }

    echo("</ul>");
}

Использование cURL

Если cURL установлен, что в наши дни является нормальным явлением:

<?php
  $query = $_POST['searchText'];

  $accountKey = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
  $serviceRootURL =  'https://api.datamarket.azure.com/Bing/Search/';  
  $webSearchURL = $serviceRootURL . 'Web?$format=json&Query=';

  $request = $webSearchURL . "%27" . urlencode( "$query" ) . "%27";

  $process = curl_init($request);
  curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  curl_setopt($process, CURLOPT_USERPWD,  "$accountKey:$accountKey");
  curl_setopt($process, CURLOPT_TIMEOUT, 30);
  curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
  $response = curl_exec($process);
  $response = json_decode($response);

  echo "<ol>";
  foreach( $response->d->results as $result ) {
    $url = $result->Url;
    $title = $result->Title;

    echo "<li><a href='$url'>$title</a></li>";
  }
  echo "</ol>";
?>

[WTS] изменил SearchWeb на Search.

person John C    schedule 01.06.2012
comment
Спасибо, я использовал их образец PHP, но мне все равно не удается открыть поток: Ошибка подключения отклонена. Интересно, правильно ли выставлен заголовок - person Gapton; 01.06.2012
comment
Вы также использовали их прокси-линию? - person John C; 01.06.2012
comment
В качестве альтернативы вы можете посмотреть curl вместо file_get_contents. - person John C; 01.06.2012
comment
По сути, это правильно, но в качестве примера можно было бы упростить. Я добавил к своему ответу два способа сделать это. - person John C; 02.06.2012
comment
похоже, что автор задал новый вопрос и сам ответил на него: stackoverflow.com/q/10845672/628267 gg - person John C; 05.06.2012
comment
К вашему сведению: логин для аутентификации может оставаться пустым. одна проблема, с которой я столкнулся с java: bing предполагает, что вы используете% 20, а не +, и проверяете поток ошибок, поскольку иногда я пропускал эти уродливые апострофы вокруг ввода параметра, но вы получите соответствующее сообщение - person Karussell; 03.07.2012
comment
Как бы вы выполняли поиск изображений с помощью Bing? Изменится ли $WebSearchURL, и если да, то на что это изменится? - person Mike Warren; 03.12.2014
comment
С первого взгляда вам нужно будет изменить $serviceRootURL на https://api.datamarket.azure.com/Bing/Search/ и $webSearchURL, чтобы закончить на Image?$format=json&Query=. Если вам нужна дополнительная информация, я предлагаю задать новый вопрос. - person John C; 03.12.2014
comment
/ Bing / SearchWeb / должно быть / Bing / Search / - это заставило меня работать - person Kristopher Windsor; 20.10.2015

Ничего из вышеперечисленного у меня не сработало. Я запускаю MAMP, это может быть актуально. Попробуйте следующее:


$accountKey = '=';


function sitesearch ($query, $site, $accountKey, $count=NULL){
  // code from http://go.microsoft.com/fwlink/?LinkID=248077

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

    $ServiceRootURL =  'https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/News?Market=%27en-GB%27&';
    $WebSearchURL = $ServiceRootURL . '$format=json&Query=';  

    $request = $WebSearchURL . urlencode("'$query'"); // note the extra single quotes
    if ($count) $request .= "&\$top=$count"; // note the dollar sign before $top--it's not a variable!
    return json_decode(file_get_contents($request, 0, $context), true);
}


$q = "query";

if ($q){
  // get search results
  $articles = sitesearch ($q, $_SERVER['HTTP_HOST'], $accountKey , 100);

  foreach($articles['d']['results'] as $article) {
      echo " <p>".$article['Title'].'</p>';
      echo " <p>".$article['Description'].'</p>';
      echo " <p>".$article['Source'].'</p>';
      echo " <p>".strtotime($article['Date']).'</p>';
  }



}

ОТ: http://bililite.com/blog/2012/06/05/new-bing-api/

person Jim    schedule 30.10.2012
comment
обратите внимание, что источник установлен на News, здесь $ServiceRootURL = 'https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/News?Market=%27en-GB%27&'; - person Fallen; 22.07.2014

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

$acctKey = 'Your account key here';
$rootUri = 'https://api.datamarket.azure.com/Bing/Search';
$query = 'Kitchen';
$serviceOp ='Image';
$market ='en-us';
$query = urlencode("'$query'");
$market = urlencode("'$market'");
$requestUri = "$rootUri/$serviceOp?\$format=json&Query=$query&Market=$market";
$auth = base64_encode("$acctKey:$acctKey");
$data = array(  
            'http' => array(
                        'request_fulluri' => true,
                        'ignore_errors' => true,
                        'header' => "Authorization: Basic $auth"
                        )
            );
$context = stream_context_create($data);
$response = file_get_contents($requestUri, 0, $context);
$response=json_decode($response);
echo "<pre>";
print_r($response);
echo "</pre>";
person kishore chowdary    schedule 28.08.2014
comment
Спасибо. Наконец-то кто-то внес немного здравого смысла в этот API. Я предполагаю, что все предыдущие ответы работали в какой-то момент времени, но Microsoft продолжает менять вещи. - person Nate Bunney; 09.06.2015
comment
Этот сработал;) Спасибо, что поделились, документация на bing sux. - person Sagive SEO; 11.01.2016

http://www.guguncube.com/2771/python-using-the-bing-search-api

он содержит код Python для запроса bing, и это соответствует последнему новому API (Windows Azure Marketplace)

# -*- coding: utf-8 -*-
import urllib
import urllib2
import json

def main():
    query = "sunshine"
    print bing_search(query, 'Web')
    print bing_search(query, 'Image')

def bing_search(query, search_type):
    #search_type: Web, Image, News, Video
    key= 'YOUR_API_KEY'
    query = urllib.quote(query)
    # create credential for authentication
    user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; FDM; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 1.1.4322)'
    credentials = (':%s' % key).encode('base64')[:-1]
    auth = 'Basic %s' % credentials
    url = 'https://api.datamarket.azure.com/Data.ashx/Bing/Search/'+search_type+'?Query=%27'+query+'%27&$top=5&$format=json'
    request = urllib2.Request(url)
    request.add_header('Authorization', auth)
    request.add_header('User-Agent', user_agent)
    request_opener = urllib2.build_opener()
    response = request_opener.open(request) 
    response_data = response.read()
    json_result = json.loads(response_data)
    result_list = json_result['d']['results']
    print result_list
    return result_list

if __name__ == "__main__":
    main()
person Ritesh    schedule 09.04.2014
comment
Вы должны скопировать / вставить код, а не просто связать его, в случае, если он исчезнет или будет перемещен в будущем - person AlexB; 09.04.2014
comment
Большое спасибо за добавление кода Python. Ссылка на документацию Azure дает 404 :), так что это очень помогло. Вы хоть представляете, как он не может работать с проектом django_pipes .. - person pranshus; 21.06.2014

Не забудьте написать это:

base64_encode("ignored:".$accountKey)

вместо:

base64_encode($accountKey . ":" . $accountKey)
person Andrès Mauricio Peña Carmona    schedule 27.07.2012
comment
Судя по моему тестированию, оба варианта работают, но я понимаю, что это может варьироваться от системы к системе. - person John C; 31.07.2012

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

$url = 'https://api.datamarket.azure.com/Bing/Search/Web?Query=%27xbox%27';
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($process, CURLOPT_USERPWD, base64_encode("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
comment
Это работает !, КЛЮЧ здесь это имя пользователя: ключ - это то, что должно быть в кодировке base 64 в базовом заголовке аутентификации, а не только в ключах :) - person Rajiev Timal; 22.08.2014

Вот пример того, как вызвать Bing / Azure API с помощью библиотеки Unirest.

require_once '/path/to/unirest-php/lib/Unirest.php';

$accountKey = "xxx";
$searchResults = Unirest::get("https://api.datamarket.azure.com/Bing/Search/v1/Composite",
    array(),
    array(
        'Query' => '%27Microsoft%27',
        'Sources' => '%27web%2Bimage%2Bvideo%2Bnews%2Bspell%27',
        '$format' => 'json',
    ), $accountKey, $accountKey
);

// Results are here:
$objectArray = $searchResults->body->d->results;
$rawJson = $searchResults->raw_body;

Вы можете опустить параметр Source, указав его в URL: https://api.datamarket.azure.com/Bing/Search/v1/Webили https://api.datamarket.azure.com/Bing/Search/v1/Image

Примечание: параметры в URL-адресе запроса чувствительны к регистру. В Bing они начинаются с заглавной буквы.

person Websirnik    schedule 20.11.2013