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

Posted

技术标签:

【中文标题】Google Chrome 同步检查是不是通过 API/扩展启用?【英文标题】: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),但到目前为止我还没有运气。

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

干杯。

【问题讨论】:

【参考方案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\d4\s\d2:\d2:\d2\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:我从下面的回答线程修改了代码

【讨论】:

以上是关于Google Chrome 同步检查是不是通过 API/扩展启用?的主要内容,如果未能解决你的问题,请参考以下文章

Google Chrome 开发工具检查未显示的元素样式

如何检查 Chrome 扩展程序是不是已完全安装

chrome浏览器书签为啥不能同步

如何在Ubuntu 20.04上安装Google Chrome浏览器

检查 Google 是不是已完成显示结果

找出 Profobuf 消息的类型(Google Chrome 同步)