Проверка синхронизации Google Chrome, если включена через API/расширение?
Можно ли программно проверить, настроен ли Chrome Chrome в Google Chrome?
Я спрашиваю, что я кодирую расширение для Chrome, которое зависит от Chrome Sync, и хотел бы проверить/проинформировать пользователя, если он не настроен.
Прежде чем отправлять этот вопрос, я проверил очевидные места (Chrome Extension API, StackExchange и Google), но до сих пор мне не повезло.
Если у кого-то есть идея/решение, я был бы признателен за помощь.
Приветствия.
Ответы
Ответ 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 в разрешениях вы сможете получить даже адрес электронной почты пользователя, который включил синхронизацию, а также статус
П.С.: Я модифицировал код снизу отвеченной темы