识别qq群系统消息,或者实时识别屏幕文字的脚步
第 1 条补充
· 4 小时前
识别QQ群消息包括系统通知,比如谁把谁禁言了的这种消息系统也要。或者识别屏幕文字内容,识别到了就会震动
第 2 条补充
· 3 小时前
识别屏上的文字,识别内容(UER)(禁言)识别到部分,手机开始震动,持续5秒。
回答
以下是为你编写的实时屏幕文字识别脚本,专门用于检测 QQ 群系统消息或指定关键词。代码已严格适配 Hamibot 的 Rhino 1.7.15 引擎,未使用箭头函数与默认参数。
// 文档地址 https://docs.hamibot.com/
if (!requestScreenCapture()) {
toastLog('未授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
// 配置需要监控的关键词(可根据实际系统消息文案修改)
var targetKeywords = ['系统消息', '邀请你加入', '撤回了一条消息', '已被移出群聊', '群公告'];
toastLog('开始实时识别屏幕文字,请在 Hamibot 控制台手动停止脚本');
while (true) {
var img = captureScreen();
var textResult = ocr.recognizeText(img);
var isMatch = false;
for (var i = 0; i < targetKeywords.length; i++) {
if (textResult.indexOf(targetKeywords[i]) !== -1) {
isMatch = true;
toastLog('命中关键词: ' + targetKeywords[i]);
log('当前屏幕完整识别结果: ' + textResult);
// 可在此处补充自动化操作,例如点击、返回或发送通知
break;
}
}
// 释放截图内存,防止长时间循环导致 OOM
if (img) {
img.recycle();
}
// 控制识别频率,平衡实时性与设备性能
sleep(1500);
}
核心逻辑说明
requestScreenCapture():首次运行会触发系统截图授权,必须允许否则脚本直接退出。ocr.recognizeText(img):Hamibot 1.2.2 及以上版本内置接口,直接返回纯文本结果,适合快速关键词匹配。img.recycle():实时循环截图必须手动回收图片对象,否则内存会持续累积直至应用崩溃。sleep(1500):OCR 属于高算力操作,1.5 秒间隔可兼顾响应速度与手机发热/耗电控制。
最佳实践建议
- 关键词校准:QQ 系统消息文案会随版本更新变化。建议先单独运行一次
log(ocr.recognizeText(captureScreen()))抓取当前界面实际文案,再精准填入targetKeywords。 - 结合 UI 选择器提升稳定性:纯 OCR 易受聊天背景、气泡颜色或表情干扰。若需更高可靠性,可先用 UI 选择器预判,例如:
if (className('TextView').textContains('系统消息').exists()) { // 触发后续 OCR 或点击逻辑 } - 局部识别优化:若系统消息固定出现在屏幕特定区域,可先全屏截图,再使用
images.clip(img, x, y, w, h)裁剪局部区域传入 OCR,可显著降低识别耗时与误判率。 - 退出与防呆机制:该脚本为常驻循环,需通过 Hamibot 控制台点击“停止”或调用
hamibot.exit()结束。建议在命中关键词并执行完对应操作后加入退出条件或状态标记,避免重复触发。
运行前请确保 Hamibot 版本 ≥ 1.2.2,无障碍服务与截图权限均已开启。如需针对特定 QQ 界面元素补充坐标点击、滑动或自动回复逻辑,提供具体界面特征即可,我会为你扩展对应代码。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实
以下是为你编写的实时屏幕文字识别+震动提醒脚本。代码已严格适配 Hamibot 的 Rhino 1.7.15 引擎,未使用箭头函数与默认参数,并针对 QQ 群系统通知场景做了防抖与性能优化。
// 文档地址 https://docs.hamibot.com/
if (!requestScreenCapture()) {
toastLog('未授予截图权限,脚本退出');
hamibot.exit();
}
// 配置需要监控的关键词(覆盖常见QQ群系统通知)
var targetKeywords = [
'禁言', '解除禁言', '移出群聊', '邀请你加入', '已成为管理员',
'撤回了一条消息', '群公告', '系统消息', '拍了拍', '修改群名称'
];
// 震动时长(毫秒)
var vibrateDuration = 300;
// 命中后的冷却时间,防止连续震动
var cooldownMs = 2500;
toastLog('开始实时识别屏幕文字,命中关键词将触发震动');
while (true) {
var img = captureScreen();
var rawResult = ocr.recognizeText(img);
// 兼容不同版本OCR返回值类型
var textResult = typeof rawResult === 'string' ? rawResult : JSON.stringify(rawResult);
var isMatch = false;
var matchedWord = '';
for (var i = 0; i < targetKeywords.length; i++) {
if (textResult.indexOf(targetKeywords[i]) !== -1) {
isMatch = true;
matchedWord = targetKeywords[i];
break;
}
}
if (isMatch) {
toastLog('命中关键词: ' + matchedWord + ',触发震动');
device.vibrate(vibrateDuration);
log('当前屏幕完整识别结果: ' + textResult);
sleep(cooldownMs);
}
if (img) {
img.recycle();
}
sleep(1500);
}
核心逻辑说明
ocr.recognizeText(img):Hamibot 内置 OCR 接口,直接提取屏幕可见文字。已做类型兼容处理,避免部分版本返回数组导致indexOf报错。device.vibrate(vibrateDuration):调用系统震动马达。命中关键词后立即触发,并通过cooldownMs冷却防抖,避免同一画面重复识别导致连续震动。img.recycle()+sleep(1500):实时截图必须手动释放内存,1.5秒间隔可兼顾识别实时性与设备发热控制。
针对 QQ 群系统消息的专项优化建议
- 系统消息文案特征:QQ 群系统通知(如“XXX已被禁言XX分钟”)通常为灰色小字,且位于聊天列表顶部或消息流中间。若 OCR 偶尔漏识别,可先运行一次
log(ocr.recognizeText(captureScreen()))抓取当前界面实际文案,将精确词组补充到targetKeywords。 - 局部截图提速:系统消息多出现在屏幕中上区域。可替换全屏截图为局部裁剪,显著降低 OCR 耗时:
var fullImg = captureScreen(); var clipImg = images.clip(fullImg, 0, 0, fullImg.width, Math.floor(fullImg.height * 0.4)); var textResult = ocr.recognizeText(clipImg); fullImg.recycle(); clipImg.recycle(); - 结合 UI 选择器兜底:纯 OCR 受背景色、气泡遮挡影响较大。若需更高稳定性,可先用控件特征预判,再触发 OCR 或震动:
if (className('TextView').textContains('禁言').exists()) { device.vibrate(vibrateDuration); } - 震动权限与系统限制:
device.vibrate()无需额外权限,但部分定制 ROM(如 MIUI、ColorOS)在省电模式或后台限制下可能拦截震动。建议将 Hamibot 加入电池白名单,并保持脚本在前台或无障碍服务活跃状态。
运行注意事项
- 确保 Hamibot 版本 ≥ 1.2.2,已开启无障碍服务与截图权限。
- 脚本为常驻循环,需通过 Hamibot 控制台点击“停止”或调用
hamibot.exit()结束。 - 若需命中后执行额外操作(如自动点击、跳转、推送通知),在
if (isMatch)代码块内补充对应逻辑即可。
如需针对特定 QQ 版本界面调整识别区域、补充自动点击坐标或接入消息推送,提供具体界面截图或控件特征,我会为你扩展对应代码。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实
以下是为你编写的实时屏幕文字识别与震动提醒脚本。代码已严格适配 Hamibot 的 Rhino 1.7.15 引擎,未使用箭头函数与默认参数,并针对你的需求做了防重复触发与内存优化。
// 文档地址 https://docs.hamibot.com/
if (!requestScreenCapture()) {
toastLog('未授予截图权限,脚本退出');
hamibot.exit();
}
// 配置需要监控的关键词(支持部分匹配)
var targetKeywords = ['(UER)', '(禁言)'];
var vibrateDuration = 5000; // 震动时长:5秒
var cooldownMs = 5500; // 冷却时间:略大于震动时长,防止重复触发
var checkInterval = 1500; // 识别间隔:1.5秒
toastLog('开始监控屏幕文字,命中关键词将震动5秒');
while (true) {
var img = captureScreen();
var rawResult = ocr.recognizeText(img);
// 兼容不同版本OCR返回值类型,统一转为字符串进行匹配
var textResult = String(rawResult);
var isMatch = false;
var matchedWord = '';
for (var i = 0; i < targetKeywords.length; i++) {
if (textResult.indexOf(targetKeywords[i]) !== -1) {
isMatch = true;
matchedWord = targetKeywords[i];
break;
}
}
if (isMatch) {
toastLog('命中关键词: ' + matchedWord + ',开始震动5秒');
device.vibrate(vibrateDuration);
log('当前屏幕识别结果: ' + textResult);
// 震动期间暂停循环,避免重复识别导致震动叠加
sleep(cooldownMs);
}
if (img) {
img.recycle();
}
sleep(checkInterval);
}
核心逻辑说明
- 部分匹配机制:
text.indexOf(keyword) !== -1天然支持部分匹配。只要屏幕文字中包含(UER)或(禁言)任意一个片段,即可触发后续逻辑。 - 5秒震动控制:
device.vibrate(5000)直接调用系统马达持续震动 5000 毫秒。配合sleep(5500)冷却期,确保震动完整执行且不会因循环过快导致多次触发。 - 内存与性能保护:每次循环后执行
img.recycle()释放截图对象,防止长时间运行引发 OOM 崩溃。1.5 秒识别间隔可显著降低 CPU 占用与发热。 - OCR 类型兼容:使用
String(rawResult)统一转换返回值,避免部分 Hamibot 版本返回数组或对象时indexOf报错。
最佳实践建议
- 精准命中优化:若
(UER)或(禁言)在特定界面固定出现,可先运行一次log(String(ocr.recognizeText(captureScreen())))抓取实际排版文案,确认括号是否为全角/半角,必要时在targetKeywords中补充变体(如UER、禁言)。 - 局部识别提速:若目标文字仅出现在屏幕固定区域(如顶部通知栏或聊天列表中上部),可替换全屏截图为局部裁剪,大幅降低 OCR 耗时:
var fullImg = captureScreen(); var clipImg = images.clip(fullImg, 0, 0, fullImg.width, Math.floor(fullImg.height * 0.35)); var textResult = String(ocr.recognizeText(clipImg)); fullImg.recycle(); clipImg.recycle(); - 震动权限与系统限制:
device.vibrate()依赖系统震动权限。部分定制 ROM(如 MIUI、OriginOS)在低电量模式或后台严格限制下可能拦截长震动。建议将 Hamibot 加入电池无限制白名单,并保持无障碍服务活跃。 - 安全退出机制:该脚本为常驻循环,需通过 Hamibot 控制台点击“停止”或悬浮窗按钮结束。若需命中后自动停止,可在
device.vibrate()后追加hamibot.exit();。
运行前请确保 Hamibot 版本 ≥ 1.2.2,已开启无障碍服务与截图权限。如需调整识别区域、补充自动点击或接入消息推送,提供具体界面特征即可,我会为你扩展对应逻辑。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实