CHATSAM-Public / scripts /create_data_repo.py
chanfasf's picture
feat: add one-click script to create data repository
61136c3
Raw
History Blame Contribute Delete
4.98 kB
"""
一键创建 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()