YouTube API V3 - 403禁止使用

时间:2014-10-04 20:37:58

标签: google-api youtube-api google-api-php-client google-authentication

更新

感谢易卜拉欣,我现在认为离此更近了。

使用此处提供的示例(https://developers.google.com/youtube/partner/docs/v1/contentOwners/list),我收到另一个Forbidden错误:

调用GET googleapis时遇到错误.... / youtube / partner / v1 / contentOwners?fetchMine = true:(403)Forbidden

...

在下面的链接上从API资源管理器中尝试此操作时,我可以获取YouTube CMS帐户详细信息。 https://developers.google.com/youtube/partner/docs/v1/contentOwners/list

另请注意"开发者帐户"与我们的" Youtube CMS帐户相关联#34; - 并且是YouTube合作伙伴。


希望有人可以帮助找出导致此问题的原因(403)我在尝试从YouTube CMS帐户中提取频道时遇到的禁止错误。

以下是一些细节以及我到目前为止所做的工作:

操作系统:Linux,语言:PHP 5

  1. 创建了一个项目(@ console.developers.google.com)
  2. 启用了YouTube Data API V3,YouTube Analytics和FreeBase API
  3. 为OAuth2创建了服务帐户凭据
  4. 获得google-api-php-client并安装到服务器
  5. 创建了一个用于验证服务帐户的测试脚本(请参阅下面的完整PHP代码)
  6. 到目前为止,这些测试尝试获取频道的结果:

    测试1)当我将参数:mine设置为true时,它不会返回错误,当我转到/youtube.com/时,它返回的频道不存在信道/ {channelID_returned}

    测试2)当我将参数:forUsername设置为SomeYoutubeUsername时,它返回用户的频道并确认返回的频道ID是正确且有效的。

    测试3)这是我真正想要完成的事情,我已将managedByMe设置为true并将onBehalfOfContentOwner设置为CMSContentOwner ,然后它返回(403)禁止错误:

    Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling .... etc.etc (403) Forbidden
    

    请注意:我尝试使用" Google oAuth Web Application"从CMS帐户中获取频道。流动,它工作。


    完整代码:

    <?php
    
    ini_set('display_errors',1);
    // Initialize...
    $key_Path = '...omitted...';
    set_include_path( '...omitted...' );
    
    require_once 'Google/Client.php';
    require_once 'Google/Service/YouTube.php';
    
    // Setup Credentials
    $client_id = '...omitted...';
    $service_account_name = ''...omitted...';
    $key_file_location = $key_Path.''...omitted....p12';
    
    $client = new Google_Client();
    $client->setApplicationName("'...omitted...");
    
    $youtube = new Google_Service_YouTube($client);
    
    /************************************************
    If we have an access token, we can carry on.
    Otherwise, we'll get one with the help of an
    assertion credential. In other examples the list
    of scopes was managed by the Client, but here
    we have to list them manually. We also supply
    the service account
    ************************************************/
    $service_token = get_Configuration( 'GOOGLE_API' , 'TOKEN' );   
    //$client->revokeToken( $service_token );
    
    if ( !empty($service_token) ) {
        $client->setAccessToken($service_token);
    }
    $key = file_get_contents($key_file_location);
    $cred = new Google_Auth_AssertionCredentials(
        $service_account_name,
        array(
            'https://www.googleapis.com/auth/youtube',
            'https://www.googleapis.com/auth/youtube.readonly',
            'https://www.googleapis.com/auth/youtubepartner',
            'https://www.googleapis.com/auth/youtubepartner-channel-audit'
        ),
        $key
    );
    
    $cred->sub = '...ommited...';
    $client->setAssertionCredentials($cred);
    if($client->getAuth()->isAccessTokenExpired()) {
        $client->getAuth()->refreshTokenWithAssertion($cred);
    }
    
    /************************************************
      We're just going to make the same call as in the
      simple query as an example.
     ************************************************/
    $service_token = $client->getAccessToken();
    
    $params = array( //'mine' => true,
                     //'forUsername' => ''...omitted...',
                     'managedByMe' => true,
                     'onBehalfOfContentOwner' => ''...omitted...' // CMS Account User ID
                     );
    
    $channels = $youtube->channels->listChannels( 'contentDetails' , $params );
    
    print_r( $channels );
    //$Channels = $youtube->Channels->list('contentDetails','{mine : true}');
    
    ?>
    

1 个答案:

答案 0 :(得分:1)

要在此处使用服务帐户,您应该拥有和管理频道,并且频道应该链接到您尝试获取的CMS帐户。然后指定managedbyMe和contentowner的ID(不是名称)。

更多信息:https://developers.google.com/youtube/v3/docs/channels/list#managedByMe

示例:https://developers.google.com/youtube/partner/code_samples/php