头图
作者:阿尔的代码屋
项目地址:Clipboard Recorder

Clipboard Recorder 可以记录各种类型的剪贴板内容

💡 背景思考

在我日常使用Windows自带的粘贴板的过程中,偶然间想到:

  1. 🔐 Windows粘贴板安全性的缺失:Windows系统的剪贴板是一个完全开放的系统资源,任何运行中的程序都可以自由访问。这就意味着,当我们复制了密码、私钥等敏感信息时,可能有恶意程序正在默默记录这些内容,存在较大的安全隐患。
  2. 📝 日常使用过程中历史记录的需求:在日常工作中,我们经常需要找回之前复制过的内容。但Windows默认的剪贴板只能保存最新一条记录,虽然Windows 10引入了历史记录功能,但在使用上仍有诸多限制。

正是基于这两点思考,我开发了Clipboard Recorder工具。它不仅能帮助用户直观地了解剪贴板的安全风险,也提供了完整的历史记录查询功能。

✨ 功能特性

安全警示

  • 实时监控剪贴板变化
  • 记录所有类型的剪贴板内容(文本、图片、文件路径)
  • 展示每条内容的详细格式信息
  • 自动保存完整的操作历史

实用功能

  • 按日期组织历史记录
  • 支持图片的多种保存方式
  • 智能去重避免重复记录
  • 高度可配置的行为控制

🔧 技术实现

核心架构

项目采用模块化设计,主要包含以下组件:

src/
├── monitor.py    # 核心监控逻辑
├── logger.py     # 日志管理
├── config.py     # 配置管理
├── models.py     # 数据模型
└── constants.py  # 常量定义

关键技术点

剪贴板监控

def _read_clipboard(self) -> Optional[ClipboardContent]:
    """读取剪贴板内容"""
    try:
        content = ClipboardContent()
        content.formats = self._get_clipboard_formats()
        
        # 按优先级尝试读取不同类型的内容
        return (self._read_image_content(content) or
                self._read_text_content(content) or
                self._read_file_paths(content))
    except Exception as e:
        print(Messages.Error.MONITOR_ERROR.format(str(e)))
        return None

内容去重

def _get_last_entry_hash(self, last_entry: Dict[str, Any]) -> Optional[str]:
    """计算最后一条记录的哈希值"""
    content_type = last_entry.get(JsonKeys.CONTENT_TYPE)
    if content_type == ContentType.TEXT.value and JsonKeys.TEXT_CONTENT in last_entry:
        return hashlib.md5(last_entry[JsonKeys.TEXT_CONTENT].encode('utf-8')).hexdigest()
    # ... 其他类型的处理

安全存储

def _process_image_data(self, content: ClipboardContent, data_dict: dict) -> dict:
    """处理图片数据,支持文件存储和 Base64 编码"""
    if content.content_type != ContentType.IMAGE.value:
        return data_dict
        
    image_path = self._save_image(content)
    if image_path:
        data_dict[JsonKeys.IMAGE_PATH] = image_path
        
    if self._config.get(ConfigKeys.Logging.SECTION, ConfigKeys.Logging.SAVE_IMAGE_BASE64):
        data_dict[JsonKeys.IMAGE_BASE64] = content.data[JsonKeys.IMAGE_DATA]
        
    return data_dict

🤔 开发过程中的思考

安全性考虑

  • 避免在内存中长期保留敏感信息
  • 提供配置选项控制内容存储方式
  • 清晰的日志记录便于审计

性能优化

  • 使用文件句柄缓存
  • 智能的内容检测机制
  • 异步写入避免阻塞

用户体验

  • 友好的控制台输出
  • 灵活的配置选项
  • 直观的日志格式

📖 使用方法

  1. 安装依赖

    pip install -r requirements.txt
  2. 运行程序

    python main.py
  3. 查看历史记录
  4. 日志文件位于 logs 目录
  5. 图片文件位于 logs/images 目录
  6. 每天的记录单独存储在一个 JSON 文件中

🚀 TODO 列表

功能增强计划

  • [ ] 支持内容搜索功能,方便查找历史记录
  • [ ] 添加内容分类功能,更好地组织历史记录
  • [ ] 支持更多剪贴板格式的解析
  • [ ] 提供数据导入导出功能

📌 结语

开发这个工具的过程让我深入思考了很多关于安全性和隐私的问题。在便利性和安全性之间找到平衡点并不容易,但这正是我们作为开发者需要不断思考和改进的地方。

希望这个工具能够帮助更多人意识到剪贴板安全的重要性,同时也能在实际使用中带来便利。欢迎大家在 GitHub 上提出建议和贡献代码。

也欢迎关注我的微信公众号【阿尔的代码屋】,获取更多技术干货和编程心得。我会定期分享:

  • 编程技术文章
  • 开发工具使用技巧
  • 实用项目经验
  • 个人成长心得

微信公众号二维码

扫描上方二维码即可关注,一起交流学习~

本文由 阿尔的代码屋 原创发布,转载请注明出处。 ©️

阿尔的代码屋
1 声望0 粉丝

Add bricks to the edifice of the world as you envision it.