Soundcloud API (PHP) возвращает «недопустимое предоставление»

#php #api #upload #soundcloud

#php #API #загрузка #soundcloud

Вопрос:

Мы используем приведенный ниже код, чтобы попытаться загрузить треки с нашего сайта WordPress в SoundCloud через PHP. 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, $data, 'POST');
            return $result;
        }

        private function request($url, $data, $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 дня назад, но потом просто перестал работать, и я чувствую, что схожу с ума).

Комментарии:

1. почему вы определяете класс внутри функции? определите его снаружи и создайте экземпляр внутри вашей функции и используйте его.

2. если вы хотите войти в систему с помощью OAuth и у вас есть client_id и client_secret, grant_type должен быть authorization_code, а не пароль, дополнительная информация developers.soundcloud.com/docs/api/reference

3. Спасибо за ответы, ребята, похоже, что-то не так с SoundCloud API или проблема с конкретным токеном, потому что теперь (3 дня спустя) код снова работает нормально…

4. Мы также получаем эту ошибку после выполнения более 10 таких запросов за короткое время. Кажется, ограничивает скорость.

5. @DMalan Я могу подтвердить то же самое. Он отлично работает, вызывая upload API максимум для 4-5 загрузок, затем я начинаю получать «недействительный грант», и он возвращается к нормальному состоянию только через 24 часа. Таким образом, похоже, что существует какое-то 24-часовое ограничение при загрузке треков через API. Это делает его бесполезным во многих ситуациях. Может ли кто-нибудь еще подтвердить это?

Ответ №1:

Попробуйте сохранить токен доступа и обновить токен между запросами (например, в локальном файле или базе данных) и повторно использовать его. Ограничение скорости, похоже, действует только на /oauth2/token конечной точке при использовании имени пользователя и пароля.

Как только срок действия вашего токена доступа истечет, вы можете использовать токен обновления для получения нового, отправив запрос на /oauth2/token с помощью:

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

Комментарии:

1. Не могу поверить, что я этого не знал, большое спасибо, я попробую это сегодня!

2. Похоже, это сработало — теперь я на самом деле сделал это еще проще для нас, запросив токен без истечения срока действия и сохранив его в / извлекая из базы данных и просто повторно используя этот токен; Спасибо за вашу помощь!

3. Неплохо. Как вы запросили токен без истечения срока действия?

4. Это выглядит так: ‘client_id’ => ‘CLIENTID’, client_secret’ => ‘CLIENTSECRET’, ‘grant_type’ => ‘password’, ‘username’ => ‘USERNAME’, ‘password’ => ‘PASSWORD, ‘scope’ => ‘не истекающий’