feat: Добавлены ограничения на длину текста и улучшена обработка ошибок

This commit is contained in:
Ilia Miheev
2026-08-30 11:19:55 +03:00
parent 5b62112ab2
commit 8fdd676bb3
2 changed files with 35 additions and 8 deletions
+31 -7
View File
@@ -2,10 +2,15 @@ from dotenv import load_dotenv
from sys import exit as sexit from sys import exit as sexit
import os import os
import json import json
import html
import telebot import telebot
import qrcode import qrcode
CAPTION_LIMIT = 1024
MESSAGE_LIMIT = 4096
QR_TEXT_LIMIT = 770
# Загрузить переменные из файла .env и language.json # Загрузить переменные из файла .env и language.json
load_dotenv() load_dotenv()
with open('./src/language.json', 'r', encoding='utf-8') as file: with open('./src/language.json', 'r', encoding='utf-8') as file:
@@ -33,7 +38,7 @@ def gen_qr(text, id):
# Создаем экземпляр класса QRCode # Создаем экземпляр класса QRCode
qr = qrcode.QRCode( qr = qrcode.QRCode(
version=1, version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H, error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=10, box_size=10,
border=1, border=1,
) )
@@ -48,15 +53,34 @@ def gen_qr(text, id):
@bot.message_handler(content_types=['text']) @bot.message_handler(content_types=['text'])
def generate_qr_code(mess): def generate_qr_code(mess):
gen_qr(mess.text, mess.from_user.id) if len(mess.text) > QR_TEXT_LIMIT:
bot.send_message(
mess.chat.id,
language['text_too_long'].format(limit=QR_TEXT_LIMIT, chars=len(mess.text))
)
return
try:
gen_qr(mess.text, mess.from_user.id)
except (qrcode.exceptions.DataOverflowError, ValueError):
bot.send_message(mess.chat.id, language['qr_overflow'])
return
words = len(mess.text.split())
chars = len(mess.text)
text = language['qr_info'].format( text = language['qr_info'].format(
text=mess.text, text=html.escape(mess.text),
words=len(mess.text.split()), words=words,
chars=len(mess.text) chars=chars
) )
with open(photoName, 'rb') as qr_photo: with open(photoName, 'rb') as qr_photo:
bot.send_photo(mess.chat.id, qr_photo) if len(text) <= CAPTION_LIMIT:
bot.send_message(mess.chat.id, text, parse_mode='html') bot.send_photo(mess.chat.id, qr_photo, caption=text, parse_mode='html')
else:
bot.send_photo(mess.chat.id, qr_photo)
if len(text) > MESSAGE_LIMIT:
text = language['qr_info_short'].format(words=words, chars=chars)
bot.send_message(mess.chat.id, text, parse_mode='html')
os.remove(photoName) os.remove(photoName)
print(language['bot_started']) print(language['bot_started'])
+4 -1
View File
@@ -3,5 +3,8 @@
"no_token": "Отсутствует токен телеграм бота. Загрузи токен в переменные окружения и бот сможет начать работу", "no_token": "Отсутствует токен телеграм бота. Загрузи токен в переменные окружения и бот сможет начать работу",
"bot_started": "Бот запущен", "bot_started": "Бот запущен",
"bot_stopped": "Бот отключён", "bot_stopped": "Бот отключён",
"qr_info": "<b>Сообщение:</b> {text}\n<b>Слов в сообщении:</b> {words}\n<b>Символов в сообщении:</b> {chars}" "qr_info": "<b>Сообщение:</b> {text}\n<b>Слов в сообщении:</b> {words}\n<b>Символов в сообщении:</b> {chars}",
"qr_info_short": "<b>Слов в сообщении:</b> {words}\n<b>Символов в сообщении:</b> {chars}",
"text_too_long": "Текст слишком длинный для QR-кода. Максимум {limit} символов, а тут {chars}",
"qr_overflow": "Не получилось создать QR-код: текст слишком большой)"
} }