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ó 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. –
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/ –