Last.fm na Twitterze i Blipie

Pozwoliłem sobie zmodyfikować skrypt w Ruby autorstwa Nicholasa Pike, wyświetlający nasze ulubione piosenki z last.fm na Twiterze, dodając mu także obsługę naszego rodzimego Blipa. Skrypt sprawdza co 5 min czy nie zaznaczyliśmy nowej piosenki jako ‘lubię‘, jeśli odnajdzie taką zmianę zaktualizuje nasz status na obu mikroblogach.

Jeśli chcemy korzystać tylko z jednego z systemów wystarczy pozostawić puste pola nazwy użytkownika i hasło dla danego konta , a skrypt nie będzie próbował aktualizować danego mikrobloga.

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
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env ruby
# @author:  Nicholas Pike - npike@npike.net
#blip-mod: Harv - http://harv.pl 
 
require 'net/http'
require 'rexml/document'
 
# Dane dla Twittera
TW_USER = ''
TW_PASS = ''
# Dane dla Blipa
BL_USER = ''
BL_PASS = ''
 
# Nazwa użytkownika w Last.fm
LF_USER = ""
 
# DO NOT CHANGE BELOW THIS
TW_URL  = 'http://twitter.com/statuses/update.xml'
BL_URL  = 'http://api.blip.pl/updates'
LAST_FM_URL = "http://ws.audioscrobbler.com/1.0/user/#{LF_USER}/recentlovedtracks.xml"
 
# temp variables
last_url = ""
first_run = 1
 
def postToTwitter(message)
  begin
    url = URI.parse(TW_URL)
    req = Net::HTTP::Post.new(url.path)
    req.basic_auth TW_USER, TW_PASS
    req.set_form_data({'status' => message})
    begin
      res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
      case res
        when Net::HTTPSuccess, Net::HTTPRedirection
          if res.body.empty?
            puts "Twitter nie odpowiada"
 
          else
            puts 'Twitter zaktualizowany'
 
          end
        else
          puts 'Aktualizacja sie nie powiodla'
          # res.error!
 
        end
    rescue
      puts $!
 
    end
  rescue SocketError
    puts "Twitter jest niedostepny"
 
  end
end
 
def postToBlip(message)
  begin
    url = URI.parse(BL_URL)
    req = Net::HTTP::Post.new(url.path)
    req.basic_auth BL_USER, BL_PASS
    req.set_form_data({'body' => message})
    begin
      res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
      case res
        when Net::HTTPSuccess, Net::HTTPRedirection
          if res.body.empty?
            puts "Blip nie odpowiada"
 
          else
            puts 'Blip zaktualizowany'
 
          end
        else
          puts 'Aktualizacja sie nie powiodla'
          # res.error!
 
        end
    rescue
      #puts $!
 
 
    end
  rescue SocketError
    puts "Blip jest niedostepny"
 
  end
end
 
while true
 
# get the XML data as a string
xml_data = Net::HTTP.get_response(URI.parse(LAST_FM_URL)).body
doc = REXML::Document.new(xml_data)
 
if ( doc.elements["recentlovedtracks/track[1]/url"].text != last_url)
   puts "No match"
 
   last_url = doc.elements["recentlovedtracks/track[1]/url"].text
   last_artist = doc.elements["recentlovedtracks/track[1]/artist"].text
   last_name = doc.elements["recentlovedtracks/track[1]/name"].text 
 
   short_url = Net::HTTP.get_response(URI.parse('http://is.gd/api.php?longurl='+last_url)).body
 
   message = "Last.FM: #{last_name} - #{last_artist} \n\n#{short_url}"
 
  # Dont send a twitter message on first run of script
   if (first_run != 1)
      if (TW_USER != '')
        postToTwitter(message)
       end
      if (BL_USER != '')
        postToBlip(message)
      end
   end
   first_run = 0
else
  puts "Brak zmian"
end
sleep 200
end

Czekam na komentarze, jeśli będzie zapotrzebowanie mogę w wolnej chwili przepisać to do php.

Może zainteresują Cię też te wpisy:



Komentrze do wpisu "Last.fm na Twitterze i Blipie"


  1. To ja mam nadzieję, że będzie zapotrzebowanie na php, bo tutoriale od Ruby mnie przerażają ;) W każdym razie, świetny pomysł i skrypcik.


  2. a teraz z serii głupie pytanie: gdzie to wstawiamy…? :>


  3. Miło że jest w ogóle jakieś zainteresowanie ;)

    Kasia – kopiujesz to do pliku i wywołujesz z linii poleceń, ja tego używam akurat w shellu Linuxowym.

    Paweł – rozumiem że chciałbyś to inicjować z crona?

    A co byście powiedzieli na stronę, która by to automatyzowała? Problem może być tylko tej natury, że z tego co widzę hasło i login z blipa trzebaby przechowywać cleartextem… Chyba że zna ktoś inny mniej ‘jawny’ sposób logowania się do blipa via API ?


  4. Mógłbyś wrzucić na pastie.org lub podobny serwis?

    Kod jest tutaj chyba błędnie wyświetlany (chodzi mi o np. req.set_form_data({'status' => message})), co powoduje błędy.


  5. Ravicious – dzięki wielkie, już poprawiłem. Teraz powinno chodzić.


  6. Tak, wersja php, wykonywana cronem to szczyt moich marzeń ;)


  7. Oki, postaram się dziś wieczorem to przepisać do php.