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:
















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.
a teraz z serii głupie pytanie: gdzie to wstawiamy…? :>
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 ?
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.Ravicious – dzięki wielkie, już poprawiłem. Teraz powinno chodzić.
Tak, wersja php, wykonywana cronem to szczyt moich marzeń
Oki, postaram się dziś wieczorem to przepisać do php.