Почему появляется ошибка если отправлять боту эмодзи?

Написал бота, работает правильно, но при вводе смайлика в консоли появляется вот такая ошибка

> No error handlers are registered, logging exception.
 Traceback (most recent call last):
  File "C:\Users\os\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\ext\dispatcher.py", line 555, in process_update
    handler.handle_update(update, self, check, context)
  File "C:\Users\os\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\ext\handler.py", line 198, in handle_update
    return self.callback(update, context)
  File "C:\Users\os\tb\bot.py", line 16, in on_message
    text2 = text[ :: -1 ]
TypeError: 'NoneType' object is not subscriptable

Ниже программа бота

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

ii = 1

def on_start( update, context ):
  global ii
  ii = 1
  chat = update.effective_chat
  context.bot.send_message( chat_id = chat.id, text = \
    "Привет, Андрей, как у тебя дела, мой любимый ребёнок ? :)" )

def on_message( update, context ):
  global ii
  chat = update.effective_chat
  text = update.message.text
  text2 = text[ :: -1 ]
  if ii == 1 :
    ii = 2
    context.bot.send_message( chat_id=chat.id, text = \
      "Ты моя буся сладкая. Поиграем в зеркало, ты мне что-то напиши, а я это переверну" )
  else :
    context.bot.send_message( chat_id=chat.id, text = text2 )

print( "Бот запущен. Нажмите Ctrl+C для завершения" )
token = ''
updater = Updater( token, use_context = True )
dispatcher = updater.dispatcher
dispatcher.add_handler( CommandHandler( "start", on_start ) )
dispatcher.add_handler( MessageHandler( Filters.all, on_message ) )
updater.start_polling()
updater.idle()


Ответы (1 шт):

Автор решения: alex

Я понял в чём была проблема. Проблема в том, что телеграм не всегда возвращает для бота текст. Например, если ввести какой-то анимированный смайлик, которых очень много в телеграмме, то в качесте текста возвращается отсутствие значения или None. Значит просто добавляем проверку на значение None ( или так text == None )

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

ii = 1

def on_start( update, context ):
  global ii
  ii = 1
  chat = update.effective_chat
  context.bot.send_message( chat_id = chat.id, text = \
    "Привет, Андрей, как у тебя дела, мой любимый ребёнок ? :)" )

def on_message( update, context ):
  global ii
  chat = update.effective_chat
  text = update.message.text

  if text == None :  # Я сам себе предлагаю вот такое решение
    text = ':)'        # Проверяем на отсутствие значения
                     # ( в случае ввода эмодзи или гифки )

  text2 = text[ :: -1 ]
  if ii == 1 :
    ii = 2
    context.bot.send_message( chat_id=chat.id, text = \
      "Ты моя буся сладкая. Поиграем в зеркало, ты мне что-то напиши, а я это переверну" )
  else :
    context.bot.send_message( chat_id=chat.id, text = text2 )

print( "Бот запущен. Нажмите Ctrl+C для завершения" )
token = ''
updater = Updater( token, use_context = True )
dispatcher = updater.dispatcher
dispatcher.add_handler( CommandHandler( "start", on_start ) )
dispatcher.add_handler( MessageHandler( Filters.all, on_message ) )
updater.start_polling()
updater.idle()
→ Ссылка