Blog jak widać już nie jest aktualizowany. I raczej nie będzie. Wisi sobie ot tak, ze względów historycznych :)

Feed z twittera na stronie Ruby on Rails

Krzysztof Rygielski | 2009-06-12 13:20 | Kategorie: Rails, Twitter, Ruby

Jakiś czas temu postanowiłem dołączyć do swojej strony feed z mojego twittera. Twitter oferuje własne narzędzia do tego, w postaci flasha lub kodu html/javascript do umieszczenia na stronie. Mnie takie rozwiązania jednak nie zadowalały i postanowiłem zrobić to po swojemu.

Całość jest prosta. Zwyczajnie wykorzystałem mechanizm do wstawiania rss na stronę RoR. Potrzebny jest kontroler:

class TwitterController < ApplicationController

  require 'rubygems'
  require 'simple-rss'
  require 'open-uri'

  def index
    @rss = SimpleRSS.parse open('https://twitter.com/statuses/user_timeline/28768114.rss')
  end
end

Adres w przykładzie to rss mojego twittera :-) Następnie widok views/twitter/index.html.erb

<div id="twitter">
  <h1>Twitter: <%=link_to("rygiel","http://twitter.com/rygiel")%></h1>
  <%=print_tweets(@rss.items)%>
</div>

Tutaj na sztywno ustawiłem link do mojego profilu. Używam również funkcji z helpera do wypisywania wszystkich wpisów wydłubanych z rss. Funkcja print_tweets() z helpera wygląda tak:

def print_tweets(items)
  items.map do |i|
    content_tag(:div,
      content_tag(:p,i.pubDate.strftime("%Y-%m-%d %H:%M"),:class=>"date") +
      content_tag(:p,parse_recipient(parse_links(i.description[7,i.description.length])),:class=>"description"),
      :class=>"item"
    )
  end
end

Jak widać stosuję tutaj dodatkowe funkcje, parse_recipient i parse_links. Poza tym nie wypisuję całego pola description tylko określony podłańcuch. Robię to dlatego, że każdy wpis w rss z twittera zaczyna się od identyfikatora, w moim przypadku rygiel: treść... Zatem wycinam ten fragment, zostawiając tylko treść...

Funkcja parse_recipient służy do odnalezienia we wpisie łańcucha w stylu @identyfikator, który pojawia się w treści, jeśli odpisujemy do kogoś konkretnego. Wówczas taki identyfikator jest zamieniany na bezpośredni odsyłacz do profilu danej osoby. Funkcja ta wygląda następująco:

def parse_recipient(text)
  recipient = text.match("\@[a-zA-Z_]+")
  if recipient
    text.gsub(recipient[0],"@" + link_to(recipient[0][1..recipient[0].length], "http://twitter.com/#{recipient[0][1..recipient[0].length]}"))
  else
    text
  end
end

Identyfikator jest odnajdowany przy użyciu wyrażenia regularnego zastosowanego w funkcji match. Następnie zamieniamy ten identyfikator (o ile istnieje) na link.

Funkcja parse_links z kolei służy to zamiany wszystkich linków znajdujących się w treści na właściwie działające.

def parse_links(text)
  links = text.match("http://[a-zA-Z0-9\.-]+\/*[^ ]*")

  unless links.nil?
    0.upto(links.length-1) do |i|
      text.gsub!(links[i],link_to(links[i],links[i]))
    end
    text
  else
    text
  end
end

Najpierw znajdujemy wszystkie podłańcuchy będące adresami url. Potem wszystkie zamieniamy na działające "klikalne" odsyłacze.

Być może można to wszystko zrobić bardziej finezyjnie, ale ja zrobiłem to właśnie tak :-)