2010-11-20 3 views
7

Il y a beaucoup de jeux flash qui vous demandent de faire des actions répétitives. un exemple serait FarmVille ou obtenir des statistiques sur le jeu de poker en ligne.comment construire un bot pour le jeu flash en ligne?

Quelle est la meilleure façon de créer une interface entre ce que vous voyez à l'écran, l'algorithme d'un bot et en cliquant sur la souris.

donc en gros, quand je joue un Texas Hold'em sur le livre de visage et si je reçois AA je veux le bot de cliquer tout-en. si je ne reçois pas AA, je veux me coucher. c'est juste un exemple, pas la stratégie réelle. ou un autre exemple serait routage des tâches dans farmville.

donc fondamentalement. il doit saisir une image de l'écran. reconnaître les modèles et les convertir en une entrée de l'algorithme. les algorithmes de sortie seraient en cliquant sur d'autres modèles (peut-être même).

des suggestions?

+0

il y a un poste similaire ici http://stackoverflow.com/questions/1964529/online-trading-bot qui a un lien avec la construction d'un bot de poker http://www.codingthewheel.com/archives/how-i-built-a-working-poker-bot. évidemment je voudrais faire smtn semblable mais je suis curieux s'il y a de meilleurs outils ces jours. Et même s'il est plus facile de regarder les données envoyées et reçues, en regardant l'écran puis en faisant bouger l'ordinateur, la souris est plus générale. –

+0

ressemble à cela pourrait être aussi une façon de le faire http://www.mjtnet.com/blog/2006/10/11/see-the-screen-with-image-recognition/ –

Répondre

3

J'ai expérience dans la construction d'une vision simple ordinateur bot pour un jeu de cartes en ligne.

J'ai utilisé une bibliothèque python crossplateforme appelée autopy pour gérer les saisies automatiques au clavier et au clavier. L'écran de capture du bot toutes les 0,5 secondes, puis convertir l'écran capturé dans un tableau numpy pour l'analyse. Python a un bon traitement d'image (PIL, liaison python OpenCV) et des utilitaires d'apprentissage machine (scikit-learn). Pour une simple reconnaissance de modèle d'image, l'extraction de bot signifie la luminosité d'un pixel sur une région d'image pour prendre une décision. Pour les compliqués, la correspondance de modèle OpenCV et le classificateur SVM sont utilisés.

Le serveur a attiré mon bot la première fois, donc je suppose que certains il y a la détection des bots sur le côté serveur. Après avoir ajouté plus de caractère aléatoire et de prise de décision flexible, le robot a ignoré la détection des robots côté serveur.

Tout m'a pris un samedi et j'ai apprécié dimanche.

4

Avant d'essayer d'analyser les images d'écran et de produire des clics de souris (ce qui serait extrêmement difficile), d'abord jeter un coup d'œil les données effectivement envoyées/reçues par le jeu entre le navigateur et le serveur. Interagissez normalement avec le jeu et utilisez quelque chose comme WireShark pour capturer les paquets et voir si c'est quelque chose que vous pouvez automatiser.

Il est peu probable (puisqu'ils spécifiquement ne veulent pas que les gens fassent ce que vous essayez de faire), mais il est possible que la communication avec le serveur est juste de simples demandes avec des paramètres. (Je sais que c'était le cas il y a longtemps avec les jeux MySpace, tels que Dragon Wars et Mafia Wars.)

Si les données sont quelque chose que vous pouvez analyser et comprendre, vous pouvez passer complètement l'interface Flash et écrire posséder.

+0

Wireshark sonne bien. Je vais regarder dans cela. mais je suis aussi curieux de c si je peux juste interagir à travers l'écran, car il est plus général et pourrait aussi gagner du temps en essayant de comprendre les valeurs qui ont été envoyées. –

+1

@kirill_igum: Il existe probablement des bibliothèques pour envoyer des données à un écran sous la forme d'une entrée souris/clavier. Par exemple, WatiN est une bibliothèque .NET décente pour interagir avec un navigateur (éléments HTML, pas tellement pour Flash, bien qu'il puisse y en avoir d'autres). Cependant, lire les données de l'écran va être extrêmement difficile. Même si c'est possible (ce qui est peut-être un mot plus précis), je ne pense pas que ce soit aussi générique que ce à quoi vous vous attendez. – David

+0

Je ne vois pas comment cela peut être difficile si vous savez ce que vous cherchez. Par exemple: Je déjeune un programme qui prend une capture d'écran du jeu flash ou du navigateur ou de l'écran. convertissez-le en une matrice où chaque élément est un nombre qui représente une couleur. un code va correspondre à une sous-matrice à un de ma bibliothèque (modèles pré-stockés que je cherche). s'il correspond, le code sort le (s) emplacement (s) des motifs. donc quand je veux l'utiliser je voudrais juste entrer les modèles que je cherche. et s'ils changent. Je devrais les changer à la main –

1

J'ai fait beaucoup bot en utilisant C# et un simple contrôle WebBrowser. Habituellement, cependant, j'essaie d'automatiser la fonction "clic" sur un élément sans l'utilisation de simuler réellement un curseur et en invoquant un clic.

Exemple:

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

Je trouve cela beaucoup plus facile que la simulation en fait un curseur, mais la simulation d'un curseur peut également obtenu relativement facilement, voici le code que je fais généralement appel:

//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())); 
} 

Cela gauche cliquez sur un élément nommé « elementid » dans un contrôle WebBrowser chargé. Remarquez les autres MouseEventFlags qui peuvent être facilement mises en œuvre:

Voici un exemple pour faire un clic droit:

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())); 
} 
Questions connexes