Поиск по блогу

среда, 10 декабря 2008 г.

Парсинг на службе у геймера

Парсингу можно найти применение не только для получения контента. Сегодняшний мой рассказ будет связан с автоматизацией "прокачки" объекта в одной браузерной игре.

В последнее время в сети появилось огромное множество браузерных игр разных типов. В конце прошлого года, когда появился портал MyMiniCity, я построила себе там город NewYorg (кто сидит по траффику — лучше не заходить :) ). Суть игры заключается в том, что надо "построить" свой виртуальный город. Подробно расписывать не буду, так как уже писала про эту игру. Поигравшись пару месяцев, вручную заходя в другие города и оставляя на доске приглашения посетить Newyorg, решила все автоматизировать. Тогда и была написана программа, которая посещает города на MyMiniCity.com, заполняет поля, отгадывает капчу и сабмитит форму. Надо было только подсунуть программе файл со списком городов. Таким образом я выводила город достаточно высоко в рейтинге (но потом мне стало лень даже запускать программу :) ).

Вот для создания списка городов я и использовала парсинг. Проанализировав код страницы, нашла, что список части городов, выведенных в рейтинге в правой части, в коде представлен в определенном формате. На каждой странице с городом есть строка типа:

ranking=145,flycity.de|146,ssv-city|147,join|148,seti.germany|149,krokant|150,demonslayers|151,maschboard


Оставалось только распарсить строку, добавить города в список и перейти к последнему (или первому, в зависимости от направления обхода) городу. Список городов можно было представить в формате, который подходит для программы обхода городов MMCVisitor :)

myminicity parser

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

Статьи схожей тематики:



9 комментариев:

  1. А, вот еще что решила добавить... В утилите использовался стандартный компонент TWebBrowser из-за того, что напрямую получить содержимое страницы было нельзя (требовался Flash). Но советую по возможности при разработке своих парсеров скачивать страницу без отображения в браузере :)

    ОтветитьУдалить
  2. Здраствуйте Маша! Меня очень заинтересовал ваш блог, подчерпнул море информации, да и вообще просто интересно читать. Прочитал щас статью о парсинге на службе геймера и задался вопросом, а можно ли как-то воздействовать с Флеш объектом? Вот играю в Klanz.ru и задумался о написании бота.(выгоды канечно никакой но интересно :)) Там игровое поле с картами представленна ввиде одной большой флешки, а как распознавать действия на ней? В общем даже незнаю как подойти к этой идеи. (если захочется помочь, то на Делфи плиз :) ) Заранее большое спасибо!

    ОтветитьУдалить
  3. Привет, Анонимный :)
    Про игру, о которой ты написал, ничего конкретного сказать не могу, так как не знаю ее особенностей. Могу только сказать, что если там флешка, по которой надо кликать в определенных областях и эти области заранее известны, то можно программно передвигать курсор мыши и кликать. А вот если логика игры зависит от действий противника, то такое решение решением являться не будет :) Можно ли как-то по-другому работать с флешками — я не знаю, не сталкивалась.

    ОтветитьУдалить
  4. Ага ага, ясно :) Тогда такой вопрос: есть картинка, лежит на винте, на форме растянут компонент WebBrowser1, на нём загружен сайт, нужно найти эту картинку на сайте и найти координаты где она распологается. Ответ на этот вопрос и будет являться ключевым в написании бота. Всё остальное я умею. (Вот думаю мож зарегать тут блог и вести ворклог изготовления бота? *CRAZY*)

    ОтветитьУдалить
  5. Я вот решил ещё на счёт алгоритма сказать. Я нашол кучу алгоритмов по сканированию рисунка, но в примерах как-то сложно. Вот как я думаю должно выглядить сканирование. Берём первый пиксель из искомой картинки, раскладываем его по RGB цветам, берём первый пиксель в браузере, раскладываем по RGB, сравниваем их, если идентичны, берём второй пиксель из искомой картинки, сравниваем, ну и так если штук 50 пикселей к ряду одинаковые, то выполняем действие, иначе переходим к следущему пикселю в браузере. Вроде в теории всё ясно, а на практике ваще хз как сделать :) Ну кстати искомую картинку можно сделать высотой в 1 пиксель, что бы легче искать было.

    ОтветитьУдалить
  6. Я как-то делала отгадывание капчи для PHPBB, но там все примитивно - убрать шумы, свести оставшиеся цвета к черно-белой палитре, определить границы символов и сравнить их с шаблонами. Найти координаты нахождения одной цветной картинки на другой будет просто при условии, что цвета будут идентичные на 100%... наверное, еще от формата зависит. Ты с каким форматом будешь работать? bmp, gif, png? Можно картинки загружать в какой-нибудь стандартный Image, а потом получать доступ к цвету пикселей через Image.Canvas.Pixels[i,j]...

    В общем, надо эксперементировать, я точно сказать не могу, как будет оптимальнее и правильнее. :)

    Насчет ворклога — давай, заводи, будет интересно почитать))

    ОтветитьУдалить
  7. Я думал капча крутой метод защиты, а полазил в инете щас по поводу распознования картинок, так блин, оказывается капчу легко обойти, но только если нет искревлений символов, а только шум.

    Думаю роботать буду с Png, т.к. когда я снифил пакеты, при передаче флешкой информации, то картинки были формата png. Думаю это верное решение хотя сначала я подумывал о bmp, ведь там точнее передаётся цвет (вроде или я что-то путаю?). На счёт идентичные на 100%, так а почему бы и нет, ну ведь цвет никак не исказиться?

    А на счёт блога, это наверное только завтра. :)

    ОтветитьУдалить
  8. Ну да, по цветам совпадение должно быть точное, если использовать картинки в одинаковом формате.)

    ОтветитьУдалить
  9. Снова привет! Создал я блог и разместил ссылку на этот :) Буду рад помощи, а то пока дело не спорится. http://pozer-notes.blogspot.com/

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться