Serait-il possible de simuler l'utilisateur

ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018 - 24 nov. 2011 à 12:35
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018 - 2 déc. 2011 à 11:56
Bonjour,
Serait-il possible par programme en C, en DLL par exemple ou je ne sais comment de simuler l'utilisateur du microordinateur ?
J'entends par là, voir ce qu'il y a sur l'écran de l'utilisateur, détecter par exemple les boutons présents, prendre la main sur la souris et simuler un clic sur un bouton, laisser ensuite se dérouler le programme dont le bouton a été cliqué et contrôler à nouveau ce que l'utilisateur a reçu sur l'écran ?
Serait-ce une question saugrenue ou existerait-il une méthode et si oui laquelle ?
Merci

14 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
24 nov. 2011 à 13:09
Bonjour.

Je n'ai pas de réponse directe à cette question.
En revanche, si ton but est d'automatiser certaines tâches "graphiques" redondantes, je t'invite à te pencher vers "autoit", qui pourrait répondre à ton besoin.
http://www.autoitscript.com/site/autoit/downloads/

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
24 nov. 2011 à 14:15
Hello,
Cela s'apparente à du VNC, non?


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
24 nov. 2011 à 14:17
Si c'est juste pour du contrôle, tu as SparkAngels qui est pas mal...


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
24 nov. 2011 à 14:18
Effectivement, peut être veut-il prendre le contrôle d'un ordinateur distant pour y effectuer des tâches de maintenance.
Dans ce cas, le "bureau à distance" de Windows devrait être suffisant, non ?
(En solution de type VNC que j'aime bien, il y a l'excellent TeamViewer, qui est gratuit, mais pas open source).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018
24 nov. 2011 à 17:13
Merci à tous pour toutes vos réponses, mais ça ne répond pas exactement me semble-t-il à ce que je veux faire. J'explique donc plus précisément:
1.- Procédure actuelle
J'ai écrit un programme en C qui exploite des données que je vais chercher sur Internet:
Pour cela, je me connecte d'abord par exemple avec Firefox au site qui fournit ces données, une fois connecté j'entre mon identifiant et mon mot de passe, je clique et ceci m'amène sur une page où je choisis à l'aide de radio boutons les données que je veux télécharger, je clique sur un autre bouton et les données arrivent directement sous firefox et sur l'écran sous forme de fichier texte.
Pour pouvoir les récupérer avec mon programme en C je fais un copié-collé de tout le contenu qui s'affiche dans un fichier texte du bloc-note que je sauvegarde sur mon disque dur.
Enfin, il me suffit ensuite d'aller chercher le fichier que je viens de sauvegarder avec mon programme en C pour pouvoir l'exploiter.
2.- Ce que j'aurais voulu faire, c'est tout simplement tout faire avec mon programme en C. Dans un premier temps j'ai regardé ce que ça donnait de me connecter au site directement avec mon programme en C, mais ça devient vite très compliqué, je me connecte bien et reçois la 1ère page dans mon buffer, mais je me suis rapidement aperçu que rien que pour arriver à la page où je dois taper mon identifiant ça revient pratiquement à réécrire un navigateur: il faut dès le départ savoir interpréter le dernier cookie qui a été sauvegardé lors de la dernière connexion pour pouvoir l'envoyer au site, ensuite il faut réclamer au site par de nombreux échanges (GET) les différentes données nécessaires à la page (avec les cookies appropriés), ce que le navigateur fait naturellement en interprétant tout le code HTML, mais mon but ça n'était pas d'écrire un nouveau navigateur.
Donc, la question que je me pose maintenant et qui rejoint le problème que je soumets, c'est si avec un programme en C (peut-être en dll cette fois-ci) je lance firefox en lui passant en paramètre l'adresse du site, est-ce que vu de mon programme j'ai le moyen de savoir quand firefox a fini d'afficher la 1ère page du site sur l'écran, le moyen, toujours avec mon programme en C de saisir (comme si j'étais un utilisateur) identifiant et mot de passe dans les champs affichés à l'écran, de cliquer sur le bouton envoi etc...
Je pense cette fois-ci avoir été plus clair, mais mon projet n'est pas pour autant plus réaliste...
Merci pour vos suggestions
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
24 nov. 2011 à 17:17
Dans ce cas regarde du côté de curl et notamment de sa bibliothèque "libcurl".
Je pense que tu devrais trouver ton bonheur :)

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
24 nov. 2011 à 17:41
En complément de CptPingu, je rajouterais ceci: plutôt que d'essayer de remplir automatiquement des champs texte et de forcer le click sur un bouton, pourquoi ne pas essayer de voir quelle url est réellement appelée derrière et comment les paramètres sont-ils envoyés? Bon, si c'est en HTTPS, c'est foutu mais si c'est de l'HTTP, c'est gagné.


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
25 nov. 2011 à 09:17
Bonjour,
Comme dit précédemment, j'utilise autoit pour faire ces manipulations. Il y a sur le site un tutorial qui montre l'automatisation d'une installation en simulant les clicks et les choix.
Bonne lecture

louis
0
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018
25 nov. 2011 à 13:56
Bonjour,
- Pour ce qui concerne CURL je ne connais pas, mais le peu que j'ai trouvé sur Internet me fait dire que ça peut peut-être répondre à mon besoin. Par contre j'ai trouvé le site où, a priori, on doit télécharger (http://curl.haxx.se/download.html), mais il y a tellement de trucs que je ne comprends pas ce que je dois télécharger: j'ai Windows XP version familiale et comme compilateur: Borland C++ Builder version 5.5 ?
- Pour ce qui concerne voir quelle URL est réellement appelée derrière, il me semble que c'est ce que j'ai dit avoir déjà essayé (avec les sockets) dans mon précédent message, quand je mets la console web sous Firefox pour voir ce qui passe, il n'y a pas un seul Get d'url qui est lancé par Firefox mais une vingtaine qui est fonction du code HTML reçu dans le premier buffer en réponse au 1er Get, et ceci uniquement pour arriver sur la première page qui s'affiche (donc si je veux faire la même chose, il faut que j'analyse en C tout le code HTML du 1er buffer reçu) De plus quand je regarde les paramètres envoyés par Firefox sur simplement le premier Get, Firefox envoie déjà un Cookie que je suis incapable de simuler: probablement qu'il l'a mémorisé sous une forme codée lors d'une précédente connexion.
- Autoit je ne connais pas non plus, je vais essayer de trouver.
Merci
0
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018
26 nov. 2011 à 15:49
Me voilà de retour, a priori, avec CURL je dois pouvoir faire quelque chose, depuis hier je me bats pour essayer de le faire marcher, voilà ce que j'ai fait:
sur http://curl.haxx.se/download.html j'ai téléchargé: WIN32 2000/XP 7.23.1 libcurl SSL de Günter Knauf 3,07 Mo.
J'ai hésité car il y en a d'autres dont une sans SSL (je ne sais pas ce que veut dire SSL et par conséquent s'il me le faut ou pas).
N'ayant pas trouvé la méthode d'installation de cette library sur mon compilateur Borland C++ Builder version 5.5 sous Windows XP, qu'à cela ne tienne, j'ai fait autrement: j'ai copié les dll dans le même répertoire que mon .exe et j'ai chargé la dll principale et les adresses des points d'entrée des fonctions par programme et par ailleurs j'ai aussi copié les .h dans mon répertoire, ce qui donne le bout de programme suivant qui après mise au point ne comporte aucune erreur de compilation, ni de linkage:
#include <windows.h>
#include "curl.h"

// Déclarations
HANDLE fichsor;
HINSTANCE hinstdll=NULL;
typedef CURL* (WINAPI* PFNTYP1)();
typedef INT (WINAPI* PFNTYP2)(CURL*, INT, VOID*);
typedef INT (WINAPI* PFNTYP3)(CURL*);
typedef INT (WINAPI* PFNTYP4)(CURL*);
PFNTYP1 curl_init;
PFNTYP2 curl_setopt;
PFNTYP3 curl_perform;
PFNTYP4 curl_cleanup;
CURL *session;

// Chargement de la library
hinstdll = LoadLibrary("libcurl.dll");

// Récupération des adresses des points d'entrée des fonctions à utiliser
curl_init = (PFNTYP1)GetProcAddress(hinstdll, "curl_easy_init");
curl_setopt = (PFNTYP2)GetProcAddress(hinstdll, "curl_easy_setopt");
curl_perform = (PFNTYP3)GetProcAddress(hinstdll, "curl_easy_perform");
curl_cleanup = (PFNTYP4)GetProcAddress(hinstdll, "curl_easy_cleanup");
// je vous fait grâce de l'analyse de tous les codes retour, mais il n'y a aucun rejet jusqu'ici

// Allons-y
session = curl_init();
curl_setopt(session, CURLOPT_URL, "http://web.developpez.com/");
fichsor=CreateFile("C:/Textcurl.html", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
curl_setopt(session, CURLOPT_WRITEDATA, fichsor);
curl_setopt(session, CURLOPT_WRITEFUNCTION, (VOID*)WriteFile);
curl_perform(session);
curl_cleanup(session);
CloseHandle(fichsor);

A l'exécution je passe sans erreur sur toutes les fonctions jusqu'à curl_perform, je sais que curl_perform se lance car mon antivirus me demande si j'autorise mon .exe à se connecter à Internet, ce que j'autorise et quelques instant après la fenêtre de mon programme disparaît de l'écran et mon .exe disparaît du gestionnaire, mon fichier Textcurl.html est créé mais vide. Ceci se passe exactement comme lorsqu'il y a un débordement de capacité (programme qui va écrire dans les lignes de code).
Quelqu'un aurait-il SVP une idée de la faille dans les lignes de code ci-dessus ou la library téléchargée était-elle la bonne ?
Merci
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
26 nov. 2011 à 17:59
Salut,

Je n'ai jamais utilisé curl, mais à ta place je regarderais du côté de cette lignes :
curl_setopt(session, CURLOPT_WRITEFUNCTION, (VOID*)WriteFile); 


Dou sors cette "WriteFile" ? Si tu lui donnes un pointeur sur la fonction windows WriteFile, tu n'es probablement pas sorti de l'auberge. CURLOPT_WRITEFUNCTION s'attend à recevoir une fonction un prototype bien différent de celui de CreateFile. La fonction doit avoir cette tête :
size_t function( char *ptr, size_t size, size_t nmemb, void *userdata);


Etudie la doc.

Si tu as définis toi même ta fonction WriteFile, tu peux essayer de voir si elle est appelée par exemple, avec un point d'arrêt si possible, une MessageBox ou autre.
0
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018
26 nov. 2011 à 19:24
Merci pour la réponse, mais j'avais commencé par la fonction fwrite que tu signales et j'avais toujours des erreurs de compilation c'est pour ça que j'étais passé à WriteFile. Je vais réessayer de creuser de ce côté là. Merci
0
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018
27 nov. 2011 à 22:08
Re-bonjour,
Je confirme, avec WritFile je plante à l'exécution, et avec fwrite je ne dépasse pas le stade de la compilation ou du linkage.
En regardant la doc, j'ai redéfini les fonctions de la manière suivante:

#include <stdio.h> // ligne rajoutée
typedef CURL *(WINAPI* PFNTYP1)();
typedef CURLcode (WINAPI* PFNTYP2)(CURL*, CURLoption, VOID*);
typedef CURLcode (WINAPI* PFNTYP3)(CURL*);
typedef CURLcode (WINAPI* PFNTYP4)(CURL*);
PFNTYP1 curl_init;
PFNTYP2 curl_setopt;
PFNTYP3 curl_perform;
PFNTYP4 curl_cleanup;

// Pour le reste sans changement jusqu'à:

fichsor = fopen("C:/Textcurl.html", "w"); // ligne 1 (au lieu de CreateFile)
curl_setopt(session, CURLOPT_WRITEDATA, fichsor); // ligne 2
// ligne 3
curl_setopt(session, CURLOPT_WRITEFUNCTION, fwrite); // ligne 4

// la suite sans changement.

Mes problèmes sont les suivants:
- Quand je laisse la ligne 3 vide, c'est à dire que dans la ligne 4 je me sers de la définition de fwrite contenue dans <stdio.h> que j'ai rajouté, (ce cas correspond exactement à un exemple que j'ai vu sur le net)
j'ai sur la ligne 4 les erreurs de compilation suivantes:
Error E2336 Pointer to overloaded function 'fwrite' doesn't match 'void *' in function __stdcall processmain(HWND__ *,unsigned int,unsigned int,long)
Error E2340 Type mismatch in parameter 3 (wanted 'void *', got 'unsigned int(const void *,unsigned int,unsigned int,FILE *)') in function __stdcall processmain(HWND__ *,unsigned int,unsigned int,long)

- Quand en ligne 3 je mets:
size_t fwrite( char *ptr, size_t size, size_t nmemb, void *userdata); // autre exemple trouvé sur le net
je n'ai plus d'erreur de compilation, mais j'ai l'erreur de linkage suivante:
Error: Unresolved external 'fwrite(char *, unsigned int, unsigned int, void *)' referenced from C:\C++\OBJETS\SOCKET.OBJ

- Quand en ligne 3 je mets:
size_t fwrite(const void *, unsigned int, unsigned int, FILE *); // autre exemple trouvé sur le net
je n'ai pas d'erreur de compilation, mais j'ai l'erreur de linkage suivante:
Fatal: Illegal EXTDEF fixup index in module 'c:\C++\source~2\socket.cpp'

Mes doutes se situent toujours à 3 niveaux:
1) ai-je bien téléchargé la bonne library et que veut dire avec ou sans SSL ?
2) ai-je bien défini le 3ème paramètre (VOID*) de la fonction PFNTYP2, celle qui devient: curl_setopt ?
3) Que dois-je mettre exactement en ligne 3 pour ne plus avoir d'erreur de compilation ou de linkage ?
Merci
0
ArthurAuguste Messages postés 107 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 17 février 2018
2 déc. 2011 à 11:56
Bon, j'ai eu une solution sur un autre site:
En fait dans le source avec WriteFile, il faut qu'au lieu de passer l'adresse du WriteFile, je passe l'adresse d'une fonction à moi qui appelle le WriteFile.
Merci
0
Rejoignez-nous