当前位置: 首页 > 知识库问答 >
问题:

使用API的v3在Objective-C中检索YouTube通道上传

郗福
2023-03-14

你好,我正在尝试使用xcode中的google-api库从youtube api中获取频道对象,这是我使用的代码:

    //youtubeService type is GTLServiceYouTube
    youtubeService = [[GTLServiceYouTube alloc] init];
    youtubeService.shouldFetchNextPages = YES;
    //auth is the object from the authentication callback 
    youtubeService.authorizer = auth;
    videoQuery = [GTLQueryYouTube 
    queryForChannelsListWithPart:@"RayWilliamJohnson"];
    videoQuery.maxResults = 20;

    youtubeTicket = [youtubeService executeQuery:videoQuery completionHandler:
^(GTLServiceTicket *ticket, id channel, NSError *error) {
                NSLog(@" %@ ", error.description);
                NSLog(@"WIN! : %@ ", channel);
                }];

到目前为止,我得到了这个错误:

error Domain = com . Google . gtljsonrpcerrordomain Code =-32602 "操作无法完成。(RayWilliamJohnson)" UserInfo = 0x 7532 c 40 { error = RayWilliamJohnson,gtlstructureerror = GTLErrorObject 0x 7533d 30:{ message:" RayWilliamJohnson "代码:-32602数据:[1]},NSLocalizedFailureReason =(RayWilliamJohnson)}

知道是什么导致了这个错误吗?

提前感谢您的帮助!

编辑:我已经阅读了类中的文档,这些类只是“不存在”:P,并检查了也遵循相同方法的其他示例

编辑2:好的,我已经尝试了下面的改变,但没有一个奏效:(,在查询浏览器上使用相同的例子时,我成功了。

videoQuery.maxResults = 20;
videoQuery.q = @"RayWilliamJohnson";
videoQuery.type = @"channel";

/*tried setting the part without calling the query 
 method on GTLQueryYoutube but that did not work videoQuery.part = @"id";*/

videoQuery = [GTLQueryYouTube queryForChannelsListWithPart:@"id"];
//fetching only 20 items.
youtubeTicket = [youtubeService executeQuery:videoQuery completionHandler:
^(GTLServiceTicket *ticket, id channel, NSError *error) {
    NSLog(@" %@ ", error.description);
    NSLog(@"WIN! : %@ ", channel);
    }];

错误略有不同,它表示我没有指定任何过滤器,即使我指定了。

Error Domain=com.google.GTLJSONRPCErrorDomain Code=-32602 "The operation couldn’t be completed. (No filter selected.)" UserInfo=0x8870250 {error=No filter selected., GTLStructuredError=GTLErrorObject 0x88707f0: {message:"No filter selected." code:-32602 data:[1]}, NSLocalizedFailureReason=(No filter selected.)}

Edit3:好的,我改变了两件事,首先,我犯了一个愚蠢的错误,在设置参数后初始化了查询,而参数只是删除了它们。所以代码现在看起来像这样:

        youtubeService.authorizer = auth;
        videoQuery = [GTLQueryYouTube queryForChannelsListWithPart:@"id"];
        videoQuery.maxResults = 1;
        videoQuery.q = @"RayWilliamJohnson";
        videoQuery.type = @"channel";


        youtubeTicket = [youtubeService executeQuery:videoQuery
                         completionHandler:^(GTLServiceTicket *ticket, GTLYouTubeChannel *channel,
                                             NSError *error) {
            NSLog(@" %@ ", error.description);
            NSLog(@"WIN! : %@ ", channel.description);
            }];

但我仍然收到“未指定过滤器”的错误,这意味着变量未以任何一种方式设置...

Edit4:好吧,在经历了这么多金发女郎的时刻之后,我成功地做到了这一点,那就是我正在初始化的查询对象,我试图使用一个前缀对象,它专门用于频道查找,我应该只使用queryForSearchListWithPart,所以运行的代码如下所示:

youtubeService.authorizer = auth;       
videoQuery = [GTLQueryYouTube queryForSearchListWithPart:@"id"];
videoQuery.maxResults = 1;
videoQuery.q = @"RayWilliamJohnson";      
youtubeTicket = [youtubeService executeQuery:videoQuery
         completionHandler:^(GTLServiceTicket *ticket, GTLYouTubeChannel *channel,
            NSError *error) {
            NSLog(@" %@ ", error.description);
            NSLog(@"WIN! : %@ ", channel.description);
            }];

并且提供了该结果:

2012-12-12 00:17:21.315 Test[13099: c07](null)2012-12-12 00:17:21.316 Test[13099: c07]WIN!: GTLYouTubeSearchListSecurity 0x727f6d0:{pageInfo:{总额结果,结果PerPage}etag:""bm4JOKyioI0quSqrxEnI8H7snE4/A2tE7ag9HxUC5HxeD2vDlGNg5iM""nextPageToken:"CAEQAA"种类:"youtube#搜索列表响应"项目:[1]}

谢谢你的帮助,杰夫

共有3个答案

司马彬
2023-03-14

任何正在搜索如何通过id查找频道的人,请使用此

GTLServiceYouTube *youTubeService = [[GTLServiceYouTube alloc] init];
youTubeService.APIKey = @"<YOUR_API_KEY>";

GTLQueryYouTube *channelsQuery = [GTLQueryYouTube queryForChannelsListWithPart:@"id,snippet,brandingSettings,contentDetails,invideoPromotion,statistics,status,topicDetails"];
channelsQuery.identifier = @"<CHANNEL_ID>";

[youTubeService executeQuery:channelsQuery completionHandler:^(GTLServiceTicket *ticket, GTLYouTubeChannelListResponse *channelListResponse, NSError *error) {
    if (error == nil) {
        if (channelListResponse.items.count > 0) {
            GTLYouTubeChannel *channel = channelListResponse.items.firstObject;
            NSLog(@"Got youtube channel - %@", channel);
        } else {
            NSLog(@"Cannot find channels with id %@", channelsQuery.identifier);
        }
    } else {
        NSLog(@"Cannot get youtube channels - %@", error);
    }
}];
薛弘壮
2023-03-14
service = [[GTLServiceYouTube alloc] init];
service.shouldFetchNextPages = YES;
service.retryEnabled = YES;
service.APIKey = @"xxxxxxxx";

GTLQueryYouTube *query = [GTLQueryYouTube queryForSearchListWithPart:@"id,snippet"];
query.maxResults = 15;
query.q = YOUR_SEARCH_TEXT;
query.fields = @"items(id,snippet)";
query.order = @"viewCount";

[service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) {
    if (!error) {
        for (GTLYouTubeVideoListResponse *videoInfo in object) {
            [youtubeList addObject:videoInfo.JSON];
        }
        NSLog(@"youtubeList count %lu",(unsigned long)youtubeList.count);
        NSLog(@"youtubeList %@",youtubeList);
        [self.tableView reloadData];
    } else {
        NSLog(@"%@", error);
    }
    -- i'm test this currently for pagination --
    GTLYouTubePlaylistItemListResponse *playlistItems = object;
    NSLog(@"playlistItems.nextPageToken %@",playlistItems.nextPageToken);
    NSLog(@"playlistItems.prevPageToken %@",playlistItems.prevPageToken);
    if(playlistItems.nextPageToken) {
        NSLog(@"new page!!!");
        query.pageToken = playlistItems.nextPageToken;
        [self requestYoutubeVideo:withText];
    } else {
        NSLog(@"No more pages");
    }
}];

`

厍彭薄
2023-03-14

我不是Objective-C程序员,所以我不能专门建议如何修改你的代码,但这是一般问题。

看起来您正在调用YouTubeData API v3channels.list()方法,https://developers.google.com/youtube/v3/docs/channels/list

所需的一个参数是part,我假设ueryForChannelsListWithPart()方法将其作为一个参数<代码>部分应设置为id,或id,contentDetails,如文档中所述。

然后,您需要添加一个额外的参数来告诉API您正在尝试检索关于哪个通道的信息。文档的“过滤器”部分列出了各种选项。

API 的 v3 不支持在 channel.list() 调用中指定旧版 YouTube 用户名。它确实会采用id参数,该参数对应于您要检索其信息的频道的YouTube频道ID。这些通常是UC...的形式,在RayWilliamJohnson的情况下,通道ID是UCGt7X90Au6BV8rf49BiM6Dg。(您可以通过search.list()调用来解决这个问题;下面是一个使用API资源管理器的示例

请注意,channels.list()方法实际上并没有返回视频列表。如果要检索给定频道中最近的视频,需要进行channels.list()调用,从content细节部分获取相应的上传播放列表id,然后进行playlistItems.list()调用,获取该上传播放列表中的视频。我们有一个在Python中这样做的例子,但在Objective-C中还没有端到端的例子。

 类似资料:
  • YouTube频道可以有几个“相关”频道的列表。例如,音乐频道有相关的流派频道:嘻哈、流行、摇滚、乡村等。 音乐频道:http://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ 音乐频道相关频道:http://www . YouTube . com/Channel/UC-9-kytw 8 zkzndhqj 6 fg pwq/Channels 我可

  • 我想使用YouTube API的v3来检索特定YouTube视频的标签。 我可以通过此请求检索视频到搜索endpoint,https://www.googleapis.com/youtube/v3/search?part=snippet 现在,我点击视频endpoint,试图从上面的查询中获取视频的标签。https://www.googleapis.com/youtube/v3/videos?id

  • 我在MVC Web应用程序中使用YouTubeAPI V3。目的是让我的Web用户使用MY OAuth凭据将视频上传到MYYouTube频道。在用户将他们的视频上传到我的Web服务器后,我需要在我的Web服务器和YouTube之间自动上传,无需我自己的用户干预。 我的(初稿)代码如下。我的问题是: > < li> 更新-已在下面解决。每当我试图删除一个视频,我得到一个“未经授权”的错误。当我检查令

  • 我正在使用youtube v3 API检索播放列表的视频,并通过此链接获得50个项目,没有任何问题:- https://www.googleapis.com/youtube/v3/playlistItems?part=snippet 但是视频数是100,我只有50个。我如何获得接下来的50个项目?我尝试了start index,但它不适用于v3 API。感谢任何帮助。

  • 我正在尝试通过YouTube数据API v3将视频上传到多个频道。 当我将视频上传到主默认频道时,我可以正确地做到这一点,但是当我们尝试将它们上传到同一Youtube帐户的另一个频道时,却无法做到(因此OAuth2凭据应该是有效的)。 根据文档,在调用endpoint时,我必须将以下参数传递给API:onBehalfOfContentOwnerChannel和onBehalfOfContentOw

  • 我正试图用PHP上传一个视频到Youtube。我用的是Youtube API v3,我用的是最新的谷歌API PHP客户端库的源代码。< br >我使用< br > https://code.google.com/p/google-api-php-client/上给出的示例代码来执行身份验证。身份验证顺利通过,但当我尝试上传视频时,我得到< code > Google _ service exce