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

В начале декабря мы начали делать небольшой, чисто новогодний проект http://amd2013.ru. Это конкурс, куда одни люди присылают свои креативные работы, а другие за них голосуют.
Проект заказали студии Simple Dream, а они уже подтянули меня.
Приз - 8 ноутбуков, по одному для лучшей работы в каждом из регионов РФ. В целом - ничего необычного, многие крупные фирмы устраивают подобные конкурсы, но я хочу рассказать об интересных моментах в реализации.
Во-первых (и это очень важно для меня), проект сделан на Tickets. Это первое боевое применение компонента, "не для себя". А во-вторых, там будет прикольная история, как мы считали голоса.

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

По условиям ТЗ, посетители сайта могут добавлять работы на конкурс без регистрации. То есть, в терминологии MODX - неавторизованные юзеры должны создавать страницы сайта. Tickets этого не позволяет, принципиально, поэтому пришлось сделать фоновую регистрацию пользователя, чтобы потом было кем оперировать в системе.
Все работы разбиты на 8 регионов. При добавлении новой, выбор региона подсказывался по ip через сервис http://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 вообще пока никому не удалось.
Минусы:- В целом, никаких.
Были разве что, тормоза при выводе 250 работ. Помните, я говорил, что мы отключили пагинацию? Так вот, ближе к концу конкурса стало тяжеловато выводить все работы сразу.
Но этот вопрос решился написанием сниппета при помощи перспективной утилитки pdoTools, благодаря чему время вывода главной страницы сократилось до 0,3 сек.
В общем, работой Tickets я абсолютно доволен, и советую его всем юзерам MODX Revolution не только для создания блогов, но и для вывода новостей, комментирования любых ресурсов сайта, и организации подобных конкурсов!

12 комментариев

Евгений Борисов
Лажанулся я с IP. Не стал прокси подключать, хотя это дело буквально 5 минут. А так, вот сервис какой у меня получился)) http://amd.agelnash.ru/
Василий Наумкин
Я очень удивился, когда увидел, что ты не самый мощный накрутчик.
Самый мощный 30 000 голосов с одного Ip накрутил.
Евгений Борисов
У меня в кроне стоял скрипт удеражние позиции. Он проверял сколько голосов у меня ближайшего конкурента в окнуге и выходил в отрыв на 130+ голосов. Т.е. если бы с ближайшим конкурентом у меня был разрыв в 10 голосов, то после запуска скрипта я бы вышел опять в открыв 130 голосов. Скрипт в кроне у меня работал каждые 30 минут. В последние пару часов каждые 2 минуты.
Единственно, что я не предусмотрел - отключение вывода числа голосов)) Т.к. конкурентов вдруг не стало, а по умолчанию стояла активация 10 голосов за 1 выполнение, то у меня каждые 2 минуты стало прибавляться 10 голосов. Чухнулся я когда было уже 3500 голосов вместо 1100(( Именно потому я был не самым ярым накрутчиком. Хотя в запасе у меня было 10000 почтовых ящиков + 3000 твиттер аккаунтов + 1000 фэйсбуков.
Евгений Борисов
Зато от того конкурса я получил море драйва + готовый инструмент для накрутки любых голосований по e-mail + прочеканые аккаунты на валидность)) Хотя не скрою. Обидно будет, если после чистки голосов победа достанется моему конкуренту. Бог с ним с другими. Но если победит работа "Новый год будет с сыном", то это жесть, т.к. накручивали мы с ним 27-29 числа каждый вечер втечении 3 часов. После последней 3 часовой битвы у моего конкурента не получилось выбраться в лидеры и он остановился на 980 голосах. Так что эта работа 100% накручена. Поэтому в моем федеральном округе должен победить либо я, либо любые другие работы.
Виталик Дощенко
Ахаха, супер!
Моя б воля — точно бы тебе отдал победу, настоящий "технологичный новый год"
Евгений Борисов
УРА. Обнулили работу конкурента. У меня уже давно обнулили и теперь я на 1 месте в своем федеральном округе)) А новый год на самом деле технологичный получился. Чуть позже подготовлю исходники и залью на гитхаб, если кому-то интересно.
Василий Наумкин
Поздравляю!
Евгений Борисов
Уже не уроа. И поздравлять незачем. Коммент так, для истории.
При помощи sms защита от накруток не рассматривалась? Интересно, нет ли чего-то в этом роде.
Василий Наумкин
Не знаю, в моём ТЗ смс точно не было =).
А так да, идеальный вариант.
Александр Донский
Спасибо за статью, интересно почитать как проекты на практике реализируют. Я хочу задать нубский вопрос >но и для вывода новостей вместо getResources?
Василий Наумкин
Tickets - это система создания и организации специальных ресурсов, рассчитанная на большие объёмы.
Выводить эти ресурсы можно по разному, в том числе, и через getResources. Основные особенности Tickets расписаны тут.
bezumkin.ru
Personal website of Vasily Naumkin
Прямой эфир
Александр Наумов
23.07.2024, 00:20:37
Василий, спасибо большое!!
Василий Наумкин
01.07.2024, 11:56:41
Да, верно, именно так. А в контроллере, скорее всего, ловить данные методом post.
Василий Наумкин
26.06.2024, 09:38:15
О, точно, вылезает если не залогинен. Спасибо, исправил!
Василий Наумкин
09.04.2024, 04:45:01
> Ошибка 500 Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи. ...
Василий Наумкин
20.03.2024, 21:21:52
Volledig!
Андрей
14.03.2024, 13:47:10
Василий! Как всегда очень круто! Моё почтение!
russel gal
09.03.2024, 20:17:18
> А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал...
Александр Наумов
27.01.2024, 03:06:18
Василий, спасибо! Извини, тупанул.
Василий Наумкин
22.01.2024, 07:43:20
Давай-давай!
Василий Наумкин
24.12.2023, 14:26:13
Спасибо!