Я лишился девственности! Первый скрипт ходящий в нет

Apr 20, 2009 18:48

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

Постановка задачи такая: надо что бы скрипт логинился под моим именем на сайте, находил какую хрень там ещё можно построить и строил её. Я понимаю, что в принципе можно было бы замутить логику и оптимизацию что конкретно там нажимать, но я сейчас решил что хочу нажать все кнопки апгрейдов, которые только нажимаются. Я слишком давно и мало писал на perl и на php. Я знал, но забыл что такое регэкспы. И я пытаюсь реализовать unix-way, который как я понял заключается в том, что бы вывод предыдущей команды отдавать следующей. Короче, показываю свой безумно кривой код и рассказываю как я делал: #!/bin/bash
curl -d "e03355c=username&e63c4e0=password&ee0f048=&w=&login=1240231174&s1=login" http://s2.travian.ru/dorf1.php http://s2.travian.ru/build.php?id=[1-18] | grep -o "dorf1.php?a=[0-9]*&c=[0-9a-z]*" | awk '{print "http://s2.travian.ru/"$1}' | while read file; do curl curl -d "e03355c=username&e63c4e0=password&ee0f048=&w=&login=1240231174&s1=login" http://s2.travian.ru/dorf1.php "$file"; done
Начал я очень просто. Я зашел на страничку с игровой картой, запомнил url и скормил его в командной строке curl. И получил код этой странички. А точнее, не столько её самой, сколько формы для логина, на которую мой curl был любезно перенаправлен. Потом я нашел там знакомый html касающийся формы: ключевые слова form method="post", разнообразие input, в том числе с картинкой. То есть я сначала, конечно побаловался с разнообразными curl -u username:password, но ни с какими методами авторизации, ни с какими опциями я не получил код залогиненной странички. Поэтому - решил логиниться через заполнение формы "вручную". Кроме видимых полей с именем и паролем (с неочевидными названиями полей) я ещё обнаружил несколько скрытых полей с непонятными значениями. Я ввёл всё что нашел (в т.ч. и поле input, которое скрывалось под картинкой) и залогинился. То есть получил код странички игрового поля в залогиненном состоянии. Как сделать вызов следующей curl в той же сессии я не знал, но я знал, что можно дописать ещё несколько адресов в той же строке (и логично предположил, что это будет та же сессия). Адреса клеток на игровом поле отличались только числом в url, поэтому я после странички на которую я логинился дописал странички клеток с формулой [1-18] в адресе. Эта комбинация давала мне на вывод описание игрового поля и всех клеток подряд.
На страничке той клетки, где можно вызвать обновление клетки есть ссылка вида dorf1.php?a=номер клетки&c=некий код. Строки с такими ссылками я одним движением руки вырезал при помощи grep.
Потом оказалось, что мне нужна не вся строка, а только та часть, в которой содержится ссылка. Причём, это не вся ссылка - в коде ссылка относительная, а мне надо будет добавлять ещё и адрес сайта. После изучения регулярных выражений, ломания головы об описания sed и awk было принято решение в grep добавить опцию -o, а awk применить для добавления адреса сайта к строкам. Я получил список всех строк на которые можно было бы нажать. Разумеется, по законам жанра, если нажать на строительство чего-то первого, то на строительство последующего рессурсов уже не хватит, но это и не важно - игра даже ошибки не даёт на вызов такой ссылки - просто игнорирует. Далее я долго думал и искать примеры программ на bash в которых бы можно было для списка файлов выполнить команду. И пример нашелся. В результате чего получился цикл while read file do .... "$file" ... done. Думаю, что file тут переменная, а не зарезервированное слово, но проверять не стал. Так как залогиненная сессия curl у меня уже потеряна, то я снова написал curl с логином. Благо, выполняться они часто не будут - обычно обновлять на игровом поле нечего, поэтому список будет пуст. При проверке этого фрагмента кода на моём игровом поле активизировалась одна стройка и я решил, что пусть всё так и будет. Поставил в crontab запуск этого скрипта каждые 15 минут и с нетерпением жду пока в игре накопятся рессурсы для очередной стройки.
Я уже заметил что у меня там curl написано по ошибке дважы зачем-то, но пока исправлять ничего не буду.

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

debian, fun, commandline, howto, grep, script, cron, bash

Previous post Next post
Up