半小时把 X 输入/输出工作流搭起来:Codex 真香用法 😄
你是不是也遇到过这种情况:
- 想做一个 X(Twitter)的工作流:输入信息 → 处理 → 输出发布
- 结果各种方案又绕又重:要接一堆工具、写一堆胶水代码、还怕账号出事
- 折腾两天,发现离“直接能用”还差很远
我这篇就按“能照做”为标准,给你一条简单路线:用 Codex 把流程搭起来,并且把最容易翻车的点提前避掉。
目标:做一个“可落地”的 X 内容工作流:
- 输入:关键词/链接/一段素材(来自文件、Notion、RSS、Google Sheet 都行)
- 处理:清洗 + 摘要 + 改写成适合 X 的短内容 + 加标签
- 输出:发到 X,或更稳一点——先保存到草稿/队列
你要准备的东西
别整复杂,准备这几样就能开跑:
- 一个 OpenAI / Codex 可用的环境(你平时用的 Codex/IDE/CLI 都行)
- X 的开发者权限(至少能拿到 API Key / Access Token)
- 本地运行环境:Python 或 Node 二选一(示例用 Python)
如果你只想“先跑通”,建议你把输出从“直接发推”改成“写入草稿文件”,跑稳了再切到发布。
工作流长什么样(脑子里先有图)
把流程拆成 4 个模块,你会非常舒服:
- Input(输入):读入你的素材(文本/链接/表格)
- Transform(处理):让模型生成“X 可发”的内容
- Policy(安全层):做长度、敏感词、重复度、频率控制
- Output(输出):发推 / 入库 / 进队列
你要做的不是“做个大而全系统”,而是把这 4 块串起来,先让它稳定跑起来。
用 Codex 的正确姿势:把需求写清楚,让它一次出可维护的代码
很多人用 Codex 卡住的原因是:
- 只说“帮我写个发 X 的脚本”
- 没说清楚输入是什么、输出长什么样、失败怎么办
你直接把下面这段“需求模板”丢给 Codex,然后让它生成项目结构:
✅ 需求模板(复制就能用)
我要一个 Python 项目,用来做 X(Twitter) 的内容工作流。
功能:
- 输入:从 input.txt 读取多行素材,每行一条
- 处理:对每条素材生成 1 条适合 X 的中文短内容
- 风格:口语、信息密度高、别像营销号
- 长度:不超过 240 字
- 结构:一句结论 + 2~3 个要点 + 1 个行动建议
- 允许 1~2 个 emoji,但别每句都加
- 安全层:
- 如果生成内容重复度高(和最近 20 条输出相似),就重写
- 如果太长,自动压缩
- 输出:
- 默认写入 outbox.jsonl(每行一个 JSON,含原始素材、生成内容、时间戳)
- 可选:通过 X API 发布(用环境变量开关)
工程要求:
- 有清晰的目录结构
- 关键参数用 .env 管理
- 有日志 log.txt
- 失败要重试(指数退避),但别无限重试
请直接给出完整代码和运行方式。
这段模板的核心是:输入/输出格式讲清楚 + 失败处理讲清楚 + 安全层讲清楚。
参考项目结构(你就照这个放)
Codex 生成后,你可以对照一下结构,尽量长这样:
x-workflow/
src/
main.py
generator.py
policy.py
x_client.py
storage.py
input.txt
outbox.jsonl
.env.example
requirements.txt
README.md
log.txt
模块拆开有啥好处?
- 你哪天想把输入从 input.txt 换成 Google Sheet,不会牵一发动全身
- 你想把输出从“发推”换成“进草稿箱”,也只是换 Output
关键代码怎么写(给你一份可跑的骨架)
下面是一套“够用、清晰、方便扩展”的示例骨架。你可以让 Codex 直接按这个思路生成完整版本。
1)生成器:把素材变成 X 文案
# src/generator.py
from openai import OpenAI
client = OpenAI()
SYSTEM = """你是一个写作助手,擅长把素材改写成适合 X 发布的中文短内容。
要求:口语化、信息密度高、别像广告。输出不超过240字。"""
def gen_post(text: str) -> str:
prompt = f"""素材:{text}
请输出:一句结论 + 2~3 个要点 + 1 个行动建议。允许1~2个emoji。
只输出正文,不要标题。"""
resp = client.responses.create(
model="gpt-4.1-mini",
input=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": prompt},
],
temperature=0.7,
)
return resp.output_text.strip()
模型你可以换成你账号里更顺手的。重点是:结构约束 + 长度约束写死。
2)安全层:长度、相似度、重写策略
你不加安全层,最常见的结果是:
- 发出去才发现超长
- 连发几条风格一模一样,被人一眼看穿“自动化”
# src/policy.py
import difflib
def too_long(text: str, limit: int = 240) -> bool:
return len(text) > limit
def similarity(a: str, b: str) -> float:
return difflib.SequenceMatcher(None, a, b).ratio()
def too_similar(candidate: str, history: list[str], threshold: float = 0.85) -> bool:
return any(similarity(candidate, h) >= threshold for h in history)
相似度这块不用一上来就上向量库。你要的是“半小时能跑通”。
3)输出:先写队列,再决定发不发
# src/storage.py
import json
import time
def write_outbox(path: str, raw: str, post: str):
row = {
"ts": int(time.time()),
"raw": raw,
"post": post,
}
with open(path, "a", encoding="utf-8") as f:
f.write(json.dumps(row, ensure_ascii=False) + "\n")
强烈建议你一开始就用 outbox.jsonl。你会感谢自己:
- 回溯方便
- 出问题能定位
- 做二次处理也方便(比如挑选、审核、批量发布)
运行方式(你照着敲就行)
1)安装依赖
pip install -r requirements.txt
2)准备 .env
OPENAI_API_KEY=你的key
X_API_KEY=...
X_API_SECRET=...
X_ACCESS_TOKEN=...
X_ACCESS_SECRET=...
PUBLISH_TO_X=false
3)把素材放进 input.txt,一行一条。
4)运行
python -m src.main
跑完你会在 outbox.jsonl 看到输出。
想发布就把 PUBLISH_TO_X=true,然后再跑一遍(更稳的做法是“只发布 outbox 里审核通过的记录”)。
一个真实场景:把“看过的文章链接”变成每天 1 条输出
你每天收藏一堆链接,永远没时间整理?
改成这个节奏:
- 晚上把链接丢进
input.txt - 脚本跑完生成 3~5 条备选
- 你挑一条手动发,或者进定时队列
效果很直接:输出稳定了,人也不累。
避坑清单(不想翻车就看这个)
- 别上来就全自动发推:先 outbox,确认内容没问题再发布。
- 发推频率要克制:新号/弱号别搞高频。间隔拉开点。
- 同模板狂刷很明显:安全层做相似度检测,必要时重写。
- 把敏感内容挡在门外:你可以加一层简单的关键词过滤,宁可漏掉也别硬发。
- 日志必须有:出一次问题你就知道为什么我这么说。
- 不要把密钥写进代码:全部进
.env,提交代码前检查一遍。
你可以怎么继续升级
跑通后再加这些,会越用越顺:
- 输入换成 Notion/Google Sheet/RSS
- outbox 加一个
status字段:draft / approved / posted - 做一个“人工审核”小页面(哪怕是个最简单的本地 HTML)
- 多账号分发:同一条内容自动生成 2 个版本,分别发不同账号
一句话收尾
这类工作流别追求“完美系统”。追求“今晚能跑,明天还能跑”。
Codex 真正好用的地方,就是你把需求写清楚,它能把你从一堆琐碎的工程活里拎出来。剩下的时间,拿去做更值钱的:选题、判断、表达。