alx / twitticious

Import links from a twitter timeline to your del.icio.us account.

alx (author)
Sun Dec 21 07:33:19 -0800 2008
twitticious / twitticious.rb
100644 110 lines (95 sloc) 3.154 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# myapp.rb
require 'rubygems'
require 'sinatra'
require 'rdelicious'
 
get '/' do
  erb :index
end
 
post '/' do
  process_request
  erb :index
end
 
helpers do
 
  def process_request
  
    # Verify twitter id is correct
    if is_twitter_id?(params[:twitter_id]) or params[:twitter_public] == "yes"
      @delicious = Rdelicious.new(params[:delicious_id], params[:delicious_password])
 
      # Verify we can access delicious account
      if @delicious.is_connected?
 
        # Travelling around twitter timeline
        if params[:twitter_public] == "yes"
          # Read public timeline
          twitter = read_public_twitter()
        else
          # Read user timeline
          if params[:twitter_friends] == "include"
            # Include friends
            twitter = read_twitter(params[:twitter_id], true)
          else
            # Without friend network
            twitter = read_twitter(params[:twitter_id])
          end
        end
 
        twitter.each_element('//text') do |element|
          description = element.text
          # Scan for url in twitter status item
          url = description.scan(/(http:\/\/.[^<\s$]*)/)[0].to_s
          tags = description.scan(/\+.[^\s]*/).join(" ").delete('+')
          # Verify url is not null and doesnt exists in delicious account
          if !url.nil? and !url.empty? and !@delicious.url_exists?(url)
            description.slice!(url) # Remove url from description
            description.slice!(/\+.[^\s]*/) # Remove tags
            description.slice!(/:\s*$/) # Remove trailing ":" used to send url in twitter
            @delicious.add(url, description, tags)
          end
        end
      else
        error = "Please verify your Delicious information"
      end
    else
      error = "Please verify your Twitter information"
    end
  
    return [@delicious, error]
  end
 
  ###
  # Twitter methods
  ###
 
  # Return true if twitter_id exists
  def is_twitter_id?(twitter_id)
    resp = twitter_request(twitter_id)
    # Response is not empty and doesn't contain 404 or "not found"
    return (!resp.empty? and ((resp =~ /404/).nil? or (resp =~ /not found/).nil?))
  end
 
  # Return an array of last element of twitter_id timeline
  def read_twitter(twitter_id, include_friends = false)
    resp = twitter_request(twitter_id, include_friends)
    begin
      # XML Document
      return REXML::Document.new(resp)
    rescue REXML::ParseException => e
      return false
    end
  end
 
  # Return an array of last element of twitter public timeline
  def read_public_twitter()
    return read_twitter("public_timeline")
  end
 
  def twitter_request(twitter_id, include_friends = false)
    if include_friends
      request = "/statuses/friends_timeline/#{twitter_id}.xml"
    else
      request = "/statuses/user_timeline/#{twitter_id}.xml"
    end
    response = ""
    begin
      http = Net::HTTP.new("twitter.com")
      http.start do |http|
        req = Net::HTTP::Get.new(request, {"User-Agent" => "Twitticious"})
        response = http.request(req).body
      end
    rescue SocketError
      return false
    end
    return response
  end
  
end