| """ |
| 一键创建 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() |