Spaces:
Paused
Paused
| """一次性清理:把 Team 里仍然挂着但本地已经 PERSONAL 的遗留成员强踢干净。 | |
| 背景:fill-personal 过去因 remove_from_team "already_absent" 误判(OpenAI /users 同步 | |
| 延迟导致 GET 没返回新成员),跳过了 DELETE,结果账号在 Team 里留成 Member。运行本脚本 | |
| 一键清理。使用新版 remove_from_team(带 retry),同时打印结果以便核对。 | |
| 用法: uv run python scripts/sweep_leftover_members.py | |
| """ | |
| from __future__ import annotations | |
| import sys | |
| from pathlib import Path | |
| # 注册表里 PERSONAL 状态但 Team 里还挂着的 4 个号(来自截图) | |
| TARGETS = [ | |
| "1fcf5e71a1@uuhfn.asia", | |
| "d9d6bb32c5@uuhfn.asia", | |
| "91006bdbbb@uuhfn.asia", | |
| "7e0f3205f9@uuhfn.asia", | |
| ] | |
| def main() -> int: | |
| # 让脚本无论从哪里起都能 import autoteam | |
| repo_root = Path(__file__).resolve().parent.parent | |
| sys.path.insert(0, str(repo_root / "src")) | |
| from autoteam.chatgpt_api import ChatGPTTeamAPI | |
| from autoteam.manager import remove_from_team | |
| api = ChatGPTTeamAPI() | |
| api.start() | |
| results: dict[str, str] = {} | |
| try: | |
| for email in TARGETS: | |
| try: | |
| status = remove_from_team(api, email, return_status=True) | |
| except Exception as exc: | |
| status = f"exception: {exc}" | |
| results[email] = str(status) | |
| print(f"[sweep] {email} → {status}") | |
| finally: | |
| api.stop() | |
| print("\n=== 清理汇总 ===") | |
| for email, status in results.items(): | |
| print(f" {email:40s} → {status}") | |
| failed = [e for e, s in results.items() if s not in ("removed", "already_absent")] | |
| if failed: | |
| print(f"\n失败 {len(failed)} 个,需手动处理: {failed}") | |
| return 1 | |
| print("\n全部清理完成。请刷新 ChatGPT Team Members 页面确认 Team 只剩主号 + baseline。") | |
| return 0 | |
| if __name__ == "__main__": | |
| raise SystemExit(main()) | |