Telegram管理员bot与用户bot之间的聊天代码无法工作

0 投票
1 回答
40 浏览
提问于 2025-04-12 21:50

我开发了一个Telegram机器人“迷你应用”,用户可以通过它访问一个网站,并输入文字来说明他们的问题,从而打开一个“工单”。接着,机器人会发送一条消息“管理员很快会到达”给用户,同时通过一个Webhook向Discord发送消息,通知管理员有新的工单被创建,并包含一个格式为/admin_start <user_id>的命令。这部分代码在一个名为“Ticket.py”的文件中。

在第二个文件“TelegramChat.py”中,代码实现了用户和管理员之间的消息系统,使用了两个不同的Telegram机器人。这个代码主要支持三个功能:

#!/usr/bin/env python
# pylint: disable=unused-argument

from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes

# Configuration of bot tokens
USER_BOT_TOKEN = ""
ADMIN_BOT_TOKEN = ""

# Dictionary to track conversations: key = user ID, value = admin ID
conversations = {}

# Initialize applications for user and admin bots
user_bot_app = Application.builder().token(USER_BOT_TOKEN).build()
admin_bot_app = Application.builder().token(ADMIN_BOT_TOKEN).build()

async def admin_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Admin initiates a conversation with a user."""
    if context.args:
        user_id = context.args[0]  # Assuming the command is "/admin_start <user_id>"
        admin_id = update.effective_user.id
        conversations[user_id] = str(admin_id)
        await context.bot.send_message(chat_id=admin_id, text=f"Connected with user {user_id}.")
        await context.bot.send_message(chat_id=user_id, text="An admin has joined the chat.")
    else:
        await update.message.reply_text("Please provide the user ID. Format: /admin_start <user_id>.")

async def handle_user_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Forward messages from users to their linked admin."""
    user_id = str(update.effective_user.id)
    if user_id in conversations:
        admin_id = conversations[user_id]
        await context.bot.send_message(chat_id=admin_id, text=f"Message from user {user_id}: {update.message.text}")
    else:
        await update.message.reply_text("Please wait, connecting you to an admin...")

async def handle_admin_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Forward messages from the admin to the linked user."""
    admin_id = str(update.effective_user.id)
    user_ids = [user_id for user_id, admin in conversations.items() if admin == admin_id]
    if user_ids:
        for user_id in user_ids:
            await context.bot.send_message(chat_id=user_id, text=f"Message from admin: {update.message.text}")

# Add handlers to the user bot
user_bot_app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_user_message))

# Add handlers to the admin bot
admin_bot_app.add_handler(CommandHandler("start", admin_start))
admin_bot_app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_admin_message))

if __name__ == "__main__":
    # Run the bots in polling mode
    user_bot_app.run_polling()
    admin_bot_app.run_polling()
  1. 对于管理员:命令/admin_start <user_id>允许管理员与用户开始对话。管理员的ID会被记录在conversations字典中,用户的ID作为键。

  2. 用户的消息:当用户发送消息时,如果已经和管理员建立了对话(在conversations字典中验证),消息会转发给该管理员。

  3. 管理员的消息:当管理员发送消息时,这条消息会转发给所有与该管理员在conversations字典中关联的用户。

然而,命令/admin_start <user_id>并没有正常工作,无法启动用户和管理员之间的对话。我原本期待,当管理员使用命令“/admin_start <user_id>”时,会建立一个连接,让管理员和用户通过Telegram机器人交换消息。但是,管理员那边、用户那边,甚至日志中都没有任何反应。

有没有人能帮忙诊断一下,为什么/admin_start <user_id>命令没有按预期启动对话?

另外,为了测试代码,我创建了一个名为“CombinedBot.py”的文件,将Ticket.py和TelegramChat.py合并在一起。我之前遇到过'telegram.error.Conflict'类型的问题,但现在不再出现了。“Ticket.py”部分工作正常,但聊天部分却不行。

1 个回答

暂无回答

撰写回答