Про чаты и паучков

Вот, очередной кусочек гомнокода из себя выдавил. Нет бы по делу, всё какой-то фигнёй занимаюсь. История, как обычно, начинается издалека. А именно — всё с тех же замечательных Ответов@mail.ru. Кто там бывает — наверняка видел там в каждом разделе по замечательному чятику. Кое-где эти чятики унылы и пустынны, а кое-где прямо кипят жизнью. Периодически там такие дискуссии образуются — закачаишсо (ну, эт вообще-то везде так, но речь не об этом). А самое печальное что? То, что в чятике видно только 25 последних сообщений, а все предыдущие отправляются к Евгении Марковне на веки вечные, и назад не возвращаются. А ведь так хочется иногда почитать на досуге, вспомнить всю эту фигню… Ну, копипастить — это, конечно, вариант, но утомительно и вообще, не будешь же круглосуточно сидеть и F5 жмакать. В общем, сочинил я гадость, слегка облегчающую эту задачу. Первая часть гадости, и самая важная — это кагбе паучок. Получает страничку с репликами, разбирает ее hpricot‘ом и кладет в БД (sqlite). Поскольку разработчики чятика не позаботились об удобстве автоматизированного разбора (о, сколько там косяков: штампы времени с точностью до минуты, каждая реплика разбита на 2 части — имя с таймстампом и собственно текст, причем вся эта бодяга лежит кучей в общем div’е, красотища…), приходится извращаться. Против div’ной свалки помогает each_slice(2), с отсутствием идентификации реплик при сохранении борется хитрый constraint в базе, следящий за уникальностью пары время + текст сообщения (сначала думал добавить еще и имя автора, но решил, что это будет косяк: имя можно поменять, и тогда появятся лишние записи, да еще и кучей). Вот такой паучок:

#! /usr/local/bin/ruby
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'sqlite3'
db = SQLite3::Database.new(File.dirname(__FILE__) + "/chat.db") # или тут лучше File.join()?
doc = open("http://otvet.mail.ru/doit?action=chatmessages&cid=4") { |f| Hpricot(f) }
divs = doc.search("body/.Dialog/div")
unless divs.empty?
  File.new("last", "w").puts Time.now.to_s
  chat = []
  divs.each_slice(2) do |line|
    chat < < [line[0].inner_text.split("\n"), line[1].inner_text].flatten # всё через жо
  end
  chat.uniq!
  chat.reverse! # странно, почему цепочкой не работает?
  chat.each do |r|
    db.execute("insert into chat values ( ?, ?, ? )", r[0], r[1], r[2])
  end
end

Гомнокод во всей красе, объёмом 20 строчек. Пока умеет парсить только чятик в разделе «Компьютеры и Интернет», но впилить все остальные, в общем-то, не трудно. Займусь как-нибудь на досуге. А пока оно вполне себе успешно дергается сron’ом каждые 3 минуты (интервал подбирать надо бы, да) и делает своё чёрное дельце.

Вторая часть (код, уж извините, показывать не буду, ибо это сущий п[ой!]здец, да и не столь принципиальна она) организует к нашей БД замечательную веб-мордочку. Запускается через rack (кстати, у меня не получилось смонтировать приложение в подкаталог вхоста, хотя всё по инструкции. К чему бы это?) и бесхитростно так (с пагинацией даже) в pre всё выводит. Полюбоваться можно (пока что) тут: http://toys.dxfoto.ru/. pixelstats trackingpixel

Метки: , , ,

Комментарии (2) на “Про чаты и паучков”

  1. serega:

    [тут была реферальная ссылка на какой-то говночятик] самый классный чаТ!

Оставить комментарий