File size: 4,978 Bytes
61136c3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | """
一键创建 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() |