在 google 站点本身上使用 Google API(例如在 youtube.com 上)

Using Google API on google sites themselves (like on youtube.com for example)

我想做什么? 我正在尝试创建一个小的 javascript 片段,它将 运行 在我的浏览器中的 youtube 订阅页面 (https://www.youtube.com/feed/subscriptions) 上,并允许将我没有看过的视频批量添加到我的 "Watch Later" 播放列表,这样我以后就可以在我的智能电视上 and/or 成块地观看它们。

我要怎么做? 我正在尝试使用 Google Youtube Data API 并通过调用 "insert" 方法修改 "Watch Later" 播放列表。

我遇到了什么问题? 为了完成上面的所有事情,其中​​一件事是将 google api 脚本加载到页面上。这就是我看到的问题。当我在单独托管的 HTML 页面(或仅在 jsfiddle 沙箱中)加载该脚本 (https://apis.google.com/js/api.js) 时,一切正常:

<script>
    function handleClientLoad() {
        // Load the API client and auth2 library
        gapi.load('client:auth2', initClient);
    }
    function initClient() {
        // do nothing for now
    }
</script>
<script async defer src="https://apis.google.com/js/api.js" onload="handleClientLoad()"></script>

但是,当我尝试使用 tampermonkey 在我的用户脚本中执行相同的操作时,出现了错误。

function loadScript(url, callback)
{
    console.log('load script: ' + url);
    // Adding the script tag to the body
    var body = document.getElementsByTagName('body')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    script.async = true;
    script.defer = true;

    // Then bind the event to the callback function.
    script.onreadystatechange = function() {
        console.log('in readyStateChange. readyState: ' + this.readyState);
        callback();
    };

    script.onload = function() {
        console.log('in onload');
        this.onload = function() {};
        callback();
    };

    // Fire the loading
    body.appendChild(script);
}

function initGAPI() {
    console.log('initGAPI');
    gapi.load('client:auth2', initClient);
}

function initClient() {
    // do nothing for now
}

loadScript('https://apis.google.com/js/api.js', initGAPI);

当我导航到 https://www.youtube.com/feed/subscriptions 时,我可以看到我的用户脚本已成功触发,但是当涉及到 gapi.load() 方法时,我收到此错误:

未捕获类型错误:gapi.loaded_0 不是函数 在 cb=gapi.loaded_0:1

在加载我自己的 gapi 实例之前,我试图检查 youtube 页面上可用的内容,并意识到那里已经存在 gapi 对象,并且它只有一种方法:加载().当我尝试在该现有对象上调用该方法时(不尝试加载我自己的 gapi 脚本实例)它:

gapi.load('client:auth2', function() {console.log('gapi loaded');})

我收到以下错误:

GET https://apis.google.com/_/scs/abc-static/_/js/k=gapi.gapi.en.HtLvrA_npCQ.O/m=client/exm=oauth2/rt=j/sv=1/d=1/ed=1/am=AAE/rs=AHpOoo8wHQU_A1WtgGgcOpQEfGjHuD8e-g/cb=gapi.loaded_1 net::ERR_ABORTED desktop_polymer.js 中的某处(第 2661 行)

我看到有不同的回调参与(gapi.loaded_0 和 gapi.loaded_0)。但是我什么也做不了。

我开始认为我不能在 google 自己的网站上使用 Google API(就像我的 youtube)。这是正确的假设吗?

也许已经有解决方案可以实现我的目标(将未观看的视频批量添加到 "Watch Later" 播放列表中)- 不胜感激:)

原来是我的懒眼。我错过了我加载 https://apis.google.com/js/api.js 两次的事实。一次通过@require 外部依赖 - tampermonkey 脚本的功能,另一次 - 通过按照我开始使用 Google API.

的说明将相同的脚本动态添加到页面

仅通过@require 加载并不能真正起作用,因为它不会触发正确实例化所有内容所必需的回调。所以我不得不删除那个指令,只依赖于动态地向页面添加脚本。在我这样做之后 - 一切都开始工作了。因此,总而言之,我发布的有问题的代码实际上是有效的,问题仅在于我如何将它用于 tampermonkey 用户脚本:)