Copyright © 2006-9, 2012 Alexander Gromnitsky.
Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved.
pr2nntp (Post RSS To NNTP) – гейт из RSS в группы новостей. Каждая entry преобразуется в письмо и постится в группу, по принципу одна RSS – одна группа.
pr2nntp всю лишнюю работу старается сбросить на сторонние программы. Так, ей необходим NNTP сервер, утилита для скачивания файлов и конвертор из HTML в текст.
Если все проходит б.м. удачно, были обнаружены новые entries в RSS и отправлены в группы, pr2nntp возвращает 0 в конце работы, иначе что-то отличное от нуля.
Правильный выбор компаньонов для pr2nntp позволит значительно улучшить и сделать приятнее ее работу.
Раз pr2nntp предполагает персональное использование, выбор хотелось бы остановить на небольшом и простом в настройке. К сожалению, большинство из таких серверов не очень хорошо управляются с командной строки, а pr2nntp требует некоторые действия (see Setup) исполнять в реальном времени (и именно посредством такого интерфейса).
В дальнейшем по этому руководству предполагает, что у вас установлен INN.
В принципе, тут сгодится любой, часто именно тот, который идет в комплекте с вашей UNIX-like ОС. Для FreeBSD это будет fetch, для Linux, скорее всего, curl.
File downloader должен заканчивать свою работу возвращая exit status 0 если все прошло хорошо и >= 1 когда все плохо (в т.ч. когда был HTTP ответ 404/500/etc). Если это не выполняется, ждите веселых результатов.
Условие выбора: программа должна уметь читать HTML в UTF8 (если RSS entries в этом формате) из файла и вываливать отфильтрованный результат в stdout в UTF-8. w3m работает хорошо. (elinks имеет некоторые проблемы с UTF8, например.)
pr2nntp ищет свою конфигурацию в файле ~/.pr2nntp/config, правда каталог можно изменить, если воспользоваться опцией ‘-c’ (see Invoking).
~/.pr2nntp/config – это обычный файл программы на языке Tcl. В этом файле предпологаются только установка переменных.
Каждый параметр pr2nntp – это 1 переменная. Бывает их 4 вида.
Это такой параметр, который по умолчанию устанавливает свойство для всех RSS.
Это такой параметр, который может переопределять глобальный параметр для одной конкретной RSS.
pr2nntp в случаи отсутствия переменной возьмет какое-то свое значение по умолчанию.
Некоторые параметры поддерживают свой мини-язык, т.е. интерпретируют некоторую последовательность символов по своим правилам. Короткая спецификация:
Имейте ввиду, этот список не означает, что любая переменная с мини-языком будет это все анализировать; многим из них нужна только небольшая его часть.
Пример обозначений: ‘RM’ – обязательная переменная с поддержкой мини-языка, ‘O 524288’ – необязательная переменная (в случаи с ее отсутствием, будет взято значение по умолчанию ‘524288’).
Для этого вам нужно заполнить хэш rss. Ничего сложного в этом нет. Например:
set rss(comp.dragonfly_bsd_digest) { url {http://www.shiningsilence.com/dbsdlog/category/lazy-reading/feed} }
‘comp.dragonfly_bsd_digest’ – будет имя группы новостей (без обязательного префикса, см. ниже). ‘url’ – локальный параметр этой конкретной RSS.
Логин и пароль для NNTP сервера.
Комманда, с помощью которой можно заставить NNTP сервер создать группу новостей. Например:
sudo /usr/local/news/bin/ctlinnd newgroup %g y pr2nntp
Комманда, с помощью которой можно заставить NNTP сервер удалить группу новостей. Например:
sudo /usr/local/news/bin/ctlinnd rmgroup %g
Комманда, с помощью которой можно заставить NNTP сервер удалить 1 пост. Например:
sudo /usr/local/news/bin/ctlinnd cancel %m
Префикс, который будет прибавляться к именам всех групп новостей, с которыми будет работать pr2nntp. Переменная не должна содержать оконечной точки.
Скажем, вы его установили в значение ‘rss’, тогда группа с именем test будет на самом деле на NNTP сервере названа rss.test. Это важный параметр. Хорошо подумайте перед тем, как его установить.
Максимальный размер RSS, при достижении которого эта feed не будет анализироваться. Скачается она все равно, но анализироваться не будет. Установите переменную в значение ‘0’, если не хотите таких проверок.
Способ конструирования писем. Когда переменная равна ‘1’, будет создано MIME multipart/alternative письмо, в котором будет и отфильтрованый от HTML текст и оригинал. Ваш newsreader должен автоматически выбрать наиболее подходящий для него вариант.
Когда переменная равна ‘0’, вы увидите только отфильтрованный текст (если
rss_conf(filter.post)
!= “” ).
От кого письма идут в группы новостей. Это не почтовый адрес, а имя персоны или, скорее, робота. Впрочем, указанное вами имя будет игнорироваться, если в конкретной RSS будут т.н. person constructs, что крайне полезно, если вы читаете блог, в который пишут несколько человек (каждый под своим именем).
Программа, которая будет скачивать RSS. Например:
curl -RfL --progress-bar --noproxy * -o %f %u
Программа, которая конвертирует HTML в текст. Вывод в stdout этой программы обязан быть в UTF8. Например:
w3m -T text/html -dump -I UTF-8 -O UTF-8 -cols 72 -no-graph %f
Соответствует
rss_conf(filter.post)
. Можно написать 1 символ ‘-’ вместо предполагаемой программы и тогда фильтрование будет запрещено.
Синтаксис:
pr2nntp [-vtfsRGTh] [-c directory] [-r regexp]
Виновен NNTP сервер:
Виновен File downloader:
Виновен конвертор из HTML в текст:
rss_conf(mail.mime)
в 1. See Setup.
В pr2nntp встроены простые некоторые функции самотестирования и, когда программа настроена, правильно, то обязана их проходить все.
Каждый раз, когда вы запускаете pr2nntp, она пытается создать тестовую группу, послать туда сообщение и тут же удалить его. Только после такого теста pr2nntp начинает обновлять RSS и проч. Если вы просто хотите выполнить такую проверку и более ничего, воспользуйтесь опцией ‘-t’ (see Invoking).
Более серьезный тест, который одновременно даст вам некоторое представление в каком виде генерируются письма в группы новостей:
Такая проверка выполняется, если вызвать программу с опцией ‘-T’. pr2nntp сообщит вам, если тест провалился.
Если у вас была группа foo.bar, в которой были сообщения с Message-ID A, B, C и вы перейменовали ее (группу) в bar.foo, то теперь вам необходимо вручную удалить письма c Message-ID A, B, C из (удаленной) группы foo.bar, иначе при попытке запостить их снова (уже в bar.foo), сервер будет упрямо говорить, что они ему не нужны
Так будет с INN, поскольку он, удаляя группу, не удаляет сообщения, которые в ней хранились.
pr2nntp -vvR -r foo.bar | grep 'is already on' | \ sed -E 's/.*(<.*>).*/\1/g' | \ xargs -L 1 sudo /usr/local/news/bin/ctlinnd cancel
/usr/local/news/bin/expire
.
Подписавшись на новую RSS, вы случайно можете заметить, что некоторая часть entries в ней отторгается NNTP сервером. Визуально это выглядит так:
Posting #22 of 25 <1160079136_shenderovich.livejournal.com+\ 17175.html@shenderovich.livejournal.com+data+rss>... \ pr2nntp warning: NNTPERROR: 441 437 Too old – \ "Thu, 05 Oct 2006 20:12:16 +0000"
Единственные выход из положения – подкрутить настройки NNTP сервера
на прием более старых писем. Для INN смотрите переменную
artcutoff
в файле inn.conf.
О других найденных ошибках сообщайте на <alexander.gromnitsky.at.gmail.com> с пометочкой “pr2nntp bug” в поле Subject.
Alexander Gromnitsky <alexander.gromnitsky.at.gmail.com>.