ВВЕДЕНИЕ
Давным-давно, мы с одноклассником думали о том, как заработать. Тогда, ничего кроме как рассылать рекламные смс мы не придумали. Реализовать это не получилось, ведь знаний и умений у нас не было. Но желание распознать картинку и отправить sms бесплатно (хотя в нашем краю Интернет был ой как дорог) осталось.
КАПЧА МОЕГО ОПЕРАТОРА
Установив PHP, решил начать его изучение с какой-нибудь задачки. Тут-то и вспомнились школьные годы. Сейчас у меня сотовый оператор Теле2, самый дешевый в моем регионе. Вот значит с ним и будем работать. Зашел на сайт бесплатной отправки. Увидел, как обстоит дело с смс. Довольно простые картинки.
Но стоило взглянуть на них под микроскопом… Сразу скажу, я сделал все самым простым, перводоступным способом, который именно мне и именно полгода назад показался самым простым.
Да, картинки. При внимательном рассмотрении, оказалось, что значение фонового цвета редко бывает меньше 0x7FFFFF. Отлично, значит можно избавиться от шума и посмотреть, что получится. Только как? Первое на что я наткнулся в своем учебнике – библиотека GDlib. С помощью данной библиотеки можно очень просто определить или установить цвет пикселя. Заменил цвет каждого фонового пикселя на черный.
Так, неплохо. Только вот явно какие-то помехи остаются вокруг цифр. На самом деле, на капче практически всегда цифры разных цветов. Более того цифр всегда шесть. То есть достаточно найти шесть самых популярных цветов, а остальные цвета закрасить черным.
Получилось, что все цифры стоят отдельно. Ведь это только плюс.
Теперь разобьем целую картинку на шесть составных частей. Каждая часть будет содержать цифру, ну и немного черного фона. Для этого найдем самую верхнюю и нижнюю координаты по y, и самую левую и правую координаты по x.
Но цифры под углом и разного размера. По хорошему надо их вращать и приводить к одному размеру. А можно и проще. Каждая цифра имеет свою ширину и высоту, по-моему, настолько же уникальный параметр, как и угол поворота относительно вертикальной оси. Ограничимся одним этим параметром, ничего не вращая.
Получить шесть цифр из одной картинки мы смогли, но ведь надо их распознать. А что бы распознать надо с чем-то сравнить. Пока сравнивать было не с чем. Необходима была хотя бы небольшая база эталонов. Было решено написать скрипт скачивающий по десятку изображений, которые далее распознавались человеком (мной или мамой). После распознавания получались эталоны, которые сохранялись определенным образом.
Имеем десять папок с именами 0,1,2,3,4,5,6,7,8 и 9. Внутри каждой из них директории, которые соответствуют геометрическим размерам распознанной цифры. Вот сюда то и сохранится изображение цифры-эталона.
Теперь можно было смело распознавать. Каждая новая капча избавлялась от шумов, разбивалась на шесть цифр. Каждая цифра, проходя по директориям, которые соответствовали ее геометрическому размеру, сравнивалась с эталонами. Сравнение происходит тупо – по количеству совпавших пикселей.
В итоге получился достаточно долгий, но рабочий скрипт. Распознавание с 90% вероятностью длится в среднем пять секунд. Уменьшив базу эталонов, придем к сокращению времени распознавания, но также уменьшим и вероятность.
ПРИЛОЖЕНИЕ МОЕЙ СОЦИАЛЬНОЙ СЕТИ
Все я мог отсылать смс. Захотелось прикрутить куда-нибудь эту возможность. Куда же?
Выбор пал на социальную сеть, которой я пользуюсь контакт. Идея была проста. Отсылать смс о новых сообщениях. Конечно, все можно было сделать и средствами VK_api, но за отправку одной смс с приложения списывается 0,1 голоса (приблизительно 1 рубль). И черт знает, как туда закинуть эти голоса.
Итак, мне необходимо:
- получить доступ к своим же сообщениям;
- просмотреть непрочитанные;
- определить отправителя сообщения;
- сформировать текст смс, вида: «Отправитель сообщения», «Содержание сообщения»;
- собственно отправить смс на свой номер;
- пометить сообщение как прочитанное.
Все-таки самый первый шаг это создание Standalone-приложения. Т.к. только такое приложение может получить доступ к личным сообщениям. Достаточно долго я искал, где его создать. Не сразу бросается в глаза ссылкапо которой надо перейти, для создания таких приложений.
Что бы иметь возможность работать с сообщениями пользователя в первую очередь необходимо получить accesss_token. Данный процесс доступно описан на странице для разработчиков. Разрешаем нашему приложению получать доступ к сообщениям в любое время (scope=messages,offline). Вообще получаем приблизительно такую строчку:
http://api.vkontakte.ru/oauth/authorize?client_id=ИД_МОЕГО_ПРИЛОЖЕНИЯ&scope=messages,offline&redirect_uri=http://api.vkontakte.ru/blank.html
&display=page&response_type=token
Вводим ее в браузер. Разрешаем приложению доступ. И благополучно копируем accesss_token себе в какой-нибудь файл.
Дальше проще.
Получаем все непрочитанные сообщения:
https://api.vkontakte.ru/method/messages.get?out=0&offset=0&count=1000&filters=1&preview_lengt=0&time_offset=0
&access_token=РАНЕЕ_ПОЛУЧЕННОЕ_ЗНАЧЕНИЕ
Обработав ответ json_decode, получим объект содержащий идентификатор отправителя, идентификатор сообщения, содержание сообщения и кучу бесполезной для нас информации. По идентификатору отправителя определим его имя и фамилию:
https://api.vkontakte.ru/method/getProfiles?uid=ИДЕНТИФИКАТОР_ОТПРАВИТЕЛЯ&fields=first_name,last_name
&access_token=РАНЕЕ_ПОЛУЧЕННОЕ_ЗНАЧЕНИЕ
Заранее запишем номер телефона в какой-нибудь файл, что бы не хранит его в исходнике. Все готово для отправки смс. Отправляем (в исходниках функция send_sms_VK). Осталось пометить отправленное смской сообщение как прочитанное:
https://api.vkontakte.ru/method/messages.markAsRead?mids=ИДЕНТИФИКАТОР_СООБЩЕНИЯ
&access_token=РАНЕЕ_ПОЛУЧЕННОЕ_ЗНАЧЕНИЕ
Поместим все это в цикл, который каждые пять секунд будет смотреть, написал ли нам кто-то сообщение.
ЗАКЛЮЧЕНИЕ
Весь мой код выложен здесь. Он оставляет желать лучшего и требует доработки. Отсутствуют маломальские проверки, но все-таки он рабочий. Напомню:
$dir_were_expamples="C:\\www\\TEST_DIR2";//путь к папке с образцами цифр
$file_were_access_token="access_token.txt";//путь к файлу содержащему access_token
$file_were_tel_nomber="tel.txt";//путь к файлу содержащему номер телефона на который отправлять смс
Заархивированная папка с образцами расположена здесь.
Файлы access_token.txt и tel.txt необходимо создать и заполнить заранее.
Формат номера должен быть хххххххххх (десять цифр). Пример 0001234567.
Всем приятного лета.