手把手教你把推特文章保存为 Markdown 格式 ✍ 得否🕐 2026-05-04📦 13.9 KB 🟢 已读 𝕏 文章列表 本文介绍了一套在 macOS 上将推特(X)长文批量保存为本地 Markdown 文件的完整方案。通过结合 gallery-dl 抓取工具、Python 脚本及 Cloudflare R2 图床,用户可以自动下载文章内容,并将图片上传至图床,最终生成排版整洁的 MD 文件存档于 Obsidian 中。文中提供了从安装依赖、导出 Cookies 到编写转换脚本的详细步骤。 MarkdowntwitterXObsidiangallery-dlPython图床数据备份教程 # 手把手教你把推特文章保存为 Markdown格式 **作者**: 得否 **日期**: 2026-05-04T01:11:11.000Z **来源**: [https://x.com/wangdefou/status/2051280285623627874](https://x.com/wangdefou/status/2051280285623627874) ---  我今天在写推特运营心法的时候,正刷着推找素材,看到乌云发帖提醒粉丝及时保存文章,他要删帖了。 突然想到我的收藏夹里躺着很多有用文章,还有我的内容素材。但是好像没有趁手的工具可以快速全部复制保存下来。于是我就发了一个推求助,结果得到了好多推友的回复,给了我很多建议。 > **得否@wangdefou**: [原文链接](https://x.com/wangdefou/status/2051107335893045358) > > 有没有那种,可以丢个推特长文链接,自动把文章保存为markdown的工具呀? > 如果没有的话,我就去vibecoding一个 我的原始需求是这样的: 可以根据推特文章的链接,随时随地批量快速地把原来的文章内容,以md格式,保存在我的电脑本地。 看上去很简单,但实际上还有一些隐藏的需求: 1、随时随地,就是要考虑脱离电脑,人不在电脑前的情况。 所以浏览器插件、通过网址转换的方式都不太符合需求了。 2、要保留原来的文章内容,包括文字和图片。 我试了几个工具,好多都没有保存图片的功能,有的也只是用原图片链接。 最后呢,我感觉还是自己用 Hermes agent 手搓出来的这个更符合我自己个性化的要求。 在telegram上发一个推特文章的链接给hermes,他就自动帮我把这个文章转换成md的格式,保留文章的排版格式,然后文章里如果有图片,则会先上传到我的图床,然后返回一个md格式的图片格式,插入到文章里。这样就不担心原博主删推了。   以下是具体的部署教程和我的设计思路,想要快速安装的,可以跳到文章最后去拿skills。 > 本教程适用于 macOS 系统。完成配置后,你可以用一行命令把任意 X(推特)长文抓取下来,自动转换成排版整洁的 Markdown 文件,图片自动上传图床,保存到本地,用 Obsidian 等工具永久存档。 ## 你需要准备什么 - 一台 Mac 电脑 - 一个已登录 X(推特)的 Chrome 浏览器 - 已安装 Python 3(macOS 自带,无需额外安装) - 已安装 Obsidian(或其他 Markdown 阅读器,可选) - 一个 Cloudflare R2 存储桶(用于图片图床,可选,没有则图片不会插入文章) ## 第一步:安装 gallery-dl gallery-dl 是一个开源的命令行下载工具,支持抓取 X 平台的长文(Articles)内容。 打开终端(Terminal),输入以下命令: ``` pip3 install gallery-dl ``` 安装完成后,验证一下是否安装成功: ``` /Users/你的用户名/Library/Python/3.9/bin/gallery-dl --version ``` > ⚠️ 注意:gallery-dl 安装后不在系统 PATH 里,所以不能直接输入 gallery-dl,必须用完整路径。你的完整路径是:/Users/你的用户名/Library/Python/3.9/bin/gallery-dl把「你的用户名」替换成你 Mac 的用户名。查看用户名的方法:打开终端,输入 whoami,回车即可看到。 如果看到版本号输出(如 gallery-dl 1.x.x),说明安装成功。 ## 第二步:安装 Python 依赖库 这两个库分别用于解析 HTML 和上传图片到图床。 ``` pip3 install beautifulsoup4 boto3 ``` ## 第三步:导出 X 平台的 Cookies X 平台的长文需要登录才能访问。gallery-dl 需要你的登录 Cookie 来模拟已登录状态。 3.1 安装 Chrome 插件 在 Chrome 浏览器中安装插件:Get cookies.txt LOCALLY - 打开 Chrome 网上应用店,搜索 "Get cookies.txt LOCALLY" - 点击「添加到 Chrome」安装 3.2 导出 Cookies 1. 在 Chrome 中打开 https://x.com,确保已登录你的账号 2. 点击右上角的插件图标(拼图形状),找到 "Get cookies.txt LOCALLY" 3. 点击插件,选择 "Export" 或 "Cookies for this tab" 4. 将文件保存到:/Users/你的用户名/Downloads/twitter_cookies.txt > ⚠️ Cookies 有有效期,一般几周到几个月。如果之后抓取失败,先重新导出 Cookies 再试。 ## 第四步:配置 Cloudflare R2 图床(可选) 如果你想让文章中的图片自动上传到图床并嵌入 Markdown,需要配置 Cloudflare R2。没有图床的话,图片文件会下载到本地但不会插入文章。 4.1 创建 Cloudflare R2 存储桶 1. 登录 Cloudflare 控制台 2. 左侧菜单进入 R2 Object Storage 3. 点击「Create bucket」,填写存储桶名称(如 my-images) 4. 创建完成后,进入存储桶设置,开启 Public Access(公开访问),记录下公开域名 4.2 获取 API 密钥 1. 在 Cloudflare 控制台右上角,进入 My Profile → API Tokens 2. 点击「Create Token」,选择 R2 Token 模板 3. 权限设置选择 Object Read & Write,指定你的存储桶 4. 创建后记录下以下信息(只显示一次,注意保存): Access Key ID Secret Access Key Endpoint URL(格式:https://<账号ID>.r2.cloudflarestorage.com) 4.3 记录你的 R2 配置信息 把以下信息填好备用,后面脚本里会用到: ``` BUCKET_NAME = "你的存储桶名称" ACCESS_KEY = "你的 Access Key ID" SECRET_KEY = "你的 Secret Access Key" ENDPOINT = "https://你的账号ID.r2.cloudflarestorage.com" PUBLIC_URL = "https://你的公开域名" # 存储桶的公开访问域名 ``` > 💡 图片会统一上传到存储桶下的 XArticle/ 文件夹,方便管理。 ## 第五步:创建保存文件夹 在终端中运行以下命令,创建两个文件夹: ``` mkdir -p ~/Desktop/twitter_articles mkdir -p ~/Desktop/推特文章备份 ``` - twitter_articles:gallery-dl 下载的原始 HTML 和图片文件存放位置 - 推特文章备份:转换后的 Markdown 文件存放位置 ## 第六步:抓取 X 长文 找到你想保存的 X 长文链接,格式通常是: ``` https://x.com/用户名/status/文章ID ``` 在终端运行以下命令(把链接替换成你要保存的文章链接): ``` /Users/你的用户名/Library/Python/3.9/bin/gallery-dl \ --cookies /Users/你的用户名/Downloads/twitter_cookies.txt \ -d ~/Desktop/twitter_articles \ "https://x.com/用户名/status/文章ID" ``` 抓取成功的输出示例: ``` /Users/你的用户名/Desktop/twitter_articles/twitter/用户名/文章ID_1.htm /Users/你的用户名/Desktop/twitter_articles/twitter/用户名/文章ID_2.jpg ``` 每篇文章会下载若干文件: - 文章ID_1.htm:文章正文(HTML 格式) - 文章ID_2.jpg、文章ID_3.jpg...:文章中的图片(有几张下几张) > 如果输出行前面有 #,表示文件已经存在、被跳过,属于正常情况。 一次抓取多篇文章: 重复执行上面的命令,每次换一个链接即可。 ## 第七步:转换为 Markdown 在桌面新建一个文件,命名为 convert.py,把以下代码完整复制进去: ``` from bs4 import BeautifulSoup from pathlib import Path import re, boto3 # ============ 配置区域(每次修改这里)============ # 你的 Mac 用户名 USERNAME = "你的用户名" # X 账号用户名(就是文章链接里 x.com/ 后面那个) X_USERNAME = "x平台用户名" # 要转换的文章:(文章ID, 原文链接) ARTICLES = [ ("文章ID1", "https://x.com/用户名/status/文章ID1"), ("文章ID2", "https://x.com/用户名/status/文章ID2"), # 继续添加... ] # ── R2 图床配置(没有图床则留空,图片将不会插入文章)── BUCKET_NAME = "你的存储桶名称" ACCESS_KEY = "你的 Access Key ID" SECRET_KEY = "你的 Secret Access Key" ENDPOINT = "https://你的账号ID.r2.cloudflarestorage.com" PUBLIC_URL = "https://你的公开域名" # ============ 以下不需要修改 ============ BASE_DIR = Path(f"/Users/{USERNAME}/Desktop/twitter_articles/twitter/{X_USERNAME}") OUTPUT_DIR = Path(f"/Users/{USERNAME}/Desktop/推特文章备份") OUTPUT_DIR.mkdir(parents=True, exist_ok=True) # 初始化 R2 客户端(配置为空则跳过图片上传) use_r2 = all([BUCKET_NAME, ACCESS_KEY, SECRET_KEY, ENDPOINT, PUBLIC_URL]) s3 = None if use_r2: s3 = boto3.client( "s3", endpoint_url=ENDPOINT, aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, region_name="auto", ) def html_to_markdown(html_path): with open(html_path, 'r', encoding='utf-8') as f: content = f.read() soup = BeautifulSoup(content, 'html.parser') title_tag = soup.find('title') title = title_tag.get_text().strip() if title_tag else "" body = soup.find('body') if not body: return title, "" # 把 h1/h2/h3 标题转成 Markdown 格式 for h in body.find_all(['h1', 'h2', 'h3']): level = int(h.name[1]) prefix = '#' * level text = h.get_text().strip() h.replace_with(f"\n\n{prefix} {text}\n\n") # 提取正文,保留段落分隔 raw = body.get_text(separator="\n\n") raw = re.sub(r'\n{3,}', '\n\n', raw) return title, raw.strip() for sid, url in ARTICLES: htm_path = BASE_DIR / f"{sid}_1.htm" if not htm_path.exists(): print(f"[跳过] {sid} - 文件不存在,请先用 gallery-dl 下载") continue title, md = html_to_markdown(htm_path) # 在标题后插入原文链接 lines = md.split('\n') md = lines[0] + '\n\n' + f'原文链接:{url}' + '\n\n' + '\n'.join(lines[2:]) # 上传图片到 R2 并追加到正文末尾 images = sorted(BASE_DIR.glob(f"{sid}_*.jpg")) if images and s3: md += "\n\n---\n\n" for img_path in images: r2_key = f"XArticle/{img_path.name}" s3.upload_file(str(img_path), BUCKET_NAME, r2_key, ExtraArgs={"ContentType": "image/jpeg"}) img_url = f"{PUBLIC_URL}/{r2_key}" md += f"\n\n" print(f" 📷 图片已上传:{img_url}") elif images and not s3: print(f" ⚠️ {len(images)} 张图片已下载到本地,但未配置图床,不会插入文章") safe_title = re.sub(r'[/\\:*?"<>|]', '', title)[:60].strip() filename = f"{safe_title or sid}.md" out_path = OUTPUT_DIR / filename with open(out_path, 'w', encoding='utf-8') as f: f.write(md) print(f"✅ 已保存:{filename}({len(md)} 字符,{len(images)} 张图片)") print(f"\n全部完成!文件保存在:{OUTPUT_DIR}") ``` 修改配置区域: - USERNAME:改成你的 Mac 用户名(用 whoami 命令查看) - X_USERNAME:填入 X 平台作者的用户名(就是链接里 x.com/ 后面那个) - ARTICLES:填入文章 ID 和对应链接 - R2 图床配置:填入第四步获取的信息;如果不需要图床,把五个值都留空字符串 "" 即可 运行脚本: ``` python3 ~/Desktop/convert.py ``` ## 第八步:用 Obsidian 打开查看 1. 打开 Obsidian 2. 选择「打开文件夹作为库」 3. 选择 ~/Desktop/推特文章备份 4. 即可看到所有已保存的文章,排版整洁,带标题层级和段落分隔,图片直接渲染 ## 最终效果 每篇保存的 Markdown 文件,格式如下: ``` # 文章标题 原文链接:https://x.com/用户名/status/文章ID 正文第一段内容... 正文第二段内容... ## 二级标题 ... ---   ``` ## 常见问题 Q:运行 gallery-dl 报错 "command not found" 不要直接输入 gallery-dl,必须用完整路径: ``` /Users/你的用户名/Library/Python/3.9/bin/gallery-dl ``` Q:抓取失败,提示登录或权限错误 Cookies 已过期。重新打开 Chrome,登录 x.com,用插件重新导出 Cookies,覆盖原文件,再试一次。 Q:转换后文章内容全挤在一行,没有段落 这是 HTML 解析方式不对导致的。确保使用本教程第七步的完整脚本,不要自己修改解析部分。 Q:图片没有插入文章 检查两点:①R2 配置信息是否填写正确;②图片文件是否存在(twitter_articles/twitter/用户名/ 目录下应有 .jpg 文件)。 Q:上传图片时报错 "InvalidAccessKeyId" Access Key ID 或 Secret Access Key 填写有误,回到 Cloudflare 控制台重新确认,注意 Secret Key 只在创建时显示一次。 Q:文件名乱码或保存失败 检查文章标题是否含有特殊字符(/ \ : * ? " < > |),脚本会自动过滤这些字符,一般不会出问题。 Q:Python 版本不是 3.9,路径不对 运行以下命令查看你的 Python 版本和 gallery-dl 实际路径: ``` python3 --version find ~/Library/Python -name "gallery-dl" 2>/dev/null ``` 把找到的路径替换到命令中即可。 最快捷的方式就是在你的 Hermes agent 或者 OpenClaw 里面安装,这个是skills地址: https://github.com/wangdefou-dev/twitter-article-to-markdown 最后了,给自己打个广告 从今天起,我将会陆续分享「文科生学AI用AI」的各种实操案例 如果你也是文科生,也想跟我一样,可以关注我的个人网站,一起交流学习! https://www.wangdefou.com/  ## 相关链接 - [@wangdefou](https://x.com/wangdefou) - [1.4K](https://x.com/wangdefou/status/2051280285623627874/analytics) - [13h](https://x.com/wangdefou/status/2051107335893045358) - [31K](https://x.com/wangdefou/status/2051107335893045358/analytics) - [https://x.com](https://x.com/) - [Cloudflare 控制台](https://dash.cloudflare.com/) - [convert.py](https://convert.py/) - [x.com/](https://x.com/) - [x.com](https://x.com/) - [https://github.com/wangdefou-dev/twitter-article-to-markdown](https://github.com/wangdefou-dev/twitter-article-to-markdown) - [https://www.wangdefou.com/](https://www.wangdefou.com/) - [8:38 PM · May 4, 2026](https://x.com/wangdefou/status/2051280285623627874) - [1,462 Views](https://x.com/wangdefou/status/2051280285623627874/analytics) - [View quotes](https://x.com/wangdefou/status/2051280285623627874/quotes) --- *导出时间: 2026/5/4 22:21:30*
一 一杯咖啡的时间学会 Obsidian:2026 年保姆级教程 这是一篇面向新手的 Obsidian 入门教程。文章介绍了 Obsidian 作为本地 Markdown 笔记软件的优势,包括易于搜索、双向链接、AI 友好及数据自主性。教程详细讲解了软件下载、库创建、界面布局(左中右三栏)、文件管理、工作区保存、文档属性(YAML)及基础 Markdown 写法,帮助用户快速搭建个人知识库。 技术 › 工具与效率 ✍ 苏乐🕐 2026-07-23 Obsidian笔记管理Markdown教程知识管理个人效率工具AI入门指南
本 本地 Markdown 转 X 长文:我开源了目前最顺手的方案 本文作者 kaitox 介绍了一款名为 Kaitox 的开源工具,旨在解决本地 Markdown 文章发布到 X (Twitter) 时格式丢失、图片需手动上传的痛点。该方案由本地 Relay、Chrome 插件及 CLI/Skill/Obsidian 插件组成,支持原生排版保留、封面自动设置及一键生成草稿,且完全免费开源。 技术 › 工具与效率 ✍ kaitox🕐 2026-07-10 MarkdownXChrome插件Obsidian开源工具自动化工作流Claude Code
6 60万人验证的超强免费组合!手把手教你用Claude Code + Obsidian打造个人AI知识库 本文详细介绍了如何利用本地笔记工具Obsidian与AI编程助手Claude Code搭建个人AI知识库。文章阐述了该组合在数据主权、AI原生体验及插件生态方面的三大优势,并提供了从基础环境安装、Claude.md规则配置到进阶插件推荐的全流程实操指南,助用户实现高效的本地化知识管理。 技术 › 工具与效率 ✍ Vincent|只上干货🕐 2026-04-07 Claude CodeObsidian知识管理AI工具效率提升教程配置指南插件推荐Markdown
U URL智能读取SKILL:一键抓取网页内容同步至Obsidian 文章介绍了一款自建的网页抓取神器,通过Firecrawl、Jina和Playwright三层策略,能一键抓取微信公众号、知乎等任意网站内容,自动下载图片并转存Markdown到Obsidian本地,解决了网页复制格式乱和外链失效问题。 技术 › 工具与效率 ✍ 老杨啊🕐 2026-02-06 ObsidianPython网页抓取Firecrawl自动化Markdown效率工具Playwright
I I got tired of being a human AGENTS.md 作者受够了每次与编码代理沟通时重复上下文,因此开发了AsterMem,一个本地运行的内存服务器。它将记忆存储为Markdown文件,支持离线运行,并自动提炼用户画像供代理读取。用户可完全控制和编辑记忆,避免黑盒问题。 技术 › Agent ✍ Asterove🕐 2026-07-29 Agent本地化隐私保护MarkdownCursorClaudePythonFastAPIReact开源
开 开源Obsidian公众号插件:排版半小时变1分钟,一键发布草稿 文章介绍了一款开源的Obsidian公众号插件,能将排版时间从半小时缩短至1分钟。该插件支持实时预览、7套精美主题一键切换、封面同步、多账号配置及一键发布到草稿箱等功能。作者全程使用Vibecoding与AI对话开发,未手写一行代码,目前插件已开源。 技术 › 工具与效率 ✍ 产品经理老王霸🕐 2026-07-29 Obsidian公众号插件排版开源VibecodingAI开发效率工具Markdown
用 用好 Obsidian Skill,让你的 WorkBuddy 对知识库的理解提升 80% 文章介绍了如何在 WorkBuddy 中安装 Obsidian skill,通过自动识别本地知识库、补充 CLI 能力及验证读写操作,实现对 Obsidian 知识库的高效管理。相比直接操作本地文件,使用 skill 能更好地理解双链结构和知识库逻辑。 技术 › Skill ✍ 阿蔺A-Lin🕐 2026-07-28 WorkBuddyObsidian知识库CLI教程工具笔记双链
C Claude + Obsidian,你数百条死笔记,瞬间变成帮你思考的第二大脑 本文介绍了一种结合 Claude 和 Obsidian 的知识管理方案,通过自动化提取、链接和归档,将死笔记转化为可交互的第二大脑,支持全文检索和引用,帮助知识复利增长。 技术 › 工具与效率 ✍ 老白(每日 AI 干货)🕐 2026-07-22 ClaudeObsidian知识管理第二大脑笔记MCP自动化LLMMarkdown效率
C Codex 对话没丢,只是被 model_provider 藏起来了:我vibe coding 了一个迁移工具 作者因 Codex 更新导致会话丢失,利用 AI 编程开发了一个迁移工具。文章分享了 AI 编程的分阶段执行方法,强调了备份、预览、数据校验和回滚等工程约束的重要性。作者认为 AI 编程的核心在于将模糊需求转化为可验证的工程流程,并提供了工具的开源链接和详细使用步骤。 技术 › Codex ✍ AFei Liang🕐 2026-07-21 AI编程vibe codingCodex会话迁移工具开发DevOpsPython工程流程数据备份
从 从 CoT 到 ReAct:用 Python 搭建 LLM Agent 实战指南 本文通过 Python 演示了如何搭建一个具备规划、工具调用、验证和复盘能力的完整 LLM Agent。教程详细拆解了 Plan-and-Solve、ReAct、Verification、Self-Refine 和 Reflexion 五个核心模块,强调了结构化数据控制流程的重要性,并提供了工程落地的具体代码实现与原则。 技术 › Agent ✍ Mr Panda🕐 2026-07-19 LLMAgentPythonReActCoT工程实践ReflexionPrompt Engineering教程
如 如何在6个月内成为代理AI工程师 本文提供了一个为期6个月的12阶段AI工程师学习路线图。文章首先阐述了代理工程师的核心是构建能自主决策的系统,而非编写固定逻辑。前两个阶段重点介绍了Python异步编程的基础(解决API调用阻塞问题)和LLM的基本原理(如上下文限制、成本控制和模型路由)。随后详细讲解了工具调用与结构化输出的实现方法,强调使用Pydantic验证数据及构建可恢复的Agent循环。 技术 › Agent ✍ Rahul🕐 2026-07-12 AIAgentLLMPython异步编程教程职业发展工具调用Pydantic学习路线
K Karpathy 同款知识大脑搭建指南:从原理到实现 本文详细解读了 Karpathy 提出的基于 LLM 的个人知识库管理方案 'llm-wiki'。文章核心在于将传统的 RAG 检索模式转变为 '编译' 模式:人负责收集原始资料,LLM 负责将资料编译成互相链接的维基页面。文中深入剖析了系统的三层架构、Schema 设计的重要性,并提供了从 0 到 1 的动手搭建指南及进阶的 '防坑' 建议,旨在帮助读者构建一个具备持续复利能力的个人知识库。 技术 › LLM ✍ Kyrie🕐 2026-07-09 LLM知识库ObsidianKarpathy个人成长教程AI工具Claude