Help us understand the problem. What is going on with this article?

YouTube Analytics APIでcom.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found

YouTube Analytics API Java サンプルコードが動かない問題

YouTubeで使えるAPIには、以下の三種類がある。

  • YouTube Data API
  • YouTube Analytics API
  • YouTube Reporting API

それぞれのAPIについての説明は省くが、サンプルコードが公開されている。
その中にあるJavaのAnalytics APIのサンプルを動かそうとすると以下のエラーになったため、これの解決法をまとめておく。
YouTubeAnalyticsReports.java

Result
Default Channel: ( xxxxxxxxxxxxxxxxxxx )

IOException: 404 Not Found
Not Found
com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
Not Found
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.google.api.services.samples.youtube.cmdline.analytics.YouTubeAnalyticsReports.executeViewsOverTimeQuery(YouTubeAnalyticsReports.java:134)
at com.google.api.services.samples.youtube.cmdline.analytics.YouTubeAnalyticsReports.main(YouTubeAnalyticsReports.java:103)

解決法

APIのバージョンをV2にする。
Google ConsoleからAPIのスコープの設定やclient_secrets.jsonの設定などをしたにも関わらず上記のエラーが出るのは、APIのバージョンが古い。

サンプルコードでは、Analytics API V1が使われているが、なぜかV1が使えず、V2にしたら動いたので、V2を使う。
googleにプルリクを出してみた。
https://github.com/youtube/api-samples/pull/292

pom.xml

pom.xmlを以下のように修正する。
Line:14

- <project.youtube.version>v3-rev182-1.22.0</project.youtube.version>
- <project.youtube.analytics.version>v1-rev63-1.22.0</project.youtube.analytics.version>
- <project.youtube.reporting.version>v1-rev10-1.22.0</project.youtube.reporting.version>
- <project.http.version>1.20.0</project.http.version>
- <project.oauth.version>1.20.0</project.oauth.version>
+ <project.youtube.version>v3-rev222-1.25.0</project.youtube.version>
+ <project.youtube.analytics.version>v2-rev272-1.25.0</project.youtube.analytics.version>
+ <project.youtube.reporting.version>v1-rev748-1.25.0</project.youtube.reporting.version>
+ <project.http.version>1.36.0</project.http.version>
+ <project.oauth.version>1.31.0</project.oauth.version>

YouTubeAnalyticsReports.java

YouTubeAnalyticsReports.javaを以下のように修正する
Line:12

- import com.google.api.services.youtubeAnalytics.YouTubeAnalytics;
- import com.google.api.services.youtubeAnalytics.model.ResultTable;
- import com.google.api.services.youtubeAnalytics.model.ResultTable.ColumnHeaders;
+ import com.google.api.services.youtubeAnalytics.v2.YouTubeAnalytics;
+ import com.google.api.services.youtubeAnalytics.v2.model.QueryResponse;
+ import com.google.api.services.youtubeAnalytics.v2.model.ResultTableColumnHeader;

Line:124

- private static ResultTable executeViewsOverTimeQuery(YouTubeAnalytics analytics,
                                                         String id) throws IOException {
+ private static QueryResponse executeViewsOverTimeQuery(YouTubeAnalytics analytics,
                                                           String id) throws IOException {

Line:128

- .query("channel==" + id,     // channel id
-         "2012-01-01",         // Start date.
-         "2012-01-14",         // End date.
-         "views,uniques")      // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("views")
+ .setStartDate("2020-01-01")
+ .setEndDate("2020-12-31")

Line:145

- private static ResultTable executeTopVideosQuery(YouTubeAnalytics analytics,
+ private static QueryResponse executeTopVideosQuery(YouTubeAnalytics analytics,

Line:149

- .query("channel==" + id,                          // channel id
-         "2012-01-01",                              // Start date.
-         "2012-08-14",                              // End date.
-         "views,subscribersGained,subscribersLost") // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("views,subscribersGained,subscribersLost")
+ .setStartDate("2019-01-01")
+ .setEndDate("2020-12-31")

Line:167

- private static ResultTable executeDemographicsQuery(YouTubeAnalytics analytics,
+ private static QueryResponse executeDemographicsQuery(YouTubeAnalytics analytics,

Line:170

- .query("channel==" + id,     // channel id
-         "2007-01-01",         // Start date.
-         "2012-08-14",         // End date.
-         "viewerPercentage")   // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("viewerPercentage")
+ .setStartDate("2020-01-01")
+ .setEndDate("2020-12-31")

Line:187

- private static void printData(PrintStream writer, String title, ResultTable results) {
+ private static void printData(PrintStream writer, String title, QueryResponse results) {

Line:194

- for (ColumnHeaders header : results.getColumnHeaders()) {
+ for (ResultTableColumnHeader header : results.getColumnHeaders()) {

Line:202

- ColumnHeaders header = results.getColumnHeaders().get(colNum);
+ ResultTableColumnHeader header = results.getColumnHeaders().get(colNum);

これで実行すると取得できるようになった。

Roppy246
IT企業でバックエンドエンジニアをやってます。たまにフロントも書きます。
https://roppyblog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away