跳到主要内容云端 OpenClaw 浏览器自动化:WebTop + Tailscale 实战部署 | 极客日志Shell / BashAI大前端
云端 OpenClaw 浏览器自动化:WebTop + Tailscale 实战部署
针对云端 OpenClaw 无头浏览器无法应对反爬及验证码的问题,采用 WebTop 与 Tailscale 组合方案。通过 LinuxServer.io 的 WebTop 镜像配合 Tailscale 私有网络,实现持久化 Cookie、人工接管及生产级稳定性。方案包含详细的 Docker Compose 配置、端口转发优化及 Watchdog 监控机制,解决了 Chromium 133+ 绑定问题及浏览器假死情况。实测表明该方案能有效绕过反爬策略,支持本地 OpenClaw 通过 CDP 远程控制云端真实桌面浏览器,适用于 AI Agent 自动化任务。
奇形怪状3 浏览 云端 OpenClaw 浏览器自动化:WebTop + Tailscale 实战部署
浏览器是网络世界的入口
对于云端部署的 OpenClaw,最大的痛点在于浏览器没有显示界面。这会对浏览器自动化操作产生很大影响。
刷知乎、小红书、推特或 Reddit 时,传统的 Headless(无头)浏览器几乎过不了人机验证,也很容易卡在扫码登录界面。云服务器没有显示器,你连验证码长什么样都看不到,更别提接管操作了。
那么,有没有一种优雅的姿势,让云端的 OpenClaw 拥有一个'有血有肉'的真实桌面浏览器?既能保留 Cookie 环境,又能在遇到验证码时,让你通过浏览器随时远程人工接管。
经过多次测试与验证,我跑通了 WebTop + Tailscale 方案,成功在谷歌、知乎、小红书等平台实现了流畅访问。从此访问网页畅通无阻,它甚至还能自己去搜索想了解的事物。
实测环境说明
- 服务器: Oracle Cloud(新加坡区 Free Tier)4C CPU / 24GB 内存
- 网络: SCP 速度约 1.5~2 MB/s,Ping 延迟 400ms
远程桌面在人工接管时会感觉偏卡,好在 OpenClaw 自己通过 CDP 调用浏览器是本机通讯,不吃公网带宽,因此不会拖慢自动化性能。如果你把 WebTop 跑在离自己更近的 VPS(或本地超微机),延迟和带宽体验都会好很多。
下面所有参数都基于这台机器调出来的'高配方案',如果你的资源更紧张(比如 2C4G 或 2C8G),记得在部署前对照文中的可调项做减法,确保 CPU、内存、带宽都匹配自己的上限。
OpenClaw 需要什么样的浏览器环境
为了发挥 OpenClaw 最大的潜力,它需要一个真实的桌面浏览器环境,就像一个入职公司的正式员工,在自己的工位,用着 Chrome 浏览网页。
这个诉求再拆解一下:
- 抗反爬:避免网站风控秒封
- 浏览状态持久化:记住登录状态、浏览历史、Cookie
- 人工接管:遇到登录/验证码可以人工介入
把这个需求喂给 AI 之后,首先了解到一个叫 Xvfb 的工具,它可以在服务器端为浏览器虚拟一个显示器,基本满足上面的诉求。不过我并没有止步于此,继续探索有没有其他方案。
最后拿到四种候选方案,本质上都是在 Xvfb 上做了不同程度的封装:
- Xvfb + noVNC: 自己直接配置 Xvfb,这是最原始的组合
- WebTop: LinuxServer.io 维护的 Docker 镜像,提供完整的 Linux 桌面环境,也内置浏览器。底层仍是 Xvfb,但做了完善封装,内存占用多一点,却换来稳定性和更简单的配置。无需客户端,浏览器即可访问远程桌面。
- Selenium Chrome: 官方 Selenium 浏览器镜像 + VNC,运行在 Docker 中的 Selenium + Chrome 调试环境,通过 Xvfb 虚拟显示服务器
- Playwright + xvfb: 最轻量,但需手动配置 VNC
虽然 WebTop 内存占用更高,但稳定性、反爬效果、接管体验、配置流程都优秀得多,所以建议选 WebTop。
理由:
- 我的机器内存充足(24GB)(建议不少于 4G)
- 人工接管体验最佳(完整桌面,可装扩展/调试工具)
- 维护成本最低(Docker Compose 一键管理)
- 稳定性最好(LinuxServer.io 持续维护)
下面是详细对比参考表格:
| 维度 | Xvfb + noVNC | WebTop ⭐ | Selenium Chrome | Playwright + xvfb |
|---|
| 内存占用 | ~250MB | ~600MB |
| 网络(人工接管) | 中(VNC) | 中(VNC) | 中(VNC) | 中(VNC,需配置) |
| 安装复杂度 | ⭐⭐⭐⭐ 复杂 | ⭐ 简单 | ⭐⭐ 较简单 | ⭐⭐⭐ 中等 |
| 维护复杂度 | ⭐⭐⭐⭐ 复杂 | ⭐ 简单 | ⭐⭐ 较简单 | ⭐⭐⭐ 中等 |
| 人工接管 | Web VNC | 完整桌面 | Web VNC | 需额外配置 |
| 接管体验 | ⭐⭐⭐ 一般 | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐⭐ 一般 | ⭐⭐ 差 |
| 反爬效果 | ⭐⭐⭐⭐ 好 | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐ 差 | ⭐⭐⭐ 一般 |
| 稳定性 | ⭐⭐⭐ 中等 | ⭐⭐⭐⭐ 自动化稳定 | ⭐⭐⭐⭐ 好 | ⭐⭐⭐ 中等 |
- 内存占用:Selenium 包含 fluxbox + Xvfb + noVNC + supervisord,实际占用约 450MB
- 网络(自动化):OpenClaw 通过 CDP 控制,所有方案带宽占用一致且很低
- 网络(人工接管):通过 VNC 传输屏幕图像,带宽占用中等(~1-5Mbps)
- OpenClaw 性能:CDP 不经过桌面环境,所有方案性能基本一致(差异<5%)
- 反爬效果:WebTop 提供真实桌面环境,反爬效果最佳;Selenium 包含
navigator.webdriver 等自动化指纹,容易被识别
- 稳定性:WebTop 适合人工接管场景,Selenium 适合纯自动化场景
最终架构
选定方案之后,我又为了稳定和安全加上了 Tailscale 私有网络、Watchdog 监控等配套组件,让远程桌面浏览器具备生产级可靠性。
- WebTop (Chromium) - 持久化浏览器,Cookie/Session 永久保留
- socat 端口转发 - 解决 Chromium 133+ 强制绑定 127.0.0.1 的问题
- Tailscale - 私有网络,无需公网端口
- Watchdog - 监控 CDP 端口,浏览器 freeze 时自动重启(<3 秒恢复)
- Docker Healthcheck - 容器健康监控
┌──────────────┐ │ Local PC │ └──────┬───────┘ │ ┌──────▼───────┐ │ Tailscale │ (私有网络) └──────┬───────┘ │ (3000/3001) ▼ ┌─────────────────────────────────────────────┐ │ Oracle Cloud VPS │ │ │ │ ┌──────────────┐ │ │ │ OpenClaw │ │ │ └──────┬───────┘ │ │ │ CDP (127.0.0.1:9222) │ │ ▼ │ │ ┌────────────────────────┐ │ │ │ WebTop Container │◄─────────────────┘ │ │ (XFCE Desktop) │ │ │ │ │ │ │ │ ├─ socat :9222 │ │ │ │ │ └─> 127.0.0.1:9223│ │ │ │ └─ Chromium :9223 │ │ │ │ │ │ │ │ Watchdog Supervisor │ │ │ └────────────────────────┘ │ └─────────────────────────────────────────────┘
- socat 监听 0.0.0.0:9222,转发到 Chromium 的 127.0.0.1:9223
- Watchdog 只重启浏览器进程,不重启整个容器
- 桌面环境保持运行,Cookie/Session 不丢失
- 解决浏览器 freeze(进程存在但 CDP 无响应)问题
- Healthcheck 仅用于容器状态监控,实际恢复由 Watchdog 完成
- ✅ shm_size: 4GB(共享内存)
- ✅ mem_limit: 8GB(内存限制)
- ✅ cpus: 2.5(CPU 限制)
- ✅ disk-cache-size: 512MB(磁盘缓存)
- ✅ max-old-space-size: 4GB(V8 堆内存)
如果你是 2C4G/2C8G 等轻量实例,可以把 mem_limit 下调到 4GB、cpus 限制到 1.5,并酌情调小 disk-cache-size。唯一的前提是要保证 shm_size ≥ 2GB,否则 Chromium 很容易崩。所有这些参数都写在 docker-compose 里,实际部署前最好根据机器规格复核一遍。
| 档位 | CPU / RAM | 适用场景 | 备注 |
|---|
| 最低可用 | 2C / 4GB | 纯自动化 + 偶尔人工接管 | mem_limit≈4GB,cpus≤1.5,shm_size 保持 2GB; |
| 建议标准 | 4C / 16GB+ | 稳定生产/推荐标准 | mem_limit≈6-8GB,cpus≈2-3,shm_size≈2-4GB 文章示例所用配置,足够支撑多标签、长时间持久化 |
既然要用 OpenClaw,就别把它当一个'聊天机器人'糊弄过去。太低配的云主机只能让你卡着干着急——与其在 2C2G 上耗时间,不如直接上够用的规格,把 OpenClaw 当成真正的提效助手,认真投入一次。
如何配置
这份教程不是'照着 README 抄一遍',而是我在 Oracle Cloud 4C24G 机器上连续调试、反复验证之后沉淀下来的生产级实践。这里的每个参数都有出处:要么是官方最佳实践,要么是我真实环境量出来的稳定值。
你完全可以把这份步骤交给自己的 AI 去执行,但务必要结合你机器的 CPU/内存/带宽,把 cpus、mem_limit、shm_size、PASSWORD 等可调项提前改好。
确认过硬件和网络都扛得住之后,就可以按照下面的步骤一步步来。
第一步:搭建 Tailscale 私有网络
1. VPS 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
复制终端输出的 https://login.tailscale.com/... 链接,在本地浏览器授权登录。
2. 获取 Tailscale IP
记录输出的 IP(如 100.10.20.30),后续用 $TS_IP 表示。
3. 本地安装 Tailscale
在本地电脑安装 Tailscale 客户端,登录同一账号。
第二步:部署 Docker 环境
1. 安装 Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
2. 创建项目目录
mkdir -p /opt/openclaw-browser && cd /opt/openclaw-browser
3. 创建浏览器启动脚本(带 Watchdog + socat 端口转发)
cat > browser-launcher.sh <<'EOF'
export DISPLAY=${DISPLAY:-:1}
while ! xdpyinfo >/dev/null 2>&1; do sleep 1
done
echo "[$(date)] X server ready, using DISPLAY=$DISPLAY"
echo "[$(date)] Browser Supervisor 启动,监控 CDP 端口..."
start_cdp_proxy() {
pkill -f "socat.*TCP-LISTEN:9222" 2>/dev/null
socat TCP-LISTEN:9222,fork,reuseaddr TCP:127.0.0.1:9223 &
SOCAT_PID=$!
echo "[$(date)] CDP 代理已启动 (9222 -> 9223)"
}
while true; do
echo "[$(date)] 清理锁文件..."
rm -f /browser-data/Singleton*
echo "[$(date)] 启动 Chromium (端口 9223)..."
chromium-browser \
--user-data-dir=/browser-data \
--remote-debugging-port=9223 \
--remote-debugging-address=127.0.0.1 \
--remote-allow-origins="*" \
--no-sandbox \
--disable-gpu \
--disable-software-rasterizer \
--disable-features=VizDisplayCompositor \
--disable-blink-features=AutomationControlled \
--disable-crash-reporter \
--disable-breakpad \
--hide-crash-restore-bubble \
--restore-last-session \
--disable-features=TranslateUI \
--no-first-run \
--disable-background-timer-throttling \
--disable-renderer-backgrounding \
--disable-backgrounding-occluded-windows \
--disable-ipc-flooding-protection \
--password-store=basic \
--disk-cache-size=536870912 \
--max-old-space-size=4096 &
BROWSER_PID=$!
start_cdp_proxy
while kill -0 $BROWSER_PID 2>/dev/null; do
sleep 15
if ! curl -sf http://localhost:9222/json/version >/dev/null 2>&1; then
echo "[$(date)] 浏览器无响应,正在重启..."
kill -TERM $BROWSER_PID 2>/dev/null
sleep 2
kill -KILL $BROWSER_PID 2>/dev/null
kill -9 $SOCAT_PID 2>/dev/null
sleep 2
break
fi
done
echo "[$(date)] 浏览器已停止,3 秒后重启..."
sleep 3
done
EOF
chmod +x browser-launcher.sh
4. 创建 Docker Compose 配置
cat > docker-compose.yml <<'EOF'
services:
webtop:
image: lscr.io/linuxserver/webtop:ubuntu-xfce
container_name: openclaw-browser
security_opt:
- seccomp:unconfined
environment:
- PUID=1001
- PGID=1001
- TZ=Asia/Shanghai
- CUSTOM_USER=oclaw
- DOCKER_MODS=linuxserver/mods:universal-package-install
- INSTALL_PACKAGES=socat
- SELKIES_ENABLE_HTTPS=false
volumes:
- ./config:/config
- ${HOME}/workspace/webtop-browser-data:/browser-data
- ./browser-launcher.sh:/config/scripts/browser-launcher.sh:ro
- ./config/custom-cont-init.d:/custom-cont-init.d:ro
ports:
- "${TAILSCALE_IP}:3000:3000"
- "${TAILSCALE_IP}:3001:3001"
- "127.0.0.1:9222:9222"
shm_size: "4gb"
mem_limit: "8gb"
cpus: "2.5"
ulimits:
nofile:
soft: 65536
hard: 65536
tmpfs:
- /tmp:size=1g
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:9222/json/version >/dev/null"]
interval: 15s
timeout: 5s
retries: 3
start_period: 30s
EOF
5. 创建环境变量文件
TAILSCALE_IP=$(tailscale ip -4)
cat > .env <<EOF
TAILSCALE_IP=${TAILSCALE_IP}
EOF
- VNC 端口(3000/3001)绑定到 Tailscale IP,只能通过 Tailscale 网络访问
- 已禁用密码认证,通过 Tailscale 私有网络保护访问安全,如需密码可在 docker-compose.yml 中设置
- CDP 端口(9222)绑定到 127.0.0.1,本地 OpenClaw 直接访问
- 浏览器数据目录:
$HOME/workspace/webtop-browser-data(需提前创建)
- 如果 Tailscale IP 变化,需要更新 .env 并重启容器
6. 配置浏览器自启动
- ✅ 使用 custom-cont-init.d:容器初始化时后台启动,避免 s6 服务管理问题
- ✅ s6-setuidgid abc:以 abc 用户运行浏览器,解决 X11 认证问题(root 无法显示窗口到 abc 的桌面)
- ✅ 后台启动 (&):避免阻塞容器启动流程
mkdir -p config/custom-cont-init.d
cat > config/custom-cont-init.d/01-start-browser <<'EOF'
(
while ! command -v socat >/dev/null 2>&1; do sleep 2
done
exec s6-setuidgid abc /config/scripts/browser-launcher.sh
) &
EOF
chmod +x config/custom-cont-init.d/01-start-browser
7. 创建浏览器数据目录
mkdir -p $HOME/workspace/webtop-browser-data
8. 启动容器
cd /opt/openclaw-browser && docker compose up -d
docker compose logs -f
等待 30 秒,看到 'Browser Supervisor 启动' 日志即成功。
docker exec openclaw-browser curl -sf http://localhost:9222/json/version
第三步:OpenClaw 配置
在 OpenClaw 配置文件中浏览器配置里添加 webtop,并设为默认:
{
"browser": {
...
"defaultProfile": "webtop",
"profiles": {
"webtop": {
"cdpUrl": "http://127.0.0.1:9222",
"color": "#00AA00"
}
}
}
}
如果你还没有配置过浏览器,你可以直接复制我的配置:
{
"browser": {
"enabled": true,
"headless": false,
"noSandbox": true,
"attachOnly": false,
"defaultProfile": "webtop",
"profiles": {
"openclaw": {
"cdpPort": 18800,
"color": "#FF4500"
},
"webtop": {
"cdpUrl": "http://127.0.0.1:9222",
"color": "#00AA00"
}
}
}
}
配置参数说明
环境变量 (.env)
| 参数 | 默认值 | 说明 | 可修改 |
|---|
TAILSCALE_IP | 可选设置 | Tailscale 私有网络 IP | tailscale 私有网络和密码保护至少选一项 |
WEBTOP_PASSWORD | 未设置 | 远程桌面登录密码(可选) | ✅ 如需密码保护可添加 |
Docker Compose 配置
| 参数 | 默认值 | 说明 | 可修改 |
|---|
CUSTOM_USER | claw | 远程桌面用户名 | ✅ 可自定义 |
TZ | Asia/Shanghai | 容器时区 | ✅ 可改为其他时区 |
PUID/PGID | 1001 | 容器内用户 ID | ⚠️ 需与宿主机匹配,终端输入 id 查询 |
shm_size | 4gb | 共享内存大小 | ✅ 可根据需求调整 |
ulimits.nofile | 65536 | 文件描述符限制 | ✅ 可根据需求调整 |
tmpfs | /tmp:size=1g | 临时文件系统 | ✅ 可根据需求调整 |
- VNC 端口(3000/3001)绑定到 Tailscale IP,只能通过 Tailscale 网络访问
- 默认无密码认证,通过 Tailscale 私有网络保护
- CDP 端口(9222)绑定到 127.0.0.1,供本地 OpenClaw 连接,不建议修改
- 浏览器数据目录:
$HOME/workspace/webtop-browser-data 可自己修改
- 当前配置:无需密码,直接访问即可(通过 Tailscale 私有网络保护)
- 如需启用密码保护:
- 重启容器:
docker compose restart
- 在
.env 文件中添加:WEBTOP_PASSWORD=your_secure_password_here
- 在
docker-compose.yml 中取消注释 PASSWORD 行:- PASSWORD=${WEBTOP_PASSWORD:-ChangeMe123!}
本地如何连接远程浏览器验证
这一步我们要在本地访问远程机器的浏览器,验证它是否稳定启动。
首先获取远程机的私有网络地址(也可以直接在 Tailscale 客户端里看到):
然后在本地浏览器访问 https://<Tailscale_IP>:3001。
没关系,这是因为 WebTop 强制启用 HTTPS,但证书是自签名的,不被浏览器信任。
稍等片刻,就能看到远程浏览器已经打开。我习惯把谷歌设为主页,这里截图来自我用 iPad 访问的场景 —— 浏览器里的浏览器,挺像套娃😁,也可以直接在里面做搜索。
也就是说无论你到哪里,只要能上网,随时可以查看云端龙虾的浏览器状态。
不用担心浏览器异常退出,我写了监控脚本,每 15 秒检测一次状态;一旦崩溃会立刻重启。可以手动关掉浏览器,等 15 秒左右就会自动恢复。
OpenClaw 实操
经过我实测,OpenClaw 原生的 CDP 控制太差了,速度比较慢,截图总是截长图(似乎是个 bug: Screenshots capture full page instead of viewport by default)。
所以这里我建议安装 Agent Browser 技能包。Agent Browser 是 Vercel 用 Rust 写的浏览器自动化工具,定位准、速度快,也更省 token。
Agent Browser 支持通过 --cdp 9222 连接 webtop 已有的 Chromium 进行工作。安装完技能,可以把上句加黑的文字发给龙虾并让他写入 TOOLS.md。
这样 OpenClaw 就拥有了自己的桌面浏览器。
比如总结博客内容的时候可以直接要求它截取文章中的关键数据表格,作为文章配图或者校验 AI 总结的数据准确性。
AI 热点监控的时候,比如 Midjourney V8 发布了,它不仅给我了内容要点,还发了几张参考图。
温馨提示:登录账号可以先使用小号尝试,避免账号被封。虽然该方案已经是云端浏览器自动化的最优解。
不过其实我们手动登录就行了,这里只是测试一下浏览器的能力。因为让它登个小红书其实花费了半个小时才登陆上,一方面中转站的 api 太慢了,另一方面浏览器自动化还需要和虾一起打磨打磨。
另外提一下前两天 Google 发布的 Chrome DevTools MCP 工具,全网都在爆吹,不过这对云端的龙虾来说并没有做任何改善,只是利好本地 OpenClaw。因为该工具只是提供操控浏览器的接口,并不改变浏览器本身的状态,该工具的运行还是建立在 CDP 接口的基础上。但是有了 WebTop 就不一样了,OpenClaw 天然拥有完全属于自己的桌面浏览器,并且与用户看到的是共享的。
也就是说在 Chrome DevTools MCP 工具发布之前,本地 OpenClaw 要与用户共享浏览器需要安装插件,而之后只需要开放开发者调试接口,不需要安装插件。而对于云端 OpenClaw,我们安装的 WebTop 解决了一切问题,浏览器天然属于共享状态。
在我写这篇文章的时候,Browser Use 刚巧上线了'直连 CDP'能力,可以通过 --cdp-url http://localhost:9222 指定 cdp 接口。详细可参考 Browser Use CLI。
browser-use --cdp-url http://localhost:9222 open https://example.com
官方也强调,这条路径就是为第三方云浏览器或自建实例准备的,只要你的浏览器通过 WebSocket 暴露了 CDP,就能被 Browser Use 驱动。而官方的更新也进一步验证了'真实桌面 + 持久化 CDP'的方案越来越成为 Agent 操纵浏览器重要的一部分。
其实通过最近 Chrome DevTools MCP 工具的发布,Browse Use 新增对 CDP 直连的支持,我们可以发现通过 CDP 端口直接控制浏览器会越来越成为主流。因为这样 Agent 不仅能控制本地电脑的真实浏览器,还能连接远程浏览器,也可以让云端 Agent 连接类似 webtop 这一类的浏览器。在 openclaw 的 browser 文档里其实有推荐云端浏览器 Browserbase,其中的控制方式就是通过 CDP。也就是说,文档里描述的 webtop 方案是自己在服务器配置的,如果你不想配,你可以在云端浏览器提供商购买服务,它会给你开放一个浏览器实例,这个浏览器实例和服务器之间的控制方案就是 CDP 协议。
我在 openclaw 里面一开始配置 Agent Browser 也是因为它原生支持 CDP 模式。不过现在 Browse Use 也支持了,后面可以尝试一下。
FAQ
Q: 想启用密码或公网访问?
A: 默认依赖 Tailscale 隐私网络,不开放公网端口。如果必须暴露公网,务必在 docker-compose 里启用 PASSWORD 并配置强口令,同时建议套上一层 Cloudflare Tunnel / Caddy 做额外认证。
Q: 远程桌面很卡怎么办?
A: 文中示例的 VPS 在新加坡,我本人在国内,因此 SCP 只有 1.5~2 MB/s、延迟 400ms。人工接管时确实会感觉卡顿,但 OpenClaw 自动化走本地回环,速度不受影响。可以优先选择距离自己更近的节点(本地 NUC、同城云厂商等)
Q: Tailscale IP 改了无法访问?
A: 重新执行 tailscale ip -4,把新 IP 写入 .env 或直接更新 docker-compose 的 TAILSCALE_IP 环境变量,然后 docker compose down && docker compose up -d 即可。
Q: 浏览器启动失败 / 无法打开新标签?
A: 99% 是共享内存不足,确认 shm_size 至少 2GB,低配机器也不要低于 2048m;若系统 RAM 只有 4GB,最好把其它容器停掉。
参考链接
相关免费在线工具
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online