无法获得 Instagram Basic Display API 的 access_token

Posted

技术标签:

【中文标题】无法获得 Instagram Basic Display API 的 access_token【英文标题】:Impossible to get an access_token for Instagram Basic Display API 【发布时间】:2019-10-21 15:39:19 【问题描述】:

我正在尝试从 Instagram 获取 access_token 以将其基本显示 API 用于新应用程序(仅在网页上显示推文)。

我按照以下步骤操作:https://developers.facebook.com/docs/instagram-basic-display-api/getting-started

但我被困在第 5 步:用代码交换令牌

cURL 请求总是返回 400 错误并显示消息:“未找到或已使用匹配代码”

但是,经过多次测试,我只获得了一次 access_token,但它在大约一小时后过期。这似乎很随机。

Instagram 基本显示 API 似乎相当新。不久前,我使用了在https://www.instagram.com/developer/ 网站上创建的应用程序,它曾经可以工作。现在此站点显示此消息:

更新:自 2019 年 10 月 15 日起,Instagram API 平台上的新客户注册和权限审查将停止,取而代之的是 Instagram 基本显示 API。

...带有到 developers.facebook.com 的链接。

【问题讨论】:

在哪里可以获得访问令牌?即使使用curl,我也会不断收到相同的 400 错误 @GianfrancoP。您是否尝试过发布您的 Facebook 应用程序? (在应用程序的 Facebook 开发者控制台中) 我终于设法获得了访问令牌。我的应用程序之前已经上线,但现在我正在添加 Instagram 登录,所以我正在等待今天几个小时的批准。我设法让它工作,不确定我到底做错了什么,tbh 在这里用一些代码检查我的答案***.com/a/59305113/1474270它可能会有所帮助 ***.com/questions/59526137/… 【参考方案1】:

我尝试按照原始文档 (https://developers.facebook.com/docs/instagram-basic-display-api/getting-started) 使用命令行工具,但没有运气...

只需 3 个简单的步骤即可完成以下操作:

    第一件事:安装邮递员https://www.postman.com/downloads/ 使用正文中的参数向https://api.instagram.com/oauth/access_token 发出 POST 请求,不是参数。确保 x-www-form-urlencoded 选项已启用。 您现在应该获得200 OK 的状态和access_tokenuser_id 的响应。

    "access_token": "IGQVJYUXlDN...",
    "user_id": 17841400...

快乐的日子!!

查看正确设置的截图:

【讨论】:

谢谢,这对我有帮助,他们应该把它添加到主文档中,因为它们不好 谢谢,这很有用。我将请求参数更改为数据并且它起作用了。【参考方案2】:

我刚刚成功删除了他们提供给您的代码末尾的 #_。不确定这是否是您的问题?

https://developers.facebook.com/support/bugs/436837360282557/

【讨论】:

嗨@Emmanuel,我还注意到它在删除这些尾随字符时有效。但大多数时候它根本不起作用。【参考方案3】:

我在尝试实现应用程序时遇到了这个问题。 我的问题是您允许权限时生成的代码。 尝试从生成的代码末尾删除 #_ 并尝试再次生成令牌

生成的代码示例: AQBvrqqBJJTM49U1qTQWRMD96oRyMR3B_04JSfjc-nUIi0iGbSc3x_EceggQi9IyG3B3Rj3ocreMThQoPJbPpeXLUM4exJMy4o01fXcRtT_I9NovaNAqmWSneFt3MYv_k7ifAUUeMlC050n5xnjQP6oAvDBfCFQvTdrFaR95-5i71YsfQlmjYWDG6fcWRvOB9nqr6J9mbGMXMi9Y4tKlSfElaYm0YKRijZQDG2B5PaxQ8A的 #_ 强>

生成的代码已编辑: AQBvrqqBJJTM49U1qTQWRMD96oRyMR3B_04JSfjc-nUIi0iGbSc3x_EceggQi9IyG3B3Rj3ocreMThQoPJbPpeXLUM4exJMy4o01fXcRtT_I9NovaNAqmWSneFt3MYv_k7ifAUUeMlC050n5xnjQP6oAvDBfCFQvTdrFaR95-5i71YsfQlmjYWDG6fcWRvOB9nqr6J9mbGMXMi9Y4tKlSfElaYm0YKRijZQDG2B5PaxQ8A P>

【讨论】:

【参考方案4】:

我也遇到了同样的问题,我解决了清除缓存、coockie和其他浏览器数据。

然后我提出了一个新的请求。

试试吧,它对我有用。

【讨论】:

【参考方案5】:

我找到了解决方案。

直接 uri 必须与您在开始时使用的相同。

例如。你用

www.abc.com/auth 

获取代码。当您交换令牌时,redirect_uri 必须与

相同
www.abc.com/auth

【讨论】:

【参考方案6】:

我也在使用旧的 Instagram API。我必须更改一些东西才能使我的代码在新 API 上运行。不知道你在用什么,这就是我用 php 做的。

$url = 'https://api.instagram.com/oauth/access_token';

$fields = array(
    'app_id' => 'YOUR_APP_ID',
    'app_secret' => 'YOUR_APP_SECRET_ID',
    'grant_type' => 'authorization_code',
    'redirect_uri' => 'YOUR_REDIRECT_URL',
    'code' => $code
);

$ch = curl_init();

curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_VERIFYPEER, false);

$result = curl_exec($ch);
curl_close($ch);

//get the access token from the string sent from Instagram
$splitString = explode('"access_token":', $result);
$removeRest = explode(',', $splitString[1]);
$withSpace = str_replace('"','', $removeRest[0]);
$access_token = str_replace(' ','', $withSpace);

【讨论】:

嗨@Nobody,我也在使用 PHP 和 Guzzle(cURL 库)。我的代码和你的类似。它昨天工作了一次,但大多数时候它不起作用...... 嗨@Nobody,您如何调用api.instagram.com/oauth/authorize 端点来获取带有cURL 的代码?当我这样做时,我被重定向到 Instagram 登录页面。 Maxime,您不必使用 cURL。 Instagram 在重定向到您的网站后将代码包含在 URL 中。您可以使用 HTTP GET 来获取代码:$code = $_GET['code'];【参考方案7】:

我正在使用 PHP,但没有使用任何库。也许这个对你有帮助。

curl.php

class InstagramApi 


public function GetAccessToken($client_id, $redirect_uri, $client_secret, $code)       
    $url = 'https://api.instagram.com/oauth/access_token';

    $curlPost = 'app_id='. $client_id . '&redirect_uri=' . $redirect_uri . '&app_secret=' . $client_secret . '&code='. $code . '&grant_type=authorization_code';
    $ch = curl_init();      
    curl_setopt($ch, CURLOPT_URL, $url);        
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);      
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);            
    $data = json_decode(curl_exec($ch), true);  
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch);    

    if($http_code != '200')         
        throw new Exception('Error : Failed to receieve access token');

    return $data;

  

index.php

include "curl.php";
include "instagram_keys.php"; // holding APP ID, SECRET KEY, REDIRECT URI

 $instagram_ob = new InstagramApi();
 $insta_data = $instagram_ob->GetAccessToken(INSTAGRAM_CLIENT_ID, INSTAGRAM_REDIRECT_URI, INSTAGRAM_CLIENT_SECRET, $_GET['code']);  
  echo  $insta_data['access_token'];
  echo  $insta_data['user_id'];

注意:$_GET['code'] 是必需的,您应该知道如何获取代码。 Read here

【讨论】:

以上是关于无法获得 Instagram Basic Display API 的 access_token的主要内容,如果未能解决你的问题,请参考以下文章

获取授权用户的头像(Instagram Basic Display API)

Instagram 基本显示 API 分页

无法获得 instagram 个人资料图片全尺寸

Instagram Graph API 有沙盒模式吗?

由于无效原因,我的应用被 Instagram Basic Display API 审核拒绝

如何在没有用户登录的情况下访问 Instagram Basic Display API?