如何解决YouTube API:检索用户在给定日期之前/之后订阅的订阅列表
我正在创建一个RESTful API,其中某些端点必须使用YouTube API来获取所需用户的数据,而我在其中一项功能中苦苦挣扎了几天。
其中一项功能涉及YouTube订阅,并允许用户向其分配自己的数据。然后,订阅数据将存储在API数据库中。我面临的问题是,我想检索尚未分配给用户的订阅列表(意味着:API尚未返回)。未分配的订阅的端点必须进行分页,因为我无法用潜在的大对象进行响应。因此,我想让用户指定诸如page
,per_page
之类的参数。
YouTube API也会以分页的订阅列表作为响应。
请求GET https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&mine=true&key=[YOUR_API_KEY]
给了我一个响应,其中包括诸如nextPageToken
,prevPageToken
之类的字段,订阅对象列表,其中每个对象都包含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
,
if true =>返回nextPageToken
(如果存在)的页面并更新我的“跟踪”数据。
else =>
a)页面上最后结果的publishedAt
早于缓存的lastSubscriptionDate
用户删除了一些订阅。
b)页面上最后结果的publishedAt
比缓存的lastSubscriptionDate
用户订阅了一些新的YouTube频道
在a)和b)选项中,最好的方法是仅在N
之后或{{1}前检索N
(其中lastSubscriptionDate
等于per_page参数)订阅},以确保我不会在分页过程中跳过任何订阅,但是我觉得无法使用当前版本的YouTube API。
我错过了什么吗?在确定没有跳过任何订阅的同时,还有其他方法可以从YouTube API中检索那些未分配的订阅吗?
解决方法
你的报价:
因为我会按时间顺序(最新)从YouTube API请求这些订阅。
用mine=true
查询的Subscriptions.list
API端点没有可让您获得Subscription resources排序的publishedAt
的参数。
我没有其他解决方案,但是您的应用程序具有刷新我的订阅列表功能,当用户知道他/她从YouTube网络用户界面中更改了他/她的订阅列表时,就会调用该功能。当然,事情可能会得到进一步发展:例如,还可以定期调用刷新我的订阅列表,而无需任何用户干预(使用您设计的逻辑使其适合您应用的常规工作)。
然后,此刷新我的订阅列表将从YouTube数据API中提取所有Subscription resources
并将该列表(L1
)与一个{{ 1}}-记录在您应用的数据库中以获取差异:对于L2
和L1
的并集中的每个条目,在两个列表中都附加(1)L2
,( 2)=
仅适用于-
,而(3)L2
仅适用于+
。
然后,计算出的差异将允许更新您应用的数据库(从而使其与YouTube上的远程服务器同步)。
附录
(我不确定使用Activities.list
API端点是否值得解决:仅将其指出以供您获取有关它的知识。)
您可以考虑通过查询以下内容的Activities.list
API端点来优化刷新我的订阅列表功能的逻辑:
-
L1
, -
mine=true
, -
part=snippet,contentDetails
和 -
fields=items(snippet(type),contentDetails(subscription))
。
但是,不幸的是,API的实现方式仅能部分解决我上面所述的 diff计算:
contentDetails.subscription(对象)
订阅对象包含有关用户订阅的频道的信息。仅当publishedAfter=...
为snippet.type
时,此属性才存在。contentDetails.subscription.resourceId(对象)
subscription
对象包含标识用户订阅的资源的信息。contentDetails.subscription.resourceId.kind(字符串)
API资源的类型。contentDetails.subscription.resourceId.channelId(字符串)
YouTube用于唯一标识用户订阅的频道的ID。仅当resourceId
为resourceId.kind
时,此属性才存在。
这些引号表示自将youtube#channel
值传递到datetime
以来,API仅会让您知道哪些是新订阅。从API获得的数据只是上述差异的publishedAfter
部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。