Ohhnews

分类导航

$ cd ..
foojay原文

我们如何在社交媒体上分享Foojay文章

#foojay#社交媒体#自动化#jbang#java

Foojay 每天都会发布几篇文章。每篇文章都需要在 Mastodon、Bluesky 和 LinkedIn 上发布帖子,并提及正确的作者、使用正确的链接和图片。为每篇文章手动完成这些工作很耗时,我并不总有时间,所以我让一个脚本来完成。

寻找免费替代方案

我首先检查了那些用于安排和自动化社交媒体帖子的付费服务。我看过的服务中没有一个是完全符合需求的。第一个问题是价格。当然,这些服务都基于月度订阅,但我们希望尽可能免费运营 Foojay。有一项服务价格合理,但只能发布到 mastodon.social,而不能发布到我们自己的 Mastodon 实例 Foojay.social。对于社区网站来说,为每天几条帖子支付月费也感觉不对劲。

网站由 GitHub Actions 构建和部署,并且有 RSS 订阅源,所以我已经拥有所需的一切。成果就是 scripts/notify/SocialPosts.java,一个通过 JBang 运行的 Java 文件。无需构建配置或云服务器。

脚本如何工作

脚本作为部署工作流的最后一步运行:

  1. 部署前,工作流保存线上 RSS 订阅源。部署后,它拥有新构建的订阅源。
  2. 脚本比较两个订阅源。只存在于新订阅源中的每篇文章都是新文章。脚本不保存状态,定时文章在上线的那一刻被公告。
  3. 对于每篇新文章,脚本加载已发布页面,读取作者和文章正文,并让 Claude 为每个平台撰写一段文本。
  4. Mastodon 和 Bluesky 直接收到帖子。LinkedIn 没有我可用来发布公司页面的 API,因此脚本将文本发送到 Slack 频道,并附上一个链接,打开已填好文本的 LinkedIn 发布器。

当某个平台失败或没有凭据时,其文本会进入同一条 Slack 消息。我仍然可以手动复制,所以不会丢失任何内容。此步骤失败绝不会让已完成的部署变红。

挑战 1:正确提及作者

没有作者姓名的帖子感觉不对。指向错误人物的提及更糟。

每个文章页面都已经包含带有作者姓名及其社交资料的 JSON-LD。脚本读取这些数据,选择 Bluesky 和 Mastodon 资料,并将它们转换为各网络的格式,例如 @name.bsky.social 或 @user@instance。提示词告诉 Claude 完全按给定的账号名使用。当作者没有账号名时,Claude 使用普通姓名,不虚构任何内容。

致 Foojay 作者: 只有当你的个人资料包含你的链接时,脚本才能正确提及你。打开 content/authors/<your-slug>/_index.md,填写 bluesky、mastodon 和 linkedin 字段。提交包含该更改的拉取请求,你的下一篇文章就会在发布时真实提及你。相同字段也出现在作者模板中,贡献指南解释了如何打开拉取请求。

Mastodon 会自行将提及转换为链接。Bluesky 不会。只有当帖子带有包含 UTF-8 字节偏移的 facet 时,提及、链接或话题标签才可点击,因此脚本会构建这些内容。它首先将每个账号名解析为其标识符。无法解析的账号名保持为纯文本,帖子仍然会发布。

LinkedIn 是例外。只有你在发布器中选中某个人时,提及才有效,因此文本包含全名,而我自己选择个人资料。这是仍然需要的唯一手动步骤。但这只是点击我在 Slack 中收到的链接,文本已经填好。当 LinkedIn 页面打开后,我只需点击作者姓名并选择正确的个人资料。脚本甚至添加了文章链接,因此我可以在发布前检查文本。

挑战 2:适应字符限制

Mastodon 允许 500 个字符,而 Bluesky 只有 300 个。提示词中包含了限制,但语言模型计数很差,而且平台的计数方式与你的预期不同:

  • Mastodon 无论链接多长,都将每个链接计为 23 个字符。
  • Bluesky 显示缩短后的链接,并按缩短后的链接计数。

脚本按每个平台的方式计算长度。当文本过长时,它会要求 Claude 提供更短的版本,并说明上一版有多少字符。三次尝试后,脚本会报告失败,而不是发布被截断的文本。

提示词中还包含我们的站内规则。Claude 以 Foojay 的身份写作,只使用文章中的事实,避免炒作词,并且从不将链接或提及放在括号中,因为某些客户端会把括号当作链接的一部分读取。

挑战 3:包含链接和预览图片

Mastodon 从页面的 og: 标签构建预览卡片。帖子只需要链接。基于文章 URL 的请求键可防止我重新运行部署时重复发布。

Bluesky 不构建卡片。脚本从相同的 og: 标签读取标题、描述和图片,上传图片并将卡片附加到帖子。Bluesky 会拒绝约 1 MB 的图片,因此脚本会缩小图片并逐步降低 JPEG 质量,直到符合要求。如果失败,帖子会在没有缩略图的情况下发布。

这就是文章模板要求使用 16:9 JPEG 作为预览图片的原因。它既是网站上的卡片,也是每个社交网络上的图片。

凭据

脚本从环境变量读取凭据,工作流从 GitHub Actions secrets 填充它们。仓库中没有任何敏感信息。Claude 需要 API 密钥,Mastodon 需要具有 write:statuses 权限的访问令牌,Bluesky 需要账号名和应用密码(不是登录密码),Slack 需要具有 chat:write 权限的机器人令牌。当某个值缺失时,脚本会打印文本而不是发布,因此你可以在本地无风险运行。

防护措施

脚本每次运行最多为五篇新文章撰写文本。当前一个订阅源为空时,它会停止,因为否则它会公告整个存档。没有凭据时,它会打印将要发布的内容。使用 --dry-run 时,它完全不发布任何内容,我用它来测试每一次改动。

LinkedIn 仍保留为手动步骤,我会在 Slack 中阅读每一段文本。Mastodon 和 Bluesky 会在部署后几分钟内收到帖子,而且无需任何人记住这件事。

如果你为 Foojay 撰稿,有三件事有助于你的公告:清晰的标题和描述、良好的预览图片,以及包含你的 Bluesky 和 Mastodon 链接的作者个人资料。其余由脚本处理。

结论:Java 驱动 Hugo 网站

Foojay 是一个静态 Hugo 网站,但 Java 完成了让它变得更好的工作。SocialPosts.java 需要 Java 17 和两个库:jsoup 用于读取页面,Jackson 用于处理 JSON。其余部分由 JDK 完成。java.net.http 调用 Mastodon、Bluesky、Slack 和 Claude API,javax.imageio 缩小预览图片,XML 解析器读取 RSS 订阅源。

JBang 让它像 shell 脚本一样简单。贡献者可以阅读该文件、修改它,并在本地使用 --dry-run 运行,无需 Maven 或 Gradle 项目。

本站的其他脚本——抓取器和验证器——也以相同方式工作。想要改进 Foojay 触达读者方式的 Java 开发者已经了解所涉及的每一个工具。打开 scripts/notify/ 并发送拉取请求。

分享此页面

发现错误或想补充内容?在 GitHub 上编辑此页面

[LOADING...]

作者

Frank Delporte

Frank Delporte 是 Java Champion、Java 开发者、Azul 高级技术文档工程师、博主、《Java Programming for Raspberry Pi - A Hands-On Guide to Electronics and IoT Projects》作者,以及 Pi4J、Lottie4J、Sheetmusic4J 等项目的开源贡献者……

相关文章

宣布全新 Foojay

Foojay Foojay [LOADING...]
[LOADING...][LOADING...][LOADING...]3 位作者2022年5月3日 15,987 次浏览

如何在 Foojay.io 提交你的下一篇文章

Foojay 开发工具 [LOADING...]
[LOADING...]Frank Delporte2022年11月16日 10,017 次浏览

Foojay Mastodon 服务:来了!

开发工具Foojay 开发工具 [LOADING...]
[LOADING...]Frank Delporte2022年12月16日 4,794 次浏览

Foojay 在 Mastodon 上:最新进展

开发工具Foojay教程 研究 [LOADING...]
[LOADING...]Nicolas Frankel2022年12月16日 8 次浏览

一个不可变的 Mastodon 用户名

研究工具教程