首页
留言
壁纸
友链
统计
直播
推荐
🙈注册账户
🏠登录账户
📝写作投稿
👮前往后台
📩找回密码
Search
1
家庭宽带IPv6搭建3X-UI全攻略
617 阅读
2
从零开始搭建 Docker + 青龙面板 + 机器人框架 + 对接微信/QQ 机器人
241 阅读
3
【飞牛】飞牛系统挂载失败(内部错误)修复指南
235 阅读
4
小米刷机利器:MiFlash Prime Edition 2024.08.01 (修改版) - 9008免授权免登陆刷机指南
231 阅读
5
【docker】QQ docker版(NapCatQQ)
164 阅读
📑教程
💾资源
📱Android
🖥️Windows
💐活动
🏡日常
👨💼版务
💌情感
登录
/
注册
Search
标签搜索
windows
Android
docker
青龙
typecho
软件
Debian
github
插件模块
joe
玩客云
ipv6
DDNS
网络
QQ
京东
框架
web
谷歌
免流
时间煮雨
累计撰写
557
篇文章
累计收到
317
条评论
首页
栏目
📑教程
💾资源
📱Android
🖥️Windows
💐活动
🏡日常
👨💼版务
💌情感
页面
留言
壁纸
友链
统计
直播
推荐
🙈注册账户
🏠登录账户
📝写作投稿
👮前往后台
📩找回密码
搜索到
261
篇与
的结果
2026-09-25
【教程】frps 0.71.0 Docker 部署教程-对接飞牛FRPC应用
公网服务器用 Docker 跑 frps,内网机器原生跑 frpc。服务端用 host 网络,所以客户端想用哪个端口都行——你只需要管一件事:在云厂商安全组放行端口。一、拓扑外网 ──► <服务器公网IP>:6000 / 6001 / 任意远程端口 │ ┌───────▼────────┐ │ 云服务器 │ │ frps (Docker) │ │ network_mode:host│ └───────▲────────┘ │ frpc 主动外连 bindPort │(出方向,客户端不需要公网 IP,也不用路由器端口映射) ┌───────┴────────┐ │ 内网机器 │ │ frpc 原生运行 │ └────────────────┘二、服务端:4 步搞定1. 装 Dockercurl -fsSL https://get.docker.com | sh systemctl enable --now docker国内拉镜像慢可配加速(以腾讯云为例):echo '{ "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] }' | sudo tee /etc/docker/daemon.json sudo systemctl restart docker2. 改配置编辑 .env,把两个 CHANGE_ME_* 换成你自己的随机值:openssl rand -hex 16 # 用它生成 FRP_TOKENFRP_TOKEN=你的32位随机串 FRPS_BIND_PORT=7000 FRPS_DASHBOARD_PORT=7500 FRPS_DASHBOARD_USER=admin FRPS_DASHBOARD_PASSWORD=你的强密码3. 构建并启动bash deploy.shdeploy.sh 会先做 9 步预检再构建。不想上传 20MB 的 frps 二进制的话:DOCKERFILE=Dockerfile.download bash deploy.sh # 构建时自动下载 frp4. 安全组放行协议端口源用途TCP70000.0.0.0/0frpc 接入TCP6000-60100.0.0.0/0各服务对外访问TCP7500只填你自己的 IP管理面板host 网络下安全组是唯一开关。 客户端新增代理时,只加一条安全组规则即可,不用改配置、不用重建容器。三、客户端:一份配置文件把 fnos-frpc.toml 拷到内网机器上改名 frpc.toml,改三处:serverAddr = "你的服务器公网IP" auth.token = "与服务端 FRP_TOKEN 完全一致" [[proxies]] name = "web" type = "tcp" localIP = "127.0.0.1" localPort = 8080 remotePort = 6000 # 随便填,只要在安全组放行启动:./frpc -c frpc.toml开机自启用 frpc.service(记得改里面的路径)。飞牛 fnOS 用户:默认 Web 端口是 5666(HTTPS 5667),SSH 需在设置里开启。四、验证服务端日志出现 new proxy [xxx] type [tcp] success 即成功。外网访问 <服务器公网IP>:6000 测试。五、三个必看的坑坑 1:注释里的大括号会让 frp 启动失败template: frp:5: missing value for commandfrp 会把整份配置文件当 Go 模板渲染,连注释也会被解析。注释里写一对孤立的大括号(比如想说明语法),就会被当成"空动作"直接报错。合法写法只有一种:{{ .Envs.变量名 }}。deploy.sh 的模板自检会提前拦下并报出行号。坑 2:frps 必须用 host 网络frps 的职责是"按客户端要求随时开端口",而 Docker 的 ports: 是启动时写死的——两者天然矛盾。症状最迷惑人:日志显示 new proxy success、tcp proxy listen port [...] 一切正常,外网却连不上。因为那句日志说的是容器里监听了,而端口没被发布到宿主机。解法就是 network_mode: host——frps 直接使用宿主机网络栈,这个矛盾彻底消失。代价是容器失去网络隔离,别让别的服务占用 7000 / 7500 及各远程端口。坑 3:用三分法定位问题,别瞎猜做一次 TCP 连通性探测,三种结果对应三种原因:结果含义处理TIMEOUT包被无声丢弃安全组没放行REFUSED网络到达了主机,但没人监听该端口服务没起来 / 客户端离线OPEN正常—nc -vz <服务器公网IP> 7000 # Linux Test-NetConnection <IP> -Port 7000 # Windows PowerShell⚠️ TIMEOUT 时你无法判断服务有没有在跑——过滤层把状态掩盖了。必须先放行,才能验证服务;放行后若变成 REFUSED,才说明服务没起。六、新增一个穿透服务:两步安全组加一条规则(放行新的远程端口)客户端改配置、重启 frpc不用碰服务端、不用重建容器。七、安全清单别用默认端口:FRPS_BIND_PORT 换成不常见的高位端口,能挡掉大量扫描面板别全公网开:7500 只放行自己的 IP,或把 conf/frps.toml 的 webServer.addr 改成 127.0.0.1 走 SSH 隧道开 TLS 加密:服务端 transport.tls.force = true,客户端 transport.tls.enable = truetoken 定期轮换:改 .env 和客户端配置,两边重启(可选)限制端口范围:conf/frps.toml 启用 allowPorts——⚠️ 这会禁止客户端用区间外的端口,与"任意端口"互斥,二选一八、文件清单Dockerfile / Dockerfile.download 两种构建方式 docker-compose.yml host 网络 docker/entrypoint.sh 容器入口 conf/frps.toml 服务端配置(模板) .env 所有可调参数 deploy.sh 一键部署 + 9 步预检 fnos-frpc.toml 客户端配置样例 fnos-frpc.service 客户端开机自启(可选) .dockerignore 构建上下文裁剪 frps linux/amd64 二进制 LICENSE Apache-2.0八、文件下载{cloud title="" type="lz" url="https://wwbkm.lanzoue.com/iiOpL49u4zng" password=""/}改配置后怎么生效改了什么执行.env(端口 / token / 密码)docker compose up -dconf/frps.toml(加功能)docker compose restart两种都不需要重新 build 镜像。
2026年09月25日
10 阅读
0 评论
0 点赞
2026-09-24
「时间煮雨科技」机器人功能开发说明|发送「菜单」查看全部功能
微信搜“时间煮雨科技”,私信“菜单”,查看购物、外卖、酒店、电影等优惠返利功能。QQ机器人群:836919497
2026年09月24日
9 阅读
0 评论
0 点赞
2026-09-22
【教程】wxMP — 微信公众号适配器(让公众号当机器人)
把微信公众号接到无界(Bncr),如何部署无界(Bncr)请看本教程 无界部署教程 ,用户在公众号里发消息后,根据系统设定自动回复。适配器文件:wxMP.js,见最底部。部署位置:BncrData/Adapter/wxMP.js(Adapter 根目录,二级目录不会被加载)回调地址:http(s)://你的域名/api/bot/wxMP版本:2.0.0(针对官方 1.0.3 的四处实质缺陷做了修复,见文末对比表)一、先说最关心的问题:凭据获取入口搬迁AppSecret / EncodingAESKey / Token ,3个必要的凭证。微信把这块入口迁移到了「微信开发者平台」。官方文档现在的原文是:可在「微信开发者平台 - 我的业务 - 公众号 - 消息与事件推送」处进行配置。即,填写服务器地址(URL)、Token 和 EncodingAESKey……而旧路径「设置与开发 → 开发接口管理」自 2025-12-01 起开始迁移到微信开发者平台。(部分账号在旧后台仍能看到残留下的入口,但新账号/已迁移账号就只剩跳转提示了。)三样东西分别在哪拿凭据位置备注AppID微信开发者平台 → 我的业务与服务 → 公众号 → 接口管理 / 开发配置直接可见AppSecret同上⚠️ 只在生成/重置时显示一次,需管理员手机验证码。忘了就只能「重置」,重置后旧值立刻失效Token微信开发者平台 → 我的业务 → 公众号 → 消息与事件推送由你自己填写(3–32 字符),不是微信发你的。所以是「你先定一个,再填进适配器」EncodingAESKey同上点「随机生成」,43 位。选「安全模式」必填消息加解密方式同上明文 / 兼容 / 安全,三选一一句话:Token 是你自己定的;EncodingAESKey 是随机生成的;AppSecret 只在重置时露一次脸。这三样都不在「基本配置」那个老页面里了。二、开工前的三个硬前提账号类型未认证订阅号:可以接入,但只能被动回复——用户发一句、你回一句,必须在 5 秒内应答;没有客服消息接口。认证订阅号 / 服务号:多一个有「客服消息」权限(48 小时内可主动推送),本适配器已支持(Bridge.sendCustomText / push)。注意:公众号一旦启用服务器配置,后台自带的自动回复和自定义菜单会失效,后续都由代码接管。一个公网可达的地址微信要求回调 URL 是 http://(80 端口)或 https://(443 端口),不支持自定义端口。无界默认监听 9090,所以必须做一层反向代理或端口映射:有域名(推荐):Nginx/Caddy 把 https://your.domain/api/bot/wxMP 反代到 http://127.0.0.1:9090/api/bot/wxMP没域名:用 http://你的公网IP/api/bot/wxMP(微信允许 IP,但不推荐)域名建议上 HTTPS,否则部分场景会被拦。无界能被打通回调地址必须能从公网访问到无界;无界响应地址校验要在 1 秒内(GET 校验是纯计算,本适配器是秒回)。用到 access_token 的功能(图片/语音回复、客服消息)才需要把无界的出口公网 IP 加进公众号的 IP 白名单。纯文本被动回复不需要白名单。三、部署步骤1. 放文件BncrData/ └── Adapter/ └── wxMP.js ← 本项目 adapters/wxMP.js 直接复制过来如果你的 Adapter/ 里已经有官方那份 wxMP.js,直接覆盖。两者 @name 都是 wxMP,同时存在会因同名适配器冲突而出问题。2. 重启无界适配器没有热重载,改完必须完整重启 Bncr 进程(不是热加载插件):docker restart bncr3. 依赖不需要手动 npm i。 本适配器只依赖 Node 内置的 crypto、fs;axios 是可选依赖,适配器启动时会通过 sysMethod.testModule(['axios'], {install:true}) 自动装。装不上也不影响纯文本被动回复(只是图片/语音回复和客服消息推送不可用)。对比:官方那份必须手动 npm i got form-data express-xml-bodyparser。4. 填配置进入无界 Web 后台 → 配置 → 适配器 → wxMP,逐项填:配置项填什么是否开启适配器开AppID公众号 AppIDAppSecret公众号 AppSecret(可留空,仅影响图片/语音回复与客服消息)Token你自己定的那个字符串,必须与微信后台完全一致(区分大小写)EncodingAESKey (43位)微信后台生成的 43 位密钥;只用明文模式可留空等待插件回复秒数默认 4(微信限 5 秒,别填满)合并多条回复默认开:返利助手回多条时合并成一条发出拉取消息指令默认「拉取消息」关注欢迎语用户关注时自动回的内容非文本消息提示用户发图片/语音时的提示语单条回复最大字节数默认 1800,超出部分转入拉取队列本机地址默认 http://127.0.0.1:9090,用于把 /public/xxx.jpg 拼成完整 URL5. 开服务器配置(顺序很重要)先在无界里把配置填好并重启,再去微信后台点保存,否则微信发来的校验请求没人应答。微信开发者平台 → 我的业务 → 公众号 → 消息与事件推送:URL:https://your.domain/api/bot/wxMPToken:与你填进适配器的一致EncodingAESKey:点随机生成,复制到适配器配置里消息加解密方式:建议第一次先选「明文模式」 —— 只用 Token 校验,链路最短,最容易跑通跑通后再改「安全模式」并在适配器里填 EncodingAESKey(本适配器支持真实的 AES 收发)点保存 → 微信会往 URL 发 GET 校验成功:后台显示配置成功,无界控制台出现 [wxMP] URL 校验通过失败:控制台会打印 [wxMP] URL 校验失败:Token 与微信后台不一致?6. 设管理员(可选)在已授权的平台对机器人发:set wxMP admin 你的openidopenid 从无界控制台日志里拿:用户给公众号发消息时会打印[wxMP] 收到公众号消息 <oXXXX...>:...四、宝塔面板反代实操(把 9090 暴露成 443)微信只认 80(http) 或 443(https),且 URL 里不能带端口号。无界跑在 9090,所以必须做反代。下面以「宝塔 Linux 面板 + Nginx」为例,全程约 5 分钟。第 0 步:先确认无界本机可达(关键,别跳过)curl -s http://127.0.0.1:9090/api/bot/wxMP应该看到这句:这是 Bncr wxMP 适配器接口(微信公众号)。GET 用于微信服务器校验,POST 用于接收消息。看到了 → 继续下一步。看不到 / Connection refused → 先解决无界本身:确认容器起了:docker ps | grep bncr确认端口映射了:启动命令里要有 -p 9090:9090(或 --network=host)没映射的话重建容器补上,否则反代怎么配都是 502。第 1 步:域名解析到域名商处加一条 A 记录,例如 wx.你的域名.com → 服务器公网 IP。没有域名也能做:直接用 http://公网IP/api/bot/wxMP(80 端口)。但下面第 2 步「添加站点」时把域名填成公网 IP 即可,其余步骤一样。第 2 步:宝塔建站(纯静态即可)网站 → 添加站点:项填什么域名wx.你的域名.com根目录默认就行(反代用不到目录内容)FTP / 数据库 / PHP全部「不创建」网站类型建议选 纯静态这一步的作用只是给宝塔一个挂 nginx 配置的地方并让它能签 SSL 证书,站点里不需要放任何文件。第 3 步:申请 SSL(强烈建议,但不是必须)站点 → 设置 → SSL → Let's Encrypt → 勾选域名 → 申请。成功后打开 「强制 HTTPS」。⚠️ Let's Encrypt 走 HTTP-01 验证,需要 80 端口能被公网访问。若 80 被占用或套了 CDN,改用 DNS 验证。想先用 http 跑通也完全可以(微信同样接受 80 端口 http),跑通后再上 https。二选一,不要两个都配一半。第 4 步:加反向代理方案 A:手写配置(推荐,精确可控)站点 → 设置 → 配置文件,在 server { ... } 里(#SSL-START 之后任意位置)加入:# ===== wxMP 微信公众号适配器 ===== location ^~ /api/bot/wxMP { proxy_pass http://127.0.0.1:9090; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Connection ""; proxy_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 10s; proxy_buffering off; }保存(宝塔会自动 reload;没生效就点一下「重载配置」)。三个必须理解的点,配错了必失败:location ^~ /api/bot/wxMP 结尾不加斜杠。微信请求的路径就是 /api/bot/wxMP(不带尾斜杠)。如果写成 location /api/bot/wxMP/,这条最常见的请求匹配不上,会落到静态站点 → 404。^~ 表示命中后不再尝试正则 location,避免被别的规则抢走。proxy_pass http://127.0.0.1:9090; 结尾也绝对不能加 /。不加 /:原样透传路径 → 无界收到 /api/bot/wxMP ✅加了 /:nginx 会把 location 匹配的那段替换成 /,无界收到 / → 404 ❌不要加任何 rewrite。 微信的 signature / timestamp / nonce / echostr 全在 query 上,保持原样透传最稳。方案 B:可视化反代(更简单,但有个坑)站点 → 反向代理 → 添加反向代理:项填什么代理名称wxMP代理目录/api/bot/wxMP目标 URLhttp://127.0.0.1:9090发送域名$host缓存关闭⚠️ 宝塔很可能在「代理目录」后面自动补一个尾斜杠,生成location /api/bot/wxMP/ { ... } —— 于是又踩上面第 1 个坑。所以保存后一定要点「配置文件」确认一眼:如果生成的是带斜杠的版本,手动改成location ^~ /api/bot/wxMP {(或额外补一条 location = /api/bot/wxMP { proxy_pass http://127.0.0.1:9090; })。结论:会看 nginx 配置就用方案 A;用方案 B 就务必回头确认尾斜杠。第 5 步:验证(三层,逐层排查)# ① 无界本机 curl -s http://127.0.0.1:9090/api/bot/wxMP # ② 经过 nginx curl -s https://wx.你的域名.com/api/bot/wxMP # ③ 看响应头,确认真的到了 nginx(能看到 Content-Type: text/xml 就是适配器回的) curl -si https://wx.你的域名.com/api/bot/wxMP | head -8最直观的方式是直接用浏览器打开 https://wx.你的域名.com/api/bot/wxMP:看到「这是 Bncr wxMP 适配器接口(微信公众号)…」→ ✅ 反代通了看到宝塔默认页 / 404 / 502 → ❌ 对照下面的表排查三层都通之后,再回微信后台点保存,然后看无界控制台有没有:[wxMP] URL 校验通过第 6 步:宝塔/中间层特有的坑现象原因处理curl 域名能通,但微信提示校验失败宝塔「Nginx 防火墙」/「堡塔云WAF」把 signature、echostr 这种长十六进制参数当成攻击拦了防火墙里给 /api/bot/wxMP 加 URL 白名单,或先临时关掉防火墙验证502 Bad Gateway无界没起 / 9090 未监听 / docker 没映射端口回到第 0 步 curl http://127.0.0.1:9090 自查404反代 location 没命中(十有八九是尾斜杠)或配置没重载按方案 A 手写;保存后点「重载配置」校验偶发失败、时好时坏反代开了缓冲或超时太短,无界来不及在 1 秒内应答加 proxy_buffering off;、proxy_read_timeout 10s;套了 CDN / 云加速后失败中间层改写 Content-Type、不转发原始 body,或缓存了 GET 校验结果给该子域名关闭缓存与内容改写,或让它直接回源浏览器能打开、微信却连不上域名解析了但只有 IPv6 记录,或服务器只放行了 IPv6确认 A 记录(IPv4)存在域名必须备案吗用国内服务器 + 80/443 域名访问,通常需要已备案域名,未备案可能被拦用已备案域名,或改用非大陆服务器关于安全不要为了图省事把 9090 直接暴露到公网(微信也不接受 9090)。9090 是无界面板端口,暴露出去等于把管理后台交出去。正确的做法就是本文这套:只开 443,让 nginx 转发。八、接口速查用途方法微信服务器校验GET /api/bot/wxMP?signature=×tamp=&nonce=&echostr=接收消息与事件POST /api/bot/wxMP(明文或加密 XML)浏览器自检直接 GET /api/bot/wxMP,会返回接口说明插件侧主动发消息sysMethod.push({ platform:'wxMP', userId, msg })插件侧扩展能力sender.Bridge.getAccessToken() / sender.Bridge.sendCustomText(openid, text) / sender.Bridge.status()撤回消息不支持(公众号无此能力),delMsg 恒返回 false九、脚本文件wxMP.js隐藏内容,请前往内页查看详情
2026年09月22日
12 阅读
0 评论
0 点赞
2026-09-21
【教程】青龙面板v2.21.0任务卡在「运行中」还刷 jwt malformed和状态更新失败(Validation failed):三层错因的完整排查记录
先说现象升级到青龙面板 v2.21.0 之后,跑任何脚本,日志尾部都会多出这样的东西:## 开始执行... 2026-09-21 09:51:08 ... jwt malformed ## 完成 ✅... 2026-09-21 09:51:09 耗时 状态更新失败(Validation failed) 脚本本身跑完了,业务逻辑也没问题。但面板上的任务状态永远停在「运行中」,得手动去点停止。日志里既报 Validation failed 又报 jwt malformed,看着像两个毛病,实际上你面对的是三个。这篇记录把三层错因一层层剥开,每层都给可复现的验证命令和最小改动的修复方案。一键修复把文末的脚本存成 ql-fix-all.sh,丢进容器执行:docker cp ql-fix-all.sh qinglong:/tmp/ docker exec qinglong bash /tmp/ql-fix-all.sh容器名用 docker ps 查,按实际的改。已经在容器里的话直接 bash ql-fix-all.sh。脚本自动备份、改完做语法校验、失败自动回滚,重复跑也没副作用。另有两个开关:bash ql-fix-all.sh -n # 只看诊断,不改文件 bash ql-fix-all.sh --revert # 还原跑完去面板随便跑一个任务,日志结尾只剩 ## 完成 ✅ 这一行,状态能变回「已结束」,就是好了。不想用脚本也行,下面三个改动手工做一样的效果。两个必须知道的点改完那一次运行,日志里还会再报一次同样的错。 因为 shell 是在任务启动时才 source api.sh 的,你改文件的时候,那个任务早就把旧函数读进内存了。它会带着旧函数收尾,所以再刷一次 404。这是正常的「最后一响」,从下一个任务起才干净,不是补丁没生效。全程不用重启面板。 三处改动都是改文件或改缓存,立即生效。重启面板反而会杀掉正在运行的任务进程,让任务又一次卡在「运行中」——等于自己把刚修好的问题重新制造一遍。根治这些都是壳补丁,是在不想重建容器的前提下最轻的止血办法。真正的根治只有一条:把后端/镜像更新到与 shell/*.sh 同版本。升级之后记得把补丁撤掉:一键修复脚本如下:隐藏内容,请前往内页查看详情
2026年09月21日
13 阅读
0 评论
0 点赞
2026-09-18
【教程】wxcode+YYB Go融合网关:单容器实现微信小程序取码(架构说明与完整部署指南)
wxcode + YYB Go 融合网关:单容器实现微信小程序取码(架构说明与完整部署指南)浏览器 /scan 出二维码 → 手机微信扫码 → 青龙脚本带令牌取 code。无需 root 手机、无需 Android 容器、无需 Xposed。GitHub:https://github.com/SJZYKJ/wxcode-yyb-fusion-dockerDocker Hub:chungg/wxcode-yyb-fusion(latest + v<N> 双标签,amd64/arm64)一、它解决什么问题青龙面板里的取码类脚本(顺丰、移动云盘等)需要一个微信小程序的临时 code,而换取 code 的前提是有一份可用的微信登录态。历史上的两类方案都不轻:方案依赖问题root 手机 + Xposed 模块一台常年开机的 root 安卓机、LSPosed、注入微信进程的模块机器成本、微信版本跟进、模块维护风险redroid(Android-in-Docker)宿主机内核支持 binder / ashmem普通云 VPS / macOS / WSL2 大多不可用;还要在容器内维护微信登录态设计结论:真正需要的是"一份微信登录态",而不是"一个跑着微信的安卓"。前者只需要一次扫码,后者需要一整套重环境。所以从 v4.0.0 起项目改为单服务纯 Docker:扫码登录走 YYB Go 原生的微信登录协议,与 Android 完全解耦;原来的 wxcode 模块(WxLoginHook implements IXposedHookLoadPackage,必须注入 com.tencent.mm 进程运行,反射构造 JsApiLogin$LoginTask,在微信进程内起 NanoHTTPD 监听 8088)降级为可选的设备端点——它是纯 Java/Android 组件,无法编译进 Linux 上的 Go 服务,而它的"实时取码"能力原生扫码链路已经覆盖,且更轻。通道原理依赖默认原生扫码登录浏览器 /scan 出码 → 手机微信扫码 → login_buffer 自动刷新无(纯 Docker)✅ 开启wxcode 设备已 root 手机装 wxcode_2.1.0.apk,NanoHTTPD :8088 取码root 手机 + LSPosed可选(配 WXCODE_URLS)二、目录结构wxcode-yyb-fusion-docker/ ├── deploy.sh # 一键部署脚本(生成 .env → 建数据目录 → 拉镜像 → 健康检查) ├── compose.yaml # 默认编排:拉取预构建镜像(推荐) ├── compose.build.yaml # 本地构建编排:改了源码后用 ├── .env.example # 环境变量模板 ├── .github/workflows/ │ └── docker-publish.yml # GitHub Actions:构建双架构镜像并推送到 Docker Hub ├── Dockerfile # 网关镜像(预编译二进制,内置 wxcode APK) ├── Dockerfile.src # 网关镜像(源码构建版,可选) ├── build-gateway.sh # 交叉编译 gateway/yyb-go-{amd64,arm64} ├── src/ # 融合版完整源码 │ ├── cmd/yyb-go/ # 主程序入口 │ ├── internal/ │ │ ├── httpapi/ # 路由层:/login /scan /wxcode/* 统一分发 │ │ ├── wxcode/ # wxcode 设备协议客户端 │ │ ├── protocol/ # 原生微信登录协议(login_buffer / pool / mmtls) │ │ ├── qr/ # 扫码登录二维码生成与轮询 │ │ └── store/ # 账号与登录态存储(SQLite) │ └── ... ├── gateway/ │ ├── yyb-go-amd64 # Linux/amd64 预编译融合网关 │ ├── yyb-go-arm64 # Linux/arm64 预编译融合网关 │ └── resource/ # Web 面板静态资源(含 /scan 扫码页) └── wxcode/ └── wxcode_2.1.0.apk # 可选:安装到已 root 手机作设备取码端点三、部署前置:机器已装 Docker 与 docker compose。3.1 一条命令(推荐,不用 clone)curl -fsSL https://raw.githubusercontent.com/SJZYKJ/wxcode-yyb-fusion-docker/main/deploy.sh | bash脚本自动完成:检查 Docker → 下载编排文件 → 生成随机访问令牌写入 .env → 建数据目录 → 拉镜像 → 启动 → 健康检查 → 打印访问地址与令牌。3.2 clone 后执行git clone https://github.com/SJZYKJ/wxcode-yyb-fusion-docker.git cd wxcode-yyb-fusion-docker ./deploy.sh3.3 手动 composegit clone https://github.com/SJZYKJ/wxcode-yyb-fusion-docker.git && cd wxcode-yyb-fusion-docker cp .env.example .env docker compose up -d不想手填令牌也不会裸奔:网关首次启动会自动生成访问令牌、存进数据库(跟随数据卷持久化,重启不变),并打印到 docker compose logs | grep 令牌。3.4 deploy.sh 参数./deploy.sh --help参数说明--dir <路径>部署目录(默认仓库目录,不 clone 时用 ./wxcode-yyb-fusion-docker)。NAS 上建议指定固定盘位--port 8088宿主机端口--bind 127.0.0.1只监听本机(配合 Nginx 反代更安全)--token <令牌>指定访问令牌(默认自动生成随机串)--no-token关闭访问令牌(⚠️ 取码接口裸奔,仅限完全可信内网)--allow-registration开放公开注册(默认关闭)--trust-proxy信任 X-Forwarded-For(确实有反代时才开)--image-tag v11固定版本 / 回滚(v<N> 为全局递增的正式发布号)--build用本仓库源码本地构建(改 Go 代码后用)--dry-run只准备 .env 并打印命令,不启动容器--logs启动后跟踪容器日志--uninstall停止并删除容器(数据保留)脚本是幂等的:重复执行 = 拉新镜像 + 重启,不会覆盖已有的 .env、访问令牌和数据。Windows 上可用 Git Bash / WSL 执行同一个脚本(已处理 MSYS 路径差异)。四、部署完成后做三件事1)注册管理员(只能从内网)浏览器打开 http://<宿主IP>:8088/,首次部署时从内网访问 /register 注册第一个账号,自动成为管理员。已有账号则直接 /login。注册默认关闭,且公网来源会被拒绝(防止实例刚上线就被陌生人抢注管理员)。若你只能从公网初始化,请在 .env 里预先设置管理员再重启:YYB_ADMIN_USER=admin YYB_ADMIN_PASSWORD=<10 位以上>2)手机扫码添加微信号打开 http://<宿主IP>:8088/scan,手机微信扫码,登录态自动保存并定时保活。3)青龙里配上同名令牌docker compose logs | grep -A6 "已自动生成 API 访问令牌"把值填到青龙环境变量 YYB_API_TOKEN(顺丰中秋 / sfsy日常版 / 移动云盘三个脚本已内置支持,两边值必须一致)。常用地址地址用途http://<host>:8088/Web 面板(账号管理、运行管理)http://<host>:8088/scan微信扫码登录页http://<host>:8088/instances账号实例列表(脚本枚举用,需令牌)http://<host>:8088/wxapp/getCode指定账号取码(脚本用,需令牌)http://<host>:8088/health健康检查(始终免鉴权)http://<host>:8088/login?appId=wx...取码接口(wxcode 协议;自动适配:设备优先,无设备回退原生)五、取码接口# 1) 原生扫码登录(推荐):/scan 扫码后直接取码 curl -X POST http://127.0.0.1:8088/login -H 'Content-Type: application/json' \ -H "Authorization: Bearer $YYB_API_TOKEN" \ -d '{"app_id":"wxaa3a999db5d744c6"}' # 返回 {"source":"native","fallback":false,"openid":"...","result":{"code":"...","status":"success"}} # 2) wxcode 兼容格式(响应保持 err/msg/appId/status/code/codeType/codeLength,客户端无需改动) curl -H "Authorization: Bearer $YYB_API_TOKEN" \ 'http://127.0.0.1:8088/login?appId=wxaa3a999db5d744c6' # 3) 兼容端点 curl -H "Authorization: Bearer $YYB_API_TOKEN" http://127.0.0.1:8088/whoami curl -H "Authorization: Bearer $YYB_API_TOKEN" http://127.0.0.1:8088/instances通道选择规则:只传 app_id → 先设备(wxcode)后原生;传 app_id + ref → 先原生(指定账号)后设备;传 prefer=device|native → 显式指定。脚本侧传令牌的三种方式curl -H "Authorization: Bearer $YYB_API_TOKEN" http://host:8088/instances # 1 推荐 curl -H "X-API-Token: $YYB_API_TOKEN" 'http://host:8088/login?appId=wx...' # 2 推荐 curl "http://host:8088/instances?token=$YYB_API_TOKEN" # 3 兜底前两种更安全:?token= 会出现在 Web 服务器访问日志、浏览器历史与 Referer 里。Python(青龙脚本)里的标准写法:GATEWAY_TOKEN = os.environ.get("YYB_API_TOKEN", "").strip() GATEWAY_HEADERS = {"Authorization": f"Bearer {GATEWAY_TOKEN}"} if GATEWAY_TOKEN else {} # 合并进 requests 的 headers 参数即可六、多用户与权限模型关键设计:会话 ≠ 令牌。 同一个接口,按你用什么凭据调用,可见范围不同。凭据权限模型可见 / 可取范围API 令牌(Authorization / X-API-Token / ?token=)公开 API(脚本通道)全部 api_shared=1 的账号,不做归属过滤 —— 青龙脚本行为与以前完全一致浏览器会话 Cookie控制台(按归属)管理员:全部账号;普通账号:只有归属自己的账号视角判定方式能看到哪些账号管理员注册的第一个账号,或角色为 admin全部账号普通用户由管理员创建 / 自行注册只有自己扫码添加的账号脚本 / 公开 API不带浏览器会话调用取码类接口全部账号,但跳过拥有者关闭了「脚本可读」的账号「脚本可读」开关(api_shared):账号拥有者在工作台选中账号后可开关。开启(默认)时脚本能通过 /instances、/login、/wxapp/getCode 读到它;关闭后该账号从这些接口消失,只保留在拥有者自己的控制台里。扫码归属:普通用户扫码 → 账号归自己,别人(含管理员)看不到;管理员扫码 → 记在自己名下,但不会夺走已归属其他用户的账号;老库升级时 owner_user_id 为 NULL 的历史账号视为管理员名下。普通用户可用的页面:/ 工作台、/scan、/runs、/qr、/quick-login、/accounts 及其操作、/api/qinglong/*、/settings。仅管理员可用:/users、/api/auth/users*、注册开关、/api/qinglong/config。七、安全默认值项目默认行为取码类接口/login 取码分支、/instances、/whoami、/wxapp/*、/wx/*、/wxcode/*、/openapi.json必须带访问令牌(fail-closed)。YYB_API_TOKEN 留空时网关自动生成 256bit 随机令牌、写入数据库持久化(重启/升级不变)并打印到容器日志,不存在无鉴权的窗口关闭鉴权只有显式设 YYB_ALLOW_NO_AUTH=true 才生效(启动日志有醒目警告)公开注册默认关闭。库中无账号时仅允许内网/回环地址完成首个管理员注册;公网直连一律拒绝登录限速账号 10 次 / IP 8 次,15 分钟窗口,双通道计数(只伪造 IP 或只打单账号都绕不过);计数表有上限X-Forwarded-For默认不信任,只有 YYB_TRUST_PROXY=true 才采信会话 CookieHttpOnly + SameSite=Lax;HTTPS 请求自动加 Secure,也可 YYB_COOKIE_SECURE=true 强制开放重定向登录 next 参数只接受站内路径,//host、/\host 与控制字符注入一律收敛到 //wxcode/* 设备端纳入令牌保护(注册接口写入的端口会被当作取码源请求,不鉴权等于开放 SSRF/取码源劫持点);hookcfg/config/register 只接受令牌或管理员会话容器非 root(yyb)运行、cap_drop: ALL、no-new-privileges,仅保留启动时修数据目录权限所需的 5 项 capability令牌比较常量时间函数⚠️ v4.2.4 及更早存在横向越权:任何登录用户用浏览器打开 /instances 就能列出全部账号的 openid,并能借 api_shared 默认开启按 ref 取到他人(含管理员)的 code。原因是"有效会话"被当成与令牌等价的凭据放行,却没有把会话身份注入请求上下文。v4.2.5 起按上表修正,越权请求返回 account not found,不泄露账号是否存在或归属。八、环境变量参考(.env)变量默认说明IMAGE_REPOchungg/wxcode-yyb-fusion镜像仓库IMAGE_TAGlatest固定版本用 v<N>;latest 会动,别拿它回滚DATA_DIR./data数据目录(SQLite / 头像 / 二维码),相对路径以 compose 文件所在目录为基准YYB_PORT8088宿主机端口YYB_BIND_ADDRESS0.0.0.0只监听本机就填 127.0.0.1YYB_PLATFORMlinux/amd64ARM 设备(树莓派 / ARM NAS)必须改成 linux/arm64YYB_API_TOKEN空留空则自动生成并落库YYB_ALLOW_NO_AUTHfalse显式关闭鉴权(⚠️ 危险)YYB_ALLOW_REGISTRATIONfalse开放公开注册YYB_TRUST_PROXYfalse部署在反代后面时才开YYB_COOKIE_SECUREfalseHTTPS 反代时设 trueYYB_ADMIN_USER / YYB_ADMIN_PASSWORDadmin / 空预设管理员,启动时自动创建(密码 ≥10 位)YYB_AUTH_DRIVERsqlite建议保持默认;设为 none 会关掉 Web 鉴权,工作台的「调用配置」也会被令牌拦住WXCODE_URLS空设备端点,如 http://<手机IP>:8088;多设备逗号分隔WXCODE_HOOK_PORT8088wxcode 设备协议端口PANEL_TYPE / QL_* / DAIDAI_*—面板对接(青龙 / 呆呆)YYB_DNS_SERVERS223.5.5.5:53,119.29.29.29:53网关解析用的 DNSYYB_KEEPALIVE_INTERVAL / YYB_KEEPALIVE_AHEAD30m / 45m登录态保活间隔与提前量九、日常运维操作命令看日志docker compose logs -f --tail=100升级./deploy.sh(自动 pull + 重启)回滚./deploy.sh --image-tag v11停服./deploy.sh --uninstall改端口编辑 .env 的 YYB_PORT,再跑 ./deploy.sh备份数据拷走 .env 里 DATA_DIR 指向的目录(默认 ./data)。这就是全部家当,含微信登录凭据本地构建./build-gateway.sh && docker compose -f compose.build.yaml up -d --build核对当前版本:docker compose exec yyb-go cat /app/resource/static/version.json # -> {"version":"v11"} curl -s http://127.0.0.1:8088/static/version.json登录页也会直接显示版本号(该文件由构建参数 VERSION 写入,是公开静态资源,不需要令牌)。本地 compose.build.yaml 自建的镜像显示 local。改了源码怎么重新出镜像:./build-gateway.sh # ① 交叉编译 amd64+arm64 cp -r src/resource/templates/. gateway/resource/templates/ # ② 同步面板资源 docker compose -f compose.build.yaml up -d --build # ③ 构建并启动Dockerfile 只 COPY gateway/ 下的二进制和 resource/。只改 src/ 而不跑第 ① 步,部署上去毫无变化。十、wxcode 设备通道(可选)准备一台已 root 的 Android 手机,安装 LSPosed;安装 wxcode/wxcode_2.1.0.apk 并启用模块,作用域勾选微信;重启微信,确认手机端 http://127.0.0.1:8088/instances 有实例;在 .env 中配置 WXCODE_URLS=http://<手机IP>:8088(同一局域网;或用 adb reverse);docker compose up -d 重启网关。手机端 NanoHTTPD 默认监听 8088,若还跑了 Zygisk hook(8089)可同时填多个端点:http://ip:8088,http://ip:8089。Docker 部署的推荐做法是静态配置 WXCODE_URLS,而不是让手机 hook 自注册。十一、排错现象原因 / 处理WXCODE_URLS 留空时 /login?appId= 能用吗能。设备通道不可达时自动回退原生扫码登录,响应仍是 wxcode 格式,客户端无需改动/api/wxcode/status 显示 127.0.0.1:8089 offline正常。容器内不可达该地址,会自动回退原生通道没有 root 手机能用吗能。原生扫码登录完全够用,wxcode 只是可选的加分项面板登录不上首个管理员从内网访问 /register 注册;或用 YYB_ADMIN_USER/YYB_ADMIN_PASSWORD 预设脚本报 401(配了令牌)给网关请求加 Authorization: Bearer 或 X-API-Token 头,或在 URL 拼 ?token=脚本报 401(没配令牌)令牌是自动生成的,去日志取:`docker compose logs \grep -A6 已自动生成`升级重启后令牌变了吗没变。存在 app_settings.api_token,跟随数据卷持久化。除非你删了数据卷升级后注册页打不开预期行为,公开注册默认关闭。加人请由管理员在「用户管理」创建wxcode 手机 hook 的 /wxcode/register 报 401已纳入令牌保护,改用静态 WXCODE_URLS 配置填了令牌后浏览器登不上控制台不会。POST /login(带 username)与登录页始终放行,工作台用会话访问不受令牌限制数据在哪${DATA_DIR:-./data}/{db,avatars,qr},重启不丢;换位置改 .env 的 DATA_DIR十二、版本记录版本内容v6修复横向越权:按凭据类型区分权限模型(令牌 = 公开 API 不做归属过滤,脚本行为不变;会话 = 控制台,普通用户只能读写自己的账号);/wxcode/* 收窄为「令牌或管理员」v5安全加固:取码接口 fail-closed(令牌未配置自动生成并落库);/wxcode/* 纳入鉴权;注册默认关闭 + 首个管理员仅限内网注册;登录限速改双通道且默认不信任 X-Forwarded-For;修复 next 参数开放重定向v4公开接口可选访问令牌(YYB_API_TOKEN);编排拆分为 compose.yaml / compose.build.yaml;GitHub Actions 双架构发布流水线;一键部署脚本 deploy.shv3多用户账号隔离:普通用户只看自己扫码添加的账号;账号级「脚本可读」开关控制是否对脚本暴露v2修复 bind-mount 数据目录权限导致的 SQLite 打不开;/login 无设备时自动回退原生微信登录v1/login?appId= 兼容 wxcode 接口(设备优先,无设备回退原生);新增 /whoami、/instances 兼容端点;GET /login?appId= 多账号时自动选存活/最近更新账号本次:登录页新增版本更新记录与个人主页入口;版本号改为构建期注入的动态显示。十三、两点说明关于许可与来源:项目内嵌了 wxcode 2.1.0 的 APK 作为可选取码端点,第三方来源与许可说明见仓库根目录 NOTICE.md。使用前请自行确认相关合规要求。关于数据安全:.env 里 DATA_DIR 指向的目录含微信登录凭据(SQLite 明文),请勿放到可被外部访问的共享目录;公网暴露时建议 --bind 127.0.0.1 + 反代 + HTTPS。
2026年09月18日
40 阅读
0 评论
0 点赞
2026-09-13
【教程】用 Cloudflare 免费搭一个私人图床:从部署到上线的完整实战(含避坑)
写这篇文章,是因为我自己刚用 Cloudflare 把开源项目 JSimages 跑通上线了。过程中踩了一堆坑,也做了不少定制,干脆整理成一篇「教程 + 成品展示」,供想自建图床的朋友参考。一、为什么不直接用图床?写博客、做笔记、发社群,图片托管永远是个绕不开的问题。第三方图床要么限速限容,要么哪天就跑路了;大厂的对象存储又要绑卡、还要操心账单。Cloudflare 给出的方案很香:Workers:Serverless 跑后端逻辑,免费额度每天 10 万次请求;R2:对象存储,免费 10GB,且 出口流量免费(不像 S3 那样被流量计费);D1:边缘 SQLite,存图片元数据够用。三者组合,个人图床几乎可以做到「零成本、不绑卡焦虑」。二、成品先睹为快我已经上线了一个,地址在这里 👉 https://tc.861409665.xyz/它目前具备这些能力:🖼️ 游客可直接上传 / 访问图片(也可关掉登录后使用);🔐 带管理后台 /admin,登录后可查看、删除图片;📦 单张上限 10MB,支持常见图片格式;💡 超出 9GB 存储配额后自动拒绝新上传,不再继续吃额度;🛑 紧急情况可一行配置 DISABLED=true 全站停用,杜绝误扣费。页面底部放了我的个人博客和个人主页:个人博客:https://chun7.top/个人主页:https://zy.chun7.top/三、技术选型与架构浏览器 ──► Cloudflare Worker(_worker.js) ├── D1(media 表:url + size) └── R2(图片二进制存储)请求进来后,Worker 负责鉴权、写库、读写 R2,并顺手用 caches.default 做一层边缘缓存,加速图片回源。四、开始部署1. 准备材料开源仓库:https://github.com/0-RTT/JSimages (根目录就是 _worker.js,是个 Worker 项目,不是 Pages)Cloudflare 账号,并创建一个 API Token,权限勾选:Workers 脚本:编辑、D1:编辑、R2:编辑在 Cloudflare 控制台 开启 R2(首次需要绑卡验证,但免费额度内不扣费)一个域名(我用的 861409665.xyz,最终绑到子域 tc.861409665.xyz)2. 写 wrangler.tomlJSimages 仓库本身没有 wrangler.toml,需要自己建。核心配置如下:name = "jsimages" main = "_worker.js" compatibility_date = "2024-09-23" [[d1_databases]] binding = "DATABASE" database_name = "jsimages" database_id = "91dd6235-d95b-4b2a-8423-e2beaf7f64ab" [[r2_buckets]] binding = "R2_BUCKET" bucket_name = "jsimages" [vars] DOMAIN = "tc.861409665.xyz" USERNAME = "admin" ADMIN_PATH = "admin" ENABLE_AUTH = "false" MAX_SIZE_MB = "10" QUOTA_STORAGE_MB = "9000" APP_VERSION = "v3" # PASSWORD 用 secret 存放,不要写进文件⚠️ 密码类敏感信息请用 wrangler secret put PASSWORD 注入,别明文落在配置文件里。3. 创建云端资源# 建 R2 桶 wrangler r2 bucket create jsimages # 建 D1 数据库 wrangler d1 create jimages # 建表(注意加了 size 列,用于配额统计) wrangler d1 execute jsimages --remote --command \ "CREATE TABLE IF NOT EXISTS media (url TEXT PRIMARY KEY, size INTEGER DEFAULT 0);"4. 部署wrangler deploy部署成功后你会拿到一个 *.workers.dev 默认域名(我的是 https://jsimages.sjzy.workers.dev)。5. 绑定自定义域名JSimages 用 [[domains]] 字段的方式在某些 wrangler 版本不被识别,稳妥做法是走 Zone 的 Workers Routes,或直接在 DNS 里加一条:tc.861409665.xyz A 192.0.2.1 代理(Proxied)加上之后,访问子域就会落到这个 Worker。五、我的定制改动开源版界面比较素,我按自己的需求改了 _worker.js:标题:JSimages → 时间煮雨の图床(title、描述、关键词、div.title 全改);页脚:原本的「开源声明」换成个人博客 / 个人主页链接;游客访问:ENABLE_AUTH=false,无需登录即可上传;免责声明:底部加红色提示,严禁上传违法、色情、暴力、侵权等内容;防超额:上传/访问时比对 QUOTA_STORAGE_MB(我设 9000),超了就拒;再加 DISABLED 开关一键全站 403;缓存根治:首页缓存键带上 cv=APP_VERSION,每次改版升一版(现在是 v3),旧缓存自然失效。关键代码片段(缓存键带版本号):const cacheKey = new Request( request.url + (request.url.includes('?') ? '&' : '?') + 'cv=' + config.appVersion, request );六、踩坑记录(都是真金白银的时间)坑现象解决办法R2 未开启部署后 API 报 10042控制台手动 Enable R2wrangler 中文路径找不到入口部署报找不到 _worker.js把项目拷到纯 ASCII 路径(如 C:/jsimages_deploy)再 deploysecret put 顺序限制4.x 报 latest version isn't currently deployed先 deploy,再 secret put,或改为可选跳过[[domains]] 不识别部署报 Unexpected fields改用 Zone Workers Routes / DNS 记录DNS 需手动加Token 无 DNS:Edit 权限,403控制台手动加 A 记录并代理改版不生效刷新/Purge 都没用,还是旧界面caches.default 程序化缓存顶住默认 URL,靠 APP_VERSION 缓存键根治最阴的一坑是缓存:Cloudflare 的 caches.default 是 Worker 自己写的程序化缓存,和 CDN 的 Purge 不是一回事,后台清缓存清不掉它。改版后必须让缓存键变化,否则用户永远看到旧页面。七、安全提醒(很重要)部署用的 API Token 用完建议吊销重建,别长期留着;Cloudflare 账号密码定期更换;敏感配置走 secret,别进版本库;对外公开上传的图床,务必加免责声明 + 内容审核,避免被滥用。八、结语整套下来,一个属于自己的、免费、可控、还能随时停用的图床就跑起来了。源码开放、部署简单,适合想摆脱第三方图床的朋友。想看效果直接访问:https://tc.861409665.xyz/如果你也搭了,欢迎在评论区贴出你的地址,一起交流踩坑经验 🚀本文由 时间煮雨の图床 实战整理。更多内容见个人博客 https://chun7.top/ 与个人主页 https://zy.chun7.top/。
2026年09月13日
20 阅读
0 评论
0 点赞
2026-09-13
【Windows】Win10 任务栏透明小工具Private.BlurClear:仅 27K 的
如果你的 Win10 任务栏挡住了漂亮的壁纸,却又不想装一个几十兆的"全家桶"——那这个不到 27KB 的小工具可能正合你意。软件简介Private.BlurClear 是一款体积极小的 Win10 任务栏透明工具,整个程序只有 27K 大小。它的功能非常专一:只能让任务栏变成完全透明。网上有教程说,可以在创建快捷方式后,于"属性 → 目标"路径后面加参数来实现模糊效果;但实测下来并不生效,也可能是本人操作方式有误。如果你追求更丰富的效果(比如亚克力模糊、不同状态不同透明度等),更推荐 TranslucentTB 这款软件,它的功能要丰富得多。使用说明使用方法极其简单,只需一步即可实现开机自启:把软件直接放到系统的启动目录下:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp放入后重启或手动运行一次,任务栏便会保持全透明,且每次开机自动生效。下载地址蓝奏网盘:{cloud title="" type="lz" url="https://wwbkm.lanzoue.com/ihP1E48780xg" password=""/}⚠️ 温馨提示:部分资源收集于互联网,不保证完全可用。下载前请先阅读本站《免责声明》;若遇到链接失效,可通过评论或留言联系管理员补档。资源仅供个人学习参考,请于下载后 24 小时内删除;如涉及版权问题,请速联系本站处理。
2026年09月13日
11 阅读
0 评论
0 点赞
2026-09-09
【教程】宝塔面板:Typecho 无损迁移到 WordPress 完整教程
宝塔面板:Typecho 无损迁移到 WordPress 完整教程适用环境:宝塔面板(BT Panel)+ Typecho(任意版本)+ 全新 WordPress 站点目标:文章、页面、分类、标签、评论(含楼层)、用户(含原密码)、附件、自定义字段全部保留,且旧链接 301 跳转保护 SEO。目录迁移前必做:备份两种方案对比宝塔面板准备工作一键迁移工具使用步骤迁移后必做的 8 件事数据映射对照表常见问题与排查回滚方案一、迁移前必做:备份这一步不能省。 迁移会直接写入 WordPress 数据库,操作失误有风险。备份 Typecho 站点宝塔 → 网站 → 找到 Typecho 站点 → 「备份」→ 立即备份(同时勾上文件和数据库)或者:文件 → 打包 /www/wwwroot/你的typecho目录;数据库 → phpMyAdmin 导出 SQL备份 Typecho 数据库单独存一份宝塔 → 数据库 → 对应数据库 → 「备份」/「导出」建议下载到本地或 OSS,别只留在服务器上记录关键信息(后面要用)Typecho 站点根目录路径,例如 /www/wwwroot/typecho.example.comTypecho 数据库名 / 用户名 / 密码 / 表前缀(一般是 typecho_)查看表前缀:打开 Typecho 根目录下的 config.inc.php,找这一行:$db = new Typecho_Db('Mysql', 'typecho_'); // 第二个参数就是表前缀二、两种方案对比方案能迁移什么丢什么耗时推荐度WordPress 自带 RSS 导入文章正文、标题、分类、标签、作者评论、附件、自定义字段、页面层级、用户密码、文章 ID5 分钟⭐ 只适合纯文章、不在乎评论数据库转换脚本(本文工具)全部:用户/密码/文章/页面/评论/楼层/附件/自定义字段/ID 映射Typecho 主题与插件(无法迁移,本来也不通用)15~30 分钟⭐⭐⭐⭐⭐结论:想要"无损",只能走数据库级别转换。下面给的 typecho2wp 工具就是干这个的。三、宝塔面板准备工作3.1 新建一个 WordPress 站点宝塔 → 网站 → 添加站点域名:建议先用临时域名或二级域名,例如 wp.example.com(这样能边迁移边对比,确认无误后再换到主域名)数据库:选 MySQL,同时创建数据库,记下库名/用户名/密码PHP 版本:7.4 / 8.0 / 8.1 均可(不要用 5.x,WordPress 新版已不支持)站点创建完成后,下载 WordPress 中文版解压到站点根目录,或直接:cd /www/wwwroot/wp.example.com wget https://cn.wordpress.org/latest-zh_CN.zip unzip latest-zh_CN.zip && mv wordpress/* . && rm -rf wordpress latest-zh_CN.zip浏览器访问站点完成 WordPress 安装(记得记下管理员账号密码)。建议管理员用户名不要和 Typecho 里的用户名一样,避免冲突(工具检测到重名会自动加后缀,没问题)。3.2 关闭 open_basedir(关键!)这是最容易踩的坑。 宝塔默认开启「防跨站攻击(open_basedir)」,会导致工具读不到另一个站点的文件,表现为:自动读取配置时提示"找不到 config.inc.php"附件迁移时全部提示"源文件不存在"解决办法(迁移期间临时关闭,做完再开回来):方法 A:宝塔 → 网站 → 站点设置 → 网站目录 → 取消勾选「防跨站攻击(open_basedir)」→ 保存方法 B:删除站点根目录下的 .user.ini 文件(改名即可,例如改成 .user.ini.bak),改完需要等约 5 分钟或重启 PHP 服务才生效Typecho 站点和 WordPress 站点两边都要关。3.3 放宽 PHP 限制(大站点必做)宝塔 → 软件商店 → 对应 PHP 版本 → 配置修改 / 性能调整:max_execution_time = 300 memory_limit = 512M post_max_size = 64M upload_max_filesize = 64M改完重启 PHP。四、一键迁移工具使用步骤4.1 上传工具把 typecho2wp 整个目录上传到 WordPress 站点根目录(index.php 和 Parsedown.php 要在同一层):/www/wwwroot/wp.example.com/typecho2wp/ ├── index.php └── Parsedown.php浏览器访问:http://wp.example.com/typecho2wp/index.php安全提示:工具目录任何人都能访问,用完必须删除。若需加口令:编辑 index.php 顶部,把define('T2W_ACCESS_KEY', '');改成 define('T2W_ACCESS_KEY', '你自己的口令');,之后用 ?key=你自己的口令 访问。迁移期间生成的 .t2w_state.json 里含数据库密码,删除工具时一并删掉。4.2 第一步:填写路径,自动读配置Typecho 站点根目录:/www/wwwroot/typecho.example.comWordPress 站点根目录:/www/wwwroot/wp.example.com点「自动读取配置」,工具会解析两边的 config.inc.php 和 wp-config.php,自动填好数据库信息。逐项核对:主机、端口、库名、用户、密码、表前缀、根目录。表前缀填错会直接报错。4.3 第二步:选择迁移选项选项说明建议正文处理方式Markdown 转 HTML:把 Typecho 的 Markdown 正文渲染成 HTML,迁移后不依赖任何插件✅ 推荐选这个 保留 Markdown 原文:保留源文件,但 WordPress 原生不渲染 Markdown,必须装插件(如 WP Githuber MD)想继续用 Markdown 写作才选用户密码处理保留原密码:把 Typecho 的哈希原样写入,并生成一个兼容插件,老用户可以用原来的密码直接登录,登录成功后自动升级为 WordPress 哈希✅ 强烈推荐 重置为随机密码:给每个用户生成新密码,迁移结束后在报告里查看不装插件时选迁移附件到媒体库把 /usr/uploads 的附件复制到 wp-content/uploads/年/月/,写入媒体库,并重写正文里的图片地址✅ 勾选兜底复制遗留文件/usr/uploads 里没被媒体库收录的文件(比如你手动 FTP 上传的),复制到 wp-content/uploads/typecho-legacy/,正文地址一并重写✅ 勾选同步站点标题把 Typecho 的站点名称、副标题同步到 WordPress✅ 勾选清空 WordPress 现有内容删除目标站点现有的文章/页面/附件/分类/标签/评论全新安装的 WP 勾选;已有内容千万别勾点「测试连接并预览」,能看到 Typecho 的文章/页面/附件/分类/标签/评论/用户数量,确认无误后进入下一步。4.4 第三步:执行迁移点「开始迁移」,页面会实时显示 12 个阶段的进度:用户与权限 → 分类与标签 → 分类层级 → 文章与页面 → 自定义字段 → 附件与媒体库 → 正文地址重写 → 父级页面与特色图 → 文章-分类关联 → 评论 → 评论楼层 → 统计修正大站点(几千篇文章 + 几千条评论)可能要几分钟到十几分钟,不要关闭页面。4.5 第四步:收尾迁移完成后工具会自动生成这些文件(在 typecho2wp/t2w-output/):文件作用t2w-redirect-map.php旧链接 → 新链接 的映射表t2w-301-redirect.phpWordPress 必用插件(mu-plugin),旧链接自动 301 跳转t2w-password-compat.php密码兼容插件(选了"保留原密码"才有)nginx-rewrite.confNginx 版 301 规则,可贴到宝塔「伪静态」htaccess-redirect.txtApache 版 301 规则migration-report.txt迁移报告(含新密码列表)如果 WordPress 目录可写,工具会自动把前三个部署到 wp-content/mu-plugins/。没有自动部署的话手动放过去:mkdir -p /www/wwwroot/wp.example.com/wp-content/mu-plugins cp t2w-output/t2w-redirect-map.php /www/wwwroot/wp.example.com/wp-content/mu-plugins/ cp t2w-output/t2w-301-redirect.php /www/wwwroot/wp.example.com/wp-content/mu-plugins/ cp t2w-output/t2w-password-compat.php /www/wwwroot/wp.example.com/wp-content/mu-plugins/mu-plugins 是"必用插件",后台插件列表里看不到,但一直生效。想停用直接删文件。五、迁移后必做的 8 件事1. 固定链接保存一次WordPress 后台 → 设置 → 固定链接 → 直接点「保存更改」(什么都不用改)。作用:刷新重写规则缓存,否则新链接可能 404。推荐结构:/%post_id%.html(和 Typecho 的 /archives/123/ 一样稳定)或 /archives/%post_id%/。2. 验证 301 跳转curl -I https://example.com/archives/123/应该返回 HTTP/1.1 301 Moved Permanently 和 Location: https://example.com/新链接。也可以浏览器直接打开几个旧链接试试。3. 把旧站点改成跳转到新站(可选)确认无误后,在 Typecho 站点(或主域名)加一条 Nginx 规则,把全站跳转到新站:# 全站跳转(放在 Typecho 站点的 nginx 配置里) location / { return 301 https://新域名$request_uri; }之后再让旧链接的 301 规则在新站生效(顺序:先全站跳到新站,新站内部再按 map 跳到具体新地址)。更简单的做法:直接把新 WordPress 站点换成主域名,旧链接由 mu-plugin 处理。4. 检查正文与图片随便打开几篇文章,重点看:代码块、表格、引用是否正常图片是否能显示(右键复制图片地址,看是不是 wp-content/uploads/年/月/xxx.jpg)若图片显示为旧地址 /usr/uploads/...,说明附件阶段没跑成功,检查 open_basedir5. 恢复 open_basedir回到宝塔,把两个站点的「防跨站攻击」重新勾上,或把 .user.ini.bak 改回 .user.ini。6. 检查用户与评论后台 → 用户:确认用户都在,角色正确后台 → 评论:确认评论在,层级(回复关系)正常用原密码登录一次验证(选了密码兼容的话)7. 主题、插件、小工具需要重来Typecho 的主题和插件不能迁移到 WordPress,需要重新选择:主题:WordPress 后台 → 外观 → 主题常用替代:SEO(Rank Math / Yoast)、缓存(WP Rocket / WP Super Cache)、站点地图、图床8. SEO 收尾搜索引擎站长平台提交 sitemap百度搜索资源平台 → 网站改版 → 提交规则(如果 URL 规则变了)保留 301 至少 3~6 个月9. 删除工具(重要)rm -rf /www/wwwroot/wp.example.com/typecho2wp六、数据映射对照表Typecho 表WordPress 表说明typecho_userswp_users + wp_usermeta用户名/昵称/邮箱/角色(administrator、editor、contributor、subscriber 对应)typecho_metas(type=category)wp_terms + wp_term_taxonomy(category)保留名称、别名、描述、层级typecho_metas(type=tag)wp_terms + wp_term_taxonomy(post_tag)同上typecho_contents(type=post)wp_posts(post_type=post)标题、别名、正文、发布时间、修改时间、状态、评论开关、密码typecho_contents(type=page)wp_posts(post_type=page)额外保留模板字段 → _wp_page_templatetypecho_contents(type=attachment)wp_posts(post_type=attachment)+ 媒体库文件复制到 uploads/年/月/,写入 _wp_attached_file、_wp_attachment_metadatatypecho_commentswp_comments昵称、邮箱、网址、IP、UA、时间、审核状态、楼层typecho_relationshipswp_term_relationships文章 ↔ 分类/标签 关联typecho_fieldswp_postmeta自定义字段原样保留(如 views、thumb)typecho_options(title/description)wp_options(blogname/blogdescription)站点标题与副标题状态映射:TypechoWordPresspublishpublish(已发布)draftdraft(草稿)waitingpending(待审核)hiddenprivate(私密)privateprivate(私密)正文处理:Typecho 在正文前加了 <!--markdown--> 标记,工具会自动去掉<!--more--> 之前的内容会写入 WordPress 的「摘要」字段选择"转 HTML"时用 Parsedown 渲染七、常见问题与排查Q1:提示"找不到 config.inc.php" / "源文件不存在"99% 是 open_basedir 限制。回到 3.2 节 关掉它,重启 PHP 或等 5 分钟。另外确认路径写的是站点根目录(里面有 config.inc.php 的那一层),不是 usr 或 admin 目录。Q2:提示"Typecho 数据库中找不到表:xxx_contents"表前缀填错。打开 config.inc.php 确认,常见有 typecho_、te_、tc_。Q3:数据库连接失败确认数据库主机:同服务器一般填 localhost(不是 127.0.0.1,有些环境 socket 路径不同)确认数据库用户有该库的读写权限宝塔 → 数据库 → 检查 root 密码或站库用户密码Q4:正文里的图片还是旧地址检查 wp-content/uploads/ 下有没有文件若没有 → open_basedir 或 /usr/uploads 目录已被删若有但地址没变 → 手动执行一遍替换(用插件 Better Search Replace,把 你的域名/usr/uploads 替换为 你的域名/wp-content/uploads/typecho-legacy)Q5:中文别名(slug)变成了乱码或空工具会优先使用 Typecho 的 slug 字段;为空时用标题生成。中文别名 WordPress 是支持的,但如果你的固定链接用了 %postname%,建议后台重新编辑一下别名。Q6:迁移后文章数量对不上检查 Typecho 里有没有 type=attachment 或插件自定义的 type(如 link),这些不会作为文章检查是否有草稿/私密文章,WordPress 后台默认筛选器可能没显示Q7:评论楼层乱了工具会做两遍处理(先插评论,再修正 comment_parent)。如果中途中断,重新跑一次完整的迁移即可(先回滚)。Q8:老用户登不上确认 wp-content/mu-plugins/t2w-password-compat.php 存在确认用户表里的 user_pass 以 $T$ 开头(新版 Typecho)或 32 位 md5(旧版)还不行就直接用「忘记密码」重置Q9:执行到一半页面卡住/500大站点把 PHP 的 max_execution_time 调到 300、memory_limit 512M检查 Nginx 的 fastcgi_read_timeout,建议 300工具是分批 AJAX,中断后重新执行完整流程前先回滚Q10:能迁移到已有的 WordPress 站点吗?可以,但不要勾选「清空 WordPress 现有内容」。注意文章 ID 会重新分配,可能与现有文章冲突(工具会自动处理,但固定链接需要重新保存)。八、回滚方案方案 A:用工具回滚工具右下角有「回滚本次迁移」按钮,会删除本次插入的全部文章/分类/评论/用户(不影响 WordPress 原有内容)。方案 B:恢复数据库备份宝塔 → 数据库 → 选中 WordPress 数据库 → 「导入」/ 从备份恢复,恢复到迁移前的状态。方案 C:重来回滚后重新执行迁移即可,工具支持重复运行(只要先回滚或先清空)。附:手动方案(不推荐,作为备选)如果你实在不想用工具,最低限度的手动迁移路径是:Typecho 后台安装导出插件,或直接用 WordPress 自带的 RSS 导入(工具 → 导入 → RSS)导入后:文章正文、标题、分类、标签、作者能过来然后手动补:评论(需要额外 SQL)、附件(FTP 复制 + 批量替换数据库地址)、用户(重建)301 规则手写缺点是评论、附件、自定义字段、用户密码基本都得手动折腾,几千条数据会非常痛苦。建议直接用工具。{cloud title="typecho2wp" type="lz" url="https://wwbkm.lanzoue.com/iyEeq47lf3vc" password=""/}
2026年09月09日
10 阅读
0 评论
0 点赞
1
2
...
33