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