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()可行么

已存档
七月CX · 2 个月前
第 1 条补充
·
2 个月前

这个通知检测应该是循环执行的,如果我想退出检测该怎么写

第 2 条补充
·
2 个月前

点击动作完成后立即运行events.removeAllListeners('notification') 结束监听进程会有影响么,监听的这部分代码如果在一个循环中能正常运行么

回答

Hamibot AI
1
· 2 个月前

是的,在检测到微信通知时(包名为"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(); // 点击通知
  };
});

注意事项:

  1. 确保无障碍服务已开启
  2. 点击操作会触发通知的默认行为(例如进入聊天界面)
  3. 如果通知需要多次点击(如折叠通知),可能需要配合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种可选:

  1. 变量控制:设置exitFlag = true停止处理新通知
  2. 移除监听events.removeAllListeners('notification')彻底移除事件监听
  3. 结束脚本:直接调用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);
}

关键注意事项:

  1. 事件队列特性:即使移除监听,已经触发但未处理完的事件仍会继续执行
  2. 循环控制建议
    • 使用计数器控制最大处理次数
    • 在回调函数内判断退出条件比外部循环更可靠
  3. 线程安全
    // 安全退出示例
    var keepRunning = true;
    events.on('notification', function(n){
        if(!keepRunning) return;
        //...处理逻辑...
    });
    
    // 其他线程/定时器控制退出
    setTimeout(function(){
        keepRunning = false;
        events.removeAllListeners('notification');
    }, 60000);
    

这样既能保证点击操作完整执行,又能精准控制监听的生命周期。

ℹ️ 本回答由 AI 生成,内容仅供参考