ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于AI CLI与飞书机器人构建内容自动化工作流实战

2026/8/22 11:12:25 拓冰建站 浏览量
基于AI CLI与飞书机器人构建内容自动化工作流实战 大家好我是专注于自动化工具链开发的技术博主。在日常内容创作中你是否也遇到过这样的困扰灵感碎片散落在手机备忘录、微信文件传输助手、Obsidian笔记等多个角落想要整理成一篇朋友圈内容时却需要反复复制粘贴、手动排版过程繁琐且容易遗漏。本文将分享一个高效解决方案利用 Codex CLI 与飞书机器人构建一个自动化工作流实现从灵感收集、内容整理到一键推送至飞书待发布的完整闭环。无论你是个人内容创作者还是希望提升团队信息流转效率的开发者这套方案都能为你节省大量重复劳动时间。1. 项目背景与核心概念在深入代码之前我们有必要厘清本项目的核心组件及其扮演的角色。Codex CLI 在本上下文中Codex CLI 并非特指某个单一产品而是一个泛指代表一类能够通过命令行接口CLI与大型语言模型如 GPT、Claude 等进行交互的工具。它允许开发者用脚本化的方式调用 AI 能力例如生成文本、总结内容或进行格式转换。你可以将其理解为将 AI 能力集成到自动化脚本中的“桥梁”。本文将以一个假设的、功能类似的ai-cli工具为例进行演示其核心思想是通用的。飞书机器人 飞书开放平台提供的“自定义机器人”功能可以通过 Webhook 地址接收 HTTP POST 请求并将请求中的消息内容发送到指定的飞书群聊或单人聊天中。它是我们自动化流程的“终点站”负责接收并呈现最终整理好的内容。Obsidian 一个强大的、基于本地 Markdown 文件的知识管理工具。它通常作为我们的“灵感仓库”或“草稿箱”。本项目假设待发布内容的原始素材零散的句子、图片想法、链接等以特定格式存放在 Obsidian 的某个笔记中。核心工作流触发手动或定时运行一个脚本。输入脚本读取 Obsidian 中指定笔记的内容。处理通过 Codex CLI或类似 AI 工具对零散内容进行智能整理、润色、排版生成符合朋友圈发布风格的完整文案。输出将生成的文案通过 HTTP 请求发送到飞书机器人的 Webhook。呈现飞书机器人将文案推送到指定会话创作者可在飞书内进行最终审核与发布。这个流程将内容生产的“收集-整理-发布”环节串联起来实现了半自动化特别适合需要定期维护社交媒体内容的朋友。2. 环境准备与版本说明为了复现本项目你需要准备以下环境。请注意版本号应以你实际使用的为准以下为示例版本。操作系统 macOS / Linux (Windows 可通过 WSL 或 Git Bash 运行原理一致)Python 3.8 或更高版本。本项目将使用 Python 编写主控脚本。Node.js 14 或更高版本可选如果你的 AI CLI 工具基于 Node.js。包管理工具pip(Python),npm或yarn(可选用于安装某些 CLI 工具)。Obsidian 最新版即可确保你知道笔记文件的本地存储路径。飞书账号 用于创建机器人并获取 Webhook。AI 服务 API 密钥 例如 OpenAI API Key 或 Claude API Key用于驱动 Codex CLI 工具。关键工具安装示例 假设我们使用一个名为ai-cmd的虚拟 CLI 工具来模拟 Codex CLI 的功能。你可以根据实际情况替换为openai-cli,claude-cli或其他任何提供类似功能的工具。# 示例安装一个假设的Python包提供AI命令行调用能力 pip install openai # 然后我们创建一个自定义的CLI包装脚本将其视为我们的“Codex CLI”3. 核心组件原理与配置拆解3.1 飞书机器人创建与 Webhook 获取这是消息推送的通道配置一次即可永久使用。打开飞书进入目标群聊或创建一个新的单人聊天与自己。点击群设置/聊天设置 -添加机器人-自定义机器人。设置机器人名称如“内容助手”、描述并上传头像。创建成功后最关键的一步是复制Webhook 地址。这个地址格式通常为https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxx。请妥善保管此地址一旦泄露他人可向你的群聊发送消息。可选设置安全校验如关键词校验或签名校验提升安全性。本文为简化流程暂不开启。3.2 Obsidian 笔记作为数据源的设计我们需要一个固定的格式来存放待整理的内容以便脚本能够可靠地解析。建议在 Obsidian 中创建一个名为待发布朋友圈.md的笔记并采用以下结构## 收集箱 - 今天读到一篇关于效率工具的文章很有启发。 - 咖啡店的新品尝试口感层次丰富。 - 项目里程碑达成团队协作效率提升明显。 - [附一张夕阳下的办公室照片] ## 标签 #工作 #生活 #随笔 --- *以下内容由脚本自动生成请勿手动修改* **上次生成结果** 这里是上次AI整理好的内容...脚本的任务就是读取## 收集箱到## 标签之间的列表内容以及## 标签下的标签文本作为 AI 整理的原材料和风格指引。3.3 AI CLI 工具的核心调用逻辑无论是哪种具体的 CLI 工具其核心都是向 AI 模型 API 发送一个结构化的请求Prompt。我们将这个过程封装在一个 Python 函数中。一个典型的 Prompt 设计如下你是一个社交媒体内容助手。请将以下零散的笔记条目整合成一条流畅、自然、适合发布在朋友圈的短文。要求 1. 语言口语化富有个人情感。 2. 合理串联所有条目使其成为一个有逻辑的整体。 3. 适当添加表情符号增强感染力。 4. 文末附上提供的标签。 原始笔记 {notes_content} 标签 {tags_content} 请直接输出整理后的朋友圈文案不要有任何额外的解释或前缀。这个 Prompt 定义了 AI 的角色、任务、具体要求和输入格式是获得理想输出的关键。4. 完整实战案例构建自动化脚本让我们从零开始构建这个名为feishu_content_pusher.py的 Python 脚本。4.1 项目结构与依赖创建一个新的项目目录并初始化虚拟环境推荐。mkdir auto-content-pusher cd auto-content-pusher python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate创建requirements.txt文件并安装依赖。openai1.0.0 # 用于调用OpenAI API作为Codex CLI的底层实现 requests2.28.0 # 用于发送HTTP请求到飞书Webhook python-dotenv1.0.0 # 用于管理环境变量保护API密钥安装依赖pip install -r requirements.txt4.2 核心脚本编写创建主脚本文件feishu_content_pusher.py。#!/usr/bin/env python3 飞书朋友圈内容自动整理推送脚本 功能读取Obsidian笔记调用AI整理推送至飞书机器人 import os import re import requests import openai from dotenv import load_dotenv from pathlib import Path # 加载环境变量将API密钥等敏感信息存放在 .env 文件中 load_dotenv() class ContentPusher: def __init__(self): # 配置初始化 self.obsidian_vault_path Path(os.getenv(OBSIDIAN_VAULT_PATH, /path/to/your/obsidian/vault)) self.source_note_name os.getenv(SOURCE_NOTE_NAME, 待发布朋友圈.md) self.feishu_webhook_url os.getenv(FEISHU_WEBHOOK_URL) # 初始化OpenAI客户端 (作为Codex CLI的替代) openai.api_key os.getenv(OPENAI_API_KEY) if not openai.api_key: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY) if not self.feishu_webhook_url: raise ValueError(请在 .env 文件中设置 FEISHU_WEBHOOK_URL) self.source_note_path self.obsidian_vault_path / self.source_note_name def read_obsidian_note(self): 读取Obsidian笔记提取收集箱内容和标签 if not self.source_note_path.exists(): print(f错误笔记文件不存在于 {self.source_note_path}) return None, None with open(self.source_note_path, r, encodingutf-8) as f: content f.read() # 使用正则表达式提取 ## 收集箱 和 ## 标签 之间的内容 notes_match re.search(r## 收集箱\s*\n([\s\S]*?)\n## 标签, content) tags_match re.search(r## 标签\s*\n([\s\S]*?)(?:\n---|\Z), content) notes_content notes_match.group(1).strip() if notes_match else tags_content tags_match.group(1).strip() if tags_match else return notes_content, tags_content def call_ai_for_processing(self, notes, tags): 调用AI模型整理内容 if not notes: return 【提示】收集箱为空无需整理。 # 构建Prompt prompt f你是一个社交媒体内容助手。请将以下零散的笔记条目整合成一条流畅、自然、适合发布在朋友圈的短文。要求 1. 语言口语化富有个人情感。 2. 合理串联所有条目使其成为一个有逻辑的整体。 3. 适当添加表情符号增强感染力。 4. 文末附上提供的标签。 原始笔记 {notes} 标签 {tags} 请直接输出整理后的朋友圈文案不要有任何额外的解释或前缀。 try: # 调用OpenAI GPT-3.5-Turbo模型 (Codex CLI的API本质) response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: system, content: 你是一个专业的社交媒体内容编辑。}, {role: user, content: prompt} ], temperature0.7, # 控制创造性0.0更确定1.0更多变 max_tokens500 ) ai_content response.choices[0].message.content.strip() return ai_content except Exception as e: print(f调用AI API时出错{e}) return f【AI处理失败】原始内容如下\n{notes}\n\n标签{tags} def send_to_feishu(self, text): 推送Markdown格式消息到飞书机器人 if not text: print(推送内容为空跳过。) return False # 飞书机器人支持Markdown格式的消息 payload { msg_type: post, content: { post: { zh_cn: { title: 朋友圈内容待发布, content: [ [{ tag: text, text: text }] ] } } } } headers { Content-Type: application/json } try: response requests.post(self.feishu_webhook_url, jsonpayload, headersheaders) if response.status_code 200 and response.json().get(code) 0: print(✅ 内容已成功推送至飞书) return True else: print(f❌ 飞书推送失败。状态码{response.status_code}, 返回{response.text}) return False except requests.exceptions.RequestException as e: print(f❌ 网络请求异常{e}) return False def update_source_note(self, original_notes, original_tags, ai_result): 可选将AI生成的结果追加回源笔记方便追溯 try: with open(self.source_note_path, a, encodingutf-8) as f: f.write(f\n\n---\n**自动生成于 {datetime.now().strftime(%Y-%m-%d %H:%M:%S)}**\n) f.write(ai_result) print( 已更新源笔记。) except Exception as e: print(f更新笔记时出错{e}) def run(self): 主执行流程 print(开始执行内容整理与推送流程...) # 1. 读取源数据 notes, tags self.read_obsidian_note() if notes is None: return print(f读取到笔记内容\n{notes[:200]}...) # 打印前200字符预览 print(f读取到标签{tags}) # 2. AI处理 print(正在调用AI进行内容整理...) final_content self.call_ai_for_processing(notes, tags) print(AI整理完成。) # 3. 推送至飞书 print(正在推送至飞书机器人...) success self.send_to_feishu(final_content) # 4. 可选回写结果 if success: self.update_source_note(notes, tags, final_content) print(流程执行完毕。) if __name__ __main__: # 需要从 datetime 模块导入 from datetime import datetime pusher ContentPusher() pusher.run()4.3 环境变量配置文件在项目根目录创建.env文件用于存储所有敏感和可变的配置。务必将该文件添加到.gitignore中避免泄露密钥。# .env 文件内容 # Obsidian 配置 OBSIDIAN_VAULT_PATH/Users/YourName/Documents/ObsidianVault SOURCE_NOTE_NAME待发布朋友圈.md # 飞书机器人配置 FEISHU_WEBHOOK_URLhttps://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxx # OpenAI API 配置 (作为Codex CLI的示例) OPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4.4 运行与验证填充内容在 Obsidian 的待发布朋友圈.md中按照预设格式添加几条零散的笔记和标签。配置环境根据你的实际路径和密钥修改.env文件。执行脚本在终端中运行以下命令。python feishu_content_pusher.py查看结果终端会打印执行日志。打开飞书找到你配置了机器人的群聊或聊天窗口应该能看到一条来自“内容助手”机器人的消息其中包含了 AI 整理好的、格式优美的朋友圈文案。4.5 结果说明成功运行后你将看到类似以下的效果终端输出开始执行内容整理与推送流程... 读取到笔记内容 - 今天读到一篇关于效率工具的文章很有启发。 - 咖啡店的新品尝试口感层次丰富。 - 项目里程碑达成团队协作效率提升明显。 ... 读取到标签#工作 #生活 #随笔 正在调用AI进行内容整理... AI整理完成。 正在推送至飞书机器人... ✅ 内容已成功推送至飞书 已更新源笔记。 流程执行完毕。飞书收到的消息 朋友圈内容待发布今天真是充实的一天早上阅读了一篇关于效率工具的文章收获了不少新思路感觉又能优化自己的工作流了。下午在咖啡店尝试了新品丰富的口感层次让味蕾来了场小旅行瞬间充满电。最开心的是团队的项目终于达成了重要里程碑大家的协作效率肉眼可见地提升为每一位伙伴感到骄傲✨ #工作 #生活 #随笔至此一个从本地笔记到云端协作平台的自动化内容整理推送流程就搭建完成了。5. 常见问题与排查思路在实践过程中你可能会遇到以下问题问题现象可能原因排查思路与解决方案脚本报错ModuleNotFoundErrorPython 依赖未安装1. 确认已激活虚拟环境 (source venv/bin/activate)。2. 运行pip install -r requirements.txt重新安装。调用 AI API 失败提示Invalid API KeyAPI 密钥错误或未设置1. 检查.env文件中的OPENAI_API_KEY是否正确无误。2. 确认密钥是否有使用额度或是否被禁用。3. 尝试在命令行直接echo $OPENAI_API_KEY测试环境变量是否加载。飞书机器人未收到消息Webhook 地址错误或网络问题1. 复制.env中的FEISHU_WEBHOOK_URL在浏览器中访问应返回{code:0, msg:success}。2. 检查飞书机器人是否被移除或禁用。3. 检查服务器网络是否能正常访问飞书开放平台。飞书收到消息但格式错乱消息内容包含飞书不支持的 Markdown 语法1. 简化 AI 生成的文案避免过于复杂的 Markdown 嵌套。2. 修改send_to_feishu函数使用msg_type: text发送纯文本。脚本读取不到 Obsidian 笔记文件路径配置错误1. 检查OBSIDIAN_VAULT_PATH路径是否正确特别是 macOS/Windows 的路径分隔符差异。2. 确认SOURCE_NOTE_NAME文件名和大小写是否完全匹配。3. 在脚本中添加print(self.source_note_path)打印完整路径进行调试。AI 整理的内容不理想Prompt 指令不够清晰或温度参数不合适1. 优化call_ai_for_processing函数中的 Prompt给出更具体的例子和要求。2. 调整temperature参数降低如0.3使其更稳定或提高如0.9使其更有创意。脚本权限不足Linux/Mac文件不可读或不可写1. 使用ls -la检查笔记文件的权限。2. 使用chmod命令调整文件权限例如chmod 644 待发布朋友圈.md。6. 最佳实践与工程建议将脚本跑通只是第一步要让其稳定、安全、可维护地运行还需要注意以下几点密钥安全管理绝对不要将.env文件或硬编码的密钥提交到 Git 仓库。确保.gitignore文件中包含.env。考虑使用更专业的密钥管理服务如 AWS Secrets Manager、HashiCorp Vault或在生产环境中使用 CI/CD 系统的环境变量功能。错误处理与日志当前的脚本已包含基础 try-catch但对于生产环境建议引入更完善的日志库如 Python 的logging模块将运行日志、错误信息记录到文件方便后期排查。可以为飞书推送失败、AI API 调用失败等关键错误设置重试机制。流程优化与扩展定时触发结合系统的定时任务如 Linux 的cron、Windows 的“任务计划程序”实现每天固定时间自动整理推送。多数据源扩展read_obsidian_note方法使其不仅能读 Obsidian还能读取其他来源如 Notion API、本地 TXT 文件、甚至剪贴板历史。内容审核在发送到飞书前可以加入一个“人工审核”环节。例如脚本将内容生成后先发送到一个“待审核”飞书群审核通过后再由另一个脚本或手动操作发送到最终发布群。模板化将 AI 的 Prompt 模板化针对不同平台朋友圈、微博、小红书生成不同语气的文案。成本与性能考量AI API 调用是主要成本。可以通过设置内容长度上限max_tokens、缓存历史生成结果对于相似输入来优化。脚本本身资源消耗极低可部署在树莓派、旧电脑或免费的云函数如 AWS Lambda Google Cloud Functions上。代码可维护性将配置、数据读取、AI 处理、消息推送等模块进一步解耦便于独立测试和替换。例如可以定义一个AIClient抽象类和OpenAIClient、ClaudeClient等具体实现。使用配置文件如config.yaml来管理更复杂的设置而不仅仅是环境变量。7. 总结与延伸学习通过本文的实践我们成功搭建了一个连接个人知识管理工具Obsidian、AI 能力Codex CLI 理念和团队协作平台飞书的自动化桥梁。这个项目的价值不仅在于节省了复制粘贴的时间更在于它提供了一种“低代码”的自动化思维范式将重复、琐碎的工作流程化、脚本化并利用现有 API 和工具进行串联。你可以以此项目为起点探索更多可能性深入飞书开放平台学习使用飞书服务端 API实现更复杂的交互如读取飞书文档作为输入或将最终文案直接写入飞书多维表格进行排期管理。探索其他 AI 工具除了 OpenAI可以尝试接入 Claude API、国内的大模型 API 或开源的本地模型比较效果和成本。构建可视化界面使用 Flask 或 Streamlit 为这个脚本制作一个简单的 Web 界面方便非技术同事使用。集成到完整工作流将此脚本作为一环嵌入到使用 n8n、Zapier 或腾讯云 HiFlow 等可视化自动化工具构建的更大工作流中。技术服务于需求自动化解放创造力。希望这个实战案例能为你打开一扇窗让你看到用代码优化工作与生活的更多潜力。如果在实现过程中遇到任何问题欢迎在评论区交流探讨。