Typecho 文章批量导出工具

提供从 Typecho 数据库批量导出文章为 Markdown 文件的 Python 脚本,支持 SQLite 和 MySQL 两种数据库。

功能特点

  • 自动识别已发布的文章(status='publish'
  • 保留原始文章标题和内容
  • 自动生成规范化文件名(替换特殊字符)
  • 实时输出导出进度

SQLite 版本

import sqlite3
import os

# 配置区 ==================================
DB_FILE = 'typecho.db'        # SQLite 数据库文件路径
OUTPUT_DIR = './exported_md'  # 输出目录
# =========================================

def export_posts():
    """导出已发布的文章到Markdown文件"""
    if not os.path.exists(OUTPUT_DIR):
        os.makedirs(OUTPUT_DIR)

    with sqlite3.connect(DB_FILE) as conn:
        cursor = conn.cursor()
        cursor.execute("""
            SELECT cid, title, text 
            FROM typecho_contents 
            WHERE status='publish'
        """)

        for cid, title, text in cursor.fetchall():
            # 生成安全的文件名
            filename = f"{cid}_{title.replace('/', '_').replace(' ', '_')}.md"
            filepath = os.path.join(OUTPUT_DIR, filename)
            
            with open(filepath, 'w', encoding='utf-8') as f:
                f.write(f"# {title}\n\n{text}")
            
            print(f"✓ 导出成功: {title}{filename}")

if __name__ == '__main__':
    export_posts()

MySQL 版本

import mysql.connector
import os

# 配置区 ==================================
DB_CONFIG = {
    'host': 'localhost',
    'user': 'typecho_user',
    'password': 'your_password',
    'database': 'typecho_db',
}
OUTPUT_DIR = './exported_md'  # 输出目录
# =========================================

def export_posts():
    """导出已发布的文章到Markdown文件"""
    if not os.path.exists(OUTPUT_DIR):
        os.makedirs(OUTPUT_DIR)

    try:
        conn = mysql.connector.connect(**DB_CONFIG)
        cursor = conn.cursor()
        cursor.execute("""
            SELECT cid, title, text 
            FROM typecho_contents 
            WHERE status='publish'
        """)

        for cid, title, text in cursor.fetchall():
            # 生成安全的文件名
            filename = f"{cid}_{title.replace('/', '_').replace(' ', '_')}.md"
            filepath = os.path.join(OUTPUT_DIR, filename)
            
            with open(filepath, 'w', encoding='utf-8') as f:
                f.write(f"# {title}\n\n{text}")
            
            print(f"✓ 导出成功: {title}{filename}")

    finally:
        cursor.close()
        conn.close()

if __name__ == '__main__':
    export_posts()

使用说明

  1. 准备工作

    • 安装依赖库:

      pip install mysql-connector-python
      
    • 修改脚本中的数据库配置参数

  2. 执行导出

    python export_typecho.py
    
  3. 输出结果

    • 所有文章将以 {文章ID}_{文章标题}.md 格式保存
    • 每篇文章首行自动添加Markdown标题

注意事项

  • 确保数据库连接信息正确
  • MySQL版本需要提前创建好数据库连接权限
  • 文件名中的特殊字符会被替换为下划线

验证与自查

  1. 导出后统计数量:ls exported_md/ | wc -l,与数据库已发布文章数一致
  2. 抽查导出的 .md 文件,首行为 Markdown 标题 # 文章标题
  3. head -5 exported_md/*.md 检查中文无乱码(UTF-8 编码)
  4. 将导出的 md 文件导入 Hugo/Hexo 前,先补 front matter 并检查正文中的特殊字符

参考