New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
Closed
pypybeg opened this issue
Jan 12, 2018
· 25 comments
Comments
Вот такая ошибка:
Traceback (most recent call last):
File «C:/Users/User/PycharmProjects/trial3bot/tg.py», line 4, in
@bot.message_handler(content_types=[‘text’])
AttributeError: ‘TeleBot’ object has no attribute ‘message_handler’
Удалил библиотеку telebot и обновил pytelegrambotapi
Буду рад вашей помощи,пользуюсь питоном третий день.
MasterGroosha
changed the title
‘TeleBot’ object has no attribute ‘message_handler’ (Python) Самый новичок из новичков
‘TeleBot’ object has no attribute ‘message_handler’
Jan 12, 2018
- Убедитесь, что все последующие действия совершаются именно для той версии Python, которой запускается бот.
- Если Python 3-й версии, то выполните
pip3 uninstall telebot
, затемpip3 install pytelegrambotapi --upgrade
. - Желательно перелогиниться или перезагрузиться.
сделал как вы сказали,в первом случае ничего не удалило,так как ничего не обнаружило,а то еще раз обновилось.
но все равно та же ошибка
File -> Settings -> Project Interpreter
У pyTelegramBotAPI какая версия указана в среднем столбце?
В таком случае, я уже не знаю, чем Вам помочь.
Судя по этому комментарию, telebot
Вы не сразу удалили (хотя в первом сообщении писали обратное). Видимо, и здесь тоже что-то не то.
Если и после перезагрузки останутся хвосты telebot, попробуйте удалить дополнительно pyTelegramBotAPI и сразу же установить заново (всё там же в PyCharm).
Если и это не поможет — Вам на StackOverflow.
Ураа!))
Получилось,спасибо вам большое!)
вот поэтому не нужно пользоваться pycharm.vim + терминал
- Убедитесь, что все последующие действия совершаются именно для той версии Python, которой запускается бот.
- Если Python 3-й версии, то выполните
pip3 uninstall telebot
, затемpip3 install pytelegrambotapi --upgrade
.- Желательно перелогиниться или перезагрузиться.
Спасибо, помогло)
что делать, помогите плз(
Wedyarit, meth1337, and h2sm reacted with laugh emoji
@jenjajenjaBot попробуйте вместо массажа использовать сообщение
в смысле?
вместо сообщения использывать сообщение?
2. pip3 uninstall telebot
я застрял на телеграмм боте ошибка пуля в пулю как у человека который создал эту тему
а еще я использую мак
Repository owner
locked as off-topic and limited conversation to collaborators
Nov 28, 2021
Реализация собственного обработчика ошибок для Telegram бота.
Внимание! Пакеты
python-telegram-bot
версии 13.x будут придерживаться многопоточной парадигмы программирования (на данный момент актуальна версия 13.14). Пакеты версий 20.x и новее будут полностью асинхронными и на октябрь 2022 года, первый из них находится в предрелизе. Дополнительно смотрите основные изменения в пакетеpython-telegram-bot
версии 20.x.
В python-telegram-bot
все ошибки, связанные с Telegram, инкапсулируются в класс исключения TelegramError
и его подклассы, расположенные в модуле telegram.error
.
Любая ошибка, включая TelegramError
, которая возникает в одном из обработчиков сообщений или при вызове Updater.get_updates()
, перенаправляется всем зарегистрированным обработчикам ошибок, чтобы можно было на них отреагировать.
Что бы зарегистрировать обработчик ошибок, необходимо вызвать Dispatcher.add_error_handler(callback)
, где обратный вызов callback
— это функция, которая принимает обновление update
и контекст context
. Объект update
будет обновлением, вызвавшим ошибку (или None
, если ошибка не была вызвана update
, например, для Jobs
), а context.error
— возникшей ошибкой.
: пытаемся отправить сообщение, но пользователь заблокировал бота. Будет вызвано исключение Unauthorized
, подкласса TelegramError
, которое будет доставлено обработчику ошибок. В обработчике ошибок можно удалить этот контакт из списка контактов бота.
. Можно обрабатывать исключения по мере их возникновения. Обработчику ошибок python-telegram-bot
перенаправляются только неперехваченные исключения.
Пример собственного обработчика ошибок.
Очень простой пример того, как можно реализовать собственный обработчик ошибок.
import html import json import logging import traceback from telegram import Update, ParseMode from telegram.ext import Updater, CommandHandler logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) # Токен, который получен от @botfather при создании бота BOT_TOKEN = "TOKEN" # Это может быть ваш собственный идентификатор # или идентификатор группы/канала. # Можно использовать команду `/start` этого бота, # чтобы увидеть свой идентификатор чата. CHAT_ID = 123456789 # Функция-обработчик ошибок def error_handler(update, context): """ Регистрирует ошибку и уведомляет разработчика сообщением telegram. """ # Пишем ошибку, прежде чем что-то делать. Вдруг что-то сломается. logger.error(msg="Исключение при обработке сообщения:", exc_info=context.error) # `traceback.format_exception` возвращает обычное сообщение python # об исключении в виде списка строк, поэтому объединяем их вместе. tb_list = traceback.format_exception(None, context.error, context.error.__traceback__) tb_string = ''.join(tb_list) # Создаем сообщение с некоторой разметкой и дополнительной # информацией о том, что произошло. Возможно, придется добавить некоторую # логику для работы с сообщениями длиной более 4096 символов. update_str = update.to_dict() if isinstance(update, Update) else str(update) message = ( f'Возникло исключение при обработке сообщения.n' f'<pre>update = {html.escape(json.dumps(update_str, indent=2, ensure_ascii=False))}' '</pre>nn' f'<pre>context.chat_data = {html.escape(str(context.chat_data))}</pre>nn' f'<pre>context.user_data = {html.escape(str(context.user_data))}</pre>nn' f'<pre>{html.escape(tb_string)}</pre>' ) # Отправляем сообщение разработчику context.bot.send_message(chat_id=CHAT_ID, text=message, parse_mode=ParseMode.HTML) # объект `update` в функции не используется, заменяем его на `_` def bad_command(_, context): """Вызывает ошибку, чтобы вызвать обработчик ошибок.""" context.bot.wrong_method_name() # объект `context` в функции не используется, заменяем его на `_` def start(update, _): update.effective_message.reply_html( 'Принудительный вызов ошибки `/bad_command`n' f'Ваш идентификатор чата <code>{update.effective_chat.id}</code>.' ) if __name__ == '__main__': updater = Updater(BOT_TOKEN) dispatcher = updater.dispatcher # Зарегистрируем команды... dispatcher.add_handler(CommandHandler('start', start)) dispatcher.add_handler(CommandHandler('bad_command', bad_command)) # ...и обработчик ошибок dispatcher.add_error_handler(error_handler) # Запускаем бота updater.start_polling() updater.idle()
Хороший обработчик ошибок.
Следующий фрагмент кода уведомляет пользователя, когда происходит ошибка, и уведомляет разработчиков об ошибке, включая трассировку и место ее возникновения. Комментарии в коде объясняют, что именно происходит, когда и почему, поэтому редактировать его в соответствии с особыми потребностями должно быть проще простого.
from telegram import ParseMode from telegram.utils.helpers import mention_html import sys import traceback # это общая функция обработчика ошибок. # Если нужна дополнительная информация о конкретном типе сообщения, # добавьте ее в полезную нагрузку в соответствующем предложении `if ...` def error(update, context): # добавьте все идентификаторы разработчиков в этот список. # Можно добавить идентификаторы каналов или групп. devs = [208589966] # Уведомление пользователя об этой проблеме. # Уведомления будут работать, только если сообщение НЕ является # обратным вызовом, встроенным запросом или обновлением опроса. # В случае, если это необходимо, то имейте в виду, что отправка # сообщения может потерпеть неудачу if update.effective_message: text = "К сожалению произошла ошибка в момент обработки сообщения. " "Мы уже работаем над этой проблемой." update.effective_message.reply_text(text) # Трассировка создается из `sys.exc_info`, которая возвращается в # как третье значение возвращаемого кортежа. Затем используется # `traceback.format_tb`, для получения `traceback` в виде строки. trace = "".join(traceback.format_tb(sys.exc_info()[2])) # попробуем получить как можно больше информации из обновления telegram payload = [] # обычно всегда есть пользователь. Если нет, то это # либо канал, либо обновление опроса. if update.effective_user: bad_user = mention_html(update.effective_user.id, update.effective_user.first_name) payload.append(f' с пользователем {bad_user}') # есть ситуаций, когда что то с чатом if update.effective_chat: payload.append(f' внутри чата <i>{update.effective_chat.title}</i>') if update.effective_chat.username: payload.append(f' (@{update.effective_chat.username})') # полезная нагрузка - опрос if update.poll: payload.append(f' с id опроса {update.poll.id}.') # Поместим это в 'хорошо' отформатированный текст text = f"Ошибка <code>{context.error}</code> случилась{''.join(payload)}. " f"Полная трассировка:nn<code>{trace}</code>" # и отправляем все разработчикам for dev_id in devs: context.bot.send_message(dev_id, text, parse_mode=ParseMode.HTML) # Необходимо снова вызывать ошибку, для того, чтобы модуль `logger` ее записал. # Если вы не используете этот модуль, то самое время задуматься. raise
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import telebot from telebot import types token = '' bot = telebot.TeleBot(token) @bot.message_handler(commands=['vaif']) def welcome(message): markup_reply = types.ReplyKeyboardMarkup() item_hi = types.KeyboardButton('Привет') item_bye = types.KeyboardButton('Пока') markup_reply.add(item_hi, item_bye) bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!nЯ - <b>{1.first_name}</b>, создан служить господину.".format(message.from_user, bot.get_me()), parse_mode = 'html', reply_markup = markup_reply) @bot.message_handler(content_types=['text']) def answer(message): if message.text == 'Привет': markup_reply = types.InlineKeyboardMarkup(row_width=2) item_pic = types.InlineKeyboardButton(text = 'картинка', callback_data = 'pic') item_audio = types.InlineKeyboardButton(text = 'песенка', callback_data = 'aud') markup_reply.add(item_pic, item_audio) bot.send_message(message.chat.id, 'Могу я для вас что-то сделать господин?', reply_markup=markup_reply) elif message.text == 'Пока': bot.send_message(message.chat.id, 'Хорошо господин') @bot.callback_query_handler(func=lambda call: True) def answer1(call): if call.data == 'pic': markup_reply = types.ReplyKeyboardMarkup(resize_keyboard=True) pic1 = types.KeyboardButton('Топ Вайфу') pic2 = types.KeyboardButton('Даня') pic3 = types.KeyboardButton('Люблю тебя') markup_reply.add(pic1, pic2, pic3) bot.send_message(call.message.chat.id, 'Выбирайте из этого господин:3', reply_markup=markup_reply) elif call.data == 'aud': markup_reply = types.ReplyKeyboardMarkup(resize_keyboard=True) mus1 = types.KeyboardButton('Для гулей') mus2 = types.KeyboardButton('Тёма лув') mus3 = types.KeyboardButton('Топ чартов') markup_reply.add(mus1, mus2, mus3) bot.send_message(call.message.chat.id, 'Выбирай из этого:3', reply_markup=markup_reply) @bot.message_handler(content_types=['text']) def get_text_messages1(message): if message.text == 'Для гулей': bot.send_message(message.from_user.id, 'https://open.spotify.com/track/1ghdJUMhmLEpUitNwyNMWH?si=675eb5a3e48a4bf9') elif message.text == 'Тёма лув': bot.send_message(message.from_user.id, 'https://open.spotify.com/track/6H167kbd8gY2Eewzf14YjD?si=91eeba1c6cb84fab') elif message.text == 'Топ Чартов': bot.send_message(message.from_user.id, 'https://open.spotify.com/track/6t1ODAVbCVRQas6OyaGXQP?si=310d99fcbba14620') elif message.text == 'Топ Вайфу': bot.send_message(message.from_user.id, 'http://pm1.narvii.com/6869/e39b5e83a446fea0446a062013de105540e07259r1-1152-650v2_uhq.jpg') elif message.text == 'Даня': bot.send_message(message.from_user.id, 'https://sun9-3.userapi.com/impg/zeZga0qpRDMkepm-GpdOJMc2rV0EtgRObACuww/s99uG5QfDM4.jpg?size=949x945&quality=96&sign=49fc693c5cfacadb6ed3a4ad5000e44c&type=album') elif message.text == 'Люблю тебя': bot.send_message(message.from_user.id, 'https://sun9-49.userapi.com/impg/oFPZAbfD2cde7LK0iSMpD1-ckCC7W-tzCqrQwg/0O4DSdMBwpc.jpg?size=1200x1600&quality=96&sign=a9c7b4dfb057f20bcda450f7037d63c7&type=album') else: bot.send_message(message.from_user.id, 'похоже вы нажали куда-то не туда :3') bot.polling(none_stop=True, interval=0) |
Back to top
Edit this page
Toggle table of contents sidebar
- class telegram.ext.MessageHandler(filters, callback, block=True)[source]¶
-
Bases:
telegram.ext.BaseHandler
BaseHandler class to handle Telegram messages. They might contain text, media or status
updates.- Parameters:
-
-
filters (
telegram.ext.filters.BaseFilter
) –A filter inheriting from
telegram.ext.filters.BaseFilter
. Standard filters can be found in
telegram.ext.filters
. Filters can be combined using bitwise
operators (& for and, | for or, ~ for not). PassingNone
is a shortcut
to passingtelegram.ext.filters.ALL
. -
callback (coroutine function) –
The callback function for this handler. Will be
called whencheck_update()
has determined that an update should be processed by
this handler. Callback signature:async def callback(update: Update, context: CallbackContext)
The return value of the callback is usually ignored except for the special case of
telegram.ext.ConversationHandler
. -
block (
bool
, optional) –Determines whether the return value of the callback should
be awaited before processing the next handler in
telegram.ext.Application.process_update()
. Defaults toTrue
.
-
- filters[source]¶
-
Only allow updates with these Filters.
Seetelegram.ext.filters
for a full list of all available filters.- Type:
-
telegram.ext.filters.BaseFilter
- callback[source]¶
-
The callback function for this handler.
- Type:
-
coroutine function
- block[source]¶
-
Determines whether the return value of the callback should be
awaited before processing the next handler in
telegram.ext.Application.process_update()
.- Type:
-
bool
- check_update(update)[source]¶
-
Determines whether an update should be passed to this handler’s
callback
.- Parameters:
-
update (
telegram.Update
|object
) – Incoming update. - Returns:
-
bool
- collect_additional_context(context, update, application, check_result)[source]¶
-
Adds possible output of data filters to the
CallbackContext
.