Хочу описать несколько ошибок, с которыми я столкнулся при разработке бота для телеграм. Они популярные, но все таки запишу для себя чтобы не забыть.
Это глобальные переменные, большие тексты и отсутствие try/except.
Не используйте глобальные переменные
Если ботом планируете пользоваться не только Вы, никогда не используйте глобальные переменные. Особенно, если в боте будет личная (персональная) информация. Пример: бот запрашивал имя, любое число и город. Данные сохранялись в переменные и потом выводились в конце пользователю для подтверждения.
В моем коде были глобальные переменные и пользователи могли видеть чужую информацию! Это происходило при одновременном обращении к боту. Для решения этой задачи нужно использовать классы или передавать переменные в функциях.
Я создавал новый массив и наполнял его на каждом шагу (использовал register_next_step_handler ). Первый ответ пользователя (имя) я передавал на второй шаг, дальше (число и имя с 1 шага) передавал на третий. И в конце уже разбивал данные.
Отсутствие try/except
Некоторые пользователи получали ошибки и заказчик толком не мог объяснить в чем причина. Дописав лог, проанализировал скриншоты я понял, что в причина в отсутствии логина telegram. Я не использовал try/except при выводе логина.
1 2 3 4 5 6 7 | 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 символов! Я этого не знал. На выходных обратился ко мне заказчик и сказал что не мог получить данные по заказам (выгружали заявки за пару недель).
Решил разбивкой сообщения на несколько.
1 2 3 4 5 | 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 сообщение.
Если бы не заказчики, я бы и не обратил внимания.
А с какими ошибками Вы сталкивались и как решали?
0 Comments