Re: trafficmonsoon.com - trafficmonsoon
Цитата:
Сообщение от 1989Bogdan1989
в кликермане можно сделать. Делал когда-то для другого проекта, правда мне тогда изрядно помог один очень умный человек. 95% капч разгадывало верно. Рандомно меняется масштаб и более того даже оттенки пикселей(на трафике насчет оттенков не уверен, не проверял). Цвета упрощаете до 8 базовых, и будет вам счастье. Отношение количеств пикселей разного цвета меняется в масштабированной картинке пропорционально. Проще вручную откликать, чем заморазиваться с ботом)
|
Цитата:
Сообщение от pabx
Там все до неприличия просто(моему боту даже не удобно) - просто одинаковый src
|
Вот мой код на Питоне для распознавания капчи с 5 картинками для квалификации. Выкладываю под лицензией GPL. Вроде бы распознает без ошибок. Во всяком случае, пока ошибочных распознаваний не зафиксировано. Используйте в своих ботах!
Скрипт
#!/usr/bin/python
# The GNU General Public License (GPL)
# Copyright (c) 2016 Lara25
import autopy
(x1, y1), (x2, y2), h = (310, 127), (730, 225), 20
background = 21, 36, 55
bmp = autopy.bitmap.capture_screen(((x1, y1), (x2-x1, y2-y1)))
getcolor = lambda x, y: autopy.color.hex_to_rgb(bmp.get_color(x,y))
is_background = lambda x: all([abs(x[color]-background[color]) < 5 for color in xrange(3)])
y = bmp.height-1
while all([is_background(getcolor(x,y)) for x in xrange(bmp.width)]):
----y-=1
bottom = y-h
gaps = []
gap_start, gap_end, previous = 0, 0, 1
for x in xrange(bmp.width):
----if previous == 1 and all([is_background(getcolor(x,y)) for y in xrange(bottom)]):
--------gap_start = x
--------previous = 0
----elif previous == 0 and not all([is_background(getcolor(x,y)) for y in xrange(bottom)]):
--------gap_end = x
--------previous = 1
--------gaps.append((gap_start, gap_end))
gaps.append((gap_start, bmp.width))
images = {}
for i in xrange(len(gaps)-1):
----length = gaps[i+1][0]-gaps[i][1]
----if length > h:
--------R, G, B = (sum((getcolor(x,y)[color]-background[color] for x in xrange(gaps[i][1],gaps[i+1][0]) for y in xrange(bottom))) for color in xrange(3))
--------images[(gaps[i][1], gaps[i+1][0])] = R/length**2, G/length**2, B/length**2
d = lambda x, y: (x[0]-y[0])**2 + (x[1]-y[1])**2 + (x[2]-y[2])**2
pairs = [(d(images[img1], images[img2]), img1) for img1 in images for img2 in images if img1 < img2]
answer = min(pairs)[1]
autopy.mouse.move(x1+(answer[0]+answer[1])/2, y1+bottom/2)
autopy.mouse.click()
Инструкция по использованию Для использования требуется установленный второй Питон и модуль autopy. Нужно задать координаты x1, y1 и x2, y2 левого верхнего и правого нижнего углов прямоугольника, внутри которого находятся картинки вместе с надписью под ними, а также высоту этой надписи h. Координаты отсчитываются от левого верхнего угла экрана. Границы прямоугольника должны лежать на синем фоне. Высота надписи h должна быть с запасом хотя бы в 1-2 пикселя. После запуска скрипт кликает нужную картинку, если видит капчу внутри прямоугольника.
Внимание! Отступы не отображаются, поэтому заменены пунктирной линией "----------". Перед использованием скрипта нужно заменить пунктирные линии на пробелы.
Алгоритм распознавания Вначале определяем где расположена нижняя граница капчи. Для этого последовательно перебираем все горизонтальные ряды пикселей указанного прямоугольника снизу вверх до тех пор, пока их цвет совпадает с цветом фона. Как только наткнулись на надпись под картинками, уменьшаем y-координату на высоту надписи h и получаем y-координату нижней границы капчи. Теперь нужно локализовать картинки. Для этого последовательно перебираем все вертикальные ряды пикселей (выше найденной нижней границы) слева направо и ищем все промежутки между картинками, заполненные фоном. Все, что между этими промежутками и есть картинки. Слишком короткие по длине картинки отбрасываем, поскольку это фрагменты картинок, отделенные от основного изображения. Теперь, когда картинки локализованы, вычисляем для каждой из них 3 величины - суммы цветовых компонент всех пикселей (за вычетом соответствующих компонент цвета фона), деленные на квадрат длины картинки. Эти величины - инварианты, т.е. они почти не меняются при масштабировании картинок. После этого для всех пар картинок вычисляем сумму квадратов разностей этих инвариантов и находим пару с наименьшей суммой. Это и будет искомая пара одинаковых картинок. Кликаем по первой из них.
Обратите внимание, как довольно сложный алгоритм уместился в таком коротеньком скрипте. Оцените мощь, гибкость и красоту Питона!
P.S. Кстати, язык Питон назван в честь шоу BBC "Летающий цирк Монти Пайтона" и не имеет ничего общего с мерзкими рептилиями.