AI 时代,软件已死,你需要什么,直接和 AI 说就行。
我的需求其实非常具体,也非常直接:
按下快捷键 →
如果剪贴板是图片 →
自动去 EXIF →
压缩 →
上传到 S3 →
拿到 URL →
生成 Markdown 图片语法 →
回写剪贴板 →
弹一个通知
这事儿,说难不难,说简单也不简单。
从「找工具」开始的老路径
一开始我用的是 PicGo。
说实话,它曾经应该是很辉煌的:
插件一大堆,可以压缩、去 EXIF、上传 S3、生成 Markdown,甚至还能把 HEIC 转成 JPEG。
但现在用下来就一个感觉:年久失修。
- 偶尔有 bug
- 插件市场打不开
- 配置一多就开始玄学失效
放在以前,我大概会:
- 重启电脑
- 重装 PicGo
- 搜半天 issue
- 甚至怀疑是不是系统问题
但这次我不想再这么干了
这次我直接选择了一条完全不同的路。
我没有再去找“哪个软件能满足我”,
而是直接对 ChatGPT 说了一句话:
我想要这样一个功能……(把需求完整描述了一遍)
ChatGPT 给了我两个选项:
- 原生用 Xcode 写一个 macOS 应用
- 或者,用 Raycast 扩展
说实话,这一刻挺神奇的。
我压根没想到 Raycast。
我甚至一开始还在想,要不要用 Python + Qt 自己写个小工具。
但 AI 提醒了我一件事:
你不一定要“做一个软件”,你只需要“拼出一个流程”。
从「写软件」到「组合能力」
接下来事情变得非常快。
我把完整需求直接丢进 Cursor,
让它开始写 Raycast Extension。
中间调了一下几个点:
- sips 处理图片
- EXIF 是否真的被移除
- S3 / R2 上传细节
一个小时左右,搞定。
没有安装 Xcode,
没有搭 UI,
没有设计窗口,
甚至没有“软件发布”。
只有一个快捷键,和一个刚好满足我需求的工具。
如果我有别的需求,我直径cursor里面调整就行了,我不需要一个GUI,也不需要那么多的配置可选项。
这就是 AI 时代真正改变的地方
以前我们的思路是:
我要做这件事 → 找一个现成软件 → 适应它的设计
现在变成了:
我要做这件事 → 把需求说清楚 → AI 帮我拼出解决方案
软件不再是一个固定形态的产品,
而更像是一段随需生成的能力组合。
最后的结果
我现在用的是一个极简单的 Raycast 扩展:
一个 Raycast 扩展,用于自动处理剪贴板中的图片:
去除 EXIF、压缩、上传到 S3,并生成 Markdown 图片链接。
它不在 App Store,
没有官网,
也不需要被任何人下载。
它只为我服务。
而这件事,在几年前几乎是不可想象的。
功能特性
- 📋 剪贴板检测 - 自动检测剪贴板中的图片文件
- 🖼️ 图片处理 - 自动应用 EXIF orientation、调整大小、压缩
- 🔒 隐私保护 - 使用 exiftool 完全删除 EXIF 元数据
- ☁️ 自动上传 - 上传到 S3/R2 云存储
- 📝 Markdown 生成 - 自动生成 Markdown 图片语法并复制到剪贴板
- ⚡ 快捷操作 - 一键完成所有操作
工作流程
- 按下快捷键触发命令
- 检测剪贴板中的图片
- 使用 sips 处理图片(应用 orientation、调整大小、转换格式)
- 使用 exiftool 删除所有 EXIF 元数据
- 计算 MD5 并生成文件路径
- 上传到 S3/R2
- 生成 Markdown 图片链接并复制到剪贴板
- 显示成功通知
安装要求
系统要求
- macOS
- Raycast
依赖工具
- exiftool - 用于删除 EXIF 元数据
安装 exiftool:
1 | brew install exiftool |
配置
编辑 src/upload-s3.ts 文件中的配置区域:
1 | // ===== 配置区 ===== |
配置说明
- S3_ENDPOINT - S3 或 Cloudflare R2 的端点地址
- S3_ACCESS_KEY - S3 访问密钥
- S3_SECRET_KEY - S3 密钥
- S3_BUCKET - S3 存储桶名称
- CDN_DOMAIN - CDN 域名,用于生成公开访问 URL
- JPEG_QUALITY - JPEG 压缩质量(1-100,100 为最高质量)
- MAX_SIZE - 图片最大尺寸(像素),超过此尺寸会自动缩放
文件路径规则
上传的文件路径格式:
1 | static/images/{year}/{month}/{day}/{md5}.jpg |
例如:
1 | static/images/2024/12/19/a1b2c3d4e5f6...jpg |
生成的 CDN URL 格式:
1 | https://your-cdn-domain.com/static/images/{year}/{month}/{day}/{md5}.jpg |
使用方法
复制图片到剪贴板
- 截图或复制图片文件
触发命令
- 在 Raycast 中搜索 “upload s3” 命令
- 或设置快捷键直接触发
自动处理
- 扩展会自动处理图片并上传
- 完成后会在剪贴板中生成 Markdown 图片链接
粘贴使用
- 直接粘贴到 Markdown 编辑器即可
开发
安装依赖
1 | npm install |
开发模式
1 | npm run dev |
构建
1 | npm run build |
代码检查
1 | npm run lint |
技术栈
- TypeScript - 编程语言
- Raycast API - 扩展框架
- AWS SDK v3 - S3 上传
- sips - macOS 图片处理(系统自带)
- exiftool - EXIF 元数据删除
注意事项
- exiftool 路径 - 代码会自动检测 exiftool 的安装路径(支持 Apple Silicon 和 Intel Mac)
- 临时文件 - 处理过程中会创建临时文件,处理完成后自动清理
- 错误处理 - 所有错误都会在 console 中输出详细信息,便于调试
- 文件格式 - 支持常见图片格式(jpg, png, gif, webp, bmp, tiff 等)
许可证
MIT
代码
1 | import { Clipboard, showHUD } from "@raycast/api"; |