はじめに
Last.FM "Submission" API PHPを操作するための通常のライブラリは1つではありません。それを把握して自分で記述しなければなりませんでした...
まず、APIアカウントの登録ページにアクセスする必要があります 。
すべてのデータを入力すると、公開キーと秘密キーの2つのキーが提供されます。
すべてのフィールドが必須です:
- アプリケーション/デバイス名 -アプリケーションの名前
- アプリケーション/デバイスの説明 -アプリケーションの説明
- コールバックURL-トークンを受け取るPHPスクリプトのページへのリンク(以下を参照)
Last.FMと通信します
ここで、独自のclientIDをアクティブにするために、submissions @ last.fmに電子メールを送信する必要があります。
原則として、独自のclientIDは必要ありませんが、トラックが再生されるトラックを聞いているときにアプリケーションを表示したい場合は、引き続き記述する必要があります。
ここに私の通信の少しばかげたログがあります:
私:こんにちは。
リクエストで使用するために独自のclientIDを購入したい。
サイト-vpleer.ru音楽検索エンジン。 last.fmでごちゃごちゃにしたい
ありがとう
エイドリアン:やあ、
私はロシア語を話せないのではないかと心配しています。英語でその要求を言い換えることはできますか
よろしく、エイドリアン
私:オーケー、英語が下手でごめんなさい。こんにちは。
クエリで使用するclientIDを所有しています。
ウェブサイト-vpleer.ru音楽検索エンジン。 scrobblingとlast.fmを結びたい
ありがとう。 私を理解しますか?)
エイドリアン:やあ、
わかりました、今回はわかりました。 新しいクライアントIDは「***」です-1時間後にこれを使用できるようになります。 ハッピースクロブル!
よろしく、エイドリアン
ここで=)私はclientIDを隠すことにしました クライアントIDからのリクエストに問題がある場合は、それをカバーできます。 (少なくともAPIで記述されています)
仕事を始める
ユーザーはリンクwww.lastfm.ru/api/auth?api_key= MY_PUBLIC_KEYに従う必要があります。ここで、 MY_PUBLIC_KEYは公開鍵です。
さらに、ユーザーがこのアプリケーションを使用することに同意すると、1つの単一のGET要求「トークン」で同じコールバックURLにリダイレクトされます...
<?php
/*
Coded by Isis (c) 2010
Link: www.lastfm.ru/api/auth?api_key=8ea0be38326c1275db95968ab677cfb6
*/
define( 'API_KEY' , '8ea0be38326c1275db95968ab677cfb6' );
define( 'API_SECRET_KEY' , 'b95968ab6775f7474a4db827be6bcf' );
define( 'CLIENT_ID' , 'tst' ); //Paste your clientID
define( 'CLIENT_VERSION' , '1.0' );
function xml2arr($xml, $recursive = false )
{
if (!$recursive) $array = simplexml_load_string($xml); else $array = $xml ;
$newArray = array() ;
$array = (array)$array ;
foreach ($array as $key =>$ value )
{
$ value = (array)$ value ;
if (isset($ value [0])) $newArray[$key] = trim($ value [0]); else $newArray[$key] = xml2arr($ value , true );
}
return $newArray ;
}
function loginLastFM($url, $type, $post = null )
{
if ($ch = curl_init($url))
{
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, 'Vpleer.ru Scrobbler.' );
$type = $type == 'get' ? curl_setopt($ch, CURLOPT_POST, 0) : curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_REFERER, 'http://www.lastfm.ru/api/' );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
else
{
return 'notconnect' ;
}
}
//1st step. Get token from $_GET['token']
function getKey($token, $API_KEY, $API_SECRET_KEY)
{
$api_sig = md5( 'api_key' .$API_KEY. 'methodauth.getSessiontoken' .$token.$API_SECRET_KEY);
$ get = 'method=auth.getSession&api_key=' .$API_KEY. '&token=' .$token. '&api_sig=' .$api_sig;
$ return = xml2arr(loginLastFM( 'http://ws.audioscrobbler.com/2.0/' , 'get' , $ get ));
return $ return ;
}
//handShake. . -
function handShake($user, $key, $time, $CLIENT_ID, $CLIENT_VERSION, $API_KEY, $API_SECRET_KEY)
{
$handtoken = md5($API_SECRET_KEY.$time);
$handget = 'hs=true&p=1.2.1&c=' .$CLIENT_ID. '&v=' .$CLIENT_VERSION. '&u=' .$user. '&t=' .$time. '&a=' .$handtoken. '&api_key=' .$API_KEY. '&sk=' .$key;
$handshake = loginLastFM( 'http://post.audioscrobbler.com/' , 'get' , $handget);
$handecho = explode( "\n" , $handshake);
return $handecho;
}
// last.fm
function nowPlaying($session, $artist, $song, $duration)
{
$playget = 's=' .$session. '&a=' .$artist. '&t=' .$song. '&b=&l=' .$duration. '&n=&m=' ;
$playnow = loginLastFM( 'http://post.audioscrobbler.com:80/np_1.2' , 'post' , $playget);
return $playnow;
}
// last.fm 50%
function submission($session, $artist, $song, $duration, $starttime)
{
$subget = 's=' .$session. '&a[0]=' .$artist. '&t[0]=' .$song. '&i[0]=' .$starttime. '&o[0]=P&r[0]=&l[0]=' .$duration. '&b[0]=&n[0]=&m[0]=' ;
$submission = loginLastFM( 'http://post2.audioscrobbler.com:80/protocol_1.2' , 'post' , $subget);
return $submission;
}
function doShake($fmuser, $fmkey, $time, $CLIENT_ID, $CLIENT_VERSION, $API_KEY, $API_SECRET_KEY)
{
$handshake = handShake($fmuser, $fmkey, $time, $CLIENT_ID, $CLIENT_VERSION, $API_KEY, $API_SECRET_KEY);
$handerror = trim($handshake[0]);
$session = trim($handshake[1]);
if ($handerror == 'OK' && isset($session))
{
setcookie( 'fmsess' , $session, time() + 3600 * 24 * 730, '/' , '.' .$_SERVER[ 'HTTP_HOST' ]);
return 'OK' ;
}
else
{
return 'Error : ' .$handerror;
}
}
$time = time();
// last.fm,
if (isset($_GET[ 'token' ]))
{
$ return = getKey($_GET[ 'token' ], API_KEY, API_SECRET_KEY);
$error = isset($ return [ 'error' ]) ? $ return [ 'error' ] : null ;
$key = isset($ return [ 'session' ][ 'key' ]) ? $ return [ 'session' ][ 'key' ] : null ;
$user = isset($ return [ 'session' ][ 'name' ]) ? $ return [ 'session' ][ 'name' ] : null ;
if (!isset($error) && isset($key) && isset($user))
{
setcookie( 'fmkey' , $key, time() + 3600 * 24 * 730, '/' , '.' .$_SERVER[ 'HTTP_HOST' ]);
setcookie( 'fmuser' , $user, time() + 3600 * 24 * 730, '/' , '.' .$_SERVER[ 'HTTP_HOST' ]);
setcookie( 'scrobb' , 'on' , time() + 3600 * 24 * 730, '/' , '.' .$_SERVER[ 'HTTP_HOST' ]);
$a = doShake($user, $key, $time, CLIENT_ID, CLIENT_VERSION, API_KEY, API_SECRET_KEY);
header( 'Location: /scrobb/' );
}
else
{
echo $error;
}
}
//1 ?
if (isset($_COOKIE[ 'fmkey' ], $_COOKIE[ 'fmuser' ]) && !isset($_COOKIE[ 'fmsess' ]) && (isset($_POST[ 'nowplaying' ]) || isset($_POST[ 'submission' ])))
{
$a = doShake($_COOKIE[ 'fmuser' ], $_COOKIE[ 'fmkey' ], $time, CLIENT_ID, CLIENT_VERSION, API_KEY, API_SECRET_KEY);
echo $a;
}
// !
if (isset($_POST[ 'nowplaying' ], $_COOKIE[ 'fmkey' ], $_COOKIE[ 'fmuser' ], $_COOKIE[ 'fmsess' ]))
{
$artist = isset($_POST[ 'artist' ]) ? urldecode($_POST[ 'artist' ]) : 'Undefined' ;
$song = isset($_POST[ 'song' ]) ? urldecode($_POST[ 'song' ]) : 'Undefined' ;
$duration = isset($_POST[ 'duration' ]) ? urldecode($_POST[ 'duration' ]) : 'Undefined' ;
setcookie( 'fmtime' , $time, time() + 600, '/' , '.' .$_SERVER[ 'HTTP_HOST' ]);
echo $playnow = nowPlaying($_COOKIE[ 'fmsess' ], $artist, $song, $duration);
if (!strstr($playnow, 'OK' ))
{
echo doShake($_COOKIE[ 'fmuser' ], $_COOKIE[ 'fmkey' ], $time, CLIENT_ID, CLIENT_VERSION, API_KEY, API_SECRET_KEY);
//$playnow = nowPlaying($_COOKIE['fmsess'], $artist, $song, $duration);
}
}
// last.fm
if (isset($_POST[ 'submission' ], $_COOKIE[ 'fmkey' ], $_COOKIE[ 'fmuser' ], $_COOKIE[ 'fmsess' ]))
{
$artist = isset($_POST[ 'artist' ]) ? urldecode($_POST[ 'artist' ]) : 'Undefined' ;
$song = isset($_POST[ 'song' ]) ? urldecode($_POST[ 'song' ]) : 'Undefined' ;
$duration = isset($_POST[ 'duration' ]) ? urldecode($_POST[ 'duration' ]) : 'Undefined' ;
$starttime = isset($_COOKIE[ 'fmtime' ]) ? $_COOKIE[ 'fmtime' ] : time();
echo $submiss = submission($_COOKIE[ 'fmsess' ], $artist, $song, $duration, $starttime);
if (!strstr($submiss, 'OK' ))
{
echo doShake($_COOKIE[ 'fmuser' ], $_COOKIE[ 'fmkey' ], $time, CLIENT_ID, CLIENT_VERSION, API_KEY, API_SECRET_KEY);
//$submiss = submission($_COOKIE['fmsess'], $artist, $song, $duration, $starttime);
}
}
* This source code was highlighted with Source Code Highlighter .
説明
さて、last.fmでトラックを落書きして再生を開始するには、次の$ _POSTパラメーターをこのスクリプトに転送する必要があります。
- 再生中:1
- アーティスト:アーティスト
- 歌:歌
- 期間:214(秒単位の作曲期間)
トラックを完全に落書きするには、次のパラメーターを使用します。
- 提出:1
- アーティスト:アーティスト
- 歌:歌
- 継続時間:122(コンポジションの継続時間(秒))
ダウンロードscrobb.php