Вызов API Instagram для получения кода авторизации с CURL возвращает пустое значение - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь настроить канал API Instagram с CURL в PHP, однако строка возвращается пустой при попытке получить код авторизации, прежде чем позже сделать успешный вызов для получения контента пользователя:

$uri = 'https://api.instagram.com/oauth/authorize/';

$data = [
    'client_id' => $client_id,
    'redirect_uri' => $redirect_uri,
    'response_type' => 'code'
];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $uri);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_NOBODY, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $result = curl_exec($ch);
    curl_close($ch);
     var_dump($result);

Однако, когда я получаю доступ к URL-адресу непосредственно в браузере, он возвращается к URI перенаправления с нужным мне кодом:

https://api.instagram.com/oauth/authorize/?client_id=CLIENT_ID_HERE&redirect_uri=REDIRECT_HERE&response_type=code

, т.е. браузер перенаправляет успешно (включая"код" GET data) в http://REDIRECT_HERE/?code=XXXXXXXXXXXX

Я бы в основном хотел сохранить код авторизации в переменной для последующего использования, а не использовать ручной способ получения кода через перенаправление браузера.

1 Ответ

0 голосов
/ 25 ноября 2018

ваш браузер отправляет данные в стиле url RFC-1738 с помощью запроса GET, а ваш код php curl отправляет данные в запросе POST, закодированном multipart/form-data, неудивительно, что сервер запутывается.чтобы отправить данные в URL с помощью php так же, как это делает ваш браузер, избавьтесь от curl_setopt($ch, CURLOPT_POST, true); (поскольку он говорит curl делать запрос POST вместо запроса GET по умолчанию, ваш браузер выполняет запрос GET) и curl_setopt($ch, CURLOPT_POSTFIELDS, $data); (поскольку он указывает curl отправлять его в теле запроса, в то время как ваш браузер отправляет его в URL), и измените CURLOPT_URL на

curl_setopt($ch, CURLOPT_URL, $uri."?".http_build_query($data));

, тогда ваш запрос php curl должен примерно соответствовать вашему запросу браузера, и получитьтот же ответ.(все еще будут небольшие отличия, такие как другой заголовок User-Agent, заголовок Accept и заголовок Accept-Encoding, но это обычно не имеет значения)

...