Bing search API and Azure

33,991

Solution 1

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 Guide from this Bing Search API page. Best of all the migration guide has a nice simple example in PHP towards the end.

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

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.

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:

<?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.

Solution 2

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


$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/

Solution 3

you can use bellow code to get bing search results

$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>";

Solution 4

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)

# -*- 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()

Solution 5

Don't forget to put this:

base64_encode("ignored:".$accountKey)

instead of:

base64_encode($accountKey . ":" . $accountKey)
Share:
33,991

Related videos on Youtube

Gapton
Author by

Gapton

Updated on February 16, 2020

Comments

  • Gapton
    Gapton about 4 years

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

    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.

    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.

    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-up asking for a/c name and password. Instruction was to leave the account name blank and insert your key in the password field.

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

    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.

    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?

    Thanks alot in advance.

    • Petr Velký
      Petr Velký over 11 years
      And what about Translate api via Azure ? any tips links would me much appreciated.
  • Gapton
    Gapton almost 12 years
    Thanks I used their PHP sample but I keep getting failed to open stream: Connection refused error. I wonder if the header has been set correctly
  • John C
    John C almost 12 years
    Did you also use their proxy line?
  • John C
    John C almost 12 years
    Alternatively you could have a look at curl instead of file_get_contents.
  • John C
    John C almost 12 years
    It is in essence correct, but as an example it could have been simplified. I've added two ways of doing it to my answer.
  • John C
    John C almost 12 years
    it would appear the author made a new question and answered it himself: stackoverflow.com/q/10845672/628267 gg
  • Karussell
    Karussell almost 12 years
    FYI: the login for the authenication can stay empty. one problem I had with java: bing assumes you are using %20 and not + and check the error stream as sometimes I missed those ugly apostrophes around the parameter input, but you'll get a message accordingly
  • John C
    John C almost 12 years
    From my testing either works, but I understand this may vary from system to system.
  • AlexB
    AlexB about 10 years
    You should copy/paste the code instead of just linked it, in case of it disapears or be moved in the future
  • pranshus
    pranshus almost 10 years
    Thanks a lot for adding the python code. The Azure documentation link is giving 404 :) so it helped a lot. Do you have any idea as to how cant his work with the django_pipes project ..
  • Fallen
    Fallen almost 10 years
    note that the source is set to News, here $ServiceRootURL = 'https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/N‌​ews?Market=%27en-GB%‌​27&';
  • Rajiev Timal
    Rajiev Timal over 9 years
    This works!, the KEY here is that "username:key" is what should be base 64 encoded in the basic auth header and not just "key" :)
  • Mike Warren
    Mike Warren over 9 years
    How would you do image search with Bing? Would $WebSearchURL change, and if so, what would it change to?
  • John C
    John C over 9 years
    At a glance you'd need to change $serviceRootURL to https://api.datamarket.azure.com/Bing/Search/ and $webSearchURL to end with Image?$format=json&Query=. If you need more information I'd suggest posting a new question.
  • Nate Bunney
    Nate Bunney almost 9 years
    Thank you. Finally someone bringing a shred of sanity to this API. My guess is that all of the previous responses worked at one point in time but Microsoft keeps changing stuff.
  • Kristopher Windsor
    Kristopher Windsor over 8 years
    /Bing/SearchWeb/ should be /Bing/Search/ -- that got it working for me
  • Sagive
    Sagive over 8 years
    This one worked ;) thanks for sharing, the documentation at bing sux.