logo
0
1
WeChat Login

Douyin LikeList Random

保存抖音“自己点赞(喜欢)列表”的本地服务(Go 后端 + PWA WebUI)。

注意:如果你的网络无法访问 proxy.golang.org,请先设置 Go 模块代理,例如: export GOPROXY=https://goproxy.cn,directexport GOPROXY=https://goproxy.io,direct

运行(开发)

  1. 创建 .env(参考 .env.example),填写管理员密码等配置
  2. 启动:
    • 后端:go run ./cmd/server -bind 127.0.0.1:8080 -db ./data/app.db -dev
    • 前端:cd web && pnpm install && pnpm dev
  3. 打开(前后端分开开发):
    • http://127.0.0.1:5173(Vite 会代理 /api/* 到后端)

签名(a_bogus)

抖音部分接口会返回 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,找不到时会自动下载官方 Node 到 ./data/tools/(可用 DYLR_NODE_AUTO_DOWNLOAD=0 关闭)

⚠️ 注意:example/douyin 是 GPLv3,若你直接使用其 douyin.js,请自行评估许可证合规。

远程签名服务(可选,适合手机本地运行)

如果你希望 数据全部保存在本机(例如 Flutter App 内本地 SQLite),但 a_bogus 仍交给服务器上 Node 处理,可以启动一个独立的远程签名服务:

  1. 生成 PSK(32 bytes,base64):
    • python3 - <<'PY'\nimport os,base64\nprint(base64.b64encode(os.urandom(32)).decode())\nPY
  2. 启动签名服务(服务器上):
    • Node 方式:go run ./cmd/signserver -bind 0.0.0.0:9000 -psk <PSK_BASE64> -signer node -sign-js /path/to/douyin.js
    • 纯 Go 方式:go run ./cmd/signserver -bind 0.0.0.0:9000 -psk <PSK_BASE64> -signer local
  3. 在 WebUI「设置」里填写:
    • 签名服务 URL:例如 https://sign.example.com(会自动拼接 /v1/sign
    • 签名 Key:上面的 PSK_BASE64
    • 点击「测试签名」

signserver 自用加固(推荐)

signserver 已支持一些“自用部署”安全选项:

  • -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

快速打包(Web / Go / Flutter,按版本与 CPU)

仓库提供了一键打包脚本 scripts/package.sh,默认会先构建 Web(供 Go/mobilebind embed),再分别打包 Go 与 Flutter(Android 使用 split-per-abi 输出按 CPU 拆分的 APK):

  • 仅打包 Web:./scripts/package.sh --only web --version v0.1.0
  • 打包 Go(当前平台/CPU):./scripts/package.sh --only go --version v0.1.0
  • 打包 Go(常见多平台/CPU):./scripts/package.sh --only go --version v0.1.0 --go-all
  • 打包 Flutter(默认 Android,按 CPU 拆分 APK):./scripts/package.sh --only mobile --version v0.1.0 --android
    • 如需自定义 Android versionCode: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 用错(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>"
  • Android API 版本不对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
  • Android buildNumber 超上限:Android versionCode 最大 2100000000;脚本已改为默认使用 epoch minutes,必要时可用 ANDROID_BUILD_NUMBER=123 自定义。

Docker 部署

  1. 准备 .env(至少设置 DYLR_ADMIN_PASSWORD;局域网/容器访问还需要 DYLR_SESSION_SECRETDYLR_ENC_KEY
  2. 启动:docker compose up -d --build
  3. 访问:http://127.0.0.1:8080

说明:

  • 当前 Dockerfile 会在构建镜像时自动构建 web 并 embed 到 Go 后端,容器启动后即可直接访问 PWA。
  • 服务是单体模式:访问根路径 / 就是 Web 页面,不需要再单独启动前端容器。
  • compose.yaml 使用 env_file: ./.env 注入环境变量,不再需要把 .env 映射到容器内。
  • Docker 镜像默认 DYLR_SIGNER=local,且不再打包 example/douyin/.../douyin.js
  • 运行时镜像为精简 Alpine,不内置 Node;如切换为 DYLR_SIGNER=node,会按配置自动下载 Node 到 ./data/tools/(默认开启 DYLR_NODE_AUTO_DOWNLOAD=1)。
  • Dockerfile 使用多阶段构建,运行时镜像仅保留 /app/server 与运行必需文件,不包含前端 node_modules
  • compose.yaml 默认启用最小权限(no-new-privilegescap_drop: ALLread_only: truetmpfs /tmp)。
  • 若需在局域网中让手机/平板访问,请确保 .env 中已配置 DYLR_ADMIN_PASSWORDDYLR_SESSION_SECRETDYLR_ENC_KEY

Docker 数据持久化说明(重要)

  • compose.yaml 映射了 ./data:/app/data,数据库在宿主机 data/app.db,所以重建镜像不会清空历史数据。
  • 管理员密码哈希也保存在 data/app.db,修改 .env 后若想生效,通常需要清理旧库或走改密逻辑。
  • 需要“全新空库”时可执行:
    • docker compose down
    • rm -f data/app.db
    • rm -rf data/tmp
    • docker compose up -d --build

PWA 安装与移动浏览器唤醒抖音

  • Web 顶栏提供「安装」按钮(Android/桌面会触发安装提示;iOS Safari 会提示“分享 → 添加到主屏幕”)。
  • 无论是否安装为 PWA,在手机/平板浏览器点击「在抖音中打开」时,会优先尝试通过 App Scheme 唤醒已安装抖音(与 App 版行为保持一致)。

使用流程(最短路径)

  1. 打开 WebUI → 登录
  2. 进入「设置」:
    • 粘贴抖音 Cookie
    • 设置同步间隔与限流(每 N 分钟最多 M 次请求)
    • 如需保存封面到 S3:填写 S3 配置(可选)
  3. 点击「立即同步」或等待定时同步
  4. 回到「首页」:搜索 / 随机一条 / 打开抖音

局域网访问(重要)

-bind 不是 127.0.0.1 时,必须额外设置:

  • DYLR_ADMIN_PASSWORD
  • DYLR_SESSION_SECRET
  • DYLR_ENC_KEY(base64,解码后 32 bytes)

生成 DYLR_ENC_KEY 示例: python3 - <<'PY'\nimport os,base64\nprint(base64.b64encode(os.urandom(32)).decode())\nPY

.env 文件读取

默认启动时会读取工作目录下的 .env(若存在),也可用 -env-file 指定路径:

  • go run ./cmd/server -env-file ./config/dev.env

Flutter App(mobile/)

mobile/README.md(包含 gomobile bind 生成 AAR/xcframework 的步骤)。

移动端默认无密码启动,打开 App 会自动拉起本地服务并进入 WebUI(仅限本机回环)。

About

抖音点赞列表,可以随机查看点赞的视频

Language
Go69.2%
TypeScript16.4%
Shell4.4%
Dart3.6%
Others6.4%