{"repo": "bcefghj/bcefghj", "files": {"stats.json": {"9193cca0df949ccea9741b8a714e668af9605774": {"t": 1785603919.7651176, "n": 130, "h": "840dfda8d1c8aba2", "c": "{\n \"total_stars\": 7047,\n \"total_forks\": 1013,\n \"followers\": 856,\n \"public_repos\": 75,\n \"updated_at\": \"2026-08-01 16:57 UTC\"\n}"}}, "update_stats.py": {"8e548b10801d172336cd1ccd28478349860400ae": {"t": 1785603922.2236147, "n": 3516, "h": "5fdc7804ac0134e7", "c": "#!/usr/bin/env python3\n\"\"\"\nGitHub Stats Auto-Updater\n每天自动获取所有仓库数据并更新 README 中的数据看板\n\"\"\"\n\nimport os\nimport json\nimport urllib.request\nimport urllib.error\nfrom datetime import datetime, timezone\n\nGITHUB_TOKEN = os.environ.get(\"GH_TOKEN\", \"\")\nUSERNAME = \"bcefghj\"\nREADME_PATH = \"README.md\"\nSTATS_JSON_PATH = \"stats.json\"\n\n\ndef api_get(url):\n req = urllib.request.Request(url)\n req.add_header(\"Authorization\", f\"token {GITHUB_TOKEN}\")\n req.add_header(\"Accept\", \"application/vnd.github.v3+json\")\n req.add_header(\"User-Agent\", \"github-stats-updater\")\n with urllib.request.urlopen(req) as resp:\n return json.loads(resp.read().decode())\n\n\ndef get_all_repos():\n repos = []\n page = 1\n while True:\n url = f\"https://api.github.com/users/{USERNAME}/repos?per_page=100&page={page}&sort=updated\"\n data = api_get(url)\n if not data:\n break\n repos.extend(data)\n if len(data) < 100:\n break\n page += 1\n return repos\n\n\ndef get_user_info():\n return api_get(f\"https://api.github.com/users/{USERNAME}\")\n\n\ndef format_number(n):\n if n >= 1000:\n return f\"{n/1000:.1f}k\"\n return str(n)\n\n\ndef build_stats_table(repos, user_info, now_str):\n own_repos = [r for r in repos if not r.get(\"fork\")]\n\n total_stars = sum(r.get(\"stargazers_count\", 0) for r in own_repos)\n total_forks = sum(r.get(\"forks_count\", 0) for r in own_repos)\n followers = user_info.get(\"followers\", 0)\n public_repos = user_info.get(\"public_repos\", 0)\n\n # 保存 JSON 供 badge 使用\n stats_data = {\n \"total_stars\": total_stars,\n \"total_forks\": total_forks,\n \"followers\": followers,\n \"public_repos\": public_repos,\n \"updated_at\": now_str,\n }\n with open(STATS_JSON_PATH, \"w\") as f:\n json.dump(stats_data, f, indent=2)\n\n block = f\"\"\"
\n\n| ⭐ Stars | 🍴 Forks | 👥 Followers | 📦 Repos |\n|:---:|:---:|:---:|:---:|\n| **{total_stars}** | **{total_forks}** | **{followers}** | **{public_repos}** |\n\n🔄 Updated: {now_str} · by GitHub Actions\n\n
\n\n\"\"\"\n return block\n\n\ndef update_readme(stats_block):\n with open(README_PATH, \"r\", encoding=\"utf-8\") as f:\n content = f.read()\n\n start_marker = \"\"\n end_marker = \"\"\n start_idx = content.find(start_marker)\n end_idx = content.find(end_marker)\n\n if start_idx == -1 or end_idx == -1:\n print(\"❌ 找不到 README 中的标记位置\")\n return\n\n new_content = (\n content[: start_idx + len(start_marker)]\n + \"\\n\"\n + stats_block\n + content[end_idx:]\n )\n\n with open(README_PATH, \"w\", encoding=\"utf-8\") as f:\n f.write(new_content)\n print(\"✅ README 已更新\")\n\n\ndef main():\n now_str = datetime.now(timezone.utc).strftime(\"%Y-%m-%d %H:%M UTC\")\n print(f\"🔄 开始更新 GitHub Stats... [{now_str}]\")\n\n user_info = get_user_info()\n print(f\"👤 用户: {user_info.get('login')}, 粉丝: {user_info.get('followers')}\")\n\n repos = get_all_repos()\n own_repos = [r for r in repos if not r.get(\"fork\")]\n print(f\"📦 获取到 {len(own_repos)} 个自有仓库\")\n\n stats_block = build_stats_table(repos, user_info, now_str)\n update_readme(stats_block)\n\n total_stars = sum(r.get(\"stargazers_count\", 0) for r in own_repos)\n total_forks = sum(r.get(\"forks_count\", 0) for r in own_repos)\n print(f\"⭐ 总 Stars: {total_stars} | 🍴 总 Forks: {total_forks}\")\n print(\"✅ 完成!\")\n\n\nif __name__ == \"__main__\":\n main()\n"}}}}