Подтвердить что ты не робот

Проверка синхронизации Google Chrome, если включена через API/расширение?

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

Я спрашиваю, что я кодирую расширение для Chrome, которое зависит от Chrome Sync, и хотел бы проверить/проинформировать пользователя, если он не настроен.

Прежде чем отправлять этот вопрос, я проверил очевидные места (Chrome Extension API, StackExchange и Google), но до сих пор мне не повезло.

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

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

4b9b3361

Ответ 1

У Google есть страница, чтобы просмотреть статус вашей синхронизированной учетной записи; URL этой страницы https://www.google.com/settings/chrome/sync. Что-то, что вы можете сделать, чтобы увидеть, синхронизируется ли учетная запись, открывает эту страницу состояния с использованием междоменных подключений, которые Google разрешает для расширений (если он даже не возвращает статус 200-OK, не синхронизирован), а затем вы используете небольшой JavaScript для извлеките дату последней синхронизации с этой страницы; после этого просто сохраните его с помощью API chrome.storage.sync, а затем через несколько секунд снова проверьте дату "Последняя синхронизация", если он изменился, вы можете быть уверенным на 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.
    }
});

Удачи.

Ответ 2

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

Документы в https://developer.chrome.com/extensions/storage.html утверждают, что:

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

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

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

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

Ответ 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, чтобы проверить, подписан ли пользователь на хром или нет. Вам нужно будет добавить разрешение 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.");
    }
});

Возможно, что пользователь подключен к хроме, но имеет специальную отключенную синхронизацию, но такие случаи будут очень редкими. Это самый близкий метод, который я мог найти.

Ответ 6

Я смог получить статус синхронизации включен или нет вместе с идентификаторами электронной почты. Вот код:

создайте файл 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 в разрешениях вы сможете получить даже адрес электронной почты пользователя, который включил синхронизацию, а также статус П.С.: Я модифицировал код снизу отвеченной темы