Пишем web-бота при помощи twill

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

Зачастую, боты пишут с нуля на php, python и других языках высокого уровня. Программисты вручную формируют HTTP запросы, читают cookie, парсят регулярками страницы, чтобы найти ссылки, веб-формы и т. п. Но зачем?

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

Искать долго не пришлось. Такой эмулятор быстро нашелся. Зовут его twill.
Сайт: http://twill.idyll.org/

Twill — это библиотека на python, и также интерпретатор языка, который позволяет ходить по сайтам, парзить веб-формы, принимать/отправлять cookies. В общем то что нам нужно.

С его помощью можно писать функциональные тесты, ботов и проводить стресс-тестирование по заданному сценарию.

Короче, поехали:

Сейчас я напишу скрипт позволяющий управлять livejournal из консоли. (На самом деле я просто хотел автоматизировать добавление пользователей в друзья, для раскрутки своего блога)

Ставим twill:
aptitude install python-twill

Интерпретатор twill запускается так.
twill-sh

Создаем файл jj_login.twill (он будет выполнять авторизацию на livejournal)

# ставим юзер агент как у нашего любимого браузера
agent "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
# идем на сайт
go http://www.livejournal.com/
# форма авторизации имеет номер 1. по нему и будем обращаться (чтобы это узнать есть команда showforms)
# теперь заполним ее
# спрашиваем логин и пароль
getinput "login: "
# вставляем логин введенный с клавиатуры
formvalue 1 user __input__
# спрашиваем пароль
getpassword "password: "
formvalue 1 password __password__
# ставим галочку "запомнить"
formvalue 1 remember_me 1
# сабмитим форму (жмем кнопку "вход")
# тут передается не номер формы, а имя кнопки
submit _submit
# сохраняем куки в файл
save_cookies jj_cookies.txt


Запускаем скрипт так:
twill-sh jj_login.twill

Скрипт спросит нас логи и пароль, зайдет на сайт и сохранит cookie в файл jj_cookies.txt, чтобы другой скрипт смог работать уже без авторизации.

Далее самое главное: файл jj_command_execute.twill

agent "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
# загружаем куки из файла
load_cookies jj_cookies.txt
# теперь идем в консоль
go http://www.livejournal.com/admin/console/
# спрашиваем команду у пользователя
getinput "command: "
# заполняем форму
formvalue 1 commands __input__
# нажимаем кнопку
submit 3


Запускаем:
twill-sh jj_command_execute.twill


Чтобы добавить пользователя pupkin в друзья, нужно ввести команду:
friend add pupkin

или сразу из консоли:
echo "friend add pupkin" | twill-sh jj_command_execute.twill

Список команд тут: http://www.livejournal.com/admin/console/reference.bml

У скрипта есть недостаток: за раз можно передавать только 1 команду, так как в twill нету многострочного ввода. Это поправимо, если использовать twill из python или написать для него расширение.
Tags:
python, bot, bash, parser, console, linux, livejournal, парсинг, раскрутка блога, testing

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.