Skip to main content

A file change monitor that pushes notifications via WeChat

Project description

wxwatcher

PyPI Python License

文件变更监控工具:检测到变化时,通过微信推送通知。

特性

  • 两阶段扫描:先 stat 快速检测,仅对疑似变化文件计算 SHA256
  • 自动忽略 .git__pycache__.venv 等常见目录
  • 支持按扩展名过滤、自定义忽略规则
  • 分批推送,避免消息过长
  • CLI 参数 / 环境变量 / 配置文件 / 默认值四层配置
  • 忽略规则支持通配符(*.log)和正则(regex:\.tmp\d+$
  • 日志自动写入 ~/.wxwatcher/file_watcher.log

安装

pip install wxwatcher

如需使用 YAML 配置文件:

pip install wxwatcher[config]

快速开始

监控当前目录

wxwatcher

监控指定目录

wxwatcher /path/to/watch

查看帮助

$ wxwatcher --help
usage: wxwatcher [-h] [-v] [-i INTERVAL] [--push-url PUSH_URL]
                 [--to-user TO_USER] [--max-batch MAX_BATCH]
                 [--ext EXT] [--ignore IGNORE] [--log-file LOG_FILE]
                 [--verbose] [--quiet] [--knowly-url KNOWLY_URL]
                 [--no-knowly] [--config CONFIG] [--no-config]
                 [dir]

文件变更监控工具,检测到变化时通过微信推送通知

positional arguments:
  dir                   监控目录(默认当前目录)

options:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -i INTERVAL, --interval INTERVAL
                        轮询间隔(秒,默认 30  --push-url PUSH_URL   推送 API 地址
  --to-user TO_USER     接收人(默认 @all)
  --max-batch MAX_BATCH
                        单批最大变更数(默认 50  --ext EXT             仅监控指定扩展名(逗号分隔,如 py,md)
  --ignore IGNORE       忽略的目录/文件名(逗号分隔,如 dist,build)
  --log-file LOG_FILE   日志文件路径
  --verbose             输出 DEBUG 级别日志
  --quiet               仅输出 WARNING 及以上
  --knowly-url KNOWLY_URL
                        Knowly 上传 API 地址
  --no-knowly           禁用上传到 Knowly
  --config CONFIG       配置文件路径(默认自动搜索)
  --no-config           跳过配置文件加载

配置

优先级:CLI 参数 > 环境变量 > 配置文件 > 默认值

YAML 配置文件

搜索顺序:

  1. 当前目录及父目录中的 .wxwatcher.ymlwxwatcher.yml
  2. ~/.wxwatcher/config.yml
  3. ~/.config/wxwatcher/config.yml

使用 --config <path> 指定具体文件,或 --no-config 跳过配置文件加载。

示例 .wxwatcher.yml

push_url: "https://api.example.com/push"
poll_interval: 15
to_user: "@all"
ignore:
  - "*.log"
  - "regex:\\.tmp\\d+$"
  - dist
  - build
ext:
  - py
  - md
log_file: "~/.wxwatcher/wxwatcher.log"

环境变量

环境变量 说明 默认值
WXWATCHER_DIR 监控目录 当前目录
WXWATCHER_INTERVAL 轮询间隔(秒) 30
WXWATCHER_PUSH_URL 推送 API 地址 必须配置
WXWATCHER_TO_USER 接收人 @all
WXWATCHER_MAX_BATCH 单批最大变更数 50
WXWATCHER_LOG_FILE 日志文件路径 ~/.wxwatcher/file_watcher.log
WXWATCHER_IGNORE 额外忽略模式(逗号分隔)
WXWATCHER_EXT 仅监控扩展名(逗号分隔) 全部

忽略规则

--ignore 和环境变量 WXWATCHER_IGNORE 支持三种模式:

类型 示例 说明
精确匹配 .git, node_modules 文件名或路径段完全匹配
通配符 *.log, ~*, tmp_*_backup *?[] 自动识别为 fnmatch
正则 regex:\.tmp\d+$ regex: 前缀,匹配文件名或完整路径
取反 !*.log ! 开头,取消之前匹配的忽略规则(类似 .gitignore

也可通过 CLI 参数控制(优先级高于环境变量):

参数 说明
--ignore 忽略的目录/文件名(逗号分隔,如 dist,build
--verbose 输出 DEBUG 级别日志
--quiet 仅输出 WARNING 及以上

示例

export WXWATCHER_DIR=/data
export WXWATCHER_INTERVAL=10
export WXWATCHER_PUSH_URL=https://api.example.com/push
export WXWATCHER_IGNORE="node_modules,.idea"
wxwatcher

只监控特定文件类型:

export WXWATCHER_EXT="py,txt,md"
wxwatcher

systemd 服务

wxwatcher.service 复制到 systemd 目录:

sudo cp wxwatcher.service /etc/systemd/system/

配置环境变量(推送地址等):

sudo mkdir -p /etc/wxwatcher
echo 'WXWATCHER_PUSH_URL=https://...' | sudo tee /etc/wxwatcher/environment

也可将 YAML 配置文件放在 ~/.wxwatcher/config.yml,服务启动时会自动加载。

启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable --now wxwatcher
sudo journalctl -u wxwatcher -f

工作原理

每轮轮询(默认 30s)
  │
  ├─ fast_scan()          # os.walk + os.stat,不读文件内容
  │
  ├─ 对比 mtime / size    # 快速筛选疑似变化文件
  │
  ├─ sha256_file()        # 仅对疑似文件计算 hash,确认内容真正改变
  │
  └─ send_wechat()        # 分批推送到微信

大目录下性能表现良好:5000+ 文件的目录,每轮仅需毫秒级扫描,变化文件少时几乎零磁盘 IO。

推送消息示例

文件监控已启动
──────────
监控目录: project
文件数量: 1203
启动时间: 02:30:00
──────────
By: 苑广山的文件监控助手
文件变更  02:35:00
──────────
1. [新增] config.py (+2.1KB)
2. [修改] README.md (+120B)
3. [删除] old_file.txt
──────────
By: 苑广山的文件监控助手

开发

git clone https://github.com/yuanguangshan/wxwatcher.git
cd wxwatcher
pip install -e ".[dev]"
pytest

构建发行包:

python -m build

常见问题

Q: 需要安装 inotify 吗?
A: 不需要。wxwatcher 使用轮询方式,跨平台兼容,无需系统级通知服务。

Q: 可以推送其他消息平台吗?
A: 当前仅支持微信推送接口。可以通过 --push-url 指定兼容该接口的其他服务。

Q: 大量文件时会不会很卡?
A: 不会。采用两阶段扫描,每轮只读元数据,仅疑似变化文件才计算 hash。

Q: 如何停止监控?
A: Ctrl+C 即可安全退出,程序会打印退出日志。

依赖

  • Python >= 3.9
  • httpx
  • pyyaml(可选,仅在使用 YAML 配置文件时需要)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wxwatcher-1.10.0.tar.gz (24.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wxwatcher-1.10.0-py3-none-any.whl (18.8 kB view details)

Uploaded Python 3

File details

Details for the file wxwatcher-1.10.0.tar.gz.

File metadata

  • Download URL: wxwatcher-1.10.0.tar.gz
  • Upload date:
  • Size: 24.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wxwatcher-1.10.0.tar.gz
Algorithm Hash digest
SHA256 dfb36afd0476f8994a31ebdd2c2f413c07a05b0ac06a3c0c28a08619fd6a7f8f
MD5 023711c5d6d1190b8b968a665fc009a4
BLAKE2b-256 a2fd4cb0f8a0a3e7b7bb1274505d57f9a4d3d643ef63e71d891c1546a344c25a

See more details on using hashes here.

Provenance

The following attestation bundles were made for wxwatcher-1.10.0.tar.gz:

Publisher: publish.yml on yuanguangshan/wxwatcher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wxwatcher-1.10.0-py3-none-any.whl.

File metadata

  • Download URL: wxwatcher-1.10.0-py3-none-any.whl
  • Upload date:
  • Size: 18.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wxwatcher-1.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d61509e2964bbf9b0ba154f3403e406e34fb804d5187a34cc99f5bcac891dc22
MD5 6001a0cf35b3d55d47e1275ac9d9a7bc
BLAKE2b-256 e28dfb2644b0714e099ff03a720acb6f6782cd7108b7fade5f22006e5b4964ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for wxwatcher-1.10.0-py3-none-any.whl:

Publisher: publish.yml on yuanguangshan/wxwatcher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page