Линукс, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты, немного ФП

20080218

Кросспост RSS в ЖЖ (bash-скрипт)

Обновление: Более совершенный скрипт для кросспоста был написан мной на Haskell. Подробности здесь.


Захотелось мне наладить автоматическую публикацию ссылок на мои записи в ЖЖ…

Сразу же нашёл сервис rss2lj. Он, однако, в настоящий момент не работает. После этого стал искать, как сделать то же самое своими силами.

Нашёл, что есть два механизма автоматической публикации в ЖЖ. Первый — с использованием XMLRPC. Как это делается на PHP желющие могут увидеть в исходниках плагина к вордпресс lj_crosspost. Второй способ — использовать возможность emailpost в ЖЖ. В этом случае письма, отправленные на адрес вида пользователь@post.livejournal.com будут публиковаться как посты.

Я выбрал второй вариант, потому что письма можно слать из любого скрипта одной командой, а возиться с авторизацией через XMLRPC не хотелось. Правда, функция emailpost в ЖЖ не бесплатна, платить за неё надо либо чистым золотом, либо рекламой. Остановился на рекламе, включив в ЖЖ «улучшенный рекламой эккаунт» :)

После этого оставалось написать скрипт, который бы брал RSS и делал из него много писем. В действительности, такой скрипт уже есть. Можете взглянуть на rss2email, лежащий в репозиториях Debian. Впрочем, он скорее предназначен для чтения RSS через email, а я хотел лишь вытаскивать из RSS ссылки.

Вытащить нужные поля из RSS можно и xmlstarlet-ом:
curl -g http://feeds.feedburner.com/sovety?alt=rss -s | \
xmlstarlet sel -t -m "/rss/channel/item" \
-v "guid" -n -v "pubDate" -n \
-v "title" -n -v "link" -n
Оставалось только атоматически формировать из этих полей текст письма (awk-ом), отсылать всё это в ЖЖ (mutt-ом) и отмечать на память уже отосланные записи (чтобы не слать повторно). Получился вот такой скрипт.

Теперь анонсы моих постов можно прочитать и в ЖЖ: jetxee.livejournal.com.

Что не работает: ЖЖ приходит в ступор, получая письма, в Subject которых UTF-8. По идее Subject должен становиться заголовком поста, но выходит ерунда. ЖЖ должен особым образом обрабатывать в письме строки вида lj-tags: blabla, давая записям тэги, но у меня это тоже почему-то не срабатывает.

17 коммент.:

  1. Тогда-уж проще все написать на perl-е

    ОтветитьУдалить
  2. У меня Wordpress, соответсвенно пользую lj_crossposter. Если честно, про возможность email-постинга даже и не знал.
    А вот чисто теоретически, если на указанный email заслать чего-нибудь непотребное аля спам, как ЖЖ к этому отнесется?

    ОтветитьУдалить
  3. ЖЖ требует, чтобы

    или в тексте письма, или в теме или в адресе встречалась строчка +PIN, где PIN — задаваемый пользователем ЖЖ код (пароль); без него ничего в ЖЖ не постится;

    или же сообщение было подписано с помощью электронной подписи (публичный ключ нужно сообщить ЖЖ заранее);

    Всё остальное, видимо, идёт в /dev/null, вместе со спамом.

    ОтветитьУдалить
  4. Есть ещё третий способ. Можно напрямую через http отпровлять сообщения.
    Я когда учился на питоне программировать, написал программку, отправляющие посты в жж.

    Кривовата конечно же. Но зато не надо включать рекламу :)

    http://pastebin.com/f2848ef38

    ОтветитьУдалить
  5. Спасибо за ссылку на ваш скрипт. Как-нибудь его попробую. Смущает, что как только ЖЖ изменят что-нибудь в своих URL или начнут капчу подсовывать, метод через HTTP POST начнёт ломаться. e-mail кажется надёжнее.

    Я бы также не стал формировать HTTP запрос вручную, в Python можно воспользоваться urllib. Код сокращается на несколько строчек, и меньше шанс формировать невалидные запросы. Но это так уже, мелкое улучшение для вашего скрипта.

    ОтветитьУдалить
  6. С темой не так все просто, как с остальным текстом. По RFC если в теме есть расширенные символы, то она должна быть закодирована в base64 с указанием кодировки.

    Можно заморочиться и сделать это из скрипта. Выглядеть это будет примерно так:

    echo "Subject: =?utf-8?b?`echo $subj | uuenview --kakayato-optsiya`?="

    ОтветитьУдалить
  7. Не думаю, что HTTP API менее стабильное, чем XMLRPC или почтовое.
    Если введут каптчу, то не на добавление записей в свой ЖЖ. Да и в таком случае от метода постов через e-mail придётся отказаться совсем, ибо как через него каптчу реализовать?

    Это API используют многие ЖЖ-клиенты, например семаджик. Вряд ли СУП захочет ломать их работу.

    ОтветитьУдалить
  8. Анонимный20/2/08 17:13

    Именно поэтому я отправляю сообщения с помощью mutt, а не mail. Он сам кодирует заголовки правильно. Я проверял. Проблема в том, что жж их потом не раскодирует.

    ОтветитьУдалить
  9. Я исхожу из того, что пост по HTTP — это просто использования сайта «как есть». Никто никакого API не предоставлял и не документировал. Просто вместо заполнения формы в браузере, её можно послать напрямую из программы. Устройство формы может меняться. Услуга же emailpost предлагается официально, более того, является одной из приманок платного эккаунта. Вряд ли её отменят. Про степень официальности XML RPC я не знаю.

    ОтветитьУдалить
  10. Дык а чем blog.ru не устроил, если стоит задача трансляции этого блога в жежешечку?

    ОтветитьУдалить
  11. Здравствуйте. У меня также блог на blogspot.
    Я, к сожалению, не занимался программированием и способ, описанный вами мне не ясен.
    Не могли бы вы немного популяризовать?
    Что делать с вышеприведённым скриптом, куда, извиняюсь за выражение, его вставлять?
    Это крайне важный вопрос не только для меня, но и для моих друзей, собирающихся покидать ЖЖ.

    (А постинг в ЖЖ по rss2email - это кривовато и к тому же html не проходит, насколько я помню. А ещё в письмах от рсс2емэйл в конце стоит ссылка с предолжением пройти по ней, чтобы отписаться. А это не удобно =) Ведь любой может щёлкнуть.)

    ОтветитьУдалить
  12. Здравствуйте, Мелнар!

    Способ описанный здесь, это был мой собственный велосипед. Для его использования нужно иметь доступ к какой-либо unix-системе, где установлены bash, wget, awk, xmlstarlet и mutt, тогда указанный скрипт можно либо исполнять вручную из коммандной строки, или запускать по расписанию, используя crontab.

    Способ довольно кривой, но зато не требовал больших трудозатрат. И более-менее работает. HTML проходит. Не проходит уникод в заголовке.

    Откровенно говоря, механизм отправления постов по email мне в ЖЖ не нравится, так что думаю заменить его постом по HTTP.

    Пока что я опробовал скрипт pyljpost.py из плагина к vim pyljpost. Скрипт там лежит внутри архива. Работает. В том числе с уникодом. И позволяет использовать почти любые возможности ЖЖ. Быть может допилю его под нужды rss2lj, если найду время.

    Это, однако, не изменит способа использования всего комбайна в целом: вручную или автоматически с какой-либо unix-машины. Потому что должна быть машина, которая будет регулярно проверять RSS, готовить из него посты. А как заслать в ЖЖ — дело последнее.

    PS. В подписке по e-mail ссылка, чтобы отписаться, должна быть. Это ж не спам.

    ОтветитьУдалить
  13. Спасибо огромное за ответ!
    Т.е. данный способ ограничен одним компьютером, сидя в гостях или ещё где (или отсылая пост с телефона или почты) он не сработает.
    неплохо, но, конечно, не универсально, тем более для рядового пользователя.
    Хорошо бы написать что-нибудь такое типа , только без глюков и тормозов.
    Ну, и разместить на каком-нибудь хостинге, чтоб всё было автономно.. Но это всё мечты.

    А насчёт сылки в конце письма: да, она должна быть, но в данном случае она там просто крайне некстати. Ведь любой зашедший на дневник таким образом может прекратить такого рода кросспостинг.
    Возможный вариант - найти такую службу rss to email, где содержание письма можно будет самолично настроить. Но я пока не нашёл...

    ОтветитьУдалить
  14. Да, рядовой пользователь линукс может просто воспользоваться рабочей машиной. Чтобы делать это независимо от местонахождения, нужно действительно размешать на хостинге. Благо, стоит всего 150 руб./месяц. Каждый может себе и своим друзьям такую штуку запустить.

    Настраивать же открытую службу — пустая трата сил, потому что один раз такую службу уже сделали, она работала, но ЖЖ, видимо, приложил все усилия, чтобы она работать перестала.

    ОтветитьУдалить
  15. 2 CyberZX - связи между отсылкой постов и рекламой я не вижу :)

    ОтветитьУдалить
  16. Есть возможность наладить такой кросспостинг через службы-посредники. Мне вот кстати, чего-то не позволили в жж улучшить аккаунт рекламой :)

    ОтветитьУдалить
  17. Иван4/6/10 03:39

    Давно уже есть группа которая делает трансляцию любой информации в любой блог.

    берет помесячную оплату, но я например брал на год так дешевле, очень доволен сервисом.

    причем они оказывают тех поддержку круглосуточную, что не мало важно, лучше воспользоваться услугами нормальной компании, чем бесплатные сервисы которые вылетают постоянно.

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