Categories: Python

Ошибки при разработке telegram бота на python

Хочу описать несколько ошибок, с которыми я столкнулся при разработке бота для телеграм. Они популярные, но все таки запишу для себя чтобы не забыть.

Это глобальные переменные, большие тексты и отсутствие try/except.

Не используйте глобальные переменные

Если ботом планируете пользоваться не только Вы, никогда не используйте глобальные переменные. Особенно, если в боте будет личная (персональная) информация. Пример: бот запрашивал имя, любое число и город. Данные сохранялись в переменные и потом выводились в конце пользователю для подтверждения.

В моем коде были глобальные переменные и пользователи могли видеть чужую информацию! Это происходило при одновременном обращении к боту. Для решения этой задачи нужно использовать классы или передавать переменные в функциях.

Я создавал новый массив и наполнял его на каждом шагу (использовал register_next_step_handler ). Первый ответ пользователя (имя) я передавал на второй шаг, дальше (число и имя с 1 шага) передавал на третий. И в конце уже разбивал данные.

Отсутствие try/except

Некоторые пользователи получали ошибки и заказчик толком не мог объяснить в чем причина. Дописав лог, проанализировал скриншоты я понял, что в причина в отсутствии логина telegram. Я не использовал try/except при выводе логина.

get_tg_login = mess.chat.username
text = u'\U0001F531' + "<b>Введите Ваш <u>логин</u> в телеграме.</b>\n"+ u'\U0001F198'+"Если его нет, зайдите в настройки телеграма и введите имя пользователя, оно начинается с @...\n"

try:
 text += u'\U00002049' + " <b>Может это " + get_tg_login + "?</b>"
except:
 pass

На unicode (для смайлов) и разметку не обращайте внимание. При выводе использовал parse_mode= ‘Html’.

Слишком большой текст для ответа в telegram

Запомните — для ответа пользователю в телеграм есть ограничение в 4096 символов! Я этого не знал. На выходных обратился ко мне заказчик и сказал что не мог получить данные по заказам (выгружали заявки за пару недель).

Решил разбивкой сообщения на несколько.

if len(text2s) > 4096: 
    for x in range(0, len(text2s), 4096): 
        bot.send_message(call.from_user.id, text2s[x:x+4096], parse_mode='Html') 
else: 
    bot.send_message(call.from_user.id, text2s, parse_mode='Html')

Отправляем частями или отсылаем 1 сообщение.

Если бы не заказчики, я бы и не обратил внимания.

А с какими ошибками Вы сталкивались и как решали?

veniamin

Recent Posts

Как заработать токен NOT за стейкинг BNB или FDUSD

Очень много разговоров в последнее время за токен NOT. Много бирж будут делать листинг токена,…

6 месяцев ago

Как заработать TON и NOT за стейкинг в телеграм

Телеграм недавно запустил возможность стейкать (замораживать) USDT и получать за это их валюту TON. Очень…

6 месяцев ago

Бонус 100 USDT +10 BUSD от Binance

Биржа криптовалют Binance проводит сейчас промо-акцию: новым пользователям дают ваучеры в сумме 110 долларов. Деньги…

3 года ago

Как парсить длительность видео youtube на php в привычном виде

Самый главный момент в работе с youtube - это получить ключ api через консоль разработчика…

3 года ago

Как удалить чужую сессию пользователя в ubuntu (linux)

Арендую сервер для небольшого проекта на python. И вот приходит мне уведомление, что за сутки…

3 года ago

Как наложить watermark на видео в python windows массово

Тестирую одну схему, и нужно на много видео наложить watermark. Решил делать через Python 3,…

3 года ago