news 2026/10/18 19:14:57

个人微信接入新思路:桌面端Claw网关的合规本地化实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
个人微信接入新思路:桌面端Claw网关的合规本地化实践

桌面端 Claw 个人微信接入这件事,我前前后后折腾了小一个月,踩了不少坑,也找到了几条真正走得通的路线。这篇文章就把我最终跑通的那套方案完整写出来:Claw 到底是什么、为什么我坚持在桌面端跑而不是丢到云服务器、整个接入过程每一步怎么操作、遇到问题怎么排查,以及我个人的使用边界和建议。适合正在犹豫要不要自己动手接个人微信的开发者,也适合已经在用各类个人助理工具、想进一步把微信消息纳入自动化流程的效率爱好者。

先说结论:我做的不是那种“全自动托管账号”的方案,也完全不碰协议破解或者客户端逆向。我的思路是在桌面端跑一个独立的 Claw 网关服务,它不直接操作微信客户端,而是作为一个“副驾驶”存在——我从微信里选中要处理的消息,通过热键呼出 Claw,它会完成语义理解、知识库检索、回复建议生成、任务提醒登记这一整套动作,最后把结果交还给我,由我判断后一键粘贴回微信。这样既保住了个人微信的安全边界,也把日常高频的重复劳动降了下来。下面进入正题。

1. 为什么做桌面端 Claw:个人微信接入的完整思路

1.1 个人微信接入到底难在哪

个人微信一直没有官方开放接口,这是所有想把它接进自动化流程的人面对的第一道坎。市面上常看到的方案不外乎几类:一类是模拟网页版协议,但网页版本身就限制大量账号登录,而且这些年封控越来越严;一类是注入客户端做 hook,本质上是逆向,风险极高,账号安全和数据安全都很难保证;还有一类是安卓端无障碍服务配合自动点击,但需要保持手机常亮、通知权限、后台保活,稳定性依赖具体机型,维护成本非常大。

我一开始也尝试过其中一些方案,实测下来最不舒服的地方不是技术难度,而是“不可控”——你不知道哪天微信客户端升个级,hook 就失效了;也不知道某个操作频率稍微高点,会不会触发平台风控。这种不确定感会让你根本不敢把重要消息交给它处理。后来我反过来想:既然微信端不能动,那就绕开它,把 Claw 做成一个独立的桌面应用,跟微信窗口并排跑,通过剪贴板、热键、本地文件这些完全合规的交互方式来建立“接入”关系。虽然看起来没有全自动那么“酷”,但胜在稳,而且思路其实更接近真实需求:大多数时候我们需要的是“被辅助”,而不是“被代替”。

1.2 为什么选桌面端而不是云端

很多人第一反应是把这类服务部署在云服务器上,图它 7x24 小时在线,走到哪都能访问。但我最终选了桌面端,理由很实际。

第一个理由是数据边界。微信消息里大量内容是个人聊天、工作沟通、家庭安排,这些数据如果经过云端中转,等于把隐私交给了第三方链路。桌面端方案里,Claw 的所有中间数据都落在本地目录,模型请求虽然有部分通过 API 发出,但我可以选择本地模型或者加密通道,尽可能压缩数据暴露面。本地跑 Claw 还能直接访问本机文件系统,知识库做成纯本地索引,不需要上传到任何对象存储,这对隐私敏感的用户是刚需。

第二个理由是延迟体验。云端方案多一跳网络,个人微信接入这种场景里,体验差距非常明显:你复制一条消息,等云服务器往返再渲染回复,体感可能要延迟两三秒,而桌面端在本地完成解析和大部分逻辑处理,只有调用大模型的那一步才走网络,整体响应比云端方案快一大截。实测下来,同样一段消息,本地处理加上模型推理,首字出现时间比云端中转缩短了差不多一半。

第三个理由是成本。桌面端可以充分依赖本机算力,很多轻量任务可以直接用本地小模型兜底,重活再走云端大模型 API,这样每个月的 API 账单能压到很低的水平。如果全放云服务器,光是大模型 API 调用加服务器带宽,一个月的开销就能抵得上桌面端方案好几个月。

2. 桌面端 Claw 的框架设计与核心机制

2.1 整体架构速览

整个 Claw 桌面端架构可以拆成三层。最底层是本地基础服务层,负责消息入口、配置管理、日志记录和桌面端常驻进程;中间是语义处理层,负责把从微信复制过来的原始文本做清洗、意图识别、实体提取、知识库检索;最上面是应用层,提供热键交互、悬浮窗面板、回复建议展示和任务提醒登记。

消息入口这块我采用了一个很朴素的机制:Claw 常驻在系统托盘,我只需要在微信里复制目标消息,然后按下预设的热键(我用的是 Ctrl+Shift+C),Claw 会自动读取剪贴板内容,把文本送入语义处理管道。整个过程不需要读取微信窗口内容,也不需要任何权限注入,微信那边根本感知不到 Claw 的存在。这条路径虽然简单,但它是整个方案安全的基石:所有数据流动都是“我主动操作”触发的,Claw 只是一个被动的助手。

2.2 核心模块逐个说明

语义处理管道是 Claw 的大脑,也是我当时花最多时间调试的部分。它内部按顺序做了四件事:文本清洗、意图分类、上下文拼接、生成建议。

文本清洗解决的是微信复制文本经常带乱七八糟格式的问题。比如聊天消息里的换行符、多余空格、引用块标记、表情符号,这些如果不处理就直接丢给模型,会显著干扰回复质量。我的处理方式是先用正则做一轮基础清洗,再根据场景判断是否需要保留原文格式。比如对方发来一段代码,清洗时就不能粗暴删掉换行和缩进,否则代码就没法看了。

意图分类把消息归到几个固定类别里:需要回复的对话、需要记录的待办、需要查询的知识、需要翻译的文本、需要摘要的长文、其他。分类准确率直接影响后续流程,我实测用一个小型的本地分类模型来做粗分类,准确率可以稳定在 85% 以上,剩下拿不准的再抛给大模型二次判断。这个“先用小模型兜底,再用大模型兜精”的做法,既省钱又省时间。

上下文拼接是决定回复质量的关键。单看一条消息很多时候不知道该怎么回,比如朋友突然发一句“那个文件你看到了吗”,如果没有任何上下文,Claw 只能瞎猜。我的做法是在本地维护一个轻量级的近期会话上下文缓存,按联系人和时间维度组织,每次处理消息时自动带上最近的几条相关记录,再让模型基于完整上下文生成建议。这里要注意控制上下文窗口大小,我一般取最近 6 到 8 条,太长既费 token,也容易把模型的注意力带偏。

2.3 数据与隐私边界

这个方案里我最在意的是数据边界,所以特意多做了一层设计:所有经过 Claw 处理的微信消息文本,都被记录在本地 SQLite 数据库里,只保留最近 30 天,超过时限自动清理。模型调用方面,我做了两层策略:遇到只涉及本机知识库的问题,优先走本地向量检索加本地小模型回答,全程不出本机;遇到需要通用常识或复杂推理的,才走云端大模型 API,并且在配置里强制开启内容过滤与日志关闭选项。

另外我在设计时没有加入任何“自动发送”能力。Claw 生成回复建议之后,必须由我手动复制并粘贴到微信里发出。这个看起来是“功能缺失”,其实是我刻意在边界上踩了刹车:自动发送意味着 Claw 有了代表我对外发言的能力,一旦模型输出失准或者上下文理解偏差,发出去的错误消息很难撤回。手动确认只多花一秒,但能挡住绝大多数潜在事故。

3. 环境准备与本地部署实操

3.1 硬件与软件需求

先交代我的运行环境,方便你对照配置。我用的是一台普通的 Windows 11 笔记本,16GB 内存,CPU 是常见的标压处理器,没有独立显卡。整套 Claw 跑起来,空闲时内存占用大约 800MB 左右,处理单条消息时峰值内存会到 1.5GB 上下,这个负载对大多数近几年的电脑都没有压力。如果你电脑内存低于 8GB,建议把本地向量检索的索引规模调小,或者干脆关闭本地模型,只用 API 模式。

软件依赖方面,核心需要 Python 3.10 或更高版本。我用的是 3.11,原因是有几个数据处理库在 3.11 上表现最稳,而且对 Windows 的兼容性比 3.12 好。还需要一个本地运行环境管理工具来装依赖,这里用常规的虚拟环境方案就行。桌面端常驻服务我是用 Python 写的一个轻量进程,配合系统自带的计划任务实现开机自启。

3.2 完整安装步骤

第一步,先确认 Python 版本。打开命令行窗口,输入python --version,看到 3.10 以上再继续。如果版本太低,建议直接到官网下载新版本安装,安装时记得勾选“Add Python to PATH”。

第二步,创建虚拟环境并激活。我习惯在项目根目录下执行:

mkdir claw cd claw python -m venv .venv .venv\Scripts\activate

激活成功后,命令行提示符前面会出现(.venv)标记,说明环境已经就位。

第三步,安装依赖。我的依赖清单非常简单,核心就是请求库、文本处理库和向量检索库,全部装在 requirements.txt 里。提供一个可以直接照抄的版本:

fastapi==0.110.0 uvicorn==0.29.0 requests==2.31.0 openai==1.30.0 jieba==0.42.1 langchain==0.2.5 langchain-community==0.2.5 chromadb==0.5.3 pyyaml==6.0.1 pystray==0.19.5 Pillow==10.3.0 keyboard==0.13.5

执行pip install -r requirements.txt,等它跑完。这里提醒两句:Windows 上装 keyboard 库需要管理员权限注册全局热键,所以后面启动 Claw 时我通常用管理员身份运行命令行;如果安装过程报编译错误,多半是你的 Python 版本和某个库不兼容,优先检查版本号而不是硬装。

第四步,拉取 Claw 项目代码。我在本地用的是一个自己维护的私有仓库,克隆到项目目录后,核心文件结构长这样:

claw/ ├── config.yaml ├── claw_service.py ├── processor.py ├── vector_store.py ├── local_model.py ├── requirements.txt └── logs/

其中claw_service.py是入口服务,负责常驻和热键监听;processor.py是语义处理管道;vector_store.py管理本地知识库索引;local_model.py封装本地小模型调用。这些文件加起来不到两千行,改动起来很灵活。

第五步,初始化配置。把config.yaml里的模型 API 地址和密钥填好,再指定知识库目录。我的配置文件长这样:

service: host: 127.0.0.1 port: 7456 hotkey: ctrl+shift+c log_level: info model: provider: openai api_base: https://your-api-endpoint/v1 api_key: sk-your-key-here default_model: gpt-4o-mini temperature: 0.7 max_tokens: 1024 local_model: enabled: true model_path: ./models/qwen2-1.5b-instruct context_window: 2048 vector_store: persist_dir: ./data/knowledge_db chunk_size: 512 chunk_overlap: 64

注意api_base这里我写的是通用占位地址,你需要替换成自己实际使用的兼容接口地址。hotkey键位也可以按习惯改成别的,但建议避开输入法冲突的键位组合,我试过 Ctrl+Space 会和中英文切换冲突,后来才换成 Ctrl+Shift+C。

第六步,初始化本地知识库。这一步只在你需要让 Claw 回答你的私人资料时才有必要。我把个人文档、工作笔记等目录里的文本文件统一放到./data/documents下,然后执行索引构建命令:

python vector_store.py --build-index

建索引的过程会对每个文档做分段切块、向量化并写入 ChromaDB。我这边总的文档量不大,大约几百份文本,跑完不到一分钟。如果你有大几百 MB 的资料,建议把chunk_size从 512 调到 768,能减少检索时的零散片段,但也会让单次检索的返回量变大。

3.3 首次启动与验证

配置完成后,启动 Claw 服务:

python claw_service.py

看到终端打印出“Claw service is running, press Ctrl+Shift+C to activate”就说明服务已经就位。然后做一个最快验证:在微信里随便打开一个聊天窗口,复制一条消息,按热键,Claw 的面板应该会在屏幕中央弹出,展示它清洗后的文本、识别的意图,以及生成的回复建议。

如果按了热键没反应,先看终端有没有报错。最常见的坑有三个:一是 keyboard 库没有管理员权限,此时热键不会被注册;二是热键和其他软件冲突;三是剪贴板里没有文本内容,导致 Claw 拿到空数据直接忽略。逐个排查,基本一分钟内能定位。

4. 接入之后的完整实操流程

4.1 第一次联调:从复制消息到生成回复

我拿一个真实例子完整走一遍流程。某天同事在微信里给我发了一段长消息,大意是“上次说的那个数据分析报告,我改完第三版了,但图表部分有几处数据对不上,你帮我看看表格里的统计口径是不是有问题,另外报告里引用的那份客户名单数据源麻烦确认一下是不是最新的”。

按照我的操作习惯,我先在微信里用鼠标选中这条消息,按 Ctrl+C 复制,然后按 Ctrl+Shift+C 呼出 Claw。Claw 面板出现后,左侧显示的是清洗后的消息原文,右侧是它的处理结果。这一步大概等了两秒,它给出的意图分类是“需要回复的对话”,并提取出几个关键实体:报告版本、图表数据问题、统计口径、客户名单数据源。然后它基于本地知识库检索,把我之前整理的“数据统计口径规范”文档片段当上下文,生成了这样一段回复建议:

“报告第三版的图表问题我已经看到了。关于统计口径,需要先确认你用的是订单金额含税口径还是不含税口径,两版差异会导致汇总数对不上。客户名单数据源我这边最新版本是上周五更新的,建议你在报告里标注数据截止日期为上周五。”

这段建议的逻辑基本正确,口径问题也确实是那类报告最常见的坑。我稍微调整了一下措辞,把它缩短了一点,然后粘贴到微信里发出。这个流程从复制到发出,总共花了不到 20 秒。如果没有 Claw,我可能要先翻之前写过的规范文档、回忆数据源的更新时间、组织语言,三分钟打底。这个对比是我决定把这套方案长期用下去的直接原因。

另一个高频场景是待办登记。微信里经常会收到类似“下周三之前把测试环境的账号权限整理一份清单出来”这种指令,以前我靠脑子记,经常漏。现在 Claw 会先识别成“需要记录的待办”,然后自动解析出日期“下周三”、任务“整理测试环境账号权限清单”,并把提醒登记到一个本地待办文件里。我只需要看一眼确认无误,不用手动复制粘贴到日历,回头同步到正式日历就行。

4.2 高频场景的调参心得

跑了一个多月,我总结出几个影响体验最明显的参数,这里直接给出我的推荐值。

模型选择方面,日常回复建议我推荐用中等规模的通用模型,便宜而且速度快;只有当消息本身比较复杂,比如需要做长文摘要、代码解释或者多步推理时,才手动切换到更强大的模型。Claw 的配置支持按不同意图分别指定模型,我把“摘要”和“代码理解”两类指向了更强模型,其余全部默认走通用模型,这样既保质量又控成本。

温度参数temperature我最终定在 0.7。太低会导致回复过于保守死板,像机器人念台词;太高又容易自由发挥过头。0.7 是一个折中值,实测在中文对话里表现最自然。

上下文窗口长度context_window我保持 2048 不动的另一个原因,是本地小模型在更长上下文下性能衰减很厉害。如果你用的是纯云端 API 方案,可以适当放宽到 4096,但代价是单次请求的延迟和费用都上去了。这里没有绝对最优,只有基于自己使用节奏的平衡。

知识库切块参数chunk_size和chunk_overlap我用了 512 和 64。这个组合在检索召回率和生成质量之间比较均衡。如果知识库里文档结构非常统一,比如全是表格型数据,可以把chunk_overlap调小到 32,减少冗余;如果文档是长段落叙述为主,overlap调大到 128 会更连贯。我最初用 256 的切块,结果发现检索出来的片段经常把一句话从中间截断,模型拿到的上下文是残的,生成质量明显下降,后来改成 512 才好。

5. 常见问题与排查实录

5.1 运行期典型问题速查

这套方案我跑了一个多月,日志里积累了不少问题,挑几个最有代表性的列出来。

第一个问题:热键偶尔失灵,重按一次又好了。这个多半是键盘监听库在高负载时的通病,比如刚开完视频会议、系统还在后台跑大任务时更容易发生。我的解决办法是在代码里做了一层热键重注册机制:每 5 分钟检查一次热键是否仍然有效,失效就自动重新注册。加了这层之后,失灵概率大大降低。如果你不想改代码,最简单的替代方案是把 Claw 加进系统计划任务,每两小时重启一次服务,代价是重启期间热键会中断几秒。

第二个问题:生成的回复里出现中文乱码,尤其是引用了本地知识库内容之后。一开始我以为是模型问题,后来排查发现根因是文本格式不一致——微信复制出来的内容有时是 UTF-8,有时带 BOM 头,本地文档里还有 GBK 编码的老笔记,混合进上下文后模型直接懵了。解决方法是入口统一做编码检测和转码,全部规范成 UTF-8 再进模型。这个坑提醒我,中文处理场景下编码问题永远值得优先排查。

第三个问题:本地向量检索总是查不到内容,Claw 回答“没有找到相关资料”。排查后确认是索引目录和检索目录不一致——我建索引时用的是一个目录,后来整理文件把知识库挪了位置,导致索引还在但指向的路径已经不存在。ChromaDB 在索引路径失效时不会报错,只是默默返回空结果,所以这个问题隐蔽性很强。建议每次搬家或手动清理目录后,重新执行一次建索引命令,并且查看启动日志里的vector store loaded字段是否显示正确路径。

第四个问题:API 密钥写在配置文件里,不小心提交到自己的远程仓库了。这个属于安全疏忽,好在发现得早。如果你也遇到,建议立刻到服务商后台重置密钥,然后在配置文件的密钥字段引用环境变量,而不是明文。例如把api_key改成api_key: ${CLAW_API_KEY},再在系统环境变量里维护真实值,这样即使代码仓库泄露,密钥也不会直接暴露。

第五个问题:服务长时间挂机后内存占用缓慢上涨。Claw 的常驻进程每处理一条消息都会往 SQLite 写日志,但日志连接没有及时关闭,导致连接泄漏,内存越堆越高。我的修复方案是在每次写入后强制关闭连接,并为日志文件做了按天轮转。如果你也遇到类似的内存缓慢增长,先查日志写入和数据库连接这类基础资源管理,十有八九是这里的问题。

第六个问题:模型请求偶尔超时,Claw 卡在“生成中”状态。排查看是默认的超时时间只有 30 秒,但某些复杂消息加上上下文拼接后,模型推理时间会超过这个阈值。我把请求超时改成了 60 秒,并且增加了超时后自动降级到本地小模型的逻辑。实测降级后虽然回复质量会差一些,但至少不会让整个流程卡死。

5.2 日志与调试技巧

Claw 的日志文件位于./logs/claw.log,默认记录 INFO 级别的运行信息。排查问题时我习惯先用--debug参数重启服务,把日志级别提到 DEBUG,这样能看到每一步处理的详细耗时和完整输入输出。日志每行都带时间戳,可以按时间点来对问题定位。我处理上述热键问题时,就是看到 DEBUG 日志里“global hotkey registered”反复出现,才发现是热键重注册机制在循环触发。

调试还有一个很实用的技巧:Claw 面板上有个“显示原始文本”开关,打开之后可以看到消息进入管道之前的样子。很多看似是模型理解错的问题,其实是文本清洗阶段破坏了信息,对照原始文本一眼就能看出来。比如有一次模型一直把“周五”理解成“下周五”,我看原始文本才发现消息里写的是“本周五”,是清洗阶段的正则把“本周”两个字误删了。这种问题如果不看原始文本,排查方向会偏到模型调参上,浪费时间。

6. 一点使用心得与边界提醒

6.1 什么样的人适合自己接入

这套桌面端 Claw 方案不一定适合所有人,但如果你符合下面几种情况,我建议试一试。

第一种是你每天有大量微信消息中需要提炼信息、整理待办、查找过往资料,但又不放心把账号交给任何第三方机器人托管。Claw 的“辅助”定位正好匹配这种需求,它不主动发消息,不参与群聊,不代替你对外发言,所有对外动作都是你本人的操作。第二种是你有一定的命令行基础,能接受自己改配置、看日志、调参数。Claw 毕竟是一个本地服务,不是装完就能用的开箱产品,遇到问题需要你有基本的排错能力。第三种是你对隐私敏感,希望所有数据尽量留在本地,不愿意为了便利把整个聊天记录上传到某个云平台。

反过来,如果你需要的是“7x24 全天候自动回复客户消息”这类功能,我的方案不适用,也不建议你用任何个人微信接入方案去做。这类需求应该走正规的客服平台工具,而不是拿个人微信来扛。

6.2 我自己的使用习惯与边界

用得久了我反而越来越克制。最开始我什么都想让 Claw 处理,后来发现过度依赖会让自己的判断力变钝。现在我设了几条铁律:涉及重要决策的对话,Claw 的回复建议只当作参考,必须自己重新判断;涉及敏感信息的消息,我会手动在面板上关掉上下文引用,避免其他无关内容被带进去;每天定时清理 Claw 的待办登记,把真正要跟进的任务同步到正式工具里,Claw 的本地记录只作为中转,不作为长期存储。

这套桌面端 Claw 个人微信接入方案,技术难度不算高,真正值钱的是把“接入”这件事想清楚了:不碰协议、不碰账号安全、不越界代替人做决定,把辅助做到极致。我实际用下来的体感是,它未必能帮你省下惊天动地的时间,但在那些零碎的“复制一条消息、想一下怎么回、回头还要记个待办”的场景里,一天积累下来真的能省出将近一个小时。这种细水长流的收益,恰恰是这类方案最打动我的地方。

如果你已经准备动手,建议先从最简配开始:只开热键呼出和回复建议两个功能,别一上来就接知识库、接本地模型。先把主链路跑顺,再逐层加能力,每一步都能看到稳定收益,后面遇到问题也好定位。我当初就是贪多,第一版就上了全套,结果连续两天都在排查知识库索引问题,连最基础的回复建议都没验证明白。少做一点,先走通,这比我写出来的任何配置参数都重要。

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

计划进化史:从全量文档到数据驱动的活系统

过去十年,我一直在跟“计划”这件事较劲。从最初靠一份全量计划文档撑起整个项目,到后来反复强调滚动计划、迭代节奏和数据预测,planning的演进几乎就是现代协作方式变迁的一个缩影。这篇文章想给你一个全景式的回望:十年前的计划…

作者头像 李华
网站建设 2026/10/18 19:07:33

BrowserSkill:基于CDP的浏览器CLI自动化框架

1. 项目概述:BrowserSkill 是什么,它解决的到底是什么问题?BrowserSkill 这个名字乍一看像某个新出的浏览器插件,或者某个 Chrome 扩展的代号,但其实它根本不是插件,也不是图形界面工具。它是一个面向开发者…

作者头像 李华
网站建设 2026/10/18 19:05:32

超实用!Dify 快速接入本地 MCP 服务:把 endpoint 改到 TaoToken

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

作者头像 李华
网站建设 2026/10/18 19:01:57

解析器框架实战:用omniparser-starter-py跑通多格式数据解析

简介:面向Python初学者与数据分析入门者的数据解析练习包,围绕“Omniparser”这个测试驱动任务,需要编写解析器来读取TXT、JSON、CSV等不同格式的数据文件。资源共包含20个文件,压缩包大小7.32MB:7个Python脚本定义了股…

作者头像 李华
网站建设 2026/10/18 18:58:12

Lumerical Python API 全流程实战:从建模到参数扫描的自动化指南

简介:面向光子学、光电工程及相关交叉领域研发人员的 Lumerical Python API 入门源码包,重点解决使用 Python 驱动 Lumerical 求解器时的环境搭建、命令调用与数据交互难题。资源内含 3 个文件,分别为可运行的脚本源码、离线的 HTML 说明页面…

作者头像 李华
网站建设 2026/10/18 18:54:39

HC32系列J-Flash烧录指南:算法配置与量产脚本全攻略

简介:面向华大HC32系列单片机开发者的J-Link补丁包,专门解决J-Flash软件无法识别华大芯片、无法下载Hex文件的问题。安装补丁后,开发者可在J-Flash软件中直接看到并选择HC32L110、HC32F003、HC32F19X等常见型号,一键完成程序烧录&…

作者头像 李华