作者归档:wmbk

解决 CyberChef 解码 ROT13 后出现乱码的问题

这并不是仅在 CyberChef 出现的问题,但由于它是一个主流工具所以就用它做例子了

今天在做一题题目时,需要把经过一连串编码后的 Flag 倒着解码回去,所以我用了 CyberChef 来解码,然后成功的出现了乱码,过了好一会才发现在到 ROT13 这一步时出了问题(原谅我对这部分没有什么经验)

题目的编码过程大概是这样的:

我傻傻的以为直接再用一次 ROT13 就能”翻转”回去,但问题就在这里,上方的过程实际上是根据偏移量 3 把字母移后了三位(如 A 变成 D),直接把输出再套一次 ROT13 不但不能解码,还会把字母再移后了三位,结果就是再 Base32 解出乱码


解决方法

既然编码过程是把字母以后,那其实我们可以在 Amount 里填入-3,就能倒着向前移动,亦或用一点基本减法,用 26 减去 3,输入 23 也是一样的效果(因为是 26 个字母嘛)

当然上述的方法只适用于已经知道偏移量的情况,如果不知道就可以用 ROT13 Brute Force 爆破看有效的结果


最后,其实 ROT13 自身是能直接翻转的(26-13 还是 13),但当漂移量不是 13 的时候就不能了

如何在树莓派 4B 上驱动一块 2.4 寸 SPI 屏幕

最近有需求在一块树莓派 4B 上用一块 2.4 寸的屏幕来显示桌面画面,于是买了一块 ILI9341 芯片的 2.4 寸屏幕,最后折腾了大半天才成功显示


解决方法

用了 AI 给的各种方案都行不通,最后在 GItHub 上搜到了这个项目一键安装:

sudo rm -rf LCD-show
git clone https://github.com/goodtft/LCD-show.git
chmod -R 755 LCD-show
cd LCD-show/
sudo ./LCD24-3A+-show

下载后自带了各种屏幕的驱动脚本,由于我的这个屏幕是 2.4 寸的所以用 sudo ./LCD24-3A+-show

执行命令后会自动安装重启,然后屏幕会取代掉 HDMI 的输出,显示桌面(假设有桌面环境)

另外,如果需要卸载这个项目,可以用 ./LCD-hdmi ,就能恢复到 HDMI 输出了

如何从 ClawCloud Run 爪云迁移 n8n 到自托管 Docker

今天逛论坛时发现ClawCloud Run 服务要下线了,备份最后期限是 5 月 11 日的 0 点 UTC,想起来我有些 n8n 服务还部署在上面呢!赶紧迁移到 NAS 里,在这里也记录一下过程,希望能帮到同道中人

实测部署的 n8n 已经显示 no healthy upstream,但在控制台里文件还能访问下载,所以抓紧备份


备份数据

迁移 n8n 基本上就是迁移两样东西:数据库和解密密钥,即 database.sqlite 和 config 文件

首先,登录 ClawCloud Run 后台,然后在 App Launchpad 里找到部署的 n8n 服务(如果列表空白,记得切换左上角的部署地区)。

点击页面底部的文件管理按钮

这里需要一点时间加载,完成后下载.n8n 目录下的 database.sqlite 和 config 文件


Portainer 部署

接下来以在裙辉 NAS 下的 Portainer 环境部署为例

首先创建一个存放数据的目录,例如 /volume1/docker/n8n

往目录上传刚刚备份的两个文件,并设置所有人的读写权限

在 Portainer 中新建一个 Stack,写上以下配置:

services:
  n8n:
    image: n8nio/n8n:latest
    restart: always
    environment:
      - TZ=Asia/Hong_Kong 
    volumes:
      - /volume1/docker/n8n:/home/node/.n8n #改为你的目录
    ports:
      - 5678:5678

点击 Deploy the stack 部署

再打开 IP:5678 登录 n8n,如无意外能看到原来的工作流都还在


果然免费的服务就是不靠谱啊!用着用着就没了

DIY 维修数控电子防潮柜 更换制冷片记录

大概在三年前我刚开始学摄影那会购入了一个 X 通的 32L 数控电子防潮柜,印象中是花了一百多元

然后就在前几天它坏了…一百多用了三年也还能接受吧

用手模不发热也不制冷,估摸着是制冷片烧了所以下单了一块 TES1-04903 制冷片作替换,在这里记录一下更换过程 😛


维修过程

首先断电,拆掉机芯四周的十字螺丝,拔掉上方连接数控屏的排线,轻轻一晃就能把整个机芯拔出来

然后用一把细长的螺丝刀拆掉两个保护罩上各两颗螺丝,露出电路板和冷凝片,插电后用万用表测量电路板输出,发现是稳定的 3.6V,实锤是制冷片寿终正寝了

拆掉固定垫片和螺丝,将坏的制冷片取下来

然后从坏的制冷片上剪掉插头,用工具钳轻微的夹一夹剥掉线皮

这里我没用电烙铁,而是把线头放进焊锡热缩管里再用打火机烧(这小东西挺方便的,以后家里得备点)

把冷热端两块散热片上的干硅脂用酒精湿巾擦干净,挤上之前组 NAS 剩的硅脂,安回冷凝片,再拧上固定小散热片的螺丝,在装回去之前先插电测试

这里需要注意:装回去之前一定要先通电测试制冷面是不是朝内,有字不代表就是制冷,避免返工再折腾!

我就不出所料把制冷片给装反了(被自己的经验给误导了)  🙁

确认制冷方向正确后按照上面的过程倒着装回去,大功告成

通电一个小时后湿度从 65%降到了 55%,满血复活~


好了,这下又能安心把相机镜头放回去再战三年了!

 

只需不到十元 用 RP2040 DIY 一条 YubiKey FIDO2 物理密钥

我曾经有考虑过购买一条 Yubikey 来作为 U2F 验证用途,但是鉴于最便宜的 YubiKey 5C NFC 都要$58 美刀,所以还是忍住没下手(错过了 Cloudflare 曾经的 10 刀优惠 :()

直到昨天我发现了一个开源项目 Pico FIDO(曾名 Pico Keys)可以把 ESP32-S3/RP2035/RP2040 变成一条类似 YubiKey 的实体密钥,刚好我剩下一块微雪的 RP2040-Zero 开发板就利用上了

RP2040 在购物平台上的价格平均在 10 元左右,算是很划算了,但是需要注意 RP2040 内储存的密钥在被物理接触时是可以被盗取的,而其余两个则无此风险,严格注意安全的需要注意了


刷写固件

要给 RP 系列开发板刷固件很简单,以我手上这块为例,只需要按着板上的 BOOT 按钮再连接 USB 线,电脑就能识别到一个盘符,名称是 RPI-RP2

GitHub上下载最新的发行版固件(我用的是 pico_fido_pico-7.6.uf2),直接拖到开发板盘里就能自动刷固件,安装完成后会自动重启

重启后你的开发板就变成了一个可以用于 FIDO2 验证的物理密钥,可以直接在需要 U2F 的网站添加使用,也可以到https://webauthn.io测试登录

这个项目曾经有一个很方便的设置网页,但是在前几个月变成了一个收费€29 欧元的 PicoKey App,我是不会付费的,且不设置也能正常使用,就没有多折腾了


使用密钥

这里以 Vaultwarden 为例,任意支持 Passkey 登录的平台理论上都适用

在 Vaultwarden 后台左侧的设置>安全里找到 Two-step login 选项,找到 Passkey 选项,输入密码库的主密码后便能添加密钥(这里如果唤醒的浏览器插件内置的 Passkey 选择,找到插件的“使用实体密钥”或类似选项)

首次使用密钥需要设置一个密码,以后每次认证都需要输入一次,设置密码后按 BOOT 按键来认证

然后再到 Master password 页,打开 Log in with passkey,这样以后登录便无需输入邮箱

配置后每次登录的流程为: 点击使用 Passkey 登录>输入密码>按实体认证按钮(在 Vaultwarden 还需要再输入一遍主密码)


买了条透明热缩管套着,用打火机烧了烧防止弄掉零件

封面图是我把背景打印出来再把板子放上去拍照而来 😛

为解决晚上睡觉途中突然亮灯 再次购入小米人体感应器一枚

继两天前在 Home Assistant 配置了人来灯亮(以及人走灯灭),这两天晚上都因为检测范围过大导致多次意外亮起,虽然也只是几分钟就灭了但也确实降低了我的睡眠质量,我能想到的解决方法只有两个:在睡前把灯带关闭,或者再购入一个感应器来检测我是否在床,最后我感觉后者合理一点(还是懒啊)


我把新买的感应器放到了床头的位置对着我的头,那么理论上只要我在床上就能检测到,配对上网关,再到 HA 里刷新设备,往自动亮灯的自动化里加上一个条件:

- condition: template
            value_template: >-
              {% set t =
              states('event.xiaomi_cn_blt_3_xxx_pir1g_motion_detected_e_2_1008')
              | as_datetime %} {{ t is not none and (now() - t).total_seconds()
              > 180 }}

当距离上一次检测到我在床的 3 分钟后才允许亮灯,希望不会再把我弄醒

2026.04.10 更新:这两晚都没有再在睡觉途中亮了 🙂


另外,我之前买的 COB 灯带也到了,COB 灯带的 LED 排的比传统灯带(SMD)更密集,所以看起来没有一粒粒的点光

我把灯带黏到床底后才发现由于我买的智能控制器只有开关,没有调压/亮度功能,最高亮度太亮了!没有我想要的效果所以我打算不把它加到人来灯亮的自动化里,而是额外新建一个按钮开关灯的配置

提醒各位如果想买灯带记得控制器要买带调光功能的


给博客加上了归档页面,链接在页眉的菜单内,方便索引文章~

Home Assistant 配合小米人体传感器 2s 实现人走关灯

我的需求为当离开房间 5 分钟后自动关闭灯光,于是买了一个小米的人体传感器 2s,这个传感器比其他的设备多了一个光照亮度检测,可以顺带实现晚上起夜自动亮床边灯带

但是由于我贪便宜买的这个是人体传感器,而不是人在传感器,导致有些时候会误判关灯(人在传感器内有个雷达,比较适合于静止的人;人体则适合移动/路过的)

另外当在 Home Assistant 内配合小米插件时,Motion detected 这个 entity 只有”上一次触发有人的时间“这个状态,而没有像在米家内的”隔一段时间无人“的状态,而我的想法是每隔一分钟判断上一次触发过了多久,超过了 300 秒就执行关灯(走后五分钟关灯方便临时离开的情况)

{% set t = states('event.xiaomi_cn_blt_3_xxx_pir1g_motion_detected_e_2_1008') | as_datetime %} {{ t is not none and (now() - t).total_seconds() > 300 }} #记得修改 event id

于是最终的自动化是:

alias: Turn Off Light When No Motion
description: ""
triggers:
  - minutes: /1
    trigger: time_pattern
conditions: []
actions:
  - choose:
      - conditions:
          - condition: template
            value_template: >-
              {% set t = states('event.xiaomi_cn_blt_3_xxx_pir1g_motion_detected_e_2_1008')  | as_datetime %} {{ t is not none and (now() - t).total_seconds()
              > 300 }}
        sequence:
          - action: light.turn_off
            target:
              entity_id: light.xxx #灯的 entity
mode: single

如果你也打算买一个类似的设备,大多是需要搭配小米自家的网关的,而且必须有蓝牙 Mesh 协议,有些旧的网关只支持 Zigbee 协议是不能连接上的

另外,我买的人体传感器 2s 是需要一颗 CR2450 电池的,需要注意

最划算的方案是买一个二手的小爱音箱,记得跟卖家确认支持的协议再下单

Home Assistant 绑定米家账号后怎么刷新设备列表

问题

在 Home Assistant 使用小米官方插件并绑定账号(初始化)后,再在米家 APP 内添加设备,HA 内没有自动添加上设备,需要手动刷新设备列表

这里有一个之前写的绑定米家设备的教程,不知不觉过了两年啦


解决方法

在 HA 左下角设置>设备与服务>XiaoMi Home 里点击齿轮图标

然后在弹出的窗口滑到上方,勾选更新设备列表

在页面下方点击下一步,再勾选确认后等待几秒就能看到新添加的设备了


后记:这个 GitHub 文档里是有写的,但是明显我没有看到,在设置里找了很久才找到 🙁

如何解决 Matomo 统计的历史数据突然变成 0 访客

问题

今天打开博客的 Matomo 统计,发现 2 月其中两天的访客人数突然就变成了 0 人,我很确定在前天看的时候是有访客的,隔了两天再看已经消失了


解决方法

搜索发现,遇到这种情况只是归档数据出了问题,原始的访客日志还是在的,所以只需要重新建立一遍归档就能修复,重建归档的方法主要有两种:直接删除归档的数据表和用插件把数据表设置成“无效”,这里用后者

首先到 Matomo 插件市场里下载Invalidate Reports,在页面最底部的橘色按钮下载 WordPress 版本的插件,在 WP 里上传插件压缩包安装插件

然后到 Matomo 统计的设置>系统>设置为无效报告里把从上个月开始的数据设置为无效(根据需要调整)

然后等待下一次计划任务触发(默认一小时一次)归档数据就会重建了,或者也可以在 WP 插件的诊断>Troubleshooting 里手动点击 存档报告 按钮重建

利用 n8n 工作流实现定时检测友链状态

博客的友链不时会出现死链,网站打不开等的状态,本来想着用 UptimeRobot 这类网站监控工具来监控但是手动同步友链列表又比较麻烦,所以就改为用 n8n 工作流来定时自动获取友情链接列表,再自动逐一检测状态并筛选失效链接推送,用了点时间弄出来一个工作流,如果你有类似需求可以参考看看 🙂


n8n 工作流

先看截图:

逐一说明:

  1. 定时触发:每 10 小时触发运行
  2. HTTP 请求:发送请求到博客的友链页面(https://wuminboke.site/misc),失败重试三遍;这里需要注意如果你的博客开了 CF 5 秒盾或者类似检测,需要调整一下 WAF 规则
  3. JS 代码:提取<li>里的<a>标签,并且排除掉博客自身的域名:
    const html = $input.first().json.data
    const regex = /<li[^>]*>\s*<a\s+[^>]*href=["']?([^"'\s>]+)["']?[^>]*>/gi;
    const excludedDomains = ['wuminboke.site']; //排除自己的博客域名
    const hrefs = [];
    let match;
    while ((match = regex.exec(html)) !== null) {
      const href = match[1];
      const isExcluded = excludedDomains.some(domain => href.includes(domain));
      if (!isExcluded) {
        hrefs.push(href);
      }
    }
    return hrefs.map(href => ({ json: { href } }));
  4. HTTP 请求:逐一发送 GET 请求到 {{ $json.href }} ,并且把设置里的 On Error 改为 Continue (using error output),错误时继续
  5. 如果:把上一步的 Error 拉到如果,配置 {{ $input.all().length }} # is equal to 0,判断有无错误
  6. JS 代码:如果上一步“如果”的结果是“否”,那么把错误的网址和错误码拼起来:
    const items = $input.all();
    const lines = items.map(item => {
      const href = item.json.href;
      const status = item.json.error?.status ? ` ${item.json.error.status}` : '';
      return `${status}\n ${href}`;
    });
    const message = `检测完成 (共有${lines.length}个错误)\n\n` + lines.join('\n\n');
    return [{ json: { message } }];
  7. TG 推送:利用 TG 机器人发送通知(我在消息前还加了时间,但是不是必要的);在@BotFather 创建机器人获取 Token 并用@userinfobot 获取账号的聊天 ID

不想自己托管 n8n 的可以找找那些免费 Docker 容器服务,比如 ClawCloud 绑定 GitHub 后就有免费的额度可以用 😛