node.js - YouTube API:检索用户在给定日期之前/之后订阅的订阅列表

标签 node.js rest youtube youtube-data-api

我正在创建一个RESTful API,其中某些端点必须使用YouTube API才能获取所需用户的数据,而我在其中一项功能中苦苦挣扎了几天。
其中一项功能涉及YouTube订阅,并允许用户向其分配自己的数据。然后,订阅数据将存储在API数据库中。我面临的问题是,我想检索尚未分配给用户的订阅列表(意味着:API尚未返回)。未分配的订阅的端点必须进行分页,因为我无法用潜在的大对象进行响应。所以我想让用户指定诸如pageper_page的参数。
YouTube API也会以分页的订阅列表进行响应。
请求GET https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&mine=true&key=[YOUR_API_KEY]给了我一个响应,其中包括诸如nextPageTokenprevPageToken,订阅对象列表之类的字段,其中每个对象都包含publishedAt字段。
我正在考虑的解决方案如下:
为了跟踪返回的订阅,我将在API数据库中创建以下字段:lastSubscriptionDate: datetime-我的API缓存的最早的订阅日期firstSubscriptionDate: datetime-我的API缓存的最新订阅日期lastPageToken: string-我从中请求数据并保存lastSubscriptionDate的最后一页
流程:

  • 用户请求GET /subscriptions?filter=unassigned&page=[PAGE]&per_page=[PER_PAGE]
  • 由于我会按时间顺序(按最新顺序)从YouTube API请求这些订阅,因此我有以下几种情况:

  • 我检查lastSubscriptionDate是否等于publishedAt页面上最后一个结果的lastPageToken
    如果为true =>,则返回nextPageToken的页面(如果存在)并更新我的“跟踪”数据。
    其他=>
    a)页面上最后结果的publishedAt早于缓存的lastSubscriptionDate <=>用户删除了一些订阅。
    b)页面上最后结果的publishedAt比缓存的lastSubscriptionDate <=>更新。用户订阅了一些新的YouTube channel
    在a)和b)选项中,最好的方法是仅在N之后或N之前检索lastSubscriptionDate(其中firstSubscriptionDate等于per_page参数)订阅,以确保我不会在分页过程中跳过任何订阅,但是我觉得当前版本的YouTube API是不可能的。
    我想念什么吗?在确定没有跳过任何订阅的同时,还有其他方法可以从YouTube API中检索那些未分配的订阅吗?

    最佳答案

    引用你的话:

    Since I would request those subscriptions from the YouTube API in the chronological order (by the most recent) [...].


    Subscriptions.list查询的 mine=true API端点没有参数,该参数使您能够获取Subscription resources排序的 publishedAt
    我没有其他解决方案,但是您的应用程序具有刷新我的订阅列表功能的功能,当用户知道他/她从YouTube Web UI中更改了他/她的订阅列表时,就会调用该功能。当然,事情可能会得到进一步发展:例如,还可以定期调用刷新我的订阅列表,而无需任何用户干预(使用您设计的逻辑使其适合您的应用程序的正常工作)。
    然后刷新此订阅列表,即可从YouTube数据API中获取所有Subscription resources,并将此列表L1与记录在应用程序数据库中的一个L2相匹配,以获取差异:对于联合中的每个条目L1L2中的(1)将=附加到两个列表中,将(2)-附加到仅存在于L2中的列表,将(3)+附加到仅存在于L1中的列表。
    然后,计算出的差异将允许您更新应用程序的数据库(从而使其与YouTube上的远程服务器同步)。

    附录
    (我不确定使用 Activities.list API端点是否值得解决这个问题:只是指出来让您获得有关它的知识。)
    您可以考虑使用查询以下内容的 Activities.list API端点来优化刷新我的订阅列表功能的逻辑:
  • mine=true
  • part=snippet,contentDetails
  • fields=items(snippet(type),contentDetails(subscription))
  • publishedAfter=...

  • 但是,不幸的是,API的实现方式仅能部分解决我上述的差异计算:

    contentDetails.subscription (object)
    The subscription object contains information about a channel that a user subscribed to. This property is only present if the snippet.type is subscription.

    contentDetails.subscription.resourceId (object)
    The resourceId object contains information that identifies the resource that the user subscribed to.

    contentDetails.subscription.resourceId.kind (string)
    The type of the API resource.

    contentDetails.subscription.resourceId.channelId (string)
    The ID that YouTube uses to uniquely identify the channel that the user subscribed to. This property is only present if the resourceId.kind is youtube#channel.


    这些引号表示自从datetime值传递到publishedAfter以来,API仅会让您知道哪些是您进行的新订阅。从API获得的数据只是上述diff的+部分。

    关于node.js - YouTube API:检索用户在给定日期之前/之后订阅的订阅列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63377418/

    相关文章:

    javascript - AngularJS 多个表达式在插值中与 URL 连接

    javascript - 如何从 NodeJS API 上传图片到谷歌驱动器

    java - 当使用 Spring Boot Rest Controller 中的其他实体引用映射到 Hibernate 实体的 JSON 时,Jackson InvalidTypeIdException

    php - 获取Youtube视频标题,说明和缩略图时出错

    java - Elasticsearch Java TermVectorRequest (_termvector)

    rest - PayPal REST API 500 内部服务错误仅在实时

    javascript - 单击图像后如何播放/启动 youtube 视频?

    javascript - node.js 的服务器端模板

    javascript - 使用 Mongoose 增加子文档键

    mysql - 将 mysql 时间戳字段转换为格式化日期 dd/mm/yyyy