You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过纯PHP代码自动获取Instagram New API授权码及access_token

解决Instagram API自动获取Access Token的问题

我来帮你搞定这个事儿!首先得明确一个关键:Instagram的OAuth2授权机制要求首次必须由用户手动点击授权——这是安全规则,得确保是用户主动给应用权限。但咱们可以通过后续的令牌转换和刷新机制,彻底摆脱每60天手动操作的麻烦,甚至首次授权后再也不用碰它。

先修正你当前的令牌兑换脚本

你现有的第二步代码有几个小问题,先改对才能正常拿到token:

  • JSON格式写错了:变量得用引号包起来,而且JSON必须用双引号
  • CURL没设置必要的请求头,也没开启返回结果不直接输出的选项

修正后的代码如下:

<?php
$client_id = '你的客户端ID';
$client_secret = '你的客户端密钥';
$redirect_uri = '你的重定向URI';
$authorization_code = '你手动拿到的授权码';

// STEP 2: 用授权码兑换Access Token
$url = 'https://api.instagram.com/oauth/access_token';

// 这里用x-www-form-urlencoded格式更稳妥,Instagram官方推荐这种方式
$post_fields = [
    'client_id' => $client_id,
    'client_secret' => $client_secret,
    'grant_type' => 'authorization_code',
    'redirect_uri' => $redirect_uri,
    'code' => $authorization_code
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_fields));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/x-www-form-urlencoded'
]);

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

$insta_details = json_decode($result, true);
if (isset($insta_details['access_token'])) {
    echo 'Access Token: ' . $insta_details['access_token'];
    echo '<br>用户ID: ' . $insta_details['user_id'];
} else {
    echo '出错啦: ' . $result;
}
?>

核心:实现长期自动化的令牌管理

首次手动授权拿到的是短期令牌(有效期1小时),咱们把它换成长期令牌(有效期60天),之后每60天用这个长期令牌刷新出新的长期令牌——全程自动,不用再手动操作。

第一步:把短期令牌换成长期令牌

用刚才拿到的短期token和用户ID,调用Graph API换长期token:

<?php
$user_id = '从上面步骤拿到的用户ID';
$short_lived_token = '刚拿到的短期Access Token';
$client_secret = '你的客户端密钥';

$url = "https://graph.instagram.com/access_token?grant_type=ig_exchange_token&client_secret=$client_secret&access_token=$short_lived_token";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

$long_lived_details = json_decode($result, true);
if (isset($long_lived_details['access_token'])) {
    echo '长期Access Token: ' . $long_lived_details['access_token'];
    // 把这个长期token存到数据库或者加密的配置文件里,别硬编码!
} else {
    echo '出错啦: ' . $result;
}
?>

第二步:自动刷新长期令牌

当长期token快到期时(比如提前1天),用下面的代码刷新出新的长期token——你可以把这个脚本做成定时任务(比如Linux的Cron,或者Windows的任务计划),每59天自动跑一次:

<?php
$long_lived_token = '你存储的长期Access Token';
$client_secret = '你的客户端密钥';

$url = "https://graph.instagram.com/access_token?grant_type=ig_refresh_token&client_secret=$client_secret&access_token=$long_lived_token";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

$refreshed_token = json_decode($result, true);
if (isset($refreshed_token['access_token'])) {
    echo '刷新后的长期Access Token: ' . $refreshed_token['access_token'];
    // 记得把新token更新到存储位置,覆盖旧的
} else {
    echo '出错啦: ' . $result;
}
?>

关于“完全不用手动点击”的说明

如果这是你自己的个人Instagram账号,首次授权确实没法跳过手动点击——这是OAuth2的安全规则,防止应用偷偷获取用户数据。但完成这一次操作后,通过上面的长期token+自动刷新机制,就再也不用管它了,全程自动运行。

要是你做的是面向其他用户的应用,那必须引导用户跳转到Instagram授权页面,但这显然不是你的场景~

最后几个小提示

  • 确保你的重定向URI已经在Instagram开发者后台准确配置,不然授权会失败
  • 令牌一定要存在安全的地方,别直接写在代码里,避免泄露
  • 定时任务的时间别卡着60天整,提前个1-2天跑,防止意外情况导致token过期

内容的提问来源于stack exchange,提问作者Div

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:42:35