{"id":46278108,"url":"https://github.com/wangzekaihhhh/f2_web_app","last_synced_at":"2026-03-13T20:01:37.069Z","repository":{"id":340987026,"uuid":"1168452592","full_name":"wangZeKaihhhh/f2_web_app","owner":"wangZeKaihhhh","description":"面向飞牛 fnOS 的抖音数据采集与备份工具，提供 Web 管理界面与 FPK 打包支持。","archived":false,"fork":false,"pushed_at":"2026-03-10T09:13:15.000Z","size":1240,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-10T17:19:04.172Z","etag":null,"topics":["crawler","douyin","fnos","nas","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wangZeKaihhhh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-27T12:06:38.000Z","updated_at":"2026-03-10T09:13:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/wangZeKaihhhh/f2_web_app","commit_stats":null,"previous_names":["wangzekaihhhh/f2_web_app"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/wangZeKaihhhh/f2_web_app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wangZeKaihhhh%2Ff2_web_app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wangZeKaihhhh%2Ff2_web_app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wangZeKaihhhh%2Ff2_web_app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wangZeKaihhhh%2Ff2_web_app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wangZeKaihhhh","download_url":"https://codeload.github.com/wangZeKaihhhh/f2_web_app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wangZeKaihhhh%2Ff2_web_app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30473967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-13T17:15:31.527Z","status":"ssl_error","status_checked_at":"2026-03-13T17:15:22.394Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crawler","douyin","fnos","nas","python"],"created_at":"2026-03-04T05:04:02.965Z","updated_at":"2026-03-13T20:01:37.056Z","avatar_url":"https://github.com/wangZeKaihhhh.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# f2_web_app\n\n面向飞牛 fnOS 的抖音数据采集与备份工具，核心爬虫能力引用自 [`f2`](https://github.com/Johnserf-Seed/f2)，并提供 Web 管理界面与飞牛 FPK 打包支持。\n\n## 免责声明\n\n本项目仅用于你有合法授权的数据采集与备份。请遵守目标平台服务条款及当地法律法规。\n本项目与抖音及其关联公司无任何官方关系，仅供在合法授权范围内进行数据备份与研究。严禁用于未授权采集、隐私侵害、批量滥用、商业转售等行为。使用者应自行遵守相关法律法规及平台规则，并对自身行为及后果承担全部责任。因不当使用造成的任何法律风险或损失，项目作者与贡献者不承担责任。\n\n## 功能概览\n\n- Web 化任务管理（创建、查看、取消任务）\n- 计划任务（Cron 定时调度，自动执行采集）\n- 多用户批量采集与任务日志实时回传\n- 任务状态持久化（SQLite）\n- 访问密码鉴权与登录限流\n- 配置持久化与敏感字段加密存储\n- FPK 一键打包（适配飞牛 fnOS）\n\n### 实况合成 Motion Photo\n\n抖音实况（Live Photo）下载后会产生两组独立文件：`_image_N.webp`（静态图）和 `_live_N.mp4`（视频）。开启「实况合成 Motion Photo」后，下载完成会自动将配对文件合成为安卓 Motion Photo 格式（`_motion_N.jpg`），并删除原始分离文件。\n\n- 在设置面板中通过「实况合成 Motion Photo」开关控制，默认开启\n- 合成原理：JPG + MP4 字节拼接，通过 XMP-GCamera 元数据标识视频偏移量\n- 依赖 `ffmpeg`（必需）和 `exiftool`（可选，缺失时退化为裸拼接，部分安卓系统仍可识别）\n- 合成后的 `.jpg` 文件可传到安卓设备 Google Photos 中播放实况效果\n\n### 计划任务\n\n支持通过 Cron 表达式配置定时采集计划，到期后自动创建并执行任务。\n\n- 在 Web 界面侧边栏点击\"计划\"进入管理页面\n- 支持创建、编辑、删除、启用/禁用计划\n- 内置常用周期预设（每天 02:00、每 6 小时、每周一等），也可自定义 Cron 表达式\n- 每个计划可独立选择要采集的用户列表\n- 支持\"立即执行\"手动触发一次\n- 计划触发的任务与手动创建的任务统一在\"任务\"面板中展示\n\n## 本地开发\n\n### 前置依赖\n\n- Python 3.11+\n- Node.js 20+\n- pnpm 10+\n- fnpack（仅打包需要）\n\n### 配置分层\n\n项目按 `APP_ENV` 区分配置：\n\n- 开发环境（`APP_ENV=development`）\n  - `SETTINGS_FILE=backend/.runtime/config/settings.development.json`\n  - `STATE_DIR=backend/.runtime/state`\n  - `DOWNLOAD_PATH=backend/.runtime/downloads`\n- 打包运行（`APP_ENV=package`）\n  - `SETTINGS_FILE=${TRIM_PKGVAR}/config/settings.json`\n  - `STATE_DIR=${TRIM_PKGVAR}/state`\n  - `DOWNLOAD_PATH=${TRIM_DATA_SHARE_PATHS}`（未配置时回退到 `${TRIM_PKGVAR}/downloads`）\n\n参考模板：\n\n- [`scripts/dev.env`](scripts/dev.env)\n- [`scripts/package.env`](scripts/package.env)\n- [`backend/dev_settings.example.json`](backend/dev_settings.example.json)\n\n### 启动前端（开发）\n\n```bash\n./scripts/dev_frontend.sh\n```\n\n### 启动后端（开发）\n\n```bash\n./scripts/dev_backend.sh\n```\n\n也可手动启动：\n\n```bash\ncd backend\nsource .venv/bin/activate\nAPP_ENV=development \\\nSETTINGS_FILE=./.runtime/config/settings.development.json \\\nSTATE_DIR=./.runtime/state \\\nDOWNLOAD_PATH=./.runtime/downloads \\\npython -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000\n```\n\n## Docker 部署\n\n项目提供了完整的 Docker 版本（多阶段构建：前端打包 + 后端运行）。\n\n### 使用 Docker Compose（推荐）\n\n```bash\ndocker compose up -d --build\n```\n\n启动后访问：\n\n- `http://localhost:8000`\n\n默认会创建名为 `f2_data` 的持久化卷，并在容器内使用：\n\n- 配置：`/data/config/settings.json`\n- 运行状态：`/data/state`\n- 下载目录：`/data/downloads`\n\n停止服务：\n\n```bash\ndocker compose down\n```\n\n### 使用 Docker 命令\n\n```bash\ndocker build -t f2-web-fpk:latest .\ndocker run -d \\\n  --name f2-web-fpk \\\n  -p 8000:8000 \\\n  -v f2_data:/data \\\n  f2-web-fpk:latest\n```\n\n## 打包 FPK\n\n```bash\n./scripts/build_fpk.sh\n```\n\n脚本会执行：\n\n1. 构建 frontend dist\n2. 同步 backend + dist 到 `app/server` 与 `app/frontend_dist`\n3. 运行 `fnpack build`\n\n## 安全与运维\n\n### 访问密码与登录\n\n- 首次访问需设置密码。\n- 登录成功后会签发 Bearer Token。\n- 默认 Token 有效期：`12h`（`AUTH_TOKEN_TTL=43200`）。\n\n可配置环境变量：\n\n- `APP_PASSWORD`：可选，应用首次启动时预置密码\n- `AUTH_TOKEN_TTL`：Token 有效期（秒）\n- `AUTH_LOGIN_MAX_ATTEMPTS`：窗口内最大失败次数（默认 6）\n- `AUTH_LOGIN_WINDOW_SECONDS`：统计窗口（默认 300 秒）\n- `AUTH_LOGIN_BLOCK_SECONDS`：触发后封禁时长（默认 600 秒）\n\n### 忘记密码\n\n当前版本无“找回密码”接口。可通过重置认证文件恢复：\n\n1. 停止应用服务\n2. 删除 `${TRIM_PKGVAR}/config/auth.json`\n3. 重启应用\n4. 重新设置访问密码\n\n### 下载目录限制（fnOS 打包环境）\n\n在 `APP_ENV=package` 时，下载目录支持用户自定义绝对路径。后端会在保存设置和任务启动前执行“创建目录 + 写入探针文件”检查；如果无写权限会返回明确错误信息。\n\n## 许可证\n\n本项目采用 Apache License 2.0，详见 [`LICENSE`](LICENSE)。\n\n上游与衍生说明见 [`NOTICE`](NOTICE)。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwangzekaihhhh%2Ff2_web_app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwangzekaihhhh%2Ff2_web_app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwangzekaihhhh%2Ff2_web_app/lists"}