Récuperation de code source web

Fermé
luern Messages postés 88 Date d'inscription jeudi 24 février 2011 Statut Membre Dernière intervention 8 juin 2011 - 14 mars 2011 à 21:55
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 17 mars 2011 à 07:19
Bonjour,

J'aimerai savoir si il est possible de programmer une fonction en C qui permette de récupérer le code source d'une page web automatiquement (donc ne pas enregistrer le code en allant dans affichage -> afficher le code source) ?

Merci d'avance


A voir également:

6 réponses

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
15 mars 2011 à 14:05
Bonjour,
Une page web est affichée graphiquement à l'intérieur d'un navigateur web, en dehors ce n'est que du code, donc le code source.
Alors ce qu'il vous faut c'est créer un simple client en utilisant les sockets. Il y a un tas d'exemples sur le net faites une recherche "client socket langage c"
Lorsque vous avec réussi à créer un client qui peut se connecter à un serveur ce qu'il vous faut ensuite c'est lire les bases du protocole HTTP pour récupérer la page spécifique.

Un petit exemple : on a le lien "http://www.site.com/index.html"
on se connecte au serveur qui est www.site.com sur le port 80
ensuite pour récupérer la page index.html on envoie au serveur une requête HTTP de type "get" :
get /index.html HTTP/1.1
suivie de "\r\n\r\n" deux fois un retour chariot et une nouvelle ligne pour confirmer la requête.
Le serveur va alors envoyer la page, le "code source".
Parfois il faut préciser l'host dans la requête http ou le referer ou les cookies pour que le serveur puisse envoyer la page.
Aidez vous d'un client telnet ou de netcat pour faire des tests sur différents liens et voir comment l'http marche. Il y a aussi la méthode rapide en utilisant un sniffer et en analysant les requêtes faite par un navigateur web.
0
luern Messages postés 88 Date d'inscription jeudi 24 février 2011 Statut Membre Dernière intervention 8 juin 2011 4
15 mars 2011 à 19:36
Merci de ta réponse ;)
Mais je suis vraiment un débutant, donc un peu de code ne serait pas de trop pour m'expliquer tout ca ^^'
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 17/03/2011 à 07:09
Salut,
J'ai repris un des exemples ici : http://wiki.forum.nokia.com/index.php/Open_C_Sockets:_send,_sendto,_sendmsg_methods que j'ai modifié pour récupérer le code d'une page web, avec quelques explications pour que vous puissiez le continuer :

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

int main(void)
{
  struct sockaddr_in serv_addr;
  struct hostent *host;
  int sock_fd;
  int i,nbrecv;
  char buffrecup[4096];
  const char *line="GET /forum/affich-21189976-recuperation-de-code-source-web HTTP/1.1\r\n"
        /* le / est la racine du site ici c'est l'adresse de la page  */
                    "Host: www.commentcamarche.net"
        /* il peut y avoir plusieurs sites sur la meme ip alors on précise
         * l'host auquel on veut acceder */
                    "\r\n\r\n"; /* requete http se termine par ce doublon */
  host=gethostbyname("www.commentcamarche.net");/* le nom de domain */
  memcpy(&serv_addr.sin_addr.s_addr,host->h_addr,(size_t)host->h_length);
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(80);/* port serveur web 80 */
  sock_fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  printf("tentative de connection\n");
  if(connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==0)
    {
      printf("connection ok\nenvoi requete...\n");
      if(send(sock_fd,line,strlen(line),0)==-1)return 1; /* si -1 problem d'envoi */
      printf("envoi ok\nreception...\n");
      while(1)/* boucle infini sur le recv() a vous de decider comment en sortir */
        {
          nbrecv=recv(sock_fd,buffrecup,4096,0);
          for(i=0;i<nbrecv;i++)/* pas forcée cette boucle c'est juste pour les détails
                                  vous pouvez directement utiliser buffrecup et l'envoyer
                                  dans une fonction pour parser ou un buff alloué */
            {
              printf("%c",buffrecup[i]);
              /* ici il faudrait recuperer la chaine
                 "Content-Length:" qui donne la taille du contenu envoyé
                  par le serveur web
                  la taille indiquée commence uniquement aprés l'entete http
                  c'est à dire après le fameux \r\n\r\n ça permet
                  de recuperer le contenu sans probleme mais
                  certain serveurs ne precisent pas le Content-Length faut
                  étudier d'avantage le protocole http dans ce cas là! ahah  */
            }
        }
    }
  else printf("erreur connection\n");
  close(sock_fd);
  return 0;
}

je n'ai pas codé pour sortir de la boucle hm, j'avoue que c'est par flemme de devoir étudier tout le touintouin !
0
arthurc Messages postés 26 Date d'inscription mardi 22 février 2011 Statut Membre Dernière intervention 25 mars 2011 4
16 mars 2011 à 08:40
Salut,

Comme dit sur ton précédent poste sur le forum, tu as la lib curl qui fait du http très simplement:

https://curl.se/libcurl/c/simple.html

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luern Messages postés 88 Date d'inscription jeudi 24 février 2011 Statut Membre Dernière intervention 8 juin 2011 4
16 mars 2011 à 21:34
C'est vrai, dsl des doubles posts, merci encore, je vais étudier tout ca ;)
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
17 mars 2011 à 07:19
Est-ce normal que la modification de la réponse que j'ai donné ne fonctionne pas ? il n'y a que la date de modification qui change mais pas le contenu du message!
Suis alors obligé de faire un doublon dsl, je voulais dire que le code que j'ai fourni ne pouvait pas fonctionné sous Windows et donc pour qu'il fonctionne voici la modification :

#define windows /* mettre cette ligne en commentaire pour linux */

#ifdef windows /* pas oublier de linker la lib winsock libws2_32.a */
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#endif
#include <string.h>
#include <stdio.h>


int main(void)
{
#ifdef windows
  SOCKET sock_fd;
  SOCKADDR_IN serv_addr;
  WSADATA WSAData;
  WSAStartup(MAKEWORD(2,0),&WSAData);
#else
  int sock_fd;
  struct sockaddr_in serv_addr;
#endif
  struct hostent *host;
  int nbrecv;
  char buffrecup[4096];
  const char *line="GET /forum/affich-21189976-recuperation-de-code-source-web HTTP/1.1\r\n"
                    "Host: www.commentcamarche.net"
                    "\r\n\r\n";
  host=gethostbyname("www.commentcamarche.net");
  memcpy(&serv_addr.sin_addr.s_addr,host->h_addr,(size_t)host->h_length);
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(80);
  sock_fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  printf("tentative de connection\n");
  if(connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==0)
    {
      printf("connection ok\nenvoi requete...\n");
      if(send(sock_fd,line,strlen(line),0)==-1)
        {
          printf("erreur send()");
          return 1;
        }
      printf("envoi ok\nreception...\n");
      while(1)
        {
          nbrecv=recv(sock_fd,buffrecup,4096,0);
          printf("%s",buffrecup);
        }
    }
  else printf("erreur connection\n");
#ifdef windows
  closesocket(sock_fd);
  WSACleanup();
#else
  close(sock_fd);
#endif
  return 0;
}
0