糖果怪物
59.65M · 2026-03-05
每次写完技术文章,手动发布到掘金总是让人头疼 —— 复制标题、粘贴正文、选分类、加标签、上传封面……重复劳动,能省就省。
于是我花了半天写了一个自动化发布工具,用 Python + Playwright 模拟浏览器操作,把整个发布流程跑通了。
直接调用掘金官方 API 发布文章?理论上可行,但掘金没有公开的写作 API,逆向内部接口风险高、不稳定。
更靠谱的方案是 浏览器自动化 —— 用 Playwright 驱动真实浏览器,模拟用户的每一步操作:点击按钮、粘贴内容、选标签、点发布。
这样的好处是:
| 工具 | 作用 |
|---|---|
| Playwright | 浏览器自动化(替代 Selenium,更现代) |
| pyperclip | 系统剪贴板操作 |
| PyYAML | 解析 Markdown front matter |
| requests | 下载封面图片 |
选 Playwright 而不是 Selenium 的原因:
掘金的文章编辑器用的是 CodeMirror,这是个富文本编辑器,它的特点是 HTML 内容随输入动态变化。
所以你不能用 element.fill() 或 send_keys() 直接输入文章内容 —— 内容不会进到编辑器里。
正确做法是用 系统剪贴板粘贴:
import pyperclip
import sys
# 把内容复制到剪贴板
pyperclip.copy(file_content)
# 点击编辑区域
content_element = page.locator('//div[@class="CodeMirror-code"]//span[@role="presentation"]')
content_element.click()
# 模拟 Ctrl+V 粘贴
if sys.platform == 'darwin':
page.keyboard.press('Meta+v')
else:
page.keyboard.press('Control+v')
粘贴后,掘金会自动解析 Markdown 并重新上传其中的图片。这个过程需要时间,建议 time.sleep(15) 等待图片上传完成。
Playwright 的 storage_state 功能可以把浏览器的 cookie 和 localStorage 一起保存到本地 JSON 文件,下次启动时直接加载:
# 保存登录状态
storage = context.storage_state()
with open('storage/juejin_storage.json', 'w') as f:
json.dump(storage, f)
# 下次启动时复用
context = browser.new_context(
storage_state='storage/juejin_storage.json'
)
这样只需要手动登录一次,之后每次发布都自动复用登录态,无需重复扫码。
文章用 YAML front matter 格式管理元数据:
---
title: 文章标题
description: 文章摘要
image:
tags:
- Python
- 自动化
---
# 正文开始
解析代码:
import re
import yaml
def parse_front_matter(content: str) -> dict:
match = re.match(r'^---s*n(.*?)n---s*n', content, re.DOTALL)
if match:
return yaml.safe_load(match.group(1)) or {}
return {}
封面图片从 image 字段读取,先下载到本地,再通过 file input 上传:
file_input = page.locator("//input[@type='file']")
file_input.set_input_files(local_image_path)
整个发布流程按顺序:
.send-button//input[@placeholder="输入文章标题..."]Ctrl+V第一步:安装依赖
pip install playwright pyyaml pyperclip requests
playwright install chromium
第二步:登录(只需一次)
python3 login.py juejin
浏览器会打开掘金,扫码登录后按 Enter,cookie 自动保存。
第三步:发布文章
# 不自动发布,人工 review
python3 publish.py --platform juejin --content article.md --no-publish
# 全自动发布
python3 publish.py --platform juejin --content article.md
整个架构设计上很容易扩展新平台:
publisher/
├── juejin_publisher.py 稀土掘金
├── zhihu_publisher.py 知乎(TODO)
└── csdn_publisher.py CSDN(TODO)
每个平台只需实现一个 xxx_publisher(page, content_file) 函数,主流程自动调用。后续会陆续补上知乎和 CSDN 的支持。
用 Playwright 自动化发布博客的核心就两点:
比 Selenium 更轻量,比逆向 API 更稳定。如果你也在多个平台同步发布文章,不妨试试这个思路。
项目地址稍后整理后会放出,欢迎 star ⭐