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.

Pobierz paczkę ze skryptem

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



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


  1. Patrz, jakbyś zrobił z tego klasę i z danych do blipa/twittera zrobił pola, nie musiałbyś się bawić w globale :)


  2. Pewnie, tylko kurde do nauki obiektowego PHP się zbieram już 3 rok ;)


  3. Najwyższy czas, jak znajdę chwilkę to zarzucę jakimś przerobionym szkieletem tego projektu :)


  4. 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