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 :-)