Пишем капчу для Телеграм бота

1 мин

|

Приветствуем на борту! В этой статье расскажем как можно добавить лаконичную и всем знакомую капчу в 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)

Итог

При генерации капчи рекомендуется использовать рукописные шрифты и экспериментировать с расположением символов, элементов. Использования кириллицы также помогает надежнее защититься от нежелательных гостей.


Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии