Youtube Analytics API 403错误

时间:2014-08-04 18:37:18

标签: youtube youtube-api

您好我想知道一些想法。

我按照网站https://developers.google.com/youtube/analytics/v1/sample-application#Enable_Authentication

上的步骤操作

但是当我开始申请时,我总是有这样的信息:

“超出未经身份验证的使用的每日限制。继续使用需要注册。”

我有2个链接。 1连接youtube(0auth)如何工作并给我标记和第二个链接,给我指标,维度...在json。但除了顶部的消息我没有想到。 js页面:

(function() {
// Retrieve your client ID from the Google Developers Console at
// https://console.developers.google.com/.
var OAUTH2_CLIENT_ID = '261487559881-d9al0muik318iaa07uiasvqb2gliinpm.apps.googleusercontent.com';

var OAUTH2_SCOPES = [
    'https://www.googleapis.com/auth/yt-analytics.readonly',
    'https://www.googleapis.com/auth/youtube.readonly'
];

var ONE_MONTH_IN_MILLISECONDS = 1000 * 60 * 60 * 24 * 30;

// Keep track of the currently authenticated user's YouTube channel ID.
var channelId;

// For information about the Google Chart Tools API, see:
// https://developers.google.com/chart/interactive/docs/quick_start
google.load('visualization', '1.0', {'packages': ['corechart']});

// Upon loading, the Google APIs JS client automatically invokes this callback.
// See http://code.google.com/p/google-api-javascript-client/wiki/Authentication
window.onJSClientLoad = function() {
    gapi.auth.init(function() {
        window.setTimeout(checkAuth, 1);
    });
};

// Attempt the immediate OAuth 2.0 client flow as soon as the page loads.
// If the currently logged-in Google Account has previously authorized
// the client specified as the OAUTH2_CLIENT_ID, then the authorization
// succeeds with no user intervention. Otherwise, it fails and the
// user interface that prompts for authorization needs to display.
function checkAuth() {
    gapi.auth.authorize({
        client_id: OAUTH2_CLIENT_ID,
        scope: OAUTH2_SCOPES,
        immediate: true
    }, handleAuthResult);
}

// Handle the result of a gapi.auth.authorize() call.
function handleAuthResult(authResult) {
    if (authResult) {
        // Authorization was successful. Hide authorization prompts and show
        // content that should be visible after authorization succeeds.
        $('.pre-auth').hide();
        $('.post-auth').show();

        loadAPIClientInterfaces();
    } else {
        // Authorization was unsuccessful. Show content related to prompting for
        // authorization and hide content that should be visible if authorization
        // succeeds.
        $('.post-auth').hide();
        $('.pre-auth').show();

        // Make the #login-link clickable. Attempt a non-immediate OAuth 2.0
        // client flow. The current function is called when that flow completes.
        $('#login-link').click(function() {
            gapi.auth.authorize({
                client_id: OAUTH2_CLIENT_ID,
                scope: OAUTH2_SCOPES,
                immediate: false
            }, handleAuthResult);
        });
    }
}

// Load the client interfaces for the YouTube Analytics and Data APIs, which
// are required to use the Google APIs JS client. More info is available at
// http://code.google.com/p/google-api-javascript-client/wiki/GettingStarted#Loading_the_Client
function loadAPIClientInterfaces() {
    gapi.client.load('youtube', 'v3', function() {
        gapi.client.load('youtubeAnalytics', 'v1', function() {
            // After both client interfaces load, use the Data API to request
            // information about the authenticated user's channel.
            console.log(getUserChannel());
            getUserChannel();
        });
    });
}

// Call the Data API to retrieve information about the currently
// authenticated user's YouTube channel.
function getUserChannel() {
    // Also see: https://developers.google.com/youtube/v3/docs/channels/list
    var request = gapi.client.youtube.channels.list({
        // Setting the "mine" request parameter's value to "true" indicates that
        // you want to retrieve the currently authenticated user's channel.
        mine: true,
        part: 'id,contentDetails'
    });

    request.execute(function(response) {
        console.log(response);
        if ('error' in response) {
            displayMessage(response.error.message);
        } else {
            // We need the channel's channel ID to make calls to the Analytics API.
            // The channel ID value has the form "UCdLFeWKpkLhkguiMZUp8lWA".
            channelId = response.items[0].id;
            // Retrieve the playlist ID that uniquely identifies the playlist of
            // videos uploaded to the authenticated user's channel. This value has
            // the form "UUdLFeWKpkLhkguiMZUp8lWA".
            var uploadsListId = response.items[0].contentDetails.relatedPlaylists.uploads;
            // Use the playlist ID to retrieve the list of uploaded videos.
            getPlaylistItems(uploadsListId);
        }
    });
}

// Call the Data API to retrieve the items in a particular playlist. In this
// example, we are retrieving a playlist of the currently authenticated user's
// uploaded videos. By default, the list returns the most recent videos first.
function getPlaylistItems(listId) {
    // See https://developers.google.com/youtube/v3/docs/playlistitems/list
    var request = gapi.client.youtube.playlistItems.list({
        playlistId: listId,
        part: 'snippet'
    });

    request.execute(function(response) {
        if ('error' in response) {
            displayMessage(response.error.message);
        } else {
            if ('items' in response) {
                // The jQuery.map() function iterates through all of the items in
                // the response and creates a new array that only contains the
                // specific property we're looking for: videoId.
                var videoIds = $.map(response.items, function(item) {
                    return item.snippet.resourceId.videoId;
                });

                // Now that we know the IDs of all the videos in the uploads list,
                // we can retrieve information about each video.
                getVideoMetadata(videoIds);
            } else {
                displayMessage('There are no videos in your channel.');
            }
        }
    });
}

// Given an array of video IDs, this function obtains metadata about each
// video and then uses that metadata to display a list of videos.
function getVideoMetadata(videoIds) {
    // https://developers.google.com/youtube/v3/docs/videos/list
    var request = gapi.client.youtube.videos.list({
        // The 'id' property's value is a comma-separated string of video IDs.
        id: videoIds.join(','),
        part: 'id,snippet,statistics'
    });

    request.execute(function(response) {
        if ('error' in response) {
            displayMessage(response.error.message);
        } else {
            // Get the jQuery wrapper for the #video-list element before starting
            // the loop.
            var videoList = $('#video-list');
            $.each(response.items, function() {
                // Exclude videos that do not have any views, since those videos
                // will not have any interesting viewcount Analytics data.
                if (this.statistics.viewCount == 0) {
                    return;
                }

                var title = this.snippet.title;
                var videoId = this.id;

                // Create a new <li> element that contains an <a> element.
                // Set the <a> element's text content to the video's title, and
                // add a click handler that will display Analytics data when invoked.
                var liElement = $('<li>');
                var aElement = $('<a>');
                // Setting the href value to '#' ensures that the browser renders the
                // <a> element as a clickable link.
                aElement.attr('href', '#');
                aElement.text(title);
                aElement.click(function() {
                    displayVideoAnalytics(videoId);
                });

                // Call the jQuery.append() method to add the new <a> element to
                // the <li> element, and the <li> element to the parent
                // list, which is identified by the 'videoList' variable.
                liElement.append(aElement);
                videoList.append(liElement);
            });

            if (videoList.children().length == 0) {
                // Display a message if the channel does not have any viewed videos.
                displayMessage('Your channel does not have any videos that have been viewed.');
            }
        }
    });
}

// This function requests YouTube Analytics data for a video and displays
// the results in a chart.
function displayVideoAnalytics(videoId) {
    if (channelId) {
        // To use a different date range, modify the ONE_MONTH_IN_MILLISECONDS
        // variable to a different millisecond delta as desired.
        var today = new Date();
        var lastMonth = new Date(today.getTime() - ONE_MONTH_IN_MILLISECONDS);

        var request = gapi.client.youtubeAnalytics.reports.query({
            // The start-date and end-date parameters must be YYYY-MM-DD strings.
            'start-date': formatDateString(lastMonth),
            'end-date': formatDateString(today),
            // At this time, you need to explicitly specify channel==channelId.
            // See https://developers.google.com/youtube/analytics/v1/#ids
            ids: 'channel==' + channelId,
            dimensions: 'day',
            sort: 'day',
            // See https://developers.google.com/youtube/analytics/v1/available_reports
            // for details about the different filters and metrics you can request
            // if the "dimensions" parameter value is "day".
            metrics: 'views',
            filters: 'video==' + videoId
        });

        request.execute(function(response) {
            // This function is called regardless of whether the request succeeds.
            // The response contains YouTube Analytics data or an error message.
            if ('error' in response) {
                displayMessage(response.error.message);
            } else {
                displayChart(videoId, response);
            }
        });
    } else {
        // The currently authenticated user's channel ID is not available.
        displayMessage('The YouTube channel ID for the current user is not available.');
    }
}

// This boilerplate code takes a Date object and returns a YYYY-MM-DD string.
function formatDateString(date) {
    var yyyy = date.getFullYear().toString();
    var mm = padToTwoCharacters(date.getMonth() + 1);
    var dd = padToTwoCharacters(date.getDate());

    return yyyy + '-' + mm + '-' + dd;
}

// If number is a single digit, prepend a '0'. Otherwise, return the number
//  as a string.
function padToTwoCharacters(number) {
    if (number < 10) {
        return '0' + number;
    } else {
        return number.toString();
    }
}

// Call the Google Chart Tools API to generate a chart of Analytics data.
function displayChart(videoId, response) {
    if ('rows' in response) {
        hideMessage();

        // The columnHeaders property contains an array of objects representing
        // each column's title -- e.g.: [{name:"day"},{name:"views"}]
        // We need these column titles as a simple array, so we call jQuery.map()
        // to get each element's "name" property and create a new array that only
        // contains those values.
        var columns = $.map(response.columnHeaders, function(item) {
            return item.name;
        });
        // The google.visualization.arrayToDataTable() function wants an array
        // of arrays. The first element is an array of column titles, calculated
        // above as "columns". The remaining elements are arrays that each
        // represent a row of data. Fortunately, response.rows is already in
        // this format, so it can just be concatenated.
        // See https://developers.google.com/chart/interactive/docs/datatables_dataviews#arraytodatatable
        var chartDataArray = [columns].concat(response.rows);
        var chartDataTable = google.visualization.arrayToDataTable(chartDataArray);

        var chart = new google.visualization.LineChart(document.getElementById('chart'));
        chart.draw(chartDataTable, {
            // Additional options can be set if desired as described at:
            // https://developers.google.com/chart/interactive/docs/reference#visdraw
            title: 'Views per Day of Video ' + videoId
        });
    } else {
        displayMessage('No data available for video ' + videoId);
    }
}

// This helper method displays a message on the page.
function displayMessage(message) {
    $('#message').text(message).show();
}

// This helper method hides a previously displayed message on the page.
function hideMessage() {
    $('#message').hide();
}

})();

和html页面:

<!doctype html>
<html>
<head>
    <title>Sample YouTube Analytics API Implementation</title>
    <link type="text/css" rel="stylesheet" href="/index.css">
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script type="text/javascript" src="//www.google.com/jsapi"></script>
    <script type="text/javascript" src="/index.js"></script>
    <script type="text/javascript" src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script>
</head>
<body>
<div id="login-container" class="pre-auth">This application requires access to your YouTube account.
    Please <a href="#" id="login-link">authorize</a> to continue.
</div>
<div class="post-auth">
    <div id="message"></div>
    <div id="chart"></div>
    <div>Choose a Video:</div>
    <ul id="video-list"></ul>
</div>
<a class="plain" href="https://accounts.google.com/o/oauth2/auth?client_id=261487559881-d9al0muik318iaa07uiasvqb2gliinpm.apps.googleusercontent.com&redirect_uri=http://php.com/2/&scope=https://www.googleapis.com/auth/yt-analytics.readonly&response_type=token" target="_blank">
    get token </a>
<br><br>
<a class="result" href="">
    to see resultat
</a>
</body>
<script>
    //(function() {
    function getUrlVars()
    {
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('#') + 1).split('&');
        for(var i = 0; i < hashes.length; i++)
        {
            hash = hashes[i].split('=');
            vars.push(hash[0]);
            vars[hash[0]] = hash[1];
        }
        return vars;
    }
        $(document).ready(function(){
            var token = getUrlVars()['access_token'];
            $('.result').attr('href', 'https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel==mine&start-date=2014-01-01&end-date=2014-02-01&metrics=comments,views,likes&dimensions=month&access_token=' + token);
        });
    //});
</script>
</html>

3 个答案:

答案 0 :(得分:3)

首先,在您的文件index.js中,您忘记关闭该功能。该文件需要以

结束
})();

第二点,为什么不尝试使用doc上的例子?我看到你使用doc的js但你改变了index.html。尝试使用doc的简单示例,它可以帮助您解决问题。 检查您是否再次看到错误,然后检查http://console.developers.google.com,确保您的项目设置良好。

您需要激活:

YouTube Analytics API
YouTube Data API v3

您还需要凭据才能拥有您的客户ID。

enter image description here

我在家里尝试使用我的客户端ID,它完美无缺。使用您的客户端ID尝试此代码,并查看附加内容。

http://jsbin.com/gokovoje/3/edit?html,js,output

修改

将函数checkAuth()替换为:

  function checkAuth() {
    gapi.auth.authorize({
      client_id: OAUTH2_CLIENT_ID,
      scope: OAUTH2_SCOPES,
      immediate: false
    }, handleAuthResult);
  }

编辑2°

超过5个视频使用maxResults

  

maxResults参数指定最大项目数   应该在结果集中返回。 (整数,0-50)

maxResults添加到函数getPlaylistItems(listId)

  // Calls the Data API to retrieve the items in a particular playlist. In this
  // example, we are retrieving a playlist of the currently authenticated user's
  // uploaded videos. By default, the list returns the most recent videos first.
  function getPlaylistItems(listId) {
    // https://developers.google.com/youtube/v3/docs/playlistItems/list
    var request = gapi.client.youtube.playlistItems.list({
      playlistId: listId,
      part: 'snippet',
      maxResults: 30
    });

    request.execute(function(response) {
      if ('error' in response) {
        displayMessage(response.error.message);
      } else {
        if ('items' in response) {
          // jQuery.map() iterates through all of the items in the response and
          // creates a new array that only contains the specific property we're
          // looking for: videoId.
          var videoIds = $.map(response.items, function(item) {
            return item.snippet.resourceId.videoId;
          });

          // Now that we know the IDs of all the videos in the uploads list,
          // we can retrieve info about each video.
          getVideoMetadata(videoIds);
        } else {
          displayMessage('There are no videos in your channel.');
        }
      }
    });
  }

答案 1 :(得分:0)

使用youtube数据api v3时遇到了同样的问题。

只需按照以下步骤操作:

  1. 确保更改checkAuth()并替换immediate:false。这将是调试代码的好方法。(这就是我的情况)。还要确保在Google开发者控制台中将所需的APIS设置为ON。
  2. function checkAuth() {
     gapi.auth.authorize({
     client_id: OAUTH2_CLIENT_ID,
     scope: OAUTH2_SCOPES,
    immediate: false
    }, handleAuthResult);
    }
    

    一旦执行了第1步,您可能会收到unknow_client错误(实际上就是核心问题)

    2所以请访问Google开发者控制台。对于您的项目,请转到 API和Auths&gt;同意屏幕&gt; ,并提供电子邮件地址和产品名称。

    3保存。现在尝试执行代码。

答案 2 :(得分:0)

在启动此脚本教程之前,请确保已加载DOM。

如果您有疑问,只需将所有<script>标记放在结束</body>标记之前。