Serait-il possible de simuler l'utilisateur

Signaler
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018
-
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018
-
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

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
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
Messages postés
15032
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 mai 2021
94
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...
Messages postés
15032
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 mai 2021
94
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...
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
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
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

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
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
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
Messages postés
15032
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 mai 2021
94
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...
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
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
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

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
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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.
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

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
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

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
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

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