Seosprint, profitcentr и другие.. (решение без сервисов)
На протяжении многих веков величайшие умы человечества бились над поисками ответа на вопрос "как решить такую капчу?". Вопрошающие хотели знать, как решать капчи на буксах, чтоб залутать многа деняк.
Раньше решали просто - сбор всех картинок как md5 и сопоставление с вопросом.
Даже под текст капчи был на бас пост Бесплатное автоматическое распознавание капчи на BAS. И под profitcentr тоже.
На самом деле, эт прикольный подход не только как решение, но и как оптимизация. По сути, мало кому нужно иметь риалтайм генерацию, это большая нагрузка, тем более, вдруг сгенерится чет нерешаемое, поэтому практически все (если не все) просто генерят 1к капч (сильно больше будто бы и смысла особо нет) и сейвят на сервере. А потому, есть резон собрать их все и прорешать 1 раз, пусть даже через сервисы, зато будет база ответов. А если база и обновляется или пополняется, можно просто ее каждый день дополнять. Оптимизация, хуле.
Не могу сказать точно, что это блеклист слов капчи, но оно лежало в сурсах (слитый гитлаб яндекса) капчи в одной папке с генератором (вроде как).
Я решил внести свою лепту в поиски данного ответа.
Хачу решать капчу не решая капчу. Мне было немножко лень писать код, поэтому я попробовал напрячь "искусственный интеллект", но он упорно выдавал хуйню с багами, без посказок, поэтому пришлось трохи и самому писать.
Seosprint
Некоторое время назад у меня была идея сделать так, чтобы капча решила сама себя. Раз картинок не много, их пускают по кругу в разные вопросы, та что чаще всего в вопросе, та и есть верный ответ.
Я напарсил запросеками задач с сеоспринт вида: вопрос и ответы, а потом вывернул и сделал перегруппировку, чтобы у каждого ответа был вопрос и частота встречи.
Таким образом, я хотел чтобы были получены все правильные вопросы на ответы и оно даже кое как работало, но недавно на форуме я увидел вопрос и оказалось, что капча поменялась.
Теперь там картинки, видимо, создаются "динамически". Рано или поздно я планировал опубликовать решалку, но тут оказалось, что она сдохла, поэтому мне захотелось придумать как наебать систему.
И для этого, я проделал все то же самое, но в качестве имени указывал не md5, а перцептуальный хэш, под который я делал когда-то модуль. Дополнительно мерждил ответы по 75% pHash в 1 картинку.
Прогнал скачивание 1к капч, вывернул, подсчитал, опять вывернул, получил на выходе набор ответов под каждый вопрос.
Запустил сортиров очку по папкам на основе по имени хеша и категории вопроса. По итогу было 30% мусора в каждой категории (наверное из за мерджа.. либо мало запросов), который я ручками почистил. Как не трудно заметить, похожие картинки даже расположены рядом. Только по итогу в решении через pHash, в качестве основного алго, это не помогло, схожесть картинок с разных групп была почему-то слишком высокая, но может это я конечно чет недопонял или проебался в коде.
Тесты
Я решил провести немножко тестов на различные алго поиска схожести изображений и ручками разметил 10 тасков.
Удобно, что и тут в бас html работает
'<div><h3>'+[[QUEST]]+'</h3><p><img src="data:image/jpeg;base64, '+[[IMG]]+' /></p></div>'
В результате получились вот такие размеченные картинки.
Я подготовил 5 тестов: BAS (нативное сравнение), pHash, image-js (getSimilarity), Jimp (distance - pHash), Jimp (diff - PixelMatch)
Также несколько доп тестов для каждого: ориг, gray, gaussianFilter, resize
И еще тесты..
По итогу я выбрал 3 варианта и провел еще пару тестов: сравнение картинок бас, комбо по 3 метрикам (phash, bas, image-js). Но комбо чет прироста не дало особо, хотя я пытался ставить разные пороги у разных алго в надежде, что это чет поменяет. Jimp алгоритмы почему-то работали в 10 раз медленнее, еще и хуёво в рамках данной задачи. А еще, вполне закономерно, что сходство по pHash у сжатых картинок хуже чем у фул размера.
Затем, я заметил, что можно по урлу запрашивать 1 картинку и каждый раз она будет чуть видоизменяться (чб, кроп, поворот). Попробовал насобирать по 10 вариантов каждой картинки при решении 1 таска, но прироста в качестве это не дало, зато стало в 10 раз дольше решать.
Итоговое решение
По итогу я выбрал вариант сравнение image-js с порогом выше 92, по качеству, кажется, трохи лучше чем нейтив бас, а по скорости примерно также.
Прогнал 100 тестов. Результат 52/100, что для фри решения без всяких нейросеток вполне неплохо.
Когда решил капчу сам, без сервисов и она работает, хоть и хуёво, но зато бесплатно.
С другой стороны, картинки разные, добиться иного результата будет не просто.
Шучу, хуярим дальше
Помните, я чуть ранее сказал, что при повторном запросе картинки сайт вертает разные её виды? нутк го этим воспользуемся и напИздим все что есть)
Так как есть все правильные картинки, можно напарсить каждой по 30 вариаций.
Ну я и напарсил. Ну вот, другое дело. 10/10, алгоритм BAS, сжатие + чб + мыло, порог 95%
И на алго image-js, 92% тоже 10/10.
Прогнал 100 тестов. Алго: BAS 91/100, image-js 92/100. Сила черипикинга) Но по сути сильно разницы нет, можно будто бы и то и то юзать.
Ошибка не выделил нужное (над по больше примерчиков): BAS 6/9 , image-js 6/8
Ошибки в парах для сравнения алго:
Ну и кароч, я заметил, в итоге что проебал 1 картинку с коровой, потому и были с ней ошибки в тестах. В итоге алго: BAS 94/100, image-js 95/100.
Судя по качеству решения, кажется что я спарсил почти все что у них было.. мож так и есть. Если еще чуток допарсить каждой картинки, скорее всего качество улучшится..
Иии... конец!?
Шучу, какой конце нахуй, с хуя ли блять конец?
Хуярим дальше. Profitcentr.
Надо проверим работала ли моя та изначальная уебанская идея.
Ну и я типо не доволен нихуя. Какого хуя мне опять пришлось заниматься вот этой всей дрочкой? Мне нужно было прогонять тесты фильтруя по вопросу и чекать та или не та картинка, чтоб запускать ее парс.
Я хотел прочекать, что моя идея с авто решением через группировку вопроса и ответа сработает, а вместо этого ебался с капчей. Напоминаю, я хочу чекнуть валид алго:
Формируем хэш таблицу, где в имени хэш картинки и варианты вопросов под нее с подсчетом.
После этого выворачиваем её наоборот, берем теперь хэш с его вариантами вопросов и выбираем тот где большее значение, в этот вопрос и ставим хэш.
На выходе получим жсончег с вопросами и ответами.
Возьмем самое удобное на чем можно почекать.
1к запросекаф, есть ошибки, не удовлетворительно. Пробуем еще раз.
10к запросекаф. Вот теперь все хорошо разметилось, отлично)
Да, теперь перевес у ответов статистически значимый.
Итог:
По сути, хэшить картинки действительно есть резон, даже для обычных капч. Все-таки сайт вряд ли их генерит или хранит на серверах огромное количество. А на буксах такой подход стабильно решает капчу на 100%.
В целом, тыкать буксы было даже немного интересно, особенно попробовать разные сравнения картинок.