我正在尝试使用PHP中的CURL设置Instagram API提要,但是在尝试成功检索身份验证代码之前,该字符串返回空,之后再成功调用以检索用户的内容:
$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:
即浏览器成功重定向(包括“代码” GET数据)到http://REDIRECT_HERE/?code=XXXXXXXXXXXX
我基本上想将auth代码存储在变量中,以供以后使用,而不是使用通过浏览器重定向获取代码的手动方式。
答案 0 :(得分:1)
您的浏览器以GET请求发送URL RFC-1738样式的数据,而您的php curl代码以multipart/form-data
编码的POST请求发送数据,这也难怪服务器会感到困惑。要像使用浏览器一样使用php发送url中的数据,请摆脱curl_setopt($ch, CURLOPT_POST, true);
(因为它告诉curl执行POST请求而不是默认的GET请求,因此您的浏览器会执行GET请求)和{{ 1}}(因为它告诉curl在请求正文中发送它,而浏览器在url中发送它),然后将CURLOPT_URL更改为
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
然后,您的php curl请求应该与您的浏览器请求大致匹配,并获得相同的响应。 (仍然会有细微的差异,例如不同的User-Agent标头,Accept标头和Accept-Encoding标头,但这通常没有关系)