【问题标题】:Instagram API call to retrieve authorization code with CURL returns empty使用 CURL 检索授权代码的 Instagram API 调用返回空
【发布时间】:2018-11-25 13:12:50
【问题描述】:

我正在尝试在 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 以及我需要的代码:

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

即浏览器成功重定向(包括“代码”GET 数据)到http://REDIRECT_HERE/?code=XXXXXXXXXXXX

我基本上想将身份验证代码存储在一个变量中以供以后使用,而不是使用通过浏览器重定向获取代码的手动方式。

【问题讨论】:

    标签: php api curl instagram


    【解决方案1】:

    您的浏览器通过 GET 请求以 url RFC-1738 样式发送数据,而您的 php curl 代码以使用multipart/form-data 编码的 POST 请求发送数据,难怪服务器会感到困惑。要像浏览器一样使用 php 在 url 中发送数据,请去掉 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 标头,但这通常无关紧要)

    【讨论】:

    • 嗨!非常感谢您的详尽回答。我已经相应地更改了它,但是仍然返回一个空字符串...?
    • @rainerbrunotte 如果你把它改成curl_setopt($ch, CURLOPT_URL, "http://dumpinput.ratma.net/?".http_build_query($data)); ,你会得到什么?
    • string(152) "GET /?client_id=999999999999999999&redirect_uri=http%3A%2F%2Fdumpinput.ratma.net&response_type=code HTTP/1.1 主机:dumpinput.ratma.net 接受:/ "
    • @rainerbrunotte 这没有多大帮助。如果您将其更改回 instagram 并启用 CURLOPT_VERBOSE,您会得到什么?试试$tmp=tmpfile();curl_setopt_array($ch,[CURLOPT_VERBOSE=>1,CURLOPT_STDERR=>$tmp]); $result = curl_exec($ch);rewind($tmp);$result=stream_get_contents($tmp)."\n".$result;fclose($tmp);var_dump($result);,你现在得到了什么?
    • 哇,得到各种各样的东西:字符串(2945)“*在DNS缓存中找到主机名*正在尝试31.13.66.63 ... *连接到api.instagram.com(31.13.66.63)端口443 (#2) * 成功设置证书验证位置:* CAfile:无 CApath:/etc/ssl/certs * SSL 连接使用 ECDHE-ECDSA-AES128-GCM-SHA256 * 服务器证书:* 主题:C=US;ST= CA;L=Menlo Park;O=Facebook, Inc.;CN=*.instagram.com * OU=www.digicert.com;CN=DigiCert SHA2 High Assurance Server CA * SSL 证书验证正常。> GET /oauth/authorize /?client_id=............等等等等等等
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多