Проверка Google Chrome Sync включена ли через API / расширение? - PullRequest
20 голосов
/ 16 января 2012

Можно ли программно проверить, настроена ли в Google Chrome синхронизация Chrome?

Причина, по которой я спрашиваю, состоит в том, что я кодирую расширение для Chrome, которое зависит от синхронизации Chrome, и хочу проверить / сообщитьпользователь, если он не настроен.

Перед публикацией этого вопроса я проверил очевидные места (API расширений Chrome, StackExchange и Google), но пока мне не повезло.

Если у кого-то есть идея / решение, я буду признателен за помощь.

Приветствия.

Ответы [ 5 ]

5 голосов
/ 12 марта 2013

У 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.
    }
});

Удачи.

1 голос
/ 09 марта 2013

Я не проверял это, это просто идея.Как и вы, я не смог найти никакой документации.

В документах на https://developer.chrome.com/extensions/storage.html указано, что:

Даже если пользователь отключает синхронизацию, хранение.Синхронизация все еще будет работать.В этом случае он будет вести себя идентично storage.local.

Однако storage.sync и storage.local имеют разные ограничения QUOTA_BYTES;102 400 и 5 242 880 соответственно.Согласно документам;

Обновления, которые могут привести к превышению этого предела, немедленно завершаются неудачей и устанавливают runtime.lastError.

Итак, что произойдет, если вы попытаетесь установитьобъект, скажем, 200 000 байтов в storage.sync?Если синхронизация включена, она должна потерпеть неудачу - но если синхронизация отключена и, следовательно, storage.sync ведет себя как storage.local, будет ли она успешной?Если это удастся, вы можете просто попытаться настроить очень большой объект на синхронизацию, проверить, успешно ли он выполнен, затем удалить его и определить, включена ли синхронизация на основе этого.

0 голосов
/ 17 апреля 2015

Chrome теперь предоставляет chrome.identity.getProfileUserInfo api. Вы можете использовать этот API, чтобы проверить, вошел ли пользователь в Chrome или нет. Вам нужно будет добавить разрешение identity в ваш manifest.json (хотя он не будет запрашивать у пользователя никаких дополнительных разрешений, и я думаю, что это потому, что мы на самом деле не используем 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, но специально отключил синхронизацию, но такие случаи будут очень редкими. Это самый близкий метод, который я мог найти.

0 голосов
/ 18 января 2015

Для этого есть активный запрос функции:

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

Однако, пока это не будет реализовано, невозможно сказать. Синхронизация может быть включена для учетной записи, но отключена на определенном компьютере или отключена только для расширений / приложений.

0 голосов
/ 18 января 2015

Альтернативный способ узнать, синхронизируется ли служба:

Получить 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();

Может быть, не самый лучший, но работает и дает представление.

...