В начале декабря мы начали делать небольшой, чисто новогодний проект amd2013.ru. Это конкурс, куда одни люди присылают свои креативные работы, а другие за них голосуют.
Приз — 8 ноутбуков, по одному для лучшей работы в каждом из регионов РФ. В целом — ничего не обычного, многие крупные фирмы устраивают подобные конкурсы, но я хочу рассказать об интересных моментах в реализации.
Во-первых (и это очень важно для меня), проект сделан на MODX Revolution и новом компоненте — Tickets. Это первое боевое применение компонента, «не для себя».
А во-вторых, там будет прикольная история, как мы считали голоса. =)
Добавление работ
По условиям ТЗ, посетители сайта могут добавлять работы на конкурс без регистрации. То есть, в терминологии MODX — неавторизованные юзеры должны создавать страницы сайта. Tickets этого не позволяет, принципиально, поэтому пришлось сделать фоновую регистрацию пользователя, чтобы потом было кем оперировать в системе.
Все работы разбиты на 8 регионов. При добавлении новой, выбор региона подсказывался по ip через сервис ipgeobase.ru. В админке MODX это были 8 разделов секций для тикетов.
На конкурс принимались либо картинки, либо видео, с обязательным условием — собственноручное изготовление. Дизайнеры придумали отображать все работы этакой стеной картинок, то есть, мне нужно было из видео выделять кадр для вывода на главной странице.
Кстати, страница не только главная, но и единственная. То есть, все операции производятся через окошки и ajax запросы.
Видео можно принимать с трех сервисов, каждый из которых генерирует несколько видов ссылок. Конечно, приниматься должны все ссылки, без исключений и ошибок.
Пришлось попотеть, но в итоге, у меня получился симпатичный класс для добычи картинок с Youtube, ruTube и Vimeо. Он не завязан на MODX, можно использовать в любом проекте.
После добавлении работы модератору высылается письмо, с двумя ссылками — утвердить работу, или удалить. При удалении он пишет причину отказа, и она уходить юзеру.
Изначально предполагалась модерация, перед публикацией. Однако, в первый день решили её отключить, ибо поток работ был небольшой.
Запуск
Сайт запускали 17го декабря. То есть, чуть больше чем за две недели дизайнеры умудрились всё нарисовать, верстальщики сверстать, я — написать внутренности, тестировщик проверить и мы поехали!
Ну как, поехали. В пылу работ мы немного забыли про любимый браузер всех верстальщиков — Internet Explorer. Внешне всё было хорошо, а вот форма добавления работа не отправлялись на сервер из за какого-то конфликта jquery.form.js с непонятно чем.
Применили, кажется, Ajax uploader — и всё наладилось.
Так же, как я уже говорил, мы отключили премодерацию и заодно — пагинацию (разбивку на страницы), что было связано с дизайнерскими заморочками. Оба этих 2 момента нам еще аукнутся.
Голосование
Самое основное в любом конкурсе — возможность голосовать за участников. В конкурсе были доступны голосования через 3 социальных сервиса Facebook, Vkontakte и Twitter, а также по email — специально для будущих накруток.
Общение с сервисами я сделал через HybridAuth. Мне он так понравился, что после работ над сайтом первым делом я написал компонент для авторизации в MODX с его помощью.
Было принято решение собирать все голоса, а при подведении результатов исключать накрутки. И тут вылезла первая проблема — накрутки пошли со страшной силой. За две недели конкурса на нем проголосовали более 80 000 раз!
Голосование по почте было устроено максимально просто: вводишь адрес и тебе приходит ссылка с уникальным кодом.
Переходишь по ней — и голос активируется.
Логично, что все накрутчики сконцентрировались именно на ней. Отсюда — 70 000 голосов через почту. Представили, да?
То есть, реальных голосов менее 10 000, что уже более-менее походит на правду.
Из за простоты накрутки, и того факта, что голоса не обнулялись в процессе конкурса, накрутчики окончательно потеряли совесть. Дошло до того, что они начали вешать похабные картинки с жалобами на других накрутчиков!
А им в ответ появлялись новые картинки, со скриншотами их работ, где за 15 минут 1000 голосов.
Короче, это была вакханалия любителей халявы, и мы включили премодерацию обратно.
Подсчет голосов
А вот тут самое смешное. Никто не менял ip адреса!
С одного ip проголосовали более 30 000 раз, с другого — 7000 раз и так далее. Из-за явной легкости накрутки через почту, в плюсе остались только честные люди, которые голосовали всеми семьями и друзьями с разных айпишников и социальных сервисов.
В итоге, выявление основной массы обманщиков вылилось в примитивный SQL запрос:
SELECT `parent`, `ip`, COUNT(`ip`) AS `votes`
FROM `modx_tickets_votes`
GROUP BY `parent` , `ip`
ORDER BY `parent` ASC, `votes` DESC
И мы видим все работы по порядку с айпишниками, которые голосовали, и количеством голосов с каждого ip. Понятно, если с одного ip 20 000 голосов за одну работу — это не совсем нормально.
Поэтому, в данный момент накрутки вычищаются, остальные юзеры проверяются и скоро будет подведен итог конкурса.
Про Tickets
История получилась больше про социальную ловлю обманщиков на конкурсе, а мне бы хотелось еще рассказать, как справился мой компонент Tickets.
Плюсы:
— Благодаря защите через Jevix, ни в одной работе не оказалось ни XSS, ни другой гадости. Взломать сайт через создание ресурса в Tickets вообще пока никому не удалось.
— Сайт не тормозил на обновлении кэша при добавленииредактировании работы, потому что работа с кэшем у тикетов особая.
— Админка MODX не тормозила при большом количестве дочерних ресурсов в категории, потому что у тикетов они не показываются, а выводятся на странице самой категории, списком с разбивкой по страницам.
Минусы:
— В целом, никаких.
Были разве что, тормоза при выводе 250 работ. Помните, я говорил, что мы отключили пагинацию? Так вот, ближе к концу конкурса стало тяжеловато выводить все работы сразу.
Но этот вопрос решился написанием сниппета при помощи одной перспективной утилитки, благодаря чему время вывода главной страницы сократилось до 0,3 сек. Про утилитку и сниппеты на ее основе расскажу как-нибудь в другой раз.
В общем, работой Tickets я абсолютно доволен, и советую его всем юзерам MODX Revolution не только для создания блогов, но и для вывода новостей, комментирования любых ресурсов сайта, и организации подобных конкурсов!
Автор: bezumkin