RSS-лента по почте

    Есть одна важная для меня RSS-лента. И хочется оперативно узнавать о “новых новостях” в ней. К сожалению, почтовой рассылки этот новостной сервер не предоставляет. Для чтения RSS я привык пользоваться Web-сервисом Google Reader, а он, несмотря на своё происхождение и родственные связи с Gmail, такой возможности тоже не даёт. И его мобильный клиент никак не оповещает о появлении новостей в лентах. Может и слава Богу – некоторые фиды очень плодовиты – но ведь бывают случаи когда это полезно. Вот как я выкрутился.


    Чуть погуглив, я нашел довольно простое решение. Замечательный сервис автоматизации – ifttt.com (If This Then That). Сервис позволяет создавать правила по принципу «если–то» и поддерживает тьму социальных сетей и других сервисов. В частности, можно создать правило, что при появлении новости в определенном фиде, будет отправляться письмо на такой-то ящик. Вроде бы то что надо, но несколько моментов не давали покоя. Какие недостатки я тут вижу:

    1. В Google Reader необходимо создать ленту, которой на практике пользоваться не придётся. Ведь если я буду получать почту о новых событиях, зачем мне тогда этот фид в клиенте?
    2. Значит, в этой ленте будут скапливаться непрочитанные новости. Чисти их ещё чтоб не маячили...
    3. Для ленты придётся специально создать папку, чтобы ifttt мог эту ленту идентифицировать. Это уже особенность работы ifttt с сервисом Google Reader.
    4. Для того, чтобы пользоваться ifttt, придётся в нем зарегистрироваться. Очередная учетная запись, сколько ж можно?

    Что бы придумать? Определенно, нужно серверное решение. И тут на помощь приходит Корпорация Добра, вся такая в белом, если опять не закроет какой-нибудь сервис. Я вспомнил про Google Apps Script и Google Диск. Решение очень простое. Создаем таблицу на Goolge Диск и добавляем в неё вот такой сценарий (меню “Инструменты” => “Редактор скриптов...”):

    function onTimer() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var maxPubDate = new Date(sheet.getRange(1, 1).getValue());
      
      var txt = UrlFetchApp.fetch("http://habrahabr.ru/rss/best/").getContentText();
      var doc = Xml.parse(txt, false);
      
      var channel = doc.getElement().getElement("channel");
      
      var mailBody = "";
      var items = channel.getElements("item")
      var curMaxPubDate = maxPubDate;
      var hasNews = false;
      for (var i in items) {
        var pubDate = new Date(items[i].getElement("pubDate").getText());
        
        if (pubDate > maxPubDate) {
          if (pubDate > curMaxPubDate) {
            curMaxPubDate = pubDate
          }
          hasNews = true;
          mailBody += "\nЗаголовок: " + items[i].getElement("title").getText();
          mailBody += "\nСсылка: " + items[i].getElement("link").getText();
          mailBody += "\nДата публикации: " + pubDate;
          mailBody += "\n";
        }
      }
      
      if (hasNews) {
        GmailApp.sendEmail("xxxxxxxx@gmail.com", "Новости Хабра!", mailBody);
        sheet.getRange(1, 1).setValue(curMaxPubDate);
      }
    }
    

    Да, надо не забыть вписать в ячейку A1 какую-нибудь древнюю дату, “30.01.2002 13:00:00”, как вариант. Затем устанавливаем скрипт на запуск, например, каждые 10 минут. Для этого в редакторе сценариев выбираем пункт меню “Ресурсы” => “Триггеры текущего проекта...” и добавляем “динамический минутный таймер”.

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

    В угоду простоте и лаконичности, в скрипте не хватает парсинга протокола Atom. Ну и в таблицу стоит добавить список наблюдаемых фидов, но это уже дело техники.

    Получается, мне не понадобились RSS-клиенты, серверы автоматизации и дополнительные учётки. Только моя Гугловская. На всякий случай подчеркну – описанное выше, вовсе не замена RSS-клиентам. Это всего лишь вариант оповещения по почте о новостях в одной-двух любимых лентах.

    К своему стыду, должен признать, что это первый раз, когда мне пришло в голову использовать Google Apps Script. А вам приходилось применять Google Apps Script? Если это не секрет, поделитесь, пожалуйста, опытом в комментариях – для каких задач?

    UPD:
    Я добавил парсинг протокола Atom и наблюдение за несколькими фидами. Подробности у меня в блоге.
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 21
    • +5
      Красиво
      • –2
        В хабе DIY надеялся увидеть какую-нибудь свистелку лампочку, сообщающую о новом в RSS. А тут только почта :(
        • 0
          Ну да, в этот раз серьезно сомневался, стоит ли в DIY? Но все же решился — пусть программная, но поделка. Каждый нетерпеливый RSS-подписчик может повторить. Я, кстати, DIY так тоже подслушивать стал.
          Давайте если ваш комментарий наберет плюсов, уберу из DIY?
          • 0
            Есть такой замечательный хаб «Google App Engine», вроде туда этот топик подходит лучше. DIY это все-таки отвертки, паяльники и молотки.
            • +1
              Решено, уговорили и я перенёс :)
        • +3
          1. Добавляем RSS в feedburner
          2. Включаем подписку по email
          3. Подписываемся
          4.…
          5. PROFIT
          • +4
            Хотел так же написать, но на почту все это будет приходить один раз в день.
            • +8
              Кажется, вы спасаете мой велосипед :) Это меняет дело, раз в день меня никак не устроит
            • 0
              Ух ты, встречал упоминания о нём, но не вник и подумал, что это очередная учётка на мою голову. А сервис-то от Гугла :)
              Спасибо за информацию.
              • 0
                Спасибо, помогло.
              • 0
                Если это не секрет, поделитесь, пожалуйста, опытом в комментариях – для каких задач?

                Единственное чем пользуюсь, — это отправка SMS на свой телефон(symbian) списка из Google Tasks 2 раза в день (до работы и в конце)
                • +2
                  Так есть же RSS-канал у IFTTT ifttt.com/feed
                  • 0
                    Я же написал об этом. И что меня не устроило написал.
                    • 0
                      3 из 4-х пунктов касались того, что RSS нужно добавить в Google Reader. IFTTT может забирать фиды напрямую без GR.
                      • 0
                        Я понял, но остаётся учётка в сервисе, который мне больше не нужен.
                        • 0
                          По-моему, Вы сделали больше телодвижений :)

                          Раньше я пользовался сервисом rss2mail.ruбно он, похоже, помер (как и www.feedmyinbox.com/), а может я адрес забыл.

                          Лёгкое гугление даёт www.feedmailer.net. По описанию есть всё, что нужно, но, увы, тоже надо регистрироваться :) Тогда уж лучше ifttt, полезная штука, её можно и для чего другого приспособить.
                          • +1
                            Да в принципе, я с вами согласен. Не такая проблема зарегистрироваться в сервисе и ничего не программировать. Я программист, потому, наверное, выбрал простой скрипт, а не сервис. Любопытство, наверное…

                            Просто подобное применение Google Apps Script в «бытовом» вопросе меня порадовало. Честно сказать, пост я сделал скорее ради последнего абзаца. :) И комментариев. Мне интересно как бы я ещё мог использовать Google-скрипт. Пока у меня складывается впечатление, что особо этот сервис Гугла и не используется нашим братом…
                  • 0
                    Аналогично работает blogtrottr.com (пример встраивания blogtrottr в ваш сайт).
                    • +1
                      Спасибо за статью. Узнал для себя полезную вещь и настроил отправку СМС из одного важного мне RSS.
                      • 0
                        Не могли бы Вы доделать парсинг протокола Atom? Мне это было бы очень полезно.
                        • 0
                          Вот вариант без затей. Такой же, как приводился в этом посте про разбор RSS:

                          function onTimerAtomParser() {
                            var sheet = SpreadsheetApp.getActiveSheet();
                          
                            const maxPubDateRow = 2;
                            const maxPubDateColumn = 1;
                            
                            var maxPubDateText = sheet.getRange(maxPubDateRow, maxPubDateColumn).getValue();
                            var maxPubDate = "2000-01-01T00:00:00Z";
                            if (maxPubDateText != "") {
                              maxPubDate = maxPubDateText;
                            }
                            	
                            var txt = UrlFetchApp.fetch("http://code.google.com/feeds/p/robot-mitya/issueupdates/basic").getContentText();
                            var doc = Xml.parse(txt, false);
                            
                            var feed = doc.getElement();
                            
                            var mailBody = "";
                            var entries = feed.getElements("entry")
                            var curMaxPubDate = maxPubDate;
                            var hasNews = false;
                            for (var i in entries) {
                              var pubDate = entries[i].getElement("updated").getText();
                              
                              if (pubDate > maxPubDate) {
                                if (pubDate > curMaxPubDate) {
                                  curMaxPubDate = pubDate
                                }
                                hasNews = true;
                                mailBody += "\nЗаголовок: " + entries[i].getElement("title").getText();
                                mailBody += "\nСсылка: " + entries[i].getElement("link").getAttribute("href").getValue();
                                mailBody += "\nДата публикации: " + pubDate;
                                mailBody += "\n";
                              }
                            }
                            
                            if (hasNews) {
                              GmailApp.sendEmail("xxxxxxxx@gmail.com", "Atomная почта!", mailBody);
                              sheet.getRange(maxPubDateRow, maxPubDateColumn).setValue(curMaxPubDate);
                            }
                          }
                          


                          А ещё в конец поста я сейчас добавлю ссылку, где будет чуть более умный скрипт.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.