четверг, 14 октября 2010 г.

Пишем "бота" для livejournal на twill


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

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

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

В symfony есть класс sfBrowser эмулирующий браузер, который удобно использовать для функционального тестирования symfony-приложений. Но речь сейчас не о нем, а питоновской программке twill.

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 или написать для него расширение.


Эта статья была опубликована в песочнице хабра, надо признаться инвайта так и не получил. Зато ее успели утащить всякие сайты...

1 комментарий:

  1. А как написать бота для ЖЖ, который сможет лазать по комментариям к последним публикациям, и выводить редактору (живому челу ужо соотв.) по наличию искомых (задаваемых) семантических элементов?

    P.S. Хабр сдох давно кажись...

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