{"id":"qiaomu-x-article-publisher","name":"x-article-publisher","summary":"適切なフォーマットでX(Twitter)記事エディターにMarkdown記事を公開してください。ユーザーがX記事にMarkdownファイルやURLを公開したい場合や、「Xに公開」「Twitterに記事を投稿する」「X記事」、またはXプレミアム記事の公開に関するサポートが必要な場合に使います。","body":"# X Article Publisher\n\nPublish Markdown content to X (Twitter) Articles editor, preserving formatting with rich text conversion.\n\n## Prerequisites\n\n- X Premium Plus subscription\n- Python 3.9+ with dependencies: `pip install Pillow pyobjc-framework-Cocoa patchright`\n\n## 🎉 首次使用：一次认证，告别重复登录\n\n**X Article Publisher 现在支持持久化认证，无需每次手动登录！**\n\n### 🔧 初始化认证（仅需一次）\n\n首次使用前，运行认证设置：\n\n```bash\ncd ~/.claude/skills/x-article-publisher/scripts\npython auth_manager.py setup\n```\n\n**流程：**\n1. ✅ 浏览器窗口自动打开 X 登录页面\n2. 🔐 手动登录你的 X 账号（需 Premium+ 订阅）\n3. ✅ 完成 2FA 验证（如已启用）\n4. 🏠 登录成功后自动跳转到 Home 时间线\n5. 💾 认证状态自动保存（有效期 7 天）\n\n### 📋 认证管理命令\n\n```bash\n# 检查认证状态\npython auth_manager.py status\n\n# 验证认证是否有效\npython auth_manager.py validate\n\n# 清除认证数据（需重新登录）\npython auth_manager.py clear\n\n# 重新认证（清除 + 设置）\npython auth_manager.py reauth\n```\n\n### 🚀 自动化工作流\n\n认证设置完成后，skill 执行时会自动：\n1. ✅ 检查认证状态\n2. 🔓 如已认证，直接使用保存的浏览器状态（无需登录）\n3. ⚠️ 如未认证，提示运行 `auth_manager.py setup`\n\n**注意**：认证数据存储在 `~/.claude/skills/x-article-publisher/data/browser_state/`，已通过 .gitignore 排除，不会提交到 Git。\n\n---\n\n## Scripts\n\nLocated in `~/.claude/skills/x-article-publisher/scripts/`:\n\n### publish_article.py (主脚本 - 一键发布)\n**推荐使用** - 自动完成所有发布步骤：\n```bash\n# 基本用法（默认显示浏览器）\npython publish_article.py --file article.md\n\n# 隐藏浏览器（后台运行）\npython publish_article.py --file article.md --headless\n\n# 自定义标题\npython publish_article.py --file article.md --title \"自定义标题\"\n```\n\n### parse_markdown.py\nParse Markdown and extract structured data:\n```bash\npython parse_markdown.py <markdown_file> [--output json|html] [--html-only]\n```\nReturns JSON with: title, cover_image, content_images (with block_index for positioning), html, total_blocks\n\n### copy_to_clipboard.py\nCopy image or HTML to system clipboard:\n```bash\n# Copy image (with optional compression)\npython copy_to_clipboard.py image /path/to/image.jpg [--quality 80]\n\n# Copy HTML for rich text paste\npython copy_to_clipboard.py html --file /path/to/content.html\n```\n\n## Workflow (简化版)\n\n**前提**：已完成认证设置（`python auth_manager.py setup`）\n\n### 🚀 一键发布（推荐）\n\n直接运行 publish_article.py，自动完成所有步骤：\n\n```bash\ncd ~/.claude/skills/x-article-publisher/scripts\npython publish_article.py --file /path/to/article.md\n```\n\n脚本会自动：\n1. ✅ 检查认证状态\n2. 📄 解析 Markdown 文件\n3. 🌐 启动已认证的浏览器\n4. 📍 导航到 X Articles 编辑器\n5. 🔘 点击 create 按钮\n6. 🖼️ 上传封面图（如有）\n7. 📝 填写标题\n8. 📋 粘贴 HTML 内容\n9. ✅ 保存草稿（**不会自动发布**）\n\n### 手动工作流（高级用户）\n\n如需更精细控制，可分步执行：\n1. Parse Markdown: `python parse_markdown.py article.md`\n2. 手动操作浏览器发布\n\n---\n\n## 🧠 智能增强功能\n\n### 智能标题生成\n\n当文章没有 H1 标题时，`parse_markdown.py` 会返回 `needs_title_generation: true`。\n\n**Claude 应该自动：**\n1. 阅读文章内容，理解核心观点\n2. 生成一个吸引人点击的标题（15-25字为佳）\n3. 使用 `--title \"生成的标题\"` 参数发布\n\n**好标题的特点：**\n- 包含数字或具体细节（\"3个方法\"、\"90%的人不知道\"）\n- 激发好奇心（\"为什么...\"、\"如何...\"、\"...的真相\"）\n- 与读者切身相关\n- 避免标题党，但要有吸引力\n\n**示例：**\n```bash\n# 解析文章\npython parse_markdown.py article.md\n\n# 如果 needs_title_generation: true，Claude 生成标题后：\npython publish_article.py --file article.md --title \"AI时代，普通人的3个生存法则\"\n```\n\n### 智能封面图生成\n\n当文章没有封面图时，`parse_markdown.py` 会返回 `needs_cover_generation: true`。\n\n**Claude 应该自动：**\n1. 阅读文章，提炼核心概念（1-3个关键词）\n2. 调用 `gemini-image-generator` 或 `jimeng-image-generator` skill 生成封面图\n3. 封面图风格建议：\n   - 简洁大气，避免复杂细节\n   - 可以是抽象概念的可视化\n   - 或是带有核心关键词的文字海报\n4. 将生成的图片路径插入到文章开头作为封面\n\n**封面图生成提示词模板：**\n```\n为一篇关于「{文章主题}」的文章生成封面图。\n风格：简洁、现代、科技感\n元素：{1-3个核心视觉元素}\n文字：可选，如果加文字只放{1-3个关键词}\n尺寸：16:9 横版\n```\n\n**工作流示例：**\n```bash\n# 1. 解析文章\npython parse_markdown.py article.md\n# 输出: needs_cover_generation: true\n\n# 2. Claude 调用生图 skill 生成封面（假设保存到 /tmp/cover.png）\n\n# 3. 将封面图插入文章开头，或手动上传\n```\n\n**注意**：封面图上传目前需要在浏览器中手动操作，脚本会打开编辑器后等待用户操作。\n\n---\n\n## 技术细节\n\n### parse_markdown.py 输出格式\n\n```json\n{\n  \"title\": \"Article Title\",\n  \"title_source\": \"h1\",           // \"h1\", \"h2\", \"first_line\", or \"none\"\n  \"needs_title_generation\": false, // true if no H1 title\n  \"cover_image\": \"/path/to/first-image.jpg\",\n  \"needs_cover_generation\": false, // true if no cover image\n  \"content_images\": [\n    {\"path\": \"/path/to/img2.jpg\", \"block_index\": 5}\n  ],\n  \"html\": \"<p>Content...</p><h2>Section</h2>...\",\n  \"total_blocks\": 45\n}\n```\n\n**字段说明：**\n- `title_source`: 标题来源\n  - `h1`: 来自 H1 标题（最理想）\n  - `h2`: 来自第一个 H2 标题\n  - `first_line`: 来自第一行文本\n  - `none`: 无法提取标题\n- `needs_title_generation`: 是否需要 Claude 生成更好的标题\n- `needs_cover_generation`: 是否需要 Claude 生成封面图\n\n## Critical Rules\n\n1. **NEVER auto-publish** - Only save as draft\n2. **NO automatic cover images** - User adds cover manually, never insert first image as cover\n3. **Clean placeholders** - Remove all remaining `@@@IMG_X@@@` markers after image insertion\n4. **H1 title handling** - H1 is used as title only, not included in body\n\n## Supported Formatting\n\n- H2 headers (## )\n- Blockquotes (> )\n- Code blocks (converted to blockquotes)\n- Bold text (**)\n- Hyperlinks ([text](url))\n- Ordered/Unordered lists\n- Paragraphs\n\n## Example\n\nUser: \"Publish /path/to/article.md to X\"\n\n```bash\ncd ~/.claude/skills/x-article-publisher/scripts\npython publish_article.py --file /path/to/article.md\n```\n\nOutput:\n```\n📄 解析文件：/path/to/article.md\n  📝 标题：文章标题\n  🖼️  封面图：/path/to/cover.jpg\n  📷 内容图：2 张\n\n🌐 启动浏览器...\n  📍 导航到 X Articles...\n  🔘 点击 create 按钮...\n  📝 填写标题...\n  📋 粘贴内容...\n\n✅ 草稿已创建！\n  💡 请在浏览器中检查并手动发布\n  🖥️  浏览器保持打开，请检查草稿并手动发布\n  ⏎  完成后按回车键关闭浏览器...\n```\n\n\n\n**技术经验参考**: 浏览器自动化调试技巧详见 [skill-development-guide](../skill-development-guide/technical-lessons.md)","author":"@anbeime","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/anbeime/skill/tree/main/skills/qiaomu-x-article-publisher","license":"MIT","category":"writing","lang":"en","tokens":2034,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"CHANGELOG.md","size":1574,"sha256":"ea93c330858396793a7d75cb7a20435f9e34ce08ba9a719ba639cdb58d10a67b"},{"path":"data/browser_state/.gitkeep","size":53,"sha256":"8ce257903f4276d19a733a28e7ef7254b34b4480f694ca2fbca108b330729114"},{"path":"data/.gitignore","size":701,"sha256":"9fa058cb2337f5b85390fa6da5d4004cdd7470129965fcb840bc9b47ce3f1d68"},{"path":"data/.gitkeep","size":0,"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"path":".gitignore","size":736,"sha256":"3eefcc63bb3e5a215e66faa3ea2e58ee2258e43217a68922af62fd57b96f16c5"},{"path":"LICENSE","size":1072,"sha256":"bdeb396b387fc1a86b008a367bb69a439a371beeec414cd42f015778f7297d9c"},{"path":"metadata.json","size":702,"sha256":"18eaef936ac0c6de3128e475e188795b1f67d84754f6db142085baaadc662e4c"},{"path":"README.md","size":4885,"sha256":"105b960df25c8783402af5f644c5c9f907e0a2f286fce8740c7e3c6204a6583b"},{"path":"scripts/auth_manager.py","size":9153,"sha256":"cedc78cd6ba0f63e6dd93b9e60970c6dcf3500c327707920867b5c1386549f84"},{"path":"scripts/copy_to_clipboard.py","size":6185,"sha256":"9a45a2996179910e09cce619cbb761624ddb87997112ce3c06dad8ae2cacd152"},{"path":"scripts/debug_editor.py","size":5065,"sha256":"d3159eb5b1e8d91db2087664b4f9c8be69433c826df889c3ee77c51408c594c9"},{"path":"scripts/debug_page.py","size":2367,"sha256":"e06216bf005f3963f377f6a658b441bc4554e2a4955a816768649a6fc8d63130"},{"path":"scripts/parse_markdown.py","size":22398,"sha256":"ca5ddb07cea4e8c9e4fe1b0f323509d06233f80585c6c515175ebfbba678c602"},{"path":"scripts/publish_article.py","size":42100,"sha256":"0420e9ba83e01c3d2c2dee79fd5d45d3f59a54cd4686a3db17b160b3ee7130e8"},{"path":"scripts/site_config.py","size":1743,"sha256":"88c391dd01680a44357fbafed1c2c13321ad8095561e421a6d1826dee0c48e9d"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[{"code":"net.endpoints","kind":"exfiltration","excerpt":"img.shields.io, keepachangelog.com, mp.weixin.qq.com, qiaomu.ai, x.com","message":"bundled scripts reach 5 external host(s)","severity":"warn"}],"scannedAt":"2026-08-22","hasScripts":true,"networkEndpoints":["img.shields.io","keepachangelog.com","mp.weixin.qq.com","qiaomu.ai","x.com"]}}