php 必应搜索 API 和 Azure

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10844463/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 23:12:32  来源:igfitidea点击:

Bing search API and Azure

phpsearchbing

提问by Gapton

I am trying to programatically perform a search on Microsoft Bing search engine.

我正在尝试以编程方式在 Microsoft Bing 搜索引擎上执行搜索。

Here is my understanding:

以下是我的理解:

  • There was a Bing Search API 2.0 , which will be replaced soon (1st Aug 2012)
  • The new API is known as Windows Azure Marketplace.
  • You use different URL for the two.
  • 有一个 Bing Search API 2.0 ,它将很快被替换(2012 年 8 月 1 日)
  • 新的 API 称为 Windows Azure Marketplace。
  • 您对两者使用不同的 URL。

In the old API (Bing Search API 2.0), you specify a key (Application ID) in the URL, and such key will be used to authenticate the request. As long as you have the key as a parameter in the URL, you can obtain the results.

在旧 API (Bing Search API 2.0) 中,您在 URL 中指定一个密钥(应用程序 ID),该密钥将用于对请求进行身份验证。只要你在 URL 中有 key 作为参数,就可以获得结果。

In the new API (Windows Azure Marketplace), you do NOT include the key (Account Key) in the URL. Instead, you put in a query URL, then the server will ask for your credentials. When using a browser, there will be a pop-upasking for a/c name and password. Instruction was to leave the account name blank and insert your key in the password field.

在新的 API (Windows Azure Marketplace) 中,您不会在 URL 中包含密钥(帐户密钥)。相反,您输入一个查询 URL,然后服务器将询问您的凭据。使用浏览器时,会弹出一个窗口,要求输入 a/c 名称和密码。说明是将帐户名称留空并在密码字段中插入您的密钥。

Okay, I have done all that and I can see a JSON-formatted results of my search on my browser page.

好的,我已经完成了所有这些,我可以在浏览器页面上看到 JSON 格式的搜索结果。

How do I do this programmatically in PHP? I tried searching for the documentation and sample code from Microsoft MSDN library, but I was either searching in the wrong place, or there are extremely limited resources in there.

如何在 PHP 中以编程方式执行此操作?我尝试从 Microsoft MSDN 库中搜索文档和示例代码,但我要么在错误的地方搜索,要么那里的资源极其有限。

Would anyone be able to tell me how do you do the "enter the key in the password field in the pop-up" part in PHP please?

谁能告诉我您如何在 PHP 中执行“在弹出窗口的密码字段中输入密钥”部分?

Thanks alot in advance.

非常感谢提前。

回答by John C

Documentation for new services can get a bit interesting - especially in the rabbit-warren of MSDN. The most clear explanation I can find is on the Migration Guidefrom this Bing Search APIpage. Best of all the migration guide has a nice simple example in PHP towards the end.

新服务的文档可能会变得有点有趣——尤其是在 MSDN 的兔子沃伦中。我能找到的最清楚的解释是在这个Bing Search API页面的迁移指南中。最重要的是,迁移指南最后有一个很好的简单 PHP 示例。

EDIT: Alright, the migration guide is a starting point, but it isn't the best example. Here are two methods that work for me (no proxy, firewalls etc. interfering):

编辑:好的,迁移指南是一个起点,但它不是最好的例子。这里有两种对我有用的方法(没有代理、防火墙等干扰):

Using file_get_contents

使用 file_get_contents

Note: 'allow_url_fopen' needs to be enabled for this to work. You can use ini_set(or change php.ini etc.) if it isn't.

注意:需要启用“ 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>");
}

Using cURL

使用卷曲

If cURL is installed, which is normal these days:

如果安装了 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] changed SearchWeb to Search.

[WTS] 将 SearchWeb 更改为 Search。

回答by Jim

None of the above worked for me. Im running MAMP, this may be relevant. Try the below:

以上都不适合我。我正在运行 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>';
  }



}


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

来自:http: //bililite.com/blog/2012/06/05/new-bing-api/

回答by kishore chowdary

you can use bellow code to get bing search results

您可以使用波纹管代码来获取 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>";

回答by Ritesh

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

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

it contains python code to query the bing and this is according to latest new API (Windows Azure Marketplace)

它包含用于查询 bing 的 python 代码,这是根据最新的新 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()

回答by Kailash Yadav

Here is a working example of the Search API just replace "XXXX" with your access key. Even I wasted quite a few hours trying to get it to work using cURL but it was failing because of "CURLOPT_SSL_VERIFYPEER" on local :( - so make sure your cURL opts are set properly.

这是搜索 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);

回答by Andrès Mauricio Pe?a Carmona

Don't forget to put this:

不要忘记把这个:

base64_encode("ignored:".$accountKey)

instead of:

代替:

base64_encode($accountKey . ":" . $accountKey)

回答by Websirnik

Here is the example of how to call Bing/Azure API using Unirest library.

以下是如何使用Unirest 库调用 Bing/Azure API 的示例

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;

You can omit Sourceparameter by defining it in the URL: https://api.datamarket.azure.com/Bing/Search/v1/Webor https://api.datamarket.azure.com/Bing/Search/v1/Image

您可以Source通过在 URL 中定义来省略参数:https://api.datamarket.azure.com/Bing/Search/v1/Webhttps://api.datamarket.azure.com/Bing/Search/v1/Image

Note: parameters in request URL are case-sensitive. For Bing they start with a capital letter.

注意:请求 URL 中的参数区分大小写。对于 Bing,它们以大写字母开头。