API キーの設定で、 IP アドレスをちゃんと入れたのに…
さくらの VPS で借りてる開発用サーバで YouTube Data API を使って YouTube 動画の情報を取得しようと、playlist_id と api_key をそれぞれ変数で指定して、PHP で
$playlist = file_get_contents( 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=' . $playlist_id . '&maxResults=10&key=' . $api_key );
$youtube_info = json_decode( $playlist );
ってな感じで動画情報を取得しようとしたら、うまくいかない。
そこで取得した $playlist を
var_dump( $playlist );
で見てみると、
HTTP request failed! HTTP/1.0 403 Forbidden;
ってな具合のメッセージが。403 エラーってことだからアクセス権限が無いよってことだ。
うーんちゃんと下記のようにアクセスできるようにしたはずなのに。
うーん、最初は file_get_contents 関数が使えないのかな? とも思ったけど、アプリケーションの制限を「なし」にするとうまく行くのでそうではない。
そこでブラウザでアクセスしてみることに
じゃあ、ってことで
https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId={playlist_id}&maxResults=10&key={api_key}
の URL (実際には {playlist_id } と {api_key} のところにはそれぞれ実際の ID と API KEY が入る) に、手元のブラウザでアクセスしてみると、
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "ipRefererBlocked",
"message": "The calling IP address XXX.XXX.XXX.XXX does not match the IP restrictions configured on the API key. Please use the API Console to update your key restrictions.",
"extendedHelp": "https://console.developers.google.com/apis/credentials?project=XXXXXXXXXX"
}
],
"code": 403,
"message": "The calling IP address XXX.XXX.XXX.XXX does not match the IP restrictions configured on the API key. Please use the API Console to update your key restrictions."
}
}
ってな具合のメッセージが出た (IPアドレスとかは XXX で伏せ字にしてます) 。
この IP アドレスは API KEY の設定で許可されてないからね。そこでこの IP アドレスを許可してみると、問題なくアクセス出来て動画情報がずらずらっと。
まあ普通こうなるわな…
そこで今度はサーバ上の emacs の eww でアクセス
じゃあなんで開発用サーバだけ駄目なんだよと、うーんと悩んでみたけど、ああそうだと思いつき、開発用サーバに入っている emacs の eww (テキストベースのブラウザ)でアクセスしてみることに。
すると上記と同様のメッセージが出た。ところがアクセス許可されてないよっていう IP アドレスのところを見ると IPv6 のアドレスになっている。
ってことで、その IPv6 アドレスを、許可する IP アドレスに設定してみると、無事 API にアクセスできた。
なんとも無いことだったけど、普通にさくらの VPS に Ubuntu を入れて使っているのだが、 ググった限りでは同じ問題に直面したと思われる人は見つからず。
おいらが、この辺のサーバの設定とかがわかっていないだけなのかな。まあ、とにかく問題解決できたので、よかったと