ตรวจสอบว่าผู้ใช้ติดตั้งส่วนขยาย Chrome หรือไม่


100

ฉันอยู่ในขั้นตอนการสร้างส่วนขยาย Chrome และเพื่อให้ทุกอย่างทำงานได้ตามที่ฉันต้องการฉันต้องการสคริปต์ JavaScript ภายนอกเพื่อให้สามารถตรวจจับได้ว่าผู้ใช้ติดตั้งส่วนขยายของฉันหรือไม่

ตัวอย่างเช่น: ผู้ใช้ติดตั้งปลั๊กอินของฉันจากนั้นไปที่เว็บไซต์ที่มีสคริปต์ของฉันอยู่ เว็บไซต์ตรวจพบว่าส่วนขยายของฉันได้รับการติดตั้งและอัปเดตหน้าตามนั้น

เป็นไปได้หรือไม่


2
ใช่เป็นไปได้ที่จะตรวจพบส่วนขยายตราบใดที่คุณทราบ ID ส่วนขยายของคุณ (ซึ่งฉันแน่ใจว่าคุณทำ) ตรวจสอบเว็บไซต์นี้เพื่อดูข้อมูลเพิ่มเติม: blog.kotowicz.net/2012/02/intro-to-chrome-addons-hacking.htmlข้ามลงไปที่หัวข้อ 'การค้นหาส่วนเสริมของคุณทีละรายการ' โชคดี!
Martin Hughes

วิธีที่เหมาะสมในการดำเนินการนี้อธิบายไว้โดย BJury bellow
Rahatur

โพสต์นี้ช่วย: ide.hey.network/post/5c3b6c7aa7af38479accc0c7
nab

คำตอบ:


47

ฉันแน่ใจว่ามีวิธีโดยตรง (เรียกใช้ฟังก์ชันในส่วนขยายของคุณโดยตรงหรือโดยใช้คลาส JS สำหรับส่วนขยาย) แต่เป็นวิธีทางอ้อม (จนกว่าจะมีสิ่งที่ดีกว่าเข้ามา):

ให้ส่วนขยาย Chrome ของคุณมองหา DIV ที่เฉพาะเจาะจงหรือองค์ประกอบอื่น ๆ บนหน้าของคุณด้วยรหัสที่เฉพาะเจาะจงมาก

ตัวอย่างเช่น:

<div id="ExtensionCheck_JamesEggersAwesomeExtension"></div>

ทำgetElementByIdและตั้งค่าเป็นinnerHTMLหมายเลขเวอร์ชันของส่วนขยายหรือบางอย่าง จากนั้นคุณสามารถอ่านเนื้อหาของฝั่งไคลเอ็นต์นั้นได้

อีกครั้งคุณควรใช้วิธีการโดยตรงหากมี


EDIT: พบวิธีตรง !!

ใช้วิธีการเชื่อมต่อที่พบที่นี่: https://developer.chrome.com/extensions/extension#global-events

ยังไม่ทดสอบ แต่คุณควรจะทำได้ ...

var myPort=chrome.extension.connect('yourextensionid_qwerqweroijwefoijwef', some_object_to_send_on_connect);

3
อืม chrome.extension.connect ดูเหมือนจะใช้งานได้เฉพาะเมื่อเรียกใช้งานจากภายในส่วนขยาย (หรือส่วนขยายใด ๆ ) ฉันต้องการให้มันทำงานจากสคริปต์ js แบบสุ่มใด ๆ ความคิดใด ๆ ?

แปลกเอกสารบอกว่าควรใช้งานได้ "ซึ่งแตกต่างจากโครเมี่ยมอื่น ๆ . * APIs, ชิ้นส่วนของ chrome.extension สามารถนำมาใช้โดยสคริปต์เนื้อหา" และรายการsendRequest(), onRequest, connect(), และonRequest getURL()
Brad

@ James คุณกำลังเรียกใช้สคริปต์ที่ใช้ .connect () จากสคริปต์ที่โฮสต์หรือไม่? ฉันรู้ว่า Chrome พยายามอย่างยิ่งที่จะไม่ทำอะไรกับไฟล์ในเครื่องที่ไม่ได้โฮสต์เพื่อความปลอดภัย - เพียงแค่ตรวจสอบ
JamesEggers

@ เจมส์สคริปต์ที่ฉันเรียกใช้ .connect () จากอยู่บนเซิร์ฟเวอร์เดียวกันถ้านั่นคือสิ่งที่คุณหมายถึง?

23
วิธีสุดท้ายใช้ไม่ได้อีกต่อไปเนื่องจากconnectฟังก์ชันถูกย้ายไปที่chrome.runtimeเนมสเปซ ดูคำตอบ (และความคิดเห็น) ของ BJury สำหรับเวอร์ชันล่าสุด
Xan

123

ตอนนี้ Chrome มีความสามารถในการส่งข้อความจากเว็บไซต์ไปยังส่วนขยาย

ดังนั้นใน background.js ส่วนขยาย (content.js จะไม่ทำงาน) ให้เพิ่มสิ่งที่ต้องการ:

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) {
        if (request) {
            if (request.message) {
                if (request.message == "version") {
                    sendResponse({version: 1.0});
                }
            }
        }
        return true;
    });

จากนั้นจะให้คุณโทรออกจากเว็บไซต์:

var hasExtension = false;

chrome.runtime.sendMessage(extensionId, { message: "version" },
    function (reply) {
        if (reply) {
            if (reply.version) {
                if (reply.version >= requiredVersion) {
                    hasExtension = true;
                }
            }
        }
        else {
          hasExtension = false;
        }
    });

จากนั้นคุณสามารถตรวจสอบตัวแปร hasExtension ข้อเสียเปรียบเพียงอย่างเดียวคือการโทรเป็นแบบอะซิงโครนัสดังนั้นคุณต้องหลีกเลี่ยงปัญหานั้น

แก้ไข: ดังที่กล่าวไว้ด้านล่างคุณจะต้องเพิ่มรายการไปยังmanifest.json ซึ่งแสดงรายการโดเมนที่สามารถส่งข้อความถึงส่วนเสริมของคุณได้ เช่น:

"externally_connectable": {
    "matches": ["*://localhost/*", "*://your.domain.com/*"]
},

2
การทำงานนี้เหมือนมีเสน่ห์ ข้อเสียเปรียบอีกประการหนึ่งคือคุณต้องควบคุมส่วนขยาย - คุณไม่สามารถใช้สิ่งนี้เพื่อดูว่ามีการติดตั้งส่วนขยายของบุคคลที่สามโดยพลการหรือไม่
Eric P

2
@EricP คำถามเดิมระบุว่าพวกเขากำลังเขียนส่วนขยายดังนั้นปัญหาคือการสงสัย
BJury

13
นอกจากนี้คุณจะต้องเพิ่มสิ่งต่อไปนี้ใน manifest.json ของคุณ: "externally_connectable": {"match": [" : // .yourdomain.com / *"]}
noname

3
ควรเป็น {version: '1.0'} ไม่ใช่ {version: 1.0} มิฉะนั้นคุณจะได้รับ "Uncaught SyntaxError: Un expected number" ในส่วนขยายตรวจสอบคอนโซล
ET-CS

1
ในด้าน "การตรวจสอบ" (หน้าเว็บที่พยายามตรวจสอบความพร้อมใช้งานของส่วนขยายที่กำหนด) chrome.runtime ไม่ได้กำหนดไว้คือ chrome 36 บน linux
reallynice

22

อีกวิธีหนึ่งคือการเปิดเผยแหล่งข้อมูลที่สามารถเข้าถึงได้บนเว็บแม้ว่าวิธีนี้จะช่วยให้เว็บไซต์ใด ๆ ทดสอบว่ามีการติดตั้งส่วนขยายของคุณหรือไม่

สมมติว่า ID ส่วนขยายของคุณคือaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaและคุณเพิ่มไฟล์ (เช่นภาพพิกเซลโปร่งใส) เช่นเดียวกับtest.pngในไฟล์ของส่วนขยายของคุณ

จากนั้นคุณแสดงไฟล์นี้ในหน้าเว็บด้วยweb_accessible_resourcesmanifest key:

  "web_accessible_resources": [
    "test.png"
  ],

ในหน้าเว็บของคุณคุณสามารถลองโหลดไฟล์นี้โดยใช้ URL แบบเต็ม (ใน<img>แท็กผ่าน XHR หรือด้วยวิธีอื่นใด):

chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test.png

หากไฟล์โหลดแสดงว่ามีการติดตั้งส่วนขยาย หากเกิดข้อผิดพลาดขณะโหลดไฟล์แสดงว่าไม่ได้ติดตั้งส่วนขยายนี้

// Code from https://groups.google.com/a/chromium.org/d/msg/chromium-extensions/8ArcsWMBaM4/2GKwVOZm1qMJ
function detectExtension(extensionId, callback) { 
  var img; 
  img = new Image(); 
  img.src = "chrome-extension://" + extensionId + "/test.png"; 
  img.onload = function() { 
    callback(true); 
  }; 
  img.onerror = function() { 
    callback(false); 
  };
}

หมายเหตุ: หากมีข้อผิดพลาดขณะโหลดไฟล์นี้ข้อผิดพลาดสแต็กเครือข่ายดังกล่าวจะปรากฏในคอนโซลโดยไม่มีความเป็นไปได้ที่จะปิดเสียง เมื่อ Chromecast ใช้วิธีนี้มันทำให้เกิดการโต้เถียงกันเล็กน้อยเพราะเหตุนี้ ด้วยวิธีการแก้ปัญหาที่น่าเกลียดมากในการขึ้นบัญชีดำข้อผิดพลาดที่เฉพาะเจาะจงมากจาก Dev Tools โดยทีม Chrome


หมายเหตุสำคัญ:วิธีนี้จะใช้ไม่ได้ใน Firefox WebExtensions ทรัพยากรที่สามารถเข้าถึงได้บนเว็บจะเปิดเผยส่วนขยายให้กับการพิมพ์ลายนิ้วมือเนื่องจาก URL สามารถคาดเดาได้โดยการรู้ ID Firefox ตัดสินใจปิดช่องนั้นโดยกำหนด URL แบบสุ่มเฉพาะอินสแตนซ์ให้กับทรัพยากรที่สามารถเข้าถึงได้บนเว็บ:

จากนั้นไฟล์จะพร้อมใช้งานโดยใช้ URL เช่น:

moz-extension://<random-UUID>/<path/to/resource>

UUID นี้สร้างขึ้นแบบสุ่มสำหรับทุกอินสแตนซ์ของเบราว์เซอร์และไม่ใช่ ID ของส่วนขยายของคุณ วิธีนี้ป้องกันไม่ให้เว็บไซต์พิมพ์ลายนิ้วมือส่วนขยายที่ผู้ใช้ติดตั้งไว้

อย่างไรก็ตามในขณะที่ส่วนขยายสามารถใช้runtime.getURL()เพื่อรับที่อยู่นี้คุณไม่สามารถฮาร์ดโค้ดในเว็บไซต์ของคุณได้


แม้ว่าคำตอบนี้จะได้รับ "น้ำผลไม้" จากstackoverflow.com/a/9216924/1504300แต่ IMHO ก็เพิ่มข้อมูลที่สำคัญบางอย่างเช่นการเปิดเผยทรัพยากรในส่วนขยายและความจริงที่ว่าคุณสามารถใช้คำขอ ajax เพื่อตรวจสอบการมีอยู่ (วัตถุรูปภาพ ดูเหมือนจะใช้ได้เฉพาะใน HTML5 ถ้าฉันไม่ผิดgoo.gl/HBeI1i ) ด้วยข้อมูลในคำตอบนี้ฉันสามารถแก้ปัญหาได้ฉันพบว่ามันเหมือนวิธีแก้ปัญหา "นอกกรอบ"
จริงๆ

@niconic คำตอบนั้น (ไม่ดีเหมือนลิงก์อย่างเดียวอยู่ดี) หมายถึงสถานการณ์ก่อนที่ manifest เวอร์ชัน 2 จะมีผลบังคับใช้ ก่อนหน้านี้ไม่จำเป็นต้องประกาศทรัพยากรที่สามารถเข้าถึงได้ทางเว็บ
Xan

19

ฉันคิดว่าฉันจะแบ่งปันงานวิจัยของฉันเกี่ยวกับเรื่องนี้ ฉันจำเป็นต้องตรวจสอบได้ว่ามีการติดตั้งส่วนขยายเฉพาะสำหรับบางไฟล์หรือไม่: /// ลิงก์จึงจะทำงานได้ ฉันเจอบทความนี้ที่นี่ ซึ่งอธิบายวิธีการรับ manifest.json ของส่วนขยาย

ฉันปรับโค้ดเล็กน้อยและมาพร้อมกับ:

function Ext_Detect_NotInstalled(ExtName, ExtID) {
  console.log(ExtName + ' Not Installed');
  if (divAnnounce.innerHTML != '')
    divAnnounce.innerHTML = divAnnounce.innerHTML + "<BR>"

  divAnnounce.innerHTML = divAnnounce.innerHTML + 'Page needs ' + ExtName + ' Extension -- to intall the LocalLinks extension click <a href="https://chrome.google.com/webstore/detail/locallinks/' + ExtID + '">here</a>';
}

function Ext_Detect_Installed(ExtName, ExtID) {
  console.log(ExtName + ' Installed');
}

var Ext_Detect = function (ExtName, ExtID) {
  var s = document.createElement('script');
  s.onload = function () { Ext_Detect_Installed(ExtName, ExtID); };
  s.onerror = function () { Ext_Detect_NotInstalled(ExtName, ExtID); };
  s.src = 'chrome-extension://' + ExtID + '/manifest.json';
  document.body.appendChild(s);
}

var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

if (is_chrome == true) {
  window.onload = function () { Ext_Detect('LocalLinks', 'jllpkdkcdjndhggodimiphkghogcpida'); };
}

ด้วยวิธีนี้คุณควรจะสามารถใช้ Ext_Detect (ExtensionName, ExtensionID) เพื่อตรวจหาการติดตั้งส่วนขยายจำนวนเท่าใดก็ได้


3
ดูเหมือนว่า Google จะทำให้สิ่งต่างๆปลอดภัยมากขึ้นฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันเรียกใช้ Ext_Detect (): กำลังปฏิเสธการโหลด chrome-extension: // [my_extension_id] /manifest.json ทรัพยากรต้องอยู่ในรายการในคีย์รายการ web_accessible_resources เพื่อให้โหลดโดยเพจภายนอกส่วนขยาย
เลา

ฉันสามารถทำให้สิ่งนี้ใช้งานได้กับ Chrome เวอร์ชัน 32.0.1700.107 ม. ณ 27/2/2557
JE Carter II

1
ตามที่ @ Lounge9 กล่าว. ทรัพยากรภายในแพ็กเกจที่ใช้ manifest_version 2 (หรือสูงกว่า) จะถูกบล็อกโดยค่าเริ่มต้นและต้องอยู่ในรายการที่อนุญาตพิเศษสำหรับการใช้งานผ่านพร็อพเพอร์ตี้นี้โดยเพิ่มใน manifest.json: "web_accessible_resources": ["manifest..json"]
ET-CS

การใช้คำตอบ @BJury คุณสามารถส่งผ่านข้อมูลได้อย่างง่ายดายจากส่วนขยายไปยังสคริปต์ (เช่นเวอร์ชันส่วนขยาย) และคุณไม่จำเป็นต้องเปิดเผยไฟล์ใด ๆ จากส่วนขยาย
ET-CS

1
สิ่งนี้เหมาะกับฉันที่สุดเพราะส่วนขยายของเราจะใช้กับหลายโดเมนและไม่สามารถกำหนดไว้ล่วงหน้าได้เนื่องจากมีการเพิ่มโดเมนใหม่เป็นประจำ แทนที่จะเข้าถึง manifest.json ฉันสร้างไฟล์ใหม่ version.json และใส่หมายเลขเวอร์ชันไว้ข้างใน การทำงานนี้เหมือนกัน
Paul Haggo

7

อีกวิธีที่เป็นไปได้ถ้าคุณเป็นเจ้าของเว็บไซต์คือการใช้การติดตั้งแบบอินไลน์

if (chrome.app.isInstalled) {
  // extension is installed.
}

ฉันรู้ว่านี่เป็นคำถามเก่า แต่วิธีนี้ได้รับการแนะนำใน Chrome 15 ดังนั้นฉันจึงคิดว่ารายการรหัสสำหรับทุกคนที่กำลังมองหาคำตอบ


12
ใช้งานได้ดีสำหรับแอป Chrome แต่ไม่ใช่สำหรับ Chrome Extension AFAIK
Eran Medan

ใช่เว็บไซต์นั้นบอกวิธีการติดตั้งส่วนขยายแบบอินไลน์แต่เห็นได้ชัดว่าแนะนำว่า "ส่วนขยายสามารถสื่อสารกับหน้าการฝังผ่านสคริปต์เนื้อหาเพื่อแจ้งให้ทราบว่ามีการติดตั้งแล้ว" แทนที่จะสามารถใช้ chrome.app.isInstalled งงเหมือนกัน ...
rogerdpack


4

ฉันใช้วิธีคุกกี้:

ในไฟล์ manifest.js ของฉันฉันรวมสคริปต์เนื้อหาที่ทำงานบนไซต์ของฉันเท่านั้น:

 "content_scripts": [
        {
        "matches": [
            "*://*.mysite.co/*"
            ],
        "js": ["js/mysite.js"],
        "run_at": "document_idle"
        }
    ], 

ใน js / mysite.js ของฉันฉันมีหนึ่งบรรทัด:

document.cookie = "extension_downloaded=True";

และในหน้า index.html ของฉันฉันมองหาคุกกี้นั้น

if (document.cookie.indexOf('extension_downloaded') != -1){
    document.getElementById('install-btn').style.display = 'none';
}

ฉันลองวิธีแก้ปัญหาทั้งหมดข้างต้นแล้ว แต่ไม่ได้ผลฉันเห็นคำตอบของคุณนี่คือสิ่งที่ฉันกำลังมองหา!
John Doe

สิ่งนี้จะเพิ่มค่าใช้จ่ายให้กับคำขอ HTTP ทุกรายการต่อจากนี้ไป
mlissner

3

คุณสามารถให้ส่วนขยายตั้งค่าคุกกี้และให้เว็บไซต์ของคุณ JavaScript ตรวจสอบว่ามีคุกกี้อยู่หรือไม่และอัปเดตตามนั้น วิธีนี้และอาจเป็นวิธีการอื่น ๆ ส่วนใหญ่ที่กล่าวถึงในที่นี้แน่นอนว่าผู้ใช้อาจได้รับการพัฒนาเว้นแต่คุณจะพยายามและให้ส่วนขยายสร้างคุกกี้ที่กำหนดเองขึ้นอยู่กับการประทับเวลา ฯลฯ และให้แอปพลิเคชันของคุณวิเคราะห์ทางฝั่งเซิร์ฟเวอร์เพื่อดูว่าเป็นผู้ใช้จริงหรือไม่ ส่วนขยายหรือบางคนแอบอ้างว่ามีโดยการแก้ไขคุกกี้ของเขา


5
ปัญหาเดียวก็คือหากผู้ใช้ลบส่วนขยายของคุณ คุกกี้อาจยังคงตั้งค่าได้
Chase Roberts

3

มีวิธีอื่นที่แสดงในโพสต์ของ Google Groupsนี้ ในระยะสั้นคุณสามารถลองตรวจสอบว่าไอคอนส่วนขยายโหลดสำเร็จหรือไม่ ซึ่งอาจเป็นประโยชน์หากส่วนขยายที่คุณกำลังตรวจสอบไม่ใช่ของคุณเอง


1
ตกลง. เราจะตรวจสอบได้อย่างไรว่ามีไอคอนส่วนขยายอยู่หรือไม่?
Michael Rogers

3

หน้าเว็บโต้ตอบกับส่วนขยายผ่านสคริปต์พื้นหลัง

manifest.json:

"background": {
    "scripts": ["background.js"],
    "persistent": true
},
"externally_connectable": {
    "matches": ["*://(domain.ext)/*"]
},

background.js:
chrome.runtime.onMessageExternal.addListener(function(msg, sender, sendResponse) {
    if ((msg.action == "id") && (msg.value == id))
    {
        sendResponse({id : id});
    }
});

page.html:

<script>
var id = "some_ext_id";
chrome.runtime.sendMessage(id, {action: "id", value : id}, function(response) {
    if(response && (response.id == id)) //extension installed
    {
        console.log(response);
    }
    else //extension not installed
    {
        console.log("Please consider installig extension");
    }

});
</script>

ไม่ทำงานบน Firefox WebExtensions ซึ่งไม่รองรับ externally_connectable
mlissner

3

ส่วนขยายของคุณสามารถโต้ตอบกับเว็บไซต์ได้ (เช่นการเปลี่ยนตัวแปร) และเว็บไซต์ของคุณสามารถตรวจพบสิ่งนี้ได้

แต่ควรมีวิธีที่ดีกว่านี้คือ ฉันสงสัยว่า Google ทำอย่างไรในแกลเลอรีส่วนขยาย (มีการทำเครื่องหมายแอปพลิเคชันที่ติดตั้งไว้แล้ว)

แก้ไข:

แกลเลอรีใช้ฟังก์ชันchrome.management.get ตัวอย่าง:

chrome.management.get("mblbciejcodpealifnhfjbdlkedplodp", function(a){console.log(a);});

แต่คุณสามารถเข้าถึงวิธีการได้จากหน้าที่มีสิทธิ์ที่ถูกต้องเท่านั้น


1
คุณจะต้องใช้ส่วนขยายเพื่อโต้ตอบกับทุกไซต์ในทุกแท็บซึ่งจะใช้งานได้ช้า / ยากและมี

ปัญหาคือไม่สามารถสื่อสารในทิศทางอื่น (page to extension) ได้เนื่องจากรูปแบบการรักษาความปลอดภัยของ chrome หากคุณไม่ต้องการใช้วิธี 'โต้ตอบ' ให้ใช้วิธีคุกกี้
Fox32

2
เรียน @ Fox32, chrome.management.get ... ส่งกลับข้อผิดพลาดนี้:Uncaught TypeError: Cannot read property 'get' of undefined
Hosein Aqajani

3

คำตอบมากมายที่นี่จนถึงตอนนี้คือ Chrome เท่านั้นหรือมีการปรับค่าใช้จ่าย HTTP โซลูชันที่เราใช้แตกต่างกันเล็กน้อย:

1. เพิ่มวัตถุใหม่ในรายการ content_scripts manifest ดังนี้:

{
  "matches": ["https://www.yoursite.com/*"],
  "js": [
    "install_notifier.js"
  ],
  "run_at": "document_idle"
}

วิธีนี้จะทำให้โค้ดใน install_notifier.js ทำงานบนไซต์นั้นได้ (หากคุณยังไม่มีสิทธิ์)

2. ส่งข้อความไปยังทุกไซต์ในคีย์รายการด้านบน

เพิ่มสิ่งนี้ใน install_notifier.js (โปรดทราบว่าสิ่งนี้ใช้การปิดเพื่อป้องกันไม่ให้ตัวแปรเป็นโกลบอล แต่ไม่จำเป็นอย่างยิ่ง):

// Dispatch a message to every URL that's in the manifest to say that the extension is
// installed.  This allows webpages to take action based on the presence of the
// extension and its version. This is only allowed for a small whitelist of
// domains defined in the manifest.
(function () {
  let currentVersion = chrome.runtime.getManifest().version;
  window.postMessage({
    sender: "my-extension",
    message_name: "version",
    message: currentVersion
  }, "*");
})();

ข้อความของคุณสามารถพูดอะไรก็ได้ แต่การส่งเวอร์ชันนี้มีประโยชน์เพื่อให้คุณรู้ว่าคุณกำลังจัดการกับอะไร จากนั้น ...

3. ในเว็บไซต์ของคุณให้ฟังข้อความนั้น

เพิ่มสิ่งนี้ในเว็บไซต์ของคุณที่ใดที่หนึ่ง:

window.addEventListener("message", function (event) {
  if (event.source == window &&
    event.data.sender &&
    event.data.sender === "my-extension" &&
    event.data.message_name &&
    event.data.message_name === "version") {
    console.log("Got the message");
  }
});

ใช้งานได้ใน Firefox และ Chrome และไม่ต้องใช้ HTTP เหนือศีรษะหรือปรับเปลี่ยนหน้า


2

นี่คือแนวทางที่ทันสมัยอื่น ๆ :

const checkExtension = (id, src, callback) => {
    let e = new Image()
    e.src = 'chrome-extension://'+ id +'/'+ src
    e.onload = () => callback(1), e.onerror = () => callback(0)
}

// "src" must be included to "web_accessible_resources" in manifest.json
checkExtension('gighmmpiobklfepjocnamgkkbiglidom', 'icons/icon24.png', (ok) => {
    console.log('AdBlock: %s', ok ? 'installed' : 'not installed')
})
checkExtension('bhlhnicpbhignbdhedgjhgdocnmhomnp', 'images/checkmark-icon.png', (ok) => {
    console.log('ColorZilla: %s', ok ? 'installed' : 'not installed')
})

1
อย่าลืมอัปเดตไฟล์ Manifest เพื่อให้สามารถเข้าถึงทรัพยากร: "web_accessible_resources": ["icons / *. png"]
Derek Wade

0

หากคุณสามารถควบคุมส่วนขยาย Chrome ได้คุณสามารถลองสิ่งที่ฉันทำ:

// Inside Chrome extension
var div = document.createElement('div');
div.setAttribute('id', 'myapp-extension-installed-div');
document.getElementsByTagName('body')[0].appendChild(div);

แล้ว:

// On web page that needs to detect extension
if ($('#myapp-extension-installed-div').length) {

}

รู้สึกแฮ็คเล็กน้อย แต่ฉันไม่สามารถใช้วิธีอื่นได้และฉันกังวลว่า Chrome จะเปลี่ยน API ที่นี่ เป็นที่น่าสงสัยว่าวิธีนี้จะหยุดทำงานเร็ว ๆ นี้


ดังที่ได้กล่าวไว้ข้างต้น - ฉันได้ทดสอบสิ่งนี้แล้ว แต่ลำดับการดำเนินการดูเหมือนแปลก - สคริปต์ใดทำงานก่อน ฯลฯ
Brady Moritz

0

คุณสามารถใช้วิธีข้ามเบราว์เซอร์ที่ฉันเคยใช้ ใช้แนวคิดของการเพิ่ม div

ในสคริปต์เนื้อหาของคุณ (เมื่อใดก็ตามที่สคริปต์โหลดควรทำเช่นนี้)

if ((window.location.href).includes('*myurl/urlregex*')) {
        $('html').addClass('ifextension');
        }

ในเว็บไซต์ของคุณคุณยืนยันบางอย่างเช่น

if (!($('html').hasClass('ifextension')){}

และส่งข้อความที่เหมาะสม


ฉันได้ทดสอบสิ่งนี้แล้ว แต่ลำดับของการดำเนินการดูเหมือนแปลก - สคริปต์ใดทำงานก่อน ฯลฯ
Brady Moritz

@BradyMoritz ลำดับเดียวกับในคำตอบ เพิ่มชั้นเรียนก่อนแล้วจึงยืนยัน
Prakash Palnati

ดูเหมือนว่าสคริปต์เนื้อหาของฉันไม่จำเป็นต้องทำงานก่อนสคริปต์ในหน้าของฉัน?
Brady Moritz

ฉันคิดว่ามันง่ายที่จะแก้ไข คุณสามารถตรวจสอบให้แน่ใจว่าสคริปต์เนื้อหาของคุณทำงานทันทีหลังจากกดปุ่ม URL / เส้นทางที่ต้องการโดยใช้ regex คุณเคยลองหรือยัง
Prakash Palnati

0

หากคุณกำลังพยายามตรวจหาส่วนขยายจากเว็บไซต์ใด ๆ โพสต์นี้ช่วยได้: https://ide.hey.network/post/5c3b6c7aa7af38479accc0c7

โดยทั่วไปวิธีแก้ปัญหาคือเพียงพยายามรับไฟล์เฉพาะ (manifest.json หรือรูปภาพ) จากส่วนขยายโดยระบุพา ธ นี่คือสิ่งที่ฉันใช้ ทำงานได้แน่นอน:

const imgExists = function(_f, _cb) {
    const __i = new Image();
    __i.onload = function() {
        if (typeof _cb === 'function') {
            _cb(true);
        }
    }
    __i.onerror = function() {
        if (typeof _cb === 'function') {
            _cb(false);
        }
    }
    __i.src = _f;
    __i = null;
});

try {
    imgExists("chrome-extension://${CHROME_XT_ID}/xt_content/assets/logo.png", function(_test) {
        console.log(_test ? 'chrome extension installed !' : 'chrome extension not installed..');
        ifrm.xt_chrome = _test;
        // use that information
    });
} catch (e) {
    console.log('ERROR', e)
}

0

นี่คือวิธีตรวจหาส่วนขยายที่ติดตั้งและแสดงข้อความเตือน

ก่อนอื่นคุณต้องเปิดไฟล์ manifest ของส่วนขยายโดยไปที่ chrome-extension: //extension_id_here_hkdppipefbchgpohn/manifest.json และมองหาชื่อไฟล์ใด ๆ ในส่วน "web_accessible_resources"

<div class="chromewarning" style="display:none">
    <script type="text/javascript">
                            $.get("chrome-extension://extension_id_here_hkdppipefbchgpohn/filename_found_in_ web_accessible_resources.png").done(function () {
                              $(".chromewarning").show();
                            }).fail(function () {
                             //  alert("failed.");
                            });
                        </script>
                        <p>We have detected a browser extension that conflicts with learning modules in this course.</p>
            </div>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.