zoukankan      html  css  js  c++  java
  • 用Java编写自己的机器人,为你承担苦力

          很多时候,我们希望能够实现自动测试,自动演示功能,或者是其它的一些鼠标和键盘控制的应用(比如帮人点击广告赚利润等)。出于这样的目的,自从JDK1.3开始,它就为我们提供了一个用来产生本机输入事件的机器人类 — java.awt.Robot. 

      下面我来详细介绍Robot的功能及应用示例:

    一、Robot主要的功能

      1. BufferedImage createScreenCapture(Rectangle screenRect)
          说明:该方法提供类似于键盘上的PrintScreen键的功能,将指定矩形区域内的屏幕像素copy下来产生一个BufferedImage。
          应用:我们可以将这个方法用在图形程序中,或是用它来实现远端屏幕传输,可做成远端电脑监控程序等.

      2. void delay(int ms)
          说明:用来将当前的程序(thread)休眠(sleep)若干毫秒(ms)。
          应用:可用来控制程序的延时。这个一般是必须的,因为你在两次间隔操作中肯定有延时。

      3. Color getPixelColor(int x, int y)
          说明:取得给定屏幕坐标像素位置的颜色值。
          应用:就是取颜色RGB值,就不多说了。

      4. void keyPress(int keycode)
          void keyRelease(int keycode)
      说明:这两个方法的作用一看便知,用来产生指定键的按键按下与抬起动作,相当于Win32 API的keyb_event函数,即模拟键盘操作咯,具体keycode值就是KeyEvent.VK_C、KeyEvent.VK_D、KeyEvent.VK_CONTROL什么的,具体应用时直接看Eclipse提示就知道了。
          应用:可用于程序的自动演示、测试等,非常有用。

      5. void mouseMove(int x, int y)
          说明:将鼠标光标移动到指定的屏幕坐标。
          应用:可用于程序的自动演示、测试等,配合其他的方法使用,是不可缺少的。

      6. void mousePress(int buttons)
          void mouseRelease(int buttons)
          void mouseWheel(int wheelAmt)
          说明:上面的三种方法,产生指定鼠标按钮的按下,抬起,及滚轮动作,就是模拟鼠标操作咯,具体buttons的值有InputEvent.BUTTON1_MASK(鼠标左键)、InputEvent.BUTTON3_MASK(鼠标右键,如果是双键鼠标,请改用InputEvent.BUTTON2_MASK)等。
          应用:一样也可用于程序的自动演示、测试等,配合其他方法使用,很重要。

          中途打个小广告哈,就是我昨天才开张的小店咯(http://alexia.taobao.com/),现在还正在整修中,不过货源都有了,男装、内地女装、韩国女装、包包什么的都有咯,喜欢的可以拍下,由于刚开店进的都是质量比较好的价格跟进价差不多,如果说是在这里看到的可以跟我说下,我就原价卖给你咯,因为现在赚的主要是信誉而不是钱啦,先亏后赚,经营之道,嘿嘿如果没看到中意的,可以帮忙收藏下店铺,有活动会第一时间提醒你的,嘿嘿

    二、应用实例

    我写了两个比较小的应用实例,一个是简单的模拟测试,一个是自动点击广告赚利润的,下面分别演示。

    首先编写一些公用的方法Common.java

    package com.alexia;
    
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.Toolkit;
    import java.awt.event.InputEvent;
    import java.awt.event.KeyEvent;
    import java.awt.image.BufferedImage;
    
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    
    /**
     * @description Robot帮助类,实现基本的功能
     * @author Alexia
     * @date 2013/5/18
     *
     */
    public class Common {
    
        /**
         * 鼠标单击(左击),要双击就连续调用
         * 
         * @param r
         * @param x
         *            x坐标位置
         * @param y
         *            y坐标位置
         * @param delay
         *            该操作后的延迟时间
         */
        public static void clickLMouse(Robot r, int x, int y, int delay) {
            r.mouseMove(x, y);
            r.mousePress(InputEvent.BUTTON1_MASK);
            r.delay(10);
            r.mouseRelease(InputEvent.BUTTON1_MASK);
            r.delay(delay);
    
        }
    
        /**
         * 鼠标右击,要双击就连续调用
         * 
         * @param r
         * @param x
         *            x坐标位置
         * @param y
         *            y坐标位置
         * @param delay
         *            该操作后的延迟时间
         */
        public static void clickRMouse(Robot r, int x, int y, int delay) {
            r.mouseMove(x, y);
            r.mousePress(InputEvent.BUTTON3_MASK);
            r.delay(10);
            r.mouseRelease(InputEvent.BUTTON3_MASK);
            r.delay(delay);
    
        }
    
        /**
         * 键盘输入(一次只能输入一个字符)
         * 
         * @param r
         * @param ks
         *            键盘输入的字符数组
         * @param delay
         *            输入一个键后的延迟时间
         */
        public static void pressKeys(Robot r, int[] ks, int delay) {
            for (int i = 0; i < ks.length; i++) {
                r.keyPress(ks[i]);
                r.delay(10);
                r.keyRelease(ks[i]);
                r.delay(delay);
            }
        }
    
        /**
         * 复制
         * 
         * @param r
         * @throws InterruptedException
         */
        void doCopy(Robot r) throws InterruptedException {
            Thread.sleep(3000);
            r.setAutoDelay(200);
            r.keyPress(KeyEvent.VK_CONTROL);
            r.keyPress(KeyEvent.VK_C);
            r.keyRelease(KeyEvent.VK_CONTROL);
            r.keyRelease(KeyEvent.VK_C);
        }
    
        /**
         * 粘贴
         * 
         * @param r
         * @throws InterruptedException
         */
        void doParse(Robot r) throws InterruptedException {
            r.setAutoDelay(500);
            Thread.sleep(2000);
            r.mouseMove(300, 300);
            r.mousePress(InputEvent.BUTTON1_MASK);
            r.mouseRelease(InputEvent.BUTTON1_MASK);
            r.keyPress(KeyEvent.VK_CONTROL);
            r.keyPress(KeyEvent.VK_V);
            r.keyRelease(KeyEvent.VK_CONTROL);
            r.keyRelease(KeyEvent.VK_V);
        }
    
        /**
         * 捕捉全屏慕
         * 
         * @param r
         * @return
         */
        public Icon captureFullScreen(Robot r) {
            BufferedImage fullScreenImage = r.createScreenCapture(new Rectangle(
                    Toolkit.getDefaultToolkit().getScreenSize()));
            ImageIcon icon = new ImageIcon(fullScreenImage);
            return icon;
        }
    
        /**
         * 捕捉屏幕的一个矫形区域
         * 
         * @param r
         * @param x
         *            x坐标位置
         * @param y
         *            y坐标位置
         * @param width
         *            矩形的宽
         * @param height
         *            矩形的高
         * @return
         */
        public Icon capturePartScreen(Robot r, int x, int y, int width, int height) {
            r.mouseMove(x, y);
            BufferedImage fullScreenImage = r.createScreenCapture(new Rectangle(
                    width, height));
            ImageIcon icon = new ImageIcon(fullScreenImage);
            return icon;
        }
    
    }

    在示例之前,注意屏幕坐标位置如何确定,我是下载了一个小工具,用起来十分方便,建议大家使用

    1. 简单的模拟测试

    package com.alexia;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JOptionPane;
    
    public class SimpleTest {
        
        public static void main(String[] args) throws Exception {
    
            final Robot rb = new Robot();
    
            new Thread() {
                public void run() {
                    rb.delay(2000); // 模拟回车
                    rb.keyPress(KeyEvent.VK_ENTER);
                    rb.keyRelease(KeyEvent.VK_ENTER);
                }
            }.start();
    
            rb.delay(3000);
    
            // 设置开始菜单的大概位置
            int x = 40;
            int y = Toolkit.getDefaultToolkit().getScreenSize().height - 10; // 鼠标移动到开始菜单,
            rb.mouseMove(x, y);
            rb.delay(500);
    
            // 单击开始菜单
            Common.clickLMouse(rb, x, y, 500);
            
            rb.delay(1000);
    
            // 运行CMD命令cmd enter
            int[] ks = { KeyEvent.VK_C, KeyEvent.VK_M,
                    KeyEvent.VK_D, KeyEvent.VK_ENTER, };
            Common.pressKeys(rb, ks, 500);
            rb.mouseMove(400, 400);
            rb.delay(500);
    
            // 运行DIR命令dir enter
            ks = new int[] { KeyEvent.VK_D, KeyEvent.VK_I, KeyEvent.VK_R,
                    KeyEvent.VK_ENTER };
            Common.pressKeys(rb, ks, 500);
            rb.delay(1000);
    
            // 运行CLS命令cls enter
            ks = new int[] { KeyEvent.VK_C, KeyEvent.VK_L, KeyEvent.VK_S,
                    KeyEvent.VK_ENTER };
            Common.pressKeys(rb, ks, 500);
            rb.delay(1000);
    
            // 运行EXIT命令exit enter
            ks = new int[] { KeyEvent.VK_E, KeyEvent.VK_X, KeyEvent.VK_I,
                    KeyEvent.VK_T, KeyEvent.VK_ENTER };
            Common.pressKeys(rb, ks, 500);
            rb.delay(1000);
    
            // 右键测试
            x = Toolkit.getDefaultToolkit().getScreenSize().width - 50;
            Common.clickRMouse(rb, x, y, 500);
    
            new Thread() {
                public void run() {
                    rb.delay(1000); // 回车
                    rb.keyPress(KeyEvent.VK_ENTER);
                    rb.keyRelease(KeyEvent.VK_ENTER);
                }
            }.start();
    
            JOptionPane.showMessageDialog(null, "演示完毕!");
        }
    }

    2. 点击网易广告赚取微薄利润

    package com.alexia;
    
    import java.awt.AWTException;
    import java.awt.Desktop;
    import java.awt.Robot;
    import java.awt.event.KeyEvent;
    import java.io.IOException;
    import java.net.URI;
    import java.util.Random;
    
    public class AutoClickAds {
    
        private Robot robot;
    
        private volatile boolean stop = false;
    
        /** Creates a new instance of Main */
    
        public AutoClickAds() {
    
            try {
    
                robot = new Robot();
    
            } catch (AWTException ex) {
    
                ex.printStackTrace();
    
            }
        }
    
        public void init() {
    
            robot.delay(3000);
            
            System.out.println("Click Ads start");
    
            // 在新的浏览器窗口或在已有的浏览器窗口打开指定的URL(JDK 1.6以上)
            Desktop desktop = Desktop.getDesktop();
            if (Desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) {
                URI uri = URI.create("http://lanxuezaipiao.blog.163.com/");
                try {
                    desktop.browse(uri);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            try {
                run();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            stop();
    
            System.out.println("Click Ads stoped");
    
        }
    
        public void run() throws InterruptedException {
            int count = 1;
            
            while (!stop) {
                robot.delay(8000);
                
                int x = 576;
                int y = 567;
                Random r = new Random();
    
                Common.clickLMouse(robot, x, y, 3000);
    
                // 输入向下箭头,实现翻页
                int[] ks = { KeyEvent.VK_DOWN };
                for (int i = 0; i < 10; i++)
                    Common.pressKeys(robot, ks, 0);
    
                int[][] a = { { 500, 103 }, { 500, 163 }, { 500, 223 },
                        { 500, 283 }, { 500, 343 }, { 500, 403 }, { 500, 463 },
                        { 500, 523 }, { 500, 583 }, { 500, 643 }, };
                int b = r.nextInt(5);
                x = a[b][0];
                y = a[b][1];
    
                Common.clickLMouse(robot, x, y, 1000);
    
                // 输入向下箭头,实现翻页
                for (int i = 0; i < 500; i++)
                    Common.pressKeys(robot, ks, 0);
    
                // 输入向下箭头,实现翻页
                int[] kups = { KeyEvent.VK_UP };
                for (int i = 0; i < 3; i++)
                    Common.pressKeys(robot, kups, 0);
    
                x = 900;
                y = 210;
                Common.clickLMouse(robot, x, y, 3000);
                
                x =1090;
                y =15;
                Common.clickLMouse(robot, x, y, 3000);
                
                x = 900;
                y = 135;
                Common.clickLMouse(robot, x, y, 3000);
    
                System.out.println("成功点击第" + count + "个广告!");
            }
    
        }
    
        public synchronized void stop() {
    
            stop = true;
    
        }
    
        /**
         * * @param args the command line arguments
         * 
         * @throws InterruptedException
         */
        public static void main(String[] args) throws InterruptedException {
    
            AutoClickAds mc = new AutoClickAds();
            mc.init();
    
        }
    }

          大家在应用示例时,需要修改具体的坐标值咯,这两个程序做的很死,没有考虑到扩展性,其实大家可以扩大坐标范围进行操作,尽量与机器无关,我这里只是介绍使用方法,所以就没花时间在这上面了,欢迎大家批评指正!!!(如果大家能光临我的小店,那小女子在这就跪谢了)

  • 相关阅读:
    Nginx Backup配置
    CANas分析软件,DBC文件解析,CAN报文分析,仿CANoe曲线显示
    MySQL 报错:MySQL Illegal mix of collations for operation 'like'
    docker部署rebbitmq
    docker部署kafka
    nodejs 环境配置
    spring是怎么运行的?
    Java发展的时间表
    单例模式(转)
    disable的错误使用
  • 原文地址:https://www.cnblogs.com/lanxuezaipiao/p/3085325.html
Copyright © 2011-2022 走看看