刷新 Instagram 长期访问令牌在浏览器 (http) 中有效,但在 PHP (curl) 中无效
Refreshing Instagram long-lived access token works in browser (http) but not PHP (curl)
希望能帮到你。
我正在尝试实施 Instagram 的基本显示 API 但不幸的是我 运行 遇到了生成长期访问令牌或使用 [=55 刷新现有长期令牌的问题=].看来我远非唯一遇到此问题或类似问题的人。
我遵循了 Facebook 的入门指南 (located here),并且能够生成一个短期访问令牌,但这大约是我在 PHP 中得到的。奇怪的是,如果我直接通过 HTTP 调用任何端点,例如在浏览器中,调用将完美运行,我要么从一个短的访问令牌中获得一个长期存在的访问令牌,要么我可以刷新一个现有的长期存在的访问令牌.但它只适用于浏览器或在终端中使用 cURL。
似乎 graph.instagram.com 要么阻止了我的 Web 服务器 IP,要么它不喜欢许多可能的 cURL 选项之一。我尝试了许多不同的组合,但无济于事。我什至尝试过 运行 来自不同网络服务器的 PHP 脚本(不同的主机,不同的位置和 IP,所以被阻止的 IP 似乎不是这种情况)但仍然没有运气。
我从 graph.instagram.com 得到的错误信息是:
IGApiException:无效的 OAuth 2.0 访问令牌(错误代码 190)
我在这上面花的时间比可行的多得多,我已经受够了。必须有一个简单的解释来说明为什么一种方法有效而另一种方法无效。快把我逼疯了。
我错过了什么?请帮助...重申一下,调用以下 URL(使用适当的 short-/long-lived 访问令牌)在 browser/terminal 中工作正常,但在 PHP c[=64 中无效=].为什么?我该如何解决这个问题?
正在生成长期访问令牌:
https://graph.instagram.com/access_token?grant_type=ig_exchange_token&client_secret={app-secret}&access_token={short-lived-access-token}
刷新:
https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token&access_token={long-lived token}
注:
据我所知,我已经正确设置了应用程序等。我假设如果我不这样做,我一开始就无法生成访问代码,也无法生成短期访问令牌,更不用说刷新现有的长期访问令牌了。
咆哮:
我讨厌脸书。说真的,没有什么比它有权叹气
更直接和更复杂的了
哇,在这个问题上折腾了好几天,终于把这个问题发上来了,只用了短短40分钟,我终于找到了解决方案
对于任何 运行 遇到类似问题的人,在我的例子中,问题是 http_build_query
(我用它来设置 cURL GET 参数)以及两个网络服务器都具有以下 php.ini 设置集:
arg_separator.output = "&"
默认设置通常是:
arg_separator.output = "&"
要解决此问题,请将 http_build_query 更改为使用 &
而不是 &
,如下所示:
http_build_query($yourParams, null, '&');
或者简单地将更改后的 php.ini 设置恢复为原始设置(风险自负)
希望能帮到你。
我正在尝试实施 Instagram 的基本显示 API 但不幸的是我 运行 遇到了生成长期访问令牌或使用 [=55 刷新现有长期令牌的问题=].看来我远非唯一遇到此问题或类似问题的人。
我遵循了 Facebook 的入门指南 (located here),并且能够生成一个短期访问令牌,但这大约是我在 PHP 中得到的。奇怪的是,如果我直接通过 HTTP 调用任何端点,例如在浏览器中,调用将完美运行,我要么从一个短的访问令牌中获得一个长期存在的访问令牌,要么我可以刷新一个现有的长期存在的访问令牌.但它只适用于浏览器或在终端中使用 cURL。
似乎 graph.instagram.com 要么阻止了我的 Web 服务器 IP,要么它不喜欢许多可能的 cURL 选项之一。我尝试了许多不同的组合,但无济于事。我什至尝试过 运行 来自不同网络服务器的 PHP 脚本(不同的主机,不同的位置和 IP,所以被阻止的 IP 似乎不是这种情况)但仍然没有运气。
我从 graph.instagram.com 得到的错误信息是:
IGApiException:无效的 OAuth 2.0 访问令牌(错误代码 190)
我在这上面花的时间比可行的多得多,我已经受够了。必须有一个简单的解释来说明为什么一种方法有效而另一种方法无效。快把我逼疯了。
我错过了什么?请帮助...重申一下,调用以下 URL(使用适当的 short-/long-lived 访问令牌)在 browser/terminal 中工作正常,但在 PHP c[=64 中无效=].为什么?我该如何解决这个问题?
正在生成长期访问令牌:
https://graph.instagram.com/access_token?grant_type=ig_exchange_token&client_secret={app-secret}&access_token={short-lived-access-token}
刷新:
https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token&access_token={long-lived token}
注:
据我所知,我已经正确设置了应用程序等。我假设如果我不这样做,我一开始就无法生成访问代码,也无法生成短期访问令牌,更不用说刷新现有的长期访问令牌了。
咆哮:
我讨厌脸书。说真的,没有什么比它有权叹气
哇,在这个问题上折腾了好几天,终于把这个问题发上来了,只用了短短40分钟,我终于找到了解决方案
对于任何 运行 遇到类似问题的人,在我的例子中,问题是 http_build_query
(我用它来设置 cURL GET 参数)以及两个网络服务器都具有以下 php.ini 设置集:
arg_separator.output = "&"
默认设置通常是:
arg_separator.output = "&"
要解决此问题,请将 http_build_query 更改为使用 &
而不是 &
,如下所示:
http_build_query($yourParams, null, '&');
或者简单地将更改后的 php.ini 设置恢复为原始设置(风险自负)