本文目录导读:

- Python方案(跨平台)
- Linux/MacOS 方案(使用xclip和xdotool)
- 使用剪贴板事件(Windows通过win32api)
- 高级版本 - 支持过滤和关键字匹配
- 配置示例 (config.json)
- 轻量化的纯Bash方案(macOS/Linux)
- 安装依赖
- 使用注意事项
Python方案(跨平台)
Windows版本
import pyperclip
import time
import threading
class ClipboardMonitor:
def __init__(self):
self.last_clipboard = ""
self.running = True
def monitor(self):
print("开始监控剪贴板...")
while self.running:
try:
current = pyperclip.paste()
if current != self.last_clipboard and current.strip():
print(f"[{time.strftime('%H:%M:%S')}] 剪贴板变化: {current[:100]}...")
# 在这里添加你需要的处理逻辑
self.on_clipboard_change(current)
self.last_clipboard = current
except Exception as e:
print(f"读取剪贴板失败: {e}")
time.sleep(0.5) # 检查间隔
def on_clipboard_change(self, text):
"""处理剪贴板新内容"""
# 示例:记录到文件
with open('clipboard_log.txt', 'a', encoding='utf-8') as f:
f.write(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {text}\n")
def stop(self):
self.running = False
if __name__ == "__main__":
monitor = ClipboardMonitor()
try:
monitor.monitor()
except KeyboardInterrupt:
monitor.stop()
print("\n监控已停止")
更简洁的版本
import pyperclip
import time
from datetime import datetime
last_text = pyperclip.paste()
print("剪贴板监控已启动,按Ctrl+C退出")
try:
while True:
current_text = pyperclip.paste()
if current_text != last_text:
print(f"[{datetime.now().strftime('%H:%M:%S')}]")
print(f"新内容: {current_text}")
# 可选:保存到日志
with open('clipboard_history.txt', 'a', encoding='utf-8') as f:
f.write(f"[{datetime.now()}] {current_text}\n")
last_text = current_text
time.sleep(0.5)
except KeyboardInterrupt:
print("监控结束")
Linux/MacOS 方案(使用xclip和xdotool)
#!/bin/bash
# clipboard_monitor.sh
prev_clip=""
echo "开始监控剪贴板..."
while true; do
current=$(xclip -selection clipboard -o 2>/dev/null)
if [ "$current" != "$prev_clip" ] && [ -n "$current" ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - 检测到新内容:"
echo "$current"
echo "---"
# 可选:记录到文件
echo "[$(date)] $current" >> clipboard_log.txt
prev_clip="$current"
fi
sleep 1
done
使用剪贴板事件(Windows通过win32api)
import win32api
import win32con
import os
import time
class WindowsClipboardMonitor:
def __init__(self):
self.hwnd = None
self.last_count = 0
def monitor_clipboard_sequence(self):
"""监控Windows剪贴板序列号"""
print("Windows剪贴板监控启动...")
while True:
try:
# 获取当前剪贴板序列号
count = win32clipboard.GetClipboardSequenceNumber()
if count != self.last_count:
self.last_count = count
self.get_clipboard_content()
time.sleep(0.5)
except Exception as e:
print(f"监控错误: {e}")
def get_clipboard_content(self):
"""获取剪贴板内容"""
import win32clipboard
try:
win32clipboard.OpenClipboard()
if win32clipboard.IsClipboardFormatAvailable(win32con.CF_TEXT):
data = win32clipboard.GetClipboardData()
if data:
text = data.decode('utf-8', errors='ignore')
print(f"检测到新剪贴板内容: {text[:200]}")
finally:
win32clipboard.CloseClipboard()
# 运行
if __name__ == "__main__":
monitor = WindowsClipboardMonitor()
monitor.monitor_clipboard_sequence()
高级版本 - 支持过滤和关键字匹配
import pyperclip
import time
import re
import json
from pathlib import Path
from datetime import datetime
class SmartClipboardMonitor:
def __init__(self, config_file='config.json'):
self.last_clipboard = ""
self.config = self.load_config(config_file)
self.keywords = self.config.get('keywords', [])
self.log_file = Path(self.config.get('log_file', 'clipboard_log.txt'))
self.ignore_patterns = self.config.get('ignore_patterns', [])
def load_config(self, config_file):
"""加载配置文件"""
if Path(config_file).exists():
with open(config_file, 'r', encoding='utf-8') as f:
return json.load(f)
return {}
def should_ignore(self, text):
"""检查是否需要忽略的内容"""
for pattern in self.ignore_patterns:
if re.search(pattern, text):
return True
return False
def process_clipboard(self, text):
"""处理剪贴板内容"""
# 检查关键词
if self.keywords:
matched = [kw for kw in self.keywords if kw.lower() in text.lower()]
if matched:
print(f"匹配到关键词: {matched}")
self.save_to_file(text, keyword_match=True)
else:
self.save_to_file(text)
def save_to_file(self, text, keyword_match=False):
"""保存到日志文件"""
with open(self.log_file, 'a', encoding='utf-8') as f:
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
tag = "[关键词匹配]" if keyword_match else ""
f.write(f"\n--- {timestamp} {tag} ---\n{text}\n")
def run(self):
"""启动监控"""
print("智能剪贴板监控已启动")
print(f"关键词: {self.keywords if self.keywords else '无'}")
print(f"日志文件: {self.log_file}")
print("按Ctrl+C退出")
try:
while True:
current = pyperclip.paste()
if current != self.last_clipboard and current.strip():
if not self.should_ignore(current):
self.process_clipboard(current)
print(f"[{datetime.now().strftime('%H:%M:%S')}] 检测到新内容")
self.last_clipboard = current
time.sleep(0.5)
except KeyboardInterrupt:
print("\n监控已停止")
# 使用示例
if __name__ == "__main__":
monitor = SmartClipboardMonitor()
monitor.run()
配置示例 (config.json)
{
"keywords": ["password", "邮箱", "重要"],
"ignore_patterns": ["^\\s*$"],
"log_file": "clipboard_log.txt"
}
轻量化的纯Bash方案(macOS/Linux)
#!/bin/bash
# 使用pbpaste (macOS) 或 xclip (Linux)
get_clipboard() {
if [[ "$(uname)" == "Darwin" ]]; then
pbpaste
else
xclip -selection clipboard -o 2>/dev/null
fi
}
echo "剪贴板监控开始 (按Ctrl+C停止)"
prev_content=""
while true; do
content=$(get_clipboard) 2>/dev/null
if [[ "$content" != "$prev_content" && -n "$content" ]]; then
echo ""
echo "=== 检测到新内容 $(date '+%H:%M:%S') ==="
echo "$content" | head -10 # 只显示前10行
# 保存到文件
{
echo ""
echo "[$(date '+%Y-%m-%d %H:%M:%S')]"
echo "$content"
echo "------------------------"
} >> clipboard_log.txt
prev_content="$content"
fi
sleep 1
done
安装依赖
# Python依赖 pip install pyperclip # Windows额外依赖 pip install pywin32 # Linux需要安装xclip sudo apt-get install xclip
使用注意事项
- 错误处理:某些程序会频繁更新剪贴板,建议添加延迟
- 敏感信息:监控密码等敏感信息时要谨慎
- 性能:高频监控会消耗资源,建议设置合理间隔
- 退出机制:确保有优雅的退出方式(Ctrl+C)
选择哪个方案取决于你的操作系统和具体需求,最简单的入门方案是使用Python + pyperclip。