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

Fsm*_*smv 26 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);
Run Code Online (Sandbox Code Playgroud)

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

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

Zv_*_*oDD 15

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

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

https://www.youtube.com/feed/history'
Run Code Online (Sandbox Code Playgroud)

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

"/browse_ajax?action_continuation=1&continuation=98h32hfoasau0fu928hf2hf908h98hr%253D%253D&target_id=item-section-552363&direct_render=1"
Run Code Online (Sandbox Code Playgroud)

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

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


vol*_*ron 14

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

注意: 此处有一个类似的问题:YouTube API v3会返回截断的观看记录


Ste*_*kus 3

虽然目前仅使用 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))"
    })
Run Code Online (Sandbox Code Playgroud)

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

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

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

最好的部分是我不认为这实际上违反了任何服务条款。