sábado, 2 de junho de 2012

Web Services e PHP: Google em qualquer site, com a sua cara


Web Services e PHP: Google em qualquer site, com a sua cara.

Olá pessoal. A idéia desta matéria é apresentar como adicionar uma busca do Google num determinado site, com a sua cara. Ou seja, você a montará da maneira como quiser, até mesmo sem o usuário que entrar no site souber que a busca é do Google.
Talvez você ainda não tenha entendido, então, vamos pelo começo. O Google, como sempre, está sempre por dentro de novas tecnologias. Com o surgimento dos Web Services não foi diferente.
Através do site www.google.com/api, temos acesso à API do Google, onde você se cadastra e tem acesso em como utilizar os serviços web disponibilizados pelo Google.
Bom, para quem quiser mais informações, pode acessar o link acima e dar uma estudadinha.
Acredito que, talvez ainda não tenha comentado isto, mas uma das principais idéias dos Web Services é de ser uma aplicação Programador-Programados. Isso quer dizer que, nesse caso, o Google cria a função que atua como servidor e simplesmente te diz como você pode acessá-la.
A resposta desta função será apenas um conjunto de variáveis de texto, onde você receberá esses parâmetros e organizará da maneira que lhe convier, com o seu próprio visual.
Entenderam a idéia da coisa? Um outro exemplo, você possui um e-commerce, e faz envios de mercadoria pelo correio. Bom, como vou calcular o frete?
O site dos correios também lhe fornecem um Web Services para este caso, então você simplesmente criaria um cliente que acessaria o serviço dos correios e retornaria apenas uma variável $valor. Isto permite que você adicione no seu site da maneira que quiser, sem ter que criar frames, etc. etc. etc., acho que nem preciso comentar o ganho disto.
Exemplo simplificado: (estes dados não existem na verdade)
$soapclient = new soapclient(“http://www.correios.com.br/webservice/server.php”,false);
$res = $client->call('checkSW',array('cepOrigem'=>$cepOri,'cepDestino'=>$cepDest));
echo $res;

Neste caso, o server.php iria retornar apenas o cálculo da tarifa entre os dois ceps, e com está variável de retorno, você adicionaria da maneira que quisesse em seu site, respeitando cores, estilos, etc...
Vamos ao Sr. Google:
<?php
// include a API nusoap
// Lembre-se! A extension soap.dll/soap.so deve estar COMENTADA (;soap.ext) no arquivo php.ini
include("nusoap.php");
// instancia a classe Soap Cliente para se conectar ao Server do Google
$soapclient = new soapclient("http://api.google.com/search/beta2");
class clsGoogleApi {
            var $theResultSet; // pega os resultados da busca como dados pelo google api 
            var $theResults=array();
            var $theRowShown=0; // Seta o índice à última fileira mostrada 
            var $theMaxResults; // Seta o parâmetro dado dos resultados máximos ao construtor 
            var $flgError = false; // indica se houver erro ou não 
            var $theSearchQuery; // pergunta para a busca
            var $theEstimatedResultsCount; // número dos resultados encontrou pelo Api
            function clsGoogleApi($search_what,$start,$maxResults) {
                        global $soapclient;
                        $params = array(
                                    'key' => 'tbZF6P1QFHJB23E5zqVwgyytmQPuVkLC',   // chave da licença de Google. Para pegar a sua própria chave, acesse www.google.com/api
                                    'q'   => $search_what,                         // termo da busca 
                                    'start' => $start,                             // apartir do resultado 
                                    'maxResults' => $maxResults,                   // mostrar um total de resultados
                                    'filter' => false,                             // remove resultados similares
                                    'restrict' => '',                              // restrição a determinado assunto
                                    'safeSearch' => false,                         // remover conteúdo adulto
                                    'lr' => '',                                    // retringir a um certo idioma
                                    'ie' => '',                                    // input encoding
                                    'oe' => ''                                     // output encoding
                        );
                        // invocando os métodos do servidor
                        $this->theResultSet=$soapclient->call("doGoogleSearch", $params, "urn:GoogleSearch", "urn:GoogleSearch");
                        $this->theMaxResults=$maxResults;
                        // imprimindo os resultados
                        if ($this->theResultSet['faultstring']) {
                                   echo $this->theResultSet['faultstring']."<br>";
                                   $this->flgError=true;
                        } else  {
                                   $this->flgError=false;
                                   $this->theRowShown=0;
                                   $this->theSearchQuery=$this->theResultSet['searchQuery'];
                                   $this->theEstimatedResultsCount=$this->theResultSet['estimatedTotalResultsCount'];
                                   if (is_array($this->theResultSet['resultElements'])) {
                                               $this->theResults=array();
                                               foreach ($this->theResultSet['resultElements'] as $r) {
                                                           $result["URL"]=$r['URL'];
                                                           $result["cached-size"]=$r['cachedSize'];
                                                           $result["snippet"]=$r['snippet'];
                                                           $result["directory category"]=$r['directoryCategory'];
                                                           $result["related information present"]=$r['relatedInformationPresent'];
                                                           $result["directory title"]=$r['DirectoryTitle'];
                                                           $result["summary"]=utf8_decode($r['summary']);
                                                           $result["title"]=utf8_decode($r['title']);
                                                           $this->theResults[]=$result;
                                               }
                                   }
                        }
            }
           
            function getResultNextItem() {
                        $result=$this->theResults[$this->theRowShown];
                        $this->theRowShown++;
                        if (($this->theRowShown > $this->theMaxResults) or ($this->theRowShown > $this->theEstimatedResultsCount))  {
                                   $result=false;
                        }
                        return $result;
            }
}
?>

Criando um form simples de busca :
<form action="clsgoogleapi.php" method="post" name="form1">
         Palavra/Frase: <input name="palavra" type="text" id="palavra" size="40">
  Resultados por P&aacute;gina:
  <select name="resultados" id="resultados">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            <option value="6">6</option>
            <option value="7">7</option>
            <option value="8">8</option>
            <option value="9">9</option>
            <option value="10">10</option>
          </select>
          <input type="submit" name="Submit" value="Buscar">
</form>


Pegando os resultados (adicione estas linhas após a classe):
$palavra = $_POST['palavra'];
if(empty($palavra)) $palavra = $_GET['palavra'];
$resultados = $_POST['resultados'];
if(empty($resultados)) $resultados = $_GET['resultados'];
 
$myQuery=new clsGoogleApi($palavra,$inicio,$resultados);
    if ($myQuery->flgError) {
        echo "Error!";
    } else {
                        echo "Buscando por <b>". $myQuery->theSearchQuery."</b> encontrou <b>".$myQuery->theEstimatedResultsCount."</b> resultados<hr>";
                        $item=$inicio;
                        echo "<ul>";
        while ($result=$myQuery->getResultNextItem()) {
                                   $item++;
                                   echo "<li> $item - ".$result["title"]." (<a href=".$result["URL"].">".$result["URL"].")</a><br>".$result["snippet"]."(".$result["cached-size"].")";
        }
                        echo "</ul>";
                       
            }

Personalizando os resultados da busca, com paginação: (desculpem o código, mas esta bem precário, apenas para demonstração)
echo "<a href=busca.php>BUSCAR OUTRA COISA</a><br><br>";
$pagina = $_GET['pagina'];
$palavra = $_POST['palavra'];
if(empty($palavra)) $palavra = $_GET['palavra'];
$resultados = $_POST['resultados'];
if(empty($resultados)) $resultados = $_GET['resultados'];
if($pagina=="") {
            $pagina="1";
}
$inicio=$pagina-1;
$inicio=$resultados*$inicio;
$inicio = (int) $inicio;
$resultados = (int) $resultados;
           
  echo "Página = $pagina<br>Início = $inicio<br>Resultados por páginas = $resultados<br>";    
  $myQuery=new clsGoogleApi($palavra,$inicio,$resultados);
    if ($myQuery->flgError) {
        echo "Error!";
    } else {
                        echo "Buscando por <b>". $myQuery->theSearchQuery."</b> encontrou <b>".$myQuery->theEstimatedResultsCount."</b> resultados<hr>";
                        $item=$inicio;
                        echo "<ul>";
        while ($result=$myQuery->getResultNextItem()) {
                                   $item++;
                                   echo "<li> $item - ".$result["title"]." (<a href=".$result["URL"].">".$result["URL"].")</a><br>".$result["snippet"]."(".$result["cached-size"].")";
        }
                        echo "</ul>";
                       
            }
            $menos=$pagina-1;
            // Calculando página posterior 
            $mais=$pagina+1;
            // Cálculos para a mostragem de páginas 
            $p_ini=$mais-1;
            $p_ini=$resultados*$p_ini;
                       
            echo "<a href='?palavra=$palavra&pagina=$menos&resultados=$resultados'>anterior</a>";
            echo " - ";
            echo "<a href='?palavra=$palavra&pagina=$mais&resultados=$resultados'>proxima</a>";

Resultado:
Ai está o google no meu site com a minha cara, como podem ver ta bem feinho, hehe.
Bom pessoal, desculpem não ter comentado, mas como descrevi no inicio da matéria, o tempo está curto, porém, o código é bem acessivel e fácil de entender, e lembrem-se, qualquer dúvida, www.google.com/api.

Nenhum comentário:

Postar um comentário