Last.fm na Twitterze i Blipie w PHP
Jakiś czas temu opublikowałem swoją wersję skryptu wyświetlającego nasze ulubione utwory z Last.fm na Blipie i Twitterze. Jako, że pojawiło się zapotrzebowanie na wersję w PHP, postanowiłem go szybko przepisać.
Nie jest to 100% odpowiednik wersji Ruby, ale chyba będzie spełniał swoje zadanie. Skrypt używa pliku tymczasowego do przechowywania ostatnich danych z Last.fm, aby uniknąć nieskończonej pętli i wysyłania jednego statusu w kółko. Dlatego też należy nadać odpowiednie prawa katalogowi w którym ten plik będzie tworzony, jego ścieżkę możecie określić zmienną w ‘części konfiguracyjnej’ skryptu. Jako parsera XML użyłem gotowej klasy z php.net, także nie zapomnijcie wypakować wszystkich plików z paczki do katalogu w którym będzie działał skrypt.
Pamiętajcie żeby przed każdym odpaleniem usunąć plik tymczasowy, na tej podstawie skrypt orientuje się czy jest odpalony po raz pierwszy, czy nie. Chyba, że chcecie żeby przy pierwszym przebiegu już zaktualizował microblogi.
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 | < ?php /* Last.fm 2 Twitter and Blip Script by Harv - http://harv.pl v.0.1 */ include_once "xx_xml.php"; #Dane dla blipa $bl_user = ''; $bl_pass = ''; #Dane dla Twittera $tw_user = ''; $tw_pass = ''; #User Last.fm $lfm_user = ''; #Sciezka pliku tmp $tmp_fn = "lsfm_tw"; #Adresy API etc $lfm_url = 'http://ws.audioscrobbler.com/1.0/user/'.$lfm_user.'/recentlovedtracks.xml'; $tw_url = 'http://twitter.com/statuses/update.xml'; $bl_url = 'http://api.blip.pl/updates'; function postTwitter($message) { global $tw_user, $tw_pass, $tw_url ; $curl_handle = curl_init(); curl_setopt($curl_handle,CURLOPT_URL,"$tw_url"); curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2); curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl_handle,CURLOPT_POST,1); curl_setopt($curl_handle,CURLOPT_POSTFIELDS,"status=$message"); curl_setopt($curl_handle,CURLOPT_USERPWD, "$tw_user:$tw_pass"); $buffer = curl_exec($curl_handle); curl_close($curl_handle); // check for success or failure if ($buffer) { echo 'Twitter success'; } else { echo $buffer; } } function postBlip($message) { global $bl_user, $bl_pass, $bl_url; $curl_handle = curl_init(); curl_setopt($curl_handle,CURLOPT_URL,"$bl_url"); curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2); curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl_handle,CURLOPT_POST,1); curl_setopt($curl_handle,CURLOPT_POSTFIELDS,"body=$message"); curl_setopt($curl_handle,CURLOPT_USERPWD, "$bl_user:$bl_pass"); $buffer = curl_exec($curl_handle); curl_close($curl_handle); // check for success or failure if ($buffer) { echo 'Blip success'; } else { echo $buffer; } } #Czyta XML $raw = new xx_xml($lfm_url ,'url'); $last_url = $raw->data ['recentlovedtracks|track|url']['data'][0] ; $last_artist = $raw->data ['recentlovedtracks|track|artist']['data'][0] ; $last_track = $raw->data ['recentlovedtracks|track|name']['data'][0] ; $lat_date = $raw->data ['recentlovedtracks|track|date']['data'][0] ; #Skroc URL $sh_url = 'http://is.gd/api.php?longurl='.$last_url; $short_url = file_get_contents($sh_url); #Wiadomosc $message = 'Last.fm: '.$last_artist.' - '.$last_track.' '.$short_url ; #Pierwszy raz ? if(file_exists($tmp_fn)) { $fh = fopen($tmp_fn, 'r') or die("Can't open file"); $tmp_data = fread($fh, filesize($tmp_fn)); fclose($fh); if($tmp_data != $last_url) { if(!empty($tw_user)) postTwitter($message); sleep(2); if(!empty($bl_user)) postBlip($message); $fh = fopen($tmp_fn, 'w+') or die("Can't open file"); fwrite($fh, $last_url); fclose($fh); } else echo 'Bez zmian'; } #Pliku nie ma, pierwsze odpalenie else { $fh = fopen($tmp_fn, 'w+') or die("Can't open file"); fwrite($fh, $last_url); fclose($fh); echo 'First Run'; } ?> |
Skrypt ten, w przeciwieństwie do tego napisanego w Ruby, oczywiście nie rezyduje w pamięci monitorując stale zmiany na Last.fm i potrzebuje pomocy np. crona, aby aktualizować dane na bieżąco. Przykładowy zapis crontab uruchamiający skrypt co 2 minuty:
*/2 * * * * root /usr/bin/lynx -source http://_adres skryptu_
W razie jakichkolwiek problemów postaram się pomóc, potestujcie i wytknijcie błędy, które z pewnością popełniłem.
















Patrz, jakbyś zrobił z tego klasę i z danych do blipa/twittera zrobił pola, nie musiałbyś się bawić w globale
Pewnie, tylko kurde do nauki obiektowego PHP się zbieram już 3 rok
Najwyższy czas, jak znajdę chwilkę to zarzucę jakimś przerobionym szkieletem tego projektu
Naszkryfiłem coś. Nie testowałem na Twitterze, ale gdybyś był tak uprzejmy
Oto cała klasa główna wraz z przykładem użycia na samym dole:
http://pastebin.com/fa05ffb1
Oraz cała paczka (w paczce przykład użycia znajduje się w example.php):
http://wyslijto.pl/plik/j1onkdhxe2