Saya sedang dalam proses membangun ekstensi Chrome, dan agar semuanya berfungsi seperti yang saya inginkan, saya memerlukan skrip JavaScript eksternal untuk dapat mendeteksi jika pengguna telah memasang ekstensi saya.
Misalnya: Seorang pengguna menginstal plugin saya, lalu membuka situs web dengan skrip saya di dalamnya. Situs web mendeteksi bahwa ekstensi saya dipasang dan memperbarui halaman yang sesuai.
Apakah ini mungkin?
javascript
google-chrome
google-chrome-extension
Yehuda Katz
sumber
sumber
Jawaban:
Saya yakin ada cara langsung (memanggil fungsi pada ekstensi Anda secara langsung, atau dengan menggunakan kelas JS untuk ekstensi), tetapi metode tidak langsung (sampai sesuatu yang lebih baik datang):
Minta ekstensi Chrome Anda mencari DIV tertentu atau elemen lain di laman Anda, dengan ID yang sangat spesifik.
Sebagai contoh:
Lakukan
getElementById
dan setelinnerHTML
ke nomor versi ekstensi Anda atau sesuatu. Anda kemudian dapat membaca konten dari sisi klien tersebut.Namun sekali lagi, Anda harus menggunakan metode langsung jika ada.
EDIT: Metode langsung ditemukan !!
Gunakan metode koneksi yang ditemukan di sini: https://developer.chrome.com/extensions/extension#global-events
Belum teruji, tetapi Anda harus dapat melakukan ...
sumber
sendRequest()
,onRequest
,connect()
,onRequest
, dangetURL()
.connect
fungsi dipindahkan kechrome.runtime
namespace. Lihat jawaban BJury (dan komentar) untuk versi yang lebih mutakhirChrome sekarang memiliki kemampuan untuk mengirim pesan dari situs web ke ekstensi.
Jadi dalam ekstensi background.js (content.js tidak akan berfungsi) tambahkan sesuatu seperti:
Ini kemudian akan memungkinkan Anda melakukan panggilan dari situs web:
Anda kemudian dapat memeriksa variabel hasExtension. Satu-satunya kelemahan adalah panggilan itu tidak sinkron, jadi Anda harus mengatasinya entah bagaimana.
Edit: Seperti yang disebutkan di bawah ini, Anda harus menambahkan entri ke manifest.json yang mencantumkan domain yang dapat mengirim pesan ke addon Anda. Misalnya:
sumber
Metode lain adalah mengekspos sumber daya yang dapat diakses web , meskipun ini akan memungkinkan situs web apa pun untuk menguji apakah ekstensi Anda dipasang.
Misalkan ID ekstensi Anda adalah
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
, dan Anda menambahkan file (katakanlah, gambar piksel transparan) sepertitest.png
pada file ekstensi Anda.Kemudian, Anda mengekspos file ini ke halaman web dengan
web_accessible_resources
kunci manifes:Di halaman web Anda, Anda dapat mencoba memuat file ini dengan URL lengkapnya (dalam
<img>
tag, melalui XHR, atau dengan cara lain):Jika file dimuat, ekstensi diinstal. Jika ada kesalahan saat memuat file ini, ekstensi belum terpasang.
Catatan: jika ada kesalahan saat memuat file ini, kesalahan tumpukan jaringan tersebut akan muncul di konsol tanpa kemungkinan untuk membungkamnya. Ketika Chromecast menggunakan metode ini, itu menyebabkan sedikit kontroversi karena ini; dengan solusi yang sangat buruk yaitu memasukkan kesalahan yang sangat spesifik dari Dev Tools ke daftar hitam sekaligus oleh tim Chrome.
Catatan penting: metode ini tidak akan berfungsi di Firefox WebExtensions. Sumber daya yang dapat diakses web secara inheren mengekspos ekstensi ke sidik jari, karena URL dapat diprediksi dengan mengetahui ID-nya. Firefox memutuskan untuk menutup lubang itu dengan menetapkan URL acak khusus instance ke sumber daya yang dapat diakses web:
Namun, meskipun ekstensi dapat digunakan
runtime.getURL()
untuk mendapatkan alamat ini, Anda tidak dapat melakukan hard-code di situs Anda.sumber
Saya pikir saya akan membagikan penelitian saya tentang ini. Saya harus dapat mendeteksi apakah ekstensi tertentu dipasang untuk beberapa file: /// tautan untuk bekerja. Saya menemukan artikel ini di sini. Ini menjelaskan metode untuk mendapatkan manifest.json dari sebuah ekstensi.
Saya menyesuaikan kodenya sedikit dan menghasilkan:
Dengan ini, Anda seharusnya dapat menggunakan Ext_Detect (ExtensionName, ExtensionID) untuk mendeteksi pemasangan sejumlah ekstensi.
sumber
Solusi lain yang mungkin jika Anda memiliki situs web adalah menggunakan penginstalan inline .
Saya tahu ini pertanyaan lama tetapi cara ini diperkenalkan di Chrome 15 dan jadi saya pikir saya akan mencantumkannya untuk siapa saja yang sekarang mencari jawaban.
sumber
Saya menggunakan metode cookie:
Di file manifest.js saya, saya menyertakan skrip konten yang hanya berjalan di situs saya:
di js / mysite.js saya, saya memiliki satu baris:
dan di halaman index.html saya mencari cookie itu.
sumber
Anda dapat meminta ekstensi menyetel cookie dan meminta situs web Anda untuk memeriksa JavaScript apakah cookie itu ada dan memperbarui sebagaimana mestinya. Ini dan mungkin sebagian besar metode lain yang disebutkan di sini tentu saja dapat dibuat oleh pengguna, kecuali Anda mencoba dan meminta ekstensi membuat cookie khusus tergantung pada stempel waktu dll, dan meminta aplikasi Anda menganalisisnya di sisi server untuk melihat apakah itu benar-benar pengguna dengan ekstensi atau seseorang yang berpura-pura memilikinya dengan mengubah cookie-nya.
sumber
Ada metode lain yang ditampilkan di posting Google Grup ini . Singkatnya, Anda dapat mencoba mendeteksi apakah ikon ekstensi berhasil dimuat. Ini mungkin berguna jika ekstensi yang Anda periksa bukan milik Anda.
sumber
Halaman web berinteraksi dengan ekstensi melalui skrip latar belakang.
manifest.json:
page.html:
sumber
Ekstensi Anda dapat berinteraksi dengan situs web (mis. Mengubah variabel) dan situs web Anda dapat mendeteksinya.
Tetapi harus ada cara yang lebih baik untuk melakukan ini. Saya bertanya-tanya bagaimana Google melakukannya di galeri ekstensi mereka (aplikasi yang sudah diinstal ditandai).
Edit:
Galeri menggunakan fungsi chrome.management.get . Contoh:
Tetapi Anda hanya dapat mengakses metode dari halaman dengan izin yang tepat.
sumber
Uncaught TypeError: Cannot read property 'get' of undefined
Banyak jawaban di sini sejauh ini hanya untuk Chrome atau dikenakan penalti tambahan HTTP. Solusi yang kami gunakan sedikit berbeda:
1. Tambahkan objek baru ke daftar content_scripts manifes seperti ini:
Ini akan memungkinkan kode di install_notifier.js untuk berjalan di situs itu (jika Anda belum memiliki izin di sana).
2. Kirim pesan ke setiap situs dengan kunci manifes di atas.
Tambahkan sesuatu seperti ini ke install_notifier.js (perhatikan bahwa ini menggunakan closure untuk menjaga variabel agar tidak global, tetapi itu tidak sepenuhnya diperlukan):
Pesan Anda bisa mengatakan apa saja, tetapi berguna untuk mengirimkan versinya sehingga Anda tahu apa yang Anda hadapi. Kemudian...
3. Di situs web Anda, dengarkan pesan itu.
Tambahkan ini ke situs web Anda di suatu tempat:
Ini berfungsi di Firefox dan Chrome, dan tidak menimbulkan overhead HTTP atau memanipulasi halaman.
sumber
Jika Anda memiliki kontrol atas ekstensi Chrome, Anda dapat mencoba apa yang saya lakukan:
Lalu:
Rasanya agak hack, tetapi saya tidak bisa mendapatkan metode lain untuk bekerja, dan saya khawatir Chrome mengubah API-nya di sini. Diragukan metode ini akan berhenti bekerja dalam waktu dekat.
sumber
Anda juga dapat menggunakan metode lintas-browser yang telah saya gunakan. Menggunakan konsep menambahkan div.
dalam skrip konten Anda (setiap kali skrip dimuat, itu harus melakukan ini)
di situs web Anda, Anda menyatakan sesuatu seperti,
Dan lemparkan pesan yang sesuai.
sumber
Jika Anda mencoba mendeteksi ekstensi apa pun dari situs web mana pun, Posting ini membantu: https://ide.hey.network/post/5c3b6c7aa7af38479accc0c7
Pada dasarnya, solusinya adalah dengan mencoba mendapatkan file tertentu (manifest.json atau gambar) dari ekstensi dengan menentukan jalurnya. Inilah yang saya gunakan. Pasti bekerja:
sumber
Berikut adalah pendekatan modern lainnya:
sumber