2010-11-20 33 views
7

có rất nhiều trò chơi flash yêu cầu bạn thực hiện các hành động lặp đi lặp lại. một ví dụ sẽ là FarmVille hoặc nhận được số liệu thống kê về trò chơi poker trực tuyến.làm thế nào để xây dựng một bot cho trò chơi flash trực tuyến?

Cách tốt nhất để tạo giao diện giữa những gì bạn thấy trên màn hình, thuật toán của bot và cách nhấp chuột.

vì vậy về cơ bản, khi tôi đang chơi trò chơi trên mặt sách và nếu tôi nhận được AA, tôi muốn bot nhấp vào tất cả trong. nếu tôi không nhận được AA tôi muốn gấp. đây chỉ là một ví dụ, không phải là chiến lược thực tế. hoặc một ví dụ khác sẽ là nhiệm vụ định tuyến trong tiếp cận thông.

về cơ bản. nó phải lấy một hình ảnh của màn hình. nhận dạng các mẫu và chuyển đổi chúng thành đầu vào của thuật toán. các thuật toán đầu ra sẽ nhấp vào một số mẫu khác (có thể giống nhau).

bất kỳ đề xuất nào?

+0

có một bài tương tự ở đây http://stackoverflow.com/questions/1964529/online-trading-bot trong đó có một liên kết để xây dựng một bot poker http://www.codingthewheel.com/archives/how-i-built-a-working-poker-bot. rõ ràng tôi muốn làm smtn tương tự nhưng tôi tò mò nếu có những công cụ tốt hơn những ngày này. Và mặc dù nó dễ dàng hơn để xem xét các dữ liệu được gửi và nhận được, nhìn vào màn hình và sau đó làm cho máy tính di chuyển chuột là tổng quát hơn. –

+0

có vẻ như đây cũng là một cách để làm điều đó http://www.mjtnet.com/blog/2006/10/11/see-the-screen-with-image-recognition/ –

Trả lời

3

Tôi có kinh nghiệm xây dựng rô bốt dựa trên máy tính đơn giản dựa trên trò chơi thẻ trực tuyến.

Tôi đã sử dụng thư viện python crossplatform có tên là autopy để xử lý thao tác nhấp chuột và bàn phím tự động. Màn hình chụp bot cứ sau 0.5 giây, sau đó chuyển đổi màn hình đã chụp thành một mảng mờ để phân tích. Python có xử lý hình ảnh tốt (PIL, ràng buộc python OpenCV) và các tiện ích học máy (scikit-learn). Để nhận dạng mẫu hình ảnh đơn giản, việc trích xuất bot có nghĩa là độ sáng pixel trên một vùng hình ảnh để đưa ra quyết định. Đối với những cái phức tạp, việc so khớp mẫu OpenCV và trình phân loại SVM đang được sử dụng.

Máy chủ bắt gặp bot của tôi lần đầu tiên, vì vậy tôi đoán có một số bot phát hiện ở phía máy chủ. Sau khi tôi bổ sung thêm sự ngẫu nhiên và đưa ra quyết định linh hoạt, bot đã bỏ qua việc phát hiện bot serverside.

Tất cả đã mang đến cho tôi một ngày Thứ Bảy và tôi rất thích chủ nhật.

4

Trước khi cố gắng phân tích hình ảnh màn hình và tạo nhấp chuột (điều này sẽ cực kỳ khó), trước tiên hãy xem dữ liệu thực sự được gửi/nhận bởi trò chơi giữa trình duyệt và máy chủ. Tương tác với các trò chơi như bình thường và sử dụng một cái gì đó như WireShark để nắm bắt các gói dữ liệu và xem đó là một cái gì đó bạn có thể tự động hóa. Không có gì (vì họ đặc biệt là không muốn mọi người làm những gì bạn đang cố gắng làm), nhưng có thể việc liên lạc với máy chủ chỉ là các yêu cầu đơn giản với các tham số. (Tôi biết đây là trường hợp một thời gian dài trước đây với các trò chơi MySpace, chẳng hạn như Dragon Wars và Mafia Wars.)

Nếu dữ liệu là thứ bạn có thể phân tích và hiểu thì bạn có thể bỏ qua giao diện Flash hoàn toàn và chỉ cần viết sở hữu.

+0

wireshark âm thanh tốt. Tôi sẽ nhìn vào đó. nhưng tôi cũng tò mò để c nếu tôi chỉ có thể tương tác thông qua màn hình vì nó tổng quát hơn và cũng có thể tiết kiệm thời gian cố gắng tìm ra các giá trị đã được gửi đi. –

+1

@kirill_igum: Có thể có các thư viện ở đó để gửi dữ liệu đến màn hình dưới dạng đầu vào chuột/bàn phím. Ví dụ, WatiN là một thư viện .NET phong nha để tương tác với một trình duyệt (các phần tử HTML, không nhiều cho Flash, mặc dù có thể có những người khác). Tuy nhiên, việc đọc dữ liệu từ màn hình sẽ vô cùng khó khăn. Ngay cả khi nó có thể (khả thi có thể là một từ chính xác hơn) Tôi không nghĩ rằng nó sẽ được như chung chung như bạn mong đợi. – David

+0

Tôi không làm theo cách nó có thể khó khăn nếu bạn biết những gì bạn đang tìm kiếm. Ví dụ: tôi ăn trưa một chương trình chụp ảnh màn hình của trò chơi flash hoặc trình duyệt hoặc màn hình. chuyển đổi nó thành một ma trận trong đó mỗi phần tử là một số đại diện cho một màu. một mã sẽ khớp với một ma trận phụ với một từ thư viện của tôi (các mẫu được lưu trước mà tôi đang tìm kiếm). nếu nó khớp, mã sẽ xuất (các) vị trí của các mẫu. vì vậy khi tôi muốn sử dụng nó tôi sẽ chỉ phải nhập các mẫu mà tôi đang tìm kiếm. và nếu họ thay đổi. tôi sẽ phải thay đổi chúng bằng tay –

1

Tôi đã tạo nhiều bot bằng cách sử dụng C# và điều khiển trình duyệt web đơn giản. Thông thường tuy nhiên tôi cố gắng tự động hóa chức năng "click" trên một phần tử mà không cần sử dụng mô phỏng một con trỏ thực sự và gọi một cú nhấp chuột.

Ví dụ:

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

Tôi tìm thấy điều này dễ dàng hơn nhiều so với thực tế mô phỏng một con trỏ, tuy nhiên mô phỏng một con trỏ cũng có thể đạt được tương đối dễ dàng, đây là đoạn code tôi thường tận dụng:

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

Điều này sẽ nhấp chuột trái vào bất kỳ phần tử nào có tên "elementid" trong điều khiển webBrowser đã tải. Chú ý MouseEventFlags khác mà có thể dễ dàng được thực hiện:

Dưới đây là một ví dụ cho click chuột phải:

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())); 
} 
Các vấn đề liên quan