2010-11-20 26 views
7

hay muchos juegos flash que te piden que hagas acciones repetitivas. un ejemplo sería Farmville o obtener estadísticas sobre el juego de póker en línea.cómo construir un bot para un juego flash en línea?

¿Cuál es la mejor manera de crear una interfaz entre lo que se ve en la pantalla, el algoritmo de un bot y hacer clic con el mouse?

así que, básicamente, cuando estoy jugando un texas hold'em en Face Book y si obtengo AA, quiero que el bot haga clic en all-in. si no obtengo AA, quiero retirarme. esto es solo un ejemplo, no la estrategia real. u otros ejemplos serían tareas de enrutamiento en farmville.

básicamente. tiene que tomar una foto de la pantalla. reconocer patrones y convertirlos en una entrada del algoritmo. los algoritmos de salida harían clic en algunos otros patrones (pueden ser iguales).

alguna sugerencia?

+0

hay un puesto similar aquí http://stackoverflow.com/questions/1964529/online-trading-bot que tiene un enlace para construir un bot de póker http://www.codingthewheel.com/archives/how-i-built-a-working-poker-bot. Obviamente me gustaría hacer smtn similar pero tengo curiosidad si hay mejores herramientas en estos días. Y a pesar de que es más fácil ver los datos enviados y recibidos, mirar la pantalla y luego hacer que la computadora se mueva, el mouse es más general. –

+0

parece que esta también podría ser una forma de hacerlo http://www.mjtnet.com/blog/2006/10/11/see-the-screen-with-image-recognition/ –

Respuesta

3

Tengo experiencia construyendo un bot simple basado en la visión por computadora para un juego de cartas en línea.

Utilicé una biblioteca de python crossplatform llamada autopy para manejar la entrada de teclado y el mouse automatizados. El bot captura la pantalla cada 0.5 segundos, luego convierte la pantalla capturada en una matriz numpy para su análisis. Python tiene un buen procesamiento de imágenes (PIL, enlace python OpenCV) y utilidades de aprendizaje automático (scikit-learn). Para el reconocimiento de patrones de imágenes simples, la media de extracto de bot del brillo de píxeles sobre una región de imagen para tomar una decisión. Para los complicados, se está utilizando la coincidencia de plantilla OpenCV y el clasificador SVM.

El servidor capturó mi bot la primera vez, así que supongo que hay detección de bots en el lado del servidor. Después de que agregué más aleatoriedad y una toma de decisiones más flexible, el bot ha pasado por alto la detección bot de servidor.

Todos me llevaron un sábado y disfruté el domingo.

4

Antes de intentar analizar imágenes de pantalla y producir clics del mouse (lo que sería extremadamente difícil), primero eche un vistazo a los datos que el juego está enviando/recibiendo entre el navegador y el servidor. Interactúa con el juego como siempre y utiliza algo como WireShark para capturar los paquetes y ver si se puede automatizar.

Es poco probable (ya que específicamente no desea querer que la gente haga lo que está intentando hacer), pero es posible que la comunicación con el servidor sea simplemente solicitudes simples con parámetros. (Sé que este fue el caso hace mucho tiempo con los juegos de MySpace, como Dragon Wars y Mafia Wars.)

Si los datos son algo que puede analizar y comprender, puede omitir la interfaz de Flash por completo y simplemente escribir su propio.

+0

wireshark suena bien. lo investigaré. pero también tengo curiosidad por c si solo puedo interactuar a través de la pantalla, ya que es más general y también podría ahorrar tiempo tratando de descubrir los valores que se enviaron. –

+1

@kirill_igum: probablemente haya bibliotecas para enviar datos a una pantalla en forma de entrada de mouse/teclado. Por ejemplo, WatiN es una biblioteca .NET decente para interactuar con un navegador (elementos HTML, no tanto para Flash, aunque puede haber otros). Sin embargo, leer datos de la pantalla va a ser extremadamente difícil. Incluso si es posible (es posible que sea una palabra más precisa), no creo que vaya a ser tan genérico como usted espera. – David

+0

No entiendo cómo puede ser difícil si sabes lo que estás buscando. Por ejemplo: almorzo un programa que toma una captura de pantalla del juego flash o el navegador o la pantalla. conviértalo en una matriz donde cada elemento es un número que representa un color. un código hará coincidir una submatriz con una de mi biblioteca (patrones pre-almacenados que estoy buscando). si coincide, el código muestra la (s) ubicación (es) de los patrones. así que cuando quiera usarlo solo tendré que ingresar los patrones que estoy buscando. y si cambian Tendría que cambiarlos a mano –

1

He creado muchos bot usando C# y un control webBrowser simple. Normalmente, sin embargo, trato de automatizar la función de "hacer clic" en un elemento sin utilizar simulando un cursor e invocando un clic.

Ejemplo:

webBrowser1.Document.GetElementById("elementid").InvokeMember("Click"); 

Me parece mucho más fácil que en realidad la simulación de un cursor, sin embargo simulando un cursor también puede lograrse con relativa facilidad, aquí está el código que suelen hacer uso de:

//Example of how to use it: 
    Point controlLoc = this.PointToScreen(webbrowser1.Location); 
    controlLoc.X = controlLoc.X + webbrowser1.Document.GetElementById("elementid").OffsetRectangle.Left; 
    controlLoc.Y = controlLoc.Y + webbrowser1.Document.GetElementById("elementid").OffsetRectangle.Top; 
    Cursor.Position = controlLoc; 
    MouseSimulator.ClickLeftMouseButton(); 

public class MouseSimulator 
{ 
[DllImport("user32.dll", SetLastError = true)] 
static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); 

[StructLayout(LayoutKind.Sequential)] 
struct INPUT 
{ 
    public SendInputEventType type; 
    public MouseKeybdhardwareInputUnion mkhi; 
} 
[StructLayout(LayoutKind.Explicit)] 
struct MouseKeybdhardwareInputUnion 
{ 
    [FieldOffset(0)] 
    public MouseInputData mi; 

    [FieldOffset(0)] 
    public KEYBDINPUT ki; 

    [FieldOffset(0)] 
    public HARDWAREINPUT hi; 
} 
[StructLayout(LayoutKind.Sequential)] 
struct KEYBDINPUT 
{ 
    public ushort wVk; 
    public ushort wScan; 
    public uint dwFlags; 
    public uint time; 
    public IntPtr dwExtraInfo; 
} 
[StructLayout(LayoutKind.Sequential)] 
struct HARDWAREINPUT 
{ 
    public int uMsg; 
    public short wParamL; 
    public short wParamH; 
} 
struct MouseInputData 
{ 
    public int dx; 
    public int dy; 
    public uint mouseData; 
    public MouseEventFlags dwFlags; 
    public uint time; 
    public IntPtr dwExtraInfo; 
} 
[Flags] 
enum MouseEventFlags : uint 
{ 
    MOUSEEVENTF_MOVE = 0x0001, 
    MOUSEEVENTF_LEFTDOWN = 0x0002, 
    MOUSEEVENTF_LEFTUP = 0x0004, 
    MOUSEEVENTF_RIGHTDOWN = 0x0008, 
    MOUSEEVENTF_RIGHTUP = 0x0010, 
    MOUSEEVENTF_MIDDLEDOWN = 0x0020, 
    MOUSEEVENTF_MIDDLEUP = 0x0040, 
    MOUSEEVENTF_XDOWN = 0x0080, 
    MOUSEEVENTF_XUP = 0x0100, 
    MOUSEEVENTF_WHEEL = 0x0800, 
    MOUSEEVENTF_VIRTUALDESK = 0x4000, 
    MOUSEEVENTF_ABSOLUTE = 0x8000 
} 
enum SendInputEventType : int 
{ 
    InputMouse, 
    InputKeyboard, 
    InputHardware 
} 

public static void ClickLeftMouseButton() 
{ 

    INPUT mouseDownInput = new INPUT(); 
    mouseDownInput.type = SendInputEventType.InputMouse; 
    mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN; 
    SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT())); 

    INPUT mouseUpInput = new INPUT(); 
    mouseUpInput.type = SendInputEventType.InputMouse; 
    mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP; 
    SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT())); 
} 

Esto hará clic izquierdo en cualquier elemento llamado "elementid" en un control cargado webBrowser. Observe los otros MouseEventFlags que se puede implementar fácilmente:

Aquí está un ejemplo de botón derecho del ratón:

public static void ClickRightMouseButton() 
{ 
    INPUT mouseDownInput = new INPUT(); 
    mouseDownInput.type = SendInputEventType.InputMouse; 
    mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTDOWN; 
    SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT())); 

    INPUT mouseUpInput = new INPUT(); 
    mouseUpInput.type = SendInputEventType.InputMouse; 
    mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTUP; 
    SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT())); 
} 
Cuestiones relacionadas