API поиска Bing и Azure
Я пытаюсь программно выполнить поиск в поисковой системе Microsoft Bing.
Вот мое понимание:
- Был API поиска Bing 2.0, который скоро будет заменен (1 августа 2012 г.)
- Новый API известен как Windows Azure Marketplace.
- Вы используете разные URL для двух.
В старом API (API поиска Bing 2.0) вы указываете ключ (идентификатор приложения) в URL-адресе, и этот ключ будет использоваться для аутентификации запроса. Пока у вас есть ключ в качестве параметра в URL, вы можете получить результаты.
В новом API (Windows Azure Marketplace) вы НЕ включаете ключ (ключ учетной записи) в URL. Вместо этого вы вводите URL-адрес запроса, а затем сервер запрашивает ваши учетные данные. При использовании браузера появится всплывающее окно с запросом имени и пароля. Инструкция состояла в том, чтобы оставить имя учетной записи пустым и вставить свой ключ в поле пароля.
Хорошо, я сделал все это и вижу результаты поиска в формате JSON на странице браузера.
Как мне сделать это программно в PHP? Я пытался найти документацию и пример кода в библиотеке Microsoft MSDN, но я искал не в том месте, или там очень ограниченные ресурсы.
Может ли кто-нибудь сказать мне, как вы выполняете в PHP часть "введите ключ в поле пароля во всплывающем окне"?
Заранее большое спасибо.
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 на Поиск.
Ничто из вышеперечисленного не помогло мне. Я бегу 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>';
}
}
Вы можете использовать приведенный ниже код, чтобы получить результаты поиска 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>";
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()
Вот рабочий пример 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);
Не забудьте поставить это:
base64_encode("ignored:".$accountKey)
вместо:
base64_encode($accountKey . ":" . $accountKey)
Вот пример вызова API Bing/Azure с использованием библиотеки 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 они начинаются с заглавной буквы.