监控「抖音直播伴侣」等软件是否弹出了新窗口(例如要求主播出镜、实名验证、违规警告等弹窗)。 一旦检测到,立刻置顶红色闪烁警报 + 循环响铃提醒你,避免挂播时错过; 还可选择把报警推送到手机 / 群机器人,人不在电脑前也能第一时间知道。
支持两种检测方式,可同时开启:
- 窗口文字检测(推荐):监控目标进程新窗口,读取标题和弹窗内文字,命中「出镜/实名/违规…」就报警,不用上传截图
-
图片检测(选填/高级):上传弹窗截图,屏幕上出现相似画面就报警(需要
pip install -r requirements.txt)
下载
- 仓库:https://gitee.com/wen-kaiyu/douyin-popup-watcher
- 发行版:https://gitee.com/wen-kaiyu/douyin-popup-watcher/releases
- 产品包(v1.0.0):https://gitee.com/wen-kaiyu/douyin-popup-watcher/releases/download/v1.0.0/popup-sentry-v1.0.0.zip
使用方法
产品包(推荐,给最终用户)
- 下载并解压
popup-sentry-v1.0.0.zip(或本地release/弹窗哨兵.zip),双击弹窗哨兵.exe - 首次打开会弹出「三步上手」;也可随时点「使用说明」
- 确认「监控哪个软件」里有
直播伴侣;默认已是「弹窗文字含关键词才报警」 - (可选)选报警声卡 / 配置推送;图片检测一般不用
- 点「开始监控」,然后正常开播
重新打包:在项目根目录执行 python build_product.py
源码运行(开发)
- 双击
启动.vbs(无任何黑窗口;也可运行python app.py) - 按软件内「使用说明」三步操作即可
- 检测到弹窗 → 电脑响铃 + 红色警报窗(+ 手机 / 群推送)
建议先点一次「测试报警」听听警报效果;换过声卡后也建议再测一次。
文字检测(默认,不用截图)
默认模式:仅当弹窗文字含关键词才报警。会读取窗口标题和弹窗内部可见文字, 命中「出镜、实名、验证、警告、违规、提醒」等词就响铃。关键词可在界面修改。
若弹窗刚弹出时文字还没渲染完,引擎会在轮询里自动再判一次,减少漏报。 若个别软件完全读不到内部文字,再改用下面的图片检测。
报警声卡怎么选
直播机常挂多张声卡 / 虚拟声卡,系统默认设备不一定是你想听到报警的那张。 在「报警声卡」下拉里选目标播放设备,点「测试报警」确认;插拔声卡后可点「刷新」重新枚举。 选择会写入 config.json,按设备名记忆;设备不在线时自动回退「系统默认」。
图片检测怎么用效果最好(选填)
一般用上面的文字关键词即可。只有读不到弹窗文字时才需要:
- 用 Win+Shift+S(或微信/QQ 截图)把目标弹窗截下来,保存为 PNG
- 只截弹窗本身,不要带周围背景;弹窗里有独特文字/图标的区域最好
- 可以添加多张截图,任何一张出现在屏幕上都会报警
- 误报 → 把「匹配灵敏度」调高(如 90);漏报 → 调低(如 75)
- 添加的截图会复制到
templates/文件夹,删原图不影响
工作原理
-
窗口检测(双通道,类似安全软件的广告拦截):
-
即时通道:向系统注册
SetWinEventHook窗口显示钩子,任何窗口一出现系统立刻回调,毫秒级报警,不用等扫描 - 轮询通道:每秒全量扫描,负责按关键词锁定目标进程(把它已有的窗口记为基线)、检测进程退出(崩溃报警,可关)、兜住钩子漏掉的窗口,并对「文字稍后才出现」的窗口做二次判定
- 新窗口 = 基线之外的窗口,包括无标题弹窗;自动过滤输入法、菜单、tooltip、Alt+Tab 任务切换、音量条等系统界面噪音;explorer 等系统外壳进程即使窗口标题带关键词也永不会被锁定为监控目标
- 文字模式会抽取子控件文字,并尽力用 UI Automation 读可见 Name
- 日志里带
[即时]的是钩子通道抓到的,带[轮询]/[文字补检]的是扫描兜底抓到的
-
即时通道:向系统注册
- 图片检测:每秒截取全屏(含多显示器),用 OpenCV 模板匹配比对你的截图,相似度超过阈值报警;同一画面持续存在只报一次,消失后自动恢复监视;内置 3 档缩放容忍 DPI 差异
两种报警模式
| 模式 | 说明 |
|---|---|
| 仅弹窗文字含关键词才报警(默认) | 推荐。读标题和弹窗内文字,命中「出镜、实名…」才响,不用截图 |
| 任何新弹窗都报警 | 最灵敏。正常面板也可能响,可用学习模式降噪 |
正常面板也报警太吵?用白名单
「任何新弹窗都报警」模式下,你自己点开美颜、素材库这些正常面板也会报警。两个办法把它们静音:
- 学习模式(推荐,一次搞定):点「开始监控」→ 点「🎓 学习模式」→ 把直播伴侣的常用面板挨个点开一遍 → 点「结束学习」。这期间出现的窗口全部记为正常,以后不报警
- 报警时顺手拉黑:误报的红色警报窗上点「误报?以后忽略这类窗口」即可
白名单按窗口"长相"(类名+标题+大小)识别,持久保存在配置里,条数显示在主界面,可一键清空。 注意:学习模式期间不要让真正要监控的弹窗出现,否则它也会被记为正常(记错了就清空白名单重学)。
推送通知到手机 / 群机器人(可选)
人不在电脑前时,本地响铃就听不到了。在「推送通知」区勾选「启用推送」,选好渠道并填入地址 / Key, 报警时就会同步推给你的手机或群。零额外依赖(纯标准库发 HTTP),推送在后台线程进行,不卡界面; 成功 / 失败都会写进事件日志。填好后先点「测试推送」验证一次。
支持的渠道与「地址 / Key」怎么填:
| 渠道 | 「地址 / Key」填什么 |
|---|---|
| 自定义 Webhook | 完整 URL;会 POST JSON:{"title","content","time"} |
| Bark(iOS) | Bark 地址,形如 https://api.day.app/你的Key |
| Server酱·Turbo(方糖) | SendKey,形如 SCTxxxxxxxxxxxx |
| 企业微信群机器人 | 机器人 Webhook 完整 URL(含 key=) |
| 钉钉群机器人 | 机器人 Webhook 完整 URL(含 access_token=);若开了「加签」,把密钥填到右侧「密钥」框 |
| Telegram Bot |
<bot_token>/<chat_id>,如 123456:AAE.../-1001234567890 |
小贴士:
- 钉钉/企业微信机器人如果用「自定义关键词」安全设置,请确保关键词能出现在消息里(默认消息含「弹窗」二字)
- 只在「检测到弹窗」和「目标进程退出」时推送;5 秒内完全相同的消息只推一次,避免刷屏
- 想接入上表以外的服务,选「自定义 Webhook」把 JSON 转发到你自己的中转即可
文件说明
-
app.py— 图形界面主程序 -
audio_alarm.py— Windows 播放设备枚举与指定声卡响铃 -
window_text.py— 窗口内部文字抽取(子控件 + UI Automation) -
watcher.py— 窗口监控引擎(可独立命令行运行:python watcher.py 直播伴侣) -
image_watcher.py— 图片检测引擎(OpenCV 模板匹配) -
notifier.py— 推送引擎(Webhook / Bark / Server酱 / 企业微信 / 钉钉 / Telegram,纯标准库) -
templates/— 你添加的弹窗截图存放处 -
config.json— 设置会自动保存到这里 -
启动.vbs— 双击启动(不弹任何命令行窗口) -
run_smoke_test.py/test_image_detection.py/test_notifier.py— 自动化冒烟测试
监控状态一直是"等待目标进程启动"? 说明还没找到直播伴侣。打开直播伴侣后会自动锁定;也可能关键词不匹配—— 可以运行 python watcher.py 直播伴侣 看命令行输出,或把关键词换成直播伴侣的进程名。
误报太多? 切到「仅弹窗文字含关键词才报警」,或把日志里频繁出现的窗口用学习模式 / 白名单忽略。