Récuperation de code source web
luern
Messages postés
114
Statut
Membre
-
Hxyp Messages postés 401 Date d'inscription Statut Membre Dernière intervention -
Hxyp Messages postés 401 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Récuperation de code source web
- Code ascii - Guide
- Code puk bloqué - Guide
- Code de déverrouillage oublié - Guide
- Creation de site web - Guide
- Code activation windows 10 - Guide
6 réponses
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.
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 ^^'
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 !
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
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;
}