保存抖音“自己点赞(喜欢)列表”的本地服务(Go 后端 + PWA WebUI)。
注意:如果你的网络无法访问
proxy.golang.org,请先设置 Go 模块代理,例如:export GOPROXY=https://goproxy.cn,direct或export GOPROXY=https://goproxy.io,direct
.env(参考 .env.example),填写管理员密码等配置go run ./cmd/server -bind 127.0.0.1:8080 -db ./data/app.db -devcd web && pnpm install && pnpm devhttp://127.0.0.1:5173(Vite 会代理 /api/* 到后端)抖音部分接口会返回 status_code=5,通常需要 a_bogus。本项目按 example/douyin 的思路通过 Node 执行 JS 签名脚本 生成 a_bogus:
DYLR_SIGN_JS:指向签名脚本(默认会尝试使用 ./example/douyin/backend/lib/douyin/js/douyin.js)DYLR_SIGNER:签名后端(node 默认 / local 纯 Go 实现)node,找不到时会自动下载官方 Node 到 ./data/tools/(可用 DYLR_NODE_AUTO_DOWNLOAD=0 关闭)⚠️ 注意:example/douyin 是 GPLv3,若你直接使用其 douyin.js,请自行评估许可证合规。
如果你希望 数据全部保存在本机(例如 Flutter App 内本地 SQLite),但 a_bogus 仍交给服务器上 Node 处理,可以启动一个独立的远程签名服务:
python3 - <<'PY'\nimport os,base64\nprint(base64.b64encode(os.urandom(32)).decode())\nPYgo run ./cmd/signserver -bind 0.0.0.0:9000 -psk <PSK_BASE64> -signer node -sign-js /path/to/douyin.jsgo run ./cmd/signserver -bind 0.0.0.0:9000 -psk <PSK_BASE64> -signer local签名服务 URL:例如 https://sign.example.com(会自动拼接 /v1/sign)签名 Key:上面的 PSK_BASE64signserver 已支持一些“自用部署”安全选项:
-auth-token <TOKEN>:启用后必须带 Authorization: Bearer <TOKEN>(建议与 PSK 分开生成,便于单独轮换)-allow-cidr <CIDR,...>:CIDR 白名单(例如只允许家里局域网/VPN 网段)-ip-rpm/-ip-burst、-global-rpm/-global-burst:限流(防止被扫/DoS)-trust-xff:放在反向代理后面时,用 X-Forwarded-For 识别真实客户端 IP-tls-cert/-tls-key:直接用证书起 HTTPS(也可用 Nginx/Caddy 反代)执行一次构建后,产物会输出到 internal/httpapi/webdist/,后端会 embed 并在 http://127.0.0.1:8080 直接提供 WebUI:
cd web && pnpm build仓库提供了一键打包脚本 scripts/package.sh,默认会先构建 Web(供 Go/mobilebind embed),再分别打包 Go 与 Flutter(Android 使用 split-per-abi 输出按 CPU 拆分的 APK):
./scripts/package.sh --only web --version v0.1.0./scripts/package.sh --only go --version v0.1.0./scripts/package.sh --only go --version v0.1.0 --go-all./scripts/package.sh --only mobile --version v0.1.0 --android
ANDROID_BUILD_NUMBER=123 ./scripts/package.sh --only mobile --version v0.1.0 --android产物输出到 dist/<version>/。
同时会生成一个总包:dist/<version>/dylr-bundle_<version>.tar.gz(包含 web/、go/、mobile/、mobilebind/)。
ndk-bundle 太老/不完整):gomobile 需要 side-by-side NDK(Android Studio → SDK Manager → SDK Tools → NDK (Side by side))。并设置:
export ANDROID_SDK_ROOT="$HOME/Library/Android/sdk"export ANDROID_NDK_HOME="$HOME/Library/Android/sdk/ndk/<version>"gomobile 的 -androidapi 只支持 21..35,用脚本时传 --android-api 21(或 export ANDROID_API=21)。gomobile init 不支持 -androidapi:只需要执行 gomobile init,-androidapi 仅用于 gomobile bind。golang.org/x/mobile/bind 找不到:gomobile/gobind 会加载 golang.org/x/mobile/bind,仓库已通过 tools/tools.go 固定依赖;若仍异常,先跑 go mod tidy。buildNumber 超上限:Android versionCode 最大 2100000000;脚本已改为默认使用 epoch minutes,必要时可用 ANDROID_BUILD_NUMBER=123 自定义。.env(至少设置 DYLR_ADMIN_PASSWORD;局域网/容器访问还需要 DYLR_SESSION_SECRET、DYLR_ENC_KEY)docker compose up -d --buildhttp://127.0.0.1:8080说明:
Dockerfile 会在构建镜像时自动构建 web 并 embed 到 Go 后端,容器启动后即可直接访问 PWA。/ 就是 Web 页面,不需要再单独启动前端容器。compose.yaml 使用 env_file: ./.env 注入环境变量,不再需要把 .env 映射到容器内。DYLR_SIGNER=local,且不再打包 example/douyin/.../douyin.js。DYLR_SIGNER=node,会按配置自动下载 Node 到 ./data/tools/(默认开启 DYLR_NODE_AUTO_DOWNLOAD=1)。/app/server 与运行必需文件,不包含前端 node_modules。compose.yaml 默认启用最小权限(no-new-privileges、cap_drop: ALL、read_only: true、tmpfs /tmp)。.env 中已配置 DYLR_ADMIN_PASSWORD、DYLR_SESSION_SECRET、DYLR_ENC_KEY。compose.yaml 映射了 ./data:/app/data,数据库在宿主机 data/app.db,所以重建镜像不会清空历史数据。data/app.db,修改 .env 后若想生效,通常需要清理旧库或走改密逻辑。docker compose downrm -f data/app.dbrm -rf data/tmpdocker compose up -d --buildCookie当 -bind 不是 127.0.0.1 时,必须额外设置:
DYLR_ADMIN_PASSWORDDYLR_SESSION_SECRETDYLR_ENC_KEY(base64,解码后 32 bytes)生成 DYLR_ENC_KEY 示例:
python3 - <<'PY'\nimport os,base64\nprint(base64.b64encode(os.urandom(32)).decode())\nPY
默认启动时会读取工作目录下的 .env(若存在),也可用 -env-file 指定路径:
go run ./cmd/server -env-file ./config/dev.env见 mobile/README.md(包含 gomobile bind 生成 AAR/xcframework 的步骤)。
移动端默认无密码启动,打开 App 会自动拉起本地服务并进入 WebUI(仅限本机回环)。