Google Search API

From Chickenfoot Script Repository

// ==UserScript==
// @name Google Search API
// @when Pages Match
// @description javascript wrapper for google's web search api
// @include *
// ==/UserScript==

 /**
  * GoogleSearch.js, version 0.9
  *
  * This is a JavaScript wrapper for Google's Web Search API:
  * 
  *   http://www.google.com/apis/
  *
  * It uses Mozilla's SOAP API, so this JavaScript can only be used in
  * Mozilla or Firefox. Further, because using SOAP makes
  * calls to web pages in a different domain, this code cannot be
  * executed in the sandbox of a webpage; it needs to be run in a
  * trusted environment. For example, it can be used in a Firefox extension
  * or as part of a Chickenfoot script.
  *
  * The majority of the code was generated from the WSDL file using wsdl2js:
  *
  *   http://www.bolinfest.com/wsdl2js/
  *
  * As you would expect, the generated code is not documented and the generated
  * function names are somewhat awkward. To make the API easier to use, I
  * have wrapped some common operations with these functions:
  *
  * getGoogleLicenseKey()
  * getGoogleSearchResults()
  * getGoogleSpellingSuggestion()
  * getGoogleCachedPage()
  *
  * To start using this library, you must get a license key for Google's
  * Web Search API from http;//www.google.com/apis/ Once you have your key,
  * override getGoogleLicenseKey() so it returns your key. This key
  * will allow you to make 1000 queries per day through the API.
  *
  * Alternatively, you can create a preference in about:config named
  * google.GoogleSearchLicenseKey whose value is the key instead of editing
  * getGoogleLicenseKey().
  *
  * (c) 2006 Michael Bolin, bolinfest@gmail.com
  * http://www.bolinfest.com/wsdl2js/
  */
 
 /**
  * Returns the Google Web API license key to be used by this library.
  * To obtain a license key, visit http://www.google.com/apis/
  *
  * You can either redefine this function to return the key or create a
  * preference in about:config named google.GoogleSearchLicenseKey whose value is the key.
  *
  * @return {string} license key, which looks something like: 4hMyl85QFtKx17wxuHkb/RW6H3abIl1I
  */
 function getGoogleLicenseKey() {
   var branch = getGoogleLicenseKey.PREF_BRANCH;
   if (branch.prefHasUserValue('GoogleSearchLicenseKey')) {
     return branch.getCharPref('GoogleSearchLicenseKey');
   }
   // TODO: implement this function so it returns your Google Web API license key
   throw new Error("need to override getGoogleLicenseKey() or set \
 the google.GoogleSearchLicenseKey preference in about:config");
 }
 
 getGoogleLicenseKey.PREF_BRANCH = Components.classes['@mozilla.org/preferences-service;1'].
                                     getService(Components.interfaces.nsIPrefService).
                                     getBranch('google.');
 
 /**
  * getGoogleSearchResults does a basic Google query for the provided query phrase.
  * In this case, "basic" means the first 10 search results in english.
  * To tweak the query parameters, create a doGoogleSearchObj object, which
  * is a parameterizable query object that can be passed to doGoogleSearch().
  *
  * Similarly, if you want more information about the search, such as the amount of time
  * that it took to do the search and the estimated number of results for the query,
  * use the GoogleSearchResultObj that is returned by doGoogleSearch().
  *
  * // dump URLs of Google web search results for "my search query"
  * var results = getGoogleSearchResults("my search query");
  * for (var i = 0; i < results.length; ++i) {
  *   dump(results[i].URL);
  * }
  *
  * @param query {string}
  * @return ResultElementObj[]
  */
 function getGoogleSearchResults(/*string*/ query) {
   var params = new doGoogleSearchObj();
   params['key'] = getGoogleLicenseKey();
   params['q'] = query;
   params['start'] = 0;
   params['maxResults'] = 10;
   params['filter'] = false;
   params['restrict'] = "";
   params['safeSearch'] = false;
   params['lr'] = "";
   params['ie'] = "UTF-8";
   params['oe'] = "UTF-8";
   var result = doGoogleSearch(params);
   return result.resultElements;
 }
 
 /**
  * getGoogleSpellingSuggestion takes a phrase and returns Google's
  * spelling suggestion. You are probably familiar with the
  * "Did you mean..." link that often appears at the top of a page
  * of Google web search results when a query is misspelled.
  *
  * @param phrase {string}
  * @return {string}
  */
 function getGoogleSpellingSuggestion(/*string*/ phrase) {
   var params = new doSpellingSuggestionObj();
   params['key'] = getGoogleLicenseKey();
   params['phrase'] = phrase;
   return doSpellingSuggestion(params);
 }
 
 /**
  * getGoogleCachedPage takes a URL and returns the HTML for Google's cached
  * version of the page. This HTML includes the standard header/disclaimer that
  * Google adds when displaying a cached version of a page.
  *
  * @param url {string} of the page to fetch from Google's cache
  * @return {string} HTML of the cached version of the page
  */
 function getGoogleCachedPage(/*string*/ url) {
   var params = new doGetCachedPageObj();
   params['key'] = getGoogleLicenseKey();
   params['url'] = url;
   return doGetCachedPage(params);
 }
 
 /* generated by wsdl2js.py (http://www.bolinfest.com/wsdl2js/) */
 
 function GoogleSearchResultObj() {
    /*boolean*/ this["documentFiltering"] = null;
    /*string*/ this["searchComments"] = null;
    /*int*/ this["estimatedTotalResultsCount"] = null;
    /*boolean*/ this["estimateIsExact"] = null;
    /*ResultElementObj[]*/ this["resultElements"] = null;
    /*string*/ this["searchQuery"] = null;
    /*int*/ this["startIndex"] = null;
    /*int*/ this["endIndex"] = null;
    /*string*/ this["searchTips"] = null;
    /*DirectoryCategoryObj[]*/ this["directoryCategories"] = null;
    /*double*/ this["searchTime"] = null;
 }
 
 function doGetCachedPageResponseObj() {
    /*base64Binary*/ this["return"] = null;
 }
 
 function ResultElementObj() {
    /*string*/ this["summary"] = null;
    /*string*/ this["URL"] = null;
    /*string*/ this["snippet"] = null;
    /*string*/ this["title"] = null;
    /*string*/ this["cachedSize"] = null;
    /*boolean*/ this["relatedInformationPresent"] = null;
    /*string*/ this["hostName"] = null;
    /*DirectoryCategoryObj*/ this["directoryCategory"] = null;
    /*string*/ this["directoryTitle"] = null;
 }
 
 function doGoogleSearchResponseObj() {
    /*GoogleSearchResultObj*/ this["return"] = null;
 }
 
 function doGoogleSearchObj() {
    /*string*/ this["key"] = null;
    /*string*/ this["q"] = null;
    /*int*/ this["start"] = null;
    /*int*/ this["maxResults"] = null;
    /*boolean*/ this["filter"] = null;
    /*string*/ this["restrict"] = null;
    /*boolean*/ this["safeSearch"] = null;
    /*string*/ this["lr"] = null;
    /*string*/ this["ie"] = null;
    /*string*/ this["oe"] = null;
 }
 
 function doGetCachedPageObj() {
    /*string*/ this["key"] = null;
    /*string*/ this["url"] = null;
 }
 
 function DirectoryCategoryObj() {
    /*string*/ this["fullViewableName"] = null;
    /*string*/ this["specialEncoding"] = null;
 }
 
 function doSpellingSuggestionResponseObj() {
    /*string*/ this["return"] = null;
 }
 
 function doSpellingSuggestionObj() {
    /*string*/ this["key"] = null;
    /*string*/ this["phrase"] = null;
 }
 
 /**
  * @param doGetCachedPageParam of type doGetCachedPageObj
  * @return string
  */
 function doGetCachedPage(doGetCachedPageParam) {
   var call = new window.SOAPCall();
   call.transportURI = "http://api.google.com/search/beta2";
 
   var param0 = new window.SOAPParameter();
   param0.name = "key";
   param0.value = doGetCachedPageParam["key"];
 
   var param1 = new window.SOAPParameter();
   param1.name = "url";
   param1.value = doGetCachedPageParam["url"];
 
   var myParamArray = [param0, param1];
   call.encode(0, "doGetCachedPage", "urn:GoogleSearch", 0, null, myParamArray.length, myParamArray);
   var translation = call.invoke();
 
   if (translation.fault) {
     // error returned from the web service
     throw translation.fault;
   } else {
     var response = translation.getParameters(false, {});
     var value = response[0].value;
     if (value != null) value = window.atob(value);
     return value;
   }
 }
 
 /**
  * @param doSpellingSuggestionParam of type doSpellingSuggestionObj
  * @return string
  */
 function doSpellingSuggestion(doSpellingSuggestionParam) {
   var call = new window.SOAPCall();
   call.transportURI = "http://api.google.com/search/beta2";
 
   var param0 = new window.SOAPParameter();
   param0.name = "key";
   param0.value = doSpellingSuggestionParam["key"];
 
   var param1 = new window.SOAPParameter();
   param1.name = "phrase";
   param1.value = doSpellingSuggestionParam["phrase"];
 
   var myParamArray = [param0, param1];
   call.encode(0, "doSpellingSuggestion", "urn:GoogleSearch", 0, null, myParamArray.length, myParamArray);
   var translation = call.invoke();
 
   if (translation.fault) {
     // error returned from the web service
     throw translation.fault;
   } else {
     var response = translation.getParameters(false, {});
     var value = response[0].value;
     return value;
   }
 }
 
 /**
  * @param doGoogleSearchParam of type doGoogleSearchObj
  * @return doGoogleSearchResponse
  */
 function doGoogleSearch(doGoogleSearchParam) {
   var call = new window.SOAPCall();
   call.transportURI = "http://api.google.com/search/beta2";
 
   var param0 = new window.SOAPParameter();
   param0.name = "key";
   param0.value = doGoogleSearchParam["key"];
 
   var param1 = new window.SOAPParameter();
   param1.name = "q";
   param1.value = doGoogleSearchParam["q"];
 
   var param2 = new window.SOAPParameter();
   param2.name = "start";
   param2.value = doGoogleSearchParam["start"];
 
   var param3 = new window.SOAPParameter();
   param3.name = "maxResults";
   param3.value = doGoogleSearchParam["maxResults"];
 
   var param4 = new window.SOAPParameter();
   param4.name = "filter";
   param4.value = doGoogleSearchParam["filter"];
 
   var param5 = new window.SOAPParameter();
   param5.name = "restrict";
   param5.value = doGoogleSearchParam["restrict"];
 
   var param6 = new window.SOAPParameter();
   param6.name = "safeSearch";
   param6.value = doGoogleSearchParam["safeSearch"];
 
   var param7 = new window.SOAPParameter();
   param7.name = "lr";
   param7.value = doGoogleSearchParam["lr"];
 
   var param8 = new window.SOAPParameter();
   param8.name = "ie";
   param8.value = doGoogleSearchParam["ie"];
 
   var param9 = new window.SOAPParameter();
   param9.name = "oe";
   param9.value = doGoogleSearchParam["oe"];
 
   var myParamArray = [param0, param1, param2, param3, param4, param5, param6, param7, param8, param9];
   call.encode(0, "doGoogleSearch", "urn:GoogleSearch", 0, null, myParamArray.length, myParamArray);
   var translation = call.invoke();
 
   if (translation.fault) {
     // error returned from the web service
     throw translation.fault;
   } else {
     var temp;
     var obj0 = new doGoogleSearchResponseObj();
     var node0 = (translation.body.getElementsByTagName('doGoogleSearchResponse'))[0];
     var obj1 = new GoogleSearchResultObj();
     var node1 = (node0.getElementsByTagName('return'))[0];
       temp = node1.getElementsByTagName('documentFiltering')[0].firstChild;
       obj1['documentFiltering'] = (temp == null) ? null : (temp.nodeValue == 'true');
       temp = node1.getElementsByTagName('searchComments')[0].firstChild;
       obj1['searchComments'] = (temp == null) ? null : temp.nodeValue;
       temp = node1.getElementsByTagName('estimatedTotalResultsCount')[0].firstChild;
       obj1['estimatedTotalResultsCount'] = (temp == null) ? null : window.parseInt(temp.nodeValue, 10);
       temp = node1.getElementsByTagName('estimateIsExact')[0].firstChild;
       obj1['estimateIsExact'] = (temp == null) ? null : (temp.nodeValue == 'true');
       var obj2 = [];
       var node2 = (node1.getElementsByTagName('resultElements'))[0];
       // code for resultElements
       items2 = node2.getElementsByTagName('item');
       for (var i = 0; i < items2.length; i++) {
         var obj3 = new ResultElementObj();
         var node3 = items2[i];
           temp = node3.getElementsByTagName('summary')[0].firstChild;
           obj3['summary'] = (temp == null) ? null : temp.nodeValue;
           temp = node3.getElementsByTagName('URL')[0].firstChild;
           obj3['URL'] = (temp == null) ? null : temp.nodeValue;
           temp = node3.getElementsByTagName('snippet')[0].firstChild;
           obj3['snippet'] = (temp == null) ? null : temp.nodeValue;
           temp = node3.getElementsByTagName('title')[0].firstChild;
           obj3['title'] = (temp == null) ? null : temp.nodeValue;
           temp = node3.getElementsByTagName('cachedSize')[0].firstChild;
           obj3['cachedSize'] = (temp == null) ? null : temp.nodeValue;
           temp = node3.getElementsByTagName('relatedInformationPresent')[0].firstChild;
           obj3['relatedInformationPresent'] = (temp == null) ? null : (temp.nodeValue == 'true');
           temp = node3.getElementsByTagName('hostName')[0].firstChild;
           obj3['hostName'] = (temp == null) ? null : temp.nodeValue;
           var obj4 = new DirectoryCategoryObj();
           var node4 = (node3.getElementsByTagName('directoryCategory'))[0];
             temp = node4.getElementsByTagName('fullViewableName')[0].firstChild;
             obj4['fullViewableName'] = (temp == null) ? null : temp.nodeValue;
             temp = node4.getElementsByTagName('specialEncoding')[0].firstChild;
             obj4['specialEncoding'] = (temp == null) ? null : temp.nodeValue;
           obj3['directoryCategory'] = obj4;
           temp = node3.getElementsByTagName('directoryTitle')[0].firstChild;
           obj3['directoryTitle'] = (temp == null) ? null : temp.nodeValue;
         obj2.push(obj3);
       }
       obj1['resultElements'] = obj2;
       temp = node1.getElementsByTagName('searchQuery')[0].firstChild;
       obj1['searchQuery'] = (temp == null) ? null : temp.nodeValue;
       temp = node1.getElementsByTagName('startIndex')[0].firstChild;
       obj1['startIndex'] = (temp == null) ? null : window.parseInt(temp.nodeValue, 10);
       temp = node1.getElementsByTagName('endIndex')[0].firstChild;
       obj1['endIndex'] = (temp == null) ? null : window.parseInt(temp.nodeValue, 10);
       temp = node1.getElementsByTagName('searchTips')[0].firstChild;
       obj1['searchTips'] = (temp == null) ? null : temp.nodeValue;
       var obj2 = [];
       var node2 = (node1.getElementsByTagName('directoryCategories'))[0];
       // code for directoryCategories
       items2 = node2.getElementsByTagName('item');
       for (var i = 0; i < items2.length; i++) {
         var obj3 = new DirectoryCategoryObj();
         var node3 = items2[i];
           temp = node3.getElementsByTagName('fullViewableName')[0].firstChild;
           obj3['fullViewableName'] = (temp == null) ? null : temp.nodeValue;
           temp = node3.getElementsByTagName('specialEncoding')[0].firstChild;
           obj3['specialEncoding'] = (temp == null) ? null : temp.nodeValue;
         obj2.push(obj3);
       }
       obj1['directoryCategories'] = obj2;
       temp = node1.getElementsByTagName('searchTime')[0].firstChild;
       obj1['searchTime'] = (temp == null) ? null : window.parseFloat(temp.nodeValue);
     obj0['return'] = obj1;
     return obj0['return'];
   }
 }