web-dev-qa-db-fra.com

Comment utiliser PHP client pour Google Custom Search Engine

J'ai l'impression que c'est une erreur idiote de ma part, mais je ne sais pas comment utiliser le google-api-php-client pour faire une recherche simple. Mon objectif est d'exécuter des requêtes de mots clés simples sur un moteur de recherche Google pour mon site.

J'ai créé ma clé api, un moteur de recherche google et téléchargé une version du client api, mais le site google pour le client php ne semble pas avoir de documentation sur la façon d'utiliser le client et le seul exemple connexe que j'ai trouvé jusqu'à présent recherche spécifiquement le service de livres de Google. Le problème est que cet exemple implique que différents services de recherche ont différents types de résultats de recherche et je ne trouve aucune documentation sur la façon de récupérer les résultats d'un Google_Service.

Je pense que je peux configurer une recherche simple comme celle-ci, mais je ne sais pas comment récupérer les résultats.

include_once __DIR__ . '/vendor/autoload.php';
...
public function __construct($searchTerm) {
    $client = new Google_Client();
    $client->setApplicationName("My_First_Search");
    $client->setDeveloperKey(self::GCSE_API_KEY);
    $service = new Google_Service($client);
    $optParams = array('filter' => $searchTerm);
    $results = $service->???

La documentation doit être là, mais ce n'est dans aucun des endroits évidents ....

Mise à jour (14/01/17) :

(Mise à jour du 21/01/17: en fait, ces documents ne m'ont pas beaucoup aidé, mais je les laisserai juste pour info)

J'ai utilisé phpdoc pour générer de la documentation api pour google apiclient. J'ai fait un dépôt et mis les phpdocs et le libary sur github . Les les phpdocs sont consultables ici .

J'espère donc que cela sera utile à quelqu'un. Malheureusement, même avec les documents, j'ai du mal à démêler la bonne utilisation. Je n'ai pas encore généré de documents pour le package google apiclient-services car ils sont énorme, mais je peux le faire si nécessaire (en fonction des limites de disque sur les pages github).

16
doub1ejack

Merci à @gennadiy de m'avoir mis sur la bonne voie. Sans sa suggestion d'utiliser ->cse->listCse() pour récupérer les résultats, j'aurais probablement abandonné et je suis parti à la recherche d'une bibliothèque différente. Heureusement, c'est à peu près tout ce dont j'ai besoin pour utiliser cette bibliothèque, donc je pense que je suis prêt.

Exemple simple

L'exécution d'une recherche est assez simple; cela ressemble à ceci:

include_once __DIR__ . '/vendor/autoload.php';

$GCSE_API_KEY = "nqwkoigrhe893utnih_gibberish_q2ihrgu9qjnr";
$GCSE_SEARCH_ENGINE_ID = "937592689593725455:msi299dkne4de";

$client = new Google_Client();
$client->setApplicationName("My_App");
$client->setDeveloperKey($GCSE_API_KEY);
$service = new Google_Service_Customsearch($client);
$optParams = array("cx"=>self::GCSE_SEARCH_ENGINE_ID);    
$results = $service->cse->listCse("lol cats", $optParams);

L'objet résultats implémente Iterator afin que nous puissions les parcourir comme suit:

foreach($results->getItems() as $k=>$item){
    var_dump($item);
}

Prérequis Google

Pour utiliser cette bibliothèque, vous devrez d'abord configurer quelques éléments Google. Ces choses sont finalement mentionnées sur le site Web Google API Client Libraries PHP (Beta) , mais vous devrez cliquer et creuser pour eux et même alors, vous va manquer le dernier ci-dessous:

  1. Vous aurez besoin d'un moteur de recherche personnalisé. Ne soyez pas dérouté par le fait que la plupart des références sur Internet aux moteurs de recherche personnalisés sont destinées aux personnes qui pas essayant de faire des recherches programmatiques. Vous en avez besoin, et ils sont faciles à configurer ici: https://cse.google.com/cse/all
  2. Vous aurez besoin d'un projet Google. Encore une fois, la configuration est facile lorsque vous savez où aller: https: //console.developers. google.com/apis/dashboard
  3. Vous aurez besoin d'une clé API (aka une clé développeur). Allez ici et créez une nouvelle clé si vous n'en avez pas déjà une: https://console.developers.google.com/apis/credentialsenter image description here
  4. Vous devrez activer la recherche personnalisée Google pour votre projet. À ce stade, vous pouvez faire des requêtes à Google, mais vous pouvez obtenir une réponse d'erreur si vous n'avez pas encore activé la recherche personnalisée Google pour votre projet. Accédez au tableau de bord, cliquez sur le lien bleu "Activer l'API", recherchez Google Custom Search et activez-le. https://console.developers.google.com/apis/dashboardenter image description here

Un exemple bien commenté

Il s'agit d'un exemple plus réaliste que l'exemple ci-dessus. C'est toujours très simple, mais c'est toujours agréable d'avoir quelque chose de nouveau expliqué de deux manières différentes avec beaucoup de commentaires explicatifs.

<?php

include_once __DIR__ . '/vendor/autoload.php';

/**
 * Retrieves a simple set of google results for a given plant id.
 */
class GoogleResults implements IteratorAggregate {

    // Create one or more API keys at https://console.developers.google.com/apis/credentials
  const GCSE_API_KEY = "nqwkoigrhe893utnih_gibberish_q2ihrgu9qjnr";

    /* The search engine id is specific to each "custom search engine"
     * you have configured at https://cse.google.com/cse/all     

     * Remember that you must have enabled Custom Search API for the project that
     * contains your API Key.  You can do this at the following url:
     * https://console.developers.google.com/apis/api/customsearch.googleapis.com/overview?project=vegfetch-v01&duration=PT1H    

     * If you fail to enable the Custom Search API before you try to execute a search
     * the exception that is thrown will indicate this.  */
    const GCSE_SEARCH_ENGINE_ID = "937592689593725455:msi299dkne4de";

    // Holds the GoogleService for reuse
    private $service;

    // Holds the optParam for our search engine id
    private $optParamSEID;

    /**
     * Creates a service object for our Google Custom Search.  The API key is 
     * permiently set, but the search engine id may be changed when performing 
     * searches in case you want to search across multiple pre-prepared engines.
     * 
     * @param string $appName       Optional name for this google search
     */
    public function __construct($appName = "My_Search") {

        $client = new Google_Client();

        // application name is an arbitrary name
        $client->setApplicationName($appName);

        // the developer key is the API Key for a specific google project
        $client->setDeveloperKey(self::GCSE_API_KEY);

        // create new service
        $this->service = new Google_Service_Customsearch($client);

        // You must specify a custom search engine.  You can do this either by setting
        // the element "cx" to the search engine id, or by setting the element "cref"
        // to the public url for that search engine.
        // 
        // For a full list of possible params see https://github.com/google/google-api-php-client-services/blob/master/src/Google/Service/Customsearch/Resource/Cse.php
        $this->optParamSEID = array("cx"=>self::GCSE_SEARCH_ENGINE_ID);

  }

    /**
     * A simplistic function to take a search term & search options and return an 
     * array of results.  You may want to 
     * 
     * @param string    $searchTerm     The term you want to search for
     * @param array     $optParams      See: For a full list of possible params see https://github.com/google/google-api-php-client-services/blob/master/src/Google/Service/Customsearch/Resource/Cse.php
     * @return array                                An array of search result items
     */
  public function getSearchResults($searchTerm, $optParams = array()){
        // return array containing search result items
        $items = array();

        // Merge our search engine id into the $optParams
        // If $optParams already specified a 'cx' element, it will replace our default
        $optParams = array_merge($this->optParamSEID, $optParams);

        // set search term & params and execute the query
        $results = $this->service->cse->listCse($searchTerm, $optParams);

        // Since cse inherits from Google_Collections (which implements Iterator)
        // we can loop through the results by using `getItems()`
        foreach($results->getItems() as $k=>$item){
            var_dump($item);
            $item[] = $item;
        }

        return $items;
  }
}
18
doub1ejack

Vous devez utiliser non Google_Service, mais Google_Service_Customsearch

$service = new Google_Service_Customsearch($client);

puis:

$results = $service->cse->listCse($searchTerm, $optParams);
6
Gennadiy Litvinyuk