Как мы делали amd2013.ru

В начале декабря мы начали делать небольшой, чисто новогодний проект amd2013.ru. Это конкурс, куда одни люди присылают свои креативные работы, а другие за них голосуют.

Проект заказали студии Simple Dream, а они уже подтянули меня.

Приз — 8 ноутбуков, по одному для лучшей работы в каждом из регионов РФ. В целом — ничего необычного, многие крупные фирмы устраивают подобные конкурсы, но я хочу рассказать об интересных моментах в реализации.



Во-первых (и это очень важно для меня), проект сделан на Tickets. Это первое боевое применение компонента, «не для себя».
А во-вторых, там будет прикольная история, как мы считали голоса.

Добавление работ

По условиям ТЗ, посетители сайта могут добавлять работы на конкурс без регистрации. То есть, в терминологии MODX — неавторизованные юзеры должны создавать страницы сайта. Tickets этого не позволяет, принципиально, поэтому пришлось сделать фоновую регистрацию пользователя, чтобы потом было кем оперировать в системе.


Все работы разбиты на 8 регионов. При добавлении новой, выбор региона подсказывался по ip через сервис ipgeobase.ru. В админке MODX это были 8 разделов секций для тикетов.



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


Кстати, страница не только главная, но и единственная. То есть, все операции производятся через окошки и ajax запросы. Для того, чтобы окошки можно было открывать по прямым ссылкам — я написал такую штучку.

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

Пришлось попотеть, но в итоге, у меня получился симпатичный класс для добычи картинок с Youtube, ruTube и Vimeо. Он не завязан на MODX, можно использовать в любом проекте.

После добавлении работы модератору высылается письмо, с двумя ссылками — утвердить работу, или удалить. При удалении он пишет причину отказа, и она уходит юзеру.
Изначально предполагалась модерация, перед публикацией. Однако, в первый день решили её отключить, ибо поток работ был небольшой.

Запуск

Сайт запускали 17го декабря. То есть, чуть больше чем за две недели дизайнеры умудрились всё нарисовать, верстальщики сверстать, я — написать внутренности, тестировщик проверить и мы поехали!

Ну как, поехали. В пылу работ мы немного забыли про любимый браузер всех верстальщиков — Internet Explorer. Внешне всё было хорошо, а вот форма добавления работа не отправлялись на сервер из за какого-то конфликта jquery.form.js с непонятно чем.
Применили, кажется, Ajax uploader — и всё наладилось.

Представляете, да, как пришлось парням из Simple Dream это всё разруливать и в какие сроки? В такие моменты я счастлив, что являюсь обычным программистом, а не владельцем веб-студии. Им геморой — а мне премии за скоростную работу в выходные =)

Как я уже говорил, мы отключили премодерацию и заодно — пагинацию (разбивку на страницы), что было связано с дизайнерскими заморочками. Оба этих 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 работ. Помните, я говорил, что мы отключили пагинацию? Так вот, ближе к концу конкурса стало тяжеловато выводить все работы сразу.

Но этот вопрос решился написанием сниппета при помощи перспективной утилитки pdoTools, благодаря чему время вывода главной страницы сократилось до 0,3 сек.

В общем, работой Tickets я абсолютно доволен, и советую его всем юзерам MODX Revolution не только для создания блогов, но и для вывода новостей, комментирования любых ресурсов сайта, и организации подобных конкурсов!

Следующая заметка
Программа поощрения автора
Предыдущая заметка
С наступающим, 2013 годом


Комментарии ()

  1. Евгений Борисов 09 января 2013, 15:25 # 0
    Лажанулся я с IP. Не стал прокси подключать, хотя это дело буквально 5 минут.
    А так, вот сервис какой у меня получился)) amd.agelnash.ru/
    1. Василий Наумкин 09 января 2013, 15:33 # 0
      Я очень удивился, когда увидел, что ты не самый мощный накрутчик.

      Самый мощный 30 000 голосов с одного Ip накрутил.

      1. Евгений Борисов 09 января 2013, 15:47 # 0
        У меня в кроне стоял скрипт удеражние позиции. Он проверял сколько голосов у меня ближайшего конкурента в окнуге и выходил в отрыв на 130+ голосов. Т.е. если бы с ближайшим конкурентом у меня был разрыв в 10 голосов, то после запуска скрипта я бы вышел опять в открыв 130 голосов. Скрипт в кроне у меня работал каждые 30 минут. В последние пару часов каждые 2 минуты.

        Единственно, что я не предусмотрел — отключение вывода числа голосов)) Т.к. конкурентов вдруг не стало, а по умолчанию стояла активация 10 голосов за 1 выполнение, то у меня каждые 2 минуты стало прибавляться 10 голосов. Чухнулся я когда было уже 3500 голосов вместо 1100(( Именно потому я был не самым ярым накрутчиком. Хотя в запасе у меня было 10000 почтовых ящиков + 3000 твиттер аккаунтов + 1000 фэйсбуков.
        1. Евгений Борисов 09 января 2013, 15:51 # 0
          Зато от того конкурса я получил море драйва + готовый инструмент для накрутки любых голосований по e-mail + прочеканые аккаунты на валидность))
          Хотя не скрою. Обидно будет, если после чистки голосов победа достанется моему конкуренту. Бог с ним с другими. Но если победит работа «Новый год будет с сыном», то это жесть, т.к. накручивали мы с ним 27-29 числа каждый вечер втечении 3 часов. После последней 3 часовой битвы у моего конкурента не получилось выбраться в лидеры и он остановился на 980 голосах. Так что эта работа 100% накручена. Поэтому в моем федеральном округе должен победить либо я, либо любые другие работы.
          1. Виталик Дощенко 09 января 2013, 15:56 # 0
            Ахаха, супер!

            Моя б воля — точно бы тебе отдал победу, настоящий «технологичный новый год»
            1. Евгений Борисов 09 января 2013, 16:08 # 0
              УРА. Обнулили работу конкурента. У меня уже давно обнулили и теперь я на 1 месте в своем федеральном округе))
              А новый год на самом деле технологичный получился. Чуть позже подготовлю исходники и залью на гитхаб, если кому-то интересно.
              1. Василий Наумкин 09 января 2013, 16:24 # 0
                Поздравляю!
                1. Евгений Борисов 10 января 2013, 03:30 # 0
                  Уже не уроа. И поздравлять незачем. Коммент так, для истории.
    2. Andrey Shin 09 января 2013, 19:20 # 0
      При помощи sms защита от накруток не рассматривалась? Интересно, нет ли чего-то в этом роде.
      1. Василий Наумкин 09 января 2013, 19:40 # 0
        Не знаю, в моём ТЗ смс точно не было =).

        А так да, идеальный вариант.
      2. Александр Донский 09 января 2013, 22:47 # 0
        Спасибо за статью, интересно почитать как проекты на практике реализируют.
        Я хочу задать нубский вопрос
        >но и для вывода новостей
        вместо getResources?
        1. Василий Наумкин 10 января 2013, 12:04 # 0
          Tickets — это система создания и организации специальных ресурсов, рассчитанная на большие объёмы.

          Выводить эти ресурсы можно по разному, в том числе, и через getResources. Основные особенности Tickets расписаны тут.
        Добавление новых комментариев отключено.