Захват обновлений временной шкалы статуса Twitter / бесконечные обновления прокрутки - PullRequest
3 голосов
/ 28 декабря 2010

Я использую KRL для добавления элементов в статусы временной шкалы Twitter, аналогичные TwitterBook Джесси Стей.У меня проблема в том, что эти элементы связаны только со статусами, которые в данный момент видны при инициализации букмарклета.Если новый статус добавляется с помощью «нового твита», обновленного с помощью Ajax, или с помощью обновлений статуса с помощью бесконечной прокрутки, эти новые статусы не затрагиваются.Событие обновления статуса в Твиттере через KRL для добавления элементов только в эти новые добавленные статусы?

1 Ответ

3 голосов
/ 28 декабря 2010

Пример, размещенный на

http://kynetxappaday.wordpress.com/2010/12/25/day-21-modifying-facebook-stream-with-kynetx/

, работает с потоком Facebook, но концепция та же

  • создать бесконечный цикл setTimeout дляискать элементы потока
  • выбирать только элементы потока, не помеченные как обработанные
  • элементы потока процесса
  • промывать и повторять

Пример кода из сообщения

ruleset a60x512 {
  meta {
    name "MikeGrace-status-update-translator"
    description <<
      MikeGrace-status-update-translator
    >>
    author "Mike Grace"
    logging on
  }

  global {
    datasource insult:HTML <- "http://www.pangloss.com/seidel/Shaker/index.html?" cachable for 1 second;
  }
  rule find_status_updates_by_mike_grace {
    select when pageview ".*"
    {
      notify("Starting to look for status upates by Mike Grace","");
      emit <|

        // get app object to raise web events
        app = KOBJ.get_application("a60x512");

        // function that finds FB status updates by Mike Grace
        function findMikeGrace() {

          // loop through each stream item on the page that hasn't been processed already by the app
          $K("li[id^=stream_story]:not(li[kfbt])").each(function() {
            var currentStreamItem = this;
            // grab the current stream item posters name
            var name = $K(currentStreamItem).find(".actorName").text();

            // mark the stream item as being processed to reduce future processing times
            $K(currentStreamItem).attr("kfbt","y");

            // is the stream item by the perpetrator?
            if (name == "Michael Grace") {

              // strikethrough the original update
              $K(currentStreamItem).find(".messageBody").wrap("<strike />");

              // get selector to return translation of status update
              var returnSelector = $K(currentStreamItem).attr("id");
              returnSelector = "li#"+returnSelector+" .messageBody";

              // raise web event to get translation for non geeks
              app.raise_event("get_insult", {"returnSelector":returnSelector});

            } // end of checking name

          }); // end of looping through unprocessed stream items

          // call myself again later to process new items on the page
          setTimeout(function() {
            findMikeGrace();
          }, 9000);
        }

        // start the process of finding the perpetrator
        findMikeGrace();
      |>;
    }
  }

  rule get_insult {
    select when web get_insult
    pre {
      selector = event:param("returnSelector");
      insulter = datasource:insult("#{selector}");
      foundInsult = insulter.query("font");
      singleInsult = foundInsult[0];
    }
    {
      emit <|
        console.log(singleInsult);
        $K(selector).parent().after("<br/>"+singleInsult);
      |>;
    }
  }
}
...