В качестве примера будем забирать с главной страницы http://egghelp.ru/ архива информацию о количестве файлов, объеме и количестве закачек:
Файлов в архиве: 511, объем: 54.5 MB. Всего закачек: 302,551.
Для обработки запросов будем использовать http.tcl
В этом примере используется egglib_pub.tcl
Начнем с бинда команды, которая будет вызывать процедуру parsing:
Ну и сама процедура c путлогом об удачной загрузке.:
}
putlog "parsing.tcl loaded..."
Пока процедура у нас пустая и ничего не выполняет. Для проверки срабатывания бинда добавим внутрь процедуры путлог, который сообщит на о том, что бинд сработал и процедура выполнилась.
putlog "bind: OK"
}
putlog "parsing.tcl loaded..."
Проверим, что у нас вышло. Загружаем скрипт и в патилайне видим
[17:27:09] <bionic> [17:22:41] parsing.tcl loaded...
Проверяем бинд, пишем в канале !archive, в патилайне видим:
[17:28:20] <bionic> [17:23:52] bind: OK
Значит все в порядке.
Приступаем к главному и самому сложному.
Следующей строкой указываем юзерагент с которым бот будет конектиться к сайту. В ::http::config может быть много параметров, но пока вам это не надо. Разберетесь чуть позже.
Далее указываем адрес сайта и таймаут соединения, чтобы бот не вис при обращении к недоступному сайту. Тут тоже кроме адреса и таймаута можно указать другие параметры но и они вам тоже пока не пригодятся.
Тут в переменную data мы получаем содержимое нашей страницы:
И удаляем переменные более не используемые в токене:
Проверим, добавив сразу после закрытия соединения.
Написав команду на канале в патилайне видим:
[17:47:04] <bionic> [17:42:35] bind: OK
[17:47:04] <bionic> [17:42:35] <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
[17:47:04] <bionic> "http://www.w3.org/TR/html4/loose.dtd">
[17:47:04] <bionic> <html>
[17:47:04] <bionic> <head>
[17:47:04] <bionic> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
[17:47:04] <bionic> <title>Ãëà âГГ Гї • TCL ñêðèïòû äëÿ Eggdrop/Windrop</title>
Сразу обращаем внимание на то, что в тайтле у нас какая-то фигня с кодировками. Все это делается на боте с suzi патчем. Так что на простом роботе возможно и не будет таких проблем. Для того, чтобы это исправить, надо добавить перед путлогом перекодировку переменной data:
set data [encoding convertfrom cp1251 $data]
} else {
set data [encoding convertto cp1251 [encoding convertfrom utf-8 $data]]
}
Проверяем еще раз:
[17:54:01] <bionic> <head>
[17:54:01] <bionic> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
[17:54:01] <bionic> <title>Главная • TCL скрипты для Eggdrop/Windrop</title>
[17:54:01] <bionic> <meta http-equiv="Pragma" content="no-cache">
Все в порядке, данные получены и, кажется, с кодировкой все хорошо.
Теперь приступим к "выемке" нужных нам цифр. Для начала превратим все данные в одну строку:
Теперь откроем браузером исходный код страницы и посмотрим на ту часть, которую нам надо достать:
Файлов в архиве: <b>511</b>, объем: <b>54.5 MB</b>. Всего закачек: <b>302,552</b>.
</td>
Сначала достанем количество файлов:
Тут в переменную a попадет все, что лежит между и в переменной data
Также поступаем и с другими цифрами:
regexp {Всего закачек: <b>(.*?)</b>} $data "" c
В итоге имеем переменные a, b и c в которых находится то, что нам нужно.
Проверим, что мы там подоставали со страницы добавив строку вывода в канал:
Пишем команду в канал:
[18:08:35] <tvrsh> !archive
[18:08:35] <@bionic> 511 54.5 MB 302,552
Ну вот, все работает. Теперь можем группировать и оформлять эти данные как нам захочется:
putserv "PRIVMSG $chan :В среднем: \002[expr [string map {, ""} $c]/$a]\002 закачек на файл и \002[expr [lindex $b 0]/$a] Mb\002 на файл."
[18:14:38] <tvrsh> !archive
[18:14:38] <@bionic> Файлов в архиве: 511, объем: 54.5 MB. Всего закачек: 302,552.
[18:14:39] <@bionic> В среднем: 592 закачек на файл и 0.10665362035225048 Mb на файл.
А вот итоговый скрипт:
proc parsing {nick uhost hand chan text} {
putlog "bind: OK"
::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)"
set parsing_tok [::http::geturl http://www.egghelp.ru/]
set data [::http::data $parsing_tok]
::http::cleanup $parsing_tok
if {[info exists ::sp_version]} {
set data [encoding convertfrom cp1251 $data]
} else {
set data [encoding convertto cp1251 [encoding convertfrom utf-8 $data]]
}
regsub -all -- {\n} $data "" data
regexp {Файлов в архиве: <b>(.*?)</b>} $data "" a
regexp {объем: <b>(.*?)</b>} $data "" b
regexp {Всего закачек: <b>(.*?)</b>} $data "" c
putserv "PRIVMSG $chan :Файлов в архиве: \002$a\002, объем: \002$b\002. Всего закачек: \002$c\002."
putserv "PRIVMSG $chan :В среднем: \002[expr [string map {, ""} $c]/$a]\002 закачек на файл и \002[expr [lindex $b 0]/$a] Mb\002 на файл."
}
putlog "parsing.tcl loaded..."
Поправки, дополнения и вопросы приветствуются.
Смотрите также Парсинг https при помощи пакета TLS.