news 2026/9/7 6:37:09

用开源工具qzonearchive将QQ空间数据归档到本地

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用开源工具qzonearchive将QQ空间数据归档到本地

在 CSDN 上看到【294期】这种标题,很多人第一反应是“又一篇资源搬运帖”。但今天这篇,我打算把一个 GitHub 开源项目当正经技术方案来拆解——它就是最近被频繁提到的 qzonearchive,一个用于 QQ 空间数据归档与恢复辅助的开源工具。

先说我的结论:这类工具的价值,不只是帮你把说说、留言板、相册“存下来”,而是把数据迁移的主动权交还给了用户。官方不提供一键导出,第三方网站又不敢信,于是开源项目成了一个最务实的折中方案。它的代码公开、本地运行、不强制交出账号密码,这三点足以解释为什么它能引起这么多人关注。

读完这篇文章,你会弄明白三件事:第一,qzonearchive 到底是什么、能做什么、不能做什么;第二,这类工具背后的技术原理是什么,为什么它能读取到你的 QQ 空间数据;第三,怎么安全、合规、少踩坑地把自己的历史内容备份到本地。这篇文章我会尽量按一个可落地的教程来写,涉及环境准备、配置说明、运行验证、常见问题排查和数据二次整理,建议先收藏再慢慢看。

1. 这个开源项目为什么突然火了

如果你是一个 90 后或 00 初,QQ 空间大概率是你互联网生活里浓墨重彩的一部分。头像非主流、留言板互踩、相册里存着几百张模糊但珍贵的照片、说说下面还有当年同学朋友的中二评论——这些数据在今天看来,已经不只是普通聊天记录,而是一整段“数字青春”。

但现实很尴尬:官方一直没有提供“导出我的全部说说”或“一键备份我的空间”这种功能。你当然可以手动一条一条复制,可一旦说说的数量到了几千条,就完全不现实。而市面上很多声称“恢复说说”的网站,又要求你输入 QQ 账号密码,或者让你把空间设置为公开,这种操作的风险高到离谱。

所以当一个叫 qzonearchive 的开源项目出现在 GitHub 上时,它会火几乎是必然的。从热搜词里就能看到“qzonearchive 开源地址”“QQ 空间归档”“QQ 空间恢复 GitHub”这些高频搜索词,说明用户的需求一直存在,只是缺一个靠谱的出口。

这个项目解决的第一层是技术问题:怎么把空间里的内容批量导出。但更深一层,它解决的是信任问题:代码开源了,你可以自己审查,数据到底发到了哪里,脚本到底做了什么,都能看得到。这种透明度,是任何一个“代恢复说说的付费网站”都给不了的。

所以我的判断是:qzonearchive 能火,不完全是因为功能多强大,而是因为它刚好站在了用户需求和开源信任的交叉点上。

2. qzonearchive 是什么,不是什么

qzonearchive 是 GitHub 上由用户 gaoshu705 维护的一个开源项目。从命名看,它强调的是“archive”,也就是归档。项目希望通过自动化方式,把 QQ 空间中你有权查看的内容,比如说说、日志、相册动态等,导出到本地。

这里就要先做一个概念区分:恢复和归档不是一回事。

“恢复”听起来更像是“找回你已删除、但平台服务器上还可能存在的旧数据”。这类需求对普通用户来说其实很难实现,因为平台有没有真正物理删除、是否保留备份,你我都无法控制。

“归档”则是把当前仍然可见、仍然能访问到的内容,批量保存到本地。它不承诺“找回已删除的说说”,但能把你现在还能看到的所有内容整整齐齐地保存下来。

维度数据恢复数据归档
目标找回已删除或不可见的内容保存当前可见内容
可行性取决于平台侧数据存留情况取决于接口是否返回数据
工具能力通常无法保证可以批量自动化处理
对普通用户价值高但不稳定高且稳定

2.1 它不是破解工具,也不是偷看他人隐私的黑客脚本

这个定位很重要。qzonearchive 这类工具的运作基础,是你自己的登录态,也就是浏览器登录 QQ 空间后产生的会话凭证。它做的事情,本质上是“替你把自己能看到的数据手动复制到本地”,只是用脚本把复制过程自动化了。

所以,它不是暴力破解工具,也不应该被用来抓取别人的私密内容。如果你对某个人的空间没有访问权限,工具也不应该突破权限去读取内容——如果哪个项目这么干,我建议你离它远一点。

2.2 适合谁,不适合谁

适合使用的用户很明确:拥有大量 QQ 空间内容,想要本地备份;担心平台以后改版或数据不好找;想整理自己的历史信息到 Obsidian、Notion、本地博客等知识库的人。

不适合的用户也很明确:以为它能“恢复多年以前手动删除的说说”的人;试图用它批量下载他人空间内容的人;以及完全不愿意碰命令行、只想“一键全自动”的人。因为开源工具再方便,通常也需要你有最基本的环境配置能力。

3. 核心原理拆解:说说数据是怎么导出的

很多人第一次接触这类项目时,会对“它凭什么能拿到我的说说”感到好奇。这里其实不复杂,整个过程可以拆成四个环节。

3.1 登录态:一切请求的身份基础

你用浏览器打开 QQ 空间并登录后,服务端会信任这个浏览器,之后的每次翻页、查看说说详情、打开相册,都属于“有权限的用户在访问自己有权限看的内容”。浏览器里保存着一组会话凭证,通常叫 Cookie,它在请求时会被自动带上,服务端一看凭证有效,就正常返回数据。

qzonearchive 类工具的切入点就在这里:它不尝试破解密码,而是把你从浏览器里复制出来的登录凭证,用来构造请求。这个思路最大程度降低了技术门槛,但也带来了安全要求——你的 Cookie 等同于你账号的部分操作权限,泄露出去和账号被盗差别不大。

3.2 数据请求:浏览器在帮你干什么

打开浏览器开发者工具(F12),切换到 Network 面板,然后在 QQ 空间里翻一翻说说列表。你会看到大量 XHR 或 Fetch 请求,响应内容往往是 JSON 格式的数据。这里面可能包含说说文本、发布时间、图片 URL、评论数、点赞数等字段。

普通用户不会关心这些请求,但脚本开发者和维护者会去分析这些接口规律。比如某个接口是“获取下一页说说”,某个参数是当前页数,某个请求头必须带特定凭证。总结出规律之后,再用 Python 里的 requests 或 httpx 去模拟。

3.3 数据解析:从 JSON 到本地文件

拿到响应之后,脚本要做的不是直接保存整个响应体,而是解析出有价值的信息。比如从 JSON 中提取每一条说说的内容、时间、图片地址,再统一转换成 Markdown 或 JSON 文件保存到本地。

这里有一个容易被误解的点:说说里的图片通常只是 URL,不是本体。如果你希望图片也能保存,脚本还需要额外下载这些图片,并且要处理好防盗链、请求头、文件命名等问题。

3.4 频率与风控:为什么不能开足马力跑

QQ 空间毕竟是一个面向海量用户的平台,正常用户的浏览行为不会每小时发起上万次请求。如果脚本设置不当,短时间高频请求很容易触发验证码、数据接口异常甚至临时限制。

所以很多归档工具会提供“请求间隔”配置。它不是一个可有可无的选项,而是保护账号正常使用状态的关键配置。你在别人博客里看到“跑得飞快”的教程,反而要留个心眼,那可能只是验证不充分的一次性脚本。

从原理可以看出,这类工具能否长期可用,完全取决于接口规律是否还匹配、登录凭证是否有效、请求频率是否克制。没有永远有效的爬虫脚本,只有不断维护的工程能力。

4. 环境准备与项目获取

在动手之前,先把环境准备好。qzonearchive 从项目类型看是一个典型的 Python 工具项目,所以最基本的依赖是 Python 运行环境。

4.1 确认本机环境

你需要一个能正常运行的 Python 3 环境。打开终端或命令行,执行:

python --version pip --version

如果命令提示找不到,需要先从 Python 官网下载安装包,安装时记得勾选“Add Python to PATH”。版本方面,建议使用项目 README 中要求的版本,本文不写死具体版本,因为你安装的依赖可能有版本兼容要求。

4.2 从 GitHub 获取项目

项目地址是 GitHub 上的 gaoshu705/qzonearchive,标准的获取方式是用 Git 克隆:

git clone https://github.com/gaoshu705/qzonearchive.git cd qzonearchive

如果你没有安装 Git,也可以直接在 GitHub 仓库页面点击 Code 按钮,选择 Download ZIP,然后解压到本地目录。

4.3 如果 GitHub 访问不稳定怎么办

GitHub 在国内网络下偶尔会出现访问慢或连接不稳定的情况,这是很多开发者都遇到过的事,也很容易让人病急乱投医。这里给你几个稳妥的路径,不涉及也不需要使用任何特殊手段:

  • 直接访问 GitHub 仓库页面,下载 Release 版本或 ZIP 包。
  • 使用清华大学 TUNA、阿里云等正规开源镜像站,检索项目是否提供仓库同步。
  • 在 Gitee 上搜索同名或同作者项目,很多项目作者会主动做国内镜像同步。

但这里有一条红线要强调:不要从不明来源的网盘、微信群、QQ 群下载所谓“优化版”“破解版”压缩包。开源项目如果被人二次打包,里面可能被插入恶意代码。正规做法是优先从 GitHub 官方页面或可信镜像获取。

4.4 创建虚拟环境并安装依赖

为了避免项目依赖污染你的全局 Python 环境,建议创建虚拟环境。Windows 和 macOS/Linux 的命令稍有区别:

# 创建虚拟环境 python -m venv venv # Windows 激活 venv\Scripts\activate # macOS / Linux 激活 source venv/bin/activate

激活后,安装项目依赖:

pip install -r requirements.txt

如果安装依赖时速度很慢,可以临时使用国内 PyPI 镜像源:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

这一步顺利完成后,项目依赖就准备好了。下面可以进入配置和使用阶段。

5. 完整使用流程与配置说明

环境准备好之后,真正关键的是“配置登录凭证”这一步。请把这一步当成全文章里最需要仔细对待的环节,因为它直接关系账号安全。

5.1 第一步:登录 QQ 空间,打开开发者工具

先用浏览器登录你的 QQ 空间,确保空间处于已登录状态。然后按 F12 打开开发者工具,切到 Network 面板。此时不要急着操作,先让页面停留在空间首页。

5.2 第二步:刷新并观察数据请求

在 Network 面板中刷新页面,然后在筛选栏里选择 XHR 或 Fetch,你会发现页面在加载过程中发出了很多请求。这些请求里有相当一部分是获取内容数据的接口。你不需要理解每一个请求的含义,只需要知道:你的登录凭证就在请求头中,项目脚本正是基于这些凭证去请求数据。

5.3 第三步:复制登录凭证并写入配置

这是整套流程里风险最高的一步。每个项目的配置方式不一样,有的要求你把 Cookie 直接粘贴到配置文件中,有的会生成一个 .env 文件,有的则支持环境变量传入。具体以项目 README 中的字段说明为准。

这里给一份示意配置,不要直接照抄,字段名需要对应到实际项目:

# 示意配置 config.yaml,请以项目 README 中的字段为准 account: uin: 1234567890 # 你的 QQ 号 cookie: "从开发者工具复制的登录凭证,切勿提交到 GitHub" export: output_dir: "./output" # 导出目录 include_images: true # 是否下载图片 request: interval_seconds: 2 # 请求间隔,建议别太激进 max_items: 100 # 可以先设置小一点,用来测试

注意,Cookie 是敏感信息。它就像你账号的一把钥匙,谁拿到谁就能以你的身份请求数据。配置文件如果会被 Git 管理,请务必加入.gitignore,或者干脆不要让配置文件进入版本控制。

5.4 第四步:启动导出脚本

配置完成之后,启动方式一般就是运行项目的入口脚本。不同项目的入口文件名可能不同,可能是main.pyrun.py,也可能已经打包成命令行工具。这里给的是通用示例:

python main.py --config config.yaml

如果项目支持更多参数,通常会提供--help来查看:

python main.py --help

这里要重点强调:不要一上来就用大范围全量导出。更稳妥的方式是先设置一个较小的数量上限,比如先导出最近 10 条说说,跑通流程、验证数据文件能被正确生成,再放开限制。

5.5 第五步:观察输出目录与日志

运行过程中,终端一般会输出进度信息,比如“正在导出第 1 页”“获取到 20 条说说”等。导出完成后,到配置里指定的输出目录下看一眼,确认是否有生成的数据文件和图片文件夹。如果一切正常,你的本地备份就完成了第一步。

6. 导出成功之后:数据整理示例与验证

很多人的误区是:数据导出到本地就算结束。实际上,导出只是开始,接下来怎么整理、怎么长期保存才是重点。我在这里提供一个通用的数据整理思路,不依赖具体项目内部结构,主要展示 Python 脚本如何处理导出后的 JSON 文件。

6.1 先统计导出结果

假设导出目录中有一堆 JSON 文件,一个简单的统计脚本可以帮你确认到底导出了多少内容:

# 文件路径:scripts/count_export.py from pathlib import Path import json import sys def scan_json_files(data_dir: str): files = list(Path(data_dir).rglob("*.json")) total_items = 0 detail = {} for f in files: try: data = json.loads(f.read_text(encoding="utf-8")) except Exception: continue count = 0 if isinstance(data, list): count = len(data) elif isinstance(data, dict): # 不同项目的 JSON 结构不一样,这里只做通用处理 if "list" in data and isinstance(data["list"], list): count = len(data["list"]) total_items += count detail[f.name] = count return len(files), total_items, detail if __name__ == "__main__": if len(sys.argv) < 2: print("用法: python count_export.py <导出目录>") sys.exit(1) file_count, item_count, detail = scan_json_files(sys.argv[1]) print(f"JSON 文件数量: {file_count}") print(f"数据条目总量: {item_count}") for name, count in detail.items(): print(f" {name}: {count}")

这段代码不依赖具体项目内部实现,只做通用统计。你可以根据自己的导出目录结构调整。

6.2 按年份归档到本地知识库

导出内容里通常都带有时间字段。如果你想按年份归档,可以写一个小脚本,读取 JSON 中的时间字段,再把对应的 Markdown 文件移动到以年份命名的文件夹里。这一步的价值在于,当备份体量变大之后,按时间维度组织数据会极大提高使用效率。

6.3 给备份文件生成校验值

本地备份存在一个容易被忽视的风险:文件静默损坏。硬盘坏道、异常断电、复制中断,都可能导致某些文件打不开。建议定期为输出目录生成 SHA-256 校验值清单:

find output -type f -exec sha256sum {} \; > output.sha256

macOS 用户可能没有 sha256sum,可以用:

find output -type f -exec shasum -a 256 {} \; > output.sha256

以后要验证文件是否完整,只需要执行:

sha256sum -c output.sha256

这一步花不了多少时间,但能在几个月后帮你少很多不必要的焦虑。

6.4 导入 Obsidian 或思源笔记

导出的内容如果是 Markdown 格式,可以直接把整个输出目录作为 Obsidian 的 Vault 文件夹打开。图片、链接、时间信息都保留在本地,之后你可以写一整篇“我的 QQ 空间十年回忆”的笔记,也可以给每条说说补标签,建立自己的个人数据体系。

7. 常见问题与排查思路

在使用 qzonearchive 这类工具时,新手遇到的问题其实高度集中。这里有张排查表,建议收藏备查。

问题现象可能原因排查方式解决方案
启动后没有数据返回Cookie 失效或未正确复制检查日志中的 HTTP 状态码;重新打开空间页面确认登录状态重新登录 QQ 空间,更新 Cookie 配置
提示验证码或滑块验证请求频率过高触发风控检查请求间隔和单次条数增大请求间隔,降低单次导出数量,暂停一段时间后再试
导出条数远少于实际说说数分页参数未生效或接口变更对比浏览器看到的真实请求和脚本请求的差异更新项目版本,或查看项目 issue 是否有人反馈同类问题
图片下载失败或变成空文件图片 URL 需要特定 Referer 头查看图片请求报错状态码补充请求头配置,或关闭图片下载,先导出文本信息
pip 安装依赖失败默认 PyPI 源访问慢看到超时或连接错误使用清华、阿里云等 PyPI 镜像安装
项目启动报 ModuleNotFoundError未安装全部依赖看报错缺哪个模块重新执行 pip install -r requirements.txt
配置文件字段不识别项目版本更新,字段名变了对照 README 的最近更新说明以当前版本的 README 为准,不要照搬旧教程

7.1 先说结论:先小规模跑通再全量

大多数问题的根因都是同一个:没有经过小规模验证就直接全量运行。建议第一次运行时,把条数限制在 10 条以内,目标只是为了验证配置正确、登录态有效、数据文件生成。全量导出是第二步,不要跳级。

7.2 关于项目不再维护怎么办

开源项目最大的风险并不是源代码有 Bug,而是作者不再维护、接口变更后项目就失效了。遇到这种情况,可以先看看项目的 Issues 和 Pull Requests,确认是否有人提交了兼容性修复;也可以看是否存在活跃的 fork 仓库。如果所有维护都停滞了,那就别硬撑,赶紧把能导出的数据导出,以后找替代方案。

8. 合规、隐私与安全红线

这一章节我希望你认真读。工具本身是中性的,但使用方式决定了它是“备份工具”还是“侵权工具”。

8.1 只能备份你有权限访问的内容

qzonearchive 的能力边界应该停留在“你自己的账号可以访问的数据”上。如果你的空间内容设置为仅自己可见,导出没问题;如果是好友可见,导出时也要注意里面可能涉及他人隐私,不能随意公开。不是你的数据,不要抓,更不要传播。

8.2 Cookie 就是你的临时身份证

在整个使用过程中,最不能泄露的就是 Cookie。它虽然不是长期密码,但在有效期内能执行非常多的数据请求。以下行为都极度危险:

  • 把带 Cookie 的配置文件提交到 GitHub 公开仓库。
  • 把 Cookie 粘贴到在线代码工具或第三方网站上。
  • 在公共电脑上运行脚本后忘记清除配置文件和浏览器缓存。
  • 把项目的 output 目录随意压缩发给别人,里面可能包含他人隐私信息。

8.3 警惕“恢复网站”的隐私陷阱

很多“恢复说说一键生成”的网站,本质上只是让你把账号密码或 Cookie 交出去,然后服务器端自动跑一遍。这类服务最大的问题是你完全不知道数据是否被留存、被分析、被拿去做什么。相比于闭源网站,一个本地运行的开源脚本至少在这一点上更有确定性:代码可以被审查,数据留存在你自己的机器上。

8.4 尊重平台规则,控制请求频率

即使你只备份自己的数据,也不意味着可以使用脚本无限制请求平台接口。过高的请求频率可能影响平台稳定性,也可能导致账号触发风控。建议把请求间隔设置在一个温和的值,宁可多花一点时间,也不要挑战风控机制。

8.5 合法授权与最小权限原则

如果你在公司或团队环境中使用类似工具,必须先确认你是否有权限处理这些数据,尤其是涉及他人数据时要特别谨慎。更规范的做法是走官方数据接口、申请开发权限,而不是依赖模拟浏览器请求来规避平台限制。最小权限原则同样适用:只要能导出自己的内容,就不要去探索额外的接口能力。

9. 工程化使用建议与总结

9.1 把备份当成一个长期任务,而不是一次性操作

很多人导完一次就以为自己“彻底存档”了。但只要你还在继续使用 QQ 空间,就会不断产生新内容。更合理的方式是定期低频备份,比如每个月或每个季度执行一次增量导出。这里有一个可参考的周期任务配置,以 Linux cron 为例:

# 每周日凌晨 3 点执行一次归档备份 0 3 * * 0 cd /path/to/qzonearchive && /path/to/venv/bin/python main.py --config config.yaml >> backup.log 2>&1

Windows 用户可以使用任务计划程序,配置触发条件为每周一次。频率不要太高,周级或月级备份足够了。

9.2 依赖与项目版本管理

如果你在本地长期维护这个工具,建议把依赖版本固定下来。用虚拟环境时,导出当前依赖清单:

pip freeze > requirements.lock

另外,每次从 GitHub 拉取新版本之前,先看 release notes 或 commit 信息。如果作者调整了配置字段,你原有的配置文件可能需要跟着改,直接 git pull 后可能会运行报错。

9.3 本地多副本备份策略

如果导出数据对你很重要,就不要只放在电脑硬盘里。推荐采用 3-2-1 思路:

  • 3 份数据副本。
  • 2 种不同存储介质。
  • 1 份存放在异地或离线环境。

比如:本机保留工作目录,移动硬盘放一份压缩包,合规的私有网盘或对象存储再放一份。导出文件加好校验值,避免静默损坏。

9.4 不要把 Cookie 写死在代码里

在配置管理上,至少要做到“配置文件不入库,敏感字段不入 Git”。更规范的做法是使用环境变量,比如在运行时传入:

export QQZONE_COOKIE="粘贴Cookie" python main.py

这样即使配置文件误提交到 Git,也不会直接泄露明文凭证。

9.5 总结一句话

qzonearchive 真正让人兴奋的地方,不只是它能导出数据,而是它验证了一件事:在没有官方工具的情况下,用户依然可以通过开源手段拿回属于自己的数字内容。它当然有使用门槛,也伴随风险,但这正是每个人都需要理解的——数据备份从来不是平台应该替你决定的义务,而是你对自己数字生活的基本管理能力。

下一步,如果你对这个方向感兴趣,可以从这几个方向继续深入:Python 网络请求库的用法、JSON 数据清洗、Markdown 知识库建设,以及更广义的“个人数据归档”方案。把这篇收藏起来,趁数据还在,把该保存的内容保存到本地吧。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 6:36:07

DellEMC定制版ESXi 7.0 U3镜像详解与PowerEdge部署实践

简介&#xff1a;这是针对戴尔易安信服务器打造的VMware ESXi 7.0 Update 3定制化安装包&#xff0c;主要面向需要在戴尔硬件上部署或升级虚拟化环境的数据中心运维工程师&#xff0c;能有效解决驱动兼容性和硬件识别问题。压缩包内共包含105个文件&#xff0c;其中vib格式组件…

作者头像 李华
网站建设 2026/9/7 6:34:13

AMD显卡加速的AI视频修复:从480P老视频到4K的完整实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 6:31:34

轮毂电机电液复合制动平顺性控制:冲击度抑制策略与仿真实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 6:30:42

C++配置文件读取实战:从手写INI解析到JSON与热更新

简介&#xff1a;一份聚焦C配置文件读取的入门级代码资源&#xff0c;面向需要在应用程序中动态加载设置项的C开发者&#xff0c;解决每次修改参数都要重新编译的痛点。示例以INI文本格式为切入点&#xff0c;通过自定义Config类和fstream文件流实现打开、逐行读取、跳过注释、…

作者头像 李华
网站建设 2026/9/7 6:30:40

无锁MPMC队列ConcurrentQueue:原理、接口与性能优化

简介&#xff1a;面向C开发者的工业级无锁并发队列实现&#xff0c;基于C11标准&#xff0c;专为多生产者、多消费者场景设计&#xff0c;提供无锁、线程安全的高吞吐队列。库采用单头文件实现&#xff0c;可整体嵌入项目&#xff0c;支持移动语义、批量操作与阻塞版本&#xf…

作者头像 李华
网站建设 2026/9/7 6:30:36

质量检验员培训教材如何搭?从量具到抽样全流程拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华