博客 (312)

我来为你整理 Windows 本地部署 OpenClaw 并通过长连接方式接入企业微信的完整步骤:

前置条件

  • 已安装企业微信最新版客户端

  • 已安装 OpenClaw(Node.js 版本需 ≥ 22.0)

  • 管理员权限的企业微信账号(否则看不到 API 模式选项)

第一步:在企业微信创建长连接机器人

  1. 打开企业微信客户端 → 工作台 → 智能机器人 → 创建机器人

  2. 点击底部小字 "如需使用自有系统获取成员与机器人的聊天并输出回复,可切换至 API 模式创建"

  3. 选择 「长连接」 方式(不要选 Webhook 回调模式)

  4. 复制保存生成的 Bot ID 和 Secret(后续需要用到)

  5. 先不要点击保存,保持页面打开,等完成 OpenClaw 配对后再保存 

第二步:Windows 本地安装企微插件

打开 PowerShell 或 命令提示符,依次执行以下命令:

1. 安装企业微信插件

openclaw plugins install @wecom/wecom-openclaw-plugin

如果安装失败,可尝试备用命令: openclaw plugins install @tencent/openclaw-wecom

2. 重启 OpenClaw 网关

openclaw gateway start

重要:这个窗口不能关闭,关闭后机器人会掉线。需要再新开一个终端窗口执行后续命令。

3. 添加企业微信渠道

在新开的终端窗口执行:

openclaw channels add

按提示操作:

  1. 用方向键选择 企业微信(WeCom) → 回车

  2. 粘贴输入 Bot ID → 回车

  3. 粘贴输入 Secret → 回车

  4. 选择 Finished/Done 完成基础配置

  5. 配对方式选择 Pairing

第三步:完成配对授权

1. 回到企业微信,找到刚创建的机器人,发送任意消息(如"你好")

2. 机器人会自动回复一条配对码消息(包含授权命令)

3. 复制消息最后一行的配对码

4. 在终端中执行配对命令:

openclaw pairing approve openclaw-wecom 你的配对码

5. 提示"授权成功"即完成配对

第四步:保存并启用机器人

1. 回到企业微信机器人配置页面,点击 保存并创建

2. 现在可以在企业微信中与机器人正常对话了

长连接 vs 回调模式的优势

特性长连接模式传统回调模式
公网IP/域名❌不需要✅必须需要
内网穿透❌不需要✅必须配置
消息加解密❌无需处理✅需要处理
稳定性高(无回调失败问题)低(经常回调失败)
主动推送
✅支持✅支持

常见问题

问题解决方案
没有 API 模式选项确认你是企业微信管理员,普通成员看不到该选项
插件安装失败检查网络连接,或尝试切换 npm 镜像源: npm config set registry https://registry.npmmirror.com/
配对码无法获取确认选择了 API 模式和长连接,重启 OpenClaw 后重试
机器人不回复检查网关窗口是否保持运行,重新执行配对命令
需要 7×24 小时在线建议部署到云服务器,本地关机后机器人会离线

命令速查表

# 安装插件
openclaw plugins install @wecom/wecom-openclaw-plugin

# 启动网关(窗口不能关)
openclaw gateway start

# 添加渠道
openclaw channels add

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

# 重启服务
openclaw gateway restart

# 查看状态
openclaw channels status

配置完成后,你就可以在企业微信中与 OpenClaw 对话了。如果需要让个人微信也能使用,可以在企业微信后台 "我的企业" → "微信插件" 中生成二维码,用个人微信扫码关注企业即可。

xoyozo 半个月前
1,920

前面写过一篇文章介绍了不买高防 IP,照样抵挡 DDoS 攻击(IP 篇),如果攻击的是域名(CC),那么...


本文适用场景:攻击的是 web 网址而非 IP,来源有许多各地的 IP 地址,每个 IP 地址每小时只有若干请求,但整个网站每分钟有数万请求量。


《小白鼠A》(贵)

阿里云有一款产品叫“Web 应用防火墙”,开通并接入云产品,试用按量付费即可。

在防护配置-Web核心防护 中可配置各种规则,譬如:

“自定义规则”可添加网址/UA/IP/Cookie/等中包含某些关键词的请求;

“区域封禁”可按地区来限制请求;

另外还有“CC防护”等各种实用规则。

添加规则后记得关联实例。

配置完成后可在总览页面查看请求情况,如果攻击停止可关闭防火墙。

试用了12小时,平均每分钟请求2-5万次,消耗 15000SeCU,费用大概是750元。


《小白鼠B》(推荐)

阿里云有一款产品叫“边缘安全加速 ESA”,开通接入域名(注意填写域名时不要写 www)。

创建购买成功后会有一个 CNAME 域名,解析生效。配置 HTTPS 证书。

打开“我正在遭受攻击”,开启后站点进入严格防护模式,默认对所有 HTTP 请求做滑块挑战。这是非常能节省费用的操作,实测开启与不开启的数量相差20倍(具体视攻击强弱)。

另外,ESA 自带的“安全防护-WAF”中若想根据 URL 中包含某个关键词来拒绝请求,需要升级套餐。可以直接在“规则-重定向”设置 302 跳转也能达到类似的效果,但是节省流量的最好办法还是开启滑块。

费用的话,大部费用是由“客户端请求到边缘加速服务器的流量”和“边缘加速服务器响应给客户端的流量”组成的,而且滑块页面不计入流量。可免费试用。

在开启滑块的情况下,1分钟产生10M流量,基础版包含的50GB可以用3天。标准版(500GB)375元可以用一个月。(以我站实测为例,各站情况不同)。

具体费用在“计费管理-套餐管理-套餐总量 (月)-image.png”查看。超过套餐的流量会使用CDN流量包抵扣。

ECS 获取客户端 IP 的问题有两种解决方案,1. 设置四层代理分析(企业版),2. 设置重定向规则,重定向到直接解析到该网站的另一个域名。

为了尽量减少滑块对用户体验的影响,建议加白名单:ESA-站点-安全防护-WAF-白名单规则,譬如添加省份规则,跳过全部规则(包括滑块)。

其它问题:滑块会拒绝蜘蛛?

其它相似产品:Cloudflare、腾讯云 EdgeOne。


----------------下面是停站维护时显示临时页面的做法----------------

被攻击期借用阿里云 OSS/CDN 显示“维护中”页面的方法。

1.

首先让 AI 快速生成一个维护中的页面,上传到 OSS。

虽然这个文件有一个对应的 CDN 链接,但是域名解析使用“显性 URL”模式并不能正常访问到这个页面。

2.

在阿里云 CDN 添加一个域名(也就是网站域名),会生成一个 CNAME 域名,网站域名 CNAME 到这个域名上。

配置这个 CDN 域名的 OSS 实例、HTTPS 等信息。

这样生效后,访问网站域名就能请求到这个 OSS 上了。

3.

但是它并不像网站一样有默认文档,需要添加重写规则。

打开 CDN-域名管理-缓存配置-重写访问URL,添加,添加重写规则。

例:如果目标页面路径是 https://域名/index.html,那么重写规则就是:

^/(?!.*index\.html$).*$

也就是把所有除 /index.html 以外的路径全部重写到 /index.html。

4.

下一步只要观察这个域名的实时流量和带宽,如果攻击停止了,将域名解析回 ECS。

CDN-统计分析-实时监控-访问数据-选择域名-查询。

xoyozo 2 个月前
323

nginx 配置文件中不能随意嵌套 if,而且 if 中也没有 and 和 or 逻辑,不过可以借用变量来实现:

set $a "";
if ($request_uri ~* "action=postreview") 
{
   set $a "${a}1";
}
if ($http_referer !~* "^https?://([^/]+\.)?domains\.com([:/?#]|$)") 
{
   set $a "${a}1"; 
}
if ($a = '11')
{
    return 403;
}

fastcgi...

上例中实现了 url 中包含 action=postreview 且来源不是本站的情况拒绝访问。

一般放在 fastcgi 所在 location,譬如宝塔面板的 enable-php-xx.conf 文件中。

xoyozo 2 个月前
318

在MySQL中,没有单条SQL语句能直接优化和修复所有表。不过,有以下两种常用方法可以实现这个需求:

1. 使用MySQL命令行工具:

mysqlcheck -u root -p --auto-repair --optimize --all-databases

这条命令会提示输入密码,然后自动修复并优化所有数据库中的所有表。

2. 如果确实需要在MySQL客户端内执行,可以生成批处理语句:

SELECT CONCAT('OPTIMIZE TABLE ', table_schema, '.', table_name, '; REPAIR TABLE ', table_schema, '.', table_name, ';') 
FROM information_schema.tables 
WHERE table_schema NOT IN ('information_schema','mysql','performance_schema','sys');

执行此查询后,复制结果中的所有语句再执行。

注意:执行表优化和修复操作需要相应权限,且在高负载生产环境中应谨慎操作,最好在低峰期进行。

xoyozo 2 个月前
303

今天发现在 .NET Framework 和 .NET 9 中使用 System.Uri.EscapeDataString() 方法对字符串进行编码,会产生不同的结果。

譬如“(”符号,前者视其为非保留字符,不进行转义,后者视为保留字符,转义为“%28”。

原因是 .NET Framework 4.8 主要遵循 RFC 2396,而 .NET 9 遵循 RFC 3986。


在跨平台签名验证场景中,对 URL 编码的一致性要求极高,任何细微差别都会导致签名校验失败。

以下是以 RFC 3986 标准为核心、优先使用各平台内置的高一致性方案。


对于 .NET 9,直接使用 Uri.EscapeDataString()。

string encodedData = System.Uri.EscapeDataString(dataToEncode);


对于 .NET Framework,以下是一个遵循 RFC 3986 严格标准的自定义编码方法示例。

static string Rfc3986EscapeDataString(string input)
{
    // 定义 RFC 3986 中明确的未保留字符集(不编码)
    var unreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";

    var result = new StringBuilder();
    byte[] data = Encoding.UTF8.GetBytes(input); // 统一转换为 UTF-8 字节

    foreach (byte b in data)
    {
        char currentChar = (char)b;
        // 如果是未保留字符,直接输出
        if (unreservedChars.IndexOf(currentChar) != -1)
        {
            result.Append(currentChar);
        }
        else
        {
            // 否则,进行百分号编码(%XX,大写)
            result.Append('%').Append(b.ToString("X2"));
        }
    }
    return result.ToString();
}


对于 PHP,直接使用内置的 rawurlencode() 函数。这个函数的设计初衷就是严格遵循 RFC 3986 标准。

$encoded_data = rawurlencode($data_to_encode);


对于 JavaScript,encodeURIComponent 函数严格遵循 RFC 3986 标准。

let encodedData = encodeURIComponent(dataToEncode);


重要提示:无论使用哪种语言,务必在编码前明确指定字符串使用 UTF-8 编码。编码不一致是导致乱码和签名失败最常见的原因之一 。

xoyozo 4 个月前
938

一般地,应选择尺寸小于显存的大模型版本,且适当冗余。

譬如,显存 8GB,选择尺寸为 5.2GB 的 deepseek-r1:8b。

这样,整个大模型都能被完整地读取到显存中。

若选择 9.0GB 的 deepseek-r1:14b 则显存不足,Ollama 会自动调用系统内存和 CPU 来协同工作,导致推理速度显著下降。

显卡的算力影响生成的速度,模型的参数决定生成的质量。

另外经实测,在 /api/generate 接口的 format 参数中设置返回的 JSON 格式,会缩短生成时间,降低生成质量,可能的原因是强制格式限制了词汇选择空间。

xoyozo 4 个月前
882

1、在“视图”选项卡上展开“视觉帮助”

“视觉帮助”框启动器

2、在“对齐和粘附”对话框中的“常规”选项卡上,在“当前活动”下,清除“粘附”复选框。

关闭粘附功能

3、操作方式

直接拖动连接线的端点仍然是自动粘附至形状的,按住 Alt 再拖动则会在任意位置停留。


此设置的缺点是:无法在鼠标自动依靠形状时自动提示连接线,需要复制已有连接线来达到新建的目的。

xoyozo 5 个月前
1,826

查询路径:阿里云控制台 - 费用与成本 - 订购订单 - 企业服务产品订单

查询网址:https://billing-cost.console.aliyun.com/order/list/enterprise/paid

xoyozo 5 个月前
665

个人整理,仅供参考。具体规格请以官方发布为准。


名称万兆路由器BE10000BE7000BE6500 ProBE6500全屋 BE3600 Pro 套装全屋 BE3600 Pro 网线版BE10000 Pro
型号



主:RN04

子:RN01

主:RP01

子:RP03


上市时间2022.102023.52023.102024.82024.102025.52025.9
处理器Qualcomm 四核 A73 2.2GHzQualcomm 四核 A73 1.5GHzQualcomm 四核 A53 1.5GHzQualcomm 四核 A53 1.1GHz

主/子:

高通 IPQ5312 四核 1.1GHz

主/子:

Qualcomm Dragonwing N7

Qualcomm A7 四核 1.8GHz
内存2GB1GB1GB512MB

主/子:512MB

一说子是 128MB

主:512MB

子:256MB

2GB
频段2.4GHz、5.2GHz、5.8GHz2.4GHz、5GHz2.4GHz、5GHz2.4GHz、5GHz2.4GHz、5GHz2.4GHz、5GHz2.4GHz、5.2GHz、5.8GHz
组网混合 Mesh混合 Mesh混合 Mesh混合 Mesh混合 MeshAC + APAI Mesh
天线12根高增益天线 + 12路信号放大器 + NFC内置天线7根外置高增益WiFi天线 + 1根内置高增益WiFi天线 + NFC内置天线6根高增益WiFi内置天线 + 1根蓝牙内置天线 + 1根NFC内置天线6根外置高增益Wi-Fi天线主/子:4根内置天线

主:无

子:2根内置双频天线

12根高增益天线 + 12路信号放大器
中枢网关不支持不支持支持不支持

主:支持

子:不支持

主:支持

子:不支持

支持
蓝牙网关不支持不支持

蓝牙 Mesh 1.0 100 台 + 蓝牙 100 台

升级固件后支持蓝牙 Mesh 2.0

蓝牙 Mesh 1.0

蓝牙 Mesh 1.0 200 台 + 蓝牙 100 台

主:不支持

子:蓝牙 Mesh 2.0

蓝牙 Mesh 2.0 200 台 + 蓝牙 100 台

散热主动散热自然散热自然散热自然散热自然散热

主:自然散热

子:主动散热

主动散热
接口

4×2.5G

1×10G

1×10G SFP+

1×USB 3.0

4×2.5G

1×USB 3.0

4×2.5G4×2.5G

主/子:

1×2.5G

3×1G

主:5×2.5G

子:2×2.5G

4×2.5G

2×10G

1×M.2

1×USB 3.0

Wi-FiWi-Fi 7Wi-Fi 7Wi-Fi 7Wi-Fi 7Wi-Fi 7

主:无

子:Wi-Fi 7

Wi-Fi 7
价格
最新价格最新价格最新价格最新价格最新价格最新价格最新价格
  • 表格于 2025 年 10 月整理更新。

  • 如果只考虑支持蓝牙 Mesh 2.0,那么有 BE3600 Pro 网线版 和 BE10000 Pro 可选,搭配其它 Mesh 路由器实现全屋 Wi-Fi 7 覆盖,搭配其它中枢网关或从网关设备实现全屋蓝牙 Mesh 2.0 覆盖。

  • 如果考虑用 Xiaomi 中枢网关 来部署独立的中枢架构,那么选择路由器就没有限制了。

  • 名称中带有“全屋”字样的通常以子母套装形式出售,子母路由配置通常不同。购买两台一模一样的普通 BE 路由器,就相当于组建了一套“不分子母”的 Mesh 套装。

  • 名称中带有“Pro”字样的通常具备中枢网关功能。

xoyozo 5 个月前
3,632

在 Linux 上运行 .NET 网站,通过

HttpContext.Connection.RemoteIpAddress

获取客户端的 IP 地址,结果是

::ffff:127.0.0.1

解决方法:

打开 Program.cs 文件,在 var app = builder.Build(); 之前(尽量往前)添加以下代码:

if (OperatingSystem.IsLinux())
{
    builder.Services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor
                                    | ForwardedHeaders.XForwardedProto
                                    | ForwardedHeaders.XForwardedHost;

        // 清除 KnownNetworks 和 KnownProxies,表示信任来自本机的代理(如 Nginx)
        options.KnownNetworks.Clear();
        options.KnownProxies.Clear();
    });

    Console.WriteLine("ForwardedHeaders enabled (Running on Linux)");
}

然后在 app.UseRouting(); 之前添加以下代码:

if (OperatingSystem.IsLinux())
{
    app.UseForwardedHeaders();
    Console.WriteLine("UseForwardedHeaders() applied.");
}

其中,OperatingSystem.IsLinux() 用于判断只在 Linux 环境中生效,你可以视自身情况作判断。

xoyozo 6 个月前
4,275