Мой первый скрипт по разгадыванию капчи

в 14:34, , рубрики: php, капча, Песочница, почта, скрипт, метки: , ,
Предисловие:

Есть у меня один знакомый который держит интернет магазин. Балует меня иногда довольно-таки нестандартными задачами в программировании. Всё началось с того что, подумав, он решил что для его пользователей — будет очень удобно получать информацию о том где сейчас его посылка (товары с магазина он отправляет почтой России). Благо на сайте почты есть функция слежения за отправлением.

image

На странице достаточно ввести номер трекера и информация о посылке появляется на экране в виде аккуратной таблички. Не долго думая, я вооружился функцией curl и за пару минут приготовил легкий скрипт — который парсил эту информацию и выводил последнее местоположение посылки (статус: «Прибыло в место вручения» или «Вручение адресату» — давал команду скрипту отправить покупателю смс о том что он может забирать свою посылку).

Не успел я пропить деньги за написанный мною скрипт — как на почте стали твориться странные вещи. Мой скрипт перестал работать и причиной тому стало то что сайт «Почты России» поставил хитрый блок — который при пустой сессии редиректил страницу таким образом что мой скрипт зацикливался. К слову — даже обычный посетитель их сайта с первого раза не может зайти к ним на сайт.

Решение проблемы заключалось в том чтобы скрипт при обращении к сайту почты следовал его пере направлению (CURLOPT_FOLLOWLOCATION), для убедительности я также заполнил CURLOPT_REFERER и CURLOPT_USERAGENT. После первого соединения можно было заново послать запрос и работа скрипта по получению информации по трекеру — продолжалась в штатном режиме. За свои не хитрые манипуляции мне выписали премию и я со спокойной душей занялся другими проектами.

Глава 1 — Удар со спины

Спустя месяц после сдачи скрипта, почтовики нанесли ответный удар — установив на ту самую форму простенькую капчу. Ко мне снова обратились за помощью.
На то время я знал что есть на php возможность попиксельно разбирать картинку — тем самым есть возможность научить скрипт видеть и что самое важное понимать что изображено на картинке. К моему сожалению я ни разу этого не делал, но задачу поставили четко, а к скрипту уже привыкли. К слову говоря — этот скрипт уменьшил отказы на 60% — это очень хорошие деньги и отказываться от такой функции — было бы как минимум глупо.

Глава 2 — Подготовка к сражению

В первую очередь я начал смотреть на сам скрипт который выводит эту капчу
image
Увидел что в $_GET['Id'] странные цифры, но связи я к сожалению не обнаружил, зато я узнал что одна и таже картинка по одному адресу остаётся доступной только в течении 2х минут.
Ну не беда, капча довольна простая без шумов и в одном цвете.

Для начала я сохранил себе около 20-ти разных вариантов капчи (с разными цифрами) — выяснилось что скрипт который выводит эти цифры меняет не только их x и y координаты, но и размер (от 1 до 4х пикселей) — Значит мне нужно было научить скрипт разгадывать ~40 разных чисел.

Теперь прощупав объём предстоящей работы начинаем кодить.
image
Наша капча размером width:70px; height:23px;. Циклом пробегаемся по всей картинке и узнаем цвет пикселя (белый = 0, не белый = 1) Информацию забиваем в массив. Теперь чтобы проверить всё ли правильно я делаю, для наглядности я рисую в соседнем цикле функцию — которая рисует таблицу и выставляет ячейке соответствующий цвет
image
Сохраняем проверяем.
image
Чтож, как видим всё вроде получается. Теперь нужно придумать как скрипту распознавать цифры в массиве и интерпретировать их как картинку. Возможно я начал изобретать велосипед, но мне интереснее было придумать логику самому — не черпая информацию — которая меня может только запутать — из других источников.
Спустя несколько кружек кофе было решено показывать скрипту опорную точку и в зависимости от того какие пиксели закрашены рядом вычислять что за цифра нарисована на картинке.
image
И так — взяв одну опорную точку (в данном случае макушку цифры 1) я отсчитал несколько пикселей по оси X и Y и если они были черного цвета то скрипт говорил что это единица. Запустив тест я увидел что скрипт называет единицей числа 3,4,7 и 9 — логично что условий проверки должно быть больше. Для каждой цифры я добавил по 9 точек проверки и спустя 3 часа запустил скрипт который должен был разгадать капчу с цифрами 70039
image
И вот оно чудо! Скрипт уверено разгадал первую капчу (зная только цифры 7,0,3,9) — для убедительности я загрузил капчу в которой были те же цифры, но к моему сожалению скрипт не сработал т.к цифры отличались по высоте. Посмотрев на часы я решил что нужно больше опорных точек и что-то для автоматизации обучения.
Зная не только PHP, но и JavaScript сделал функцию которая по клику на ячейку заносила её в массив координат — позволяя мне выставлять для проверки — максимальное количество опорных точек
image
Процесс пошел быстрее. На обучение скрипта одной цифре уходило меньше минуты и через час скрипт знал все цифры которые использовала «Почта России» для генерации капчи.
image
image
Информацию о связанных точках для каждой цифры аккуратно сложил в отдельный файлик — который в случае чего можно будет дополнить.

Глава 3 — Ответный удар

Зайдя ещё раз на сайт почты и загрузив для проверки ещё несколько вариантов капчи я убедился в том что скрипт абсолютно верно угадывает капчу с точностью в 100% — не плохо для первого раза!
image
Даже я оказался менее зорким чем мой скрипт.
image
image
На выходе получился php скрипт — размером 45 КБ. Который принимал id капчи на сайте «Почты России»
image
и в ответ отправлял код — который изображен на картинке. С легкостью подключил свою антикапчу к предыдущему скрипту (парсеру) и всё снова заработало!
На всё ушло порядка 8-ми часов и 10 кружек кофе. Знакомый был несказанно рад, за что снова выписал мне премию.

Эпилог

Уверен что вскоре «Почта России» снова ответит мне новым вызовом, который я с удовольствием приму.
Скришоты процесса работы были сделаны специальной программой — которая выборочно вставляет свой логотип на скриншоты, обращать на него внимание не стоит.
Ещё раз напомню что чужие наработки для своего скрипта я не использовал — больше интересовала задача написать этот скрипт полностью с нуля и таким способом который выберу я сам, так что комментарии — типа: «Есть же куча софта..» или «Зачем изобретать велосипед» — будут расценены как невнимательное чтение поста.

Автор: funnybanana

Источник

  1. smail3:

    автор напишите мне ? скрипт он почти готов но почему не вводит не пойму а видет цифры

    • Marlik:

      Ну ты и тупооооой!!! ))) Неужели не видишь что не владелец этого блога – аффтар этой статьи? Ссылки посмотри снизу, где написано: источник. А на скриншотах, ссылка на сайт… )))

  2. рус:

    Сам ты тупой долбоящер

  3. Адам:

    Добрый день! Можете ли вы написать распознавалку капчи РЕСО гарантия? по уцене договоримся

  4. Роман:

    Что это за говно тут понаписано в этой статье???

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js