Ich bin gerade dabei, eine Chrome-Erweiterung zu erstellen. Damit das Ganze so funktioniert, wie ich es gerne hätte, benötige ich ein externes JavaScript-Skript, um erkennen zu können, ob ein Benutzer meine Erweiterung installiert hat.
Beispiel: Ein Benutzer installiert mein Plugin und wechselt dann zu einer Website mit meinem Skript. Die Website erkennt, dass meine Erweiterung installiert ist, und aktualisiert die Seite entsprechend.
Ist das möglich?
javascript
google-chrome
google-chrome-extension
Yehuda Katz
quelle
quelle
Antworten:
Ich bin mir sicher, dass es einen direkten Weg gibt (Funktionen direkt auf Ihrer Erweiterung aufrufen oder die JS-Klassen für Erweiterungen verwenden), aber eine indirekte Methode (bis etwas Besseres eintritt):
Lassen Sie Ihre Chrome-Erweiterung nach einem bestimmten DIV oder einem anderen Element auf Ihrer Seite mit einer ganz bestimmten ID suchen.
Beispielsweise:
Tun Sie a
getElementById
und stellen Sie dieinnerHTML
auf die Versionsnummer Ihrer Erweiterung oder etwas ein. Sie können dann den Inhalt dieser Clientseite lesen.Auch hier sollten Sie eine direkte Methode verwenden, falls eine verfügbar ist.
EDIT: Direkte Methode gefunden !!
Verwenden Sie die hier aufgeführten Verbindungsmethoden: https://developer.chrome.com/extensions/extension#global-events
Ungetestet, aber Sie sollten in der Lage sein ...
quelle
sendRequest()
,onRequest
,connect()
,onRequest
, undgetURL()
.connect
Funktion in denchrome.runtime
Namespace verschoben wurde . Siehe BJury Antwort (und Kommentare) für eine aktuellere VersionChrome kann jetzt Nachrichten von der Website an die Erweiterung senden.
Fügen Sie in der Erweiterung background.js (content.js funktioniert nicht) Folgendes hinzu:
Auf diese Weise können Sie von der Website aus einen Anruf tätigen:
Sie können dann die Variable hasExtension überprüfen. Der einzige Nachteil ist, dass der Aufruf asynchron ist, also müssen Sie das irgendwie umgehen.
Bearbeiten: Wie unten erwähnt, müssen Sie der Datei manifest.json einen Eintrag hinzufügen, in dem die Domänen aufgeführt sind, die Ihrem Addon eine Nachricht senden können. Z.B:
quelle
Eine andere Methode besteht darin , eine über das Internet zugängliche Ressource verfügbar zu machen. Auf diese Weise kann jede Website testen, ob Ihre Erweiterung installiert ist.
Angenommen, die ID Ihrer Erweiterung lautet
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
und Sie fügen eine Datei (z. B. ein transparentes Pixelbild) wietest.png
in den Dateien Ihrer Erweiterung hinzu.Anschließend machen Sie diese Datei mit dem
web_accessible_resources
Manifestschlüssel für die Webseiten verfügbar :Auf Ihrer Webseite können Sie versuchen, diese Datei über ihre vollständige URL zu laden (in einem
<img>
Tag, über XHR oder auf andere Weise):Wenn die Datei geladen wird, wird die Erweiterung installiert. Wenn beim Laden dieser Datei ein Fehler auftritt, wird die Erweiterung nicht installiert.
Hinweis: Wenn beim Laden dieser Datei ein Fehler auftritt , wird der Netzwerkstapelfehler in der Konsole angezeigt, ohne dass eine Stummschaltung möglich ist. Als Chromecast diese Methode verwendete, sorgte dies aus diesem Grund für einige Kontroversen . mit der letztendlich sehr hässlichen Lösung, ganz bestimmte Fehler von Dev Tools vom Chrome-Team einfach auf die schwarze Liste zu setzen .
Wichtiger Hinweis: Diese Methode funktioniert nicht in Firefox WebExtensions. Über das Internet zugängliche Ressourcen setzen die Erweiterung von Natur aus Fingerabdrücken aus, da die URL anhand der ID vorhersehbar ist. Firefox hat beschlossen, diese Lücke zu schließen, indem es webfähigen Ressourcen eine instanzspezifische zufällige URL zuweist :
Obwohl die Erweiterung
runtime.getURL()
zum Abrufen dieser Adresse verwendet werden kann, können Sie sie auf Ihrer Website nicht fest codieren.quelle
Ich dachte, ich würde meine Forschung darüber teilen. Ich musste in der Lage sein zu erkennen, ob eine bestimmte Erweiterung installiert wurde, damit einige file: /// Links funktionieren. Ich bin hier auf diesen Artikel gestoßen. Dies erklärte eine Methode zum Abrufen der manifest.json einer Erweiterung.
Ich habe den Code ein wenig angepasst und mir Folgendes ausgedacht:
Damit sollten Sie Ext_Detect (ExtensionName, ExtensionID) verwenden können, um die Installation einer beliebigen Anzahl von Erweiterungen zu erkennen.
quelle
Eine andere mögliche Lösung, wenn Sie die Website besitzen, ist die Inline-Installation .
Ich weiß, dass dies eine alte Frage ist, aber diese Methode wurde in Chrome 15 eingeführt. Daher dachte ich, ich würde sie für alle auflisten, die erst jetzt nach einer Antwort suchen.
quelle
Ich habe die Cookie-Methode verwendet:
In meine Datei manifest.js habe ich ein Inhaltsskript aufgenommen, das nur auf meiner Website ausgeführt wird:
In meiner js / mysite.js habe ich eine Zeile:
und auf meiner index.html-Seite suche ich nach diesem Cookie.
quelle
Sie können die Erweiterung ein Cookie setzen lassen und JavaScript auf Ihren Websites überprüfen lassen, ob dieses Cookie vorhanden ist, und es entsprechend aktualisieren. Diese und wahrscheinlich die meisten anderen hier erwähnten Methoden können natürlich vom Benutzer umgangen werden, es sei denn, Sie versuchen, die Erweiterung benutzerdefinierte Cookies in Abhängigkeit von Zeitstempeln usw. erstellen zu lassen und Ihre Anwendung sie serverseitig analysieren zu lassen, um festzustellen, ob es sich wirklich um einen Benutzer mit dem handelt Erweiterung oder jemand, der vorgibt, es zu haben, indem er seine Cookies ändert.
quelle
In diesem Beitrag von Google Groups wird eine andere Methode gezeigt . Kurz gesagt, Sie können versuchen festzustellen, ob das Erweiterungssymbol erfolgreich geladen wurde. Dies kann hilfreich sein, wenn die Erweiterung, nach der Sie suchen, nicht Ihre eigene ist.
quelle
Die Webseite interagiert mit der Erweiterung über ein Hintergrundskript.
manifest.json:
page.html:
quelle
Ihre Erweiterung könnte mit der Website interagieren (z. B. Variablen ändern) und Ihre Website könnte dies erkennen.
Aber es sollte einen besseren Weg geben, dies zu tun. Ich frage mich, wie Google das in seiner Erweiterungsgalerie macht (bereits installierte Anwendungen sind markiert).
Bearbeiten:
Die Galerie verwendet die Funktion chrome.management.get . Beispiel:
Sie können jedoch nur von Seiten mit den richtigen Berechtigungen auf die Methode zugreifen.
quelle
Uncaught TypeError: Cannot read property 'get' of undefined
Viele der Antworten hier sind bisher nur Chrome oder verursachen eine HTTP-Overhead-Strafe. Die Lösung, die wir verwenden, ist etwas anders:
1. Fügen Sie der Liste der manifestierten content_scripts ein neues Objekt wie folgt hinzu:
Dadurch kann der Code in install_notifier.js auf dieser Site ausgeführt werden (sofern Sie dort noch keine Berechtigungen hatten).
2. Senden Sie eine Nachricht an jede Site im obigen Manifestschlüssel.
Fügen Sie install_notifier.js so etwas hinzu (beachten Sie, dass dies einen Abschluss verwendet, um zu verhindern, dass die Variablen global sind, dies ist jedoch nicht unbedingt erforderlich):
Ihre Nachricht könnte alles sagen, aber es ist nützlich, die Version zu senden, damit Sie wissen, womit Sie es zu tun haben. Dann...
3. Hören Sie auf Ihrer Website auf diese Nachricht.
Fügen Sie dies irgendwo zu Ihrer Website hinzu:
Dies funktioniert in Firefox und Chrome und verursacht keinen HTTP-Overhead oder manipuliert die Seite.
quelle
Wenn Sie die Kontrolle über die Chrome-Erweiterung haben, können Sie versuchen, was ich getan habe:
Und dann:
Es fühlt sich ein wenig hackig an, aber ich konnte die anderen Methoden nicht zum Laufen bringen, und ich mache mir Sorgen, dass Chrome hier seine API ändert. Es ist zweifelhaft, dass diese Methode bald nicht mehr funktioniert.
quelle
Sie können auch eine browserübergreifende Methode verwenden, die ich verwendet habe. Verwendet das Konzept des Hinzufügens eines Div.
in Ihrem Inhaltsskript (wann immer das Skript geladen wird, sollte es dies tun)
Auf Ihrer Website behaupten Sie so etwas wie:
Und entsprechende Nachricht werfen.
quelle
Wenn Sie versuchen, eine Erweiterung von einer Website zu erkennen, hat dieser Beitrag geholfen: https://ide.hey.network/post/5c3b6c7aa7af38479accc0c7
Grundsätzlich besteht die Lösung darin, einfach zu versuchen, eine bestimmte Datei (manifest.json oder ein Bild) aus der Erweiterung abzurufen, indem der Pfad angegeben wird. Folgendes habe ich verwendet. Auf jeden Fall funktioniert:
quelle
Hier ist ein anderer moderner Ansatz:
quelle