Как мы делали 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 вообще пока никому не удалось.

  • Сайт не тормозил на обновлении кэша при добавлении\редактировании работы, потому что работа с кэшем у тикетов особая.

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

Минусы:- В целом, никаких.

Были разве что, тормоза при выводе 250 работ. Помните, я говорил, что мы отключили пагинацию? Так вот, ближе к концу конкурса стало тяжеловато выводить все работы сразу.

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

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

← Предыдущая заметка
С наступающим, 2013 годом
Следующая заметка →
Программа поощрения автора
Комментарии (12)
agel_nashЕвгений Борисов
09.01.2013 15:25

Лажанулся я с IP. Не стал прокси подключать, хотя это дело буквально 5 минут. А так, вот сервис какой у меня получился)) http://amd.agelnash.ru/

bezumkinВасилий Наумкин
09.01.2013 15:33

Я очень удивился, когда увидел, что ты не самый мощный накрутчик.

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

agel_nashЕвгений Борисов
09.01.2013 15:47

У меня в кроне стоял скрипт удеражние позиции. Он проверял сколько голосов у меня ближайшего конкурента в окнуге и выходил в отрыв на 130+ голосов. Т.е. если бы с ближайшим конкурентом у меня был разрыв в 10 голосов, то после запуска скрипта я бы вышел опять в открыв 130 голосов. Скрипт в кроне у меня работал каждые 30 минут. В последние пару часов каждые 2 минуты.

Единственно, что я не предусмотрел - отключение вывода числа голосов)) Т.к. конкурентов вдруг не стало, а по умолчанию стояла активация 10 голосов за 1 выполнение, то у меня каждые 2 минуты стало прибавляться 10 голосов. Чухнулся я когда было уже 3500 голосов вместо 1100(( Именно потому я был не самым ярым накрутчиком. Хотя в запасе у меня было 10000 почтовых ящиков + 3000 твиттер аккаунтов + 1000 фэйсбуков.

agel_nashЕвгений Борисов
09.01.2013 15:51

Зато от того конкурса я получил море драйва + готовый инструмент для накрутки любых голосований по e-mail + прочеканые аккаунты на валидность)) Хотя не скрою. Обидно будет, если после чистки голосов победа достанется моему конкуренту. Бог с ним с другими. Но если победит работа "Новый год будет с сыном", то это жесть, т.к. накручивали мы с ним 27-29 числа каждый вечер втечении 3 часов. После последней 3 часовой битвы у моего конкурента не получилось выбраться в лидеры и он остановился на 980 голосах. Так что эта работа 100% накручена. Поэтому в моем федеральном округе должен победить либо я, либо любые другие работы.

vitaly_doshchenkoВиталик Дощенко
09.01.2013 15:56

Ахаха, супер!

Моя б воля — точно бы тебе отдал победу, настоящий "технологичный новый год"

agel_nashЕвгений Борисов
09.01.2013 16:08

УРА. Обнулили работу конкурента. У меня уже давно обнулили и теперь я на 1 месте в своем федеральном округе)) А новый год на самом деле технологичный получился. Чуть позже подготовлю исходники и залью на гитхаб, если кому-то интересно.

bezumkinВасилий Наумкин
09.01.2013 16:24

Поздравляю!

agel_nashЕвгений Борисов
10.01.2013 03:30

Уже не уроа. И поздравлять незачем. Коммент так, для истории.

Andrey Shin
09.01.2013 19:20

При помощи sms защита от накруток не рассматривалась? Интересно, нет ли чего-то в этом роде.

bezumkinВасилий Наумкин
09.01.2013 19:40

Не знаю, в моём ТЗ смс точно не было =).

А так да, идеальный вариант.

Александр Донский
09.01.2013 22:47

Спасибо за статью, интересно почитать как проекты на практике реализируют. Я хочу задать нубский вопрос >но и для вывода новостей вместо getResources?

bezumkinВасилий Наумкин
10.01.2013 12:04

Tickets - это система создания и организации специальных ресурсов, рассчитанная на большие объёмы.

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

bezumkin
Василий Наумкин
09.04.2024 01:45
Ошибка 500 Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи. Во...
futuris
Futuris
04.04.2024 05:56
Я просто немного запутался. Когда в абзаце "Vesp/Core" ты пишешь про "новый trait Fil...
bezumkin
Василий Наумкин
20.03.2024 18:21
Volledig!
Андрей
14.03.2024 10:47
Василий! Как всегда очень круто! Моё почтение!
russelgal
russel gal
09.03.2024 17:17
А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал ...
inetlover
Александр Наумов
27.01.2024 00:06
Василий, спасибо! Извини, тупанул.
bezumkin
Василий Наумкин
22.01.2024 04:43
Давай-давай!
bezumkin
Василий Наумкин
24.12.2023 11:26
Спасибо!
bezumkin
Василий Наумкин
27.11.2023 02:43
Ура!
bezumkin
Василий Наумкин
25.11.2023 08:30
Vesp тянет 2 зависимости: vesp-frontent для фронта и vesp-core для бэкенда. Их можно обновлять, но э...