在Google网站上自行使用Google API(例如在youtube.com上)

问题描述 投票:0回答:1

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

我该怎么做?我正在尝试使用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()方法时,我收到此错误:

未捕获的TypeError:gapi.loaded_0不是cb = gapi.loaded_0:1的函数

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

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

我得到错误:

在desktop_polymer.js的某处获取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(第2661行)

我看到有不同的回调参与(gapi.loaded_0和gapi.loaded_0)。但是,我无法做任何事情。

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

也许现有的解决方案实现了我的目标(将未观看的视频批量添加到“稍后观看”播放列表中) - 会感激任何指针:)

javascript google-api youtube-api google-apps youtube-data-api
1个回答
-1
投票

原来这只是我懒惰的眼睛。我错过了我加载https://apis.google.com/js/api.js两次的事实。一次通过@require外部依赖 - tampermonkey脚本的功能,另一次 - 通过动态地将相同的脚本添加到页面,按照我开始使用Google API进行操作的说明。

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

© www.soinside.com 2019 - 2024. All rights reserved.