LINUX.ORG.RU
ФорумTalks

[java][поделка] Отслеживатель tracker.jsp

 


0

0

http://vsb.name/files/lorstats-0.0.1-distribution.jar

Нужна Java >= 1.5

Запускать java -jar lorstats-0.0.1-distribution.jar

Как оно работает: раз в минуту запрашивается страница http://www.linux.org.ru/tracker.jsp, анализируется,
топики, в которых общее количество сообщений с последнего раза изменились помечаются как новые.
Потом все новые топики выводятся на экран в виде
03:32:41 Talks: Сколько ещё будет жить C++? (147) http://www.linux.org.ru/view-message.jsp?msgid=2659071

Первую минуту оно будет молчать.

В gnome-terminal ссылки выделяются автоматически и по ним можно щёлкать, так что получается почти автоматизированное решение :)

Прокси не поддерживается.

Делалось всё несколько для другого, но для другого сейчас доделывать лень, поэтому для фана сделал так.
Оно конечно никому не надо, в том числе и мне, но мало ли.

PS решение монструозное, на перле оно займёт строк 30, я знаю, писать об этом не обязательно.

http://vsb.name/files/lorstats-0.0.1-sources.zip - исходники
http://vsb.name/files/lorstats-0.0.1.jar - без зависимостей, требует log4j и htmlparser.
★★★★★

Посмотрел исходники. Местами очень напоминает домашние работы альтернативно одаренных детей. Что могу сказать - Java не тормозит!

anonymous
()

>на перле оно займёт строк 30, я знаю, писать об этом не обязательно.

на перле оно займёт строк 30! а на питоне - строк 15!

З.Ы. Сорри, не удержался

З.З.Ы. Дык все-таки зачем тут жаба??

anonymous
()
Ответ на: комментарий от anonymous

Говорю же, для другого делал. Это побочный продукт :)

PS а можно посмотреть на 15 строк на пайтоне?

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

while (!isInterrupted()) {
            try {
                logger.trace("Opening connection");
                connection = url.openConnection();

                logger.trace("Getting input stream");
                inputStream = connection.getInputStream();

                reader = new InputStreamReader(inputStream);
                try {
                    stringWriter = new StringWriter();

                    logger.trace("Reading data");
                    while ((c = reader.read()) != -1) {
                        stringWriter.write(c);
                    }
                    logger.trace(stringWriter.toString().length() + " characters read");

                    logger.trace("Putting data into queue");
                    queue.put(new DataRecord(stringWriter.toString()));
                } finally {
                    logger.trace("Closing reader");
                    reader.close();
                }
                logger.trace("Sleeping " + timeout + " milliseconds");
                sleep(timeout);

anonymous
()
Ответ на: комментарий от anonymous

всё здесь нормально. энтерпрайз. хотя лучше бы на groovy написал.

zort
()
Ответ на: комментарий от anonymous

6 скобок закрыть забыл.. Эх, не тот пошёл нынче анонимус, не тот.

Legioner ★★★★★
() автор топика

Слабал на коленке, ногами не бить. :)

#!/usr/bin/env python

import re
import time
import urllib
from datetime import datetime
from BeautifulSoup import BeautifulSoup

def fetch_messages():
    msg_url_re = re.compile(r'^view-message\.jsp\?msgid=(\d+)&.*$')
    soup = BeautifulSoup(urllib.urlopen('http://www.linux.org.ru/tracker.jsp'))
    tbody = soup.find('table', {'class': 'message-table'}).tbody
    for tr in tbody.findChildren('tr', recursive=False):
        tds = tr.findChildren('td')
        msgid = msg_url_re.search(tds[1].a['href']).groups()[0]
        yield msgid, {
            'group': tds[0].a.string,
            'title': tds[1].a.string,
            'num_messages': tds[3].string.split('/')[0],
        }

def find_new_messages(old_messages, new_messages):
    for msgid, data in new_messages.iteritems():
        if (msgid not in old_messages
                or old_messages[msgid]['num_messages'] != data['num_messages']):
            yield msgid, data

if __name__ == '__main__':
    new_messages = dict(fetch_messages())
    while True:
        old_messages, new_messages = new_messages, dict(fetch_messages())
        for msgid, data in find_new_messages(old_messages, new_messages):
            print datetime.now().strftime('%T'),
            print '%(group)s: %(title)s (%(num_messages)s)' % data,
            print 'http://www.linux.org.ru/view-message.jsp?msgid=%s' % msgid
        time.sleep(60)

ero-sennin ★★
()
Ответ на: комментарий от anonymous

> на перле оно займёт строк 30! а на питоне - строк 15!

унылый анонимус уныл, где твои 15 строк? в приведённом примере на петоне вышло, если верить, wc -l, ровно 36 строк.

вывод: петон уныл, анонимус тоже уныл.

eveel ★★
()
Ответ на: комментарий от eveel

>> на перле оно займёт строк 30! а на питоне - строк 15!

>унылый анонимус уныл, где твои 15 строк? в приведённом примере на петоне вышло, если верить, wc -l, ровно 36 строк.

>вывод: петон уныл, анонимус тоже уныл.

Вывод сделан давно, есть ложь, есть наглая ложь, а есть пиар питонщиков. Кстати, настоящий питонщик такие программы должен писать в одну строку, oneliner то есть. А никак не в 15. Иначе где-же высокоуровневость питона?

anonymous
()
Ответ на: комментарий от anonymous

Пока питон уверенно лидирует. Пости своё решение на любом языке.

anonymous
()
Ответ на: комментарий от stave

>Кодировка уехала под офтопиком :/

Totally same shit. Пробовал и chcp 866 и chcp 20866 и chcp 1251 и chcp 65001. Везде жуки

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.