160 lines
4.5 KiB
Python
160 lines
4.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Cloud Mail Token 生成脚本
|
|
|
|
使用方法:
|
|
python get_cloudmail_token.py
|
|
|
|
注意:生成新 Token 会使之前的 Token 失效!
|
|
"""
|
|
|
|
import httpx
|
|
import json
|
|
import getpass
|
|
|
|
|
|
def get_cloudmail_token(api_url: str, admin_email: str, admin_password: str):
|
|
"""
|
|
调用 Cloud Mail API 生成 Token
|
|
|
|
参数:
|
|
api_url: Cloud Mail API 基础 URL (例如: https://mygoband.com)
|
|
admin_email: 管理员邮箱
|
|
admin_password: 管理员密码
|
|
|
|
返回:
|
|
生成的 Token 字符串
|
|
"""
|
|
url = f"{api_url.rstrip('/')}/api/public/genToken"
|
|
|
|
payload = {
|
|
"email": admin_email,
|
|
"password": admin_password
|
|
}
|
|
|
|
print(f"\n正在请求: {url}")
|
|
print(f"管理员邮箱: {admin_email}")
|
|
print("-" * 60)
|
|
|
|
try:
|
|
response = httpx.post(
|
|
url,
|
|
json=payload,
|
|
headers={"Content-Type": "application/json"},
|
|
timeout=30.0
|
|
)
|
|
|
|
print(f"HTTP 状态码: {response.status_code}")
|
|
print(f"响应内容: {response.text}\n")
|
|
|
|
if response.status_code != 200:
|
|
print(f"❌ 请求失败: HTTP {response.status_code}")
|
|
return None
|
|
|
|
data = response.json()
|
|
|
|
if data.get("code") != 200:
|
|
print(f"❌ API 错误: {data.get('message', 'Unknown error')}")
|
|
return None
|
|
|
|
token = data.get("data", {}).get("token")
|
|
|
|
if not token:
|
|
print("❌ 响应中没有找到 token")
|
|
return None
|
|
|
|
print("✅ Token 生成成功!")
|
|
print("=" * 60)
|
|
print(f"Token: {token}")
|
|
print("=" * 60)
|
|
print("\n请将此 Token 复制到 .env 文件中的 MAIL_CLOUDMAIL_TOKEN")
|
|
print("\n⚠️ 警告:此 Token 会使之前生成的所有 Token 失效!")
|
|
|
|
return token
|
|
|
|
except httpx.TimeoutException:
|
|
print("❌ 请求超时,请检查网络连接和 API URL")
|
|
return None
|
|
except httpx.NetworkError as e:
|
|
print(f"❌ 网络错误: {e}")
|
|
return None
|
|
except Exception as e:
|
|
print(f"❌ 发生错误: {e}")
|
|
return None
|
|
|
|
|
|
def main():
|
|
print("=" * 60)
|
|
print("Cloud Mail Token 生成器")
|
|
print("=" * 60)
|
|
|
|
# 获取用户输入
|
|
api_url = input("\n请输入 Cloud Mail API URL (例如 https://mygoband.com): ").strip()
|
|
|
|
if not api_url:
|
|
print("❌ API URL 不能为空")
|
|
return
|
|
|
|
admin_email = input("请输入管理员邮箱: ").strip()
|
|
|
|
if not admin_email:
|
|
print("❌ 管理员邮箱不能为空")
|
|
return
|
|
|
|
admin_password = getpass.getpass("请输入管理员密码: ")
|
|
|
|
if not admin_password:
|
|
print("❌ 管理员密码不能为空")
|
|
return
|
|
|
|
# 生成 Token
|
|
token = get_cloudmail_token(api_url, admin_email, admin_password)
|
|
|
|
if token:
|
|
# 询问是否自动更新 .env 文件
|
|
update_env = input("\n是否自动更新 .env 文件?(y/N): ").lower()
|
|
|
|
if update_env == 'y':
|
|
try:
|
|
import os
|
|
from pathlib import Path
|
|
|
|
env_file = Path(".env")
|
|
|
|
if env_file.exists():
|
|
# 读取现有内容
|
|
content = env_file.read_text()
|
|
|
|
# 检查是否已有 MAIL_CLOUDMAIL_TOKEN
|
|
if "MAIL_CLOUDMAIL_TOKEN" in content:
|
|
# 替换现有值
|
|
import re
|
|
content = re.sub(
|
|
r'MAIL_CLOUDMAIL_TOKEN=.*',
|
|
f'MAIL_CLOUDMAIL_TOKEN={token}',
|
|
content
|
|
)
|
|
print("✅ 已更新 .env 文件中的 MAIL_CLOUDMAIL_TOKEN")
|
|
else:
|
|
# 添加新行
|
|
content += f"\nMAIL_CLOUDMAIL_TOKEN={token}\n"
|
|
print("✅ 已添加 MAIL_CLOUDMAIL_TOKEN 到 .env 文件")
|
|
|
|
# 写回文件
|
|
env_file.write_text(content)
|
|
else:
|
|
print("⚠️ .env 文件不存在,请手动创建")
|
|
|
|
except Exception as e:
|
|
print(f"❌ 更新 .env 文件失败: {e}")
|
|
print("请手动复制 Token 到 .env 文件")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
print("\n\n⚠️ 操作已取消")
|
|
except Exception as e:
|
|
print(f"\n❌ 程序错误: {e}")
|