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.