IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

bot HTTP probleme avec les POST


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 6
    Points
    6
    Par défaut bot HTTP probleme avec les POST
    Bonjours,
    Je suis entrain de me faire un bot en c++ pour wikipedia mais j'ai des problèmes de POST, je vous mets mon code et oui je sais il y en a beaucoup, ce n'est peut être pas tout utile mes pour ne pas manque d'élément je croie que c'est nécessaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    void page::pageok(string wikiPageName,bool edit)
    {
        socketCrea();
     
        pageName=wikiPageName;
        if(edit)
            pageAdresse="/w/wiki.phtml?title="+wikiPageName+"&action=edit";
        else
            pageAdresse="/wiki/"+wikiPageName;
     
        resume("");
        minoredit(true);
        watch(false);
     
        getPage();
    }
     
    void page::socketCrea()
    {
        WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,2), &WSAData);
        SOCKADDR_IN sin;
     
        sin.sin_addr                = resolve("fr.wikipedia.org");
    	sin.sin_family				= AF_INET;
    	sin.sin_port				= htons(80);
    	cout<<"\tcreation du socket";
    	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if(sock < 0)  // Au cas ou la création de la socket ne fonctionnerais pas
    	{
    		cerr<<"\nImpossible de creer la socket\n";
    		exit(1);
    	}
     
        cout<<"\r[ok]\n\tconnection au serveur";
    	if (connect(sock,(struct sockaddr *)&sin, sizeof sin) < 0)
    	{
    		cerr<<"\nImpossible de se connecter au serveur\n";
    		exit(1);
    	}
        cout<<"\r[ok]\n\n";
    }
     
    struct in_addr page::resolve (char *name)         //code faity par quelqu'un d'autre
    {
        static struct in_addr in;
        unsigned long l;
        struct hostent *ent;
     
        if ((l = inet_addr(name)) != INADDR_NONE)
        {
            in.s_addr = l;
            return in;
        }
        if (!(ent = gethostbyname(name)))
        {
            in.s_addr = INADDR_NONE;
            return in;
        }
     
        return *(struct in_addr *)ent->h_addr;
    }
     
    void page::login()
    {
            string requete, entete, corp;
    	char messchar[10000];
     
    	requete="POST /w/wiki.phtml?title=Special:Userlogin&action=submitlogin HTTP/1.0\r\n";
     
        corp="wpName=UserName&wpPassword=PassWord&wpRemember=1&wpLoginattempt=Identification";
     
        entete="Host: fr.wikipedia.org\r\n"
            "User-Agent: djobot\r\n"
            "Content-type: application/x-www-form-urlencoded\r\n"
            "Content-Length: "+str(corp.length())+"\r\n\r\n";
        requete=requete+entete+corp;
    	cout<<"\n\tenvois de requete login ";
    	send(sock, requete.c_str(), requete.length(),0);
        cout<<"\r[ok]\n";
        cout<<"\tattente reponse du serveur";
    	recv(sock, messchar, 10000, 0);
    	cout<<"\r[ok]\n\n";
    	requete=messchar;
    	cookie=requete.substr(requete.find("Set-Cookie: ")+12);
    	cookie=cookie.substr(0,cookie.find_first_of('\n'));
    	cookie="cookie: "+cookie;
    }
     
    void page::sendPage()
    {
        string requete, entete, corp;
    	char messchar[10000];
     
        cout<<"\n\t\t***requete***\n\t**POST page: "<<pageName;
    	requete="POST wiki.phtml?title="+pageName+"&action=submit HTTP/1.0\r\n";
        corp="\r\nwpTextbox1="+article+"&wpEdittime="+Edittime+"&wpSummary="+Summary+
            "&wpMinoredit="+Minoredit+"&wpWatchthis="+Watch+"&wpSave=Sauvegarder\r\n\r\n";
     
        entete="Host: fr.wikipedia.org\r\n"
            "User-Agent: djobot\r\n"
            "Content-type: multipart/form-data"
            "Content-Length: "+str(corp.length())+"\r\n";
        requete=requete+entete+cookie+corp;
    	cout<<"\n\tenvois de la page ";
    	send(sock, requete.c_str(), requete.length(),0);
        cout<<"\r[ok]\n";
        cout<<"\tattente reponse du serveur";
    	recv(sock, messchar, 10000, 0);
    	cout<<"\r[ok]\n\n";
    	requete=messchar;
    	cout<<requete;
    }
     
    void page::getPage()
    {
        string requete, entete;
    	char messchar[100000];
     
        cout<<"\n\t\t***requete***\n\t**GET page: "<<pageName<<"\n a l'adresse: "<<pageAdresse;
    	requete="GET "+pageAdresse+" HTTP/1.0\r\n";
        entete="Host: fr.wikipedia.org\r\n"
            "User-Agent: djobot\r\n";
        requete=requete+entete+cookie+"\r\n\r\n";
    	cout<<"\n\n\tenvois de la requete";
    	send(sock, requete.c_str(), requete.length(),0);
        cout<<"\r[ok]\n";
        cout<<"\tattente reponse du serveur";
    	recv(sock, messchar, 100000, 0);
    	cout<<"\r[ok]\n";
    	fullPage=messchar;
    }
    Voila, je vous est évite plusieurs petite fonction qui n'ont pas trop rapport mais tout se qui concerne la création de socket et l'interaction avec wiki est la.

    Maintenant les problèmes:

    Le premier, quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
            page log;   //le constructeur renvois a socketCrea();
            log.login();
       return 0;
    }
    tout le code s'exécute et quand je fais afficher la réponse du serveur j'ai une erreur "302 moved temporarily" et tout les autre page que j'assai d'avoir par la suite (avec getPage(); ) me donne la même erreur, que j'envoie le cookie ou non.

    Seconde erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(void)
    {
        page test("Utilisateur:Djobot/bottesting"); //constructeur appelle pageok("Utilisateur:Djobot/bottesting",true);
        test.recupArt();    //fonction qui récupère toute les section nécessaires, article timestamp...
        test.article+="/nbonjour de c++";   //variable ou est stocke l'article
        test.resume("test");           //replies le resume
        test.sendPage();
      return 0;
    }
    le seul détail qui n'est pas présent c'est que j'ai ajoute le contenue de mon cookie directement dans le code en variable global, donc c'est comme si j'était loguer, quand je fait un getPage() je peut voir que je suis belle et bien loguer. Mais voila, j'ai beau faire cette modif avec mon bot, la page sur wiki reste totalement inchangé.

    Alors si vous avez une idée du problème, d'âpres moi c'est mon POST ou plus précisément le corp de mon POST qui a un problème mais je ne sait pas quoi, quoi que sa peut très bien être ailleurs dans mon code.

    En tout cas, merci de l'attention que vous porte a se message et n’hésité pas a poser une question si quelque chose n’est pas claire.

  2. #2
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    personne n'a d'idee, ne soyer pas effrayer par le code svp, comme j'ai dit il n'est pas nescessairement tout utile mais au moin la en manque pas de bout...

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    tout le code s'exécute et quand je fais afficher la réponse du serveur j'ai une erreur "302 moved temporarily"
    Tu es redirigé.
    Suis la redirection.

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    tout d'abord merci pour ta suggestion, mais je fais retirer la seul adresse que j'ai, elle est au champ "Location: ", et je renvois une nouvelle requete ensuite a cette adresse, mais je retombe sur la meme page d'erreure 302. j'ai aissayer en fesant une requete GET et en renvoyant la meme requete POST avec les information de login mais sa ne fonctionne pas.

    si tu vois d'autre chose, ou si il y a quelque chose que je n'est pas fais comme il le faut...

Discussions similaires

  1. probleme avec les hidden et l'envoi POST
    Par codergamer dans le forum Langage
    Réponses: 8
    Dernier message: 21/08/2009, 23h44
  2. probleme avec les posts des formulaires
    Par axel-erator dans le forum Langage
    Réponses: 6
    Dernier message: 04/05/2006, 11h41
  3. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  4. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo