30

我正在尝试在我的 YouTube API 应用程序中获取给定用户的完整观看视频列表。我想把所有视频的总时长加起来。

当我从历史播放列表中获取视频列表时,API 将其限制为 50 个项目。有分页,但项目总数为 50(不仅仅是每页);我无法使用它出现的 API 访问更多数据。

有没有什么办法可以在没有数据上限的情况下获得这个播放列表?我希望有另一种方法(使用 API)或没有 API 的方法。我知道 YouTube 会存储这些数据,因为我可以查看我的整个历史记录(远远超过 50 个视频)。

我正在使用这段代码:

var requestOptions = {
    playlistId: playlistId,
    part: 'snippet',
    maxResults: 50
};
gapi.client.youtube.playlistItems.list(requestOptions);

playlistId我从gapi.client.youtube.channels.list请求中获得的历史播放列表的 ID在哪里。

编辑(2017 年):我想澄清一下,我一直打算下载我自己的历史记录,只是想看看我花了多少时间观看视频。我仍然无法做到这一点。

4

5 回答 5

16

该 API 目前仅检索过去两周的观看历史记录。有关更多信息,请参阅报告的错误问题:https ://code.google.com/p/gdata-issues/issues/detail?id=4642

注意: 这里有一个关于 SO 的类似问题:YouTube API v3 returns truncated watch history

于 2015-07-16T00:25:22.177 回答
16

不久前,我为这个任务写了一个爬虫(在 Python 2.7(更新为 3.5)和 Scrapy 中)。没有官方 API,它使用登录会话 cookie 和 html 解析。默认转储到 SQLite。 https://github.com/zvodd/Youtube-Watch-History-Scraper

它是如何完成的:本质上它打开了 url

https://www.youtube.com/feed/history'

使用从 Chrome 获取的有效(登录)会话 cookie。抓取所有视频条目的名称、vid(url)、频道/用户、描述、长度。然后它在页面底部找到带有属性data-uix-load-more-href的按钮,其中包含指向下一页的链接,例如:

"/browse_ajax?action_continuation=1&continuation=98h32hfoasau0fu928hf2hf908h98hr%253D%253D&target_id=item-section-552363&direct_render=1"

...从那里重新抓取视频条目并将它们全部转储到 sqlite 数据库中;您可以按任何字段(名称、长度、用户、描述等)搜索条目。

因此,在他们更改他们的提要/历史页面之前,它是可行的并且已经完成。我什至可能会更新它。

于 2016-03-02T23:51:57.263 回答
3

这似乎是 2013 年最初报告的已知错误。在 Google 代码线程中解释了完全相同的行为:https ://code.google.com/p/gdata-issues/issues/detail?id=4642

于 2015-07-22T14:04:12.340 回答
1

虽然目前仅使用 YouTube API 是不可能的,但有一个(尽管稍微涉及)方法来计算您的观看时间):

  1. 使用Google Takeout将您的观看历史列表下载为 JSON 文件。
  2. 不幸的是,JSON 文件不包含视频时长,因此下一步是提取视频 ID(“titleURL”对象中“watch?v=”之后的部分
  3. 现在获取您的视频 ID 列表,并向 youtube API 发送一个请求,如下所示:
 function execute() {
    return gapi.client.youtube.videos.list({
      "part": [
        "contentDetails"
      ],
      "id": [
        "VIDEO IDs"
      ],
      "fields": "items(contentDetails(duration))"
    })

(使用YouTube API Explorer创建的代码)

注意:您可能需要将视频 ID 列表拆分为更小的列表(我必须这样做),否则 API 可能会拒绝该请求。正如 [stvar 在评论中指出的] ID 列表的最大长度为 50,因此这是您的列表可以达到的最大长度。(完全披露:我使用 Python 发送请求)

  1. 最后,只需提取持续时间值并将它们相加(尽管这可能不像听起来那么容易)

最好的部分是我不相信这实际上违反了任何 ToS。

于 2020-11-09T05:21:41.863 回答
0

头脑风暴,从未尝试过:您是否尝试过使用 API 而是解析https://www.youtube.com/feed/history URL?

理论上,可以模拟用户浏览,包括分页。我不知道有多么困难(可能非常困难),因为您需要处理身份验证,而 YouTube 可能会尝试验证是否有人在浏览。

于 2015-07-22T23:00:56.650 回答