Javascript Google Chrome同步检查是否通过API/扩展启用?
是否可以通过编程检查Google Chrome中是否配置了Chrome Sync 我询问的原因是,我正在为依赖Chrome Sync的Chrome编写扩展,如果没有配置,我想检查/通知用户 在发布这个问题之前,我检查了一些明显的地方(Chrome扩展API、StackExchange和Google),但到目前为止我还没有任何运气 如果有人有想法/解决方案,我将非常感谢您的帮助Javascript Google Chrome同步检查是否通过API/扩展启用?,javascript,api,google-chrome,google-chrome-extension,synchronization,Javascript,Api,Google Chrome,Google Chrome Extension,Synchronization,是否可以通过编程检查Google Chrome中是否配置了Chrome Sync 我询问的原因是,我正在为依赖Chrome Sync的Chrome编写扩展,如果没有配置,我想检查/通知用户 在发布这个问题之前,我检查了一些明显的地方(Chrome扩展API、StackExchange和Google),但到目前为止我还没有任何运气 如果有人有想法/解决方案,我将非常感谢您的帮助 干杯。我还没有测试过这个,这只是一个想法。和你一样,我也找不到任何文档 位于的文档声明: 即使用户禁用同步,storag
干杯。我还没有测试过这个,这只是一个想法。和你一样,我也找不到任何文档 位于的文档声明: 即使用户禁用同步,storage.sync仍能工作。在这种情况下,它的行为与storage.local相同 但是,
storage.sync
和storage.local
有不同的QUOTA\u字节限制;分别为102400和5242880。根据文件
导致超出此限制的更新会立即失败,并设置runtime.lastError
那么,如果您尝试将一个对象(比如说)设置为200000字节到storage.sync
,会发生什么呢?如果启用同步,它应该会失败-但是如果禁用同步,因此storage.sync
的行为类似于storage.local
,它会成功吗?如果成功了,那么你可以简单地尝试将一个非常大的对象设置为同步,检查它是否成功,然后删除它,并基于此确定是否启用了同步;该页面的URL为。您可以做一些事情来查看帐户是否同步,即使用Google允许扩展的跨域连接打开状态页面(如果它甚至没有返回200-OK status is not Synched),然后使用一点JavaScript从该页面提取“上次同步”日期;之后,只需使用chrome.storage.sync
API保存它,然后几秒钟后再次检查“上次同步”日期,如果它更改了,那么您可以99%确定已同步(或者如果您想涵盖同步速度慢的情况,只需使用setInterval
等待它)
您可以使用以下JavaScript提取日期:
NodeList.prototype.forEach = Array.prototype.forEach;
var date = null;
document.querySelectorAll("*").forEach(function(ele){
var matches = ele.innerText.match(/\b\d{4}\s\d{2}:\d{2}:\d{2}\b.*/);
if (matches) date = matches[0];
});
第一次保存该值时
chrome.storage.sync.set({date: date});
第二次,您应该比较两个值,添加如下内容:
chrome.storage.sync.get("date", function (old) {
if (date !== old) {
// Is sync!
} else {
// not sync.
}
});
祝你好运。查找服务是否同步的替代方法:
获取https://www.google.com/settings/chrome/sync?hl=en
将语言设置为en
,然后:
var is_sync = 0;
NodeList.prototype.forEach = Array.prototype.forEach;
document.querySelectorAll(".Tda.CP").forEach(function(ele){
if(ele.innerHTML == 'Omnibox History')
is_sync = parseInt(ele.parentElement.querySelector('.FP.Uda').innerHTML);
});
请注意,您可能需要验证上次同步日期,即.zU.EP
span,我得到如下信息:
chrome.storage.sync.get("date", function (old) {
if (date !== old) {
// Is sync!
} else {
// not sync.
}
});
上次同步时间为2014年11月12日星期三下午1:03:29 UTC+1
这是我编写的将其转换为时间的函数:
last_sync = new Date(document.querySelector('.zU.EP').innerHTML.replace('Last time synced on ','').match(/.*\sat/)[0].replace(' at','')).getTime();
也许不是最好的,但很有效,并给出了一个想法。我为此提出了一个活动功能请求:
然而,在这项措施实施之前,没有办法确定。可以为帐户启用同步,但在特定计算机上禁用同步,或仅为扩展/应用程序禁用同步。Chrome现在提供api。您可以使用此api检查用户是否已登录到chrome。您需要在manifest.json中添加identity
权限(尽管它不会要求用户获得任何额外权限,我认为这是因为我们实际上没有使用oAuth)
下面是代码片段:
manifest.json
....
"permissions": [
"identity"
]
....
背景页面
chrome.identity.getProfileUserInfo(function(data) {
if (data.id) {
alert("User is signed in to chrome!");
}
else
{
alert("User is not signed in to chrome.");
}
});
用户可能已经登录到chrome,但专门禁用了同步功能,但这种情况非常罕见。这是我能找到的最接近的方法。我能够获得同步状态是否打开以及电子邮件ID。
代码如下:
创建一个包含以下内容的manifest.json文件
{
"name": "Test turn on sync",
"version": "1.0",
"description": "Extension",
"permissions":[
"identity",
"identity.email"
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"manifest_version": 2
}
在同一文件夹中创建background.js文件
chrome.identity.getProfileUserInfo(function(data) {
if (data.id) {
alert(data);
}
else
{
alert("User is not signed in to chrome.");
}
}))
将文件夹添加为chrome扩展名
从chrome运行扩展
在权限中的identity.email帮助下,您甚至可以获取启用同步的用户的电子邮件id以及状态
附言:我修改了下面的代码。好主意……但它不起作用。大小限制保持不变(呃,我喜欢这个=)它不起作用,但它非常聪明!如果用户注销了该怎么办?您检查ajax响应的状态是否为200-OK,如果用户注销了任何其他东西(例如302重定向),并且如果您未登录,您将无法同步。chrome浏览器可以登录,但这并不意味着该用户的Cookie存在,是吗?目前我正在使用我的chrome浏览器,使用帐户A同步,我使用帐户B登录google.com。是的,我错了,对不起,它只适用于95%的情况。那些完全正常的用户可以登录并使用相同的帐户登录,因为Chrome会在您同步后立即登录。如果用户的同步帐户与他/她登录google时使用的帐户不同,该怎么办