Estou no processo de construção de uma extensão do Chrome e, para que tudo funcione da maneira que eu gostaria, preciso de um script JavaScript externo para detectar se um usuário tem minha extensão instalada.
Por exemplo: um usuário instala meu plug-in e, em seguida, vai para um site com meu script nele. O site detecta que minha extensão está instalada e atualiza a página de acordo.
Isso é possível?
javascript
google-chrome
google-chrome-extension
Yehuda Katz
fonte
fonte
Respostas:
Tenho certeza de que existe uma maneira direta (chamando funções em sua extensão diretamente ou usando as classes JS para extensões), mas um método indireto (até que algo melhor apareça):
Faça com que sua extensão do Chrome procure um DIV específico ou outro elemento em sua página, com um ID muito específico.
Por exemplo:
Faça um
getElementById
e defina oinnerHTML
para o número da versão de sua extensão ou algo assim. Você pode então ler o conteúdo desse lado do cliente.Porém, novamente, você deve usar um método direto, se houver um disponível.
EDIT: Método direto encontrado !!
Use os métodos de conexão encontrados aqui: https://developer.chrome.com/extensions/extension#global-events
Não testado, mas você deve ser capaz de fazer ...
fonte
sendRequest()
,onRequest
,connect()
,onRequest
, egetURL()
.connect
função foi movida para ochrome.runtime
namespace. Veja a resposta (e comentários) de BJury para uma versão mais atualizadaO Chrome agora tem a capacidade de enviar mensagens do site para a extensão.
Portanto, na extensão background.js (content.js não funcionará), adicione algo como:
Isso permitirá que você faça uma chamada do site:
Você pode então verificar a variável hasExtension. A única desvantagem é que a chamada é assíncrona, então você precisa contornar isso de alguma forma.
Editar: conforme mencionado abaixo, você precisará adicionar uma entrada ao manifest.json listando os domínios que podem enviar mensagens ao seu addon. Por exemplo:
fonte
Outro método é expor um recurso acessível pela web , embora isso permita que qualquer site teste se sua extensão está instalada.
Suponha que o ID da sua extensão seja
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
, e você adicione um arquivo (digamos, uma imagem de pixel transparente) comotest.png
nos arquivos da sua extensão.Em seguida, você expõe esse arquivo às páginas da web com a
web_accessible_resources
chave de manifesto:Em sua página da web, você pode tentar carregar este arquivo pelo URL completo (em uma
<img>
tag, via XHR ou de qualquer outra forma):Se o arquivo carregar, a extensão está instalada. Se houver um erro ao carregar este arquivo, a extensão não está instalada.
Nota: se houver um erro ao carregar este arquivo, o referido erro de pilha de rede aparecerá no console sem possibilidade de silenciá-lo. Quando o Chromecast usou esse método, causou um pouco de controvérsia por causa disso; com a eventual solução muito desagradável de simplesmente colocar na lista negra erros muito específicos das Ferramentas de Desenvolvimento pela equipe do Chrome.
Observação importante: este método não funcionará no Firefox WebExtensions. Os recursos acessíveis pela Web expõem de maneira inerente a extensão à impressão digital, uma vez que o URL é previsível ao conhecer o ID. O Firefox decidiu fechar essa lacuna atribuindo um URL aleatório específico da instância para recursos acessíveis na web:
No entanto, embora a extensão possa ser usada
runtime.getURL()
para obter esse endereço, você não pode codificá-lo no seu site.fonte
Pensei em compartilhar minha pesquisa sobre isso. Eu precisava ser capaz de detectar se uma extensão específica foi instalada para alguns links file: /// funcionarem. Encontrei este artigo aqui. Isso explica um método para obter o manifest.json de uma extensão.
Ajustei um pouco o código e cheguei a:
Com isso, você deve ser capaz de usar Ext_Detect (ExtensionName, ExtensionID) para detectar a instalação de qualquer número de extensões.
fonte
Outra solução possível, se você for o proprietário do site, é usar a instalação embutida .
Eu sei que esta é uma pergunta antiga, mas essa forma foi introduzida no Chrome 15 e então pensei em listá-la para qualquer um que esteja procurando uma resposta.
fonte
Usei o método do cookie:
No meu arquivo manifest.js, incluí um script de conteúdo que só é executado no meu site:
em meu js / mysite.js, tenho uma linha:
e na minha página index.html procuro esse cookie.
fonte
Você pode fazer com que a extensão defina um cookie e o JavaScript do seu site verifique se esse cookie está presente e se atualize de acordo. Este e provavelmente a maioria dos outros métodos mencionados aqui podem, claro, ser contornados pelo usuário, a menos que você tente e faça com que a extensão crie cookies personalizados dependendo dos carimbos de data / hora, etc., e faça seu aplicativo analisá-los do lado do servidor para ver se é realmente um usuário com o extensão ou alguém fingindo ter, modificando seus cookies.
fonte
Há outro método mostrado nesta postagem do Grupos do Google . Resumindo, você pode tentar detectar se o ícone da extensão carrega com sucesso. Isso pode ser útil se a extensão que você está verificando não for a sua.
fonte
A página da Web interage com a extensão por meio do script de plano de fundo.
manifest.json:
page.html:
fonte
Sua extensão pode interagir com o site (por exemplo, alterar variáveis) e seu site pode detectar isso.
Mas deve haver uma maneira melhor de fazer isso. Eu me pergunto como o Google está fazendo isso em sua galeria de extensões (os aplicativos já instalados estão marcados).
Editar:
A galeria usa a função chrome.management.get . Exemplo:
Mas você só pode acessar o método em páginas com as permissões corretas.
fonte
Uncaught TypeError: Cannot read property 'get' of undefined
Muitas das respostas aqui até agora são apenas Chrome ou incorrem em uma penalidade de sobrecarga de HTTP. A solução que estamos usando é um pouco diferente:
1. Adicione um novo objeto à lista content_scripts do manifesto da seguinte forma:
Isso permitirá que o código em install_notifier.js seja executado nesse site (se você ainda não tiver permissões lá).
2. Envie uma mensagem para cada site na chave de manifesto acima.
Adicione algo assim a install_notifier.js (observe que isso está usando um encerramento para evitar que as variáveis sejam globais, mas isso não é estritamente necessário):
Sua mensagem pode dizer qualquer coisa, mas é útil enviar a versão para que você saiba com o que está lidando. Então...
3. Em seu site, ouça essa mensagem.
Adicione isso ao seu site em algum lugar:
Isso funciona no Firefox e no Chrome e não incorre em sobrecarga de HTTP ou manipula a página.
fonte
Se você tem controle sobre a extensão do Chrome, pode tentar o que eu fiz:
E depois:
Parece um pouco maluco, mas não consegui fazer os outros métodos funcionarem e me preocupo com o Chrome mudando sua API aqui. É duvidoso que esse método pare de funcionar tão cedo.
fonte
Você também pode usar um método de navegador cruzado que eu usei. Usa o conceito de adicionar um div.
em seu script de conteúdo (sempre que o script carrega, ele deve fazer isso)
em seu site, você afirma algo como,
E lance a mensagem apropriada.
fonte
Se você está tentando detectar qualquer extensão de qualquer site, esta postagem ajudou: https://ide.hey.network/post/5c3b6c7aa7af38479accc0c7
Basicamente, a solução seria simplesmente tentar obter um arquivo específico (manifest.json ou uma imagem) da extensão especificando seu caminho. Aqui está o que usei. Definitivamente funcionando:
fonte
Aqui está uma outra abordagem moderna:
fonte