как построить бота для онлайн флеш игры? - PullRequest
8 голосов
/ 20 ноября 2010

Есть много флэш-игр, которые просят вас делать повторяющиеся действия. Примером может служить FarmVille или получение статистики по онлайн-игре в покер.

Как лучше всего создать интерфейс между тем, что вы видите на экране, алгоритмом бота и щелчком мыши.

В общем, когда я играю в Техасский Холдем на фейсбуке, и если я получаю АА, я хочу, чтобы бот нажал олл-ин. если я не получу AA, я хочу сбросить. это всего лишь пример, а не фактическая стратегия. или другие примеры - задачи маршрутизации в фармвилле.

так в основном. он должен захватить изображение экрана. распознавать шаблоны и преобразовывать их во входные данные алгоритма. алгоритмы вывода будут нажимать на некоторые другие (могут быть такие же) шаблоны.

есть предложения?

Ответы [ 3 ]

5 голосов
/ 20 июня 2014

У меня есть опыт создания простого бота на основе компьютерного зрения для карточной онлайн-игры.

Я использовал кросс-платформенную библиотеку Python, называемую autopy , для обработки автоматического нажатия мыши и ввода с клавиатуры. Экран захвата ботов каждые 0,5 секунды, затем преобразуйте захваченный экран в массив для анализа. Python имеет хорошую обработку изображений (PIL, привязку OpenCV Python) и утилиты машинного обучения (scikit-learn). Для простого распознавания образов изображения бот извлекает среднее значение яркости пикселей в области изображения, чтобы принять решение. Для сложных задач используются сопоставление шаблонов OpenCV и классификатор SVM.

Сервер поймал моего бота в первый раз, поэтому я думаю, что некоторые обнаруживают ботов на стороне сервера. После того, как я добавил больше случайности и гибкости в принятии решений, бот обошел обнаружение ботов на стороне сервера.

Все взяли меня в субботу, и я наслаждался воскресеньем.

4 голосов
/ 20 ноября 2010

Прежде чем пытаться анализировать изображения на экране и производить щелчки мышью (что было бы чрезвычайно сложно), сначала взгляните на данные, фактически отправляемые / получаемые игрой между браузером и сервером.Взаимодействуйте с игрой в обычном режиме и используйте что-то вроде WireShark , чтобы перехватить пакеты и посмотреть, можете ли вы что-то автоматизировать.* хочу, чтобы люди делали то, что вы пытаетесь сделать), но возможно, что общение с сервером - это просто запросы с параметрами.(Я знаю, что это было давно в играх MySpace, таких как Dragon Wars и Mafia Wars.)

Если данные можно анализировать и понимать, то вы можете полностью и просто пропустить интерфейс Flash.написать свой.

1 голос
/ 23 июня 2014

Я сделал много ботов, используя c # и простой элемент управления webBrowser. Обычно, однако, я пытаюсь автоматизировать функцию «щелчка» на элементе без использования фактического моделирования курсора и вызова щелчка.

Пример:

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

Я считаю, что это намного проще, чем на самом деле моделирование курсора, однако моделирование курсора также может быть достигнуто относительно легко, вот код, который я обычно использую:

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

Это позволит щелкнуть левой кнопкой мыши любой элемент с именем "elementid" в загруженном элементе управления webBrowser. Обратите внимание на другие MouseEventFlags, которые могут быть легко реализованы:

Вот пример для щелчка правой кнопкой мыши:

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