如何编写监控剪贴板变化的脚本

wen 实用脚本 3

本文目录导读:

如何编写监控剪贴板变化的脚本

  1. Python方案(跨平台)
  2. Linux/MacOS 方案(使用xclip和xdotool)
  3. 使用剪贴板事件(Windows通过win32api)
  4. 高级版本 - 支持过滤和关键字匹配
  5. 配置示例 (config.json)
  6. 轻量化的纯Bash方案(macOS/Linux)
  7. 安装依赖
  8. 使用注意事项

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

使用注意事项

  1. 错误处理:某些程序会频繁更新剪贴板,建议添加延迟
  2. 敏感信息:监控密码等敏感信息时要谨慎
  3. 性能:高频监控会消耗资源,建议设置合理间隔
  4. 退出机制:确保有优雅的退出方式(Ctrl+C)

选择哪个方案取决于你的操作系统和具体需求,最简单的入门方案是使用Python + pyperclip。

抱歉,评论功能暂时关闭!