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

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

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.