二维码别再传第三方平台了:3 个文件、10 分钟,在 NAS 上自建微信跳转落地页

    3
阅读 -- 次

把个人微信二维码做成图片,传到某个「一键跳微信」的平台,拿到一条短链丢进朋友圈——做私域的人大概都干过。用久了问题就来了:链接挂在别人的域名上,平台下架你跟着完;PV 看不到;想换目标只能重新传一遍;平台哪天关门,你手里所有二维码全废。

更根本的是:微信能承载第三方二维码的容器只有两种——小程序,或者企业微信。所以任何「一键跳微信」用的必然是别人的资质。开源项目 likeyun/liKeYun_ylb 的后台表单里,小程序 AppID 和 AppSecret 是让每个使用者自己去填的:平台不共享任何小程序,你贡献的只是一个二维码。自己搭这套东西,等于自己当那个平台。

为什么不用第三方平台:小程序 AppID / AppSecret 是使用者必填项
为什么不用第三方平台:小程序 AppID / AppSecret 是使用者必填项

下面这套开源跳转落地页服务只有三个文件:server.js、admin.html、Dockerfile。零外部依赖、不装数据库、不用 npm install,一条 docker 命令就能跑在 NAS 上。

跑起来是什么样

微信外打开,按钮是「跳转微信」,点一下唤起微信 App,二维码同时完整展示,长按就能识别:

微信外打开:按钮为「跳转微信」
微信外打开:按钮为「跳转微信」

微信内打开,按钮自动变成「关注公众号」,点一下直接进公众号资料页:

微信内打开:按钮为「关注公众号」
微信内打开:按钮为「关注公众号」

它能做什么

  • 上传二维码,立刻得到短链、入口链接、落地页三条链接
  • 微信外唤起微信,微信内自动切换成引导关注公众号
  • 粘贴抖音分享口令,自动解析作品 ID 并唤端
  • 三层域名 302 串联:短链 → 入口 → 落地
  • 链接失效日期、访问量上限、单链停用,域名每 5 分钟自动探测一次
  • 建页时敏感词自检;上传图片重绘剥离 EXIF / GPS;响应头 no-store、no-referrer、noindex

它不能保证账号不被封。微信《外部链接内容管理规范》把「第三方平台生成的特殊识别码」列入违规范围,微信号二维码正好落在这个描述里。工具只是工具,用得对不对在人。

部署前准备

  • 一台能跑 Docker 的机器:NAS(UGOS / 群晖 / 威联通)、软路由、云服务器都行,x86_64 或 arm64 均可
  • 三个域名(要你自己定):短链、入口、落地,解析到同一台机器就够了,不需要三台
  • 一个管理口令(要你自己定):就是下面的 JW_TOKEN,别用弱口令
  • 国内服务器必须已备案,落地域名建议用注册满一年以上的老域名

三步部署

部署只要三步
部署只要三步

第 1 步:上传 3 个文件

浏览器打开 NAS 的文件管理器,新建一个目录,比如 /volume1/docker/jumpwx,把这 3 个文件拖进去:

jumpwx/
├── server.js      服务端主程序(零依赖)
├── admin.html     管理台(单文件)
└── Dockerfile     容器配置

不需要上传 node_modules,项目本身不依赖任何第三方包。

第 2 步:构建镜像并启动容器

SSH 登进机器,粘贴下面这段:

cd /volume1/docker/jumpwx

docker build -t jumpwx:latest -f Dockerfile .

docker run -d --name jumpwx --restart unless-stopped \
  -p 9000:8080 \
  -e JW_TOKEN=换成你自己的管理口令 \
  -v $(pwd)/data:/app/data \
  jumpwx:latest

第一次构建要拉一次 node:20-slim 基础镜像,大约两三分钟;之后再改代码重建只要几秒。整条命令只有三处要动:

  • -p 9000:8080:左边 9000 随便你换(内网不冲突即可),右边 8080 是容器内部端口,不要改
  • -e JW_TOKEN:必须换成你自己的高强度口令,别照抄
  • -v $(pwd)/data:/app/data:数据目录,db.json、config.json 和上传的二维码都在这里,是唯一需要备份的目录

容器里的进程以非 root 用户 node 运行,所以你在 NAS 文件管理器里看到的文件可以正常删除、正常改属主,不会留下一堆删不掉的 root 文件。

第 3 步:打开管理台,建第一条链接

浏览器访问 http://你的NAS内网IP:9000,输入你设置的口令。进去做两件事:

  1. 上传二维码:目标类型选「微信」,传图、起标题、保存,系统立刻给你短链、入口链接、落地页三条链接
  2. 配三层域名:打开「三层域名配置」,填你自己的三个域名。不填的话链接会退化成内网地址,发出去别人打不开

配好三层域名

三层域名结构
三层域名结构

三层之间用 302 串联,哪个域名被平台盯上,只改那一层的 DNS 指向就行。已经发出去的二维码和短链重新指向即可恢复,不用全部重发;三个域名指向同一台服务器就够,不需要三台机器。

域名解析到你的服务器之后,加一段反代。三个域名各写一个 server 块,只改 server_name 那一行:

server {
    listen 443 ssl http2;
    server_name m.你的域名.com;

    location / {
        proxy_pass http://127.0.0.1:9000;
        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;
    }
}

反代端口要和你 docker run 里写的左边那个端口一致。如果服务本身走 HTTPS 入口,启动容器时再加 -e JW_TLS=1,生成的链接就会是 https。

管理台和落地页走同一个端口,靠 JW_TOKEN 保护。如果这台机器直接暴露在公网,建议给管理路径再叠一层 Nginx Basic Auth 或 Cloudflare Access,只把落地页路径放给公网。

你必须自己替换的地方

  • JW_TOKEN:换成你自己设的强口令,不改就登不进管理台(用默认弱口令等于把后台交出去)
  • -p 9000:8080 左边的端口:换成空闲端口,冲突了容器起不来
  • $(pwd)/data 挂载目录:确认是你放文件的目录,不然重建容器后链接和二维码全丢
  • 管理台里的三个域名:填你自己的短链、入口、落地域名
  • Nginx server_name 与 DNS 解析:三个域名都要指向你的服务器
  • 国内服务器的备案:没备案国内访问会被拦

上线自检

  1. docker ps 能看到 jumpwx 容器,状态是 Up
  2. curl http://127.0.0.1:9000/_ping 返回 ok
  3. 管理台能登录、能上传二维码并保存
  4. 三层域名已填写并保存,点「立即检测」三个域名都是绿灯
  5. 手机微信外打开落地页,按钮是「跳转微信」且二维码可见;微信内打开,按钮变成「关注公众号」,点进去是目标资料页

常见问题

  • 容器起不来、日志报端口占用:换掉 -p 左边那个端口
  • 管理台打不开或提示口令错误:确认地址是 内网IP:端口,口令和 JW_TOKEN 完全一致(别抄进全角字符);改口令要删掉旧容器重新 run
  • 建好的链接是 192.168.x.x 之类的内网地址:三层域名没填或没保存成功
  • docker build 卡在拉 node:20-slim:给 Docker 配国内镜像加速器,或先手动 pull 再构建
  • 链接突然打不开、检测有红灯:那一层域名被平台处理了,改它这层的 DNS 指向即可恢复
  • 改完 server.js 不生效:重新 build,再 docker rm -f jumpwx 后重新 run,data 目录不会丢

合规边界

这套东西没有「防封」功能,也承诺不了不被封号。抖音《社区自律公约》第 34 条同样禁止未经平台许可发布带商业推广性质的二维码和链接,平台规则永远优先于任何技术手段。这套实现主动做干净的是:不仿冒微信、不做自动跳转和返回劫持、不隐藏微信右上角菜单、不做多域名轮询分流(这条被规范明确定性为恶意对抗行为,后果是永久封禁域名与主体)。

维护

# 备份数据(只需要备份数据目录)
tar czf jumpwx-data-$(date +%Y%m%d).tar.gz -C /volume1/docker/jumpwx data

# 看日志
docker logs -f jumpwx

# 升级:覆盖 server.js / admin.html 后重建
docker build -t jumpwx:latest -f Dockerfile .
docker rm -f jumpwx && docker run -d --name jumpwx --restart unless-stopped \
  -p 9000:8080 -e JW_TOKEN=换成你自己的管理口令 \
  -v $(pwd)/data:/app/data jumpwx:latest

整件事最值钱的不是那 3 个文件,而是「二维码和短链指向哪里,由你自己说了算」。链接在自己手里,平台规则变了也能自己调整动作。

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息