172 lines
6.1 KiB
Python
Executable File
172 lines
6.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""
|
||
客服机器人 - 简化版(无镜像功能)
|
||
只包含消息转发和管理员回复功能
|
||
"""
|
||
import asyncio
|
||
import logging
|
||
from datetime import datetime
|
||
from telegram import Update
|
||
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
|
||
|
||
# 配置
|
||
BOT_TOKEN = "8426529617:AAHAxzohSMFBAxInzbAVJsZfkB5bHnOyFC4"
|
||
ADMIN_ID = 7363537082
|
||
ADMIN_USERNAME = "xiaobai_80"
|
||
|
||
# 日志配置
|
||
logging.basicConfig(
|
||
format="%(asctime)s | %(levelname)-8s | %(message)s",
|
||
level=logging.INFO,
|
||
datefmt="%Y-%m-%d %H:%M:%S"
|
||
)
|
||
logger = logging.getLogger(__name__)
|
||
|
||
class CustomerServiceBot:
|
||
def __init__(self):
|
||
self.app = None
|
||
self.user_sessions = {} # 存储用户会话
|
||
|
||
async def handle_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""处理/start命令"""
|
||
user = update.effective_user
|
||
welcome_text = (
|
||
f"👋 您好 {user.first_name}!\n\n"
|
||
"我是您的智能客服助手\n\n"
|
||
"直接发送消息即可联系人工客服\n"
|
||
f"技术支持:@{ADMIN_USERNAME}\n\n"
|
||
"⚠️ 搜索功能暂时维护中..."
|
||
)
|
||
await update.message.reply_text(welcome_text)
|
||
|
||
# 通知管理员
|
||
if user.id != ADMIN_ID:
|
||
admin_msg = (
|
||
f"🆕 新用户访问:\n"
|
||
f"用户: {user.first_name} (@{user.username or '无'})\n"
|
||
f"ID: {user.id}"
|
||
)
|
||
try:
|
||
await context.bot.send_message(ADMIN_ID, admin_msg)
|
||
except:
|
||
pass
|
||
|
||
async def handle_message(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""处理用户消息"""
|
||
user = update.effective_user
|
||
|
||
# 如果是管理员回复用户
|
||
if user.id == ADMIN_ID:
|
||
# 检查是否是回复命令
|
||
text = update.message.text
|
||
if text.startswith("/reply "):
|
||
await self.handle_reply_command(update, context)
|
||
return
|
||
elif text == "/list":
|
||
await self.handle_list_command(update, context)
|
||
return
|
||
|
||
# 普通用户消息,转发给管理员
|
||
if user.id != ADMIN_ID:
|
||
await self.forward_to_admin(update, context)
|
||
|
||
async def forward_to_admin(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""转发消息给管理员"""
|
||
user = update.effective_user
|
||
msg = update.message.text
|
||
|
||
# 保存用户信息
|
||
self.user_sessions[user.id] = {
|
||
"username": user.username,
|
||
"first_name": user.first_name,
|
||
"last_name": user.last_name,
|
||
"last_message": datetime.now()
|
||
}
|
||
|
||
forward_msg = (
|
||
f"📨 用户消息\n"
|
||
f"━━━━━━━━━━━━━━━━\n"
|
||
f"👤 {user.first_name} {user.last_name or ''}\n"
|
||
f"🆔 ID: {user.id}\n"
|
||
f"👤 用户名: @{user.username or '无'}\n"
|
||
f"💬 内容:\n{msg}\n"
|
||
f"━━━━━━━━━━━━━━━━\n"
|
||
f"回复: /reply {user.id} 您的消息"
|
||
)
|
||
|
||
try:
|
||
await context.bot.send_message(ADMIN_ID, forward_msg)
|
||
await update.message.reply_text("✅ 消息已发送给客服,请稍候...")
|
||
logger.info(f"转发消息 - 用户 {user.id}: {msg[:50]}")
|
||
except Exception as e:
|
||
logger.error(f"转发失败: {e}")
|
||
await update.message.reply_text("❌ 发送失败,请稍后重试")
|
||
|
||
async def handle_reply_command(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""处理管理员回复"""
|
||
parts = update.message.text.split(maxsplit=2)
|
||
if len(parts) < 3:
|
||
await update.message.reply_text("格式: /reply 用户ID 消息")
|
||
return
|
||
|
||
try:
|
||
user_id = int(parts[1])
|
||
reply_msg = parts[2]
|
||
|
||
await context.bot.send_message(
|
||
user_id,
|
||
f"💬 客服回复:\n{reply_msg}"
|
||
)
|
||
await update.message.reply_text(f"✅ 已回复用户 {user_id}")
|
||
logger.info(f"回复用户 {user_id}: {reply_msg[:50]}")
|
||
except Exception as e:
|
||
await update.message.reply_text(f"❌ 发送失败: {e}")
|
||
|
||
async def handle_list_command(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""列出最近的用户"""
|
||
if not self.user_sessions:
|
||
await update.message.reply_text("暂无用户会话")
|
||
return
|
||
|
||
msg = "📋 最近的用户:\n\n"
|
||
for user_id, info in self.user_sessions.items():
|
||
msg += f"ID: {user_id}\n"
|
||
msg += f"姓名: {info['first_name']} {info.get('last_name', '')}\\n"
|
||
msg += f"用户名: @{info.get('username', '无')}\\n"
|
||
msg += f"最后消息: {info['last_message'].strftime('%Y-%m-%d %H:%M:%S')}\\n"
|
||
msg += "━━━━━━━━━━\n"
|
||
|
||
await update.message.reply_text(msg)
|
||
|
||
async def run(self):
|
||
"""运行机器人"""
|
||
try:
|
||
logger.info("启动客服机器人...")
|
||
|
||
self.app = Application.builder().token(BOT_TOKEN).build()
|
||
|
||
# 注册处理器
|
||
self.app.add_handler(CommandHandler("start", self.handle_start))
|
||
self.app.add_handler(CommandHandler("help", self.handle_start))
|
||
self.app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, self.handle_message))
|
||
|
||
logger.info("✅ 机器人已启动!")
|
||
logger.info(f"管理员: @{ADMIN_USERNAME} (ID: {ADMIN_ID})")
|
||
|
||
await self.app.initialize()
|
||
await self.app.start()
|
||
await self.app.updater.start_polling()
|
||
|
||
while True:
|
||
await asyncio.sleep(1)
|
||
|
||
except Exception as e:
|
||
logger.error(f"运行错误: {e}")
|
||
finally:
|
||
if self.app:
|
||
await self.app.stop()
|
||
|
||
if __name__ == "__main__":
|
||
bot = CustomerServiceBot()
|
||
asyncio.run(bot.run())
|