Recuperer des resultats sur google.com avec de l'aide d'un socket (version linux)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 024 fois - Téléchargée 32 fois

Contenu du snippet

Le code est assez simple a comprendre il vous faut juste editer 'main.cpp'
et le recompiler.

pour la compilation

g++ -o google -Os -s google.cpp main.cpp
./google

Si vous etes interessé par ce _code_ je vous invite a visiter

http://oczio.free.fr/google/

ou vous pouvez trouver le code source en fonctionnement avec un client IRC tout bête.

Si vous faites recherhce par ex "CppFrance test"; il va rien trouver, puisque il faut remplacer ' ' (l'espace) par %20, c'est déjà corrigé dans le lien que j'ai mis en haut.

Source / Exemple :


// le fichier google.hh //

#ifndef _GOOGLE_HH
#define _GOOGLE_HH

#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#include <iostream>
#include <string>
#include <cstdio>

class google {
private:

int r;                              // recv() error check
int sockfd;                      // the socket
char temp[1];                  // recv() into temp
std::string buffer;            // real buffer after '\n'
std::string query_str;        // query google string
std::string::size_type pos;         // position of 'Location :'
public:
std::string result;                 // store the result
//query for results
int query(std::string msg);
std::string foundIt();

};
#endif // _GOOGLE_HH

// le fichier google.cpp //

#include "google.hh"

int google::query(std::string msg)
{
  std::memset(temp,0,1);

  struct hostent *he;
  struct sockaddr_in their_addr;
  if((he = gethostbyname("www.google.com")) == NULL)
  {
    perror("gethostbyname() :");
    return 1;
  }
  if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
  {
    perror("socket() :");
    return 1;
  }
  their_addr.sin_family = AF_INET;
  their_addr.sin_port   = htons(80);
  their_addr.sin_addr   = *((struct in_addr *)he->h_addr);
  memset(&(their_addr.sin_zero),0,8);

  if(connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) < 0)
  {
    perror("connect() :");
    return 1;
  }
  query_str = "GET /search?hl=en&ie=UTF-8&oe=UTF-8&q=" + msg + "&btnI=yes HTTP/1.0\n\n";
  send(sockfd, query_str.c_str(),query_str.size(), 0);
  for(;;)
  {
    r = recv(sockfd, temp, 1, 0);
    if(r > 0)
    {
      buffer += temp[0];
      if(temp[0] == '\n')
      {
        pos = buffer.find ("Location: ",0);
        if(!(pos == std::string::npos))
        {
          std::cout << "Found it.\n";
          result = buffer.substr(10,(buffer.size() - 2)); // -2 is for \r\n
          return 2;
        }
        else
        {
          //no results//
        }
        buffer.assign("");
      }
      memset(temp,0,1);
    }
    else
    {
      return 1;
    }
  }
  return 0;
}

std::string google::foundIt()
{
  return result;
}

// le fichier main.cpp //

#include "google.hh"
int main()
{
  google MyGoogle;
  std::string test = "Cppfrance";
  std::string resp;
   if(MyGoogle.query(test) == 2)
   {
      resp = MyGoogle.foundIt();
      std::cout << resp << std::endl;
   }
   else 
  {
    // Didn't find anything // 
  }

  return 0; // optionel
}

Conclusion :


:)

A voir également

Ajouter un commentaire

Commentaire

cs_LordBob
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
9
salut, je viens de tomber sur ta source... fait-elle vraiment une recherche sur google ? car j'ai du mal a comprendre comment elle fonction, pourrais-tu m'éclairé stp ?
comment afficher tous les resultats trouver ?
autre chose, j'ai beau rechercher quelque chose, je trouve toujours une reponse !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.