Soundcloud APIPHP返回“无效授权”

问题描述

我们使用下面的代码尝试通过PHP将曲目从我们的WordPress网站上传到SoundCloud。运行此脚本之前,MP3曲目已经在我们的服务器上。

function upload_soundcloud()
{

    //App credentials. Create one at http://soundcloud.com/you/apps
    define('API_URL','https://api.soundcloud.com');
    define('CLIENT_ID','$client_id');
    define('CLIENT_SECRET','$client_secret');

    //User credentials
    define('EMAIL','$email');
    define('PASSWORD','$password');

    //Path to MP3 file to upload
    define('FILE',ABSPATH . '/wp-content/uploads/path/to/file.mp3');

    class SoundcloudAPI {
        private $url;
        private $clientID;
        private $secret;
        private $accesstoken;

        public function __construct($url,$clientID,$secret) {
            $this->url = $url;
            $this->clientID = $clientID;
            $this->secret = $secret;
        }

        public function auth($username,$password) {
            $url = $this->url . '/oauth2/token';
            $data = array(
                'client_id' => $this->clientID,'client_secret' => $this->secret,'grant_type' => 'password','username' => $username,'password' => $password
            );

            $result = $this->request($url,$data,'POST');
            $this->accesstoken = $result->access_token;
            return $result;
        }

        public function upload($title,$path) {
            $url = $this->url . '/tracks';
            $data = array(
                'oauth_token' => $this->accesstoken,'track[title]' => $title,'track[asset_data]' => new CurlFile(realpath($path),'audio/mpeg'),);

            $result = $this->request($url,'POST');
            return $result;
        }

        private function request($url,$method) {
            $curl = curl_init();
            if ($method === 'POST') {
                curl_setopt($curl,CURLOPT_POST,true);
                curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
            } else {
                $url .= '?' . http_build_query($data);
            }
            curl_setopt($curl,CURLOPT_URL,$url);
            curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
            curl_setopt($curl,CURLOPT_FOLLOWLOCATION,true);
            $result = json_decode(curl_exec($curl));
            curl_close($curl);

            return $result;
        }
    }

    $soundCloud = new SoundcloudAPI(API_URL,CLIENT_ID,CLIENT_SECRET);
    $resultAuth = $soundCloud->auth(EMAIL,PASSWORD);
    $resultUpload = $soundCloud->upload('Test',FILE);

    echo '<pre>';
    print_r($resultAuth);
    print_r($resultUpload);
    echo '</pre>';

}

这是我们得到的回应:

stdClass Object
(
    [error] => invalid_grant
)

有人知道为什么会这样吗? (最奇怪的部分是它实际上是在2天前工作的,但是后来就停止工作了,我觉得我快要疯了。)

解决方法

尝试并保存请求之间的访问令牌和刷新令牌(例如,在本地文件或数据库中),然后重新使用它。使用用户名和密码时,速率限制似乎仅在/oauth2/token端点上。

访问令牌过期后,可以通过以下方式向/oauth2/token发出请求,以使用刷新令牌来获取新令牌:

'grant_type': 'refresh_token','client_id': <your client id>,'client_secret': <your client secret>,'refresh_token': <previous refresh token>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...