谷歌浏览器同步检查是否通过API /扩展启用?

时间:2012-01-16 07:45:27

标签: javascript api google-chrome google-chrome-extension sync

是否可以通过编程方式检查Chrome浏览器是否已在Google Chrome中配置?

我问的原因是我正在为依赖Chrome同步的Chrome扩展程序编码,并希望检查/通知用户是否未配置。

在发布此问题之前,我检查了显而易见的地方(Chrome Extension API,StackExchange和Google),但到目前为止我还没有运气。

如果有人有想法/解决方案,我会很感激帮助。

干杯。

6 个答案:

答案 0 :(得分:5)

Google有一个页面可以查看已同步帐户的状态;该网页的网址为https://www.google.com/settings/chrome/sync。你可以做些什么来查看帐户是否已同步使用Google允许扩展的跨域连接打开该状态页面(如果它甚至没有返回200-OK状态未同步)然后你使用一点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.
    }
});
祝你好运。

答案 1 :(得分:1)

我没有测试过这个,这只是一个想法。和你一样,我找不到任何文件。

https://developer.chrome.com/extensions/storage.html的文档指出:

  

即使用户禁用同步,storage.sync仍然可以正常工作。在这种情况下,它的行为与storage.local相同。

但是,storage.syncstorage.local具有不同的QUOTA_BYTES限制;分别为102,400和5,242,880。根据文件;

  

将导致超出此限制的更新立即失败并设置runtime.lastError。

那么,如果您尝试将一个200,000字节的对象设置为storage.sync会发生什么?如果启用了同步,它应该会失败 - 但是如果禁用同步,因此storage.sync的行为类似于storage.local,它会成功吗?如果确实成功了,那么您可以简单地尝试将一个非常大的对象设置为同步,检查它是否成功,然后将其删除,并确定是否基于此启用了同步。

答案 2 :(得分:0)

查找服务是否同步的替代方法:

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范围,我的内容如下:

Last time synced on Wednesday, November 12, 2014 at 1:03:29 PM UTC+1

这是我写的把它转换成时间的函数:

last_sync = new Date(document.querySelector('.zU.EP').innerHTML.replace('Last time synced on ','').match(/.*\sat/)[0].replace(' at','')).getTime();

也许不是最好的,但有效,并给出一个想法。

答案 3 :(得分:0)

我为此做了一个有效的功能请求:

https://code.google.com/p/chromium/issues/detail?id=361109

然而,在实施之前,没有办法说出来。可以为帐户启用同步,但在特定计算机上禁用,或仅为扩展程序/应用程序禁用。

答案 4 :(得分:0)

Chrome现在提供chrome.identity.getProfileUserInfo 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但已明确禁用同步,但此类情况非常罕见。这是我能找到的最接近的方法。

答案 5 :(得分:0)

我能够获得同步状态是否已打开或与电子邮件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以及状态 附言:我从回答的线程下面修改了代码