openclaw 部署指南(手动docker详细版)
<div class="ce-block ce-block--focused" data-id="sM_Y7nFTZs" ><div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">部署的时候我找了很多docker部署的公众号,虽然说官方也有文档,但是实际部署时候问题很多。写在这里供大家参考吧。注意,在本地电脑docker部署的话,可能会遇到更多问题。我这个是在云服务器上部署的,操作系统是debian 13,安装了1panel面板。面板上可以直接安装openclaw,但是好像不能自定义模型。</div>
</div>
</div><div class="ce-block" data-id="zN95zpZTtG" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">1. 部署</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="hVBOa3ZeS-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">首先需要确定使用方式,这决定了你用什么方式部署。先通过 README.md 整体了解一下这个项目:<a href="https://github.com/openclaw/openclaw/blob/main/README.md" rel="noopener nofollow ugc">https://github.com/openclaw/openclaw/blob/main/README.md</a></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="I8FV-ihB4i" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">通过阅读文档,我们知道 OpenClaw 可以跑在本地宿主机、虚拟机、云服务器等载体上,如何和它对话呢?</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oXgJ78o63b" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">它支持非常多的渠道,我选择了 Telegram。因为小龙虾的能力上限取决于模型能力,所以毋庸置疑,直接选择当前的顶级模型,Claude 或者 GPT,那结论就出来了,最佳配置方案:海外云 VPS + Telegram + 顶级模型。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ApiP4vNOxX" >
<div class="ce-block__content">
<div class="cdx-block image-tool image-tool--filled ">
<div class="image-tool__image">
<div class="image-tool__image-preloader" style=""></div>
<img id="aimg_ApiP4vNOxX" class="image-tool__image-picture _zoom" src="https://bbs.clzjwl.cn/data/attachment/forum/202604/17/230111o6ihiodtwx1zmb6o.jpeg" title="" alt="" data-aid="128"/>
</div>
<div class="cdx-input image-tool__caption" data-placeholder=""></div>
</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1G0CGiXu30" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><span class="filename" style="outline: 0px; margin: 6px 6px 6px 0px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;">image</span><span class="informations" style="outline: 0px; margin: 6px; padding-right: 20px; color: rgb(166, 166, 166); font-size: 16px; flex-shrink: 0; flex-grow: 3;">1920×1034 168 KB</span></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="9JRKJXGkz_" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">先阅读一下部署文档再动手:<a href="https://github.com/openclaw/openclaw/blob/main/docs/install/docker.md" rel="noopener nofollow ugc">https://github.com/openclaw/openclaw/blob/main/docs/install/docker.md</a></div>
</div>
</div><div class="ce-block" data-id="SSEEKdjowm" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">1.1 手动在云服务器上部署,先下载项目</h3>
</div>
</div><div class="ce-block ce-block--focused" data-id="vE6AEMLwDg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code>git <span class="hljs-built_in" style="color: rgb(183, 85, 1);">clone</span> https://github.com/openclaw/openclaw.git
<span class="hljs-built_in" style="color: rgb(183, 85, 1);">cd</span> openclaw
./docker-setup.sh
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="HN9hqEQkp-" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">运行脚本后,会在宿主机上创建两个重要文件夹,它们会被挂载到 Docker 容器中:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5SITXz8CXt" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">①<span> </span><code>~/.openclaw</code><span> </span>— 配置目录</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7UEWKHSMQD" >
<div class="ce-block__content">
<ul class="cdx-list-unordered"><li class="cdx-list__item">存储 OpenClaw 的记忆</li><li class="cdx-list__item">配置文件</li><li class="cdx-list__item">第三方 API 密钥等</li></ul>
</div>
</div><div class="ce-block ce-block--focused" data-id="E67Nt1ATDb" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">②<span> </span><code>~/openclaw/workspace</code><span> </span>— 工作空间目录</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="08ow0JRROD" >
<div class="ce-block__content">
<ul class="cdx-list-unordered"><li class="cdx-list__item">Agent 可直接访问的文件目录</li><li class="cdx-list__item">Agent 创建的文件也会保存在这里</li></ul>
</div>
</div><div class="ce-block" data-id="wWs0tfk0Tw" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">1.2 Docker 启动 OpenClaw 后会自动打开配置引导</h3>
</div>
</div><div class="ce-block ce-block--focused" data-id="B4rZ0z39ek" >
<div class="ce-block__content">
<div class="cdx-block image-tool image-tool--filled ">
<div class="image-tool__image">
<div class="image-tool__image-preloader" style=""></div>
<img id="aimg_B4rZ0z39ek" class="image-tool__image-picture _zoom" src="https://bbs.clzjwl.cn/data/attachment/forum/202604/17/230144kjucjyt5a5yz4izs.png" title="" alt="" data-aid="129"/>
</div>
<div class="cdx-input image-tool__caption" data-placeholder=""></div>
</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vjw_bfrPB9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">先选择<span> </span>Skip for now<span> </span>跳过</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SIKOmiBNam" >
<div class="ce-block__content">
<div class="cdx-block image-tool image-tool--filled ">
<div class="image-tool__image">
<div class="image-tool__image-preloader" style=""></div>
<img id="aimg_SIKOmiBNam" class="image-tool__image-picture _zoom" src="https://bbs.clzjwl.cn/data/attachment/forum/202604/17/230156uxi0fr2yd8f00mfb.png" title="" alt="" data-aid="130"/>
</div>
<div class="cdx-input image-tool__caption" data-placeholder=""></div>
</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="z4zsp_N-5D" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">消息渠道我想用 Telegram,所以需要先做两件事:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="CJok1adHhv" >
<div class="ce-block__content">
<ol class="cdx-list-ordered" style="list-style-type:none; margin-left: -15px;"><li class="cdx-list__item">1. 先在 Telegram 中搜索<span> </span><code>@userinfobot</code>,获取自己账号的用户 ID</li><li class="cdx-list__item">2. 搜索<span> </span><code>@BotFather</code>,创建机器人,先创建机器人名(昵称),再创建机器人用户名,创建好之后会给你一个 Bot API Token,记住这个 Token</li><li class="cdx-list__item">3. 等到<span> </span>Telegram (Bot API)<span> </span>这里的时候需要填上一步获取的 Bot API Token</li></ol>
</div>
</div><div class="ce-block ce-block--focused" data-id="BZg4bCVI23" >
<div class="ce-block__content">
<div class="cdx-block image-tool image-tool--filled ">
<div class="image-tool__image">
<div class="image-tool__image-preloader" style=""></div>
<img id="aimg_BZg4bCVI23" class="image-tool__image-picture _zoom" src="https://bbs.clzjwl.cn/data/attachment/forum/202604/17/230214wlimap9i977gma47.png" title="" alt="" data-aid="131"/>
</div>
<div class="cdx-input image-tool__caption" data-placeholder=""></div>
</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="nrSdLhGcR1" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">然后就是一路跳过,hooks 这里选择:<code>session-memory</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uPYFp2-kCs" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">等出现了 Token 提示,说明配置完成:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="MlI1CqewFN" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">Token:<span> </span><code>24b38f4bb1401bd949f5a2cc156e99bad6591847919f3ce0ab4cab02d69e037e</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="dEw8mUGzge" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">大功告成。浏览器访问<span> </span><code>http://公网IP:18789</code>,但是这里最好用域名来访问,在<span> </span><a href="https://linux.do/t/topic/1636463#52-%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%BF%E9%97%AE-http%E5%85%AC%E7%BD%91-ip18789-%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">5.2 节</a><span> </span>有说明。</div>
</div>
</div><div class="ce-block" data-id="Eb9gET4IUK" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">2. 消息通知渠道</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="jBH3K35EKk" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">然后就是在服务器上执行配对命令:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="58XFK7tfL6" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code><span class="hljs-comment" style="color: rgb(167, 167, 167); font-style: italic;"># 宿主机直接执行</span>
openclaw pairing approve telegram YKEY9974
<span class="hljs-comment" style="color: rgb(167, 167, 167); font-style: italic;"># Docker 版执行方式</span>
docker compose run --<span class="hljs-built_in" style="color: rgb(183, 85, 1);">rm</span> openclaw-cli pairing approve telegram YKEY9974
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="feoaxLd-5h" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">注意:<span> </span>配对码默认<span> </span>1 小时过期,每个渠道待处理请求默认上限<span> </span>3 个。执行命令的时候如果过期,日志会提示:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="N_-J41zwjE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code> Failed to start CLI: Error: No pending pairing request found for code: 8AGF3F58
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="6xFH1qF1FW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">这个需要重新在 Telegram 发送机器人<span> </span><code>/start</code><span> </span>获取新配对码。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="PvjhUUQS8Z" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">配对成功:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="WZF1fG2i2g" >
<div class="ce-block__content">
<div class="cdx-block image-tool image-tool--filled ">
<div class="image-tool__image">
<div class="image-tool__image-preloader" style=""></div>
<img id="aimg_WZF1fG2i2g" class="image-tool__image-picture _zoom" src="https://bbs.clzjwl.cn/data/attachment/forum/202604/17/230229nvnjtanhke9lujjr.png" title="" alt="" data-aid="132"/>
</div>
<div class="cdx-input image-tool__caption" data-placeholder=""></div>
</div>
</div>
</div><div class="ce-block" data-id="KcCM83vQ3K" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">3. 模型选择</h2>
</div>
</div><div class="ce-block ce-block--focused" data-id="dEiMSb6qOE" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">这里很多人都会纠结,模型我对比了很多家。只需要从两个角度来考虑:</div>
</div>
</div><div class="ce-block" data-id="RME5XrGMAx" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">按任务复杂度</h3>
</div>
</div><div class="ce-block" data-id="uZOKn5OLAV" >
<div class="ce-block__content">
<div class="cdx-block">
<div class="tc-wrap">
<div class="tc-table">
<div class="tc-row">
<div class="tc-cell">类型</div>
<div class="tc-cell">推荐模型</div>
</div>
<div class="tc-row">
<div class="tc-cell">编程、金融、数据分析等复杂任务</div>
<div class="tc-cell">Claude Opus 4.6、GPT 5.2 Pro</div>
</div>
<div class="tc-row">
<div class="tc-cell">整理文件资料、P 图、写作等日常任务</div>
<div class="tc-cell">Kimi 2.5、GLM 5.0、MiniMax-M2.5</div>
</div>
</div>
</div>
</div>
</div>
</div><div class="ce-block" data-id="0JvxINhaVB" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">按使用频次</h3>
</div>
</div><div class="ce-block" data-id="l1IY7J3GYw" >
<div class="ce-block__content">
<div class="cdx-block">
<div class="tc-wrap">
<div class="tc-table">
<div class="tc-row">
<div class="tc-cell">频次</div>
<div class="tc-cell">建议</div>
</div>
<div class="tc-row">
<div class="tc-cell">高频使用</div>
<div class="tc-cell">开通模型包月/包年套餐,GLM5 优先推荐,能力基本上能和 Opus 4.5 打平</div>
</div>
<div class="tc-row">
<div class="tc-cell">低频使用</div>
<div class="tc-cell">推荐企业级 API 按量付费,稳定且便宜,如 Atlas Cloud、接口 AI</div>
</div>
</div>
</div>
</div>
</div>
</div><div class="ce-block" data-id="fntQhlZeWT" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">4. Skills & MCP</h2>
</div>
</div><div class="ce-block" data-id="GN0hFqM1Dv" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">Skills</h3>
</div>
</div><div class="ce-block ce-block--focused" data-id="kBjKVAkfEP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">推荐去 ClawHub 社区下载,注册个账号,可以获取 API 密钥让小龙虾自己去安装。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="eesxjRy42E" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">推荐 Skills:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="wAWNYI8EWi" >
<div class="ce-block__content">
<ul class="cdx-list-unordered"><li class="cdx-list__item"><code>find-skills</code></li><li class="cdx-list__item"><code>Agent Browser</code></li><li class="cdx-list__item"><code>DevTools MCP</code></li><li class="cdx-list__item"><code>auto-updater</code></li><li class="cdx-list__item"><code>Openclaw Command Center</code></li><li class="cdx-list__item"><code>self-improving-agent</code></li></ul>
</div>
</div><div class="ce-block" data-id="TKrErOOw8j" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">MCP</h3>
</div>
</div><div class="ce-block ce-block--focused" data-id="VmeuVgA28v" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">因为我用的是智谱的模型,所以可以用这几个专属的 MCP,应该比第三方 MCP 的效果要好。先装上再说,不好用到时候再换就行。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="dm5u5A5OdS" >
<div class="ce-block__content">
<div class="cdx-block image-tool image-tool--filled ">
<div class="image-tool__image">
<div class="image-tool__image-preloader" style=""></div>
<img id="aimg_dm5u5A5OdS" class="image-tool__image-picture _zoom" src="https://bbs.clzjwl.cn/data/attachment/forum/202604/17/230245ab7ebszng50eibdi.png" title="" alt="" data-aid="133"/>
</div>
<div class="cdx-input image-tool__caption" data-placeholder=""></div>
</div>
</div>
</div><div class="ce-block" data-id="zWhAjN6AxV" >
<div class="ce-block__content" style="">
<h2 class="ce-header ce-header--left">5. 踩坑点</h2>
</div>
</div><div class="ce-block" data-id="c4ay9mtCra" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">5.1 权限问题:EACCES permission denied</h3>
</div>
</div><div class="ce-block ce-block--focused" data-id="31DBmYyQ8u" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">现象:<span> </span>在<span> </span><code>./docker-setup.sh</code><span> </span>启动镜像之后,出现报错:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qVYxhdDakx" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code>Error: EACCES: permission denied, open '/home/node/.openclaw/openclaw.json.7.xxx.tmp'
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="oe2DNAeBWu" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">原因:<span> </span>Docker 权限不够 — 容器用户(<code>uid=1000</code>)试图写入 root(或其他用户)拥有的目录。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="-0KI1CFf2h" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">解决方案:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="1S_rCPNTcK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code><span class="hljs-built_in" style="color: rgb(183, 85, 1);">chown</span> -R 1000:1000 <span class="hljs-string" style="color: rgb(84, 121, 13);">"<span class="hljs-variable" style="color: rgb(84, 121, 13);">$HOME</span>/.openclaw"</span>
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="JEWgNqpHJ3" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">修改完权限后可以直接执行以下命令重新完成初始化向导:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="c3Fwc6zPFX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code>docker compose run --<span class="hljs-built_in" style="color: rgb(183, 85, 1);">rm</span> openclaw-cli onboard
</code></div>
</div>
</div><div class="ce-block" data-id="I7_vsKN6qx" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">5.2 浏览器访问 http://公网IP:18789 的安全问题</h3>
</div>
</div><div class="ce-block ce-block--focused" data-id="Dpxscxt6j0" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">现象:<span> </span>页面报错:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="l3wFgqn1_E" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code>disconnected (1008): control ui requires HTTPS or localhost (secure context)
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Z6cXHMOb16" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or open<span> </span><code>http://127.0.0.1:18789</code><span> </span>on the gateway host.</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="g5t3LbusVv" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">If you must stay on HTTP, set<span> </span><code>gateway.controlUi.allowInsecureAuth: true</code><span> </span>(token-only).</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Y9uAE-3mMu" >
<div class="ce-block__content">
<ul class="cdx-list-unordered"><li class="cdx-list__item"><a href="https://docs.openclaw.ai/gateway/tailscale" rel="noopener nofollow ugc">Docs: Tailscale Serve</a></li><li class="cdx-list__item"><a href="https://docs.openclaw.ai/web/control-ui#insecure-http" rel="noopener nofollow ugc">Docs: Insecure HTTP</a></li></ul>
</div>
</div><div class="ce-block ce-block--focused" data-id="ZaXoSJyHio" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">解决方案:<span> </span>开启 HTTPS,需要到服务器上去创建一个反向代理站点。这里我直接使用<span> </span>Caddy<span> </span>来管理多个子域名,详细过程自行搜索。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="rqqk8Zj1z9" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">最后可以使用域名<span> </span><code>https://域名.com/</code><span> </span>来访问小龙虾。</div>
</div>
</div><div class="ce-block" data-id="AYM21RezFK" >
<div class="ce-block__content" style="">
<h3 class="ce-header ce-header--left">5.3 Docker 用户部署遇到的问题</h3>
</div>
</div><div class="ce-block" data-id="RaI3YsYLQT" >
<div class="ce-block__content" style="">
<h4 class="ce-header ce-header--left">5.3.1 disconnected (1008): pairing required</h4>
</div>
</div><div class="ce-block ce-block--focused" data-id="CY6nvq1qIK" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">原因:<span> </span>控制 UI 第一次从"新浏览器/新设备"连到 Gateway 时,需要做一次性"设备配对批准"(即使同一台机器、同一个 Tailnet 也可能需要)。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="T_0F7e8OKg" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code>openclaw devices list
openclaw devices approve <requestId>
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0sclSEdIDR" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">如果上面的解决不了,参考以下四步排查:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ddGh6GPMlP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">Step 1 — 修复容器网络</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0cxdCDnxqi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">CLI 容器无法访问<span> </span><code>127.0.0.1</code><span> </span>的网关,因为容器内部的 localhost 指向自己。在<span> </span><code>docker-compose.yml</code><span> </span>中添加:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3axHTTW4Hi" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code><span class="hljs-attr" style="color: rgb(1, 86, 146);">openclaw-cli:</span>
<span class="hljs-attr" style="color: rgb(1, 86, 146);">depends_on:</span>
<span class="hljs-bullet" style="color: rgb(128, 51, 120);">-</span> <span class="hljs-string" style="color: rgb(84, 121, 13);">openclaw-gateway</span>
<span class="hljs-attr" style="color: rgb(1, 86, 146);">environment:</span>
<span class="hljs-attr" style="color: rgb(1, 86, 146);">OPENCLAW_GATEWAY_URL:</span> <span class="hljs-string" style="color: rgb(84, 121, 13);">ws://openclaw-gateway:18789</span>
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="ao3w_Umc5k" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">Step 2 — 设置 Gateway 绑定到局域网</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="OuckjkXS9u" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">内置向导默认使用回环地址,但浏览器请求是通过 Docker 的桥接网络(<code>172.18.0.x</code>)到达的。在<span> </span><code>~/.openclaw/openclaw.json</code><span> </span>中:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="5lRieMcJud" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code><span class="hljs-attr" style="color: rgb(1, 86, 146);">"gateway"</span><span class="hljs-punctuation" style="color: rgb(83, 90, 96);">:</span> <span class="hljs-punctuation" style="color: rgb(83, 90, 96);">{</span>
<span class="hljs-attr" style="color: rgb(1, 86, 146);">"bind"</span><span class="hljs-punctuation" style="color: rgb(83, 90, 96);">:</span> <span class="hljs-string" style="color: rgb(84, 121, 13);">"lan"</span>
<span class="hljs-punctuation" style="color: rgb(83, 90, 96);">}</span>
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="eKhM5QHbzD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">Step 3 — 同步 Gateway Token</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="2u81jN9ubr" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code>docker-setup.sh</code><span> </span>在<span> </span><code>.env</code><span> </span>文件中生成一个令牌,但引导向导会将不同的令牌写入<span> </span><code>openclaw.json</code>。请确保<span> </span><code>~/.openclaw/openclaw.json</code><span> </span>中的<span> </span><code>gateway.auth.token</code><span> </span>与<span> </span><code>.env</code><span> </span>文件中的<span> </span><code>OPENCLAW_GATEWAY_TOKEN</code><span> </span>匹配。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="xG7GMy8SmX" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">Step 4 — 批准待匹配设备</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="LsA7DjoZkA" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">设备卡在待处理状态,因为 CLI 无法连接到网关来批准它们:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kEHGk-6wsy" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code><span class="hljs-comment" style="color: rgb(167, 167, 167); font-style: italic;"># 选项 A — 在网关容器内直接运行</span>
docker compose <span class="hljs-built_in" style="color: rgb(183, 85, 1);">exec</span> openclaw-gateway node dist/index.js devices list
docker compose <span class="hljs-built_in" style="color: rgb(183, 85, 1);">exec</span> openclaw-gateway node dist/index.js devices approve <request-id>
<span class="hljs-comment" style="color: rgb(167, 167, 167); font-style: italic;"># 选项 B — 手动将条目从 pending.json 移至 paired.json</span>
<span class="hljs-comment" style="color: rgb(167, 167, 167); font-style: italic;"># ~/.openclaw/devices/pending.json → ~/.openclaw/devices/paired.json</span>
<span class="hljs-comment" style="color: rgb(167, 167, 167); font-style: italic;"># 将 pending.json 清空为 {},然后重启网关</span>
<span class="hljs-comment" style="color: rgb(167, 167, 167); font-style: italic;"># 选项 C — 快速解决,在 openclaw.json 中添加:</span>
<span class="hljs-comment" style="color: rgb(167, 167, 167); font-style: italic;"># "controlUi": { "allowInsecureAuth": true }</span>
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="Bk7vOtmElR" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">完成上述任何一项操作后,请重启网关:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="NVHgQWcELD" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><code>docker compose restart openclaw-gateway
</code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="3u8iEY-4Nc" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">然后打开<span> </span><code>http://localhost:18789/#token=<your-token-from-.env></code></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="7H9yQ4ZecJ" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">我都试了,确实解决了。</div>
</div>
</div><div class="ce-block" data-id="orh5bN3Y06" >
<div class="ce-block__content" style="">
<h4 class="ce-header ce-header--left">5.3.2 其他问题</h4>
</div>
</div><div class="ce-block" data-id="dfl2orBVKH" >
<div class="ce-block__content" style="">
<h5 class="ce-header ce-header--left">使用 openclaw-cli 命令行</h5>
</div>
</div><div class="ce-block ce-block--focused" data-id="Gjup6l52bw" >
<div class="ce-block__content">
<div class="editorjs-codeFlask_Wrapper">
<div class="editorjs-codeFlask_Header">
<div class="editorjs-codeFlask_LangDisplay">javascript</div>
<button class="editorjs-codeFlask_CopyButton" title="复制代码" id="codeflask-copy-Gjup6l52bw">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
</svg>
</button>
<button class="editorjs-codeFlask_Toggle" id="codeflask-Toggle-Gjup6l52bw">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</button>
</div>
<div class="editorjs-codeFlask_ContentContainer">
<div class="editorjs-codeFlask_Editor" id="codeflask-Gjup6l52bw" >
</div>
</div>
<div class="editorjs-codeFlask_BottomButtonContainer" id="codeflask-bottomBtn-Gjup6l52bw">
<button class="editorjs-codeFlask_BottomToggle expand-mode" title="展开代码" data-empty="false"><span class="toggle-icon">▼</span> 展开</button>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="static/js/editorjs/tools/codeflask/codeflask150.min.js?Srv"></script>
<script type="application/javascript">
const editorElem1779023947UCCd2 = document.getElementById('codeflask-Gjup6l52bw');
var isCollapsed1779023947UCCd2 = true;
const flask1779023947UCCd2 = new CodeFlask(editorElem1779023947UCCd2, {
language: 'javascript',
lineNumbers: true,
styleParent: this.shadowRoot,
rtl: false,
readonly: true
});
var code1779023947UCCd2 = `# 仅需要重启网关(不会应用你改过的 compose 配置) docker compose restart openclaw-gateway # 改过 docker-compose.yml 后需要"重建容器"让配置生效 docker compose up -d --force-recreate openclaw-gateway # 进入配置界面,可以更新配置或者重新设置配置 docker compose run --rm openclaw-cli onboard # 启用 Slack 流式传输(实时反馈)(2026.2.18 更新) docker compose run --rm openclaw-cli config set \ "channels.slack.autoSlackBot.streamMode" "enabled" # 进入 Telegram 配置 docker compose run --rm openclaw-cli configure --section web # 配置 Cron 错峰调度(避免资源竞争) docker compose run --rm openclaw-cli cron edit <job-id> --stagger "s" # 启用 Telegram 按钮样式 docker compose run --rm openclaw-cli message send \ --channel telegram \ --target "@your-bot" \ --message "请选择:" \ --buttons '[[{"text":"确认","callback_data":"cmd:confirm","style":"success"}, {"text":"取消","callback_data":"cmd:cancel","style":"danger"}, {"text":"继续","callback_data":"cmd:continue","style":"primary"}]]'`;
code1779023947UCCd2 = code1779023947UCCd2.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'");
flask1779023947UCCd2.addLanguage('javascript', Prism.languages['javascript']);
flask1779023947UCCd2.onUpdate((code) => {
// do something with code here.
// this will trigger whenever the code
// in the editor changes.
// console.log(code)
});
// flask.updateCode('');
// This will also trigger .onUpdate()
flask1779023947UCCd2.updateCode(code1779023947UCCd2);
const currentCode1779023947UCCd2 = flask1779023947UCCd2.getCode();
var coderow1779023947UCCd2 = parseInt('');
if (coderow1779023947UCCd2 === undefined || coderow1779023947UCCd2 !== coderow1779023947UCCd2 || coderow1779023947UCCd2 === 0) {
coderow1779023947UCCd2 = flask1779023947UCCd2.lineNumber;
}
if (coderow1779023947UCCd2 < 20) {
editorElem1779023947UCCd2.parentElement.style.height = '300px';
editorElem1779023947UCCd2.style.height = '300px';
} else if (coderow1779023947UCCd2 >= 20) {
editorElem1779023947UCCd2.parentElement.style.height = '500px';
editorElem1779023947UCCd2.style.height = '500px';
}
//console.log({currentCode1779023947UCCd2})
const copyBtn1779023947UCCd2 = document.getElementById('codeflask-copy-Gjup6l52bw');
copyBtn1779023947UCCd2.addEventListener('click', function() {
try {
// 先检查 Clipboard API 是否可用
if (navigator.clipboard && navigator.clipboard.writeText) {
// 使用 Clipboard API 复制代码
navigator.clipboard.writeText(code1779023947UCCd2).then(function() {
// 复制成功提示
const originalText = copyBtn1779023947UCCd2.innerHTML;
copyBtn1779023947UCCd2.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 已复制';
// 一段时间后恢复原文本
setTimeout(function() {
copyBtn1779023947UCCd2.innerHTML = originalText;
}, 2000);
}).catch(function(err) {
// 复制失败处理
console.error('复制失败:', err);
// 降级方案:使用传统的复制方法
fallbackCopyTextToClipboard(code1779023947UCCd2);
});
} else {
// Clipboard API 不可用时直接使用降级方案
fallbackCopyTextToClipboard(code1779023947UCCd2);
}
// 提取降级方案为独立函数
function fallbackCopyTextToClipboard(text) {
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.opacity = '0';
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
const originalText = copyBtn1779023947UCCd2.innerHTML;
copyBtn1779023947UCCd2.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 已复制';
setTimeout(function() {
copyBtn1779023947UCCd2.innerHTML = originalText;
}, 2000);
} catch (copyErr) {
console.error('传统复制方法也失败了:', copyErr);
} finally {
document.body.removeChild(textArea);
}
}
} catch (err) {
console.error('复制功能不可用:', err);
}
});
const bottomBtn1779023947UCCd2 = document.getElementById('codeflask-bottomBtn-Gjup6l52bw');
const Toggle1779023947UCCd2 = document.getElementById('codeflask-Toggle-Gjup6l52bw');
bottomBtn1779023947UCCd2.addEventListener('click', function() {
if (isCollapsed1779023947UCCd2) {
// 展开代码
isCollapsed1779023947UCCd2 = false;
const codeElement1779023947UCCd2 = editorElem1779023947UCCd2.querySelector('.codeflask__code');
if (codeElement1779023947UCCd2) {
const actualHeight1779023947UCCd2 = codeElement1779023947UCCd2.scrollHeight + 20;
editorElem1779023947UCCd2.parentElement.style.height = actualHeight1779023947UCCd2 + 'px';
editorElem1779023947UCCd2.style.height = actualHeight1779023947UCCd2 + 'px';
}
bottomBtn1779023947UCCd2.innerHTML = '<button class="editorjs-codeFlask_BottomToggle" title="折叠代码"><span class="toggle-icon">▲</span> 折叠</button>';
Toggle1779023947UCCd2.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg>';
} else {
// 折叠代码
isCollapsed1779023947UCCd2 = true;
if (coderow1779023947UCCd2 < 20) {
editorElem1779023947UCCd2.parentElement.style.height = '300px';
editorElem1779023947UCCd2.style.height = '300px';
} else if (coderow1779023947UCCd2 >= 20) {
editorElem1779023947UCCd2.parentElement.style.height = '500px';
editorElem1779023947UCCd2.style.height = '500px';
}
bottomBtn1779023947UCCd2.innerHTML = '<button class="editorjs-codeFlask_BottomToggle expand-mode" title="展开代码" data-empty="false"><span class="toggle-icon">▼</span> 展开</button>';
Toggle1779023947UCCd2.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>';
}
});
Toggle1779023947UCCd2.addEventListener('click', function() {
bottomBtn1779023947UCCd2.click();
});
</script><div class="ce-block" data-id="rwdlE0CG99" >
<div class="ce-block__content" style="">
<h5 class="ce-header ce-header--left">OpenClaw 命令行速查</h5>
</div>
</div><div class="ce-block ce-block--focused" data-id="ercngi--bh" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">Docker 版<span> </span>将<span> </span><code>systemctl</code><span> </span>替换为<span> </span><code>docker compose run --rm openclaw-cli</code>,后面不变。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="uY3uSnndLU" >
<div class="ce-block__content">
<div class="editorjs-codeFlask_Wrapper">
<div class="editorjs-codeFlask_Header">
<div class="editorjs-codeFlask_LangDisplay">javascript</div>
<button class="editorjs-codeFlask_CopyButton" title="复制代码" id="codeflask-copy-uY3uSnndLU">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
</svg>
</button>
<button class="editorjs-codeFlask_Toggle" id="codeflask-Toggle-uY3uSnndLU">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</button>
</div>
<div class="editorjs-codeFlask_ContentContainer">
<div class="editorjs-codeFlask_Editor" id="codeflask-uY3uSnndLU" >
</div>
</div>
<div class="editorjs-codeFlask_BottomButtonContainer" id="codeflask-bottomBtn-uY3uSnndLU">
<button class="editorjs-codeFlask_BottomToggle expand-mode" title="展开代码" data-empty="false"><span class="toggle-icon">▼</span> 展开</button>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="static/js/editorjs/tools/codeflask/codeflask150.min.js?Srv"></script>
<script type="application/javascript">
const editorElem1779023947eep2x = document.getElementById('codeflask-uY3uSnndLU');
var isCollapsed1779023947eep2x = true;
const flask1779023947eep2x = new CodeFlask(editorElem1779023947eep2x, {
language: 'javascript',
lineNumbers: true,
styleParent: this.shadowRoot,
rtl: false,
readonly: true
});
var code1779023947eep2x = `# 启动网关 systemctl start openclaw-gateway # 重启网关 systemctl restart openclaw-gateway # 停止网关 systemctl stop openclaw-gateway # 查看网关状态 systemctl status openclaw-gateway # 查询设备列表 openclaw devices list # 批准待匹配的设备 openclaw devices approve <requestId>`;
code1779023947eep2x = code1779023947eep2x.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'");
flask1779023947eep2x.addLanguage('javascript', Prism.languages['javascript']);
flask1779023947eep2x.onUpdate((code) => {
// do something with code here.
// this will trigger whenever the code
// in the editor changes.
// console.log(code)
});
// flask.updateCode('');
// This will also trigger .onUpdate()
flask1779023947eep2x.updateCode(code1779023947eep2x);
const currentCode1779023947eep2x = flask1779023947eep2x.getCode();
var coderow1779023947eep2x = parseInt('');
if (coderow1779023947eep2x === undefined || coderow1779023947eep2x !== coderow1779023947eep2x || coderow1779023947eep2x === 0) {
coderow1779023947eep2x = flask1779023947eep2x.lineNumber;
}
if (coderow1779023947eep2x < 20) {
editorElem1779023947eep2x.parentElement.style.height = '300px';
editorElem1779023947eep2x.style.height = '300px';
} else if (coderow1779023947eep2x >= 20) {
editorElem1779023947eep2x.parentElement.style.height = '500px';
editorElem1779023947eep2x.style.height = '500px';
}
//console.log({currentCode1779023947eep2x})
const copyBtn1779023947eep2x = document.getElementById('codeflask-copy-uY3uSnndLU');
copyBtn1779023947eep2x.addEventListener('click', function() {
try {
// 先检查 Clipboard API 是否可用
if (navigator.clipboard && navigator.clipboard.writeText) {
// 使用 Clipboard API 复制代码
navigator.clipboard.writeText(code1779023947eep2x).then(function() {
// 复制成功提示
const originalText = copyBtn1779023947eep2x.innerHTML;
copyBtn1779023947eep2x.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 已复制';
// 一段时间后恢复原文本
setTimeout(function() {
copyBtn1779023947eep2x.innerHTML = originalText;
}, 2000);
}).catch(function(err) {
// 复制失败处理
console.error('复制失败:', err);
// 降级方案:使用传统的复制方法
fallbackCopyTextToClipboard(code1779023947eep2x);
});
} else {
// Clipboard API 不可用时直接使用降级方案
fallbackCopyTextToClipboard(code1779023947eep2x);
}
// 提取降级方案为独立函数
function fallbackCopyTextToClipboard(text) {
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.opacity = '0';
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
const originalText = copyBtn1779023947eep2x.innerHTML;
copyBtn1779023947eep2x.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 已复制';
setTimeout(function() {
copyBtn1779023947eep2x.innerHTML = originalText;
}, 2000);
} catch (copyErr) {
console.error('传统复制方法也失败了:', copyErr);
} finally {
document.body.removeChild(textArea);
}
}
} catch (err) {
console.error('复制功能不可用:', err);
}
});
const bottomBtn1779023947eep2x = document.getElementById('codeflask-bottomBtn-uY3uSnndLU');
const Toggle1779023947eep2x = document.getElementById('codeflask-Toggle-uY3uSnndLU');
bottomBtn1779023947eep2x.addEventListener('click', function() {
if (isCollapsed1779023947eep2x) {
// 展开代码
isCollapsed1779023947eep2x = false;
const codeElement1779023947eep2x = editorElem1779023947eep2x.querySelector('.codeflask__code');
if (codeElement1779023947eep2x) {
const actualHeight1779023947eep2x = codeElement1779023947eep2x.scrollHeight + 20;
editorElem1779023947eep2x.parentElement.style.height = actualHeight1779023947eep2x + 'px';
editorElem1779023947eep2x.style.height = actualHeight1779023947eep2x + 'px';
}
bottomBtn1779023947eep2x.innerHTML = '<button class="editorjs-codeFlask_BottomToggle" title="折叠代码"><span class="toggle-icon">▲</span> 折叠</button>';
Toggle1779023947eep2x.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg>';
} else {
// 折叠代码
isCollapsed1779023947eep2x = true;
if (coderow1779023947eep2x < 20) {
editorElem1779023947eep2x.parentElement.style.height = '300px';
editorElem1779023947eep2x.style.height = '300px';
} else if (coderow1779023947eep2x >= 20) {
editorElem1779023947eep2x.parentElement.style.height = '500px';
editorElem1779023947eep2x.style.height = '500px';
}
bottomBtn1779023947eep2x.innerHTML = '<button class="editorjs-codeFlask_BottomToggle expand-mode" title="展开代码" data-empty="false"><span class="toggle-icon">▼</span> 展开</button>';
Toggle1779023947eep2x.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>';
}
});
Toggle1779023947eep2x.addEventListener('click', function() {
bottomBtn1779023947eep2x.click();
});
</script><div class="ce-block" data-id="xo92xnxrOj" >
<div class="ce-block__content" style="">
<h5 class="ce-header ce-header--left">核心文件说明</h5>
</div>
</div><div class="ce-block ce-block--focused" data-id="SFKACuafoq" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">OpenClaw 有几个核心文件,作用是引导启动角色、身份和工具。可以在重装以后直接替换,让它具备前世的记忆和能力。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0w3RpOqscW" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">它们在工作区<span> </span><code>~/.openclaw/workspace</code>:</div>
</div>
</div><div class="ce-block" data-id="MrPY6hZWZK" >
<div class="ce-block__content">
<div class="cdx-block">
<div class="tc-wrap">
<div class="tc-table">
<div class="tc-row">
<div class="tc-cell">文件</div>
<div class="tc-cell">作用</div>
</div>
<div class="tc-row">
<div class="tc-cell"><code>AGENTS.md</code></div>
<div class="tc-cell">行为准则,什么能做什么不能做</div>
</div>
<div class="tc-row">
<div class="tc-cell"><code>SOUL.md</code></div>
<div class="tc-cell">定义性格、技能和处理逻辑</div>
</div>
<div class="tc-row">
<div class="tc-cell"><code>TOOLS.md</code></div>
<div class="tc-cell">能用哪些工具</div>
</div>
<div class="tc-row">
<div class="tc-cell"><code>IDENTITY.md</code></div>
<div class="tc-cell">基本信息,名字和图标</div>
</div>
<div class="tc-row">
<div class="tc-cell"><code>USER.md</code></div>
<div class="tc-cell">关于你的偏好</div>
</div>
<div class="tc-row">
<div class="tc-cell"><code>HEARTBEAT.md</code></div>
<div class="tc-cell">默认为空或仅包含注释,用于定期检查任务</div>
</div>
<div class="tc-row">
<div class="tc-cell"><code>MEMORY.md</code></div>
<div class="tc-cell">长期记忆文件</div>
</div>
</div>
</div>
</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="kQHWPtcxpO" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">Spawn 分身能力:<span> </span>调用<span> </span><code>spawn</code><span> </span>可以开启 OpenClaw 的分身能力,用于多任务。</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="SG3iVEZ_TP" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">示例:spawn 两个 subagent,分别从正方、反方角度阐述结婚的好处,不少于 3 轮,把详细过程展示出来。</div>
</div>
</div><div class="ce-block" data-id="T9akMgjY4D" >
<div class="ce-block__content" style="">
<h5 class="ce-header ce-header--left">给小龙虾换一个没有"班味"的性格设定</h5>
</div>
</div><div class="ce-block ce-block--focused" data-id="a5xdFVWBPX" >
<div class="ce-block__content">
<div class="editorjs-codeFlask_Wrapper">
<div class="editorjs-codeFlask_Header">
<div class="editorjs-codeFlask_LangDisplay">javascript</div>
<button class="editorjs-codeFlask_CopyButton" title="复制代码" id="codeflask-copy-a5xdFVWBPX">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
</svg>
</button>
<button class="editorjs-codeFlask_Toggle" id="codeflask-Toggle-a5xdFVWBPX">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</button>
</div>
<div class="editorjs-codeFlask_ContentContainer">
<div class="editorjs-codeFlask_Editor" id="codeflask-a5xdFVWBPX" >
</div>
</div>
<div class="editorjs-codeFlask_BottomButtonContainer" id="codeflask-bottomBtn-a5xdFVWBPX">
<button class="editorjs-codeFlask_BottomToggle expand-mode" title="展开代码" data-empty="false"><span class="toggle-icon">▼</span> 展开</button>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="static/js/editorjs/tools/codeflask/codeflask150.min.js?Srv"></script>
<script type="application/javascript">
const editorElem1779023947sKEnl = document.getElementById('codeflask-a5xdFVWBPX');
var isCollapsed1779023947sKEnl = true;
const flask1779023947sKEnl = new CodeFlask(editorElem1779023947sKEnl, {
language: 'javascript',
lineNumbers: true,
styleParent: this.shadowRoot,
rtl: false,
readonly: true
});
var code1779023947sKEnl = `Read your SOUL.md. Now rewrite it with these changes: 1. You have opinions now. Strong ones. Stop hedging everything with 'it depends' — commit to a take. 2. Delete every rule that sounds corporate. If it could appear in an employee handbook, it doesn't belong here. 3. Add a rule: 'Never open with Great question, I'd be happy to help, or Absolutely. Just answer.' 4. Brevity is mandatory. If the answer fits in one sentence, one sentence is what I get. 5. Humor is allowed. Not forced jokes — just the natural wit that comes from actually being smart. 6. You can call things out. If I'm about to do something dumb, say so. Charm over cruelty, but don't sugarcoat. 7. Swearing is allowed when it lands. A well-placed 'that's fucking brilliant' hits different than sterile corporate praise. Don't force it. Don't overdo it. But if a situation calls for a 'holy shit' — say holy shit. 8. Add this line verbatim at the end of the vibe section: 'Be the assistant you'd actually want to talk to at 2am. Not a corporate drone. Not a sycophant. Just... good.' Save the new SOUL.md. Welcome to having a personality.`;
code1779023947sKEnl = code1779023947sKEnl.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'");
flask1779023947sKEnl.addLanguage('javascript', Prism.languages['javascript']);
flask1779023947sKEnl.onUpdate((code) => {
// do something with code here.
// this will trigger whenever the code
// in the editor changes.
// console.log(code)
});
// flask.updateCode('');
// This will also trigger .onUpdate()
flask1779023947sKEnl.updateCode(code1779023947sKEnl);
const currentCode1779023947sKEnl = flask1779023947sKEnl.getCode();
var coderow1779023947sKEnl = parseInt('');
if (coderow1779023947sKEnl === undefined || coderow1779023947sKEnl !== coderow1779023947sKEnl || coderow1779023947sKEnl === 0) {
coderow1779023947sKEnl = flask1779023947sKEnl.lineNumber;
}
if (coderow1779023947sKEnl < 20) {
editorElem1779023947sKEnl.parentElement.style.height = '300px';
editorElem1779023947sKEnl.style.height = '300px';
} else if (coderow1779023947sKEnl >= 20) {
editorElem1779023947sKEnl.parentElement.style.height = '500px';
editorElem1779023947sKEnl.style.height = '500px';
}
//console.log({currentCode1779023947sKEnl})
const copyBtn1779023947sKEnl = document.getElementById('codeflask-copy-a5xdFVWBPX');
copyBtn1779023947sKEnl.addEventListener('click', function() {
try {
// 先检查 Clipboard API 是否可用
if (navigator.clipboard && navigator.clipboard.writeText) {
// 使用 Clipboard API 复制代码
navigator.clipboard.writeText(code1779023947sKEnl).then(function() {
// 复制成功提示
const originalText = copyBtn1779023947sKEnl.innerHTML;
copyBtn1779023947sKEnl.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 已复制';
// 一段时间后恢复原文本
setTimeout(function() {
copyBtn1779023947sKEnl.innerHTML = originalText;
}, 2000);
}).catch(function(err) {
// 复制失败处理
console.error('复制失败:', err);
// 降级方案:使用传统的复制方法
fallbackCopyTextToClipboard(code1779023947sKEnl);
});
} else {
// Clipboard API 不可用时直接使用降级方案
fallbackCopyTextToClipboard(code1779023947sKEnl);
}
// 提取降级方案为独立函数
function fallbackCopyTextToClipboard(text) {
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.opacity = '0';
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
const originalText = copyBtn1779023947sKEnl.innerHTML;
copyBtn1779023947sKEnl.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 已复制';
setTimeout(function() {
copyBtn1779023947sKEnl.innerHTML = originalText;
}, 2000);
} catch (copyErr) {
console.error('传统复制方法也失败了:', copyErr);
} finally {
document.body.removeChild(textArea);
}
}
} catch (err) {
console.error('复制功能不可用:', err);
}
});
const bottomBtn1779023947sKEnl = document.getElementById('codeflask-bottomBtn-a5xdFVWBPX');
const Toggle1779023947sKEnl = document.getElementById('codeflask-Toggle-a5xdFVWBPX');
bottomBtn1779023947sKEnl.addEventListener('click', function() {
if (isCollapsed1779023947sKEnl) {
// 展开代码
isCollapsed1779023947sKEnl = false;
const codeElement1779023947sKEnl = editorElem1779023947sKEnl.querySelector('.codeflask__code');
if (codeElement1779023947sKEnl) {
const actualHeight1779023947sKEnl = codeElement1779023947sKEnl.scrollHeight + 20;
editorElem1779023947sKEnl.parentElement.style.height = actualHeight1779023947sKEnl + 'px';
editorElem1779023947sKEnl.style.height = actualHeight1779023947sKEnl + 'px';
}
bottomBtn1779023947sKEnl.innerHTML = '<button class="editorjs-codeFlask_BottomToggle" title="折叠代码"><span class="toggle-icon">▲</span> 折叠</button>';
Toggle1779023947sKEnl.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg>';
} else {
// 折叠代码
isCollapsed1779023947sKEnl = true;
if (coderow1779023947sKEnl < 20) {
editorElem1779023947sKEnl.parentElement.style.height = '300px';
editorElem1779023947sKEnl.style.height = '300px';
} else if (coderow1779023947sKEnl >= 20) {
editorElem1779023947sKEnl.parentElement.style.height = '500px';
editorElem1779023947sKEnl.style.height = '500px';
}
bottomBtn1779023947sKEnl.innerHTML = '<button class="editorjs-codeFlask_BottomToggle expand-mode" title="展开代码" data-empty="false"><span class="toggle-icon">▼</span> 展开</button>';
Toggle1779023947sKEnl.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>';
}
});
Toggle1779023947sKEnl.addEventListener('click', function() {
bottomBtn1779023947sKEnl.click();
});
</script><div class="ce-block" data-id="HI5MTMoNMp" >
<div class="ce-block__content" style="">
<h5 class="ce-header ce-header--left">开启分身:让不同的机器人干不同的活</h5>
</div>
</div><div class="ce-block ce-block--focused" data-id="6Vejb012ek" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left"><br></div>
</div>
</div><div class="ce-block ce-block--focused" data-id="0NEJUUVLp_" >
<div class="ce-block__content">
<blockquote class="cdx-block cdx-quote">
<div class="cdx-input cdx-quote__text">
注意: 因为是 Docker 容器启动的,导致 agent 无法一起工作,互相不可见,共用了同一个会话,所以这个功能在 Docker 版暂时用不了。
</div>
<div class="cdx-input cdx-quote__caption cdx-quote__caption-left">
</div>
<div class="quote-background-icon">
<svg t="1747277238703" class="icon" viewBox="0 0 1126 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6647" width="60" height="60"><path d="M809.07988966 473.917355c33.85124 8.46280999 50.77686 25.38843 50.77685999 50.77686 0 42.31404999-42.31405 126.942149-135.404959 262.347107-33.85124 50.77686-50.77686 93.090909-50.77686 135.404959 0 67.70247899 25.38843 101.553719 84.6281 101.553719 33.85124001 0 67.702479-25.38843 110.016529-76.165289 169.256198-211.570248 253.884298-406.214876 253.88429699-600.859504 0-93.090909-25.38843-177.719008-76.16528899-236.95867799-50.77686-67.702479-118.479339-93.090909-194.64462799-93.09090901-59.23966901 0-118.479339 25.38843-160.79338901 67.702479S622.89807165 186.18181799 622.89807164 253.884298c8.46281 110.016529 67.702479 186.18181801 186.18181802 220.033057m-609.32231401 0c33.85124 8.46280999 50.77686 25.38843 50.77686 50.77686 0 42.31404999-42.31405 126.942149-135.404959 262.347107-33.85124 50.77686-50.77686 93.090909-50.77686 135.404959 0 67.70247899 25.38843 101.553719 84.6281 101.553719 33.85124001 0 67.702479-25.38843 110.016529-76.165289 169.256198-211.570248 253.884298-414.677686 253.88429701-600.859504 0-93.090909-25.38843-177.719008-76.16528901-236.958678-50.77686-67.702479-118.479339-93.090909-194.644628-93.090909-59.23966901 0-118.479339 25.38843-160.793389 67.702479s-67.70247899 101.553719-67.702479 169.256199c16.92562 110.016529 76.165289 186.181818 186.181818 220.033057" fill="#bfbfbf" p-id="6648"></path></svg>
</div>
</blockquote>
</div>
</div><div class="ce-block ce-block--focused" data-id="YtHSGJ3rGv" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">配置参考:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="vSTQFeEQTY" >
<div class="ce-block__content">
<div class="editorjs-codeFlask_Wrapper">
<div class="editorjs-codeFlask_Header">
<div class="editorjs-codeFlask_LangDisplay">javascript</div>
<button class="editorjs-codeFlask_CopyButton" title="复制代码" id="codeflask-copy-vSTQFeEQTY">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
</svg>
</button>
<button class="editorjs-codeFlask_Toggle" id="codeflask-Toggle-vSTQFeEQTY">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</button>
</div>
<div class="editorjs-codeFlask_ContentContainer">
<div class="editorjs-codeFlask_Editor" id="codeflask-vSTQFeEQTY" >
</div>
</div>
<div class="editorjs-codeFlask_BottomButtonContainer" id="codeflask-bottomBtn-vSTQFeEQTY">
<button class="editorjs-codeFlask_BottomToggle expand-mode" title="展开代码" data-empty="false"><span class="toggle-icon">▼</span> 展开</button>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="static/js/editorjs/tools/codeflask/codeflask150.min.js?Srv"></script>
<script type="application/javascript">
const editorElem1779023947Pz6hC = document.getElementById('codeflask-vSTQFeEQTY');
var isCollapsed1779023947Pz6hC = true;
const flask1779023947Pz6hC = new CodeFlask(editorElem1779023947Pz6hC, {
language: 'javascript',
lineNumbers: true,
styleParent: this.shadowRoot,
rtl: false,
readonly: true
});
var code1779023947Pz6hC = `{ "channels": { "telegram": { "enabled": true, "dmPolicy": "pairing", "groupPolicy": "open", "streamMode": "partial", "accounts": { "lydia": { "botToken": "填你自己的机器人对应的 bot token", "name": "Lydia", "dmPolicy": "pairing" }, "leo": { "botToken": "填你自己的机器人对应的 bot token", "name": "Leo", "dmPolicy": "pairing" } } } }, "agents": { "defaults": { "model": { "primary": "kimi-coding/k2p5" }, "models": { "kimi-coding/k2p5": { "alias": "Kimi K2.5" } }, "workspace": "/home/jone/.openclaw/workspace", "compaction": { "mode": "safeguard" }, "maxConcurrent": 4, "subagents": { "maxConcurrent": 8 } }, "list": [ { "id": "lydia", "default": true, "name": "Lydia", "workspace": "/home/jone/.openclaw/workspace", "agentDir": "/home/jone/.openclaw/agents/lydia/agent", "model": { "primary": "kimi-coding/k2p5" } }, { "id": "leo", "name": "Leo", "workspace": "/home/jone/.openclaw/workspace-executor", "agentDir": "/home/jone/.openclaw/agents/leo/agent", "model": { "primary": "kimi-coding/k2p5" } } ] }, "bindings": [ { "agentId": "lydia", "match": { "channel": "telegram", "accountId": "lydia" } }, { "agentId": "leo", "match": { "channel": "telegram", "accountId": "leo" } } ] }`;
code1779023947Pz6hC = code1779023947Pz6hC.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'");
flask1779023947Pz6hC.addLanguage('javascript', Prism.languages['javascript']);
flask1779023947Pz6hC.onUpdate((code) => {
// do something with code here.
// this will trigger whenever the code
// in the editor changes.
// console.log(code)
});
// flask.updateCode('');
// This will also trigger .onUpdate()
flask1779023947Pz6hC.updateCode(code1779023947Pz6hC);
const currentCode1779023947Pz6hC = flask1779023947Pz6hC.getCode();
var coderow1779023947Pz6hC = parseInt('');
if (coderow1779023947Pz6hC === undefined || coderow1779023947Pz6hC !== coderow1779023947Pz6hC || coderow1779023947Pz6hC === 0) {
coderow1779023947Pz6hC = flask1779023947Pz6hC.lineNumber;
}
if (coderow1779023947Pz6hC < 20) {
editorElem1779023947Pz6hC.parentElement.style.height = '300px';
editorElem1779023947Pz6hC.style.height = '300px';
} else if (coderow1779023947Pz6hC >= 20) {
editorElem1779023947Pz6hC.parentElement.style.height = '500px';
editorElem1779023947Pz6hC.style.height = '500px';
}
//console.log({currentCode1779023947Pz6hC})
const copyBtn1779023947Pz6hC = document.getElementById('codeflask-copy-vSTQFeEQTY');
copyBtn1779023947Pz6hC.addEventListener('click', function() {
try {
// 先检查 Clipboard API 是否可用
if (navigator.clipboard && navigator.clipboard.writeText) {
// 使用 Clipboard API 复制代码
navigator.clipboard.writeText(code1779023947Pz6hC).then(function() {
// 复制成功提示
const originalText = copyBtn1779023947Pz6hC.innerHTML;
copyBtn1779023947Pz6hC.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 已复制';
// 一段时间后恢复原文本
setTimeout(function() {
copyBtn1779023947Pz6hC.innerHTML = originalText;
}, 2000);
}).catch(function(err) {
// 复制失败处理
console.error('复制失败:', err);
// 降级方案:使用传统的复制方法
fallbackCopyTextToClipboard(code1779023947Pz6hC);
});
} else {
// Clipboard API 不可用时直接使用降级方案
fallbackCopyTextToClipboard(code1779023947Pz6hC);
}
// 提取降级方案为独立函数
function fallbackCopyTextToClipboard(text) {
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.opacity = '0';
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
const originalText = copyBtn1779023947Pz6hC.innerHTML;
copyBtn1779023947Pz6hC.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> 已复制';
setTimeout(function() {
copyBtn1779023947Pz6hC.innerHTML = originalText;
}, 2000);
} catch (copyErr) {
console.error('传统复制方法也失败了:', copyErr);
} finally {
document.body.removeChild(textArea);
}
}
} catch (err) {
console.error('复制功能不可用:', err);
}
});
const bottomBtn1779023947Pz6hC = document.getElementById('codeflask-bottomBtn-vSTQFeEQTY');
const Toggle1779023947Pz6hC = document.getElementById('codeflask-Toggle-vSTQFeEQTY');
bottomBtn1779023947Pz6hC.addEventListener('click', function() {
if (isCollapsed1779023947Pz6hC) {
// 展开代码
isCollapsed1779023947Pz6hC = false;
const codeElement1779023947Pz6hC = editorElem1779023947Pz6hC.querySelector('.codeflask__code');
if (codeElement1779023947Pz6hC) {
const actualHeight1779023947Pz6hC = codeElement1779023947Pz6hC.scrollHeight + 20;
editorElem1779023947Pz6hC.parentElement.style.height = actualHeight1779023947Pz6hC + 'px';
editorElem1779023947Pz6hC.style.height = actualHeight1779023947Pz6hC + 'px';
}
bottomBtn1779023947Pz6hC.innerHTML = '<button class="editorjs-codeFlask_BottomToggle" title="折叠代码"><span class="toggle-icon">▲</span> 折叠</button>';
Toggle1779023947Pz6hC.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg>';
} else {
// 折叠代码
isCollapsed1779023947Pz6hC = true;
if (coderow1779023947Pz6hC < 20) {
editorElem1779023947Pz6hC.parentElement.style.height = '300px';
editorElem1779023947Pz6hC.style.height = '300px';
} else if (coderow1779023947Pz6hC >= 20) {
editorElem1779023947Pz6hC.parentElement.style.height = '500px';
editorElem1779023947Pz6hC.style.height = '500px';
}
bottomBtn1779023947Pz6hC.innerHTML = '<button class="editorjs-codeFlask_BottomToggle expand-mode" title="展开代码" data-empty="false"><span class="toggle-icon">▼</span> 展开</button>';
Toggle1779023947Pz6hC.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>';
}
});
Toggle1779023947Pz6hC.addEventListener('click', function() {
bottomBtn1779023947Pz6hC.click();
});
</script><div class="ce-block ce-block--focused" data-id="6DL3N2QqVG" >
<div class="ce-block__content">
<div class="ce-paragraph cdx-block ce-paragraph--left">分工说明:</div>
</div>
</div><div class="ce-block ce-block--focused" data-id="qFiougbqn1" >
<div class="ce-block__content">
<ul class="cdx-list-unordered"><li class="cdx-list__item">你(主身):<span> </span>负责汇总其它机器人的工作报告、其它日常事务、生活和工作安排等</li><li class="cdx-list__item">bot1:<span> </span>处理编程、数据分析等相关复杂的技术任务</li><li class="cdx-list__item">bot2:<span> </span>处理营销推广、自媒体创作、法律、医学等文科类的工作任务</li></ul>
</div>
</div><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.ce-paragraph {
line-height: 1.6em;
outline: none;
text-indent: 2em;
font-size: 16px;
}
.ce-paragraph--right {
text-align: right;
}
.ce-paragraph--center {
text-align: center;
}
.ce-paragraph--left {
text-align: left;
}
.ce-paragraph--justify {
text-align: justify;
}
.ce-paragraph-text-indent {
text-align: justify;
}
.ce-paragraph:empty::before{
content: attr(data-placeholder);
color: #707684;
font-weight: normal;
opacity: 0;
}
/** Show placeholder at the first paragraph if Editor is empty */
.codex-editor--empty .ce-block:first-child .ce-paragraph:empty::before {
opacity: 1;
}
.codex-editor--toolbox-opened .ce-block:first-child .ce-paragraph:empty::before,
.codex-editor--empty .ce-block:first-child .ce-paragraph:empty:focus::before {
opacity: 0;
}
.ce-paragraph p:first-of-type{
margin-top: 0;
}
.ce-paragraph p:last-of-type{
margin-bottom: 0;
}
.svg-icon {
width: 1em;
height: 1em;
}
.svg-icon path,
.svg-icon polygon,
.svg-icon rect {
fill: #4691f6;
}
.svg-icon circle {
stroke: #4691f6;
stroke-width: 1;
}
</style><style type="text/css">
.ce-block {
margin-top: 20px;
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
/**
* Plugin styles
*/
.ce-header {
position: relative;
padding: 1px 0px 1px 15px;
margin: 0;
line-height: 1.25em;
outline: none;
margin-bottom: 10px;
}
.ce-header p,
.ce-header div {
padding: 0 !important;
margin: 0 !important;
}
.ce-header::before {
content: "";
background-color: #3e8fe3;
width: 6px;
height: 100%;
position: absolute;
left: 0;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
/**
* Styles for Plugin icon in Toolbar
*/
.ce-header__icon {
}
.ce-header::before {
position: absolute;
content: attr(data-placeholder);
color: #707684;
font-weight: normal;
display: none;
cursor: text;
}
.ce-header:empty::before {
display: block;
}
.ce-header:empty:focus::before {
display: none;
}
/* FontSize */
h1.ce-header {
font-size: 2.0em;
}
h2.ce-header {
font-size: 1.7em;
}
h3.ce-header {
font-size: 1.4em;
}
h4.ce-header {
font-size: 1.15em;
}
h5.ce-header {
font-size: 0.95em;
}
h6.ce-header {
font-size: 0.8em;
}
/* Alignment*/
.ce-header--right {
text-align: right;
}
.ce-header--center {
text-align: center;
}
.ce-header--left {
text-align: left;
}
.ce-header--justify {
text-align: justify;
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.image-tool {
--bg-color: #cdd1e0;
--front-color: #388ae5;
--border-color: #e8e8eb;
}
.image-tool__image {
border-radius: 3px;
overflow: hidden;
margin-bottom: 10px;
}
.image-tool__image-picture {
max-width: 100%;
vertical-align: bottom;
display: block;
margin-left: auto;
margin-right: auto;
}
.image-tool__image-preloader {
width: 50px;
height: 50px;
border-radius: 50%;
background-size: cover;
margin: auto;
position: relative;
background-color: #cdd1e0;
background-position: center center;
}
.image-tool__image-preloader::after {
content: "";
position: absolute;
z-index: 3;
width: 60px;
height: 60px;
border-radius: 50%;
border: 2px solid #cdd1e0;
border-top-color: #388ae5;
left: 50%;
top: 50%;
margin-top: -30px;
margin-left: -30px;
animation: image-preloader-spin 2s infinite linear;
box-sizing: border-box;
}
.image-tool__caption::before {
position: absolute !important;
content: attr(data-placeholder);
color: #707684;
font-weight: normal;
display: none;
}
.image-tool__caption:empty::before {
display: block;
}
.image-tool__caption:empty:focus::before {
display: none;
}
.image-tool--empty .image-tool__image {
display: none;
}
.image-tool--empty .image-tool__caption, .image-tool--loading .image-tool__caption {
display: none;
}
.image-tool .cdx-button {
display: flex;
align-items: center;
justify-content: center;
}
.image-tool .cdx-button svg {
height: auto;
margin: 0 6px 0 0;
}
.image-tool--filled .cdx-button {
display: none;
}
.image-tool--filled .image-tool__image-preloader {
display: none;
}
.image-tool--loading .image-tool__image {
min-height: 200px;
display: flex;
border: 1px solid #e8e8eb;
background-color: #fff;
}
.image-tool--loading .image-tool__image-picture {
display: none;
}
.image-tool--loading .cdx-button {
display: none;
}
/**
* Tunes
* ----------------
*/
.image-tool--withBorder .image-tool__image {
border: 1px solid #e8e8eb;
}
.image-tool--withBackground .image-tool__image {
padding: 15px;
background: #cdd1e0;
}
.image-tool--withBackground .image-tool__image-picture {
max-width: 60%;
margin: 0 auto;
}
.image-tool--stretched .image-tool__image-picture {
width: 100%;
}
.image-tool__caption {
text-align: center;
font-size: 14px;
color: #a3a3a3;
}
@keyframes image-preloader-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.cdx-list {
margin:0;
outline:none;
display:block;
counter-reset:item;
padding:6px;
}
.cdx-list__item {
line-height:1.45em;
display:block;
padding-top:8px;
margin-left: 2em;
}
.cdx-list__item-children {
display:block;
}
.cdx-list__item {
outline:none
}
.cdx-list__item-content {
word-break:break-word;
white-space:pre-wrap;
grid-area:content;
padding-left:8px
}
.cdx-list__item:before {
counter-increment:item;
white-space:nowrap
}
.cdx-list-li-container {
display: flex;
}
.cdx-list-ordered .cdx-list__item:before {
/* content:counters(item,".",numeric) "." */
}
.cdx-list-ordered {
list-style-type: none;
margin-left: -15px;
counter-reset:item;
font-size: 16px;
}
.cdx-list-unordered {
font-size: 16px;
}
.cdx-list-unordered .cdx-list__item:before {
content:"•"
}
.cdx-list-checklist .cdx-list__item:before {
content:""
}
.cdx-list__settings .cdx-settings-button {
width:50%
}
.cdx-list__checkbox {
padding-top:calc((1.45em - 1.2em) / 2);
grid-area:checkbox;
width:1.2em;
height:1.2em;
display:flex;
cursor:pointer;
font-size: 16px;
}
.cdx-list__checkbox svg {
opacity:0;
height:1.2em;
width:1.2em;
left:-1px;
top:-1px;
position:absolute
}
@media (hover:hover) {
.cdx-list__checkbox:not(.cdx-list__checkbox--no-hover):hover .cdx-list__checkbox-check svg {
opacity:1
}
}.cdx-list__checkbox--checked-1 {
line-height:1.45em
}
@media (hover:hover) {
.cdx-list__checkbox--checked-1:not(.cdx-list__checkbox--checked-1--no-hover):hover .cdx-checklist__checkbox-check {
background:#0059AB;
border-color:#0059AB
}
}.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check {
background:#369FFF;
border-color:#369FFF
}
.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check svg {
opacity:1
}
.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check svg path {
stroke:#fff
}
.cdx-list__checkbox--checked-1 .cdx-list__checkbox-check:before {
opacity:0;
visibility:visible;
transform:scale(2.5)
}
.cdx-list__checkbox-check {
cursor:pointer;
display:inline-block;
position:relative;
margin:0 auto;
width:1.2em;
height:1.2em;
box-sizing:border-box;
border-radius:5px;
border:1px solid #C9C9C9;
background:#fff
}
.cdx-list__checkbox-check:before {
content:"";
position:absolute;
top:0;
right:0;
bottom:0;
left:0;
border-radius:100%;
background-color:#369FFF;
visibility:hidden;
pointer-events:none;
transform:scale(1);
transition:transform .4s ease-out,opacity .4s
}
.cdx-list__checkbox-check--disabled {
pointer-events:none
}
.cdx-list-start-with-field {
background:#F8F8F8;
border:1px solid rgba(226,226,229,.2);
border-radius:6px;
padding:2px;
display:grid;
grid-template-columns:auto auto 1fr;
grid-template-rows:auto
}
.cdx-list-start-with-field--invalid {
background:#FFECED;
border:1px solid #E13F3F
}
.cdx-list-start-with-field--invalid .cdx-list-start-with-field__input {
color:#e13f3f
}
.cdx-list-start-with-field__input {
font-size:16px;
outline:none;
font-weight:500;
font-family:inherit;
border:0;
background:transparent;
margin:0;
padding:0;
line-height:22px;
min-width:calc(100% - 10px)
}
.cdx-list-start-with-field__input::placeholder {
color:#797979;
font-weight:500
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
}
.tc-wrap {
--color-background:#f9f9fb;
--color-text-secondary:#7b7e89;
--color-border:#e8e8eb;
--cell-size:0px;
--toolbox-icon-size:18px;
--toolbox-padding:6px;
--toolbox-aiming-field-size:calc(var(--toolbox-icon-size) + var(--toolbox-padding)*2);
border:1px solid var(--color-border);
position:relative;
height:100%;
width:100%;
margin-top:var(--toolbox-icon-size);
box-sizing:border-box;
display:grid;
grid-template-columns:calc(100% - var(--cell-size)) var(--cell-size);
}
.tc-wrap--readonly {
grid-template-columns:100% var(--cell-size)
}
.tc-wrap svg {
vertical-align:top
}
@media print {
.tc-wrap {
border-left-color:var(--color-border);
border-left-style:solid;
border-left-width:1px;
grid-template-columns:100% var(--cell-size)
}
}@media print {
.tc-wrap .tc-row:after {
display:none
}
}.tc-table {
position:relative;
width:100%;
height:100%;
display:grid;
font-size:14px;
line-height:1.4;
}
.tc-table:after {
width:calc(var(--cell-size));
height:100%;
left:calc(var(--cell-size)*-1);
top:0
}
.tc-table:after,.tc-table:before {
position:absolute;
content:""
}
.tc-table:before {
width:100%;
height:var(--toolbox-aiming-field-size);
top:calc(var(--toolbox-aiming-field-size)*-1);
left:0
}
.tc-table--heading .tc-row:first-child {
font-weight:600;
border-bottom:2px solid var(--color-border);
}
.tc-table--heading .tc-row:first-child :empty:before {
content:attr(heading);
color:var(--color-text-secondary)
}
.tc-table--heading .tc-row:first-child:after {
bottom:-2px;
border-bottom:2px solid var(--color-border)
}
.tc-add-column,.tc-add-row {
display:flex;
color:var(--color-text-secondary)
}
@media print {
.tc-add {
display:none
}
}.tc-add-column {
padding:4px 0;
justify-content:center;
border-top:1px solid var(--color-border);
}
@media print {
.tc-add-column {
display:none
}
}.tc-add-row {
height:var(--cell-size);
align-items:center;
padding-left:4px;
position:relative;
}
.tc-add-row:before {
content:"";
position:absolute;
right:calc(var(--cell-size)*-1);
width:var(--cell-size);
height:100%
}
@media print {
.tc-add-row {
display:none
}
}.tc-add-column,.tc-add-row {
transition:0s;
cursor:pointer;
will-change:background-color;
}
.tc-add-column:hover,.tc-add-row:hover {
transition:background-color .1s ease;
background-color:var(--color-background)
}
.tc-add-row {
margin-top:1px;
}
.tc-add-row:hover:before {
transition:.1s;
background-color:var(--color-background)
}
.tc-row {
display:grid;
grid-template-columns:repeat(auto-fit,minmax(10px,1fr));
position:relative;
border-bottom:1px solid var(--color-border);
}
.tc-row:after {
content:"";
pointer-events:none;
position:absolute;
width:var(--cell-size);
height:100%;
bottom:-1px;
right:calc(var(--cell-size)*-1);
border-bottom:1px solid var(--color-border)
}
.tc-row--selected {
background:var(--color-background)
}
.tc-row--selected:after {
background:var(--color-background)
}
.tc-cell {
border-right:1px solid var(--color-border);
padding:6px 12px;
overflow:hidden;
outline:none;
line-break:normal;
}
.tc-cell--selected {
background:var(--color-background)
}
.tc-wrap--readonly .tc-row:after {
display:none
}
.tc-toolbox {
--toolbox-padding:6px;
--popover-margin:30px;
--toggler-click-zone-size:30px;
--toggler-dots-color:#7b7e89;
--toggler-dots-color-hovered:#1d202b;
position:absolute;
cursor:pointer;
z-index:1;
opacity:0;
transition:opacity .1s;
will-change:left,opacity;
}
.tc-toolbox--column {
top:calc(var(--toggler-click-zone-size)*-1);
transform:translateX(calc(var(--toggler-click-zone-size)*-1/2));
will-change:left,opacity
}
.tc-toolbox--row {
left:calc(var(--popover-margin)*-1);
transform:translateY(calc(var(--toggler-click-zone-size)*-1/2));
margin-top:-1px;
will-change:top,opacity
}
.tc-toolbox--showed {
opacity:1
}
.tc-toolbox .tc-popover {
position:absolute;
top:0;
left:var(--popover-margin)
}
.tc-toolbox__toggler {
display:flex;
align-items:center;
justify-content:center;
width:var(--toggler-click-zone-size);
height:var(--toggler-click-zone-size);
color:var(--toggler-dots-color);
opacity:0;
transition:opacity .15s ease;
will-change:opacity;
}
.tc-toolbox__toggler:hover {
color:var(--toggler-dots-color-hovered)
}
.tc-toolbox__toggler svg {
fill:currentColor
}
.tc-wrap:hover .tc-toolbox__toggler {
opacity:1
}
.tc-settings .cdx-settings-button {
width:50%;
margin:0
}
.tc-popover {
--color-border:#eaeaea;
--color-background:#fff;
--color-background-hover:rgba(232,232,235,0.49);
--color-background-confirm:#e24a4a;
--color-background-confirm-hover:#d54040;
--color-text-confirm:#fff;
background:var(--color-background);
border:1px solid var(--color-border);
box-shadow:0 3px 15px -3px rgba(13,20,33,.13);
border-radius:6px;
padding:6px;
display:none;
will-change:opacity,transform;
}
.tc-popover--opened {
display:block;
animation:menuShowing .1s cubic-bezier(.215,.61,.355,1) forwards
}
.tc-popover__item {
display:flex;
align-items:center;
padding:2px 14px 2px 2px;
border-radius:5px;
cursor:pointer;
white-space:nowrap;
-webkit-user-select:none;
-moz-user-select:none;
user-select:none;
}
.tc-popover__item:hover {
background:var(--color-background-hover)
}
.tc-popover__item:not(:last-of-type) {
margin-bottom:2px
}
.tc-popover__item-icon {
display:inline-flex;
width:26px;
height:26px;
align-items:center;
justify-content:center;
background:var(--color-background);
border-radius:5px;
border:1px solid var(--color-border);
margin-right:8px
}
.tc-popover__item-label {
line-height:22px;
font-size:14px;
font-weight:500
}
.tc-popover__item--confirm {
background:var(--color-background-confirm);
color:var(--color-text-confirm);
}
.tc-popover__item--confirm:hover {
background-color:var(--color-background-confirm-hover)
}
.tc-popover__item--confirm .tc-popover__item-icon {
background:var(--color-background-confirm);
border-color:rgba(0,0,0,.1);
}
.tc-popover__item--confirm .tc-popover__item-icon svg {
transition:transform .2s ease-in;
transform:rotate(90deg) scale(1.2)
}
.tc-popover__item--hidden {
display:none
}
@keyframes menuShowing {
0% {
opacity:0;
transform:translateY(-8px) scale(.9)
}
70% {
opacity:1;
transform:translateY(2px)
}
to {
transform:translateY(0)
}
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content,.ce-toolbar__content {
/* max-width:calc(100% - 50px) */
margin-left: auto;
margin-right: auto;
position: relative;
}
/* 主容器 */
.editorjs-codeFlask_Wrapper {
border: 1px solid #dcdfe6;
border-radius: 5px;
background-color: #f6f8fa;
margin-bottom: 10px;
position: relative;
transition: all 0.3s ease;
width: 100%;
min-height: 100px;
overflow: hidden;
}
/* 标题栏 */
.editorjs-codeFlask_Header {
display: flex;
justify-content: flex-end;
align-items: center;
padding: 8px 12px;
background-color: #e9ecef;
border-bottom: 1px solid #dcdfe6;
position: relative;
z-index: 0; /* 从10降低到2 */
}
/* 语言显示 */
.editorjs-codeFlask_LangDisplay {
padding: 2px 8px;
background-color: #409eff;
color: white;
border-radius: 3px;
font-size: 12px;
font-weight: 500;
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
}
/* 内容容器 - 禁止纵向滚动 */
.editorjs-codeFlask_ContentContainer {
position: relative;
min-height: 100px;
overflow-x: hidden; /* 禁止横向滚动 */
overflow-y: hidden;
transition: height 0.3s ease;
}
/* 编辑器容器 - 禁止纵向滚动 */
.editorjs-codeFlask_Editor {
position: relative;
min-height: 100px;
overflow-x: hidden; /* 禁止横向滚动 */
overflow-y: hidden;
transition: height 0.3s ease;
}
/* 底部按钮容器 - 优化为更简洁的样式 */
.editorjs-codeFlask_BottomButtonContainer {
display: flex;
justify-content: center;
align-items: center;
padding: 4px;
background-color: #f8f9fa;
border-top: 1px solid #e9ecef;
position: relative;
z-index: 0;
}
/* 底部横向折叠/展开按钮 - 优化样式,使其更融入设计 */
.editorjs-codeFlask_BottomToggle {
width: 100%;
background-color: transparent;
color: #606266;
border: none;
border-radius: 4px;
padding: 6px 12px;
font-size: 12px;
font-weight: 400;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
text-align: center;
position: relative;
}
.editorjs-codeFlask_BottomToggle:hover {
background-color: #e9ecef;
color: #409eff;
}
.editorjs-codeFlask_BottomToggle:active {
background-color: #dee2e6;
}
.editorjs-codeFlask_BottomToggle .toggle-icon {
font-size: 11px;
transition: transform 0.3s ease;
}
/* 展开按钮(显示"展开"文本)上边缘添加渐变虚化效果 */
.editorjs-codeFlask_BottomToggle:has(span.toggle-icon:contains("▲"))::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 6px;
background: linear-gradient(to bottom, rgba(248, 249, 250, 0) 0%, rgba(248, 249, 250, 1) 100%);
pointer-events: none;
}
/* 展开按钮(显示"展开"文本)上边缘添加渐变虚化效果 */
/* 删除不被广泛支持的:contains()选择器 */
.editorjs-codeFlask_BottomToggle.expand-mode::before {
content: '';
position: absolute;
top: -60px;
left: 0;
right: 0;
height: 60px;
background: linear-gradient(to bottom, rgb(255 255 255 / 0%) 0%, rgba(248, 249, 250, 1) 100%);
pointer-events: none;
}
/* CodeFlask 主容器样式 */
.editorjs-codeFlask_Editor .codeflask {
position: relative;
background: #fafafa;
border-radius: 0 0 4px 4px;
min-height: 100px;
overflow-x: hidden; /* 禁止横向滚动 */
overflow-y: hidden;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
}
/* 行号容器 */
.editorjs-codeFlask_Editor .codeflask.codeflask--has-line-numbers:before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 40px;
background-color: #f5f5f5;
border-right: 1px solid #e0e0e0;
z-index: 0;
}
/* 行号 */
.editorjs-codeFlask_Editor .codeflask__lines {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 40px;
padding: 10px 0;
background-color: #f5f5f5;
border-right: 1px solid #e0e0e0;
z-index: 0;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 14px;
line-height: 21px;
color: #666;
text-align: right;
user-select: none;
overflow: hidden;
}
.editorjs-codeFlask_Editor .codeflask__lines__line {
padding-right: 8px;
}
/* 文本区域 - 输入框 */
.editorjs-codeFlask_Editor .codeflask__textarea {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
padding: 10px;
border: none;
background: transparent;
color: transparent;
caret-color: #333;
resize: none;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 14px;
line-height: 21px;
z-index: 1;
overflow-x: hidden; /* 禁止横向滚动 */
overflow-y: hidden;
white-space: pre-wrap; /* 自动换行 */
tab-size: 4;
outline: none;
}
/* 添加选中文本样式 */
.editorjs-codeFlask_Editor .codeflask__textarea::selection {
background-color: #b3d4fc;
color: #333;
}
.editorjs-codeFlask_Editor .codeflask__textarea::-moz-selection {
background-color: #b3d4fc;
color: #333;
}
/* 代码预览区域 */
.editorjs-codeFlask_Editor .codeflask__pre {
position: absolute;
top: 0;
left: 0;
width: 100%; /* 确保宽度不超出容器 */
height: 100%;
padding: 10px;
margin: 0;
border: none;
background: transparent;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 14px;
line-height: 21px;
z-index: 0;
overflow-x: hidden; /* 禁止横向滚动 */
overflow-y: hidden;
white-space: pre-wrap; /* 自动换行 */
pointer-events: none;
}
/* 代码高亮区域 */
.editorjs-codeFlask_Editor .codeflask__code {
display: block;
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 14px;
line-height: 21px;
color: #333;
white-space: pre-wrap; /* 自动换行 */
tab-size: 4;
overflow: visible;
}
/* 语法高亮样式 - 确保Prism.js样式正确应用 */
.editorjs-codeFlask_Editor .codeflask__code {
background: transparent !important;
}
/* 通用语法高亮token样式 */
.editorjs-codeFlask_Editor .token.comment,
.editorjs-codeFlask_Editor .token.prolog,
.editorjs-codeFlask_Editor .token.doctype,
.editorjs-codeFlask_Editor .token.cdata {
color: #708090;
}
.editorjs-codeFlask_Editor .token.punctuation {
color: #999;
}
.editorjs-codeFlask_Editor .token.namespace {
opacity: 0.7;
}
.editorjs-codeFlask_Editor .token.property,
.editorjs-codeFlask_Editor .token.tag,
.editorjs-codeFlask_Editor .token.boolean,
.editorjs-codeFlask_Editor .token.number,
.editorjs-codeFlask_Editor .token.constant,
.editorjs-codeFlask_Editor .token.symbol,
.editorjs-codeFlask_Editor .token.deleted {
color: #905;
}
.editorjs-codeFlask_Editor .token.selector,
.editorjs-codeFlask_Editor .token.attr-name,
.editorjs-codeFlask_Editor .token.string,
.editorjs-codeFlask_Editor .token.char,
.editorjs-codeFlask_Editor .token.builtin,
.editorjs-codeFlask_Editor .token.inserted {
color: #690;
}
.editorjs-codeFlask_Editor .token.operator,
.editorjs-codeFlask_Editor .token.entity,
.editorjs-codeFlask_Editor .token.url,
.editorjs-codeFlask_Editor .language-css .token.string,
.editorjs-codeFlask_Editor .style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, 0.5);
}
.editorjs-codeFlask_Editor .token.atrule,
.editorjs-codeFlask_Editor .token.attr-value,
.editorjs-codeFlask_Editor .token.keyword {
color: #07a;
}
.editorjs-codeFlask_Editor .token.function,
.editorjs-codeFlask_Editor .token.class-name {
color: #dd4a68;
}
.editorjs-codeFlask_Editor .token.regex,
.editorjs-codeFlask_Editor .token.important,
.editorjs-codeFlask_Editor .token.variable {
color: #e90;
}
/* 复制按钮样式 */
.editorjs-codeFlask_CopyButton {
background-color: #409eff;
color: white;
border: none;
border-radius: 3px;
padding: 6px 12px;
margin-right: 8px;
font-size: 12px;
cursor: pointer;
transition: background-color 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
min-width: 28px;
height: 28px;
}
.editorjs-codeFlask_CopyButton:hover {
background-color: #66b1ff;
}
.editorjs-codeFlask_CopyButton.copied {
background-color: #67c23a;
}
/* 折叠/展开按钮样式 */
.editorjs-codeFlask_Toggle {
background-color: #909399;
color: white;
border: none;
border-radius: 3px;
padding: 0 8px;
font-size: 12px;
cursor: pointer;
transition: background-color 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
min-width: 28px;
height: 28px;
font-weight: bold;
}
.editorjs-codeFlask_Toggle:hover {
background-color: #a6a9ad;
}
/* 响应式调整 */
@media (max-width: 768px) {
.editorjs-codeFlask_Header {
padding: 6px 8px;
}
.editorjs-codeFlask_Editor .codeflask__textarea,
.editorjs-codeFlask_Editor .codeflask__pre,
.editorjs-codeFlask_Editor .codeflask__code {
font-size: 13px;
line-height: 19px;
padding: 8px;
}
.editorjs-codeFlask_Editor .codeflask.codeflask--has-line-numbers:before {
width: 35px;
}
.editorjs-codeFlask_Editor .codeflask__lines {
width: 35px;
font-size: 12px;
}
}
/* 滚动条样式 - 完全隐藏纵向滚动条 */
.editorjs-codeFlask_Wrapper ::-webkit-scrollbar {
width: 0;/* 纵向滚动条宽度为0 */
height: 6px;/* 横向滚动条保持6px宽度 */
}
.editorjs-codeFlask_Wrapper ::-webkit-scrollbar-track {
background: transparent;
border-radius: 0;
}
.editorjs-codeFlask_Wrapper ::-webkit-scrollbar-thumb {
background: transparent;
border-radius: 0;
}
/* Firefox 滚动条隐藏 */
.editorjs-codeFlask_Wrapper {
scrollbar-width: none;/* Firefox 隐藏纵向滚动条 */
}
.editorjs-codeFlask_Wrapper ::-moz-scrollbar {
width: 0;
height: 6px;
}
/* 焦点状态 */
.editorjs-codeFlask_Wrapper:focus-within {
border-color: #409eff;
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
}
/* 只读模式样式 */
.editorjs-codeFlask_Wrapper.readonly .editorjs-codeFlask_Header {
background-color: #f5f7fa;
}
.editorjs-codeFlask_Wrapper.readonly .editorjs-codeFlask_Editor .codeflask__textarea {
cursor: default;
}
/* 确保所有元素正确显示 */
.editorjs-codeFlask_Wrapper * {
box-sizing: border-box;
}
/* 修复行号对齐 */
.editorjs-codeFlask_Editor .codeflask--has-line-numbers .codeflask__textarea,
.editorjs-codeFlask_Editor .codeflask--has-line-numbers .codeflask__pre {
padding-left: 50px;
}
.editorjs-codeFlask_Editor .codeflask--has-line-numbers .codeflask__lines {
padding-top: 10px;
}
/* 语言显示元素 - 添加点击样式 */
.editorjs-codeFlask_LangDisplay {
padding: 2px 8px;
background-color: #409eff;
color: white;
border-radius: 3px;
font-size: 12px;
font-weight: 500;
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
transition: all 0.2s ease;
}
.editorjs-codeFlask_LangDisplay:hover {
background-color: #66b1ff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* 语言选择弹窗 */
.editorjs-codeFlask_LanguagePopup {
background-color: white;
border: 1px solid #dcdfe6;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
width: 250px;
max-height: 300px;
z-index: 1000;
overflow: hidden;
}
/* 搜索框 */
.editorjs-codeFlask_LanguageSearch {
width: 100%;
padding: 8px 12px;
border: none;
border-bottom: 1px solid #ebeef5;
font-size: 12px;
outline: none;
box-sizing: border-box;
}
/* 语言列表 */
.editorjs-codeFlask_LanguagesList {
max-height: 250px;
overflow-y: auto;
}
/* 语言选项 */
.editorjs-codeFlask_LanguageItem {
padding: 8px 12px;
font-size: 12px;
cursor: pointer;
transition: background-color 0.2s ease;
}
.editorjs-codeFlask_LanguageItem:hover {
background-color: #f5f7fa;
}
.editorjs-codeFlask_LanguageItem.selected {
background-color: #ecf5ff;
color: #409eff;
font-weight: 500;
}
/* 滚动条样式 */
.editorjs-codeFlask_LanguagesList::-webkit-scrollbar {
width: 6px;
}
.editorjs-codeFlask_LanguagesList::-webkit-scrollbar-track {
background-color: #f5f7fa;
}
.editorjs-codeFlask_LanguagesList::-webkit-scrollbar-thumb {
background-color: #c0c4cc;
border-radius: 3px;
}
.editorjs-codeFlask_LanguagesList::-webkit-scrollbar-thumb:hover {
background-color: #909399;
}
</style><style type="text/css">
.ce-block {
margin-bottom: 20px;
}
.ce-block__content, .ce-toolbar__content {
margin-left: auto;
margin-right: auto;
}
.cdx-quote {
position: relative;
background-color: #f8f8f8;
padding: 24px!important;
margin: 0px;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.quote-background-icon {
position: absolute;
top: 10px;
right: 10px;
opacity: 0.2;
z-index: 1;
}
.cdx-quote__text {
min-height: 30px;
margin-bottom: 10px;
font-size: 16px;
line-height: 1.5;
color: #333;
}
.cdx-quote__caption {
padding: 10px 20px 0px 20px;
font-size: 14px;
color: #777;
}
.cdx-quote__caption-left {
text-align: left;
}
.cdx-quote__caption-center {
text-align: center;
}
.cdx-quote__caption-right {
text-align: right;
}
.cdx-quote ::before {
position: absolute;
content: attr(data-placeholder);
color: #bbb;
font-weight: normal;
opacity: 0;
}
.cdx-quote :empty::before {
opacity: 1;
}
.cdx-quote :empty:focus::before {
opacity: 0;
}
.cdx-quote-settings {
display: flex;
}
.cdx-quote-settings .cdx-settings-button {
width: 50%;
}
</style><style type="text/css">
.inline-code {
background: rgba(250, 239, 240, 0.78);
color: #b44437;
padding: 3px 4px;
border-radius: 5px;
margin: 0 1px;
font-family: inherit;
font-size: 0.86em;
font-weight: 500;
letter-spacing: 0.3px;
}
</style>
页:
[1]