You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:18:25