在 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 用户脚本:)
我想做什么? 我正在尝试创建一个小的 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 用户脚本:)