必应搜索 API 和 Azure

2022-08-30 15:59:45

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

这是我的理解:

  • 有一个必应搜索 API 2.0,它将很快被替换(2012 年 8 月 1 日)
  • 新的API被称为Windows Azure Marketplace。
  • 您为两者使用不同的 URL。

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

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

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

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

任何人都可以告诉我,你如何在PHP中做“在弹出窗口的密码字段中输入密钥”部分?

提前非常感谢。


答案 1

新服务的文档可能会变得有点有趣 - 特别是在MSDN的兔子沃伦中。我能找到的最清晰的解释是在此必应搜索 API 页面的迁移指南上。最重要的是,迁移指南在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。


答案 2

以上这些都不适合我。我正在运行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/


推荐