Java开发游戏脚本(第二卷)

前卷问题总结

  1. 取点过于固定,但是游戏窗口不固定,一旦游戏窗口移动,取的点就错误,脚本无法正常运行。
  2. 脚本一旦无法正常运行也没有通知,用户无法实时知道脚本运行情况,除非用户一直查看脚本运行情况。
  3. 我发现有些软件模拟不了鼠标操作,这可能是因为该软件可能有屏蔽模拟鼠标操作的功能,也可能是因为该软件是需要管理员权限才能控制的,看看这软件快捷方式图标右下方有没有小盾牌,就是这盾牌阻止了模拟鼠标操作。

固定游戏窗口

需要的第三方Jar包: jna-5.5.0.jar 和 jna-platform-5.5.0.jar
本人用的是这版本,下载其他版本也是可以用的。

     /**
	 * 本方法会根据指定的游戏标题和游戏文件路径,开启游戏窗口并且移动到指定的位置.
	 * 
	 * @param gameTitle  - 指定的游戏标题
	 * @param gamePath   - 指定的游戏文件路径
	 * @param gameX      - 指定的游戏的X轴位置
	 * @param gameY      - 指定的游戏的Y轴位置
	 * @param gameWidth  - 指定的游戏的窗口宽度
	 * @param gameHeight - 指定的游戏的窗口高度
	 * 
	 * @throws Exception- 如果指定的游戏路径错误 或者 发生 I/O 错误 则抛出异常
	 */
	public static void moveGameWindow(String gameTitle, String gamePath, int gameX, int gameY, int gameWidth, int gameHeight) throws Exception {

		// 获取指定顶级窗口的句柄
		HWND hwnd = User32.INSTANCE.FindWindow(null, gameTitle);
		if (hwnd == null) {
		    // 如果没有找到游戏窗口就启动游戏窗口
			Runtime.getRuntime().exec("cmd /c " + gamePath);
			return;
		}
		// 设置指定窗口的显示状态
		User32.INSTANCE.ShowWindow(hwnd, 1);
		// 激活指定窗口
		User32.INSTANCE.SetForegroundWindow(hwnd);
		// 获取指定窗口的位置
		User32.INSTANCE.MoveWindow(hwnd, gameX, gameY, gameWidth, gameHeight, true);

	}

你只需要把参数写入文件中,然后每次运行脚本前读取参数,然后调用这方法就能解决固定点问题,你也可以做个图像识别系统,这样只需要在图片库放图片也可以解决这问题,而且可以移动窗口也可以正常运行,但是对于计算机来说,计算图片数据量大,效率远远不及我只取一点计算的效率。

脚本通知

播放音乐

需要的第三方Jar包: jl1.0.1.jar
本人用的是这版本,下载其他版本也是可以用的。

String mp3URL = "这里填mp3文件的路径";
File file = new File(mp3URL);
Player player = new Player(new BufferedInputStream(new FileInputStream(file)));
player.play();

注意:播放音乐的线程会在播放过程中被阻塞,最好就是运用多线程来播放音乐,什么时候播放呢?你可以控制一下运行模拟鼠标操作的线程,弄个计数变量,每次取点进行对比都会加一,如果取点对比一致,鼠标移动后,计数变量归零,重新计数,当计数量达到一定时,跳出取点对比的无限循环中,比如循环体每次运行到底会休眠1秒,我定下规则:如果60秒鼠标都没有操作则判断为脚本出现异常,需要播放音乐了,所以当计数变量大于60就break;

邮件通知

需要的第三方Jar包: javax.mail.jar
本人用的是这版本,下载其他版本也是可以用的。

准备事项

点击设置
设置
点击账户
账户
开启POP3/SMTO服务
开启服务
开启服务后会得到一个授权码,你需要的就是这授权码,这样就可以用这个账号来发送邮件给用户了,我推荐使用这方式,因为它可以带图片。

关键代码

     /**
	 * 本方法用于发送QQ邮箱到指定收件人
	 * 
	 * @param senderAccount     - 寄件人的QQ账号
	 * @param authorizationCode - 寄件人的邮件POP3/SMTP服务的授权码
	 * @param recipientAccount  - 收件人的QQ账号
	 * @param MailTheme         - 指定邮件主题
	 * @param MailContent       - 指定邮件内容
	 * 
	 * @throws Exception - 如果网络故障或者因授权码输入错误导致身份验证失败则抛出异常
	 * 
	 */
	public static void sendMessages(String senderAccount, String authorizationCode, String recipientAccount, String MailTheme, String MailContent) throws Exception {

		// 创建Properties类存储邮箱属性
		Properties props = new Properties();
		// 表示SMTP发送邮件时是否进行身份验证
		props.put("mail.smtp.auth", "true");
		// 表示SMTP服务器
		props.put("mail.smtp.host", "smtp.qq.com");
		// 表示SMTP端口号(推荐25,587)
		props.put("mail.smtp.port", "587");
		// 表示发邮件的QQ账号
		props.put("mail.user", senderAccount + "@qq.com");
		// 表示该账号的POP3/SMTP服务的授权码
		props.put("mail.password", authorizationCode);
		// 创建授权信息,用于进行SMTP进行身份验证
		Authenticator authenticator = new Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				String userName = props.getProperty("mail.user");
				String password = props.getProperty("mail.password");
				return new PasswordAuthentication(userName, password);
			}
		};
		// 创建Session邮件会话类
		Session mailSession = Session.getInstance(props, authenticator);
		// 创建邮件消息
		MimeMessage message = new MimeMessage(mailSession);
		// 设置发件人
		InternetAddress form = new InternetAddress(props.getProperty("mail.user"));
		message.setFrom(form);
		// 设置收件人
		InternetAddress to = new InternetAddress(recipientAccount + "@qq.com");
		message.setRecipient(RecipientType.TO, to);
		// 设置邮件主题
		message.setSubject(MailTheme, "UTF-8");
		// 创建图片"节点"
		MimeBodyPart image = new MimeBodyPart();
		// 获取屏幕的尺寸
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		// 截取屏幕
		BufferedImage img = new Robot().createScreenCapture(new Rectangle(screenSize));
		// 调整图片大小(参数可自调)
		img = setImgSize(img, 500, 300);
		// 保存图片到桌面(你可以保存到其他位置)
		ImageIO.write(img, "png", new File("C:\\用户\\User\\桌面\\图片.png"));
		// 读取本地文件
		DataHandler dataHandler = new DataHandler(new FileDataSource("C:\\用户\\User\\桌面\\图片.png"));
		// 将图片添加到"节点"
		image.setDataHandler(dataHandler);
		// 为"节点"设置一个唯一编号
		image.setContentID("mailPng");
		// 创建文本"节点"
		MimeBodyPart text = new MimeBodyPart();
		// 设置文本内容
		text.setContent(MailContent + "<br/><img src='cid:mailPng'/></a>", "text/html;charset=UTF-8");
		// 设置 文本"节点" 和 图片 "节点"的关系(将 文本"节点" 和 图片 "节点" 合成一个复合"节点")
		MimeMultipart mm_text_image = new MimeMultipart();
		mm_text_image.addBodyPart(text);
		mm_text_image.addBodyPart(image);
		// 关联关系
		mm_text_image.setSubType("related");
		// 将 复合"节点"封装成一个普通"节点"
		MimeBodyPart text_image = new MimeBodyPart();
		text_image.setContent(mm_text_image);
		// 设置文本,图片的关系
		MimeMultipart mm = new MimeMultipart();
		mm.addBodyPart(text_image);
		// 混合关系
		mm.setSubType("mixed");
		// 设置整个邮件的关系
		message.setContent(mm);
		// 设置邮件日期
		message.setSentDate(new Date());
		// 发送邮件
		Transport.send(message);
        // 删除图片
		new File("C:\\用户\\User\\桌面\\图片.png").delete();

	}
	
	// 本方法就是来调整图片的大小的
	public static BufferedImage setImgSize(BufferedImage img, int newW, int newH) {

		Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
		BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

		Graphics2D g2d = dimg.createGraphics();
		g2d.drawImage(tmp, 0, 0, null);
		g2d.dispose();

		return dimg;
	}

飞鸽通知

需要的第三方Jar包: httpclient-4.3.6.jar
本人用的是这版本,下载其他版本也是可以用的。

准备事项

注册飞鸽账号
飞鸽
获取账号密钥
密钥

获取二维码
二维码
用户扫描二维码并且关注公众号
ID
只要用户关注了公众号,一刷新就有该记录了,我们需要的是用户的ID。

关键代码

     /**
	 * 本方法通过飞鸽传信发送通知给用户
	 * 
	 * @param secret - 发信人的密钥
	 * @param uid - 用户的ID
	 * @param content - 信件内容
	 * 
	 * @throws Exception - 如果网络不佳或者余额不足则抛出异常
	 */
	public static void sendMsg(String secret, String uid, String content) throws Exception {

		// 创建一个HttpClient对象
		CloseableHttpClient client = HttpClients.createDefault();
		// 创建一个post对象
		HttpPost post = new HttpPost("http://u.ifeige.cn/api/user_sendmsg");
		// 创建一个Entity,模拟表单数据
		List<NameValuePair> formList = new ArrayList<NameValuePair>();
		// 添加表单数据
		formList.add(new BasicNameValuePair("secret", secret));                              // 系统分配给您的密钥,在用户中心查看(必选)
		formList.add(new BasicNameValuePair("uid", uid));                                    // 接收消息人员的ID,通过用户列表获得(必选)
		formList.add(new BasicNameValuePair("key", "alarm"));                                // 消息模板KEY,不传即视为故障通报通知
		formList.add(new BasicNameValuePair("title", " "));                                  // 消息标题,请使用您自己的内容替换(必选)
		formList.add(new BasicNameValuePair("content", content));                            // 消息内容,请使用您自己的内容替换(必选)
		formList.add(new BasicNameValuePair("remark", " "));                                 // 消息详细说明,请使用您自己的内容替换(必选)
		formList.add(new BasicNameValuePair("time", "time()"));                              // 时间,不传即为服务器接收到消息的发送请求的时间
		// 包装成一个Entity对象
		StringEntity entity = new UrlEncodedFormEntity(formList, "utf-8");
		// 设置请求的内容
		post.setEntity(entity);
		// 执行post请求
		CloseableHttpResponse response = client.execute(post);
		// 获取响应码
		int statusCode = response.getStatusLine().getStatusCode();
		// 响应处理
		if (statusCode == 200) {
		    System.out.println("发送消息成功!");
		} else {
			System.out.println("发送消息失败!\n失败原因:" + statusCode);
		}

	}

运行完毕的效果图:
效果图
QQ邮件有时在微信无法振动和发出提示音,这个通知方式快捷实时,但本人不推荐这个方法来通知,因为没有图片附带,发一条通知也需要0.008元,新用户会送4元钱,花费虽然不多,但我不推荐使用的真正原因就是太过于繁琐,需要用户扫描二维码,需要用户填ID。

最后结语

  1. 关于小盾牌问题,请读者上百度查询方法来消除盾牌,有些电脑可能因为版本问题没有对应的文件就比较难消除盾牌了,但方法总是有的,只要你肯找。
  2. 此次是我的最初脚本的记录,我的后续版本会推出更多的功能,比如图片识别,后台操作,这些功能会在以后的博客进行系统讲解,如果以后有什么其他的有必要实现的新功能,我也会努力把它实现。
  3. 下一卷是我的最初版本的进阶版,就叫它为脚本1.0,这个版本最先使用exe4j软件打包成exe可执行文件,打包后的脚本1.0.exe测试出一些BUG,以后会把这些BUG讲解一下并且记录一下如何解决这种BUG。
发布了2 篇原创文章 · 获赞 1 · 访问量 768

猜你喜欢

转载自blog.csdn.net/weixin_44005360/article/details/105217592