Приветствуем на борту! В этой статье расскажем как можно добавить лаконичную и всем знакомую капчу в Telegram бота. Подобная надобность может возникнуть в ходе различных спам атак и при попытках недоброжелателей “положить” ваш телеграм ресурс и капча здесь выручает. Для написания кода воспользуемся языком Python и воспользуемся некоторыми бибилиотеками.
Как написать CAPTCHA для Телеграм бота
Для этого нам понадобятся некоторые библиотеки, которые мы изначально устанавливаем:
pip install pyTelegramBotAPI
- библиотека для работы с телеграм ботамиpip install claptcha
- библиотека для генерации простой капчиpip install Pillow
- библиотека для работы с изображениями
Далее производим импорт библиотеки:
import telebot
import random
from claptcha import Claptcha
from PIL import Image, ImageDraw
Подключаем API бота, которого мы создали в @BotFather:
bot = telebot.TeleBot('токен_телеграм_бота')
Создаем костыль с глобальной переменной:
class G:
def __init__(self):
keys = ['keyc']
for key in keys:
self.key = None
Создаем обработчик сообщений, в нашем случае в самом начале использования бота, т.е. при отправке команды “start”:
@bot.message_handler(content_types=["text"])
def get_text_messages(message):
if message.text == "/start":
captcha()
bot.send_message(message.from_user.id, "Введите капчу на кириллице") #сообщение
bot.send_photo(message.from_user.id, open("captcha.png", "rb")) #отправка капчи
bot.register_next_step_handler(message, check_c) #переход в функцию check_c
Теперь создаем саму функцию captcha:
def captcha():
G.keyc = (str([random.choice('АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЫЭЮЯ') for _ in range(6)])).replace("'", "").replace("[", "").replace("]", "").replace(" ", "").replace(",", "")
#Отсюда собственно и берутся буквы из которых генирируется капча, а также мы убираем лишнее
c = Claptcha(G.keyc, "font.ttf") #G.keyc - переменная для ключа капчи, а "font.ttf" - название файла со шрифтом
codcap, image = c.image
codcap, bytes = c.bytes
codcap, file = c.write('captcha.png')
image = Image.open("captcha.png")
draw = ImageDraw.Draw(image)
width = image.size[0]
height = image.size[1]
pix = image.load()
factor = 100 #Это значение генирации шума, Максимум 255
for i in range(width):
for j in range(height):
rand = random.randint(-factor, factor)
a = pix[i, j][0] + rand
b = pix[i, j][1] + rand
c = pix[i, j][2] + rand
if (a < 0):
a = 0
if (b < 0):
b = 0
if (c < 0):
c = 0
if (a > 255):
a = 255
if (b > 255):
b = 255
if (c > 255):
c = 255
draw.point((i, j), (a, b, c))
image.save("captcha.png", "PNG") #Сохраняем картинку
del draw #Удаляем кисть
Добавим функцию проверки верности введеных данных юзером
def check_c(message):
if message.text.lower() == G.keyc.lower(): #Здесь идет проверка капчи без учета регистра букв
bot.send_message(message.from_user.id, "Капча введена верно")
else:
bot.send_message(message.from_user.id, "Капча введена неверно")
И самое главное:
bot.polling(none_stop=True, interval=0, timeout=20)
Итог
При генерации капчи рекомендуется использовать рукописные шрифты и экспериментировать с расположением символов, элементов. Использования кириллицы также помогает надежнее защититься от нежелательных гостей.