# Hamibot-Tools
**Repository Path**: bmuyu2020/Hamibot-Tools
## Basic Information
- **Project Name**: Hamibot-Tools
- **Description**: Hamibot自动化脚本的开发技巧总结,完整的案例和分析
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2023-05-30
- **Last Updated**: 2023-05-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Hamibot技巧总结
1. [BlockEngines 阻塞脚本执行工具](#blockengines-工具)
2. [免费发送Email](#免费发送email)
3. [AppRunning 软件运行检测](#AppRunning-软件运行检测)
4. [ScreenLock 锁屏检测](#ScreenLock-锁屏检测)
## BlockEngines 工具
>使用场景:
在写校园集结号报平安脚本的时候,报平安界面,点击我要报平安按钮,弹出选择口号和
选择提问的选项,但是主线程脚本获取到的体温控件位置超出了屏幕范围,经过不断地尝试,
发现执行另外一个脚本能获取到正常的坐标位置,原方法使用了engines.exeScript()方法,
启动另一个脚本,在这里函数可以看作另一个脚本。但是,两个脚本是异步执行,没有说是
子脚本启动了,主线程脚本就阻塞了,我们有时候是需要阻塞的,那么可以使用BlockEngines
BlockEngines属于伪阻塞,可以使用BlockEngines同时启动多个子脚本。按顺序执行
大家可以去写一下校园集结号上报界面自动选择口号和体温的功能。不过脚本要从点击我要上报按钮开始写!
>示例源码
点击阅读源码: [BlockEngines.js](BlockEngines.js)

>使用步骤:
1. 引入BlockEngines
```js
var BlockEngines = function(){
let blockEngines = {}
blockEngines.run = function(name,funstr){
let es = engines.all().length
let ns = 0
console.show()// 如果只是想阻塞主线程脚本,这两句可以删掉
console.hide()//这两句是解决坐标获取超出屏幕范围的
engines.execScript(name, name+"();\n" + funstr);
do{
sleep(200)
ns = engines.all().length
}while(es != ns)
return blockEngines
}
return blockEngines
}
```
2. 创建子脚本(函数)
```js
function myfun(){
console.show()
for(var i = 0;i<10;i++){
console.log(i)
sleep(800)
}
console.hide()
}
function myfun2(){
console.show()
for(var i = 0;i<10;i++){
console.log(i)
sleep(800)
}
console.hide()
}
```
3. 运行子脚本
```js
var blockEngines = new BlockEngines()
blockEngines.run("myfun",myfun.toString())
.run("myfun2",myfun2.toString())
```
## 免费发送Email
```js
function sendEmail(email,etitle,emsg){
http.get("http://liuxingw.com/api/mail/api.php?address="+email+"&name="+etitle+"&certno="+emsg, {}, function(res, err) {
if (err) {
console.error("邮件发送失败");
return;
}else{
log("发送成功")
}
});
}
sendEmail("12345@gmail.com","邮件标题","邮件内容")
```
## AppRunning 软件运行检测
>使用场景:
一些软件,因为系统的原因启动时存在崩溃(MIUI 12.5),
一次并不能启动成功,需要多次luanchApp才行,这个工具,可以保证
App启动成功,前提是软件兼容你的手机,同时可以做运行检测,当用户
切出检测的App后,会自动跳转回来,切出后,不阻塞主线程代码执行,
>示例源码
点击阅读源码: [AppRunning.js](AppRunning.js)
>使用步骤:
1. 引入AppRunning
```js
var AppRunning = function (){
this.start = function (appName) {
let thread = threads.start(function() {
while(true) {
if(currentPackage()!=getPackageName(appName)){
launch(getPackageName(appName))
sleep(1500)
}
sleep(500)
}
})
return thread
},
this.stop = function (task){
task.interrupt()
}
}
```
2. 使用方法
```js
var appRunning = new AppRunning()
var task = appRunning.start("校园集结号")//启动检测
console.show()
for(var i = 0;i<15;i++){
console.log("集结号运行中..."+i)
sleep(1000)
}
appRunning.stop(task)//结束检测
```
## ScreenLock 锁屏检测
**判断设备是否锁屏**
```js
function ScreenLock() {
importClass(android.content.Context);
var km = context.getSystemService(Context.KEYGUARD_SERVICE);
return km.isKeyguardLocked() && km.isKeyguardSecure();
}
if(ScreenLock()){
log("屏幕锁了")
}else{
log("未锁屏")
}
```