{"id":50994970,"url":"https://github.com/nixliuxin/qzone-time-machine","last_synced_at":"2026-06-20T08:02:17.355Z","repository":{"id":361465527,"uuid":"1254565314","full_name":"nixliuxin/QZone-Time-Machine","owner":"nixliuxin","description":"QQ空间时光机 - 全量导出与本地浏览工具 | Archive your entire QZone and browse it offline","archived":false,"fork":false,"pushed_at":"2026-06-17T03:58:40.000Z","size":448,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T04:25:12.920Z","etag":null,"topics":["archive","backup","china","data-export","digital-archive","electron","nostalgia","offline-viewer","puppeteer","qq","qq-zone","qzone","qzone-backup","qzone-export","react","self-hosted","social-media-backup","time-machine","typescript"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nixliuxin.png","metadata":{"files":{"readme":"README.en.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-30T18:19:08.000Z","updated_at":"2026-06-17T03:58:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nixliuxin/QZone-Time-Machine","commit_stats":null,"previous_names":["nixliuxin/qzone-tools"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/nixliuxin/QZone-Time-Machine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixliuxin%2FQZone-Time-Machine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixliuxin%2FQZone-Time-Machine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixliuxin%2FQZone-Time-Machine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixliuxin%2FQZone-Time-Machine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nixliuxin","download_url":"https://codeload.github.com/nixliuxin/QZone-Time-Machine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixliuxin%2FQZone-Time-Machine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34561766,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["archive","backup","china","data-export","digital-archive","electron","nostalgia","offline-viewer","puppeteer","qq","qq-zone","qzone","qzone-backup","qzone-export","react","self-hosted","social-media-backup","time-machine","typescript"],"created_at":"2026-06-20T08:02:16.527Z","updated_at":"2026-06-20T08:02:17.346Z","avatar_url":"https://github.com/nixliuxin.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"right\"\u003e\n  \u003cstrong\u003eEnglish\u003c/strong\u003e ·\n  \u003ca href=\"README.md\"\u003e简体中文\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/Qzone-logo.png\" alt=\"QZone Time Machine\" width=\"200\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eQZone Time Machine\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\u003ccode\u003eQZone-Time-Machine\u003c/code\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eArchive memories, preserve emotions\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-blue?style=flat-square\" alt=\"License\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square\" alt=\"Node\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/pnpm-monorepo-F69220?style=flat-square\" alt=\"pnpm\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/no--server-local--only-8B5CF6?style=flat-square\" alt=\"No Server\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Back up your QQ Zone memories before they disappear.\u003cbr\u003e\n  QR code login, one-click backup, offline browsing — no server required.\n\u003c/p\u003e\n\n---\n\n## Features\n\n- **Zero-Server Architecture** — Runs entirely on your machine, never uploads data anywhere\n- **Local QR Code Login** — Authenticates via local Chromium with QQ's official login page; credentials stay on your device\n- **Open Source \u0026 Transparent** — Fully auditable code, no telemetry or tracking\n- **Complete Backup** — 10 modules fully collected\n- **Original Quality** — Downloads images and videos at their highest available resolution\n- **Resumable** — Interrupted backups continue where they left off\n- **Smart Rate Limiting** — Automatic retry with exponential backoff\n- **Offline Viewer** — Double-click `index.html` to browse locally, no internet or server required\n- **Portable Output** — Standard JSON files with relative media paths\n- **QQ Emoji Archival** — Automatically downloads all referenced QQ emojis locally for full offline access\n\n---\n\n## Supported Modules\n\n| Module | Content | Additional Info |\n|--------|---------|-----------------|\n| **Messages** | Text, images, video, audio | Comments, geolocation, source device, forward count |\n| **Blogs** | Full content (rich text/images) | Category tags, original/repost flag, comments |\n| **Private Diaries** | Full content | Owner-only entries |\n| **Albums** | Original resolution photos \u0026 video | Album description, EXIF, capture/upload time, POI, comments |\n| **Videos** | Video files | Description, comments |\n| **Message Board** | Full board messages | Replies, media attachments |\n| **Friends** | Friend list | Groups, remarks, friendship date |\n| **Favorites** | Favorited content | Source info |\n| **Shares** | Shared content | Source, comments |\n| **Visitors** | Visit records | Visitor info, visit content summary |\n\n---\n\n## Quick Start\n\n```bash\n# Install dependencies\npnpm install\n\n# Build everything (CLI + viewer)\npnpm build\n\n# Step 1: Log in (scan QR code with mobile QQ)\npnpm cli -- login\n\n# Step 2: Back up a user\npnpm cli -- backup 123456789 -n \"Nickname\"\n\n# Convert legacy backups (QZoneExport format)\npnpm cli -- convert ./old-backup ./output\n```\n\n### Sync scope (`--scope`)\n\n`backup` / `backup-all` use `--scope` to control sync depth (both are always safe to re-run and resume automatically):\n\n- `--scope full` (default) — rescan the lists (discover newly-added/missing **whole** items) and backfill details + media. Prioritizes completeness.\n- `--scope topup` — trust the local lists as complete and **only backfill missing per-item data** (comments / likes / visitors / full content / media), skipping the list rescan (the step most likely to trip rate limits). Lowest API cost; only tops up accounts that already have a backup.\n\n```bash\n# Full sync (default)\npnpm cli -- backup 123456789 -n \"Nickname\"\n\n# Light top-up: only fill gaps on an existing backup, no list rescan\npnpm cli -- backup 123456789 -n \"Nickname\" --scope topup\n```\n\n\u003e The old `--fill-missing` flag is kept as a deprecated alias for `--scope topup`.\n\n## Output Structure\n\nEach backed-up user produces a self-contained directory:\n\n```\n{qq_number}_{name}/\n├── index.html              ← Double-click to browse offline\n├── data/                   JSON data files\n│   ├── user.json\n│   ├── messages.json\n│   ├── blogs.json\n│   ├── boards.json\n│   ├── videos.json\n│   ├── diaries.json\n│   ├── friends.json\n│   ├── favorites.json\n│   ├── shares.json\n│   ├── visitors.json\n│   └── photos/\n│       ├── albums.json     Album index\n│       └── {albumId}.json  Photos for each album\n└── media/                  Downloaded images \u0026 videos\n    ├── messages/images/\n    ├── blogs/images/\n    ├── albums/photos/{class}/{album}/\n    ├── albums/covers/\n    ├── emoji/              QQ emojis (localized)\n    └── videos/videos/\n```\n\n## Offline Viewer\n\nAfter backup, a React SPA is automatically embedded into `index.html`:\n\n- Light/dark mode toggle\n- Click images to zoom, navigate with arrow keys\n- Album EXIF info panel\n- Inline video playback\n- Full board/blog rendering with comments, avatars, and links\n- Data completeness report\n- Traditional pagination with keyboard shortcuts\n\n## Architecture\n\n```\nQZone-Time-Machine (pnpm monorepo)\n├── packages/cli          TypeScript CLI + CommonJS engine\n│   ├── src/index.ts      Entry point (login / backup / convert)\n│   ├── src/convert.ts    Legacy data migration\n│   └── engine/           Battle-tested JS collection engine (via createRequire)\n└── packages/viewer       React + Vite SPA\n    ├── Single-file bundle (vite-plugin-singlefile)\n    └── Embedded in index.html for file:// protocol support\n```\n\n## Requirements\n\n- Node.js 18+\n- pnpm 9+\n- Chromium / Chrome (for QR code login)\n\n## Acknowledgements\n\nThis project was inspired by and built upon the work of:\n\n- [QZoneExport](https://github.com/ShunCai/QZoneExport) — QQ Zone data export browser extension\n- [QzonePhoto](https://github.com/11273/QzonePhoto) — QQ Zone photo downloader\n\n## Disclaimer\n\n### Security \u0026 Privacy\n- This tool uses a **zero-server architecture** — runs entirely locally, never uploads any data\n- Login uses QQ's official QR scan page via local Chromium; credentials are stored only in local `cookies.json`\n- Intended for backing up **your own** QQ Zone data only; do not use to access others' data without authorization\n\n### Copyright\n- QQ Zone, QQ, and related trademarks belong to Tencent Holdings Ltd.\n- QQ Zone logo copyright belongs to Tencent ([source](https://zh.wikipedia.org/wiki/File:Qzone-logo.png))\n- This tool is not affiliated with Tencent\n\n### Warranty\n- Provided \"as is\" without warranty of any kind, express or implied\n- Users assume all responsibility for consequences of using this tool\n- QQ Zone APIs may change at any time; long-term availability is not guaranteed\n\n## License\n\n[MIT](LICENSE) (c) 2026 Nix Liu Xin\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnixliuxin%2Fqzone-time-machine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnixliuxin%2Fqzone-time-machine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnixliuxin%2Fqzone-time-machine/lists"}