Экспорт дней рождения из ВКонтакте (работа с OpenAPI)

    imageЛично я не любитель соцсетей, а в особенности — вконтакте, из-за которого у меня было немало времени, потраченного впустую. Собственно поэтому в свое время я решил из него удалиться. Но в определенный момент я понял, что контакт служил не только местом , где можно было с утра до ночи нажимать F5 на странице Новостей для общения, но также сервисом, благодаря которому я мог вовремя узнавать о днях рождения друзей и, таким образом, поддерживать с ними хорошие отношения.

    Таким образом, была поставлена задача: экспорт календаря в внешний сервис (в моем случае — Google Calendar). Используется родной API, поэтому все работает быстро и без багов. Кому интересно — прошу под кат.

    Итак, были рассмотрены следующие варианты:

    Вариант в лоб — написать скрипт, который собирает ответы на AJAX-запросы страницы календаря. В общем, обход проблем с безопасностью, полчаса над Firebug-овскими ответами сервера, создание php-шки — и получился файлик с форматированными HTML-блоками, с которого к тому же надо вычислять год рождения от возраста в скобках, ну и конечно же, даже HTML «не особо» валидный. Вариант отпал. Дальше пошла работа, и времени+желания искать другие варианты не было.

    Вскоре на Хабре появилась статья «Экспорт Дней рождения из вКонтакте в Google Calendar», которая предлагала аналогичное решение, только в виде юзерскрипта, причем с впихнутым внутрь jQuery. Ну ладно, подумал я, то что тормозит — не очень страшно, главное — работает. К сожалению, обнаружилась пара неприятных багов (в т.ч. проблемы с спецсимволами в именах, ограничение в одного человека на день) и этот вариант тоже отпал.

    Вчера же от нежелания делать что-либо полезное нечего делать решил вернуться к вопросу. Так как на этот момент у контакта уже есть более-менее нормальное API для внешних сайтов и js-приложений (OpenAPI), было решено использовать его. Пара часов разбирательств, сожаление, что нет аналога FQL или соцграфа, далее разборка с форматом iCalendar — и, таким образом, был создан простейший в плане кода и дизайна HTML-файл и контактовское приложение (дабы не нагружать сервер), которые позволяют получить ics-файл для последующего импорта в любую популярную программу-календарь.

    Ознакомиться и скачать «страничку» можно здесь: http://pastebin.com/Q4dwGQyL
    Если лень создавать свое приложение вконтакте и хотите просто воспользоваться готовым решением, можете попробовать здесь: http://rreverser.com/dev/vkcal.htm (предупреждаю, хостинг бесплатный, так что может не выдержать знаменитого эффекта).

    Способ использования:
    • Нажимаете кнопку логина вконтакте
    • Разрешаете доступ
    • Ждете до появления кода в textarea
    • Нажимаете одну из кнопок «Save...» либо сохраняете полученный код в ICS-файл вручную
    • Импортируете сохраненный файл в календарь (Google Calendar, Outlook, etc.)
    Спасибо, пока все.

    Примечание: скрипт написан моим другом RReverser.
    Метки:
    Поделиться публикацией
    Комментарии 69
    • –2
      захожу на указанный сайт, логинюсь, жмакаю на батон Save и ничего :(
      браузер Chrome 7.0.517.44
      • 0
        *сам не пробовал* может блокируются pop-up'ы, а экспорт идет как раз через pop-up?
        • +7
          А в ботнете стало на одного зомби больше.
          • 0
            Хром не хочет через data-URI скачку делать, поэтому из него придется сохранять вручную.
            • 0
              С аналогичной версией браузера всё ок, даже при 1500 друзьях.
              • 0
                Ну тогда хорошо. Хотя у меня канарейка и правда не хочет.
            • 0
              iCal can’t read this calendar file. No events have been added to your iCal calendar.
              :(
              • +1
                Тестил в гугл-календаре, все шло на ура. Код хоть вывелся? Что за прога?
                • 0
                  Нажал Save, переименовал в .ics и открыл в айкал. сохранил вручную и все нормально пошло.
                  • 0
                    А проблем с кодировкой символов в iCal не было?
                    • 0
                      да, кириллица некорректно импротировалась
                      • 0
                        Решается конвертированием в UTF-8. У меня по умолчанию 1251 было.
                        • 0
                          А каким образом конвертировал?
                          • 0
                            открыл в Notepad++ и выбрал UTF-8 без BOM
                • –7
                  >> статья написана не мной, а моим другом с адресом RReverser@gmail.com, которому не помешал бы инвайт.
                  Вы наверное забыли недавнее послание хабраголоса: опубликовал чужую статью — потерял аккаунт
                  • +1
                    Огромное спасибо!!! Это находка для меня.
                    • 0
                      я в коментах к вышеупомянутой статье про экспорт уже писал что есть еще перловый скрипт
                      писал давно… для себя… и недавно обнаружил баг, исправление коммитить лень)
                      code.google.com/p/gangsta-geek/source/browse/#svn/trunk
                      • 0
                        кстати ему уже два года)
                        • 0
                          Да, его я тоже тогда пробовал. Баги аналогичные яваскриптовому) Поэтому и создал решение на чистом OpenAPI.
                          • 0
                            > ограничение в одного человека на день
                            ага… замена в транке не появившаяся))
                            <div class='calPic' id='([^>]*?)pic\d+' (?:style=\'display:none\')?>

                        • +1
                          Теперь в Новостях AJAX, можете возвращаться.
                          • –1
                            Извините, вы это к чему?
                            • +1
                              К первому зачеркнутому. Или это читать не надо было?
                              • –1
                                Новости здесь вообще ни при чем. И я как раз писал, что календарь использовал AJAX, но с ним были проблемы.
                          • 0
                            Только сегодня искал подобный скрипт, спасибо! Проблема — в файле и при импорте в outlook все имена вида «8<>E0, что делаю не так?
                            • +1
                              Кнопка сохранения — чисто экспериментальная, могут быть проблемы. Лучше, конечно, сохранять вручную.
                              А какой браузер, если не секрет?
                              • 0
                                вручную такая же борода
                                браузер: сафари
                                импорт календаря в гуглкалендарь через оперу.

                                и, да, в опере у меня вообще нету никакой реакции после логина

                                • 0
                                  Странно. У меня как раз Опера, на ней в основном тестил. Все работает как часы.
                                  В Хроме тоже. Даже в ИЕ9.
                                  В сафари не пробовал.
                                • 0
                                  Опера. Вручную все в порядке, не додумался сразу проверить. Спасибо еще раз :)
                                • 0
                                  У Вас проблемы с кодировкой. Откройте полученный файл в редакторе и принудительно укажите кодировку UTF-8.
                                  • 0
                                    ага, тока первые буквы имён это уже не вернёт
                                    • 0
                                      Почему это не вернет? Всё нормально конвертируется.
                                      • 0
                                        ну у меня первые буковки имён «побиты»
                                • 0
                                  Добавил кнопочку для server-side сохранения (если экспериментальная не работает).
                                  • +1
                                    хм… я ж надеюс этот скрипт не парсит ДР кого-то из вконтакте на день раньше как вконтакт любит показывать.
                                    А то ситуациая типа
                                    — С днюхой тебя!
                                    — Так у меня ж завтра
                                    — Ой,… тогда с наступающим тебя!
                                    уже достают.
                                    • 0
                                      Это, кажется, приколы с разницей часовых поясов. Контакт не обрабатывает нормально часовой пояс.
                                    • 0
                                      говноконтакт — зло!

                                      если там ещё и фио светится де факто распространение персональных данных!

                                      с нетерпение жду 1 января 2011 года =)
                                      www.rg.ru/2006/07/29/personaljnye-dannye-dok.html
                                      • 0
                                        С общим выражением согласен, но не с аргументом. Светится только то, что ты сам указал. Хочешь — укажи что-то левое, и все. А то, что они против — тебя беспокоить не должно. Меня по крайней мере совесть не мучает=)
                                      • +7
                                        «Контакт — зло, но чтобы получать из него дни рождения я написал скрипт, чтобы скачивать музыку я написал скрипт, чтобы добавить фотки к контактам в телефон, я написал скрипт, чтобы задать вопрос гоблину, я скачал приложение на андроид и через него написал гоблину.»

                                        Господа, вам не надоело?
                                        Если вы не умеете управлять своим временем и не можете пройти мимо игры Счастливый фермер — это ваша проблема.

                                        Скрипт действительно полезный, но неужели нельзя было воздержаться от критики этой социальной сети?

                                        Заметьте, только благодаря Контакту у вас есть, где спарсить дни рождения.
                                        • 0
                                          «Заметьте, только благодаря Контакту у вас есть, где спарсить дни рождения.»

                                          Не совсем. Это связано лишь с тем, что продолжительный час общался только через него. Если б сразу все дела и отношения вел через скайп/джабер/icq — было бы сейчас все отлично.

                                          Но раз уж был какой-то сервис, которым раньше пользовался (не обязательно контакт, вообще), то уходить надо, ничего не теряя — ни контактов, ни музыки, ни фоток=)
                                          • 0
                                            «Заметьте, только благодаря Контакту у вас есть, где спарсить дни рождения.» дни рождения и без говноконтактов помню. Мама пожилая, по этому записывает в блокноте =) Если я и забуду кого, я у неё спрошу.
                                          • 0
                                            Обработано 0 мероприятий.
                                            Не удалось импортировать мероприятия: Загруженный файл пуст.
                                            • +1
                                              Как загружали? Вы хоть залогигились сперва через кнопочку или пустой textarea сохраняли?
                                              • 0
                                                Логинился. Код видел. Пробовал обе кнопки под ним.
                                                • 0
                                                  Обе не работают? Или только экспериментальная?
                                                  В крайнем случае, выберите самый надежный способ — сохранение вручную. Проблем во всех случаях избежать невозможно.
                                            • 0
                                              Слегка переделав скрипт — можно получить свои контакты в VCARD.
                                              Тогда, при импорте и объединении контактов, можно получить напоминания о днях рождения в календаре, любезно заготовленном Google.
                                              Такой вариант оказался для меня более удобным, т.к. часть контактов уже имела в свойствах дни рождения
                                              • 0
                                                Возможно. Но большинству, думаю, все же удобнее импортировать все дни рождения разом. Вдруг что — удалить отдельные не проблема. А вот импортировать в тот же Google Calendar VCARD-ы уже не так просто.
                                                В конце-концов, скрипт писался RReverser-ом для личного пользования, и уже потом был выложен на публику:)
                                                • 0
                                                  Vcard нужно загрузить в гмайл, а google автоматом вытянет все дни рождения контактов в календарь.
                                                  Возможно, так действительно было бы удобнее.
                                                  • 0
                                                    Возможно. Если будут пожелания — сделаю так. Вообще, был бы нормальный хостинг, можно было бы и аналог OpenGraph сделать (не по визуальным фишкам, а чисто по удобству доступа к API).
                                              • 0
                                                • 0
                                                  Вы опять осилили только заголовок статьи?
                                                  • 0
                                                    «Опять» это не ко мне.
                                                    Я не уверен, что это тоже самое. Не трогайте меня, я дизайнер))
                                                • 0
                                                  Контакты импортировались. На полноту данные не проверял.
                                                  Но, корректно отображаются только контакты на латинице, русский язык представляется из себя иероглифы. Например, "Àëåêñàíäð Öûãàíîâ".
                                                  • 0
                                                    Извините, выше не заметил, что надо перекодировать в UTF.
                                                    Все нормально теперь отображается.
                                                  • –1
                                                    а что вместо русских буков — крякозябры?????
                                                    • 0
                                                      Идея интересная, мне лично хочется попробовать настроить такое на своем хостинге.
                                                      Подскажите пожалуйста, страничку html я создал, но там кнопка вкотакте не активная, я понял, что нужно создать свое приложение или куда то надо подставить свои ключи… можно тут поподробней.
                                                      В заранее спасибо
                                                      • 0
                                                        Нужно создать сайт-приложение вконтакте ( vkontakte.ru/apps.php?act=add&site=1 ), настроить его на свой сайт, скопировать с вкладки «Настройки» код приложения и вставить вместо APP_ID.
                                                        • 0
                                                          Кстати, страницу возьмите из новой ссылки pastebin-а, там уже кое-что исправлено.
                                                        • 0
                                                          Не знаю, я в валидности, техничности и прочих професионально-специальных аспектах решения данной задачи не шарю, а просто хочу сказать огромное человеческое спасибо!
                                                          • 0
                                                            Спасибо! Отлично работает!!!
                                                            Жду когда появится у VkontakteSync для android…
                                                            • 0
                                                              А нет желания, раз уж вы разбирались с API контакта и гугла, сделать кнопочку загрузки фоток вконтактик из Picasa?
                                                              • 0
                                                                Как-то не очень) К тому же, аплоудинг через API не получится, только «в лоб».
                                                              • 0
                                                                Все получилось, спасибо!
                                                                Еще бы как то теперь контакты из вконтакта в гуглоконтакты (тавтология какая-то:) )
                                                                • 0
                                                                  Скоро будет. Уже есть возможность, есть запросы, осталось найти время)
                                                                • 0
                                                                  Кто-нибудь может помочь собрать адреса ЖЖ френдов из поля «веб-сайт»?
                                                                  Френдов много, вручную всех перепроверять нет возможности.
                                                                  • 0
                                                                    Все за отдельную плату)
                                                                    • 0
                                                                      Эх, придётся самому тогда. Думал есть какие-то готовые решения
                                                                  • 0
                                                                    Не получилось импортировать все дни рождения, какая-то часть не добавилась=\ Файл конечный весит 60,9кб, и если сохранять кнопкой save — сохраняется с расширением *.ics.part, вручную объем файла остается таким же.
                                                                    • 0
                                                                      Прошу прощения, так как топик создавался еще не от моего аккаунта — не могу исправить адрес. Дело в том, что я перенес рабочую демку вместе с блогом, и теперь ее можно найти по адресу http://rreverser.com/dev/vkcal.htm.

                                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.