WeFlow 无法使用怎么办?一次数据库组件到期问题的排查与修复

WeFlow (https://github.com/hicccc77/WeFlow)突然连不上数据库,之前能看的聊天记录也打不开了?这次遇到的原因是:应用里的数据库组件设置了到期时间,超过日期后,初始化会直接失败。

本文记录一次实际修复:先根据日志找到原因,再备份应用,把数据库组件的两处到期时间延长到 2037 年,最后验证数据库连接与会话读取。整个过程没有调整电脑时间。

一、问题现象与修复结果

(一)遇到了什么问题?

启动WeFlow时提示"启动失败,请反馈错误码":

WeFlow 无法正常访问数据库。检查本机日志后,发现以下信息反复出现:

复制代码
[bootstrap] InitProtection rc=-101
[bootstrap] InitProtection failed finalCode=-101

可以把数据库组件理解成 WeFlow 读取聊天记录时使用的"工具箱"。应用启动后,需要先打开工具箱;如果初始化阶段就失败,后面的数据库连接也无法进行。

(二)这次修复后有什么变化?

检查项目 实际结果
保护初始化 InitProtection 返回 0,通过
数据库组件初始化 wcdb_init 返回 0,通过
数据库连接 返回 0,连接成功
会话列表读取 返回 0,读取到 787 条会话
电脑时间 保持正常,没有回调

这里的 787 是本机验证时返回的会话数量。不同账号的数据不同,修复成功后不需要与这个数字一致。

二、先确认是不是同一种故障

Bug: 应用启动失败,错误码: -101 · Issue #1226 · hicccc77/WeFlow

中也提到了这种故障,所以我们首先要确认是不是同一种故障。

(一)找到日志文件

按 Win + R,输入下面的路径,打开后找到 wcdb.log:

复制代码
%APPDATA%\weflow\logs

如果日志中反复出现前面的 InitProtection rc=-101,可以继续检查数据库组件。本次确认的是组件内部的到期限制;仅凭一个错误码,还不能断定所有电脑都是同一原因。

(二)本机为什么会失败?

本次检查的文件是:

复制代码
%LOCALAPPDATA%\Programs\WeFlow\resources\resources\wcdb\win32\x64\wcdb_api.dll

其中发现了两处日期检查,均指向 2026 年 9 月 30 日:

  • 第一处使用固定时间戳,对应 2026-09-30 23:59:59 UTC,过期后返回 -101。
  • 第二处在 wcdb_init 中分别设置年、月、日,再转换成时间进行比较。它使用本地时间,也需要同步调整。

排查当天是 2026 年 10 月 15 日,已经超过这两个日期。因此,这次修复的重点是组件中的日期限制。

**适用范围:**下文的文件偏移与校验值来自本次实测文件。即使版本号相同,文件也可能不同。请以完整 SHA-256 校验为准;文件不一致时,应停止使用本文的固定位置补丁,重新定位。

三、修复前先完整备份

(一)退出 WeFlow

先从托盘菜单退出 WeFlow,再打开任务管理器,确认没有 WeFlow 进程。这样可以避免文件正在使用,或者修复后仍加载旧组件。

(二)复制整个安装目录

将下面的整个文件夹复制到一个单独的备份目录:

复制代码
%LOCALAPPDATA%\Programs\WeFlow

备份目录可以命名为 WeFlow-original-backup,不要放到原安装目录里面。本次完整备份共有 599 个文件,总大小约 816 MB(按十进制计算)。

"完整备份"在这里指完整的应用安装目录。用户配置位于 %APPDATA%\weflow,聊天数据库则在配置指定的目录中,它们属于其他目录;本次补丁只替换一个 DLL 文件。

四、修改数据库组件的两处到期时间

(一)两处分别改什么?

对于本文实测文件,两处修改如下。偏移指文件中的字节位置:

位置 原内容 修改方式
0x80571 到期时间戳 0x6ABDA27F 改为 2037 年 9 月 30 日 23:59:59 UTC 的时间戳
0xE383D 年份字段 126 改为 137,保留原来的月、日和时分秒

为什么年份要写成 137?因为这里采用 C/C++ 的 tm_year 规则,保存的是"实际年份减去 1900":2026 − 1900 = 126,2037 − 1900 = 137。

两处限制需要一起修改。第一处通过后,程序还会执行第二处初始化检查。

(二)使用带校验的 Python 脚本修改

下面把本次修改整理成一个可复用的示例。脚本会先检查原文件的完整 SHA-256,再检查目标字节;任一项不匹配就退出。它还会在 DLL 同目录保留一份 .original.bak 文件。

安装 Python 3 后,把代码保存为 fix_weflow.py。确认已完成整个应用目录的备份、退出 WeFlow,再在终端运行 python fix_weflow.py。如果你的安装路径不同,需要先调整脚本中的路径。

复制代码
import os
import struct
import hashlib
from pathlib import Path
from datetime import datetime, timezone

dll = (
    Path(os.environ["LOCALAPPDATA"])
    / "Programs/WeFlow/resources/resources/wcdb/win32/x64/wcdb_api.dll"
)

# 只适用于本文实测的原文件,不能仅凭版本号判断。
original_sha256 = (
    "6915913a3a9930694e5c821bf58841e17"
    "bbad0f56691e307674fb0e31e9d44b8"
)
patched_sha256 = (
    "c26d15839a013338df9e090410495bd9d"
    "8326ebebcac1961c3d58d8916a47148"
)

raw = dll.read_bytes()
digest = hashlib.sha256(raw).hexdigest()
if digest == patched_sha256:
    raise SystemExit("该文件已经修复,无需重复修改。")
if digest != original_sha256:
    raise SystemExit("原文件校验不匹配,已停止,请勿强行修改。")

new_expiry = int(datetime(
    2037, 9, 30, 23, 59, 59, tzinfo=timezone.utc
).timestamp())

patches = [
    (0x80571, struct.pack("<I", 0x6ABDA27F),
     struct.pack("<I", new_expiry)),
    (0xE383D, struct.pack("<I", 126),
     struct.pack("<I", 137)),
]

for offset, before, after in patches:
    if raw[offset:offset + len(before)] != before:
        raise SystemExit(f"位置 {offset:#x} 的原字节不匹配,已停止。")

backup = dll.with_name(dll.name + ".original.bak")
# 独占创建,不覆盖之前的备份。
with backup.open("xb") as f:
    f.write(raw)

patched = bytearray(raw)
for offset, before, after in patches:
    patched[offset:offset + len(before)] = after

assert hashlib.sha256(patched).hexdigest() == patched_sha256
dll.write_bytes(patched)
if hashlib.sha256(dll.read_bytes()).hexdigest() != patched_sha256:
    raise SystemExit("写入后校验失败,请用备份恢复。")
print("两处到期时间已延长至 2037 年,请重新打开 WeFlow 验证。")

这段示例采用了本次修复的偏移、原字节和修复前后校验值。实际修复时,先生成修改后的文件,再替换安装目录中的 DLL,并另外执行了数据库连接验证。

五、修复后怎样确认成功?

(一)先检查界面与日志

  1. 重新打开 WeFlow,进入会话列表。
  2. 确认不再出现原来的数据库初始化错误。
  3. 检查会话是否能加载,打开已有会话,确认消息能正常显示。
  4. 再次查看日志,注意新启动对应的时间,避免把旧错误记录当成当前结果。

(二)本次的实际验证结果

本次在本机读取应用已保存的配置,调用数据库组件完成初始化、连接和会话查询。验证只输出状态和数量,未输出密钥及聊天内容:

复制代码
{
  "protection": 0,
  "initialize": 0,
  "connect": 0,
  "sessions": 0,
  "sessionCount": 787
}

**验证结论:**本次到期限制导致的初始化故障已解除,数据库连接与会话读取通过,随后重新打开了 WeFlow。这个结果验证了数据库访问链路,不能代替对应用所有功能的逐项测试。

六、常见问题与恢复方法

(一)为什么不直接把电脑日期调回去?

修改电脑时间可能影响其他软件的登录、证书检查和文件时间记录。本次直接调整发生故障的组件到期时间,电脑时间保持正常。

(二)更新或重装之后还有效吗?

不一定。更新或重装可能替换 DLL,覆盖本次修改。如果问题再次出现,应先检查新日志和新文件,不能把旧版本的偏移直接套上去。

(三)脚本提示校验不匹配怎么办?

先停止修改。它表示当前文件与本次实测文件不同,或者已经发生其他变化。应重新检查组件中的日期判断,确认适用的方法,而不是删掉校验继续运行。

(四)怎样恢复原文件?

退出 WeFlow,把完整备份中同一路径下的 wcdb_api.dll 复制回安装目录,覆盖修改后的文件。如果使用了示例脚本,也可以将 wcdb_api.dll.original.bak 复制为 wcdb_api.dll。恢复后会回到修改前的组件状态,原来的到期故障也可能重新出现。

七、参考与排查思路

参考:《Bug: 应用启动失败,错误码: -101 · Issue #1226 · hicccc77/WeFlow》

排查思路:查看WeFlow的日志确认到期限制完整备份修改两处日期验证数据库连接重新打开应用。遇到类似问题,先找到失败发生在哪一步,再决定怎么修。对这次 WeFlow 故障来说,最关键的证据是日志中的初始化错误,以及组件中已经到期的两处日期检查。

相关推荐
一条泥憨鱼2 小时前
【Redis | 黑马点评】附近商铺功能源码解读
数据库·redis·缓存
念何架构之路2 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
EnCi Zheng3 小时前
PostgreSQL 实战指南:安装配置、数据类型、索引选型、MVCC 事务与高可用备份全解析
数据库·sql·postgresql·索引·1024程序员节
泡海椒4 小时前
JQuick-SQL REST API 数据接入:应用层调用接口后注册分析表
数据库·sql·1024程序员节
Random Glow4 小时前
聚簇索引 vs 二级索引:回表、覆盖索引、索引下推
数据库·mysql·性能优化·innodb·1024程序员节·索引优化
要开心吖ZSH5 小时前
一次线上锁风暴复盘:号源表大范围 DELETE 的隐患与分批删除改造
数据库·mysql·行锁·1024程序员节·间隙锁·lockwaittimeout
l1t6 小时前
在windows中测试musql数据库
数据库·sqlite·go·1024程序员节
鬼手点金7 小时前
从 API 消息到模型 Token:Chat Template
java·前端·javascript·数据库·人工智能·深度学习·1024程序员节