Search
Write a publication
Pull to refresh

Накручиваем PollDaddy.com. Битва за iPad в 4-ех действиях

Reading time9 min
Views2.9K
iPad

1. Предистория


Вот уже некоторое время я наблюдаю за развитием стартапа friendsaround.me. Идея стартапа это запустить социальную сеть для владельцев мобильных утройств с привязкой к местоположению. Сейчас как я понимаю они все еще в процессе разработки — ну не суть. Наблюдаю я достаточно пассивно и поэтому только 7 марта обнаружил, что они проводят конкурс на лучший слоган для их продукта с главным и единственным призом в виде iPad (а точнее iTunes gift карты на необходимую для его покупки сумму). Конкурс заканчивался сообственно 7 марта и я, предварительно посмотрев на текущие присланные варианты (и не найдя ни одного понравившегося), решил тоже попытать, так сказать, счастья. После нескольких минут креативного раздумья в голове вертелось несколько вариантов, из которых я остановился на слогане «Locate Friendship!» (А че — подумал я — коротко, ясно и по делу. Отличный слоган!). Его и послал на участие…


2. История


На следующий день выяснилось что мой слоган меня не подвел и оказался в финале — вот это успех :)!
Финал представлял из себя голосование, в котором всем желающим предлагалось выбрать наиболее понравившийся слоган из 10 финалистов. Голосование было сделано через сервис polldaddy.com, главная задача, которого и заключалась собственно в проведении различного вида головалок. Поэтому я понадеясь (наивно) на честную борьбу стал активно рассылать агитационные сообщения друзьям типа «Чуваки, поддержите мой выдающийся слоган!». «Чуваки» поддерживали (спасибо вам, кстати, если читаете) и столбик голосов рядом с моим вариантом постепенно пополз вверх, а в голове уже стали появляться противоречивые мысли из серии «Хм, ну и зачем мне нужен еще один айфон?! Лучше добавлю денег и куплю тогда уж сразу макбук!!! Хм, хотя зачем мне макбук?!)». Но тут меня ожидало первое разочарование…

Совершенно без задней мысли решил в очередной раз посмотреть текуший результат госования. Посмотреть результаты тогда представлялось возможным только с помощью повторного голования (так как кнопочку «show results» я заметил не сразу), которое приводило на страницу с на где вежливо сообщалось, что повторное голосование невозможно, но при этом показывался текущий результат. Каково же было мое удивление, когда в очередной раз зайдя на эту страницу, я неожиданно увидел надпись «Thank you for voting!». «Ааа, наверное это из-за того, что браузер другой… Но неужели они не блокируют по IP» — мелькнуло в голове — «Ну как же так?!». Попробовал с третьего браузера — еще плюс голос — наверное значит блокируют от повторного голосования по cookie… Открыл хром в ингогнито режиме (вроде не должен сохранять cookie) — так и есть. При этом судя по характеру прибавления головов у другого участника стало понятно, что данное открытие принадлежит не только мне.
Сидеть и тупо накручивать голоса открыванием и закрыванием браузера абсолютно не хотелось, поэтому честно написав администрации конкурса о моем открытии, продолжил агитировать друзей. При этом моим главным аргументом для продолжения участия, была надежда то, что все таки организаторы, люди, которые занимаються веб/мобильной разработкой (и даже скоро собираются запускать стартап) должны понимать, что в таком виде как сейчас голосование теряет смысл еще не начавшись. «Наверное они все же записывают IP и хотят просто таким образом сразу узнать всех накрутчиков и пресечь их желание придумать более сложно отслеживаемый способ накрутки конкурса» — опять же наивно подумал я…

Тем временем к концу второго дня финала конкурса (9 марта) мой слоган вышел на второе место и потихоньку приближался к первому (который по моим ощущениям (как оказалось верным), как раз накручивал, причем накручивал вручную (у меня 120 голосов у него 140, через 3 часа у меня 139 у него все те же 140, но через 5 минут уже 160)). По условиям конкурса победителем объявлялся участник с наибольшим количеством голосов на «10 марта». Я подозревал, что «10 марта» это на самом деле 00 часов 00 минут 11 марта, но понимая, что это можно понять двояко и необычные движения возможны уже этой ночью, на всякий случай сделал скриншот:



Проснувшись на следующее утро, я понял что нервы у ребят все таки не выдержали и картинка уже выглядела следующим образом:



Как оказалось, порядка 3-ех с половиной тысяч человек (из 4100 всего проголосовавших на тот момент) никак не могли обрести покой той ночью не проголосовав за свой любимый слоган.
Самое забавное, что при всей абсурдности ситуации участники свято верили в свою «честную» победу и чтобы никто ничего не заподозрил(!) не отрывались друг от друга более чем на 50-100 голосов…

В этот момент я решил посмотреть, что же из себя представляет сервис PollDaddy.com «с той стороны» и зарегистрировался на нем (благо регистрация была бесплатна). А представлял он из себе платную и бесплатную версии. Платная позволяла различными способами отслеживать результаты конкурса, а бесплатная ничего не позволяла и показывала приблизительно ту же информацию, которую и так было видно всем участникам. А еще бесплатная версия добавляла небольшую ссылку на сайт самого PollDaddy.com. Именно ту ссылку которую можно наблюдать на приложенных мною скриншотах.
Администрация конкурса, от которой я ждал хоть какой то реакции на события произошедшие ночью развеяла всю мою в них веру сообщением в твиттере «Ребята! Голосуйте любимый за слоган! Сегодня последний шанс проголосовать!» (здесь немного вольный перевод с английского). Попробовал написать еще раз администации, чтобы они как то прояснили свою позицию на счет накруток и если они по прежнему собираються отдать приз участнику с «наибольшим» количеством голосов несмотря ни на что, я тоже могу попробовать написать свой скрипт. Подождал пару часов ответа не проследовало… Видимо им было все равно кто именно получит пресловутый iPad — слоганы то и так уже есть…

На самом деле в этот момент мне было больше всего было неудобно перед друзьями, которые откликнулись на мою просьбу и проголосовали (а в тот момент еще и писали мне, чтобы я не расстраивался, и, что скорее всего результаты подтасовали). Кроме этого начинал зарождаться спортивный интерес, так как голосования мне не никогда не приходилось накручивать, и как веб-разроботчику было интересно все-таки наконец попробовать (тем более что 2 человека из 10 это уже проделали. 3-ий мне кажется продолжал упорно накручивать голоса руками :) ).
Конечно был еще и альтернативный путь, а именно подождать когда конкурс завершится, приз найдет своего «законного» победителя, а потом вставать в ряды людей борящихся за правду и писать злобные и гневные сообщения в стиле «Нас обманули! Верните iPad законному владельцу!!! У меня было 190 честных голосов!!!!» Так, что под девизом «Может быть меня кто и осудит, но меня среди таких людей не будет», нажал заветную кнопку «View page source»…

3. Накрутка




Все оказалось еще проще, чем я думал. Кнопочка Vote! представляла из себя следующую разметку:

<input type="button" onclick="javascript:vote(2813361,0,1,0,10);" class="button-blue-big" value="Vote!" />

* This source code was highlighted with Source Code Highlighter.


Сама же функция vote() выглядела следующим образом:

function vote(id, poll_other, rand, poll_type, u) {
  var answerString = '';
  var otherText = '';

  for (i = 0; i < document.formPoll.elements.length; i++) {
    if (document.formPoll.elements[i].type == "checkbox" || document.formPoll.elements[i].type == "radio") {
      if (document.formPoll.elements[i].checked) {
        answerString += document.formPoll.elements[i].value + ',';
      }
    }
  }

  if (poll_other == 1) {
    otherText = _$('PDI_OtherText').value;
  }

  if (answerString.length > 0 || otherText.length > 0) {
    location.href = '/vote.php?va=' + u + '&pt=' + poll_type + '&r=' + rand + '&p=' + id + '&a=' + answerString + '&o=' + otherText;
  } else {
    alert( alert_no_answer );
  }


* This source code was highlighted with Source Code Highlighter.


Ну вот, все вроде понятно — берем value(id) отмеченной радио кнопки и посылаем его по нужному адресу вместе с остальными параметрами. Смущала только переменная rand, которая видимо подразумевала какое то случайное значение, но при этом сколько я страницу не перезагружал всегда была равна 0.
После этого оставалось только написать небольшое консольное приложение (я использовал C#), которое генерирует HTTP GET request и посылает его по тому же адресу.

static void Main(string[] args)
    {
      int repeat = (args.Length > 0) ? int.Parse(args[0]) : 1;
      int sleepTime = 2000; //2 sec
      int rand = 0;
      string userAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2";
      int pollid = 2812840;
      int voting_id = 13304535;

      for (int i = 0; i < repeat; i++)
      {
        Console.Write(i + " - ");
        string query = "http://polldaddy.com/vote.php?va=10&pt=0&r=" + rand + "&p=" + pollid + "&a=" + voting_id + ",&o=";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(query);
        request.UserAgent = userAgent;
        HttpWebResponse response;
        response = (HttpWebResponse)request.GetResponse();
        Console.Write(response.StatusCode);
        Console.WriteLine(". Waiting " + sleepTime/1000 + " seconds");
        Thread.Sleep(sleepTime);
      }
      Console.WriteLine("Done");
      Console.ReadKey();
    }


* This source code was highlighted with Source Code Highlighter.


Написал. На всякий случай поставил паузу между запросами 2 секунды. Запускаю: первый запрос — ОК, второй запрос — ОК, третий запрос — operation has timed out. Че за фигня?! Запускаю опять — то же самое — третий request не проходит. Увеличил паузу между запросами до 10 секунд. Не помогает. Решил попытаться посмотреть Fiddler'ом, в чем дело:



Fiddler показал, что оказывается первая страница возвращает HTTP результат 302 и перенаправляет на другую, но никаких других различий между запросами я не заметил. Добавил в код request.AllowAutoRedirect = true, чтобы запрос автоматически редиректился (хотя в принципе это должно и так по умолчанию стоять) — опять тот же результат. Удача пришла неожиданно — случайно обнаружилось, что с включенным Fiddler'ом третий запрос проходит на ура (как видно на картинке), а также проходит и четвертый и пятый и т.д. Разбираться в чем разница между запросом который проходит через прокси Fiddler'а и обычным времени не было, главное, что в принципе накрутчик готов. Можно было запускать.

Тем не менее я не хотел останавливаться на таком простом решении, хотелось как то усложнить задачу, тем более, что когда я зарегистрировался на polldaddy.com и создал свое тестовое голование, я видел там все-таки опцию, «Блокировать по cookie и IP», которая по каким то непонятным соображениям была проигнорированна организаторами голосования. Понимая, что они в любой момент могут все таки «обнаружить» эту опцию и таким образом обрубить мой накрутчик, решил заблоговременно подготовиться… Естесвенно заставить запустить мое .NET приложение 10 тысяч человек не представлялось возможным, поэтому стал склоняться к javascript'у, который будет посылать ajax GET Request при загрузке какой нибудь страницы, а потом редиректить на другую с более интересным содержанием. Таким образом можно было бы дать подобную ссылку на каком нибудь популярном ресурсе и решить проблему блокировки по IP. Сделал такую страницу с помощью jQuery здесь, но она так и не пригодилась в итоге.

4. Конец истории


Накрутчик у меня был готов, когда до конца конкурса оставалось еще приблизительно 7 часов. Играть в сложившуюся в конкурсе игру и выходить на первое место, с преимуществом в 10 голосов показалось глупым. Раз накручивать, так накручивать!!! — подумал я и включил его на максимальную скорость. Через некоторое время запустил накрутку с еще одной машины с другим IP. Приблизительно через полчаса догнал по результатам «лидеров». В этот момент администрация все же проснулась и сделала первое правильное решение в данной истории, а именно отключила возможность просмотра результатов. Еще через 3 часа, когда по моим подсчетам у меня должно было быть порядка 5-6 тысяч голосов, голосование было все же остановлено. Официальная причина, которую они потом озвучили через свой твиттер стало inconsistencies in voting practice.

На следующий день они объявили фактически новый конкурс, который теперь заключается в том, что надо просто тупо написать определенное сообщение в твиттере, а победитель будет выбран случайным образом из написавших. Я сообщение конечно написал, но интереса к этому конкурсу у меня уже практически нет. Можете тоже поучавствовать, кстати, если хотите — http://friendsaround.me/contest (если выиграете нужен будет адрес в США куда доставить приз — если что пишите, могу с этим помочь).

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

UPD: Кстати, я так до сих пор так и не разобрался почему третий и последующий запросы в моем накрутчике проходили только при включенном Fiddler'е, буду признателен если кто-нибудь подскажет причину…
Tags:
Hubs:
Total votes 95: ↑80 and ↓15+65
Comments50

Articles