07.16Разгадываем капчи с помощью Goggles
Совсем недавно я наткнулся на это сообщение:
http://board.jdownloader.org/showthread.php?p=157746 ( видео)
Автор этого сообщения рассказывает способ разгадывания recaptcha с помощью goggles и выкладываем исходные коды на delphi. Прочитав, я решил получше разобраться в этом способе и переписать код на python.
Автор не особо рассказывает об алгоритме, поэтому мне пришлось немного помучится, чтобы понять почему гугл выдает совсем другие ответы в моём скрипте, чем программа написанная на delphi. Одной из проблем был размер картинки и её формат. Картинка не должна быть маленькой и должна иметь формат JPG.
import random,re from grab import Grab from PIL import Image cap = 'image.bmp' # фаил с капчей bdata = "\x22\x00\x62\x3C\x0A\x13\x22\x02\x65\x6E\xBA\xD3\xF0\x3B\x0A\x08\x01\x10\x01\x28\x01\x30\x00\x38\x01\x12\x1D\x0A\x09\x69\x50\x68\x6F\x6E\x65\x20\x4F\x53\x12\x03\x34\x2E\x31\x1A\x00\x22\x09\x69\x50\x68\x6F\x6E\x65\x33\x47\x53\x1A\x02\x08\x02\x22\x02\x08\x01" tdata = "\x18\x4B\x20\x01\x30\x00\x92\xEC\xF4\x3B\x09\x18\x00\x38\xC6\x97\xDC\xDF\xF7\x25\x22\x00" ua = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16 GoogleMobileApp/0.7.3.5675 GoogleGoggles-iPhone/1.0; gzip' headers={"Content-Type": "application/x-protobuffer", "Pragma": "no-cache"} def cssid(): # Фукнция генерации cssid chars = 'ABCDEF0123456789' res = '' for i in xrange(16): res += random.choice(chars) return res def varint(value): # Функция преобразования в varint ret = [] bits = value & 0x7f value >>= 7 while value: ret.append(chr(0x80|bits)) bits = value & 0x7f value >>= 7 ret.append(chr(bits)) return ''.join(ret) def encodeImage(image): # Функция перекодировки картинки size = len(image) a = varint(size + 32) b = varint(size + 14) c = varint(size + 10) size = varint(size) return "\n%s\n%s\n%s\n%s%s%s" % (a,b,c,size,image,tdata) def createImage(cap,out): # Функция наложения капчи на большое изображение с текстом img1 = Image.open('pat.jpg') img2 = Image.open(cap) im = img2.crop((0,0,img2.size[0],img2.size[1])) img1.paste(im,(45,65,45+img2.size[0],65+img2.size[1])) img1.save(out,"JPEG",quality=100) sid = cssid() # Получаем sid createImage(cap,'out.jpg') # создаем картинку img = open("out.jpg",'rb').read() # Считываем картинку в бинарном формате rdata = encodeImage(img) # Кодируем картинку g = Grab() g.setup(url='http://www.google.com/goggles/container_proto?cssid='+sid, method='POST',user_agent=ua,payload=bdata,unicode_body=False,headers=headers) # Проверяем валидность cssid g.request() g.setup(url='http://www.google.com/goggles/container_proto?cssid='+sid,payload=rdata) # Отправляем картинку g.request() try: text = re.findall('STR(.*?)ENDR',g.response.body)[0].strip() # Пытаемся найти текст капчи в разгаданной картинке print text except Exception,err: print err
Как я уже писал, маленькие изображения гугл не принимает, поэтому накладываем нашу капчу на большое изображение, где заранее написано STR и ENDR. Картинка с капчей накалывается между этих слов, чтобы потом можно было спарсить полученный результат.
Вот что получается у меня:
По распознаваемому тексту видно, что гугл всегда пытается найти существующие слова, а не набор символов, именно им он отдает большее предпочтение, поэтому во многих местах он выдает совсем не подходящие слова. Не победили рекапчу, зато победим более простые капчи, они распозновываются на ура .
Для тех кто решит переписать на свой язык, может пригодится вот это не полное описание протокола:
http://notanothercodeblog.blogspot.com/2011_02_01_archive.html
-
http://seo-parser.ru seo-parser
-
http://klipner.ru rushter
-
E
-
http://klipner.ru rushter
-
kardinal
-
http://klipner.ru rushter
-
http://jezuz-chrizt.livejournal.com Крайст
-
ruma
-
http://klipner.ru rushter
-
Lost
-
Lost
-
http://klipner.ru rushter
-
Lost
-
http://klipner.ru rushter
-
Lost
-
http://klipner.ru rushter