Вопрос или проблема
Что не так с моим кодом?
Версия Python 3.10.8
Вот полный код.
import logging
import asyncio
from telegram import Update, ParseMode
from telegram.constants import ParseMode
from telegram.ext import Application, CommandHandler, MessageHandler, ConversationHandler, CallbackQueryHandler, CallbackContext
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram import ReplyKeyboardMarkup
from telegram import KeyboardButton
from telegram.ext import filters
# Вставьте сюда токен API вашего бота
TOKEN = "ВАШ_ТОКЕН_БОТА"
# ID группы тех поддержки (обратите внимание на "-100" в начале)
GROUP_ID = -100111111
# Настройка логгера
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
)
logger = logging.getLogger(__name__)
# Состояния для ConversationHandler
CHOOSING, DEPOSIT_PROBLEM, WITHDRAWAL_PROBLEM = range(3)
# Текст сообщений
START_MESSAGE = "👋 Привет! Вы попали в бота тех поддержки Crypto. 🤝"
START_MESSAGE_IMAGE = "https://www.example.com/image.jpg"
WELCOME_MESSAGE = "Чем мы можем вам помочь?"
DEPOSIT_PROBLEM_MESSAGE = "Опишите Вашу проблему с депозитом, мы постараемся быстрее дать вам ответ."
WITHDRAWAL_PROBLEM_MESSAGE = "Опишите Вашу проблему с выводом, мы постараемся быстрее дать вам ответ."
CONTACT_MANAGER_MESSAGE = "Спасибо за обращение, вам ответят в течение 3 минут."
MANAGER_IN_CHAT_MESSAGE = "Менеджер в чате."
REPLY_TO_MESSAGE = "Ответить на сообщение"
# Кнопки
DEPOSIT_BUTTON = "Проблемы с депозитом"
WITHDRAWAL_BUTTON = "Проблемы с выводом"
CONTACT_MANAGER_BUTTON = "Связаться с менеджером"
# Клавиатура для начала диалога
start_keyboard = [
[InlineKeyboardButton(DEPOSIT_BUTTON, callback_data=DEPOSIT_BUTTON)],
[InlineKeyboardButton(WITHDRAWAL_BUTTON, callback_data=WITHDRAWAL_BUTTON)],
[InlineKeyboardButton(CONTACT_MANAGER_BUTTON, callback_data=CONTACT_MANAGER_BUTTON)]
]
# Клавиатура для описания проблемы
problem_keyboard = [
[InlineKeyboardButton(CONTACT_MANAGER_BUTTON, callback_data=CONTACT_MANAGER_BUTTON)]
]
# Функция для отправки сообщения в группу
async def send_to_group(update: Update, context: CallbackContext):
user_id = update.effective_user.id
user_name = update.effective_user.first_name
message_text = update.effective_message.text
reply_markup = InlineKeyboardMarkup(
[[InlineKeyboardButton(REPLY_TO_MESSAGE, callback_data=f"reply_{user_id}")]]
)
await context.bot.send_message(chat_id=GROUP_ID, text=f"Сообщение от {user_name} (ID: {user_id})\n\n{message_text}", reply_markup=reply_markup)
# Функция для начала диалога
async def start(update: Update, context: CallbackContext) -> int:
await context.bot.send_photo(
chat_id=update.effective_chat.id,
photo=START_MESSAGE_IMAGE,
caption=START_MESSAGE,
parse_mode=ParseMode.MARKDOWN
)
await context.bot.send_message(chat_id=update.effective_chat.id, text=WELCOME_MESSAGE, reply_markup=InlineKeyboardMarkup(start_keyboard))
return CHOOSING
# Функция для обработки кнопок
async def handle_button_press(update: Update, context: CallbackContext) -> int:
query = update.callback_query
await query.answer()
if query.data == DEPOSIT_BUTTON:
await query.edit_message_text(text=DEPOSIT_PROBLEM_MESSAGE, reply_markup=InlineKeyboardMarkup(problem_keyboard))
return DEPOSIT_PROBLEM
elif query.data == WITHDRAWAL_BUTTON:
await query.edit_message_text(text=WITHDRAWAL_PROBLEM_MESSAGE, reply_markup=InlineKeyboardMarkup(problem_keyboard))
return WITHDRAWAL_PROBLEM
elif query.data == CONTACT_MANAGER_BUTTON:
await query.edit_message_text(text=CONTACT_MANAGER_MESSAGE)
await send_to_group(update, context)
await context.bot.send_message(chat_id=update.effective_chat.id, text=MANAGER_IN_CHAT_MESSAGE)
return ConversationHandler.END
elif query.data.startswith("reply_"):
user_id = int(query.data.split("_")[1])
await query.edit_message_text(text=f"Менеджер в чате. Вы можете начать переписку с пользователем {user_id}")
return ConversationHandler.END
# Функция для обработки сообщений с описанием проблемы
async def handle_problem_description(update: Update, context: CallbackContext) -> int:
user_id = update.effective_user.id
user_name = update.effective_user.first_name
message_text = update.effective_message.text
await send_to_group(update, context)
await context.bot.send_message(chat_id=update.effective_chat.id, text=f"Спасибо, {user_name}! Мы передали ваш вопрос менеджерам.")
return ConversationHandler.END
# Основная функция
async def main() -> None:
"""Запуск бота."""
application = Application.builder().token(TOKEN).build()
application.add_handler(CommandHandler("start", start))
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
CHOOSING: [CallbackQueryHandler(handle_button_press)],
DEPOSIT_PROBLEM: [MessageHandler(filters.Text & ~filters.Command, handle_problem_description)],
WITHDRAWAL_PROBLEM: [MessageHandler(filters.Text & ~filters.Command, handle_problem_description)],
},
fallbacks=[CommandHandler('start', start)]
)
application.add_handler(conv_handler)
await application.run_polling()
if __name__ == '__main__':
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
)
asyncio.run(main())
from telegram import Update
from telegram.constants import ParseMode
Ничего не работает.
Ответ или решение
Ваша проблема может быть связана с несколькими аспектами в коде вашего Telegram-бота. Давайте рассмотрим несколько возможных причин, по которым код может не работать, и предложим их исправления.
1. Ошибка в синтаксисе
В вашем коде используются неверные символы для обозначения типа функции в аннотациях. Вместо -> int:
и -> None:
вы видите -> int:
и -> None:
. Это может быть результатом неправильного копирования кода. Убедитесь, что ваш код выглядит следующим образом:
async def start(update: Update, context: CallbackContext) -> int:
2. Неправильное использование фильтров
При использовании фильтров в MessageHandler
необходимо использовать операцию |
(логическое «или»), чтобы объединить условия в фильтре. Но вы везде используете &
, что считается логическим «и». Это может предотвратить срабатывание обработчика при получении сообщений. Исправьте это следующим образом:
DEPOSIT_PROBLEM: [MessageHandler(filters.Text & ~filters.Command, handle_problem_description)],
WITHDRAWAL_PROBLEM: [MessageHandler(filters.Text & ~filters.Command, handle_problem_description)],
на:
DEPOSIT_PROBLEM: [MessageHandler(filters.Text() & ~filters.Command(), handle_problem_description)],
WITHDRAWAL_PROBLEM: [MessageHandler(filters.Text() & ~filters.Command(), handle_problem_description)],
3. Отсутствие правильного токена и ID группы
Убедитесь, что вы правильно вставили ваш API токен вместо YOUR_BOT_TOKEN
, а также проверьте, корректен ли GROUP_ID
, который должен начинаться с -100
для групповых чатов.
4. Проверка установки библиотек
Убедитесь, что вы установили необходимые библиотеки, такие как python-telegram-bot
, и что вы используете совместимую с вашим кодом версию. Для этого выполните команду:
pip install python-telegram-bot==20.0
5. Логирование ошибок
Добавьте обработчик ошибок, чтобы отслеживать любые возникающие ошибки. Вы можете это сделать, добавив следующий код в основную функцию:
async def main() -> None:
application = Application.builder().token(TOKEN).build()
application.add_handler(CommandHandler("start", start))
...
application.add_error_handler(error_handler)
Где error_handler
— это функция, которая будет обрабатывать любые ошибки:
async def error_handler(update: Update, context: CallbackContext):
logger.error(f"Update {update} caused error {context.error}")
6. Убедитесь, что у вас правильно настроено окружение
Убедитесь, что ваш Python исполняется в нужном окружении и у вас есть доступ к интернету. Если вы используете виртуальное окружение, убедитесь, что все зависимости установлены в нем.
Заключение
Попробуйте внести указанные изменения и проверить код на работоспособность. Если после всех этих действий проблема не будет решена, постарайтесь отладить код, выводя значения переменных в консоль или используя логгирование. Это поможет вам диагностировать и понять, в чем именно может быть возникшая проблема.