<?xml version="1.0" standalone="yes"?>
<rss version="2.0">
  <channel>
    <title><![CDATA[XOYOZO RSS]]></title>
    <link><![CDATA[https://xoyozo.net]]></link>
    <description><![CDATA[XOYOZO RSS]]></description>
    <item>
      <title><![CDATA[Spectre.Console 常用示例]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/SpectreConsole-demo]]></link>
      <description><![CDATA[<p>以下是 Spectre.Console 的核心功能示例，涵盖最常用的输出和交互场景：</p><p><br/></p><h2>1. 基础富文本输出</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239487542241995795034.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">using&nbsp;Spectre.Console;

//&nbsp;使用&nbsp;Markup&nbsp;语法（类似&nbsp;BBCode）
AnsiConsole.Markup(&quot;[bold&nbsp;green]成功！[/]&nbsp;文件已保存。\n&quot;);
AnsiConsole.Markup(&quot;[red]错误：[/]&nbsp;无法连接到服务器。\n&quot;);

//&nbsp;混合样式
AnsiConsole.Markup(&quot;[underline&nbsp;blue]https://example.com[/]\n&quot;);

//&nbsp;自动换行写
AnsiConsole.Write(new&nbsp;Panel(&quot;[yellow]警告[/]&nbsp;磁盘空间不足&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;.Header(&quot;系统通知&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;.Border(BoxBorder.Rounded));</pre><p><br/></p><h2>2. 表格</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239489930179444702361.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;table&nbsp;=&nbsp;new&nbsp;Table();
table.AddColumn(&quot;[u]ID[/]&quot;);
table.AddColumn(new&nbsp;TableColumn(&quot;[u]名称[/]&quot;).Centered());
table.AddColumn(&quot;[u]状态[/]&quot;);

table.AddRow(&quot;1&quot;,&nbsp;&quot;订单服务&quot;,&nbsp;&quot;[green]运行中[/]&quot;);
table.AddRow(&quot;2&quot;,&nbsp;&quot;支付网关&quot;,&nbsp;&quot;[red]离线[/]&quot;);
table.AddRow(&quot;3&quot;,&nbsp;&quot;消息队列&quot;,&nbsp;&quot;[yellow]警告[/]&quot;);

AnsiConsole.Write(table);</pre><p><br/></p><h2>3. 进度条 / 状态指示</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239493017913526615951.png" title="image.png" alt="image.png"/><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239495296302388101514.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">//&nbsp;带进度条的循环任务
await&nbsp;AnsiConsole.Progress()
&nbsp;&nbsp;&nbsp;&nbsp;.StartAsync(async&nbsp;ctx&nbsp;=&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;task1&nbsp;=&nbsp;ctx.AddTask(&quot;[green]下载文件[/]&quot;,&nbsp;maxValue:&nbsp;100);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;task2&nbsp;=&nbsp;ctx.AddTask(&quot;[green]处理数据[/]&quot;,&nbsp;maxValue:&nbsp;100);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!ctx.IsFinished)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task1.Increment(1.5);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task2.Increment(0.8);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;Task.Delay(50);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;});

//&nbsp;不确定时长的旋转状态
await&nbsp;AnsiConsole.Status()
&nbsp;&nbsp;&nbsp;&nbsp;.StartAsync(&quot;正在连接...&quot;,&nbsp;async&nbsp;ctx&nbsp;=&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;Task.Delay(3000);&nbsp;//&nbsp;模拟工作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AnsiConsole.MarkupLine(&quot;[green]连接成功！[/]&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;});</pre><p><br/></p><h2>4. 交互式提示</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239498712053645502913.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">//&nbsp;确认
if&nbsp;(AnsiConsole.Confirm(&quot;是否继续安装？&quot;))
{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;执行安装
}

//&nbsp;文本输入（带验证）
var&nbsp;name&nbsp;=&nbsp;AnsiConsole.Prompt(
&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;TextPrompt&lt;string&gt;(&quot;请输入用户名：&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ValidationErrorMessage(&quot;[red]用户名不能为空[/]&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Validate(input&nbsp;=&gt;&nbsp;!string.IsNullOrWhiteSpace(input)));

//&nbsp;选择列表
var&nbsp;fruit&nbsp;=&nbsp;AnsiConsole.Prompt(
&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;SelectionPrompt&lt;string&gt;()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Title(&quot;请选择最喜欢的水果&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.AddChoices(new[]&nbsp;{&nbsp;&quot;苹果&quot;,&nbsp;&quot;香蕉&quot;,&nbsp;&quot;橙子&quot;,&nbsp;&quot;葡萄&quot;&nbsp;}));

AnsiConsole.MarkupLine($&quot;你选择了：[green]{fruit}[/]&quot;);

//&nbsp;多选
var&nbsp;colors&nbsp;=&nbsp;AnsiConsole.Prompt(
&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;MultiSelectionPrompt&lt;string&gt;()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Title(&quot;请选择颜色&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.AddChoices(new[]&nbsp;{&nbsp;&quot;红色&quot;,&nbsp;&quot;绿色&quot;,&nbsp;&quot;蓝色&quot;,&nbsp;&quot;黄色&quot;&nbsp;}));</pre><p><br/></p><h2>5. 树形结构</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239502727710954527704.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;root&nbsp;=&nbsp;new&nbsp;Tree(&quot;[yellow]项目结构[/]&quot;);
var&nbsp;src&nbsp;=&nbsp;root.AddNode(&quot;src&quot;);
src.AddNode(&quot;Program.cs&quot;);
src.AddNode(&quot;Services&quot;);
src.AddNode(&quot;Models&quot;);

var&nbsp;tests&nbsp;=&nbsp;root.AddNode(&quot;tests&quot;);
tests.AddNode(&quot;UnitTests&quot;);

AnsiConsole.Write(root);</pre><p><br/></p><h2>6. 布局 / 网格</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239505215208298013913.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;layout&nbsp;=&nbsp;new&nbsp;Layout(&quot;Root&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;.SplitColumns(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Layout(&quot;Left&quot;).Size(30),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Layout(&quot;Right&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.SplitRows(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Layout(&quot;Top&quot;),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Layout(&quot;Bottom&quot;)));

layout[&quot;Left&quot;].Update(new&nbsp;Panel(&quot;导航栏&quot;));
layout[&quot;Top&quot;].Update(new&nbsp;Panel(&quot;主内容区&quot;));
layout[&quot;Bottom&quot;].Update(new&nbsp;Panel(&quot;日志输出&quot;));

AnsiConsole.Write(layout);</pre><p><br/></p><h2>7. 实时更新</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239510376053518476185.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;table&nbsp;=&nbsp;new&nbsp;Table().AddColumn(&quot;Time&quot;).AddColumn(&quot;Message&quot;);
table.AddRow(&quot;10:00&quot;,&nbsp;&quot;系统启动&quot;);

await&nbsp;AnsiConsole.Live(table)
&nbsp;&nbsp;&nbsp;&nbsp;.StartAsync(async&nbsp;ctx&nbsp;=&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;5;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;Task.Delay(1000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.AddRow($&quot;10:0{i}&quot;,&nbsp;$&quot;事件&nbsp;{i}&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.Refresh();&nbsp;//&nbsp;刷新显示
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;});</pre><p><br/></p><h2>8. 带样式的异常显示</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260421/6391239513664835336161506.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">try
{
&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;InvalidOperationException(&quot;操作失败&quot;);
}
catch&nbsp;(Exception&nbsp;ex)
{
&nbsp;&nbsp;&nbsp;&nbsp;AnsiConsole.WriteException(ex,&nbsp;ExceptionFormats.ShortenPaths);
}</pre><p><br/></p><h2>9. 日历</h2><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246416179731295957956.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;calendar&nbsp;=&nbsp;new&nbsp;Calendar(2026,&nbsp;4);
calendar.AddCalendarEvent(2026,&nbsp;4,&nbsp;22);&nbsp;//&nbsp;标记日期
calendar.HighlightStyle(Style.Parse(&quot;yellow&nbsp;bold&quot;));
AnsiConsole.Write(calendar);</pre><p><br/></p><p>10.&nbsp;条形图 / 柱状图</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246425198836408685666.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">AnsiConsole.Write(new&nbsp;BarChart()
&nbsp;&nbsp;&nbsp;&nbsp;.Width(60)
&nbsp;&nbsp;&nbsp;&nbsp;.Label(&quot;[green&nbsp;bold]项目进度[/]&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;.CenterLabel()
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;后端&quot;,&nbsp;80,&nbsp;Color.Green)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;前端&quot;,&nbsp;65,&nbsp;Color.Blue)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;测试&quot;,&nbsp;40,&nbsp;Color.Red));</pre><p><br/></p><p>11. 分解图</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246488853737243175261.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">AnsiConsole.Write(new&nbsp;BreakdownChart()
&nbsp;&nbsp;&nbsp;&nbsp;.Width(60)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;CPU&quot;,&nbsp;45,&nbsp;Color.Red)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;内存&quot;,&nbsp;30,&nbsp;Color.Blue)
&nbsp;&nbsp;&nbsp;&nbsp;.AddItem(&quot;磁盘&quot;,&nbsp;25,&nbsp;Color.Green));</pre><p><br/></p><p>12. 规则线</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246496095171171560976.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">AnsiConsole.Write(new&nbsp;Rule(&quot;[red]警告区域[/]&quot;).RuleStyle(&quot;red&quot;).LeftJustified());
AnsiConsole.WriteLine(&quot;内容&quot;);
AnsiConsole.Write(new&nbsp;Rule().RuleStyle(&quot;green&quot;));</pre><p><br/></p><p>13. 文本样式</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246505432037863173744.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">//&nbsp;大字标题
AnsiConsole.Write(new&nbsp;FigletText(&quot;Hello&quot;).Color(Color.Green));
//&nbsp;Emoji
AnsiConsole.Markup(&quot;:check_mark_button:&nbsp;成功&nbsp;:cross_mark:&nbsp;失败&quot;);</pre><p><br/></p><p>14. 网格</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260422/6391246517015701001421377.png" title="image.png" alt="image.png"/></p><pre class="brush:c#;toolbar:false">var&nbsp;grid&nbsp;=&nbsp;new&nbsp;Grid();
grid.AddColumn(new&nbsp;GridColumn().NoWrap().PadRight(4));
grid.AddColumn();

grid.AddRow(&quot;[b]名称[/]&quot;,&nbsp;&quot;Spectre.Console&quot;);
grid.AddRow(&quot;[b]版本[/]&quot;,&nbsp;&quot;0.49.1&quot;);
grid.AddRow(&quot;[b]许可[/]&quot;,&nbsp;&quot;MIT&quot;);

AnsiConsole.Write(grid);</pre><p><br/></p><p><br/></p><p><br/></p><p><br/></p><p><br/></p>]]></description>
      <pubDate>Tue, 21 Apr 2026 11:05:39 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Windows Server 服务器没有安装物理声卡，如何播放声音]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/windows-server-vb-cable]]></link>
      <description><![CDATA[<p>安装虚拟声卡&nbsp;VB-Cable 搞定。</p><p>若重启后未生效，在服务中启动&nbsp;Windows Audio、Windows Audio Endpoint Builder 和&nbsp;Multimedia Class Scheduler（如果有），并设置为自动启动。</p><p><br/></p><p>如何希望使用 OBS 录制系统声音，在 OBS 菜单 - 文件 - 设置 - 音频 - 桌面音频 中选择正确的音源（如“远程音频”）。</p>]]></description>
      <pubDate>Mon, 20 Apr 2026 14:28:40 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[C盘满了怎么办？WinSxS 可以删吗？]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/win-c-winsxs-delete]]></link>
      <description><![CDATA[<p><em>如果你不会激活 Windows，本文可能不适用。</em></p><p>C盘满了如何清理？特别是 C:\Windows\WinSxS 占用大量磁盘空间，删又不敢删。</p><p>推荐一个比较完美又彻底有效的办法：</p><p>设置-系统-恢复-使用 Windows 更新修复问题。</p><p>或下载与原系统版本一致的 <a href="https://xoyozo.net/Software/Index/Windows" target="_blank">Windows 原版安装镜像</a>，双击运行，选择<strong>保留个人文件和应用</strong>，等待约半个小时。</p><p>完成后，原来安装的应用程序和设置会保留，无用的系统文件会移至 C:\Windows.old。</p><p>若新系统运行没有问题，则可删除该目录（设置-系统-存储-清理建议），释放磁盘空间；若有问题，可还原到原系统（设置-系统-恢复）。</p>]]></description>
      <pubDate>Sun, 19 Apr 2026 02:53:27 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[clawhub 安装技能报错：Rate limit exceeded]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/clawhub-rate-limit-exceeded]]></link>
      <description><![CDATA[<p><span style="color:#071437;font-family:Inter, Helvetica, sans-serif"><span style="font-size: 13px; background-color: rgb(255, 255, 255);">安装技能时</span></span></p><pre class="brush:ps;toolbar:false">clawhub&nbsp;install&nbsp;xxx</pre><p><span style="background-color: rgb(255, 255, 255); color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px;">报错：</span></p><pre class="brush:plain;toolbar:false">Rate&nbsp;limit&nbsp;exceeded</pre><p><span style="background-color: rgb(255, 255, 255); color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px;">原因：</span></p><p><strong><span style="color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);">未登录</span></strong></p><p><span style="color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);">需要先执行：</span></p><pre class="brush:ps;toolbar:false">clawhub&nbsp;login</pre><p><span style="color: rgb(7, 20, 55); font-family: Inter, Helvetica, sans-serif; font-size: 13px; text-wrap-mode: wrap; background-color: rgb(255, 255, 255);"></span><br/></p>]]></description>
      <pubDate>Thu, 12 Mar 2026 08:51:12 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[clawhub login 遇到 Missing state.]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/clawhub-login-missing-state]]></link>
      <description><![CDATA[<p>明明已登录 clawhub.ai 网站，但是 clawhub login 的时候仍然提示：<br/></p><p><span style="text-wrap-mode: nowrap;">CLI login</span></p><p><span style="text-wrap-mode: nowrap;">Missing state.</span></p><p><span style="text-wrap-mode: nowrap;">Run the CLI again to start a fresh login.</span></p><p><br/></p><p>解决办法：</p><p>把 PowerShell 中的那个网址复制出来，在浏览器上打开即可。网址格式类似：</p><pre class="brush:plain;toolbar:false">https://clawhub.ai/cli/auth?redirect_uri=http%3A%2F%2F127.0.0.1%3A64172%2Fcallback&amp;label_b64=******&amp;state=******</pre><p><br/></p>]]></description>
      <pubDate>Thu, 12 Mar 2026 08:45:50 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[OpenClaw 和企业微信插件接入]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/wecom-openclaw-plugin]]></link>
      <description><![CDATA[<p>我来为你整理 Windows 本地部署 OpenClaw 并通过长连接方式接入企业微信的完整步骤：</p><h1>前置条件</h1><ul class=" list-paddingleft-2" style="list-style-type: disc;"><li><p>已安装企业微信最新版客户端</p></li><li><p>已安装 OpenClaw（Node.js 版本需 ≥ 22.0）</p></li><li><p><strong>管理员权限</strong>的企业微信账号（否则看不到 API 模式选项）</p></li></ul><h2>第一步：在企业微信创建长连接机器人</h2><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>打开企业微信客户端 → 工作台 → 智能机器人 → 创建机器人</p></li><li><p>点击底部小字 &quot;如需使用自有系统获取成员与机器人的聊天并输出回复，可切换至 API 模式创建&quot;</p></li><li><p>选择 「长连接」 方式（不要选 Webhook 回调模式）</p></li><li><p>复制保存生成的 Bot ID 和 Secret（后续需要用到）</p></li><li><p>先不要点击保存，保持页面打开，等完成 OpenClaw 配对后再保存&nbsp;</p></li></ol><h2>第二步：Windows 本地安装企微插件</h2><p>打开 PowerShell 或 命令提示符，依次执行以下命令：</p><h3>1. 安装企业微信插件</h3><pre class="brush:ps;toolbar:false">openclaw&nbsp;plugins&nbsp;install&nbsp;@wecom/wecom-openclaw-plugin</pre><p>如果安装失败，可尝试备用命令： openclaw plugins install @tencent/openclaw-wecom</p><h3>2. 重启 OpenClaw 网关</h3><pre class="brush:ps;toolbar:false">openclaw&nbsp;gateway&nbsp;start</pre><p>重要：这个窗口不能关闭，关闭后机器人会掉线。需要再新开一个终端窗口执行后续命令。</p><h3>3. 添加企业微信渠道</h3><p>在新开的终端窗口执行：</p><pre class="brush:ps;toolbar:false">openclaw&nbsp;channels&nbsp;add</pre><p>按提示操作：</p><ol class=" list-paddingleft-2" style="list-style-type: decimal;"><li><p>用方向键选择 企业微信(WeCom) → 回车</p></li><li><p>粘贴输入 Bot ID → 回车</p></li><li><p>粘贴输入 Secret → 回车</p></li><li><p>选择 Finished/Done 完成基础配置</p></li><li><p>配对方式选择 Pairing</p></li></ol><h2>第三步：完成配对授权</h2><p>1. 回到企业微信，找到刚创建的机器人，发送任意消息（如&quot;你好&quot;）</p><p>2. 机器人会自动回复一条配对码消息（包含授权命令）</p><p>3. 复制消息最后一行的配对码</p><p>4. 在终端中执行配对命令：</p><pre class="brush:ps;toolbar:false">openclaw&nbsp;pairing&nbsp;approve&nbsp;openclaw-wecom&nbsp;你的配对码</pre><p>5. 提示&quot;授权成功&quot;即完成配对</p><h2>第四步：保存并启用机器人</h2><p>1. 回到企业微信机器人配置页面，点击 保存并创建</p><p>2. 现在可以在企业微信中与机器人正常对话了</p><h1>长连接 vs 回调模式的优势</h1><table class="table table-bordered align-middle table-sticky"><tbody><tr class="firstRow"><th>特性</th><th>长连接模式</th><th>传统回调模式</th></tr><tr><td>公网IP/域名</td><td>❌不需要</td><td>✅必须需要</td></tr><tr><td>内网穿透</td><td>❌不需要</td><td>✅必须配置</td></tr><tr><td>消息加解密</td><td>❌无需处理</td><td>✅需要处理</td></tr><tr><td>稳定性</td><td>高（无回调失败问题）</td><td>低（经常回调失败）</td></tr><tr><td>主动推送<br/></td><td>✅支持</td><td>✅支持</td></tr></tbody></table><h1>常见问题</h1><table class="table table-bordered align-middle table-sticky"><tbody><tr class="firstRow"><th>问题</th><th>解决方案</th></tr><tr><td>没有 API 模式选项</td><td>确认你是企业微信管理员，普通成员看不到该选项</td></tr><tr><td>插件安装失败</td><td>检查网络连接，或尝试切换 npm 镜像源： npm config set registry https://registry.npmmirror.com/</td></tr><tr><td>配对码无法获取</td><td>确认选择了 API 模式和长连接，重启 OpenClaw 后重试</td></tr><tr><td>机器人不回复</td><td>检查网关窗口是否保持运行，重新执行配对命令</td></tr><tr><td>需要 7×24 小时在线</td><td>建议部署到云服务器，本地关机后机器人会离线</td></tr></tbody></table><h1>命令速查表</h1><pre class="brush:ps;toolbar:false">#&nbsp;安装插件
openclaw&nbsp;plugins&nbsp;install&nbsp;@wecom/wecom-openclaw-plugin

#&nbsp;启动网关（窗口不能关）
openclaw&nbsp;gateway&nbsp;start

#&nbsp;添加渠道
openclaw&nbsp;channels&nbsp;add

#&nbsp;配对授权
openclaw&nbsp;pairing&nbsp;approve&nbsp;openclaw-wecom&nbsp;【配对码】

#&nbsp;重启服务
openclaw&nbsp;gateway&nbsp;restart

#&nbsp;查看状态
openclaw&nbsp;channels&nbsp;status</pre><p>配置完成后，你就可以在企业微信中与 OpenClaw 对话了。如果需要让个人微信也能使用，可以在企业微信后台 &quot;我的企业&quot; → &quot;微信插件&quot; 中生成二维码，用个人微信扫码关注企业即可。</p>]]></description>
      <pubDate>Thu, 12 Mar 2026 04:55:17 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[不买高防 IP，照样抵挡攻击（域名篇）]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/aliyun-ddos-without-bgp-domain]]></link>
      <description><![CDATA[<p>前面写过一篇文章介绍了<a href="https://xoyozo.net/Blog/Details/aliyun-ddos-without-bgp" target="_self">不买高防 IP，照样抵挡 DDoS 攻击（IP 篇）</a>，如果攻击的是域名（CC），那么...</p><p><br/></p><p>本文适用场景：攻击的是 web 网址而非 IP，来源有许多各地的 IP 地址，每个 IP 地址每小时只有若干请求，但整个网站每分钟有数万请求量。</p><p><br/></p><p>《小白鼠A》（贵）</p><p>阿里云有一款产品叫“<strong>Web 应用防火墙</strong>”，开通并接入云产品，试用按量付费即可。</p><p>在防护配置-Web核心防护 中可配置各种规则，譬如：</p><p>“自定义规则”可添加网址/UA/IP/Cookie/等中包含某些关键词的请求；</p><p>“区域封禁”可按地区来限制请求；</p><p>另外还有“CC防护”等各种实用规则。<br/></p><p>添加规则后记得关联实例。</p><p>配置完成后可在总览页面查看请求情况，如果攻击停止可关闭防火墙。</p><p>试用了12小时，平均每分钟请求2-5万次，消耗 15000SeCU，费用大概是750元。</p><p><br/></p><p>《小白鼠B》（推荐）</p><p>阿里云有一款产品叫“<strong>边缘安全加速 ESA</strong>”，开通接入域名（注意填写域名时不要写 www）。</p><p>创建购买成功后会有一个 CNAME 域名，解析生效。配置 HTTPS 证书。</p><p>打开“我正在遭受攻击”，开启后站点进入严格防护模式，默认对所有 HTTP 请求做滑块挑战。这是非常能节省费用的操作，实测开启与不开启的数量相差20倍（具体视攻击强弱）。</p><p>另外，ESA 自带的“安全防护-WAF”中若想根据 URL 中包含某个关键词来拒绝请求，需要升级套餐。可以直接在“规则-重定向”设置 302 跳转也能达到类似的效果，但是节省流量的最好办法还是开启滑块。</p><p>费用的话，大部费用是由“客户端请求到边缘加速服务器的流量”和“边缘加速服务器响应给客户端的流量”组成的，而且滑块页面不计入流量。可免费试用。</p><p>在开启滑块的情况下，1分钟产生10M流量，基础版包含的50GB可以用3天。<span style="text-wrap-mode: wrap;">标准版（500GB）375元可以用一个月。</span>（以我站实测为例，各站情况不同）。</p><p>具体费用在“计费管理-套餐管理-套餐总量 (月)-<img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20260129/6390528700991145641713440.png" title="image.png" alt="image.png"/>”查看。<span style="text-wrap-mode: wrap;">超过套餐的流量会使用CDN流量包抵扣。</span></p><p>ECS 获取客户端 IP 的问题有两种解决方案，1. 设置<a href="https://help.aliyun.com/zh/edge-security-acceleration/esa/user-guide/nginx-obtains-the-real-ip-address-of-the-client?spm=a2c4g.11186623.help-menu-2673927.d_2_8_3_0_1.2910ee82mdFgeO" target="_blank">四层代理分析</a>（企业版），2. 设置重定向规则，重定向到直接解析到该网站的另一个域名。</p><p><strong>为了尽量减少滑块对用户体验的影响，建议加白名单：ESA-站点-安全防护-WAF-白名单规则，譬如添加省份规则，跳过全部规则（包括滑块）。</strong></p><p>其它问题：滑块会拒绝蜘蛛？</p><p>其它相似产品：Cloudflare、腾讯云 EdgeOne。</p><p><br/></p><p><span style="text-wrap-mode: wrap;">----------------</span>下面是停站维护时显示临时页面的做法----------------</p><p>被攻击期借用阿里云 OSS/CDN 显示“维护中”页面的方法。</p><p>1.</p><p>首先让 AI 快速生成一个维护中的页面，上传到 OSS。</p><p>虽然这个文件有一个对应的 CDN 链接，但是域名解析使用“显性 URL”模式并不能正常访问到这个页面。</p><p>2.</p><p>在阿里云 CDN 添加一个域名（也就是网站域名），会生成一个 CNAME 域名，网站域名 CNAME 到这个域名上。</p><p>配置这个 CDN 域名的 OSS 实例、HTTPS 等信息。</p><p>这样生效后，访问网站域名就能请求到这个 OSS 上了。</p><p>3.</p><p>但是它并不像网站一样有默认文档，需要添加重写规则。</p><p>打开 CDN-域名管理-缓存配置-重写访问URL，添加，添加重写规则。</p><p>例：如果目标页面路径是&nbsp;https://域名/index.html，那么重写规则就是：</p><pre class="brush:plain;toolbar:false">^/(?!.*index\.html$).*$</pre><p>也就是把所有除 /index.html 以外的路径全部重写到 /index.html。<br/></p><p>4.</p><p>下一步只要观察这个域名的实时流量和带宽，如果攻击停止了，将域名解析回 ECS。</p><p>CDN-统计分析-实时监控-访问数据-选择域名-查询。<br/></p>]]></description>
      <pubDate>Wed, 28 Jan 2026 05:58:28 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[nginx 配置文件中如何写两个条件“且”的关系？]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/nginx-config-and]]></link>
      <description><![CDATA[<p>nginx 配置文件中不能随意嵌套 if，而且 if 中也没有 and 和 or 逻辑，不过可以借用变量来实现：<br/></p><pre class="brush:plain;toolbar:false">set&nbsp;$a&nbsp;&quot;&quot;;
if&nbsp;($request_uri&nbsp;~*&nbsp;&quot;action=postreview&quot;)&nbsp;
{
&nbsp;&nbsp;&nbsp;set&nbsp;$a&nbsp;&quot;${a}1&quot;;
}
if&nbsp;($http_referer&nbsp;!~*&nbsp;&quot;^https?://([^/]+\.)?domains\.com([:/?#]|$)&quot;)&nbsp;
{
&nbsp;&nbsp;&nbsp;set&nbsp;$a&nbsp;&quot;${a}1&quot;;&nbsp;
}
if&nbsp;($a&nbsp;=&nbsp;&#39;11&#39;)
{
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;403;
}

fastcgi...</pre><p>上例中实现了 url 中包含&nbsp;action=postreview 且来源不是本站的情况拒绝访问。</p><p>一般放在&nbsp;fastcgi 所在 location，譬如宝塔面板的&nbsp;enable-php-xx.conf 文件中。</p>]]></description>
      <pubDate>Thu, 22 Jan 2026 07:29:36 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[写一句 MySQL 语句，优化和修复所有表]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/mysql-repair-optimize-all-databases]]></link>
      <description><![CDATA[<p>在MySQL中，没有单条SQL语句能直接优化和修复所有表。不过，有以下两种常用方法可以实现这个需求：</p><p>1. 使用MySQL命令行工具:</p><pre class="brush:ps;toolbar:false">mysqlcheck&nbsp;-u&nbsp;root&nbsp;-p&nbsp;--auto-repair&nbsp;--optimize&nbsp;--all-databases</pre><p>这条命令会提示输入密码，然后自动修复并优化所有数据库中的所有表。</p><p>2. 如果确实需要在MySQL客户端内执行，可以生成批处理语句：</p><pre class="brush:sql;toolbar:false">SELECT&nbsp;CONCAT(&#39;OPTIMIZE&nbsp;TABLE&nbsp;&#39;,&nbsp;table_schema,&nbsp;&#39;.&#39;,&nbsp;table_name,&nbsp;&#39;;&nbsp;REPAIR&nbsp;TABLE&nbsp;&#39;,&nbsp;table_schema,&nbsp;&#39;.&#39;,&nbsp;table_name,&nbsp;&#39;;&#39;)&nbsp;
FROM&nbsp;information_schema.tables&nbsp;
WHERE&nbsp;table_schema&nbsp;NOT&nbsp;IN&nbsp;(&#39;information_schema&#39;,&#39;mysql&#39;,&#39;performance_schema&#39;,&#39;sys&#39;);</pre><p>执行此查询后，复制结果中的所有语句再执行。</p><p>注意：执行表优化和修复操作需要相应权限，且在高负载生产环境中应谨慎操作，最好在低峰期进行。</p>]]></description>
      <pubDate>Thu, 22 Jan 2026 07:25:35 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[ASP.NET 网站发布到 IIS 报错，如何查看错误详情？]]></title>
      <link><![CDATA[https://xoyozo.net/Blog/Details/how-to-view-aspnet-error]]></link>
      <description><![CDATA[<p>方法一：打开 事件查看器-&gt; Windows 日志-&gt; 应用程序。</p><p><img src="//cdn.xoyozo.net/net.xoyozo/upload/ueditor/20251223/6390207632513014062631522.png" title="QQ20251223-081955.png" alt="QQ20251223-081955.png"/></p><p><br/></p><p>方法二：启用ASP.NET Core Module Stdout 日志。</p><p>修改网站根目录下的 web.config 文件，在 &lt;aspNetCore&gt; 节点中启用标准输出日志。你需要先手动创建 logs 文件夹并确保有写入权限。</p><pre class="brush:xml;toolbar:false">&lt;aspNetCore&nbsp;processPath=&quot;dotnet&quot;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arguments=&quot;.\YourAppName.dll&quot;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stdoutLogEnabled=&quot;true&quot;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stdoutLogFile=&quot;.\logs\stdout&quot;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hostingModel=&quot;inprocess&quot;&nbsp;/&gt;</pre><p>重现错误后，即可在 logs 目录下查看生成的日志文件。注意：出于性能考虑，问题解决后建议将 stdoutLogEnabled 设为 false。</p>]]></description>
      <pubDate>Tue, 23 Dec 2025 00:47:02 GMT</pubDate>
    </item>
  </channel>
</rss>