游戏脚本开发第二卷
- 前卷问题总结
- 固定游戏窗口
- 脚本通知
- 播放音乐
- 邮件通知
- 准备事项
- 关键代码
- 飞鸽通知
- 准备事项
- 关键代码
- 最后结语
前卷问题总结
- 取点过于固定,但是游戏窗口不固定,一旦游戏窗口移动,取的点就错误,脚本无法正常运行。
- 脚本一旦无法正常运行也没有通知,用户无法实时知道脚本运行情况,除非用户一直查看脚本运行情况。
- 我发现有些软件模拟不了鼠标操作,这可能是因为该软件可能有屏蔽模拟鼠标操作的功能,也可能是因为该软件是需要管理员权限才能控制的,看看这软件快捷方式图标右下方有没有小盾牌,就是这盾牌阻止了模拟鼠标操作。
固定游戏窗口
需要的第三方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 newImgWidth, int newImgHeight) {
Image image = img.getScaledInstance(newImgWidth, newImgHeight, Image.SCALE_SMOOTH);
BufferedImage newImg = new BufferedImage(newImgWidth, newImgHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D paint = newImg.createGraphics();
paint.drawImage(image, 0, 0, null);
paint.dispose();
return newImg;
}
飞鸽通知
需要的第三方Jar包: httpclient-4.3.6.jar
本人用的是这版本,下载其他版本也是可以用的。
准备事项
注册飞鸽账号
获取账号密钥
获取二维码
用户扫描二维码并且关注公众号
只要用户关注了公众号,一刷新就有该记录了,我们需要的是用户的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.0,这个版本最先使用exe4j软件打包成exe可执行文件,打包后的脚本1.0.exe测试出一些BUG,以后会把这些BUG讲解一下并且记录一下如何解决这种BUG。
点击前往下一卷内容