chrome下载完成后自动运行本地脚本需借助扩展监听downloads api并配合native messaging调用外部程序,或采用轮询下载目录、远程调试端口注入等替代方案。

你想让谷歌浏览器下载完文件后自动运行本地脚本,比如重命名、移动到指定文件夹、计算哈希值或弹出通知,但Chrome本身不提供“下载完成即执行”的原生接口——必须借助扩展监听、系统轮询或进程通信等外部机制来桥接这个空缺。
用Chrome扩展监听downloads API并触发本地脚本
这是最贴近浏览器原生能力的方案,需配合Native Messaging实现跨沙箱调用。扩展能精准捕获state: "complete"事件,避免轮询误判。
第一步:新建文件夹,创建manifest.json,内容如下:
{ "manifest_version": 3, "name": "Download Handler", "version": "1.0", "permissions": ["downloads", "downloads.shelf"], "background": { "service_worker": "background.js" } }
第二步:在同目录下创建background.js,写入监听逻辑:
chrome.downloads.onChanged.addListener((delta) => { if (delta.state && delta.state.current === 'complete') { chrome.downloads.search({ id: delta.id }, (items) => { if (items.length > 0) { const file = items[0]; chrome.runtime.sendNativeMessage('com.example.downloadhandler', { filename: file.filename, url: file.url }, () => {}); } }); } });
第三步:注册Native Host清单文件com.example.downloadhandler.json,路径必须严格匹配系统要求:【Windows用户请务必存入%LOCALAPPDATA%GoogleChromeUser DataNativeMessagingHosts】,内容为:
{ "name": "com.example.downloadhandler", "description": "Handle Chrome downloads", "path": "C:\path\to\download_handler.py", "type": "stdio", "allowed_origins": ["chrome-extension://
第四步:确保你的Python脚本download_handler.py具备可执行权限,并以#!/usr/bin/env python3开头(Linux/macOS)或通过py -3调用(Windows)。脚本需读取stdin的JSON输入,否则通信会静默失败。
轻量级轮询监控下载目录(免扩展安装)
适合临时调试、受限环境或无法部署扩展的场景,不依赖浏览器权限,但需自行判断文件是否真正写入完成。
方法一:用Python + watchdog库实时响应
安装依赖:pip install watchdog。
创建watch_downloads.py,核心逻辑是监听Created事件后等待1秒再检查文件大小是否稳定——因为Chrome下载结束时先写入完整内容,再重命名为目标名,期间可能短暂出现.crdownload或.tmp临时文件。
方法二:纯Shell轮询(Windows批处理)
新建check_download.bat,每3秒扫描一次%USERPROFILE%Downloads中新增的非临时文件:
for /f "delims=" %%i in ('dir /b /o-d "%USERPROFILE%Downloads*" 2^>nul ^| findstr /v ".crdownload .tmp$"') do (if not defined last_file set "last_file=%%i" & goto :process)
【注意:此脚本必须配合一个外部计时器循环调用,例如用PowerShell的Start-Sleep -Seconds 3包裹】
通过Chrome远程调试端口注入调试会话
当你已手动启动一个带--remote-debugging-port=9222参数的Chrome实例,并完成登录/页面操作后,可用外部脚本连接该端口,在下载完成那一刻直接执行DOM级操作或触发页面内JS回调。
第一步:启动Chrome时指定调试端口与独立用户数据目录:
"C:Program FilesGoogleChromeApplicationchrome.exe" --remote-debugging-port=9222 --user-data-dir="C:chrome_debug"
第二步:用Python调用Selenium,复用已有调试会话:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=options)
第三步:监听downloads对象状态需注入一段前端脚本,例如:
driver.execute_script("""
chrome.downloads.search({query: []}, (items) => {
items.forEach(item => {
if (item.state === 'complete') console.log('Download finished:', item.filename);
});
});""")
这一步只能读取状态,不能直接调用本地命令——如需执行脚本,仍需回传路径给Python主进程再调用subprocess.run()。











