好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

用Java编写自己的机器人

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

    }
} 

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

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于用Java编写自己的机器人的详细内容...

  阅读:36次