缘起--为什么选择readwise
对于剪藏的文章再批注,一直是我的一个困惑。很多文章并不是只读一遍,但摘录无法汇总,无法对摘录再次批注成了一个头疼的问题。我之前的主力稍后阅读软件是慢读,慢读对国内APP的剪藏的非常好,但是对于分享和再次摘录,再次批注却不怎么行。它是一个纯粹的阅读软件,但不适合作为精读文章和批注使用。
因此我转到了readwise上,readwise有几个优势:首先它可以首先它极致的简单,只有摘录标签和评论甚至摘录的颜色也只有一个,让我们能极大程度的专注文本;其次,它可以分享公开链接,把我们的阅读摘录,阅读感悟分享给别人。也能导入我们知识库,并通过这个链接回链到readwise里面继续摘录和批注,对于打通流程是很关键的;第三个是它可以很好的把这些高亮和批注分门别类的导出,这样我们不仅有了自己的阅读库,而且还可以在阅读库上自由的修改修建。
迁移之难
说完了readwise的优点,我们来提一下它的缺点。不得不说,国内的APP确实十分封闭,以至于很多微信公众号知乎文章是无法被readwise剪藏的,因此一个专注国内文章的剪藏软件是不可或缺的。而这也就成了我们一直以来的一个老大难问题,流程如何打通,迁移如此困难的情况下我们是否还需要去做,它节省的成本是否比得上迁移的精力投入呢?因为,当一个流程彼此的节点流转变得困难的时候,那么它就不是一个好的流程,也意味着它不能持续执行。这也是为什么好多人即使印象笔记已经不满足他的需求,却难以迁移,面对数十年的笔记,只能像被麻匪劫持了人质一样,忍气吞声。
我初始的思路是昨日种种昨日死,今日种种今日生,把之前的笔记文章全部都抛弃,从新的开始,这也是一种妥协。但是随着AI的发展,要想打造属于个人的GPT我们就要有自己的context,而这些数据非常关键。在超算的加持下,我们每个人能接触的智能算力都很接近,我们不是算力不足,而是算力过剩了,我们唯一能做的就是尽量的积累属于自己的context,靠不断的努力在时间轴上积累存量来形成优势,这也是我无法割舍过去4年甚至十年的积累,因此迁移成了一个必须解决的问题。
我是一个设计工程师,我认为设计和研发的区别就在于设计总是去利用现有的东西去组建一套流程,然后批量的生产去解决问题。而研发总是能创造新的工具,不再妥协。
因此,我刚开始的方案就是如何使用现有的工具去解决问题。首先,readwise reader(readwise的阅读器)它是支持PDF和epub格式的,而我之前积累的文章主要格式是markdown。在我向群友咨询后,给我的建议也是转换文档格式,然后我就分别把它们转换成epub和PDF,并导入进去,导入的过程也比较成功,但是却失去了很多功能,比如排版调节,比如分享公开链接,比如形成回链。这失去了我使用readwise reader的意义。
在和AI深度交流后,它给我的建议也是妥协。建议我不要为了不重要的文章而去更改流程,要去降低流程的困难。把所有的文章全都转换成PDF,只把重要的文章单独上传到一个云服务器或者其他平台,再用readwise剪藏,以实现轻重缓急之分。我本来是接受了这个打算。直到昨天晚上去试着使用了一下API决定创造一个工具,去实现这个目的,因此在AI的帮助下,我完成了python脚本,并使用python成功的调用了API接口,把我的所有markdown文件直接导入到readwise reader里面,实现了和剪藏一样的功能。这也是我写这篇文章的原因,想把这种思路和如何用AI完成写下来,这也是我的一个重要跨越,从搭建流程忍受能力不够带来的妥协到试着使用AI增幅自己的能力,去创造一个新的工具,从搭建流程到创造工具的转变。
批量转换为PDF和epbu
我大概知道要转换文档需要使用pandoc这个软件,但是如何批量转换,怎样具体实现,我却没有思路。而且因为我编程基础非常差,唯一有的训练也只是大一的时候简单学了一下C语言,甚至连指针都没有学到,电脑上安装的python也是4年前的版本,已经4年没有使用,所以我对编程这方面有自然的恐惧。我在实现思路的时候,就想尽量的避免使用python这类软件。因此我去搜索资料找到的方法是使用命令行加bat指令去调动。然后我去下载了,对应的代码建立了对应的bat文件,里面有很多报错,我把报错复制下来给了AI(我使用的是Gemini3pro),然后AI帮我分析原因,告诉我是没有安装对应的软件,并给了我latex和wkhtmltopdf两个软件的选择,我按照它的选择,又重新安装软件,并让他给我写了bat代码,最终实现了转换。
这个过程中最有借鉴和分享的就是我们把所有的步骤全部交给AI,并开启联网搜索,把我们写的bat代码以及报错原因全部交给AI,它会给你建议,然后你从中选择适合你的方法。在此之后,把它的代码复制过去,再次执行,再次把反馈给他。这个过程我花了一个小时,终于实现了转换。
readwise reade单次只能上传50个文件,但我的文件总共有825个。一个个上传显然不符合逻辑,也很困难。因为我很难记住我上传到了哪边,于是我就让AI给我写了一个bat指令,让他把PDF按照50个为一个单位,分别以上传一上传二命名。最后他给我生成了一个bat指令,我只用双击这个指令,就自动的把文件夹进行分类。而我只需要每次上传上传一上传二就能保证不会被遗漏,也不会有错误。
以下是用AI创建bat的演示:
如何利用API导入
群友之所以没有给我这个建议,是因为我不是开发者,也没有程序员背景,所以他们自然的忽视了API这个用法,而这对于个人编程能力确实有一定要求。我在半年前就想利用纸间书摘API去实现把我之前的读书摘录和批注导入,却因为能力而不得不放弃,确实对于没有编程能力的人很不友好。
因此今天这次能成功,完全得益于我最近一年的一个理念:任何一件事情一个工具的使用,先去莽个一个小时,确定目标和重难点;对于复杂的原理,先学个10个小时,看是否能掌握,是否需要拆解成简单的问题,以及如何去学习;对于重要的技能先投入100个小时去刻意练习,在完成前绝不放弃,绝不认为是自己的能力有问题。这种锻炼出来的执行能力,在很大程度上解决了我的内耗和困惑,也得以把自己的敏感投入到工作学习,在做事上可以敏锐发现问题和迭代。内耗和执行在此达成了和谐的统一。
因此我就开始尝试是否真的能使用AI去解决这个问题。我先把readwise reade关于AI调用的说明文档剪藏下来,转换成markdown文档。然后把这个文档扔给了AI告诉他,如果我想把markdown导入的readwise reade里面是否有方法实现,如果可以的话,你把步骤告诉我AI告诉我。ai的回复是可以使用python进行导入,然后我就让他给我写了一个脚本,并按照他的要求去执行。
这个过程中,当然遇到了很多问题。比如我的python包是4年前的因此有很多有些库需要更新,我按照他给我的链接去更新后发现一堆报错,我尝试了4次,把这些记录分别发给它,它告诉我,是因为网络的原因,它甚至贴心的给了我一个强制导向清华大学的镜像网站去下载python库的升级包。在更换网络和使用这个地址之后,成功的更新了python。然后就是各种其他的问题,比如导入失败。比如如何批量导入,我完全按照它的要求去,创建文件夹把文件归属对应文件夹,但是依旧会有无法识别的风险,我们接下来只用做的就是把报错复制粘贴给它,它会给你新的方案,然后你去尝试执行并反馈,仅此而已,大概一个小时过后,825个文件全部顺利传入的readwise reade上面。
纸间书摘的API调用也是一样。我把纸间书摘的API说明文档给剪藏下来,然后同样扔给AI,并让它给我写出一个导入文档模板。我把这个模板单独发给AI,并把我之前的书籍摘录和批注以word形式给扔给他,让他按照模板的形式重新给我写一份markdown。最后我按照AI的要求去建立文件夹去写python脚本,去把自己的笔记转化成mark down格式,然后去上传,上传失败了一次。因为我使用的是过酒店的公共wifi,公共wifi好像难以满足纸间书摘对同一个wifi下的需求。因此,我开手机热点,重新上传更换了API地址,成功上传。
这次尝试是一个跨越,是我第一次尝试并成功的创造工具,我一直觉得很多人软件学不会,是因为从来没有真正学会过一个软件,真正学会一个东西,将会是一个巨大的提升。大部分技能都会基于这个技能而产生延展和扩展。因此,从0到1是一个核心的东西,成功是成功之母。从此之后阅读彻底打通,不在是一个个孤岛,国内文章使用慢读剪藏并初步阅读,筛选精品并导出markdown故式,通过python脚本导入的readwise reade里面精读。书籍的摘录和批注可以使用微信读书或者其他软件导入的纸间书摘里面,他们都能作为一个中转,最后全部通过同步软件同步的obsidian里面,形成个人的阅读库。
这个阅读库将全面接入AI后续会使用claude进行整体分析或者其他方式整体分析。阅读不再形成孤岛,里面的摘录和批注都附带回链,等我想添加的时候,还能再跳转,重新添加内容,之后我每一个摘录批注,都能很好的融入我的阅读库里面,形成我的知识库,这样的话我就有一种安心感,虽然我读的慢,但我每一份东西都会有积累,都会形成我的知识库。当我能感受到我的每一滴努力都会被存储,每一份付出都会被合理的归档,我的努力将在时间轴上形成存量并形成我独有的context,这将是我面对AI时代最大的助力,也是最大的依靠。是我将为我的证明,而不是把AI变成自己的主人。
ai写API脚本试例--脱敏后的提问过程
好的,这个想法非常棒。保留“踩坑”和“排错”的过程往往比直接给一个最终代码更有价值,因为别人在操作时很可能遇到同样的环境问题(比如 Python 安装、网络报错、路径不对、中文文件名报错等)。
下面我为你整理了一份脱敏后的、保留完整对话逻辑的 Markdown 文档。
我做了以下处理:
-
隐私脱敏:将代码和对话中涉及真实 Token 的地方全部替换为了
“在此处粘贴你的READWISE_TOKEN”这样的提示语。 -
路径脱敏:将你电脑原本的
C:\Users\1\...路径简化为了通用的C:\Users\YourName\...,保护你的用户名隐私。 -
精简优化:保留了核心的“报错-解决”逻辑(环境配置 -> 网络SSL问题 -> 路径问题 -> 中文URL报错),去掉了中间一些无效的重复确认,使阅读更流畅。
你可以直接复制下面的内容,保存为 .md 文件分享给朋友。
实战记录:如何将本地 Markdown 完美导入 Readwise Reader (含排错全过程)
背景:我想把本地的 Markdown 笔记导入 Readwise Reader,并且希望它们被识别为“文章(Article)”而不是“文件(File)”,以便使用 Reader 的公开链接分享 (Public Link) 功能。以下是我从零开始配置环境、编写 Python 脚本并解决各种报错的完整记录。
🧑💻 User (我)
我现在有一些 Markdown 文档,我是否可以直接通过 API 导入到 Readwise Reader 里面?我想实现和网页剪藏一样的效果(支持高亮、笔记、尤其是公开链接分享)。如果直接上传 PDF 是没有公开链接功能的。
请参考 API 文档给我一个 Python 脚本。
🤖 Assistant
可以通过 API 实现。关键点在于将 Markdown 转为 HTML 后,通过 API 的 html 参数上传,并伪造一个 url,这样 Reader 就会把它当作“文章”处理,从而解锁公开分享功能。
这是基础版的 Python 脚本:
import os
import requests
import markdown
⚠️ 隐私脱敏处理:请在下方填入你自己的 Token
TOKEN = "在此处粘贴你的READWISE_ACCESS_TOKEN"
FOLDER_PATH = "./md_files"
def upload():
# ... (省略部分基础逻辑,详见后文最终版代码) ...
pass
🧑💻 User
我按照步骤运行了,但是提示: 'py' 不是内部或外部命令,也不是可运行的程序 或者提示找不到 requests 模块。
🤖 Assistant
这是因为 Python 环境没有配置好。
解决方法:
-
重装 Python:下载安装包时,务必勾选底部的 ✅ Add Python to PATH(添加到环境变量)。
-
安装依赖库: 如果网络正常,在终端输入:
pip install requests markdown
🧑💻 User
安装库时报错了,提示 SSLError 和 TimeOut: Could not fetch URL... Caused by SSLError...
🤖 Assistant
这是国内网络连接 Python 官方源不稳定的问题。
解决方法:使用国内镜像源,并添加信任主机参数来绕过 SSL 验证。 请在终端执行这行命令:
py -m pip install requests markdown -i http://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
🧑💻 User
库安装好了。但是运行脚本时报错: [Errno 2] No such file or directory: 'run.py' 我明明把文件放在文件夹里了。
🤖 Assistant
这是因为命令行窗口(CMD)当前的路径不对。它默认在 C:\Users\YourName,而你的脚本在 D:\文档\Readwise导入 里。
最简单的运行方法(不用敲 cd 命令):
-
用文件管理器打开你的脚本所在文件夹。
-
在文件夹顶部的地址栏输入
cmd并回车。这样打开的黑窗口会自动定位到当前目录。 -
输入
py run.py运行。
🧑💻 User
运行起来了!但是上传失败,报错代码 400: ❌ 失败 (代码 400): {"url": ["Enter a valid URL."]}
我的文件名是中文的,比如《学习笔记.md》。
🤖 Assistant
找到原因了。Readwise 的 API 要求 url 参数必须是合法的网址格式,不能包含中文字符或空格。我们之前的代码是用文件名作为 URL 的,所以中文文件名会导致报错。
最终解决方案: 不需要改文件名。我们修改代码,引入 uuid 库,在后台自动生成一串“看不见的随机数字”作为 URL 发送给 Readwise,这样无论文件名是什么(中文/特殊符号)都能完美上传。
✅ 最终版完美脚本 (Copy This)
请将下面的代码保存为 run.py,并在同级目录下创建 md_files 文件夹放入笔记。
import os
import requests
import markdown
import sys
import uuid # 新增:用于生成唯一的随机ID
================= 配置区域 =================
【重要】:请将下方引号内的内容替换为你自己的 Readwise Token
获取地址:https://readwise.io/access_token
TOKEN = "在此处粘贴你的READWISE_ACCESS_TOKEN"
===========================================
自动获取当前脚本所在的文件夹路径
BASE_DIR = os.path.dirname(os.path.abspath(file))
MD_FOLDER = os.path.join(BASE_DIR, "md_files")
def import_files():
# 1. 检查文件夹是否存在
if not os.path.exists(MD_FOLDER):
print(f"错误:找不到 md_files 文件夹。请在脚本旁边新建一个名为 'md_files' 的文件夹。")
return
files = [f for f in os.listdir(MD_FOLDER) if f.endswith(".md")]
if not files:
print("未发现 .md 文件,请将笔记放入 md_files 文件夹中。")
return
print(f"准备导入 {len(files)} 个文件...")
headers = {
"Authorization": f"Token {TOKEN}",
"Content-Type": "application/json"
}
success_count = 0
for filename in files:
file_path = os.path.join(MD_FOLDER, filename)
try:
with open(file_path, "r", encoding="utf-8") as f:
md_text = f.read()
except Exception as e:
print(f"❌ 读取文件失败 {filename}: {e}")
continue
# 转换 Markdown 为 HTML
html_content = markdown.markdown(md_text)
# 获取文件名作为标题(保留中文标题,Reader里看着方便)
title = os.path.splitext(filename)[0]
# 【核心修改】:生成随机 UUID 作为伪造 URL
# 解决中文文件名导致的 "Enter a valid URL" 400 错误
unique_id = str(uuid.uuid4())
fake_url = f"https://custom-import.readwise/{unique_id}"
payload = {
"url": fake_url, # API 看到的唯一ID (纯数字字母,合法)
"html": html_content, # 文章内容
"title": title, # 你看到的标题 (可以是中文)
"author": "Local Import",
"category": "article", # 标记为文章,开启公开链接功能
"saved_using": "Python Script"
}
print(f"正在上传: {title} ...")
try:
response = requests.post("https://readwise.io/api/v3/save/", headers=headers, json=payload)
if response.status_code in [200, 201]:
print(f"✅ 成功!")
success_count += 1
else:
print(f"❌ 失败 (代码 {response.status_code}): {response.text}")
except Exception as e:
print(f"❌ 网络请求错误: {e}")
print(f"\n----------- 处理完毕 -----------")
print(f"共尝试 {len(files)} 个,成功 {success_count} 个")
if name == "main":
# 安全检查:防止忘记填 Token
if "粘贴你的" in TOKEN:
print("【提示】请先打开脚本文件,将 TOKEN 变量修改为你自己的 Readwise 密钥!")
else:
import_files()
🧑💻 User (反馈)
太棒了!这次成功了! 显示 ✅ 成功!。 去 Reader 里看了一下,中文标题显示正常,而且点击 Share 菜单,Enable public link 也可以使用了,效果和网页剪藏的一模一样。
文章评论