¿Cómo puede un programa controlar otro programa?


Bots, ¿cómo funcionan? ¿Le dicen al videojuego que se presionó una tecla o se hizo clic en el ratón?

Si no, ¿hay alguna manera de que su programa le diga a otro programa que se presionó una tecla? Me gustaría hacer un programa para vencer a algún juego. Así que cualquier recurso o ejemplo son apreciados.

Actualizar: Así que una forma es emular las pulsaciones de teclas, entonces, ¿cuáles son algunos métodos para hacer esto (en cualquier idioma)?

 38
Author: user4157124, 2009-06-23

12 answers

He escrito un montón de bots en un momento u otro (desde Pogo games hasta Yohoho Puzzle Pirates). Para Windows, por lo general va a enviar eventos Win32 para simular los movimientos del ratón, o falsificar los mensajes de bajo nivel realmente enviados entre Windows cuando se hace clic en el ratón. Mucho de esto realmente depende de cómo reaccione el programa (aceptando el mensaje con las coordenadas, o, en el caso de Java, leyendo inmediatamente las coordenadas del ratón). La parte de" automatización " generalmente implica leer la pantalla y escribir heurísticas o algoritmos para determinar el estado, pero también puede ser tan agradable como oler paquetes (una gran cantidad de información allí en implementaciones de póquer pobres) o tan hacky como leer ubicaciones de memoria directamente. "Campo" bastante grande, y mal documentado, ya que es bastante rentable y no es difícil entrar.

Enviando entrada

C/C++ (en Windows)

Para las claves, intente CodeProject:

Http://www.codeproject.com/KB/cpp/sendkeys_cpp_Article.aspx

Y mensajes:

Http://www.codeproject.com/KB/threads/sendmsg.aspx

Lo mejor es aprender a enviar mensajes usando la API Win32, luego usar algo como Spy++ o sus derivados para "realizar ingeniería inversa" sobre cómo se envían las pulsaciones de teclas y los movimientos del ratón a la ventana.

Java

Java tiene una clase de robot increíblemente portátil que es capaz a:

  1. Lee píxeles de la pantalla.
  2. Controla el ratón.
  3. Enviar llaves.

Le daría una oportunidad si usted está buscando rápida y fácil.

Lógica básica

Esto se describe en profundidad en otras partes de Internet, pero la mayoría de los bots siguen un simple flujo de programa de máquina de estado. Lee la pantalla (o los paquetes, o la memoria), descubre en qué "estado" se encuentra en función de sus lecturas y datos anteriores, hace cálculos y envía el resultado de nuevo a la programa.

Leer la pantalla puede ser difícil, pero se puede hacer más fácil si se tiene en cuenta que muchas veces, hay algunos píxeles "afortunados" en relación con la ventana que le darán una idea de en qué estado se encuentra el programa. El proceso de encontrar estos píxeles se puede automatizar.

 48
Author: Stefan Mai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 15:22:02

Algunos programas (como los que grind para usted en un MMORPG) simplemente están emulando las pulsaciones de teclas. Una herramienta para hacer esto es AutoIt.

En cuanto a los bots que realmente juegan los juegos en sí, realmente no he hecho nada con ellos, pero asumo que usarían algún tipo de conjunto predefinido de acciones, tal vez una heurística, pero no es probable.

 4
Author: samoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 13:13:22

Hay un par de tipos de bots. Por lo que recuerdo cuando solía jugar CS (hace mucho, mucho tiempo)

Algunos bots utilizan las bibliotecas de la propia aplicación para inspeccionar el entorno (el mapa, dónde están los jugadores, etc.)...) Los bots también usan la biblioteca para controlar el movimiento. Dudo que haya muchas implementaciones de bot que invoquen mensajes de mouse para decirle al juego cómo moverse, etc...

Algunos bots emulan el protocolo de nivel de aplicación (si es multi-player). Así que en otros palabras, el juego ni siquiera necesita correr. Un bot puede ejecutarse en un juego virtual.

Voy a ir en contra de lo que otro póster ha sugerido: escribir un bot de juego es probablemente un ejercicio más valioso que realmente jugar el juego, y tener curiosidad sobre cómo funcionan es una buena señal. :)

 3
Author: cgp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 13:18:35

El mayor defecto en este concepto no es la entrada, sino la salida del juego. Su bot no puede simplemente presionar aleatoriamente las teclas, necesita saber lo que está "sucediendo". Muy pocos juegos le permiten consultar estos datos que dejaría a su bot para resolver un problema muy complicado: Convertir 60 fotogramas por segundo de datos visuales 2D en un espacio virtual.

Actualmente hay juegos que no solo permiten a los jugadores de bots, sino que los alientan. Open RTS es uno de esos, pero también hay más simples unos como GUN-TACTYX y crobots que son buenos puntos de partida.

 3
Author: SpliFF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 13:21:45

Los bots actuarán como clientes del juego (servidor). Luego, pueden enviar los datos apropiados al igual que un usuario puede enviar manualmente. El bot (cliente) analizará los datos del servidor ("alguien está a punto de atacar desde la izquierda"), etc. El cliente debe ser capaz de calcular el mejor movimiento y enviar los datos apropiados al servidor para ejecutarlo.

No estoy seguro de si esto funcionará con todos los juegos.

 2
Author: Alan Haggai Alavi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 13:15:07

Depende mucho del juego. Por ejemplo, hice un bot para Travian (que es un juego en línea) que utiliza el Internet explorer ActiveX para automatizar movimientos. I worte la aplicación en c# y para conseguir que hacer cosas tomó alrededor de 30 minutos. Es fácil llamar a los métodos en el ActiveX y hacer que haga cosas como rellenar campos de texto o hacer clic en botones. Para iniciar sesión, por ejemplo, he utilizado la siguiente :

var inputs = web.Document.GetElementsByTagName("input").
                        Cast<HtmlElement>();
var nume = inputs.First(h => h.GetAttribute("type") == "text");
var pass = inputs.First(h => h.GetAttribute("type") == "password");
var login = inputs.First(h => h.GetAttribute("type") == "image");
var form = web.Document.GetElementsByTagName("form")[0];

nume.SetAttribute("value", "user");
pass.SetAttribute("value", "pass");
login.InvokeMember("Click");

Para aquellos juegos que están basados en el escritorio las cosas se vuelven más complicadas. Windows permite para una aplicación para enviar mensajes a otra aplicación, así que supongo que podría usar eso para enviar mensajes a un juego (aunque esto funciona para juegos que usan DirectX para la entrada no lo sé)

 2
Author: Titian Cernicova-Dragomir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 13:24:29

Un bot como usted lo describe simplemente emulará las pulsaciones de teclas y los movimientos/clics del ratón, por lo que el juego no puede decir si un humano está jugando u otro programa. No tendría que interactuar con el juego en absoluto.

 1
Author: AlbertoPL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 13:13:08

Puede emular los movimientos/clics del ratón y la entrada del teclado en Java con la clase Robot. También le permite tomar capturas de pantalla.

 1
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 13:50:06

Creo que AutoIt es un gran lenguaje para hacer este tipo de software. A pesar de que no lo he utilizado para construir bots, enviar clics y claves fue muy fácil.

 1
Author: Geo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 14:02:40

Tengo entendido que la mayoría de los bots de juegos de gama alta usan llamadas al sistema para mapearse en el espacio de memoria del cliente del juego, realizar ingeniería inversa a su diseño y manipular directamente las variables internas del programa del cliente. Eso es mucho más trabajo del que me gustaría solo por diversión.

 1
Author: T.E.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 14:07:03

Cuando diga "controlar un programa" piense en cómo se controlan los programas. La mayoría acepta entrada de teclado / ratón.

Si escribe un programa para simular la entrada de teclado/ratón, ahí lo tiene.

Un corolario a esto sería que si un programa aceptara argumentos pasados a través de un cuadro de entrada, escriba un programa para enviar argumentos como si fueran enviados a través de un cuadro de entrada.

Así es como funcionan todos los bots. Espero que arroje un poco de luz para usted!

Editar: Así es como el vasto la mayoría de bots funcionan: -)

 1
Author: Travis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 19:01:44

Para esto necesitas saber programación. Sin embargo, hay programas que le permiten programar con medios visuales. Para ellos, no es necesario ser capaz de programar. Un ejemplo es el programa Kibor. Está diseñado específicamente para tus propósitos y tiene un editor visual con el que puedes crear bots con diagramas de bloque. Descripción del programa Kibor

Captura de pantalla Kibor

Tiene muchas funciones listas para bots. Incluso hay un texto incorporado módulo de reconocimiento Captura de pantalla Kibor. Texto que reconoce

 -2
Author: user9052043,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-04 16:46:15