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
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
A voir également:
- Récuperation de code source web
- Code ascii de a - Guide
- Code puk bloqué - Guide
- Code de déverrouillage oublié - Guide
- Traduire une page web - Guide
- Adresse web - Guide
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
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.
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.
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
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 ^^'
Mais je suis vraiment un débutant, donc un peu de code ne serait pas de trop pour m'expliquer tout ca ^^'
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
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 :
je n'ai pas codé pour sortir de la boucle hm, j'avoue que c'est par flemme de devoir étudier tout le touintouin !
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 !
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
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
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
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
16 mars 2011 à 21:34
C'est vrai, dsl des doubles posts, merci encore, je vais étudier tout ca ;)
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
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 :
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; }