AI生成工具

两年前我有了个掌阅阅读器,于是我开始在阅读器上看书,从此一发不可收,导致我两年没看一本纸质书。不过,你别说,电子书还真是省钱。zlib上下载,导入到kindle或者微信读书里去看,这两年看的书愣是一分钱没花…

如果问我看电子书有什么好处,我觉得是方便做笔记。其实,以前我是一个看书从不做笔记的人,那是因为年轻时记忆力好盲目自信,现在衰退得厉害,看完啥都记不住,不做笔记跟没看一样,后来开始记笔记,但是一直没有好方法。虽然看纸质书的时候,看到好玩的也会拿手机拍发到豆瓣读书笔记里看完了再整理成博客,但是实在是不方便,一张张照片,也很难整理。看电子书就方便多了,看的时候随便拿手指划划,看完直接能导出。

kindle的读书笔记导出的是html格式,通过脚本可以很方便地转成markdown。我之前还发过转换的脚本–>kindle笔记转成markdown

微信读书没有导出笔记的功能,只能在网页版上全部复制出来,而且格式比较奇葩,太多特殊字符,发表的想法与原文也别扭。直接贴到博客里格式就有点难于接受。所以很长时间以来,我都是在kindle里看书。

但是与微信读书的查询功能相比,kindle的字典和搜索功能实在是垃圾,而且因为不可知的原因我的阅读器上的kindle下载不了字典。尤其现在微信读书有了AI的加持。kindle的下场就是被我弃如敝帚。

微信读书啥都好,就是导出笔记不行,那么我们就来解决笔记的问题。以前得费劲写脚本,现在不用了,现在有AI了,让AI来转格式,直接把复制出的笔记让他给转成markdown。但是这种方法不稳定,来回调整格式也让人火大,还是让它生成脚本。我试了一下,几轮对话调整之后,基本可用,最终脚本如下:

#!/usr/bin/env python3
"""
微信读书笔记 → Markdown 转换脚本
用法:python convert_notes.py <输入文件> <输出文件>
"""

import sys

def convert_weixin_notes(input_path, output_path):
    with open(input_path, 'r', encoding='utf-8') as f:
        text = f.read()

    lines = text.strip().split('\n')
    result = []
    i = 0
    n = len(lines)

    # 用于暂存想法内容(想法标题 + 想法正文)
    idea_buffer = []
    collecting_idea = False

    while i < n:
        line = lines[i].rstrip()

        # ---- 第1行:书籍标题 ----
        if i == 0 and line.startswith('《') and '》' in line:
            result.append(f'# {line}')
            i += 1
            continue

        # ---- 第2行:作者(可选) ----
        if i == 1 and line and not line.startswith('◆') and '个笔记' not in line:
            result.append(line)
            i += 1
            continue

        # ---- 第3行:笔记数 ----
        if i == 2 and '个笔记' in line:
            result.append(line)
            i += 1
            continue

        # ---- 空行 ----
        if not line:
            if collecting_idea:
                idea_buffer.append('')          # 想法中的空行保留
            else:
                result.append('')
            i += 1
            continue

        # ---- 章节标题(如"推荐序"、"第1章"等) ----
        # 不在收集想法时才判断章节标题
        if not collecting_idea and not line.startswith('◆') and not line.startswith('原文:') and len(line) < 60:
            # 判断是否为章节标题:不包含特殊符号,且不是笔记数统计
            if '个笔记' not in line and '来自微信读书' not in line and '发表想法' not in line:
                result.append(f'## {line}')
                i += 1
                continue

        # ---- 处理 ◆ 开头的行 ----
        if line.startswith('◆'):
            content = line[1:].strip()

            # 判断是否为"发表想法"标记
            if '发表想法' in content:
                # 开始收集想法,但不保存"发表想法"行
                collecting_idea = True
                idea_buffer = []      # 不保存"发表想法"标记行
                i += 1
                continue
            else:
                # 这是普通原文
                if collecting_idea or idea_buffer:
                    # 先检查想法缓冲区中是否有"原文:"开头的行
                    original_text = None
                    idea_lines = []
                    for idea_line in idea_buffer:
                        if idea_line.startswith('原文:'):
                            original_text = idea_line[3:]  # 去掉"原文:"前缀
                        else:
                            idea_lines.append(idea_line)
                    
                    # 输出原文引用(优先使用想法缓冲区中的"原文:"内容)
                    if original_text:
                        result.append(f'> {original_text}')
                    else:
                        # 去掉可能存在的"原文:"前缀
                        if content.startswith('原文:'):
                            result.append(f'> {content[3:]}')
                        else:
                            result.append(f'> {content}')
                    
                    # 再输出收集到的想法内容(普通文本)
                    for idea_line in idea_lines:
                        result.append(idea_line)
                    
                    # 清空想法缓冲区
                    idea_buffer = []
                    collecting_idea = False
                else:
                    # 无待输出的想法,直接输出原文引用(去掉"原文:"前缀)
                    if content.startswith('原文:'):
                        result.append(f'> {content[3:]}')
                    else:
                        result.append(f'> {content}')
                i += 1
                continue

        # ---- 其他行(想法正文等) ----
        if collecting_idea:
            idea_buffer.append(line)
            i += 1
            continue

        # ---- 默认:直接输出(如"-- 来自微信读书") ----
        result.append(line)
        i += 1

    # 文件末尾可能残留未输出的想法(极少见),这里忽略

    with open(output_path, 'w', encoding='utf-8') as f:
        f.write('\n'.join(result))

    print(f'转换完成!输出文件:{output_path}')


if __name__ == '__main__':
    if len(sys.argv) != 3:
        print('用法:python convert_notes.py <输入文件.txt> <输出文件.md>')
        sys.exit(1)

    input_file = sys.argv[1]
    output_file = sys.argv[2]
    convert_weixin_notes(input_file, output_file)

后来我又想,现在腾讯有免费的egdeone,把它转成网页放到公网岂不美哉。 腾讯好啊,edgeone 得用。
于是让AI把python转成web vite工程,整了个二级域名一发布,这小工具不就成了。 https://weread.wangxuan.me/ 这是地址,有兴趣的可以试试。

源码也有: https://gitee.com/wangyidao/weread

具体发布过程可以参考这个:用Gitee和EdgeOne Pages搭建支持外链的免费相册