Instagram API 2019 访问令牌每 2 小时过期一次

Posted

技术标签:

【中文标题】Instagram API 2019 访问令牌每 2 小时过期一次【英文标题】:Instagram API 2019 Access token expires every 2 hours 【发布时间】:2019-11-14 10:32:09 【问题描述】:

自 2019 年 10 月 21 日起,Instagram 阻止您在 Instagram 内创建和管理您的客户,现在一切都通过 Facebook 开发人员进行管理,这没有真正的问题......

在我的例子中,只需要显示单个用户个人资料图像。我很快就完成了这项工作,但是访问令牌每 2 小时到期一次,然后我需要再次重新授权...这以前从来不是问题...您授权一次,它就可以工作了。

获取这个工作代码:

function fetchData($url)
  $inst = curl_init($url);
  curl_setopt($inst, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($inst, CURLOPT_SSL_VERIFYHOST, 0);
  curl_setopt($inst, CURLOPT_SSL_VERIFYPEER, 0);
  $output = curl_exec($inst);
  curl_close($inst);

  return $output;


$insta_access_token = 'MY_ACCESS_TOKEN';
$insta_count = '6';

$instagram_result = fetchData("https://graph.instagram.com/me/media?fields=id,username,media_url&access_token=$insta_access_token&count=$insta_count");
$instagram_result = json_decode($instagram_result);
print_r($instagram_result);

在访问令牌过期之前,这一切正常。

我在此处看到了其他完全不使用 API 的技巧:How can I get a user's media from Instagram without authenticating as a user?

这使用 php 来提取配置文件内容,并且是我研究中唯一可行的解​​决方案,可以从一次性配置文件中显示基本图片库:

$html = file_get_contents('https://instagram.com/apple/');
preg_match('/_sharedData = (.*);<\/script>/', $html, $matches);
$profile_data = json_decode($matches[1])->entry_data->ProfilePage[0]->graphql->user;

我是否遗漏了什么,或者没有办法让有效的访问令牌在经过一次身份验证后继续运行以进行基本图像显示?

干杯。

【问题讨论】:

你可能想要一个刷新令牌tools.ietf.org/html/rfc6749#section-1.5 @delboy1978uk 不幸的是 Instagram 不允许你这样做 :( 在这种情况下尝试捕获并获取新令牌并再次拨打电话:-| @delboy1978uk 唯一的问题是你不能自动化它,用户实际上似乎必须点击授权......非常令人沮丧。 @SteveHolland 下面的答案会给你一个访问令牌稍长但会过期,唯一的方法是编写一些代码来重新验证并重新生成某种形式的访问令牌cron 工作,恐怕我还没有解决这个问题。对于基本用法来说似乎不必要的过度。我原来的问题中上面的 file_get_contents() 方法现在是一个厚颜无耻的解决方法。 【参考方案1】:

您需要做的就是通过向此端点发出 GET 请求来延长访问令牌的持续时间(据我所知,长期访问令牌在 60 天内很有价值)

url = 'https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&%20client_id='Your_App_Id'&client_secret='Your_App_secret'&fb_exchange_token='Your_Short_Lived_Access_token''

希望这就是你要找的东西 =)

【讨论】:

为答案干杯,这确实有效,但是一旦访问令牌过期,提要将停止显示:/【参考方案2】:
 require_once __DIR__ . '/vendor/autoload.php';

// facebook credentials array
$creds = array(
    'app_id' => FACEBOOK_APP_ID,
    'app_secret' => FACEBOOK_APP_SECRET,
    'default_graph_version' => 'v3.2',
    'persistent_data_handler' => 'session'
);

// create facebook object
$facebook = new Facebook\Facebook( $creds );

// helper
$helper = $facebook->getRedirectLoginHelper();

// oauth object
$oAuth2Client = $facebook->getOAuth2Client();

if ( isset( $_GET['code'] ) )  // get access token
    try 
        $accessToken = $helper->getAccessToken();
     catch ( Facebook\Exceptions\FacebookResponseException $e )  // graph error
        echo 'Graph returned an error ' . $e->getMessage;
     catch ( Facebook\Exceptions\FacebookSDKException $e )  // validation error
        echo 'Facebook SDK returned an error ' . $e->getMessage;
    

    if ( !$accessToken->isLongLived() )  // exchange short for long
        try 
            $accessToken = $oAuth2Client->getLongLivedAccessToken( $accessToken );
         catch ( Facebook\Exceptions\FacebookSDKException $e ) 
            echo 'Error getting long lived access token ' . $e->getMessage();
        
    


    $accessToken = (string) $accessToken;

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。

以上是关于Instagram API 2019 访问令牌每 2 小时过期一次的主要内容,如果未能解决你的问题,请参考以下文章

使用带有永久页面访问令牌的 Instagram Graph Api 仅适用于某些帐户

Instagram API 限制使用来自同一 IP 的多个访问令牌?

Instagram 订阅 API 请求访问令牌

超过 Instagram API 请求限制

无需登录即可生成访问令牌 Instagram API?

带有来自 Instagram API 的正确访问令牌的空成功响应