Estoy en el proceso de crear una extensión de Chrome, y para que todo funcione como me gustaría, necesito un script JavaScript externo para poder detectar si un usuario tiene instalada mi extensión.
Por ejemplo: un usuario instala mi complemento y luego va a un sitio web con mi secuencia de comandos. El sitio web detecta que mi extensión está instalada y actualiza la página en consecuencia.
es posible?
javascript
google-chrome
google-chrome-extension
Yehuda Katz
fuente
fuente
Respuestas:
Estoy seguro de que hay una forma directa (llamar a funciones en su extensión directamente, o usando las clases JS para extensiones), pero un método indirecto (hasta que aparezca algo mejor):
Haga que su extensión de Chrome busque un DIV específico u otro elemento en su página, con una ID muy específica.
Por ejemplo:
Haga una
getElementById
y configure elinnerHTML
número de versión de su extensión o algo así. Luego puede leer el contenido de ese lado del cliente.Sin embargo, nuevamente, debe usar un método directo si hay uno disponible.
EDITAR: ¡Método directo encontrado!
Utilice los métodos de conexión que se encuentran aquí: https://developer.chrome.com/extensions/extension#global-events
No probado, pero debería poder hacer ...
fuente
sendRequest()
,onRequest
,connect()
,onRequest
, ygetURL()
.connect
función se movió alchrome.runtime
espacio de nombres. Vea la respuesta (y comentarios) de BJury para una versión más actualizadaChrome ahora tiene la capacidad de enviar mensajes desde el sitio web a la extensión.
Entonces, en la extensión background.js (content.js no funcionará) agregue algo como:
Esto le permitirá realizar una llamada desde el sitio web:
Luego puede verificar la variable hasExtension. El único inconveniente es que la llamada es asincrónica, por lo que debe solucionarlo de alguna manera.
Editar: como se menciona a continuación, deberá agregar una entrada al manifest.json que enumere los dominios que pueden enviar mensajes a su complemento. P.ej:
fuente
Otro método es exponer un recurso accesible desde la web , aunque esto permitirá que cualquier sitio web pruebe si su extensión está instalada.
Suponga que el ID de su extensión es
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
, y agrega un archivo (digamos, una imagen de píxel transparente) comotest.png
en los archivos de su extensión.Luego, expone este archivo a las páginas web con la
web_accessible_resources
clave de manifiesto:En su página web, puede intentar cargar este archivo por su URL completa (en una
<img>
etiqueta, a través de XHR o de cualquier otra forma):Si el archivo se carga, entonces se instala la extensión. Si hay un error al cargar este archivo, la extensión no está instalada.
Nota: si hay un error al cargar este archivo, dicho error de pila de red aparecerá en la consola sin posibilidad de silenciarlo. Cuando Chromecast usó este método, causó bastante controversia debido a esto; con la eventual solución muy fea de simplemente incluir en la lista negra errores muy específicos de Dev Tools por el equipo de Chrome.
Nota importante: este método no funcionará en Firefox WebExtensions. Los recursos accesibles a través de la web exponen de forma inherente la extensión a la toma de huellas digitales, ya que la URL es predecible al conocer la ID. Firefox decidió cerrar ese agujero asignando una URL aleatoria específica de la instancia a los recursos accesibles en la web:
Sin embargo, si bien la extensión puede usarse
runtime.getURL()
para obtener esta dirección, no puede codificarla en su sitio web.fuente
Pensé en compartir mi investigación sobre esto. Necesitaba poder detectar si se instaló una extensión específica para que funcionaran algunos enlaces file: ///. Encontré este artículo aquí. Esto explica un método para obtener el archivo manifest.json de una extensión.
Ajusté un poco el código y se me ocurrió:
Con esto, debería poder usar Ext_Detect (ExtensionName, ExtensionID) para detectar la instalación de cualquier número de extensiones.
fuente
Otra posible solución si es propietario del sitio web es utilizar la instalación en línea .
Sé que esta es una pregunta antigua, pero de esta manera se introdujo en Chrome 15, por lo que pensé en enumerarla para cualquiera que esté buscando una respuesta.
fuente
Usé el método de las cookies:
En mi archivo manifest.js incluí un script de contenido que solo se ejecuta en mi sitio:
en mi js / mysite.js tengo una línea:
y en mi página index.html busco esa cookie.
fuente
Puede hacer que la extensión establezca una cookie y que el JavaScript de su sitio web compruebe si esa cookie está presente y se actualiza en consecuencia. Este y probablemente la mayoría de los otros métodos mencionados aquí, por supuesto, podrían ser evitados por el usuario, a menos que intente que la extensión cree cookies personalizadas según las marcas de tiempo, etc., y haga que su aplicación las analice del lado del servidor para ver si realmente es un usuario con el extensión o alguien que pretende tenerlo modificando sus cookies.
fuente
Hay otro método que se muestra en esta publicación de Grupos de Google . En resumen, puede intentar detectar si el icono de la extensión se carga correctamente. Esto puede resultar útil si la extensión que está buscando no es la suya.
fuente
La página web interactúa con la extensión a través de un script en segundo plano.
manifest.json:
page.html:
fuente
Su extensión podría interactuar con el sitio web (por ejemplo, cambiando variables) y su sitio web podría detectar esto.
Pero debería haber una mejor manera de hacer esto. Me pregunto cómo lo está haciendo Google en su galería de extensiones (las aplicaciones ya instaladas están marcadas).
Editar:
La galería usa la función chrome.management.get . Ejemplo:
Pero solo puede acceder al método desde páginas con los permisos adecuados.
fuente
Uncaught TypeError: Cannot read property 'get' of undefined
Muchas de las respuestas aquí hasta ahora son solo para Chrome o incurren en una penalización por sobrecarga HTTP. La solución que estamos usando es un poco diferente:
1. Agregue un nuevo objeto a la lista content_scripts del manifiesto de la siguiente manera:
Esto permitirá que el código en install_notifier.js se ejecute en ese sitio (si aún no tenía permisos allí).
2. Envíe un mensaje a todos los sitios en la clave de manifiesto anterior.
Agregue algo como esto a install_notifier.js (tenga en cuenta que esto está usando un cierre para evitar que las variables sean globales, pero eso no es estrictamente necesario):
Su mensaje podría decir cualquier cosa, pero es útil enviar la versión para que sepa a qué se enfrenta. Luego...
3. En su sitio web, escuche ese mensaje.
Agregue esto a su sitio web en algún lugar:
Esto funciona en Firefox y Chrome, y no genera una sobrecarga HTTP ni manipula la página.
fuente
Si tienes control sobre la extensión de Chrome, puedes probar lo que hice:
Y entonces:
Se siente un poco hack, pero no pude hacer que los otros métodos funcionen, y me preocupa que Chrome cambie su API aquí. Es dudoso que este método deje de funcionar pronto.
fuente
También puede usar un método de navegador cruzado que yo he usado. Utiliza el concepto de agregar un div.
en su secuencia de comandos de contenido (siempre que se cargue la secuencia de comandos, debería hacer esto)
en su sitio web afirma algo como,
Y lanza el mensaje apropiado.
fuente
Si está intentando detectar cualquier extensión de cualquier sitio web, esta publicación ayudó: https://ide.hey.network/post/5c3b6c7aa7af38479accc0c7
Básicamente, la solución sería simplemente intentar obtener un archivo específico (manifest.json o una imagen) de la extensión especificando su ruta. Esto es lo que usé. Definitivamente funcionando:
fuente
Aquí hay otro enfoque moderno:
fuente