Google API Block Example

fx - February 25, 2004 - 16:46

Recently I went looking for a snippet of PHP that provided access to Google's Web Services API, so that I could have a block on my blog which automatically generated google search results based on the page title (or whatever).

I found one, but it didn't work. I fixed it and set it up as a Drupal block; here it is:

// requires PEAR SOAP client
include("SOAP/Client.php");

// Adjust query to suit your purposes.
$sql = "SELECT title FROM node
        WHERE type='blog' AND promote=1 AND status=1
        ORDER BY created desc limit 1";
$obj = db_fetch_object(db_query($sql));

// first, try and use page title
// note that when reading a blog or story node, the page
// title is the node title.. so
$qstr = drupal_get_title();

// if blank, skip the block
if ($qstr == '')
  return;  // or apply a default $qstr = 'something';


$output = "Google results for '".$subj."':<br/><br/>";

// Adjust the query prior to SOAP call...
$qstr = $qstr . ' -mydomainname';  // recommend excluding your domain name

$key = 'googleapikey';

$s = new SOAP_Client('http://api.google.com/GoogleSearch.wsdl');

// Adjust further parameters here (see google for docs)
$parameters = array(
    'key' => $key, 'q' => $qstr,
    'start' => 0, 'maxResults' => 10,
    'filter' => false, 'restrict' => '',
    'safeSearch' => false, 'lr' => '',
    'ie' => '', 'oe' => '');


// Make the SOAP call.
$googleResults = $s->call('doGoogleSearch', $parameters, 'urn:GoogleSearch');


// Handle error and build results list.
if (get_class($googleResults) == 'pear_error') {
        $resultMessage = $googleResults->message;
        $output .= "<br/>ERROR: $resultMessage<br/>";
} else {
        $resultCount = $googleResults->estimatedTotalResultsCount;
        $resultElements = $googleResults->resultElements;
        $googleHits = '';
        if ($count > 0) {
                foreach ($resultElements as $item) {
                        $size = $item->cachedSize;
                        $title = $item->title;
                        $url = $item->URL;
                        $snippet = $item->snippet;

                        $googleHits .= "<a href=\"$url\" alt=\"$snippet\">$title</a><br/><br/>";
                }
        }
        $output .= $googleHits;
}

return $output;

Sorry, one line of that examp

fx - February 25, 2004 - 16:50

Sorry, one line of that example was mangled, it should be:

                        $googleHits .= "<a href=\"$url\" alt=\"$snippet\">$title</a>";

More info on how SOAP should be configured

matteo - February 26, 2004 - 13:24

I would like to try your block, but I have no experience with SOAP installation.
Could you please help me telling what components I should install under a standard PHP 4.3.4 installation (development on W2K, production on Linux) ??

My installation is:

C:\PHP for PHP
D:\drupal-cvs for Drupal

Which componentsw should I install, and where ???

thanks in advance for your kindness...

Matteo
mailto:webmaster@cantincoro.org

needed extensions

fx - February 27, 2004 - 03:04

NP -- you'll probably find this useful: http://pear.php.net/ and more directly: http://pear.php.net/packages.php

Lots of info there on accessing and installing PHP extensions.

You need these to use that google block:

SOAP
HTTP
Url

Configure your include_path to point to wherever you put them. /usr/local/lib/php/ is a good default location. You might need to edit your .htaccess in your Drupal install directory, to include that path in include_path.

This is only slightly related

tdailey - February 27, 2004 - 03:37

This is only slightly related, but I've been using this script (hosted on our internal site, rather that stealing bandwidth from the author)

http://www.voidstar.com/gnews2rss.php

It generates RSS feeds from news.google.com queries. The feeds work great in Drupal. Quite handy.

Easier to read with highlighted PHP tags

joel_guesclin - November 15, 2004 - 16:10

<?php
// requires PEAR SOAP client

include("SOAP/Client.php");

// Adjust query to suit your purposes.
$sql = "SELECT title FROM node WHERE type='blog' AND promote=1 AND status=1 ORDER BY created desc limit 1";
$obj = db_fetch_object(db_query($sql));

// first, try and use page title
// note that when reading a blog or story node, the page
// title is the node title.. so
$qstr = drupal_get_title();

// if blank, skip the block
if ($qstr == '') return; // or apply a default $qstr = 'something';

$output = "Google results for '".$subj."':";

// Adjust the query prior to SOAP call...
$qstr = $qstr . ' -mydomainname'; // recommend excluding your domain name

$key = 'googleapikey';

$s = new SOAP_Client('http://api.google.com/GoogleSearch.wsdl');

// Adjust further parameters here (see google for docs)
$parameters = array(
   
'key' => $key, 'q' => $qstr,
   
'start' => 0, 'maxResults' => 10,
   
'filter' => false, 'restrict' => '',
   
'safeSearch' => false, 'lr' => '',
   
'ie' => '', 'oe' => '');

// Make the SOAP call.
$googleResults = $s->call('doGoogleSearch', $parameters, 'urn:GoogleSearch');

// Handle error and build results list.
if (get_class($googleResults) == 'pear_error') {
   
$resultMessage = $googleResults->message;
   
$output .= "ERROR: $resultMessage";
    }
else {
   
$resultCount = $googleResults->estimatedTotalResultsCount;
   
$resultElements = $googleResults->resultElements;
   
$googleHits = '';
    if (
$count > 0) {
        foreach (
$resultElements as $item) {
           
$size = $item->cachedSize;
           
$title = $item->title;
           
$url = $item->URL;
           
$snippet = $item->snippet;
           
$googleHits .= "<a href=\"$url\" alt=\"$snippet\">$title</a>";
            }
        }
   
$output .= $googleHits;
    }
return
$output;
?>

This is the nusoap version

Gunny - April 18, 2005 - 21:06

This is the nusoap version of the above block. You can download nusoap from sourceforge.

<?php
   
require_once('nusoap/lib/nusoap.php');

   
$sql = "SELECT title FROM node WHERE type='blog' AND promote=1 AND status=1 ORDER BY created desc limit 1";
   
$obj = db_fetch_object(db_query($sql));

   
$qstr = drupal_get_title();

    if (
$qstr == '') return;

   
$output = "Google results for '".$obj."':";
   
   
$output = "Google results for '".$qstr."':";
   

   
$qstr = $qstr . ' -mydomainname';
   
$key = 'IjizdChQFHLgltw7BD2/TLysmX32A41T';

   
$oGoogleSearch = new soapclient('http://api.google.com/GoogleSearch.wsdl','wsdl');


   
$aParameters = array(
       
'key' => $key,
       
'q' => '$qstr',
       
'start' => 0,
       
'maxResults' => 10,
       
'filter' => 'false',
       
'restrict' => '',
       
'safeSearch' => 'false',
       
'lr' => '',
       
'ie' => '',
       
'oe' => ''
   
);


           
$googleResults = $oGoogleSearch->call('doGoogleSearch', $aParameters, 'urn:GoogleSearch');

        if (
$err= $googleResults->getError())
        {
           
$output .= "<br>An error occurred!<br>";
           
$output .= " Error: $err<br>\n";
        return
$output;       
        }

        else {

       
$resultCount = $googleResults->estimatedTotalResultsCount;
       
$resultElements = $googleResults->resultElements;
       
$googleHits = '';
        if (
$count > 0) {
               foreach (
$resultElements as $item) {
               
$size = $item->cachedSize;
               
$title = $item->title;
               
$url = $item->URL;
               
$snippet = $item->snippet;
               
$googleHits .= "<a href=\"$url\" alt=\"$snippet\">$title</a>";
                }
            }
       
$output .= $googleHits;
        }
    return
$output;   
?>

 
 

Drupal is a registered trademark of Dries Buytaert.