Коды активации для diablo 3. Как я получил ключ к Diablo III Beta

В YouTube роликах ThisIsHorosho с недавних пор стали появляться ключи к Diablo III Beta. В 7-ми минутном ролике на секунду показывается ключ, кто его первый активирует, то и выигрывает. Вот так на стоп кадре выглядит ключ:

Вы подумали о том же, о чем и я?


Всего 10 ключей.

Ключ 1
О первом ключе я не знал и, наверное, никто не знал. Кому-то повезло.

Ключ 2
Ко второму видео был готов самый простой бот, который раз в 10 секунд обновляет страницу с добавленным видео и, если появилось новое видео, то модальное окно в виде алерта сообщает об этом. Выяснилось, что через 4 часа youtube обнаруживает бота и просит его ввести recaptcha, а потом еще каждый час просит ее вводить. Очень не удобно, но я не особо хотел тратить время и писать по-нормальному, так как ожидал, что второй ключ появится как-нибудь по-другому, ну например, хотя бы зелеными буквами. Второй ключ я проморгал, но когда я увидел те же серые цифры и буквы, тем же шрифтом, того же размера, на том же белом фоне и даже размером в те же три строчки, я решил сделать нормального бота.

Ключ 3
К третьему видео бот использовал youtube api, квота на кол-во запросов к которому позволяла сканирование раз в 5 секунд на протяжении 12 часов.

Алгоритм был простой:

Итак, выскочил алерт, сообщающий о выходе нового видео, я залогинился к battle.net, через 10 секунд скачалось видео, еще через 10 появился скриншот с серийным номером:


Я его ввел и… он оказался уже использованым. Анализ ошибок показал, что данные через youtube api обновляются с задержкой до 5 минут! Когда бот обнаружил новое видео, уже было слишком поздно. Кому-то из других ботов или пользователей жмущих F5 повезло.

Ключ 4
К четвертому видео, бот был доработан: сейчас он использует порядка 100 прокси серверов (по 1 потоку на каждый прокси сервер), которые сканируют каждые 5 секунд gdata. Тесты показали, что около 20 прокси просто мгновенно сообщают о выходе нового видео, остальные подтягиваются в течении минуты, это было отлично. В отличии от gdata прямые ссылки появляются сразу для любого IP, поэтому тут без прокси бот просто качает видео в 20 потоков (работало даже в 1000 потоков, youtube оказывается позволяет). Скорость закачки возросла. Алгоритм сканирования был доработан: бот вначале в 4 потока сканирует вторую часть ролика (во всех предыдущих видео серийный ключ появлялся в конце ролика), а потом в 4 потока первую часть. Для надежности шаг сканирования был уменьшен до 500 мс, другие параметры так же были немного ослаблены.

Итак, выскочил алерт, сообщающий о выходе нового видео. Не успел я зайти в battle.net как уже скачалось видео (10 секунд) и появился скриншот с серийным номером:

Я порадовался, что учел возможность его появления в две строчки. Трясущимися руками я его кое-как написал и активировал! На все ушло секунд 20. Очень повезло со сканированием, алгоритм практически сразу показал серийный номер при том, что полное сканирование продолжалось 30 секунд. В этом ролике, как оказалось, было два ключа, которые показались последовательно, я ввел второй. Поздравляю того, кто активировал первый!

Осталось еще 5 ключей
Можно доработать алгоритм: запускать сканирование вместе с началом старта скачивания, алгоритм усложнится, но выигрышь будет секунд 10. Можно еще сделать распознование серийного номера и его автоматический ввод в battle.net. Тогда ключик можно будет ввести даже за 5 секунд.

Все писалось на Java, используя HttpComponents (http-протокол) и VLCj (обработка видео)

P.S. Diablo III клевая

UPDATE
Интересно было писать самого бота, поэтому затраченные 20 часов я расцениваю как время потраченное на развлечение, а не как 20 часов, за которые можно было бы заработать гораздо больше денег, чем стоит сам ключ. В свободное время я отдыхаю или изучаю что-то новое, а не работаю, а тут приятное с полезным. Игру еще не прошел.

Алгоритм
Алгоритм определения серийника я специально сразу не стал указывать по двум причинам. Узнав абсолютно точный алгоритм, авторы ThisIsHorosho быстро сделают ключ нераспознаваемым, и я окажу медвежью услугу тем, кто тоже пишет бота. Хотя допускаю, что таких людей нет, но как то же, судя по комментариям, за 3 минуты вводят серийники, неужели жмут F5 во время ожидания…

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

  1. Берем картинку из кадра и сохраняем ее с размером 640x320, VLCj позволяет сохранять картинки с любым разрешением, даже, если видео имеет другое. Все точки, близкие к цвету текста делаем черными, все остальное белое. В итоге получаем черно белые картинки. Пару таких картинок вставлены в эту статью.
  2. Для каждого скриншота считаем статистику белых и черных точек. Фоном объявляем те, где количество белых точек больше 92%, в тестах хватало и 94%, но это с запасом. На кадрах с фоном ищем серийник.
  3. Из кадра с краев отступаем по 30 пикселей, так как серийник появляется ближе к центру, а с края - никогда. Оставшееся поле разбиваем на квадраты 20x20, в каждом из которых считаем количество черных точек
  4. Квадраты с количеством черных точек от 10% до 60% объявляем квадратами с буквами - это уже с учетом того, что буква может только на половину попасть в квадрат и с некоторым запасом.
  5. Кадры, на которых есть непрерывная последовательность из как минимум 6 квадратов с буквами по горизонтали и в 3 квадрата по вертикали, объявляем кадрами с серийным номером. Сохраняем их в папку.

В итоге, появляются только картинки с текстом похожим на серийный номер:

На практике их не много появляется, так что найти из них нужный не составляет труда.

Работа с VLCj
Работа с VLCj очень простая. Вначале я прочитал документацию www.capricasoftware.co.uk/vlcj/tutorial1.php , потом немного поигрался с классом MediaPlayer, но он как-то глючил, в общем я остановился на вызове прямых функций из библиотеки LibVlc - оно и быстрее и безглючнее.

Вначале создаем библиотеку
LibVlc libvlc = LibVlcFactory.factory().create();

Потом создаем массив из 8 штук AnalyzerThread (типа Runnable) (каждому 1/8 часть времени видео), которые передаем в Executors.newFixedThreadPool(4) в таком порядке: 4, 5, 6, 7, 0, 1, 2, 3. Т.е. вначале будет сканироваться вторая часть видео, а потом первая. В каждом AnalyzerThread такой код:

System.out.println("Run section " + num); libvlc_media_player_t p_mi = null; libvlc_media_t media = null; try { // prepare //libvlc_instance_t instance = libvlc.libvlc_new(0, new String); libvlc_instance_t instance = libvlc.libvlc_new(2, new String{"--vout", "dummy"}); p_mi = libvlc.libvlc_media_player_new(instance); libvlc.libvlc_audio_toggle_mute(p_mi); media = libvlc.libvlc_media_new_path(instance, fileName); libvlc.libvlc_media_player_set_media(p_mi, media); libvlc.libvlc_media_player_play(p_mi); Thread.sleep(msPlayerWait); libvlc.libvlc_media_player_pause(p_mi); // start snapshoting int block = blockFrom; for (long msTime = msFrom; msTime <= msTo; msTime += msInBlock, block++) { String path = snapshotPath + File.separator + "snap-" + String.format("%03d.png", block); libvlc.libvlc_media_player_set_time(p_mi, msTime); int r = libvlc.libvlc_video_take_snapshot(p_mi, 0, path, picWidth, picHeight); if (r != 0) System.out.println("SNAPSHOT FAILED: block=" + block + ", returnCode=" + r); else analyzeImage(path); } } finally { if (p_mi != null) libvlc.libvlc_media_player_stop(p_mi); if (media != null) libvlc.libvlc_media_release(media); if (p_mi != null) libvlc.libvlc_media_player_release(p_mi); System.out.println("Close section " + num); }

Функция analyzeImage как раз определяет, находится ли на скриншоте ключик или нет, если находится, то сохраняет его в специальную папку.

Двадцать лет минуло с тех пор, как в Санктуарии бесчинствовали орды нежити под предводительством могучих демонов Диабло, Мефисто и Баала, но те, кто сражался против древнего зла, по-прежнему хранят в памяти ужасные события тех дней… В поисках знаний, которые помогут одолеть новые воплощения зла, Декард Каин возвратился на развалины Тристрамского собора. И тогда с небес, объятый пламенем, спустился провозвестник Апокалипсиса: удар пришелся на то самое место, где некогда в мир проник Диабло. Небесное пламя пробудило древнее Зло. Час пробил! Герои Санктуария вновь должны подняться на защиту мира смертных от разбушевавшихся сил преисподней.

ВНИМАНИЕ! Вы покупаете коды (не диск)! Игра скачивается после активации!

Как активировать код Diablo III Standart Edition (RU):

1) Перейдите на eu.battle.net/ru/ и зарегистрируйтесь (если есть аккаунт Battle Net, войдите).
2) После входа выбирайте раздел "Прикрепить ключ игры" (eu.battle.net/account/management/claim-code.html) и введите купленный код Diablo III Standart Edition (RU).

Как активировать код Diablo III Guest Pass (RU):

1) Перейдите на http://www.diablo3.com/guest и зарегистрируйтесь (если есть аккаунт Battle Net, войдите).
2) Введите полученный гостевой ключ
3) Бесплатно загрузите игру (Гостевая версия позволяет играть в Diablo III до момента боя с королем-скилетом в Акте I)

Как активировать код WoW Guest Pass (RU):

1) Перейдите на http://www.warcraft.com/guest и введите полученный гостевой ключ
2) Загрузите бесплатную пробную версию игры
3) Играйте в World of Warcraft бесплатно вплоть до 20-го уровня

О наличии: Много, регулярно, официально (от СофтКлаб). Вы получаете коды активации сразу после оплаты! В комплекте основной код и гостевые на D3 и WoW (Все перепечатываются с "дискового" jewel издания).

Отзывы

2

Отзывов от покупателей не поступало.

В целях противодействия нарушению авторских прав и права собственности, а также исключения необоснованных обвинений в адрес администрации сайта о пособничестве такому нарушению, администрация торговой площадки Plati (http://www.plati.market) обращается к Вам с просьбой - в случае обнаружения нарушений на торговой площадке Plati, незамедлительно информировать нас по адресу [email protected] о факте такого нарушения и предоставить нам достоверную информацию, подтверждающую Ваши авторские права или права собственности. В письме обязательно укажите ваши контактные реквизиты (Ф.И.О., телефон).

В целях исключения необоснованных и заведомо ложных сообщений о фактах нарушения указанных прав, администрация будет отказывать в предоставлении услуг на торговой площадке Plati, только после получения от Вас письменных заявлений о нарушении с приложением копий документов, подтверждающих ваши авторские права или права собственности, по адресу: 123007, г. Москва, Малый Калужский пер. д.4, стр.3, Адвокатский кабинет «АКАР №380».

В целях оперативного реагирования на нарушения Ваших прав и необходимости блокировки действий недобросовестных продавцов, Plati просит Вас направить заверенную телеграмму, которая будет являться основанием для блокировки действий продавца, указанная телеграмма должна содержать указание: вида нарушенных прав, подтверждения ваших прав и ваши контактные данные (организиционно-правовую форму лица, Ф.И.О.). Блокировка будет снята по истечение 15 дней, в случае непредставления Вами в Адвокатский кабинет письменных документов подтверждающих ваши авторские права или права собственности.

Дроп с хранителей ключей

Ключ костей

Переходим в акт I и телепортируемся в Гиблые поля. В данной локации живут неприятные рогатые создания или в простонародье Хазра. Тут потребуется найти первого из нужных боссов – Одиг. Распознать его будет несложно, поскольку он использует довольно неприятные заклинания, которые отталкивают игрока на большое расстояние, затем, замедляя и обездвиживая, закидывает огненными шарами и копьями. Особенно большую опасность он будет представлять классам ближнего боя.

Чревоугодия

Направляемся в следующий акт II и телепортируемся в Далгурский оазис. Здесь Вас будет ожидать второй хранитель ключа – Сокар. Найти его можно иным способом, поскольку его выдает собственная аура, замедляющая снаряды. Внимательно смотрите на края своего экрана, чтобы заметить его ауру, тогда Вы точно не ошибетесь.

Войны

Теперь идем в 3 акт. На территории Каменного форта Вас встретит очередной ключник – За’Рит. Он использует неприятные ледяные умения, которые прилично могут отнять у Вас здоровье, при этом сильно замедляя. Также телепортируется во время боя. Однако найти этого «ключника» гораздо легче, чем предыдущих, поскольку эта зона выполнена в коридорном стиле и Вам не придется долго его искать.

Зла

Последний хранитель ключа находится в 4 акте, а именно на первом уровне территории Серебряный Шпиль. Родители прозвали его Некаратом. Он способен отбросить на большое расстояние, поставить в клетку и дебафнуть на снижение получаемого лечения. Лока, как и предыдущая, тоже небольшая и поиск не отберет много времени.

29 марта 2012 в 01:17

Как я получил ключ к Diablo III Beta

  • Разработка веб-сайтов ,
  • Программирование

В YouTube роликах ThisIsHorosho с недавних пор стали появляться ключи к Diablo III Beta. В 7-ми минутном ролике на секунду показывается ключ, кто его первый активирует, то и выигрывает. Вот так на стоп кадре выглядит ключ:

Вы подумали о том же, о чем и я?


Всего 10 ключей.

Ключ 1
О первом ключе я не знал и, наверное, никто не знал. Кому-то повезло.

Ключ 2
Ко второму видео был готов самый простой бот, который раз в 10 секунд обновляет страницу с добавленным видео и, если появилось новое видео, то модальное окно в виде алерта сообщает об этом. Выяснилось, что через 4 часа youtube обнаруживает бота и просит его ввести recaptcha, а потом еще каждый час просит ее вводить. Очень не удобно, но я не особо хотел тратить время и писать по-нормальному, так как ожидал, что второй ключ появится как-нибудь по-другому, ну например, хотя бы зелеными буквами. Второй ключ я проморгал, но когда я увидел те же серые цифры и буквы, тем же шрифтом, того же размера, на том же белом фоне и даже размером в те же три строчки, я решил сделать нормального бота.

Ключ 3
К третьему видео бот использовал youtube api, квота на кол-во запросов к которому позволяла сканирование раз в 5 секунд на протяжении 12 часов.

Алгоритм был простой:

Итак, выскочил алерт, сообщающий о выходе нового видео, я залогинился к battle.net, через 10 секунд скачалось видео, еще через 10 появился скриншот с серийным номером:


Я его ввел и… он оказался уже использованым. Анализ ошибок показал, что данные через youtube api обновляются с задержкой до 5 минут! Когда бот обнаружил новое видео, уже было слишком поздно. Кому-то из других ботов или пользователей жмущих F5 повезло.

Ключ 4
К четвертому видео, бот был доработан: сейчас он использует порядка 100 прокси серверов (по 1 потоку на каждый прокси сервер), которые сканируют каждые 5 секунд gdata. Тесты показали, что около 20 прокси просто мгновенно сообщают о выходе нового видео, остальные подтягиваются в течении минуты, это было отлично. В отличии от gdata прямые ссылки появляются сразу для любого IP, поэтому тут без прокси бот просто качает видео в 20 потоков (работало даже в 1000 потоков, youtube оказывается позволяет). Скорость закачки возросла. Алгоритм сканирования был доработан: бот вначале в 4 потока сканирует вторую часть ролика (во всех предыдущих видео серийный ключ появлялся в конце ролика), а потом в 4 потока первую часть. Для надежности шаг сканирования был уменьшен до 500 мс, другие параметры так же были немного ослаблены.

Итак, выскочил алерт, сообщающий о выходе нового видео. Не успел я зайти в battle.net как уже скачалось видео (10 секунд) и появился скриншот с серийным номером:

Я порадовался, что учел возможность его появления в две строчки. Трясущимися руками я его кое-как написал и активировал! На все ушло секунд 20. Очень повезло со сканированием, алгоритм практически сразу показал серийный номер при том, что полное сканирование продолжалось 30 секунд. В этом ролике, как оказалось, было два ключа, которые показались последовательно, я ввел второй. Поздравляю того, кто активировал первый!

Осталось еще 5 ключей
Можно доработать алгоритм: запускать сканирование вместе с началом старта скачивания, алгоритм усложнится, но выигрышь будет секунд 10. Можно еще сделать распознование серийного номера и его автоматический ввод в battle.net. Тогда ключик можно будет ввести даже за 5 секунд.

Все писалось на Java, используя HttpComponents (http-протокол) и VLCj (обработка видео)

P.S. Diablo III клевая

UPDATE
Интересно было писать самого бота, поэтому затраченные 20 часов я расцениваю как время потраченное на развлечение, а не как 20 часов, за которые можно было бы заработать гораздо больше денег, чем стоит сам ключ. В свободное время я отдыхаю или изучаю что-то новое, а не работаю, а тут приятное с полезным. Игру еще не прошел.

Алгоритм
Алгоритм определения серийника я специально сразу не стал указывать по двум причинам. Узнав абсолютно точный алгоритм, авторы ThisIsHorosho быстро сделают ключ нераспознаваемым, и я окажу медвежью услугу тем, кто тоже пишет бота. Хотя допускаю, что таких людей нет, но как то же, судя по комментариям, за 3 минуты вводят серийники, неужели жмут F5 во время ожидания…

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

  1. Берем картинку из кадра и сохраняем ее с размером 640x320, VLCj позволяет сохранять картинки с любым разрешением, даже, если видео имеет другое. Все точки, близкие к цвету текста делаем черными, все остальное белое. В итоге получаем черно белые картинки. Пару таких картинок вставлены в эту статью.
  2. Для каждого скриншота считаем статистику белых и черных точек. Фоном объявляем те, где количество белых точек больше 92%, в тестах хватало и 94%, но это с запасом. На кадрах с фоном ищем серийник.
  3. Из кадра с краев отступаем по 30 пикселей, так как серийник появляется ближе к центру, а с края - никогда. Оставшееся поле разбиваем на квадраты 20x20, в каждом из которых считаем количество черных точек
  4. Квадраты с количеством черных точек от 10% до 60% объявляем квадратами с буквами - это уже с учетом того, что буква может только на половину попасть в квадрат и с некоторым запасом.
  5. Кадры, на которых есть непрерывная последовательность из как минимум 6 квадратов с буквами по горизонтали и в 3 квадрата по вертикали, объявляем кадрами с серийным номером. Сохраняем их в папку.

В итоге, появляются только картинки с текстом похожим на серийный номер:

На практике их не много появляется, так что найти из них нужный не составляет труда.

Работа с VLCj
Работа с VLCj очень простая. Вначале я прочитал документацию www.capricasoftware.co.uk/vlcj/tutorial1.php , потом немного поигрался с классом MediaPlayer, но он как-то глючил, в общем я остановился на вызове прямых функций из библиотеки LibVlc - оно и быстрее и безглючнее.

Вначале создаем библиотеку
LibVlc libvlc = LibVlcFactory.factory().create();

Потом создаем массив из 8 штук AnalyzerThread (типа Runnable) (каждому 1/8 часть времени видео), которые передаем в Executors.newFixedThreadPool(4) в таком порядке: 4, 5, 6, 7, 0, 1, 2, 3. Т.е. вначале будет сканироваться вторая часть видео, а потом первая. В каждом AnalyzerThread такой код:

System.out.println("Run section " + num); libvlc_media_player_t p_mi = null; libvlc_media_t media = null; try { // prepare //libvlc_instance_t instance = libvlc.libvlc_new(0, new String); libvlc_instance_t instance = libvlc.libvlc_new(2, new String{"--vout", "dummy"}); p_mi = libvlc.libvlc_media_player_new(instance); libvlc.libvlc_audio_toggle_mute(p_mi); media = libvlc.libvlc_media_new_path(instance, fileName); libvlc.libvlc_media_player_set_media(p_mi, media); libvlc.libvlc_media_player_play(p_mi); Thread.sleep(msPlayerWait); libvlc.libvlc_media_player_pause(p_mi); // start snapshoting int block = blockFrom; for (long msTime = msFrom; msTime <= msTo; msTime += msInBlock, block++) { String path = snapshotPath + File.separator + "snap-" + String.format("%03d.png", block); libvlc.libvlc_media_player_set_time(p_mi, msTime); int r = libvlc.libvlc_video_take_snapshot(p_mi, 0, path, picWidth, picHeight); if (r != 0) System.out.println("SNAPSHOT FAILED: block=" + block + ", returnCode=" + r); else analyzeImage(path); } } finally { if (p_mi != null) libvlc.libvlc_media_player_stop(p_mi); if (media != null) libvlc.libvlc_media_release(media); if (p_mi != null) libvlc.libvlc_media_player_release(p_mi); System.out.println("Close section " + num); }

Функция analyzeImage как раз определяет, находится ли на скриншоте ключик или нет, если находится, то сохраняет его в специальную папку.

Информация в статье устарела в связи с выходом патча 2.3.0. Теперь с хранителей ключей сразу падают адские устройства .

Дроп с хранителей ключей

Ключ костей

Переходим в акт I и телепортируемся в Гиблые поля. В данной локации живут неприятные рогатые создания или в простонародье Хазра. Тут потребуется найти первого из нужных боссов – Одиг. Распознать его будет несложно, поскольку он использует довольно неприятные заклинания, которые отталкивают игрока на большое расстояние, затем, замедляя и обездвиживая, закидывает огненными шарами и копьями. Особенно большую опасность он будет представлять классам ближнего боя.

Чревоугодия

Направляемся в следующий акт II и телепортируемся в Далгурский оазис. Здесь Вас будет ожидать второй хранитель ключа – Сокар. Найти его можно иным способом, поскольку его выдает собственная аура, замедляющая снаряды. Внимательно смотрите на края своего экрана, чтобы заметить его ауру, тогда Вы точно не ошибетесь.

Войны

Теперь идем в 3 акт. На территории Каменного форта Вас встретит очередной ключник – За’Рит. Он использует неприятные ледяные умения, которые прилично могут отнять у Вас здоровье, при этом сильно замедляя. Также телепортируется во время боя. Однако найти этого «ключника» гораздо легче, чем предыдущих, поскольку эта зона выполнена в коридорном стиле и Вам не придется долго его искать.

Зла

Последний хранитель ключа находится в 4 акте, а именно на первом уровне территории Серебряный Шпиль. Родители прозвали его Некаратом. Он способен отбросить на большое расстояние, поставить в клетку и дебафнуть на снижение получаемого лечения. Лока, как и предыдущая, тоже небольшая и поиск не отберет много времени.

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