【问题标题】:Google Chrome Sync check if enabled via API/Extension?Google Chrome 同步检查是否通过 API/扩展启用?
【发布时间】:2012-02-11 20:27:15
【问题描述】:

是否可以通过编程方式检查 Google Chrome 中是否配置了 Chrome Sync?

我问的原因是我正在编写一个依赖于 Chrome Sync 的 Chrome 扩展程序,并且想检查/通知用户是否未配置。

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

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

干杯。

【问题讨论】:

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


    【解决方案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】:

    Google 有一个页面可以查看您同步帐户的状态;该页面的 URL 是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.
        }
    });
    

    祝你好运。

    【讨论】:

    • 如果用户退出了怎么办?
    • 您检查 ajax 响应的状态是否为 200-OK,如果是其他任何事情(例如 302-Redirect)用户已注销并且如果您未登录则无法同步在。
    • chrome 浏览器可以登录,但这并不意味着该用户的 cookie 存在是吗?目前我正在使用使用帐户 A 同步的 chrome 浏览器,并且我使用帐户 B 登录到 google.com。
    • 是的,我错了,对不起,它只适用于所有情况的 95%。那些使用相同帐户登录和登录是完全正常的,因为 Chrome 会在您同步后立即登录。
    • 如果用户的同步账户与他/她登录谷歌的账户不同怎么办
    【解决方案3】:

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

    获取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,我得到了这样的信息:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        这里是sn-p的代码:

        ma​​nifest.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,但专门禁用了同步,但这种情况非常罕见。这是我能找到的最接近的方法。

        【讨论】:

          【解决方案6】:

          我能够与电子邮件 ID 一起获得同步状态是否已打开。 这是代码:

          创建一个包含以下内容的 ma​​nifest.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 以及状态 P.S:我从下面的回答线程修改了代码

          【讨论】:

            猜你喜欢
            • 2016-07-07
            • 1970-01-01
            • 1970-01-01
            • 2012-07-10
            • 2013-07-19
            • 2018-08-29
            • 1970-01-01
            • 1970-01-01
            • 2016-10-07
            相关资源
            最近更新 更多