如何获取用户的整个YouTube观看记录?

时间:2013-05-15 04:17:01

标签: javascript youtube-api

我正在尝试在我的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):我想澄清一下,我总是打算下载自己的历史记录,只是出于兴趣,看看我花了多少时间观看视频。我仍然无法做到这一点。

5 个答案:

答案 0 :(得分:14)

我刚刚为此任务编写了一个刮刀(在Python 2.7(更新为3.5)和Scrapy中)。 无官方API,它使用登录的会话cookie和html解析。默认情况下转储到SQLite。 https://github.com/zvodd/Youtube-Watch-History-Scraper

如何完成:基本上它打开了网址

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

从Chrome获取有效(已登录)会话Cookie。为名称,视频(网址),频道/用户,描述,长度绘制所有视频条目。然后,它会在页面底部找到带有 data-uix-load-more-href 属性的按钮,其中包含指向下一页的链接,如:< / p>

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

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

因此,在他们更改其Feed /历史记录页面之前,它是可行的并且已完成。 我甚至可以更新它。

答案 1 :(得分:13)

API目前仅检索Watch History的最后两周。有关更多信息,请参阅报告的错误问题:https://code.google.com/p/gdata-issues/issues/detail?id=4642

注意: SO上有一个类似的问题:YouTube API v3 returns truncated watch history

答案 2 :(得分:3)

这似乎是2013年最初报道的一个已知错误。谷歌代码主题解释了完全相同的行为:https://code.google.com/p/gdata-issues/issues/detail?id=4642

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

虽然目前仅靠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。