""" 一键创建 GitHub 数据存储仓库 用于 CHATSAM 项目的数据持久化 使用方法: 1. 设置环境变量 GITHUB_TOKEN (你的 GitHub Personal Access Token) 2. 运行脚本: python scripts/create_data_repo.py 或者直接传入参数: python scripts/create_data_repo.py --token ghp_xxx --repo-name my-chatsam-data """ import argparse import json import os import sys import requests from pathlib import Path GITHUB_API_URL = "https://api.github.com" def get_github_username(token: str) -> str: """获取 GitHub 用户名""" headers = { "Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json" } response = requests.get(f"{GITHUB_API_URL}/user", headers=headers) if response.status_code != 200: raise Exception(f"获取用户信息失败: {response.text}") return response.json()["login"] def create_repository(token: str, username: str, repo_name: str, private: bool = True) -> dict: """创建 GitHub 仓库""" headers = { "Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json" } data = { "name": repo_name, "description": "CHATSAM Data Storage - 用于存储账号和用户数据", "private": private, "auto_init": False } response = requests.post(f"{GITHUB_API_URL}/user/repos", headers=headers, json=data) if response.status_code == 201: print(f"✅ 仓库创建成功: {username}/{repo_name}") return response.json() elif response.status_code == 422: raise Exception(f"仓库已存在: {username}/{repo_name}") else: raise Exception(f"创建仓库失败: {response.text}") def create_file_in_repo(token: str, username: str, repo_name: str, file_path: str, content: dict, message: str) -> bool: """在仓库中创建文件""" headers = { "Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json" } url = f"{GITHUB_API_URL}/repos/{username}/{repo_name}/contents/{file_path}" data = { "message": message, "content": base64_encode(json.dumps(content, ensure_ascii=False, indent=2)) } response = requests.put(url, headers=headers, json=data) if response.status_code == 201: print(f"✅ 文件创建成功: {file_path}") return True else: raise Exception(f"创建文件失败: {response.text}") def base64_encode(content: str) -> str: """Base64 编码""" import base64 return base64.b64encode(content.encode("utf-8")).decode("utf-8") def main(): parser = argparse.ArgumentParser(description="一键创建 CHATSAM 数据存储仓库") parser.add_argument("--token", help="GitHub Personal Access Token", default=os.environ.get("GITHUB_TOKEN")) parser.add_argument("--repo-name", help="仓库名称", default="chatsam-data") parser.add_argument("--public", help="创建公开仓库", action="store_true", default=False) args = parser.parse_args() if not args.token: print("❌ 错误: 请提供 GitHub Token") print("方式 1: 设置环境变量 GITHUB_TOKEN") print("方式 2: 使用 --token 参数") print("\n示例:") print(" python scripts/create_data_repo.py --token ghp_xxx --repo-name my-data") sys.exit(1) try: print("🚀 开始创建数据仓库...") username = get_github_username(args.token) print(f"👤 GitHub 用户: {username}") repo_info = create_repository( token=args.token, username=username, repo_name=args.repo_name, private=not args.public ) accounts_data = {"items": []} auth_keys_data = {"items": []} create_file_in_repo( token=args.token, username=username, repo_name=args.repo_name, file_path="accounts.json", content=accounts_data, message="init: accounts.json" ) create_file_in_repo( token=args.token, username=username, repo_name=args.repo_name, file_path="auth_keys.json", content=auth_keys_data, message="init: auth_keys.json" ) print("\n" + "=" * 50) print("🎉 数据仓库创建完成!") print("=" * 50) print(f"\n📦 仓库地址: https://github.com/{username}/{args.repo_name}") print("\n📋 下一步: 在 HuggingFace Space 配置 Secrets") print("-" * 50) print(f"STORAGE_BACKEND = git") print(f"GIT_REPO_URL = https://github.com/{username}/{args.repo_name}.git") print(f"GIT_TOKEN = {args.token[:10]}... (你的完整 Token)") print("-" * 50) except Exception as e: print(f"\n❌ 错误: {e}") sys.exit(1) if __name__ == "__main__": main()