如何通过纯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
相关产品推荐
相关产品推荐

