Пишем скрипт-отчет по лайкам “Вконтакте” для страниц сайта

Давненько я не брал в руки шашек.  Но тут появилась задача сделать сводную таблицу с информацией о том, какую страницу и сколько раз нажали кнопку “мне нравится” на сайте, или, на проф.жаргоне, ” лайкнули страницу”. Страниц минимум полторы тысячи, поэтому ручная работа сразу не рассматривалась. От жадности, а также потому, что в силу слабой ориентации в возможностях API Вконтакта я не мог внятно поставить задачу программисту, я решил накодить скрипт самостоятельно, попутно изучив работу с вконтактовским API.

Все получилось. Результат отдается в виде такой таблицы:

 

Можно сузить выборку до произвольного списка товаров. Показываются ссылки на аккаунты тех, кто лайкал страницы. Удобная получилась штука, в общем. Под катом я поделюсь тонкостями процесса. Слегка по-пролетарски, т.е. местами нецензурно, но это как раз тот случай, когда обсценная лексика будет к месту. Поехали!

Итак, как всякий лентяй, первым делом я полез в Гугл в поисках готового решения. Оттуда я узнал основные моменты работы с API, что есть официальный класс для работы API на PHP, что просто так стучаться к API нельзя, надо зарегистрировать “приложение”. Мой путь начался отсюда, и в итоге все равно привел на официальную страницу документации для разработчиков ВК.

Сначала, конечно, потребовалось навалять в админке форму выбора товаров и построения URL-ов. Дело в том, что виджет лайков, уже не помню почему, был подключен с идентификацией страницы по URL, а не page_id. Помимо путаницы с вариантами доступа, сама генерация урлов в доставшейся мне по наследству колхозной архитектуре проекта – та еще веселуха. Ну это уже знакомые цацки, и со второй-третьей попытки задача была решена. Итак, имеем список URL-ов для проверки, с которым возвращаемся к API.

Пробуем соединиться с сервером API Вконтакта. Для этого надо иметь идентификатор приложения и некий секретный ключ. С ID приложения на первый взгляд все понятно – подключенный сайт имеет таковой, он используется при инициализации виджетов. А вот секретного ключа у подключенного сайта нет. Ну ок, регистрируем новое iframe-приложение. От подключенного сайта без серверной части оно не отличается ничем, но секретный ключ ему выдается. Хуй знает, почему так сделали, спишем на издержки развития проекта.

Настраиваем соединение, коннектимся при помощи официального PHP-класса для работы с API. На самом деле там просто обертка для обращения к серверу при помощи функции file_get_contents() и разбора ответа из JSON в массив. Соответственно, PHP на сервере должен быть собран с поддержкой оного и включенным allow_url_fopen. Не проблема в общем-то, можно переписать это хозяйство для работы через CURL, а ответ получать в XML, если что. Но вообще требования к серверу порядочные люди пишут в документации.

Ладно, соединились худо-бедно. Пробуем получить ответ от API по паре тестовых URL-ов. Возвращается ошибка. Читаем документацию в поисках описания ошибки – а вот хуй. В списке возвращаемых ошибок таковая не значится. Вообще, такое впечатление, что документацию по методу likes.getList писали таджики-наркоманы. Одно построение фразы “Если параметр не задан, то считается, что он равен 100, если не задан параметр friends_only, в противном случае 10.” чего стоит. Последний раз меня так троллили в школе на курсах английского, предлагая точно перевести на инглиш фразу “Никто никогда ничего мне не говорит”.

Текст ошибки, не описанной в документации, гласит: “Invalid item id or page url”.  Комментариев нет. Гугл приводит на “стену” в группе разработчиков, типовой причины ошибки нет. Блять, сами вы инвалиды ебаные, URL у меня валиднее некуда, вот он в окне броузера! Пробую заменить URL на такой же валидный, но другой. Прослеживаю закономерность – ошибка возвращается если на странице с данным URL-лом ноль лайков. Как только ставлю лайк – URL принимается как правильный, и сервер возвращает успешный ответ. Ептвоюмать. Часть “нелайкнутых” URL-ов, что интересно, возвращают успешный ответ с нулем лайков, часть  – ошибку. Почему – хуй его знает, но это хотя бы уже можно описать в обработке результатов. Попутно думаю – а как Вконтакт вообще определяет, valid этот URL или invalid. Ну то есть понятно, если URL отметился в базе лайков, то он валидный, а если нет – вконтакт вообще ничего не может про него знать. А что тогда с валидными URL без лайков? Хуй его знает, документация молчит.

Едем дальше. У меня получилось, что для проверки может быть подготовлено больше двух тысяч УРЛ-ов. Вконтакт разрешает не более трех в секунду.  То есть скрипт должен работать минут 15. В пролете, стало быть, обитатели хостингов, у которых max_execution_time нельзя настроить самому или обойти с помощью set_time_limit(). А если у кого лимитировано время соединения по HTTP – можно поиметь 504-ую ошибку. Обходом проблем может быть ручная работа с буфером выдачи в PHP или динамическое рисование страницы с отчетом при помощи AJAX – можно даже красивые прогресс-бары рисовать, но я обошелся обычным echo в скрипте и паузой usleep() после каждого третьего запроса. Оставил, так сказать, поле для оптимизации – можно считать, сколько запросов за секунду уже состоялось, и делать паузу только если она еще не закончилась – это может дать некоторый прирост в скорости.

Ок, лайки посчитали. Теперь хочется показать, кто конкретно залайкал ту или иную страницу, составить представление о посетителях. Метод likes.getList такую возможность дает, но, как уже привычно, через жопу. Дело в том, что есть просто лайки, а есть лайки с размещением информации об этом на стене – галка “рассказать друзьям” в виджете. Как же мне хотелось сделать строку с инфой вида “20 лайков, из них 12 с инфой на стене”, или “2 лайка, от Пети и Маши, Петя просто лайкнул, а Маша лайкнула и рассказала друзьям”. Но тут вспоминается нетленное:
 –  Вовочка, выбирай кого выебать – один раз Машу или два раза Петю?
 –  Ну знаете…  Маша – конечно Маша, но два раза – это два раза!
Не позволяет метод получить такую инфу в один запрос к серверу. Либо всех, либо рассказавших друзьям. И даже итоговых цифр типа “всего 20, рассказало 12″ – тоже в один проход не получить. Похую были программисту аналитического метода API задачи аналитиков. Два раза в случае построения отчета по тысячам страниц – непозволительная роскошь.

Такие дела. Наверное, у больших и толстых разработчиков модных ныне систем отслеживания репутации бренда в соц.сетях есть договоренность с хозяевами последних об отдельном API, с блэкджеком, шлюхами, адекватными методами и чудесной документацией. Но пока даже у лидера отрасли в части интеграции с разработчиками творится ебаный пиздец.

Но несмотря на все преграды – задача решена успешно. Лайки исправно считаются.

1 ответ к “Пишем скрипт-отчет по лайкам “Вконтакте” для страниц сайта”

  1. Alexander Krasilnikov says:

    Ой как знакомо:)
    Особенно приятно натыкаться на устаревшие методы о чем в документации ни слова. А ты как макака с гранатой пляшешь вокруг.

Написать ответ

*
Введите латинские буквы\цифры, показанные на картинке
Anti-Spam Image