Добрый день, коллеги!
Когда-то давно, еще не не имея полноценного аккаунта на Хабре, я написал статью в песочницу, надеясь получить инвайт. Инвайта я не получил, и думал, что статья ушла в никуда. Сегодня, просматривая логи Google App Engine, я обнаружил ссылку с сайта, на котором, как оказалось, размещена моя статья из песочницы. Оставляя за скобками вопрос о корректности такой публикации, хочу поблагодарить неизвестных мне добрых людей с сайта ajc.su/ за то, что сохранили для меня мою статью. :) Но, собственно, по теме.
Первый раз идея посетила меня, когда у меня возникла необходимость снять квартиру. Я просматривал объявления на Циане и отзванивался по наиболее интересным. После пары-тройки звонков я понял, что надо как-то упорядочивать обзвон — сохранять не только номера, но и адреса, а заодно и описания квартир. В этот момент я осознал, что при всем развитии Интернета контактную информацию по-прежнему приходится обрабатывать руками — в лучшем случае копировать поблочно и где-то сохранять. При том, что контакт — это объект, аналогичный, к примеру, календарю. Но если кнопки «Добавить событие в календарь» на многих сайтах уже есть, то вот кнопку «Добавить контакт в записную книжку» я пока еще не видел. Я решил восполнить этот пробел, и результатами своих размышлений и наработок хочу поделиться.
Кому оно надо?
Первое, над чем я задумался, осознав проблему — а является она актуальной для кого-либо, кроме меня самого. Здравый смысл подсказывал, что наверняка есть еще кто-то кроме меня, для кого эта проблема актуальна, осталось только понять, кто эти люди.
Из собственного опыта — это, видимо, арендаторы квартир в поиске предложений по сайтам. Наверняка сами риэлторы, которые точно так же просматривают объявления, будут заинтересованы. Еще одна большая группа — это хедхантеры и HRы. Это всё люди, у которых с регулярной периодичностью появляются новые контакты, с которыми требуется связываться (звонить и писать) неоднократно.
Думаю, что есть и другие группы людей, которым было бы интересно иметь такую возможность.
Общий подход
В задаче обработки контактов с сайта я вижу два этапа:
- Получение контактной информации с сайта
- Манипуляции с контактом
Задачу первого этапа можно решить тремя способами:
- Парсер страницы по ссылке
- Подключаемый скрипт для сайта
- Плагин к браузеру
На втором этапе полученные контактные данные можно:
- Показать как QR-код
- Сохранить как файл vCard
- Переслать в виде vCard через SMS
- Сохранить в Google Contacts
- Сохранить в записную книжку MS Exchange
- Использовать для VoIP-звонка
Думаю, что это не полный перечень, но как минимум основные возможные действия я перечислил.
Получение контактной информации
Первоначальная идея была выделять номера телефонов эвристически, используя различные шаблоны. Но это ненадежный способ — не всякая последовательность цифр, пусть даже и выглядящая как номер телефона, является таковым. Кроме того, выделять эвристически названия и адреса мне вообще не представляется возможным.
В настоящее время наиболее перспективным мне видится разбор разметки hCard. Во-первых, в этой разметке контактная информация уже структурирована, а во-вторых, она продвигается Яндексом. Хотя, конечно, этот подход предполагает определенную кооперацию со стороны вебмастеров — ответственность за разметку контактной информации ложится на них.
Парсер страницы по ссылке
Этот способ видится мне не очень удобным. Во-первых, страница с контактной информацией будет запрошена дважды — первый раз пользователем, чтобы увидеть ее содержимое, а второй раз сервером, чтобы получить из этой страницы контакт. Это несколько увеличивает нагрузку на сервер, на котором размещена запрашиваемая страницы, и искажает статистику посещаемости. Во-вторых, данный способ неприменим к страницам сайтов, которые показываются только авторизованным пользователям. Тем не менее, этот подход уже реализован здесь. Автор данного сервиса — Tantek Çelik, один из соавторов микроформата hCard.
Подключаемый скрипт для сайта
Данный способ получения контактной информации предполагает размещение на сайте JavaScript’а (например, в форме плагина к jQuery), который сканирует страницу на предмет наличия на ней разметки hCard и добавления к ней ссылки для передачи полученного контакта для дальнейшей обработки.
При таком подходе контакт может быть выделен с любой страницы — доступной только авторизованным пользователям, или генерируемой динамически. Правда, этот подход предполагает большую кооперацию со стороны вебмастера — предполагается, что он не только делает разметку hCard, но и размещает скрипт на сайте.
Плагин к браузеру
Данный подход аналогичен предыдущему, но с той разницей, что скрипт, выделяющий контакт из разметки страницы, работает не в контексте страницы сайта, а в контексте браузера. Он позволяет пользователю получать контакт с любых страниц, содержащих разметку hCard. Недостаток подхода — необходимость создания плагинов для всех популярных браузеров (Chrome, FF, IE, Opera), при том, что системы плагинов у них разные. Хотя не так давно здесь, на Хабре, пробегала статья про фреймворк, позволяющий создавать плагины сразу для всех браузеров.
Манипуляции с контактом
Полученный тем или иным образом контакт далее может быть обработан каким-либо образом. Способы обработки (далее — действия) я для себя делю на две группы:
- Сохранить
- Позвонить/связаться
В данный момент я представляю себе, как реализовать действия группы «Сохранить». Действия группы «Позвонить» я отложил на потом, для более детального изучения.
Показать QR-код
Данное действие предполагает преобразование полученного контакта в vCard, и далее кодирование его в QR-код. Наиболее простой способ кодирования — воспользоваться имеющимся у Google Charts API. Все, что требуется — это сформировать ссылку к сервису Google, в качестве одного из параметров указав строку, содержащую VCard-представление контакта.
Сохранить файл VCF
Действие также предполагает преобразование контакта в vCard, и далее передачу его в виде ответа сервера с соответствующими заголовками в браузер.
Сохранить в Google Contacts
Данное действие реализуется несколько сложнее, чем предыдущие, поскольку потребует не только преобразования контакта к XML-формату GData (элемент типа Contact), но и обработку авторизации доступа к Google Contacts через OAuth. Это, как выяснилось, не так сложно, но имеющаяся на на Google Developers документация в этом вопросе не очень внятна. Я предполагаю посвятить этому вопросу отдельную статью.
Несколько слов в заключение
Все свои размышления я воплотил в прототип сервиса, который я назвал Act4Contact. Он сейчас работает на Google App Engine (и я опасаюсь, что бесплатный вариант сервиса вряд ли выдержит блога-эффект и не превысит квоту), в нем пока нет интерфейсных красот и ставшего нынче стандартом де-факто интерфейса на AJAX, но он уже может выполнять свою основную задачу — формировать из разметки hCard контакт и сохранять его.
Я планирую развивать этот сервис и довести его до рабочего состояния, в связи с этим буду рад, если кто-то заинтересуется и будет готов объединить со мной усилия в этом направлении. Еще мне было бы интересно получить отзывы от вебмастеров — я предполагаю, что представление контактной информации в виде «манипулябельного» объекта должно увеличивать конверсию за счет того, что для пользователя страница контактов будет являться не последней, после которой его взаимодействие с сайтом переходит из виртуальной плоскости в физическую (набрать номер телефона), а продолжает взаимодействие и делает его более плавным. Поэтому приглашаю заинтересовавшихся провести совместный эксперимент по преобразованию контактной информации из текстовой формы в объектно-манипулябельную и посмотреть, насколько это оправдано.
И еще. За время работы над этой задачей у меня уже появилось несколько тем, которыми я могу поделиться. Например, рассказать о работе с Google Contacts API. Я думаю, что продолжение работы над сервисом даст еще не одну тему для того, чтобы поделиться ей с вами.
Автор: gorynych_zmey