Меняю электропроигрыватель на электровыигрыватель.


Я хотел бы рассказать немного о роботах. Не о нелепых жестяных манекенах из научной фантастики 60-х, и даже не о современной собачке aibo. А о роботах, доступных каждому прямо сейчас, выполняя святую миссию каждого робота: они облегчают жизнь нам, людям. Не беда, что они не существуют материально. Зато они работают! И те, на кого они работают, оказываются часто в более выигрышном материальном положении. Например, могут выиграть в новогоднем конкурсе от emarket.ua, оказавшимся конкурсом роботов, и не оставляющем шансов для нормальных пользователей из-за неудачной организации.

В понедельник, то есть буквально позавчера, emarket.ua запустил новогодний конкурс. Смысл конкурса состоит в следующем: на страницах с объявлениями есть некие буквы, которые, предположительно, есть в секретном загаданном слове (забегая наперед, хочу сказать, что слово это - "емаркет", и оно не меняется, во всяком случае пока что). При клике на букву (если та еще не захвачена конкурирующим игроком) предлагается ввести captcha-изображение, после чего очко будет зачислено на ваш персональный счет. После этого буква становится неактивной, кликнуть по ней больше нельзя. Два раза в сутки, в полночь и в полдень все неактивные буквы вновь становятся активными. Побеждают те, кто наберет максимальное количество очков.
Уже сегодня, то есть через двое чуток после начала конкурса, количество очков у лидеров перевалило за 1000. Хотите знать, как это возможно?

Краткое руководство по написанию электровыигрывателя для emarket на PHP.
Нам понадобится:

  • интерпретатор PHP (конечно же пятой версии, хотя это в данном конкретном случае не принципиально)
  • веб-сервер (Апач, понятно)
  • браузер (после Апача и ПХП должно быть уже, конечно, понятно, что браузер - это Файрфокс)
  • какая-нибудь маломальски адекватная среда для разработки (vim, emacs, даже notepad.exe на худой конец вполне подойдет)
  • знание и умение PHP (do you php?)
  • аккаунт на emarket.ua

Лучшая импровизация - тщательно отрепетированная загодя
Чтобы имитировать действия пользователя, использующего браузер удобно использовать класс Snoopy, имитирующий браузер. Самого пользователя, а точнее его не слишком сложные действия, будем имитировать программой на PHP.
Итак, буквы видны в объявлениях, залогиненым пользователям. Нужно залогиниться, найти букву, кликнyть по ней. После клика по букве нужно ввести captcha. Повторить.
Такой вот примерно план.

Кто вы, доктор Зорге?
Логин - это, как многие знают, ничего кроме отсылки формы и сохранения идентификатора сессии.
Учим электровыигрыватель логинится:

$account = array ( 'email' => 'login@emarket.ua' , 'password' => 'password' , 'keeploggedin' => 'true' , 'form_submit' => 'yes' ) ;
require_once ('Snoopy.class.php') ;

$snoopy = new Snoopy ( ) ;
$snoopy->agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11)" ;
$snoopy->referer = "http://emarket.ua/my" ;

if (! $snoopy->submit ( 'http://emarket.ua/my/login.php', $account ))
echo $snoopy->error ;

// $snoopy->cookies теперь содержит все полученные в ответ куки, в том числе и PHPSESSID, который и идентифицирует сессию

Чтобы не логиниться каждый раз, можно сохранить куки, и просто подставить их перед началом работы. Мы ведь поставили птичку "Запомнить пароль" (что, кстати, неправильно сформулированно, пароль как раз нигде не сохраняется, оставим это на совести Емаркета)

Контрольный вопрос: может ли Емаркет догадаться, что логинился не живой человек, а электровыигрыватель?
Контрольный ответ: нет.

Wherever I may roam
Теперь перед электровыигрывателем стоит такая задача: ходить по сайту, и искать буквы. На сайте встречается два вида страниц: те, на которых есть буквы, и те, на которых нет. Те на которых есть буквы нам интересны, потому что это могут быть ТЕ буквы, а те, на которых нет букв интересны тем, что на них могут быть ссылки на те, на которых есть. По-моему так.

Если бы я был электровыигрывателем, я бы делал так: на каждой странице кликал по ссылкам, которые ведут на страницы с буквами, а потом бы перешел на другую страницу. Необходимо, как говорится, отделить мух от котлет. Страницы с буквами все имеют в адресе подстроку "/browse/". Страницы, на которых есть ссылки на страницы с буквами, как правило, имеют вид "/kakaya-to-krutaya-stranitsa_1235". Удобно, не правда ли?

Сначала посмотрим, какие есть на главной странице ссылки:

$snoopy->fetchlinks ( 'http://emarket.ua' ) ;
// попробуем отделить мух от котлет
$pages = array();
$items = array();
foreach ( $snoopy->results as $lnk ) {
// мухи!
if (false !== strpos ( $lnk, 'javascript' )) {
continue ;
}
// котлеты!
if (false !== strpos ( $lnk, '/browse/' )) {
$items [] = $lnk ;
}
// там, возможно, есть котлеты
elseif (preg_match ( '/(\/[^_^\/]+_\d+)/', $lnk )) {
$pages [] = $lnk ;
}
}

Так, теперь надо собрать котлеты и пойти на какую-нибудь другую страницу.
Котлеты бывают трех видов: правильные (буква, не взятая никем, которая есть в слове ЕМАРКЕТ), съедобные, но неправильные (которой нет в слове ЕМАРКЕТ) и тухлые (которые уже кто-то нашел).

Занимательная котлетология
Первая аксиома котлетоведения: если котлета тухлая, ее нельзя есть. То есть - букву, которую можно кликнуть, от буквы, которую уже кто-то взял отличает наличие характерной ссылки, в теле которой есть подстрока find_letters.
Вторая аксиона котлетоведения: мы знаем, какое слово, поэтому можем отличить правильную котлету от неправильной.


$snoopy->fetch ( $url ) ;
$page = implode ( '', $snoopy->results ) ;
if (false !== strpos ( $page, 'find_letters' )){
preg_match ( '/Times\sNew\sRoman;">(\w)</', $page, $letter ) ;
if (in_array($letter[1], array('Е','М','А','Р','К','Т'))){
// типа ура
preg_match ( '/"(\/my\/find_letters[^"]*)"/', $page, $link ) ;
$link = 'http://emarket.ua' . $link [ 1 ] ;
}
else
{
// неправильная котлета
}
}
else
{
// тухлая котлета
}

Контрольный вопрос: может ли Емаркет догадаться, что все это делает не живой человек, а электровыигрыватель?
Контрольный ответ: Нет, если правильно подставлять параметр $snoopy->referer, который должен содержать "предыдущий" URL, с которого пришел по ссылке электровыигрыватель. И если скорость с которой он все это будет делать не даст возможности утверждать, что это не в человеческих силах.

Но ведь там сaptcha!
Вот и пришло время дискриминации по видовому признаку. Да, captcha не даст нашему электровыигрывателю быть автоматическим. Но зато он может быть автоматизированным.
Простой выход: брать ссылку, найденную электровыигрывателем, открывать тут же в соседней вкладке браузера (в котором вы должны быть залогинены в емаркет), вводить captcha, и получать очки.
Сложный выход: скрипт должен запросить страницу, скачать картинку, показать ее вам, получить ответ, отправить "форму" на сервер, как в случае с логином.
В первом случае нужно решить вопрос с referer-ом, который будет некрасивым (привет экстеншну RefControl, который умело подменяет referer на то, что скажете). Во втором - возможно, прийдется обрабатывать неправильный ввод captcha.

Единственное что - если открыть две ссылки подряд, то captcha в первой больше не сработает. Потому что программисты Emarket считают, что человек не может найти букву и не ввести для нее captcha немедленно, а продолжать поиски.

Если у вас план, мистер Фикс?
Если у меня план? Есть!
Как обходить сайт по ссылкам - вопрос второй. Можно сначала обойти весь, и составить полный список ссылок. Потом систематично обходить все, выискивая правильные котлеты. Можно изображать пользователя, переходя по ссылкам случайным образом (стараясь, однако не повторяться). Можно воспользоваться поиском, любезно отдающим в ответ сотни объявлений по распространенным словам.

Но.. это же ужасно!
Я написал кое-как работающий электровыигрыватель в первый вечер, он занял у меня полторы сотни строк кода. После полуночи, когда буквы обновились, он находил мне ссылки гораздо быстрее, чем я успевал вводить captcha. Я очень быстро набрал очки. Вы думаете, я опережаю других игроков? Игроков - конечно. Но не другие электровыигрыватели :) Посмотрите на отрыв лидеров (третий день конкурса) - разница на первой десятке уже в разы.

В правилах конкурса никак не регламентируется использование каких-либо программных или аппаратных средств, а скорость роста очков у лидеров не оставляет сомнений в их применении. У наивных пользователей, рьяно ищущих буквы на сайте шансов попросту нет. Это конкурс выносливых программистов, могущих не только написать хороший электровыигрыватель, но и набирать руками много captcha-изображений (если, конечно, они не обнаружили уязвимости, позволяющие избавиться от этого неприятного занятия, или не имеют прямого доступа к коду и данным Емаркета).

Я обратился в Emarket за комментариями по сложившейся ситуации, однако ответа не получил. Насколько я знаю, компания Diawest, являющаяся спонсором конкурса, не слишком обрадуется такой схеме раздачи призов. То, что у нормальных пользователей нет шансов выиграть эти призы совсем не мотивирует их к тому, чтобы активно ходить по сайту, заодно просматривая объявления. Конкурс слабо защищен от роботизации (это сделать не просто, а очень просто! хорошо еще что captcha достойная, иначе было бы совсем грустно), и достаточно слабо продуман идеологически, что и привело в итоге к печальным результатам.

top of hotblogs.org.ua

Комментарии

Капча

Изображение пользователя 7up.

Лёша, вот от кого от кого, а от тебя не ожидал услышать про ручной ввод капчи :)

Изображение пользователя Sniff.

Это хорошая капча. Без балды. Единственный вариант ее обойти - по-китайски. Ну, или что-то знать. Если ты понял, о чем я.

Аплодисменты!

Изображение пользователя belushkin.

Супер, скажу честно! Почерпнул для себя класс снупи!
Емаркету привет! ;)

Изображение пользователя VojToshik.

Кросафчег, що тут ще скажеш...

Изображение пользователя Vano.

Алексей, спасибо за подробную инструкцию, только выкладывать ее на всеобщее обозрение, не дождавшись от нас ответа, наверное не стоило. К сожалению помешать подобной "автоматизации" или избежать ее мы не в состоянии, вы это прекрасно понимаете. Что касается "автоматизаторов", то определить их и дисквалифицировать достаточно легко, что мы и сделали, собрав доказательства. К сожалению подготовкой к этому конкурсу я не занимался, т.к. только приступил к работе в компании, да и опыта проведения подобного рода конкурсов ни у меня, ни у других сотрудников компании не было, но на будущее урок усвоили хороший, за что и вам огромное спасибо.

Изображение пользователя Sniff.

Судя по списку дисквалифицированных, вам удалось дисквалифицировать лишь самые топорные работы.

Изображение пользователя Vano.

мы будем работать над этим ;) есть идеи?

Изображение пользователя Sniff.

Идея в том, что конкурс устроен настолько плохо, что вы физически не сможете выделить талантливо сделанный электровыигрыватель. Пока что могу предложить вам самим в него поиграть, и посмотреть какое количество очков реально выиграть "руками", по-честному. Только не предположить, а именно провести пару часов над этим (вообще, нелишне самим делать то, к чему призываете пользователей, очень помогает). Заодно, кстати, поймете, какие символы надо исключить из капчи и почему.
А когда замеряете, сравните с показателями лидеров - и попробуте найти формальные причины их дисквалифицировать.

Изображение пользователя Vano.

А с чего вы решили, что мы сами не играли в наш конкурс? Играли, просчитывали, знаем. Те люди, которые сейчас находятся на первых местах, вполне реально набирают свои баллы "руками". Статистика просмотренных ими объявлений дает нам право утверждать, что "электровыигрывателями" они не пользуются.

Изображение пользователя Sniff.

Потому что я видел темпы роста некоторых из оставшихся игроков, и соизмерял с человеческими возможностями (а также заодно и с возможностями моего электровыигрывателя). Возможно в последние дни они снизили активность, но на момент написания статьи в этом не было никаких сомнений. Впрочем, это чисто ваши проблемы, ну и конечно компании Диавест, которая, как я думаю, хотела бы честного распределения призов. Лично я вам ничего доказывать не хочу, я лишь отметил слабость, причем даже не вашей системы выявления ботов, но самого устройства конкурса.
Если сами играли, то наверное заметили, что некоторых символы в вашей капче дают милый паразитный эффект, становясь неотличимыми. Я думал, что они там от того, что вы сами не пробовали. Но если вы пробовали, и все равно оставили...

Изображение пользователя Vano.

Далась вам эта компания Диавест?!? или у вас на нее зуб?!? ;) Если бы символы в нашей капче были бы легко отличимыми, то это было бы только на руку вам и другим "автоматизаторам", так что уж извините... Честный игрок легко наберет символы повторно, если с первого раза не отличит, а вот автоматизатору это немного как бы "вломы"...

Изображение пользователя Sniff.

странно вы понимаете разницу между надежностью и читаемостью

Участница конкурса на Emarket

Читаю Ваши комментарии и решила ответить.
Я учасница конкурса на Emarket. Нахожусь на седьмом месте в рейтинге учасников. Хочу сказать, что искала БУКВЫ своими возможностями без использования каких-либо автоматизированныхэ программ (даже не знаю что это такое). За час я могла набрать приблизительно 80БАЛЛОВ(в лучшем случае). Сидела за компьютером день и ночь, за исключением нескольких часов и совершенно не понимаю, как учасники, стоящие выше по рейтингу, набираю так быстро БАЛЛЫ. Некоторые, пример, d_leo26 за полчаса набрал 400 БАЛЛОв (сама проследила). Я написала письмо на Emarket ( я так приполагаю, что Вам) по этому поводу - обещали проверить. ХОТЕЛОСЬ БЫ ЧЕСТНОСТИ, надеюсь, что это возможно.

Это послание настолько же доверяемо, насколько и емейлы от компании Киевстар, в которое они вставляют подпись "Просканировано: файлы вирусов не содержат, можно открывать".

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

P.S.
Что, впрочем, не мешает и вступить в беседу со своим вторым роботом, чтобы выжил третий. :))))
Ох уж эта логика...

Изображение пользователя Sniff.

Роботы непобедимы! Слава роботам!

Слава!

Зря Вы так. Почему Вы всех под одну гребенку. Вам с трудом верится, что человек может сидеть днями и ночами, зарабатывать БАЛЛЫ для ПОБЕДЫ? Поверьте - это так. И никакого ни первого, ни второго робота с моей стороны не было. Я не знаю про других участников (использовали они роботов или нет, о которых Вы все говорите) - вполне возможно, к сожалению Emarket не может до конца это выяснить, но у меня совесть чиста. Не верите? Не верьте - Ваши проблемы. Что- то Вам доакзывать - безсмысленно, да и незачем.

Участница конкурса на Emarket

Читаю Ваши комментарии и решила ответить.
Я учасница конкурса на Emarket. Нахожусь на седьмом месте в рейтинге учасников. Хочу сказать, что искала БУКВЫ своими возможностями без использования каких-либо автоматизированныхэ программ (даже не знаю что это такое). За час я могла набрать приблизительно 80БАЛЛОВ(в лучшем случае). Сидела за компьютером день и ночь, за исключением нескольких часов и совершенно не понимаю, как учасники, стоящие выше по рейтингу, набираю так быстро БАЛЛЫ. Некоторые, пример, d_leo26 за полчаса набрал 400 БАЛЛОв (сама проследила). Я написала письмо на Emarket по этому поводу - обещали проверить. ХОТЕЛОСЬ БЫ ЧЕСТНОСТИ, надеюсь, что это возможно.

Изображение пользователя maserg.

та то не их капча... http://www.captcha.ru/kcaptcha/

можно съэкономить лвиную долю времени (как кодинга,так и взлома) сгенерив карту сайта (хоть у себя локальной програмкой, или любым онлайн сервисом). первое даже лучше, ибо многопотоковое (главное не задосить сайт :).
потом из карты берём всё "/browse/" и понеслась. теоретически даже пхп не нужен, можно шелом обойтись :)

Смайлик ^_^ в регекспе порадовал ;)

А капча-таки ломается. Но об этом после Нового года.

Изображение пользователя Sniff.

Именно капча, или программная обвязка? Если ты о именно картинке - я немало удивлен.

Капча. Очень сложно, не замерял - но примерно в 1/10 - 1/20 случаев. Поскольку ее можно вводить неоднократно, то для робота это вполне достаточно (когда трафика не жалко).

Спасибо компании emarket за хорошие призы :) Роботы победили!

Изображение пользователя Sniff.

покажи программу?

Кусок распознавания капчи? Без проблем, оно под Win - на рождественских каникулах подключу каким-нибудь образом для запросов онлайн.

Изображение пользователя Sniff.

Заинтригован, жду.

В 1/10 случаев определяет или ошибается?:)

Изображение пользователя Vano.

Так призы мы еще не вручили, рано радуешься ;) Хотя верится в победу роботов все-таки с трудом... где доказательства?!?

Вы ошиблись, я на стороне роботов ;)
Слава!