Skip to content

一键发布 Newsletter:AppleScript 与 Quaily CLI 的完美配合

Published: at 08:38Suggest Changes

Quaily 是一个新兴的、AI 驱动的现代化 Newsletter 服务,也是少有的由华人开发的产品。我初次了解这个平台是通过 Quaily 首席 Lyric 的一条推文,年代久远我就不去翻找了,大意是他比较了市面上的几个 Newsletter 平台后不甚满意,于是决定亲自开发一个。最初使用时,Quaily 的功能还不像现在这样完善,但其页面精美与时尚感就已经深深吸引了我。再加上听说 Lyric 本人也是位不折不扣的帅哥,对于一个「颜狗」来说,好看即正义!无脑冲呗。

事实证明,真正的帅哥魅力不仅来自外表,更在于能力与审美的完美结合。想想蒋丞、顾飞、江添、顾望……咳咳,言归正传。

Quaily 绝非徒有其表,而是拥有众多实用功能的专业工具。我并不想把这篇文章写成软文,具体功能介绍可以移步用户手册查看。下面,我将分享如何利用 AppleScript 实现一键发布的便捷操作。

为什么选择 AppleScript?

AppleScript 是 macOS 内置的自动化脚本语言,它使用户能够创建自动化工作流程,控制各种支持脚本的应用程序。选择 AppleScript 的优势在于:

  1. 无需安装额外软件,系统原生支持
  2. 与 macOS 系统深度集成,运行稳定
  3. 可以控制几乎所有支持脚本的 Mac 应用程序
  4. 可以直接让 AI 生成脚本,基本不需要修改就能使用(这一点尤为关键)

实现方式

区别于其他 Newsletter 服务,Quaily 提供了 Quail CLI 这款强大的命令行工具,可实现用户认证自动化、Markdown 文章管理以及用户详情获取等操作。它通过与 Quaily API 交互,让用户在命令行环境中完成各种操作,如登录、获取用户信息、文章的创建、更新、发布、取消发布和删除等,无需通过网页界面。这些功能为通过脚本实现自动化发布奠定了坚实基础。(具体使用说明请参见《介绍 Quail CLI:简化你的工作流》)。

注意:如果我们使用的是 Obsidian,可以直接使用 Quaily 官方提供的插件,无需自己编写脚本这么麻烦。

安装与配置 Quaily CLI

在构建自动化脚本之前,您需要先安装并配置 Quail CLI。安装过程十分简单,只需执行一条命令:

go install github.com/quailyquaily/quail-cli@latest

当然,前提是系统中已安装 Go 语言环境。或者您也可以直接从 GitHub 上安装 Quaily 官方编译好的二进制文件,截至 2025 年 3 月 6 日,二进制文件的版本号为 v.0.0.3。

安装完成后,需要进行登录认证。打开终端,执行 quail-cli login 命令,系统会启动 OAuth 流程完成 Quaily 身份验证。终端中会显示一个 URL,您需要访问该链接并授权应用程序访问您的账户。认证成功后,登录信息会保存在配置文件中(默认位于 $HOME/.config/quail-cli/config.yaml),今后操作就不再需要重复登录了。

配置文件包含您的认证信息和一些自定义设置,例如前置元数据映射等,这些设置能帮助您更好地适应自己的工作流程。比如,您可以自定义 frontmatter 中的键映射,将 featureImage 映射到 cover_image_url,使其更符合您的使用习惯。

AppleScript 基础与命令行交互

脚本的目标是实现一键发布到 Quaily,而 AppleScript 的关键优势在于它能执行 shell 命令,从而调用 Quail CLI。

在 AppleScript 中,执行 shell 命令通过 do shell script 命令实现。这个命令由 macOS 中的 Standard Additions 脚本扩展提供,让您可以在 AppleScript 中执行任何命令行工具。例如,要执行 ls /Applications/ 这样的简单命令,您可以这样写:do shell script "ls /Applications/"

需要注意的是,当 shell 命令包含空格或特殊字符时,必须正确引用这些字符。最简便的方法是使用 AppleScript 的 quoted form of 属性,它会返回一个安全的字符串形式,不受 shell 进一步解释的影响。例如:do shell script "ls " & quoted form of "/Library/Application Support/"

对于包含中文等非 ASCII 字符的文件路径或命令,正确设置环境变量至关重要。这能确保 UTF-8 编码的正确处理,避免乱码和路径识别错误,特别是在处理包含中文字符的 Markdown 文件或文件夹时。使用以下方式设置环境变量:

do shell script "export LC_ALL=en_US.UTF-8; export LANG=en_US.UTF-8; your_command_here"

这样,即使您的文件名或路径包含中文字符,AppleScript 也能正确处理而不会出现编码问题。

构建 AppleScript 脚本实现一键发布

现在就可以结合前面的知识,构建一个完整的 AppleScript 脚本,实现一键发布到 Quaily 了。这个脚本包括以下步骤:选择要发布的 Markdown 文件,使用 Quail CLI 上传并发布该文件。

首先,需要选择一个 Markdown 文件。这可以通过 AppleScript 的 choose file 命令实现:

set markdownFile to choose file with prompt "请选择要发布的 Markdown 文件:" of type {"md", "markdown"}

接下来,获取用户的列表(list)信息。为简便起见,可以在脚本中预设列表的 slug,或者通过对话框输入:

set listSlug to text returned of (display dialog "请输入要发布到的列表 slug:" default answer "your_list_slug")

然后,使用 Quaily CLI 的 post upsert 命令上传文件:

set uploadCommand to "export LC_ALL=en_US.UTF-8; export LANG=en_US.UTF-8; quail-cli post upsert " & quoted form of (POSIX path of markdownFile) & " -l " & quoted form of listSlug
set uploadResult to do shell script uploadCommand

上传成功后,Quaily CLI 会返回包含帖子信息的 JSON 响应,您可以从中提取 slug 信息:

-- 假设 uploadResult 是类似 {"status":"success","data":{"id":"12345","slug":"my-post-slug",...}} 的 JSON 字符串
-- 使用简单的文本处理来提取 slug
set slugExtractCommand to "echo " & quoted form of uploadResult & " | grep -o '\"slug\":\"[^\"]*\"' | cut -d\\" -f4"
set postSlug to do shell script slugExtractCommand

这段代码使用管道命令组合 grepcut 从 JSON 响应中提取 slug 值。grep -o 查找包含 “slug” 的部分,然后 cut 命令分割字符串并提取 slug 的实际值。

获取到 slug 后,继续使用 post publish 命令发布该帖子:

set publishCommand to "export LC_ALL=en_US.UTF-8; export LANG=en_US.UTF-8; quail-cli post publish -l " & quoted form of listSlug & " -p " & quoted form of postSlug
set publishResult to do shell script publishCommand

最后,显示操作结果:

display dialog "帖子已成功发布!" buttons {"确定"} default button "确定"

将这些步骤组合起来,您就拥有了一个实用的一键发布脚本。

高级优化与自动化技巧

为了进一步提升自动化流程的效率,可以考虑以下高级优化策略:

自动提取 Markdown 前置元数据(frontmatter)是一个非常实用的功能。通过 shell 命令如 grepsed,可以解析 Markdown 文件并提取其中的 slug 信息,无需手动输入:

set extractSlugCommand to "grep -m 1 'slug:' " & quoted form of (POSIX path of markdownFile) & " | sed 's/slug: *//' | tr -d '\r\n'"
set postSlug to do shell script extractSlugCommand

加入错误处理机制也很重要,确保脚本在各种情况下都能稳定运行。例如,检查文件是否存在,检查上传和发布过程中是否有错误等。使用 AppleScript 的 try...on error...end try 结构实现:

try
    -- 脚本主体
on error errorMessage
    display dialog "发生错误:" & errorMessage buttons {"确定"} default button "确定" with icon stop
end try

AppleScript 支持将脚本保存为独立应用程序,并可添加到 Dock 或设置键盘快捷键,实现真正的「一键」发布。创建应用程序的步骤很简单:在 Script Editor 中编写脚本,然后选择「文件」→「输出」,在格式中选择「应用程序」。

此外,如果需要在发布过程中加入其他步骤,如预处理 Markdown 文件、自动生成标签、上传图片等,都可以通过扩展脚本来实现。

结合实际工作流的应用场景

在实际的内容创作工作流中,一键发布脚本可以与其他工具和流程无缝集成。例如,将其与 Markdown 编辑器结合,当文章编辑完成后,直接点击按钮或使用快捷键触发发布。就像我使用的文本编辑器 BBEdit,内置了 AppleScript 管理功能,可通过快捷键直接触发脚本。

您还可以考虑与其他自动化工具结合,如 Hazel、Keyboard Maestro 或 macOS 自带的 Automator,构建更复杂的工作流。例如,当将新的 Markdown 文件放入指定文件夹时,自动触发发布流程;或设置定时任务,在特定时间自动发布预先准备好的内容。

通过这些集成和扩展,一键发布脚本可以成为一个强大的内容管理和发布解决方案,大幅提升工作效率。

结语

在本文中,我并未提供自己使用的完整脚本,而是希望帮助您理解如何使用 AppleScript 和 Quail CLI 实现一键发布,并鼓励您根据自身需求定制和扩展这个解决方案。通过自动化处理重复性任务,我们可以将更多时间和精力投入到创意和内容质量上,这正是技术为创作者带来的最大价值。

注:本文中的 API 端点和参数仅为示例,实际使用时请参考 Quaily 的官方文档


本文初稿在 Tana 上完成,这是一款通过将 AI 驱动的结构化数据库与流畅的大纲列表相结合的笔记软件,重新定义了现代知识管理,使用户能够无缝地组织相互关联的想法,同时保持自由形式思考的灵活性。


Next Post
悼友文