banner

Разбор простых капч

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

Из данного примера видно, что капча имеет размер 90×25, в ней используется всего 16 символов (0-9,a-f), которые имеют статическое положение и размер в 8 пикселей.

Скачаем 100 случайных капч, вырежем из них символы и попытаемся как-то их идентифицировать.

import Image,hashlib,shutil
hashlist = []
for i in xrange(100):
    img = Image.open('cap/%s.png'%(i))
    # Координаты расположения символов
    pixels = [[5,13],[23,31],[41,49],[59,67],[77,85]]
    for c in pixels:
        # Вырезаем нужный символ
        img_crop = img.crop((i[0],0,i[1],25))
        # Получаем его md5 хэш
        hash  = hashlib.md5(str(img_crop.histogram())).hexdigest()
        if hash not in self.hashlist:
            hashlist.append(hash)
            shutil.copy('cap/%s.png'%(i),'hs/%s.png'%(hash))

Для того, чтобы хоть как-то различать символы между собой, я решил использовать гистограммы.
Функция histogram возвращает список всех пикселей, если пиксель белый, то на его месте окажется 0, если черный то 1.
Таким образом мы получаем уникальную последовательность для каждого из символов.

На выходе получаем 16 изображений. Предположение о том, что используется всего 16 символов было верным :)
Не будем заморачиваться с автоматическим определением символов лежащих в этих файлах, а просто составим руками таблицу вида ‘хэш’->’символ’.

        table = {
                      'a81c039f83cbe21b1381c455d1e5868f':'0',
                      '746a974251d1cc47b298bc116d0cf474':'1',
                     .......
                          }

Осталось только опробовать это в боевых условиях.

# Открываем капчу
img = Image.open('captcha.png')
pixels = [[5,13],[23,31],[41,49],[59,67],[77,85]]
for c in pixels:
    img_crop = img.crop((i[0],0,i[1],25)
    hash  = hashlib.md5(str(img_crop.histogram())).hexdigest()
    text = ''
   # Если символ есть в таблице, то он разгадан.
    if table.has_key(hash):
         text +=  table[hs]
    print  text

Вот и всё, потратив 20-30 минут мы добились 100% распознавания капчи.

  • http://mrthe.name mr.The

    Питон крут, на нём это всё выглядит очень красиво.

  • 1212

    Ну это капча самая элементарная. Толку нет от такой распознавалки.

  • http://klipner.ru rushter

    Конечно нету, кроме экономии в 10-15 баксов дейли.