Partage
  • Partager sur Facebook
  • Partager sur Twitter

requette HTTP: POST

sur un bot

    20 juillet 2006 à 11:13:23

    Bonjours,
    Je suis entrain de me faire un bot en c++ pour wikipedia mais j'ai des problèmes de POST(du moin je croi que c'est cela), 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(de toute maniere on fini toujours par me faire poste mon code complet...):


    premierement les problèmes:



    Le premier, quand je fais:



    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:



    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é.

    le code presque complet:



    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.

    En tout cas, merci de l'attention que vous porte a ce message et n’hésité pas a poser une question si quelque chose n’est pas claire.
    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2006 à 0:18:18

      personne n'a une idee ?
      • Partager sur Facebook
      • Partager sur Twitter
        21 juillet 2006 à 12:21:29

        Oula dur dur, je ne fais pas trop du C++ et de la connexion par socket mais vu que tu reçois des erreurs venant du serveur, c'est que cette partie doit marcher dans ton code.

        En http, quand tu reçois un code 3xx ça veut dire que le document se trouve à une autre adresse. C'est juste une redirection classique (comme il arrive souvent après s'être loggué sur un site), donc il faut que tu ouvre la nouvelle page normalement (c'est indiqué dans l'entête "location" que renvoi le serveur).

        Hmm heu sinon, je ne suis pas sur que tu enregistre tes cookies comme il faut :s
        http://wp.netscape.com/newsref/std/cookie_spec.html
        En plus du nom et de la valeur du cookie, le serveur peut envoyer d'autres informations (path, domain name, expire) qu'il ne faut pas renvoyer ensuite !

        En plus:

        Citation

        Multiple Set-Cookie headers can be issued in a single server response.


        Or ton script ne recherche qu'une seule ligne "Set-Cookie" et s'arrête là (donc au mieux il enregistre 1 seul cookie).
        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2006 à 12:49:27

          Pour la redirection je me le suis fais dire a quelque part d'autre, mais quand je suis la redirection je retombe sur une page d'erreur 302 (a vrai dire c'est exactement la même page, et le lien dans location est le même, donc je ne peux que tourne en rond sur cette page la si je suis la redirect a chaque fois...

          Ensuite, pour le multi cookie c'est vrai qu'a ce moment je ne prenais que le premier, mais c'était le plus important (quand j'en rentrais un seul manuellement c'est celui la que je mettais...) mais bon j'ai corrigé cela par la suite et maintenant il me les prend tout (il y en a 4 en tout).

          Reste le problème de path et Co que je ne savais pas, je vais corriger ca le plus vite possible et voir si sa fonctionne

          Et oui je sais que mon socket fonctionne comme il le faut, mais je n'arrive qu'a faire des requête GET pour le moment, le POST pour le login et le POST pour envoyer un article ne fonctionne pas... je vais voir cote login c'est peut-être juste le cookie comme tu me la fais remarque.

          En tout cas merci de ta réponse.
          • Partager sur Facebook
          • Partager sur Twitter
            24 juillet 2006 à 4:57:53

            J’ai corriger ma récupération de cookie pour qu'il ne me prenne que le nom et la valeur du cookie, mais sa ne fonctionne pas plus et j'arrive toujours sur la même page, erreur 302.

            Pour le cookie je ne suis pas certain si je dois garde le ; a la fin ou non, j'ai essayer des deux manières et aucune différence.

            Je me suis renseigner plus sur les entête HTTP et sur la méthode POST mais sa ne ma rien apporte pour le moment.
            • Partager sur Facebook
            • Partager sur Twitter

            requette HTTP: POST

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown