Automated backup - 20250717_000001

This commit is contained in:
Will Song
2025-07-17 00:00:01 -05:00
parent 568dcc45e4
commit 9b026fcc76
12 changed files with 1059 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
# 安装系统依赖
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# 复制requirements文件
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY chatgpt_bot.py .
# 创建utils目录会通过volume挂载
RUN mkdir -p utils
# 设置健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD python3 -c "import sys; sys.exit(0)"
# 运行应用
CMD ["python3", "chatgpt_bot.py"]

View File

@@ -0,0 +1,241 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ChatGPT Discord Bot
===================
这个bot使用OpenAI的ChatGPT API来提供AI对话功能。
支持多种ChatGPT模型包括GPT-4o、GPT-4等。
主要功能:
- /chat - 与ChatGPT对话
- /model - 切换ChatGPT模型
- /help - 显示帮助信息
"""
import discord
from discord.ext import commands
import openai
import asyncio
import logging
import sys
import os
from pathlib import Path
# 添加项目根目录到Python路径
sys.path.append(str(Path(__file__).parent.parent.parent))
from utils.token_reader import TokenReader
# 设置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class ChatGPTBot:
"""ChatGPT Discord Bot主类"""
def __init__(self, token_path: str):
self.token_path = token_path
self.token_reader = TokenReader(token_path)
# 设置Discord权限
intents = discord.Intents.default()
intents.message_content = True
intents.guild_messages = True
# 创建bot实例
self.bot = commands.Bot(
command_prefix='!',
intents=intents,
help_command=None
)
# 初始化OpenAI客户端
self.openai_client = None
self.current_model = "gpt-4o-mini-2024-07-18"
# 可用模型列表
self.available_models = [
"gpt-4o-mini-2024-07-18",
"gpt-4o",
"gpt-4-turbo",
"gpt-3.5-turbo"
]
self.setup_events()
self.setup_commands()
def setup_events(self):
"""设置事件处理器"""
@self.bot.event
async def on_ready():
logger.info(f'{self.bot.user} (ChatGPT Bot) 已连接到Discord!')
if self.bot.user:
logger.info(f'Bot ID: {self.bot.user.id}')
# 初始化OpenAI客户端
try:
api_key = self.token_reader.get_token('chatgpt_API')
if not api_key:
raise ValueError("无法读取chatgpt_API")
self.openai_client = openai.OpenAI(api_key=api_key)
logger.info("OpenAI客户端初始化成功")
except Exception as e:
logger.error(f"初始化OpenAI客户端失败: {e}")
@self.bot.event
async def on_message(message):
if message.author == self.bot.user:
return
if self.bot.user.mentioned_in(message):
content = message.content.replace(f'<@{self.bot.user.id}>', '').replace(f'<@!{self.bot.user.id}>', '').strip()
if not content:
help_text = """🤖 **ChatGPT Bot 帮助**
**使用方法:**
• @chatgpt_o4 你的问题 - 与ChatGPT对话
• @chatgpt_o4 model gpt-4o - 切换模型
• @chatgpt_o4 help - 显示帮助
**可用模型:**
• gpt-4o-mini-2024-07-18 (默认)
• gpt-4o
• gpt-4-turbo
• gpt-3.5-turbo
**当前模型:** {}
**状态:** ✅ 在线""".format(self.current_model)
await message.reply(help_text)
return
if content.lower().startswith('help'):
help_text = """🤖 **ChatGPT Bot 帮助**
**使用方法:**
• @chatgpt_o4 你的问题 - 与ChatGPT对话
• @chatgpt_o4 model gpt-4o - 切换模型
• @chatgpt_o4 help - 显示帮助
**可用模型:**
• gpt-4o-mini-2024-07-18 (默认)
• gpt-4o
• gpt-4-turbo
• gpt-3.5-turbo
**当前模型:** {}
**状态:** ✅ 在线""".format(self.current_model)
await message.reply(help_text)
return
if content.lower().startswith('model '):
model = content[6:].strip()
if model in self.available_models:
old_model = self.current_model
self.current_model = model
await message.reply(f"✅ 模型已从 `{old_model}` 切换到 `{model}`")
else:
model_list = "\n".join([f"{m}" for m in self.available_models])
await message.reply(f"❌ 不支持的模型。可用模型:\n{model_list}")
return
try:
if not self.openai_client:
await message.reply("❌ OpenAI客户端未初始化")
return
typing_task = asyncio.create_task(self.start_typing(message.channel))
response = self.openai_client.chat.completions.create(
model=self.current_model,
messages=[
{"role": "system", "content": "你是一个有用的AI助手。请用中文回答问题。"},
{"role": "user", "content": content}
],
max_tokens=2000,
temperature=0.7
)
typing_task.cancel()
ai_response = response.choices[0].message.content
await self.send_long_message(message, f"🤖 **ChatGPT ({self.current_model})**\n\n{ai_response}")
except Exception as e:
logger.error(f"ChatGPT调用错误: {e}")
await message.reply(f"❌ ChatGPT API调用失败: {str(e)}")
@self.bot.event
async def on_command_error(ctx, error):
logger.error(f"命令错误: {error}")
await ctx.send(f"执行命令时出错: {str(error)}")
async def start_typing(self, channel):
"""持续显示正在输入状态"""
try:
while True:
async with channel.typing():
await asyncio.sleep(5)
except asyncio.CancelledError:
pass
def setup_commands(self):
"""保留slash commands作为备用"""
pass
async def send_long_message(self, message, response: str):
"""分段发送长回复到消息"""
max_length = 2000
if len(response) <= max_length:
await message.reply(response)
return
# 分段处理
parts = []
current_part = ""
for line in response.split('\n'):
if len(current_part) + len(line) + 1 > max_length:
if current_part:
parts.append(current_part)
current_part = line
else:
if current_part:
current_part += '\n' + line
else:
current_part = line
if current_part:
parts.append(current_part)
# 发送所有部分
if parts:
await message.reply(parts[0])
for part in parts[1:]:
await message.channel.send(part)
async def start(self):
"""启动bot"""
try:
token = self.token_reader.get_token('chatgpt_discord_token')
if not token:
raise ValueError("无法读取chatgpt_discord_token")
logger.info("启动ChatGPT Bot...")
await self.bot.start(token)
except Exception as e:
logger.error(f"启动Bot失败: {e}")
raise
async def main():
"""主函数"""
bot = ChatGPTBot("/home/will/docker/tokens.txt")
await bot.start()
if __name__ == "__main__":
asyncio.run(main())

View File

@@ -0,0 +1,4 @@
discord.py>=2.3.0
openai>=1.0.0
asyncio
pathlib

View File

@@ -0,0 +1,32 @@
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
# 安装系统依赖
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# 复制requirements文件
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY deepseek_bot.py .
# 创建utils目录会通过volume挂载
RUN mkdir -p utils
# 设置健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD python3 -c "import sys; sys.exit(0)"
# 运行应用
CMD ["python3", "deepseek_bot.py"]

View File

@@ -0,0 +1,253 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
DeepSeek Discord Bot
====================
这个bot使用DeepSeek的AI API来提供智能对话功能。
DeepSeek是一个优秀的中文AI模型特别擅长代码和推理任务。
主要功能:
- /deepseek - 与DeepSeek AI对话
- /code - 代码相关问题DeepSeek的强项
- /help - 显示帮助信息
"""
import discord
from discord.ext import commands
import httpx
import asyncio
import logging
import json
import sys
import os
from pathlib import Path
# 添加项目根目录到Python路径
sys.path.append(str(Path(__file__).parent.parent.parent))
from utils.token_reader import TokenReader
# 设置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class DeepSeekBot:
"""DeepSeek Discord Bot主类"""
def __init__(self, token_path: str):
self.token_path = token_path
self.token_reader = TokenReader(token_path)
# 设置Discord权限
intents = discord.Intents.default()
intents.message_content = True
intents.guild_messages = True
# 创建bot实例
self.bot = commands.Bot(
command_prefix='!',
intents=intents,
help_command=None
)
# DeepSeek API配置
self.api_key = None
self.base_url = "https://api.deepseek.com/v1/chat/completions"
self.model = "deepseek-chat"
self.setup_events()
self.setup_commands()
def setup_events(self):
"""设置事件处理器"""
@self.bot.event
async def on_ready():
logger.info(f'{self.bot.user} (DeepSeek Bot) 已连接到Discord!')
if self.bot.user:
logger.info(f'Bot ID: {self.bot.user.id}')
# 初始化API密钥
try:
self.api_key = self.token_reader.get_token('deepseek_API')
if not self.api_key:
raise ValueError("无法读取deepseek_API")
logger.info("DeepSeek API密钥加载成功")
# 同步slash commands
synced = await self.bot.tree.sync()
logger.info(f"同步了 {len(synced)} 个slash commands")
except Exception as e:
logger.error(f"初始化DeepSeek API失败: {e}")
@self.bot.event
async def on_command_error(ctx, error):
logger.error(f"命令错误: {error}")
if isinstance(error, commands.CommandNotFound):
await ctx.send("未知命令,请使用 /help 查看可用命令")
else:
await ctx.send(f"执行命令时出错: {str(error)}")
def setup_commands(self):
"""设置slash commands"""
@self.bot.tree.command(name="deepseek", description="与DeepSeek AI对话")
async def deepseek_command(interaction: discord.Interaction, message: str):
"""处理DeepSeek聊天命令"""
try:
await interaction.response.defer(thinking=True)
if not self.api_key:
await interaction.followup.send("❌ DeepSeek API未初始化")
return
# 调用DeepSeek API
response = await self.call_deepseek_api(message)
# 分段发送长回复
await self.send_long_response(interaction, f"🧠 **DeepSeek AI**\\n\\n{response}")
except Exception as e:
logger.error(f"DeepSeek命令错误: {e}")
await interaction.followup.send(f"❌ DeepSeek API调用失败: {str(e)}")
@self.bot.tree.command(name="code", description="向DeepSeek请教代码问题")
async def code_command(interaction: discord.Interaction, question: str):
"""处理代码相关问题"""
try:
await interaction.response.defer(thinking=True)
if not self.api_key:
await interaction.followup.send("❌ DeepSeek API未初始化")
return
# 为代码问题添加特殊提示
code_prompt = f"""你是一个专业的程序员和代码导师。请帮我解答以下代码相关的问题,提供清晰的解释和示例代码:
{question}
请用中文回答,并在适当的地方提供代码示例。"""
response = await self.call_deepseek_api(code_prompt)
# 分段发送长回复
await self.send_long_response(interaction, f"💻 **DeepSeek Code Expert**\\n\\n{response}")
except Exception as e:
logger.error(f"Code命令错误: {e}")
await interaction.followup.send(f"❌ DeepSeek Code API调用失败: {str(e)}")
@self.bot.tree.command(name="help", description="显示DeepSeek Bot帮助信息")
async def help_command(interaction: discord.Interaction):
"""显示帮助信息"""
help_text = """🧠 **DeepSeek Bot 帮助**
**主要命令:**
• `/deepseek <message>` - 与DeepSeek AI对话
• `/code <question>` - 向DeepSeek请教代码问题
• `/help` - 显示此帮助信息
**DeepSeek特色:**
• 🧠 强大的推理能力
• 💻 优秀的代码理解和生成
• 🔍 深度思考和分析
• 🇨🇳 优秀的中文理解
**使用示例:**
• `/deepseek 请解释一下量子计算的基本原理`
• `/code 如何在Python中实现单例模式`
• `/deepseek 帮我分析这个算法的时间复杂度`
**模型:** `deepseek-chat`
**状态:** ✅ 在线"""
await interaction.response.send_message(help_text)
async def call_deepseek_api(self, message: str) -> str:
"""调用DeepSeek API"""
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": self.model,
"messages": [
{
"role": "system",
"content": "你是DeepSeek AI一个有用、无害、诚实的人工智能助手。请用中文回答问题提供准确和有帮助的信息。"
},
{"role": "user", "content": message}
],
"max_tokens": 2000,
"temperature": 0.7,
"stream": False
}
async with httpx.AsyncClient() as client:
response = await client.post(
self.base_url,
headers=headers,
json=payload,
timeout=60.0
)
response.raise_for_status()
result = response.json()
return result["choices"][0]["message"]["content"]
async def send_long_response(self, interaction: discord.Interaction, response: str):
"""分段发送长响应"""
max_length = 2000
if len(response) <= max_length:
await interaction.followup.send(response)
return
# 分段处理
parts = []
current_part = ""
for line in response.split('\\n'):
if len(current_part) + len(line) + 1 > max_length:
if current_part:
parts.append(current_part)
current_part = line
else:
if current_part:
current_part += '\\n' + line
else:
current_part = line
if current_part:
parts.append(current_part)
# 发送所有部分
if parts:
await interaction.followup.send(parts[0])
for part in parts[1:]:
await interaction.followup.send(part)
async def start(self):
"""启动bot"""
try:
token = self.token_reader.get_token('deepseek_discord_token')
if not token:
raise ValueError("无法读取deepseek_discord_token")
logger.info("启动DeepSeek Bot...")
await self.bot.start(token)
except Exception as e:
logger.error(f"启动Bot失败: {e}")
raise
async def main():
"""主函数"""
bot = DeepSeekBot("/home/will/docker/tokens.txt")
await bot.start()
if __name__ == "__main__":
asyncio.run(main())

View File

@@ -0,0 +1,4 @@
discord.py>=2.3.0
httpx>=0.25.0
asyncio
pathlib

View File

@@ -0,0 +1,32 @@
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
# 安装系统依赖
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# 复制requirements文件
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY claude_bot.py .
# 创建utils目录会通过volume挂载
RUN mkdir -p utils
# 设置健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD python3 -c "import sys; sys.exit(0)"
# 运行应用
CMD ["python3", "claude_bot.py"]

View File

@@ -0,0 +1,316 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Claude Discord Bot
==================
这个bot使用Anthropic的Claude API来提供AI对话功能。
Claude以其安全性、有用性和诚实性而闻名。
主要功能:
- /claude - 与Claude AI对话
- /analyze - 深度分析问题Claude的强项
- /creative - 创意写作和头脑风暴
- /help - 显示帮助信息
"""
import discord
from discord.ext import commands
import asyncio
import logging
import sys
import os
from pathlib import Path
from anthropic import Anthropic
# 添加项目根目录到Python路径
sys.path.append(str(Path(__file__).parent.parent.parent))
from utils.token_reader import TokenReader
# 设置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class ClaudeBot:
"""Claude Discord Bot主类"""
def __init__(self, token_path: str):
self.token_path = token_path
self.token_reader = TokenReader(token_path)
# 设置Discord权限
intents = discord.Intents.default()
intents.message_content = True
intents.guild_messages = True
# 创建bot实例
self.bot = commands.Bot(
command_prefix='!',
intents=intents,
help_command=None
)
# 初始化Claude客户端
self.claude_client = None
self.current_model = "claude-3-sonnet-20240229"
# 可用模型列表
self.available_models = [
"claude-3-sonnet-20240229",
"claude-3-haiku-20240307",
"claude-3-opus-20240229"
]
self.setup_events()
self.setup_commands()
def setup_events(self):
"""设置事件处理器"""
@self.bot.event
async def on_ready():
logger.info(f'{self.bot.user} (Claude Bot) 已连接到Discord!')
if self.bot.user:
logger.info(f'Bot ID: {self.bot.user.id}')
# 初始化Claude客户端
try:
api_key = self.token_reader.get_token('claude_API')
if not api_key:
raise ValueError("无法读取claude_API")
self.claude_client = Anthropic(api_key=api_key)
logger.info("Claude客户端初始化成功")
# 同步slash commands
synced = await self.bot.tree.sync()
logger.info(f"同步了 {len(synced)} 个slash commands")
except Exception as e:
logger.error(f"初始化Claude客户端失败: {e}")
@self.bot.event
async def on_command_error(ctx, error):
logger.error(f"命令错误: {error}")
if isinstance(error, commands.CommandNotFound):
await ctx.send("未知命令,请使用 /help 查看可用命令")
else:
await ctx.send(f"执行命令时出错: {str(error)}")
def setup_commands(self):
"""设置slash commands"""
@self.bot.tree.command(name="claude", description="与Claude AI对话")
async def claude_command(interaction: discord.Interaction, message: str):
"""处理Claude聊天命令"""
try:
await interaction.response.defer(thinking=True)
if not self.claude_client:
await interaction.followup.send("❌ Claude客户端未初始化")
return
# 调用Claude API
response = await asyncio.to_thread(
self.claude_client.messages.create,
model=self.current_model,
max_tokens=2000,
messages=[
{"role": "user", "content": message}
]
)
ai_response = response.content[0].text
# 分段发送长回复
await self.send_long_response(interaction, f"🎭 **Claude ({self.current_model})**\\n\\n{ai_response}")
except Exception as e:
logger.error(f"Claude命令错误: {e}")
await interaction.followup.send(f"❌ Claude API调用失败: {str(e)}")
@self.bot.tree.command(name="analyze", description="使用Claude进行深度分析")
async def analyze_command(interaction: discord.Interaction, topic: str):
"""处理分析命令"""
try:
await interaction.response.defer(thinking=True)
if not self.claude_client:
await interaction.followup.send("❌ Claude客户端未初始化")
return
# 分析提示词
analysis_prompt = f"""请对以下主题进行深度分析:
{topic}
请从多个角度进行分析,包括但不限于:
1. 背景和现状
2. 关键要素和影响因素
3. 潜在的机会和挑战
4. 可能的解决方案或建议
5. 未来的发展趋势
请提供详细、有条理的分析。"""
response = await asyncio.to_thread(
self.claude_client.messages.create,
model=self.current_model,
max_tokens=3000,
messages=[
{"role": "user", "content": analysis_prompt}
]
)
ai_response = response.content[0].text
# 分段发送长回复
await self.send_long_response(interaction, f"🔍 **Claude 深度分析**\\n\\n{ai_response}")
except Exception as e:
logger.error(f"分析命令错误: {e}")
await interaction.followup.send(f"❌ Claude 分析失败: {str(e)}")
@self.bot.tree.command(name="creative", description="使用Claude进行创意写作")
async def creative_command(interaction: discord.Interaction, prompt: str):
"""处理创意写作命令"""
try:
await interaction.response.defer(thinking=True)
if not self.claude_client:
await interaction.followup.send("❌ Claude客户端未初始化")
return
# 创意写作提示词
creative_prompt = f"""作为一个富有创意的作家,请根据以下提示进行创意写作:
{prompt}
请发挥你的想象力,创作出有趣、引人入胜的内容。可以是故事、诗歌、对话、或任何其他创意形式。注重创意性、情感表达和文学性。"""
response = await asyncio.to_thread(
self.claude_client.messages.create,
model=self.current_model,
max_tokens=2500,
messages=[
{"role": "user", "content": creative_prompt}
]
)
ai_response = response.content[0].text
# 分段发送长回复
await self.send_long_response(interaction, f"✨ **Claude 创意工坊**\\n\\n{ai_response}")
except Exception as e:
logger.error(f"创意命令错误: {e}")
await interaction.followup.send(f"❌ Claude 创意写作失败: {str(e)}")
@self.bot.tree.command(name="model", description="切换Claude模型")
async def model_command(interaction: discord.Interaction, model: str):
"""切换模型命令"""
try:
if model not in self.available_models:
model_list = "\\n".join([f"{m}" for m in self.available_models])
await interaction.response.send_message(
f"❌ 不支持的模型。可用模型:\\n{model_list}"
)
return
old_model = self.current_model
self.current_model = model
await interaction.response.send_message(
f"✅ 模型已从 `{old_model}` 切换到 `{model}`"
)
except Exception as e:
logger.error(f"模型切换错误: {e}")
await interaction.response.send_message(f"❌ 切换模型失败: {str(e)}")
@self.bot.tree.command(name="help", description="显示Claude Bot帮助信息")
async def help_command(interaction: discord.Interaction):
"""显示帮助信息"""
help_text = """🎭 **Claude Bot 帮助**
**主要命令:**
• `/claude <message>` - 与Claude AI对话
• `/analyze <topic>` - 深度分析主题
• `/creative <prompt>` - 创意写作
• `/model <model_name>` - 切换Claude模型
• `/help` - 显示此帮助信息
**可用模型:**
• `claude-3-sonnet-20240229` (默认,平衡性能)
• `claude-3-haiku-20240307` (快速响应)
• `claude-3-opus-20240229` (最强推理)
**Claude特色:**
• 🎭 安全、有用、诚实
• 🔍 强大的分析能力
• ✨ 出色的创意写作
• 🧠 逻辑推理和问题解决
**使用示例:**
• `/claude 你好,请介绍一下你自己`
• `/analyze 人工智能的发展趋势`
• `/creative 写一个关于时间旅行的短故事`
**当前模型:** `{}`
**状态:** ✅ 在线""".format(self.current_model)
await interaction.response.send_message(help_text)
async def send_long_response(self, interaction: discord.Interaction, response: str):
"""分段发送长响应"""
max_length = 2000
if len(response) <= max_length:
await interaction.followup.send(response)
return
# 分段处理
parts = []
current_part = ""
for line in response.split('\\n'):
if len(current_part) + len(line) + 1 > max_length:
if current_part:
parts.append(current_part)
current_part = line
else:
if current_part:
current_part += '\\n' + line
else:
current_part = line
if current_part:
parts.append(current_part)
# 发送所有部分
if parts:
await interaction.followup.send(parts[0])
for part in parts[1:]:
await interaction.followup.send(part)
async def start(self):
"""启动bot"""
try:
token = self.token_reader.get_token('claude_discord_token')
if not token:
raise ValueError("无法读取claude_discord_token")
logger.info("启动Claude Bot...")
await self.bot.start(token)
except Exception as e:
logger.error(f"启动Bot失败: {e}")
raise
async def main():
"""主函数"""
bot = ClaudeBot("/home/will/docker/tokens.txt")
await bot.start()
if __name__ == "__main__":
asyncio.run(main())

View File

@@ -0,0 +1,4 @@
discord.py>=2.3.0
anthropic>=0.28.0
asyncio
pathlib

View File

@@ -0,0 +1,76 @@
version: '3.8'
services:
# ChatGPT Bot - OpenAI AI对话机器人
chatgpt-bot:
build:
context: ./ai_bot_1
dockerfile: Dockerfile
container_name: chatgpt-discord-bot
restart: unless-stopped
volumes:
- ../../tokens.txt:/home/will/docker/tokens.txt:ro
- ../utils:/app/utils:ro
environment:
- PYTHONUNBUFFERED=1
networks:
- ai-bots-network
depends_on:
- deepseek-bot
healthcheck:
test: ["CMD", "python3", "-c", "import sys; sys.exit(0)"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
# DeepSeek Bot - DeepSeek AI对话机器人
deepseek-bot:
build:
context: ./ai_bot_2
dockerfile: Dockerfile
container_name: deepseek-discord-bot
restart: unless-stopped
volumes:
- ../../tokens.txt:/home/will/docker/tokens.txt:ro
- ../utils:/app/utils:ro
environment:
- PYTHONUNBUFFERED=1
networks:
- ai-bots-network
healthcheck:
test: ["CMD", "python3", "-c", "import sys; sys.exit(0)"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
# Claude Bot - Claude AI对话机器人
claude-bot:
build:
context: ./ai_bot_3
dockerfile: Dockerfile
container_name: claude-discord-bot
restart: unless-stopped
volumes:
- ../../tokens.txt:/home/will/docker/tokens.txt:ro
- ../utils:/app/utils:ro
environment:
- PYTHONUNBUFFERED=1
networks:
- ai-bots-network
depends_on:
- deepseek-bot
healthcheck:
test: ["CMD", "python3", "-c", "import sys; sys.exit(0)"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
ai-bots-network:
driver: bridge
volumes:
ai_bots_logs:

View File

@@ -0,0 +1,65 @@
#!/usr/bin/env python3
"""
测试AI Bots状态
"""
import asyncio
import discord
import sys
import os
from pathlib import Path
# 添加项目根目录到Python路径
sys.path.append(str(Path(__file__).parent.parent))
from utils.token_reader import TokenReader
async def test_bot_connection(token, bot_name):
"""测试bot连接状态"""
try:
intents = discord.Intents.default()
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"{bot_name} 连接成功!")
print(f" Bot名称: {client.user}")
print(f" Bot ID: {client.user.id}")
print(f"{len(client.guilds)} 个服务器中")
for guild in client.guilds:
print(f" - {guild.name} (ID: {guild.id})")
await client.close()
await client.start(token)
except Exception as e:
print(f"{bot_name} 连接失败: {e}")
async def main():
"""主函数"""
token_reader = TokenReader("/home/will/docker/tokens.txt")
print("🤖 测试AI Bots连接状态...")
print("=" * 50)
# 测试ChatGPT Bot
chatgpt_token = token_reader.get_token('chatgpt_discord_token')
if chatgpt_token:
await test_bot_connection(chatgpt_token, "ChatGPT Bot")
print()
# 测试DeepSeek Bot
deepseek_token = token_reader.get_token('deepseek_discord_token')
if deepseek_token:
await test_bot_connection(deepseek_token, "DeepSeek Bot")
print()
# 测试Claude Bot
claude_token = token_reader.get_token('claude_discord_token')
if claude_token:
await test_bot_connection(claude_token, "Claude Bot")
if __name__ == "__main__":
asyncio.run(main())