auto.waitFor();
events.observeNotification();
events.on('notification', function (n) {
log(
'收到新通知:\n 标题: %s, 内容: %s, \n包名: %s',
n.getTitle(),
n.getText(),
n.getPackageName()
);
if(n.getPackageName()=="com.tencent.mm"){
log("可以点击")
};
}); 如果通知包名符合条件 需要点击 用n.click()可行么
这个通知检测应该是循环执行的,如果我想退出检测该怎么写
点击动作完成后立即运行events.removeAllListeners('notification') 结束监听进程会有影响么,监听的这部分代码如果在一个循环中能正常运行么
回答
是的,在检测到微信通知时(包名为"com.tencent.mm"),你可以直接使用n.click()
来点击通知。这是可行的方式,完整代码示例如下:
// 文档地址:https://docs.hamibot.com/
auto.waitFor();
events.observeNotification();
events.on('notification', function (n) {
log(
'收到新通知:\n 标题: %s, 内容: %s, \n包名: %s',
n.getTitle(),
n.getText(),
n.getPackageName()
);
if(n.getPackageName() == "com.tencent.mm"){
log("点击微信通知");
n.click(); // 点击通知
};
});
注意事项:
- 确保无障碍服务已开启
- 点击操作会触发通知的默认行为(例如进入聊天界面)
- 如果通知需要多次点击(如折叠通知),可能需要配合
n.number
判断通知数量
补充回答 1
要退出通知检测循环,可以使用events.removeAllListeners()
来移除通知监听,然后在脚本中结束线程。以下是完整实现方案:
// 文档地址:https://docs.hamibot.com/
auto.waitFor();
var exitFlag = false;
// 启动监听
events.observeNotification();
events.on('notification', function(n) {
if(exitFlag) return;
log('收到通知: %s', n.getTitle());
if(n.getPackageName() == "com.tencent.mm"){
n.click();
}
});
// 示例:10秒后自动退出
setTimeout(function(){
exitFlag = true;
events.removeAllListeners('notification'); // 移除监听
toastLog("已停止监听通知");
hamibot.exit(); // 可选:直接退出脚本
}, 10000);
// 保持脚本运行(实际使用时根据需要修改)
while(!exitFlag){
sleep(1000);
}
退出方式有3种可选:
- 变量控制:设置
exitFlag = true
停止处理新通知 - 移除监听:
events.removeAllListeners('notification')
彻底移除事件监听 - 结束脚本:直接调用
hamibot.exit()
如果是通过悬浮窗按钮控制退出,建议使用第一种方式配合线程通信。例如在悬浮窗按钮点击事件中设置exitFlag = true
。
补充回答 2
n.click()
动作完成后立即调用events.removeAllListeners('notification')
结束监听是可行的,但需要了解以下关键点:
1. 点击后立即停止监听的影响
if(n.getPackageName() == "com.tencent.mm"){
n.click();
events.removeAllListeners('notification'); // 立即停止监听
log("已点击并停止监听");
}
没有负面影响,因为:
click()
是同步操作,执行后已经完成点击动作- 移除监听只是停止后续事件接收,不影响已执行的点击操作
2. 在循环中的正确用法
// 文档地址:https://docs.hamibot.com/
auto.waitFor();
var maxLoop = 3; // 最多处理3次通知
events.observeNotification();
events.on('notification', function(n) {
if(maxLoop <= 0) return;
log('收到第%d次通知', 4 - maxLoop);
if(n.getPackageName() == "com.tencent.mm"){
n.click();
maxLoop--;
}
if(maxLoop <= 0){
events.removeAllListeners('notification');
toastLog("达到最大处理次数,已停止监听");
}
});
// 保持脚本运行(示例循环)
while(maxLoop > 0){
sleep(1000);
}
关键注意事项:
- 事件队列特性:即使移除监听,已经触发但未处理完的事件仍会继续执行
- 循环控制建议:
- 使用计数器控制最大处理次数
- 在回调函数内判断退出条件比外部循环更可靠
- 线程安全:
// 安全退出示例 var keepRunning = true; events.on('notification', function(n){ if(!keepRunning) return; //...处理逻辑... }); // 其他线程/定时器控制退出 setTimeout(function(){ keepRunning = false; events.removeAllListeners('notification'); }, 60000);
这样既能保证点击操作完整执行,又能精准控制监听的生命周期。