如何对所有 Youtube Data API 搜索结果进行分页

问题描述 投票:0回答:2

我正在使用 Youtube Data API 通过搜索查询来搜索即将举行的活动。

具体查询是

https://www.googleapis.com/youtube/v3/search?part=id%2Csnippet&eventType=upcoming&q=vs&type=video&key={api_key}

返回的pageInfo.totalResults约为150272

虽然当我尝试对它们进行分页时,我只获得了 147 个项目,直到响应中的项目数组为空,并且每个响应中的 nextPageToken 都是相同的,这样我就继续循环尝试获得更多结果(耗尽了我的API 配额)并且不返回任何内容。这是一个错误吗?

youtube pagination youtube-api youtube-data-api
2个回答
0
投票

您可以参考此文档 - Paging through results,API 响应使用 link 标签来识别 Feed 中上一页和/或下一页条目的

pagination
链接。为了避免分页问题,官方文档建议您看到这些链接,以便用户能够链接到 API 结果的不同页面。

API 使用 start-indexmax-results 请求参数来确定 API 响应中包含哪些结果。此外,API 响应使用 标签来估算 Feed 中的条目总数。

<openSearch:startIndex>26</openSearch:startIndex>
<openSearch:itemsPerPage>25</openSearch:itemsPerPage>
<openSearch:totalResults>107</openSearch:totalResults>

0
投票

也许尝试一下这个函数来为你解决分页问题:

    public static async Task<List<T>> ExecuteRequest<T>(dynamic request, CancellationToken cancelToken)
    {
        string nextPageToken = "";
        var result = new List<T>();
        do
        {
            request.MaxResults = 100;
            if (!String.IsNullOrEmpty(nextPageToken))
                request.PageToken = nextPageToken;
            var response = await request.ExecuteAsync(cancelToken);
            nextPageToken = response.NextPageToken;

            result.AddRange(response.Items);

        } while (!String.IsNullOrEmpty(nextPageToken));

        return result;
    }

并使用这样的东西:

    private async Task GetPlaylistAsync(string playlistId)
    {

        var request = Client.PlaylistItems.List("snippet");
        request.PlaylistId = playlistId;

        var videos = await Functions.ExecuteRequest<Google.Apis.YouTube.v3.Data.PlaylistItem>(request, CancellationToken);
    }

您可以轻松地将其修改为您的 YouTubeApi 版本与分页的配合方式。

© www.soinside.com 2019 - 2024. All rights reserved.