2010-11-20 18 views
7

बहुत सारे फ़्लैश गेम्स हैं जो आपको दोहराए जाने वाले कार्यों को करने के लिए कहते हैं। एक उदाहरण फार्मविले होगा या ऑन-लाइन पोकर गेम पर आंकड़े प्राप्त होंगे।ऑनलाइन फ़्लैश खेल के लिए एक बॉट कैसे बनाया जाए?

स्क्रीन पर जो देखते हैं, एक बॉट का एल्गोरिदम और माउस पर क्लिक करने के बीच इंटरफ़ेस बनाने का सबसे अच्छा तरीका क्या है।

इसलिए मूल रूप से, जब मैं फेस बुक पर टेक्सास होल्डम खेल रहा हूं और यदि मुझे एए मिलता है तो मैं बॉट को सभी में क्लिक करना चाहता हूं। अगर मुझे एए नहीं मिलता है तो मैं गुना करना चाहता हूं। यह सिर्फ एक उदाहरण है, वास्तविक रणनीति नहीं। या अन्य उदाहरण फार्मविले में रूटिंग कार्यों होंगे।

मूल रूप से। इसे स्क्रीन की एक तस्वीर लेना है। पैटर्न को पहचानें और उन्हें एल्गोरिदम के इनपुट में परिवर्तित करें। आउटपुट एल्गोरिदम कुछ अन्य (समान हो सकते हैं) पैटर्न पर क्लिक करेंगे।

कोई सुझाव?

+0

वहां भी इसी तरह पोस्ट यहाँ है http://stackoverflow.com/questions/1964529/online-trading-bot जिसमें पोकर बॉट बनाने के लिए एक लिंक है http://www.codingthewheel.com/archives/how-i-built-a-working-poker-bot। जाहिर है, मैं इसी तरह के smtn करना चाहता हूँ लेकिन अगर मैं इन दिनों बेहतर उपकरण हैं तो मैं उत्सुक हूं। और भले ही भेजा गया डेटा प्राप्त करना और प्राप्त करना आसान हो, स्क्रीन को देखकर और फिर कंप्यूटर को ले जाने से माउस अधिक सामान्य हो जाता है। –

+0

ऐसा लगता है कि यह करने का एक तरीका भी हो सकता है http://www.mjtnet.com/blog/2006/10/11/see-the-screen-with-image-recognition/ –

उत्तर

3

मुझे ऑनलाइन कार्ड गेम के लिए एक साधारण कंप्यूटर दृष्टि आधारित बॉट बनाने का अनुभव है।

मैंने स्वचालित माउस क्लिक और कीबोर्ड इनपुट को संभालने के लिए ऑटोपी नामक एक क्रॉसप्लेटफार्म पायथन लाइब्रेरी का उपयोग किया। प्रत्येक 0.5 सेकंड में बॉट कैप्चर स्क्रीन, फिर कैप्चर की गई स्क्रीन को विश्लेषण के लिए एक numpy सरणी में परिवर्तित करें। पायथन में अच्छी छवि प्रसंस्करण (पीआईएल, ओपनसीवी पायथन बाध्यकारी) और मशीन लर्निंग यूटिलिटीज (विज्ञान-सीखना) है। सरल छवि पैटर्न पहचान के लिए, निर्णय लेने के लिए एक छवि क्षेत्र पर बॉट निकालने का मतलब पिक्सेल चमक का मतलब है। जटिल लोगों के लिए, ओपनसीवी टेम्पलेट मिलान और एसवीएम क्लासिफायरफायर का उपयोग किया जा रहा है।

सर्वर ने पहली बार अपना बॉट पकड़ा, तो मुझे लगता है कि कुछ सर्वर के पक्ष में बॉट डिटेक्शन है। मैंने अधिक यादृच्छिकता और लचीली निर्णय लेने के बाद, बॉट ने सर्वरसाइड बॉट का पता लगा दिया है।

सभी ने मुझे शनिवार लिया और मैंने रविवार का आनंद लिया।

4

स्क्रीन छवियों को पार्स करने और माउस क्लिक (जो बहुत मुश्किल हो जाएगा) का उत्पादन करने से पहले, ब्राउज़र और सर्वर के बीच गेम द्वारा वास्तव में भेजे गए/प्राप्त किए गए डेटा को देखें। गेम को सामान्य के रूप में इंटरैक्ट करें और पैकेट को कैप्चर करने के लिए WireShark जैसे कुछ का उपयोग करें और देखें कि यह ऐसा कुछ है जिसे आप स्वचालित कर सकते हैं।

यह असंभव है (क्योंकि वे विशेष रूप से नहीं चाहते हैं कि लोग ऐसा करने के लिए प्रयास करें जो आप कर रहे हैं), लेकिन यह संभव है कि सर्वर के साथ संचार पैरामीटर के साथ बस सरल अनुरोध है। (मुझे पता है कि यह बहुत समय पहले माईस्पेस गेम्स जैसे ड्रैगन वॉर्स और माफिया युद्धों के साथ था।)

यदि डेटा कुछ ऐसा है जो आप पार्स और समझ सकते हैं तो आप फ्लैश इंटरफेस को पूरी तरह से छोड़ सकते हैं और बस अपना लिख ​​सकते हैं खुद।

+0

wireshark अच्छा लगता है। मुझे इस पर गौर करना होगा। लेकिन मैं सी के लिए भी उत्सुक हूं अगर मैं स्क्रीन के माध्यम से बस बातचीत कर सकता हूं क्योंकि यह अधिक सामान्य है और भेजे गए मूल्यों को समझने का प्रयास करने में भी समय बचा सकता है। –

+1

@kirill_igum: माउस/कीबोर्ड इनपुट के रूप में स्क्रीन पर डेटा भेजने के लिए शायद वहां पुस्तकालय हैं। उदाहरण के लिए, WatiN एक ब्राउज़र के साथ बातचीत करने के लिए एक सभ्य .NET लाइब्रेरी है (HTML तत्व, फ़्लैश के लिए इतना नहीं, हालांकि अन्य हो सकते हैं)। हालांकि, स्क्रीन से डेटा पढ़ना बेहद मुश्किल होगा। यहां तक ​​कि यदि यह संभव है (व्यवहार्य एक और सटीक शब्द हो सकता है) मुझे नहीं लगता कि यह अपेक्षाकृत सामान्य होने वाला है। – David

+0

मैं यह नहीं मानता कि यह कैसे मुश्किल हो सकता है यदि आप जानते हैं कि आप क्या खोज रहे हैं। उदाहरण के लिए: मैं एक प्रोग्राम लंच करता हूं जो फ्लैश गेम या ब्राउज़र या स्क्रीन का स्क्रीन शॉट लेता है। इसे एक मैट्रिक्स में परिवर्तित करें जहां प्रत्येक तत्व एक संख्या है जो रंग का प्रतिनिधित्व करता है। एक कोड एक उप-मैट्रिक्स से मेरी लाइब्रेरी (प्री-संग्रहित पैटर्न जो मैं ढूंढ रहा हूं) से मेल खाता हूं। यदि यह मेल खाता है, तो कोड पैटर्न के स्थान (ओं) को आउटपुट करता है। इसलिए जब मैं इसका उपयोग करना चाहता हूं तो मुझे केवल उन पैटर्न को इनपुट करना होगा जिन्हें मैं ढूंढ रहा हूं। और अगर वे बदल जाते हैं। मुझे उन्हें हाथ से बदलना होगा –

1

मैंने सी # और एक साधारण वेब ब्राउजर नियंत्रण का उपयोग करके कई बॉट बनाए हैं। आमतौर पर मैं एक कर्सर को सिमुलेट करने और एक क्लिक का आह्वान करने के उपयोग के बिना किसी तत्व पर "क्लिक" फ़ंक्शन को स्वचालित करने का प्रयास करता हूं।

उदाहरण:

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

यह लोड किए गए वेब ब्राउजर नियंत्रण में "एलिमेंटिड" नामक किसी भी तत्व पर बायाँ क्लिक करेगा। सूचना अन्य 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())); 
} 
संबंधित मुद्दे