繁体   English   中英

Google Chrome 同步检查是否通过 API/扩展启用?

[英]Google Chrome Sync check if enabled via API/Extension?

是否可以以编程方式检查 Google Chrome 中是否配置了 Chrome 同步?

我问的原因是我正在编写一个依赖于 Chrome 同步的 Chrome 扩展程序,如果它没有配置,我想检查/通知用户。

在发布这个问题之前,我检查了明显的地方(Chrome 扩展 API、StackExchange 和 Google),但到目前为止我还没有任何运气。

如果有人有想法/解决方案,我将不胜感激。

干杯。

Google 有一个页面可以查看您已同步帐户的状态; 该页面的 URL 是https://www.google.com/settings/chrome/sync 您可以使用谷歌允许扩展的跨域连接来查看帐户是否同步打开该状态页面(如果它甚至没有返回 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.
    }
});

祝你好运。

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

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 ,它会成功吗? 如果成功,那么您可以简单地尝试将一个非常大的对象设置为同步,检查它是否成功,然后将其删除,并根据此确定是否启用了同步。

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

获取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();

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

我为此提出了一个活动功能请求:

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

但是,在实施之前,无从得知。 可以为帐户启用同步,但在特定机器上禁用或仅对扩展程序/应用程序禁用。

Chrome 现在提供chrome.identity.getProfileUserInfo api。 您可以使用此 api 来检查用户是否已登录 chrome。 您需要在 manifest.json 中添加identity权限(尽管它不会要求用户提供任何额外权限,我认为这是因为我们实际上并未使用 oAuth)

这是代码片段:

清单文件

....
"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 扩展程序在权限的 identity.email 的帮助下从 chrome 运行扩展程序,您甚至可以获取已打开同步的用户的电子邮件 ID,以及状态 PS:我修改了代码从下面回答线程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM