Python检测浏览器特定网站打开状态并自动关闭的实现方法
Python实现浏览器指定网站检测与强制拦截方案
实现这类强制专注屏蔽工具,有两种成熟可落地的技术路径,根据自己的需求选就行。
方案1:无扩展系统级检测(快速上手,支持Chrome/Edge/Firefox)
原理是通过UI自动化接口定时读取浏览器所有标签的访问地址,匹配到黑名单域名时直接发送关闭标签的快捷键,不需要给浏览器装任何额外插件。
- 依赖安装:执行命令
pip install pywinauto psutil - 可直接运行的参考代码(Windows平台适配Chromium内核浏览器):
import time import psutil from pywinauto import Application # 自定义屏蔽域名列表,自动匹配对应子域名 BLOCKED_DOMAINS = {"facebook.com", "twitter.com", "x.com", "tiktok.com"} # 检测轮询间隔,单位秒,设为1即可在页面加载出内容前完成拦截 CHECK_INTERVAL = 1 def match_blocked_domain(url: str) -> bool: for blocked in BLOCKED_DOMAINS: if blocked in url: return True return False def scan_and_close(): # 遍历系统所有运行中的进程,筛选目标浏览器 for proc in psutil.process_iter(["name"]): proc_name = proc.info["name"] if proc_name not in ["chrome.exe", "msedge.exe"]: continue try: app = Application(backend="uia").connect(process=proc.pid, timeout=0.1) for win in app.windows(): # 定位标签栏控件 tab_container = win.child_window(control_type="Tab", found_index=0) all_tabs = tab_container.children(control_type="TabItem") for tab in all_tabs: tab.select() time.sleep(0.03) # 读取地址栏当前URL address_bar = win.child_window(control_type="Edit", found_index=0) current_url = address_bar.get_value().lower() if match_blocked_domain(current_url): # 触发关闭标签快捷键 win.type_keys("^w", pause=0.02) except Exception: # 跳过无权限访问、控件加载失败的进程,不中断检测循环 continue if __name__ == "__main__": print("专注屏蔽程序已运行,按Ctrl+C终止") while True: scan_and_close() time.sleep(CHECK_INTERVAL)
- 注意事项:
- Windows下不要用管理员权限运行脚本,否则会因权限隔离无法连接普通用户启动的浏览器进程
- Mac平台需要替换UI自动化库为
pyobjc,同时给运行脚本的终端开启辅助功能权限 - 该方案的小缺点是检测后台标签时会有极短暂的标签切换闪屏,间隔设1秒的话几乎无感知
方案2:浏览器扩展+本地Python服务(零闪屏、100%准确率)
如果需要更稳定无感知的拦截效果,推荐用这个方案,完全不依赖UI自动化,不会因为浏览器更新、界面改版失效。
原理是写一个50行代码以内的极简浏览器扩展,定时拉取浏览器所有标签的ID和URL,上报给本地运行的Python服务,Python匹配到黑名单域名后返回需要关闭的标签ID,扩展调用浏览器原生标签接口关闭对应页面,全程不需要切换前台标签,没有任何闪屏。
- Python端依赖安装:执行命令
pip install flask - Python服务参考代码:
from flask import Flask, request, jsonify app = Flask(__name__) # 本地服务仅监听回环地址,不会暴露到公网 LOCAL_HOST = "127.0.0.1" LOCAL_PORT = 58763 BLOCKED_DOMAINS = {"facebook.com", "twitter.com", "x.com", "tiktok.com"} @app.route("/tab_check", methods=["POST"]) def tab_check(): tab_list = request.json.get("tabs", []) need_close = [] for tab in tab_list: for domain in BLOCKED_DOMAINS: if domain in tab["url"].lower(): need_close.append(tab["id"]) break return jsonify({"close_ids": need_close}) if __name__ == "__main__": app.run(host=LOCAL_HOST, port=LOCAL_PORT, debug=False)
- 扩展端只需要按照Manifest V3规范写两个文件:配置文件申请标签读取权限,后台服务每500毫秒收集所有标签信息上报给本地接口,收到关闭指令后调用
tabs.remove方法关标签即可,不需要任何内容注入,不影响正常浏览。
防绕过优化
- 可以将Python脚本配置为开机静默启动,隐藏控制台窗口,避免手动终止程序
- 检测/上报间隔不要超过1秒,足够在分心网站内容渲染完成前完成拦截
- 不要只检测前台标签,后台预加载、静默打开的标签也要纳入检测范围
内容的提问来源于stack exchange,提问作者DurtKokayne
相关产品推荐
相关产品推荐

