javascript - उपयोगकर्ता मार्गदर्शिका और Greasemonkey: एक वेबसाइट के जावास्क्रिप्ट कार्यों को बुलाओ




google-chrome-extension userscripts (2)

पृष्ठभूमि

Greasemonkey पहले से ही मेरे एक्सटेंशन जावास्क्रिप्ट इंजेक्षन नहीं करता है? क्या कोई इसे मेरे लिए कृपया स्पष्ट कर सकता है।

Greasemonkey आपकी स्क्रिप्ट को एक sandbox में निष्पादित करता है, जो पेज में जावास्क्रिप्ट तक सीधे पहुंच के बिना एक प्रतिबंधित वातावरण है। Greasemonkey के पहले संस्करणों को सीधे पृष्ठ में स्क्रिप्ट इंजेक्शन दिया, लेकिन इसने गंभीर सुरक्षा भेद्यताएं पेश कीं। पुराने मॉडल में, स्क्रिप्ट ब्राउज़र क्रोम के ऊंचे अधिकारों के साथ दौड़ती थी, जिसने रिमोट पेजों को कुछ चालाक जावास्क्रिप्ट का उपयोग करके Greasemonkey के अंतर्निर्मित कार्यों तक पहुंचने की अनुमति दी। यह बुरा था:

Greasemonkey स्क्रिप्ट में अपनी खुद की जीएम_एक्सएमएलटीपीक्वेट ऑब्जेक्ट शामिल है, जो सामान्य xmlttprequest ऑब्जेक्ट के विपरीत, किसी भी स्थानीय फाइलों को किसी भी कंप्यूटर पर एक्सेस कर सकता है या उसी मूल नीति के संबंध में मनमाने ढंग से साइट्स के मनमाने ढंग से अनुरोध कर सकता है जो आम तौर पर xmlhttprequest पर लागू होता है। (source)

जब आप आज Greasemonkey स्क्रिप्ट से window ऑब्जेक्ट तक पहुंचते हैं, तो आपको एक रैपर ऑब्जेक्ट मिलता है जो अप्रत्यक्ष रूप से वास्तविक window की गुणों का संदर्भ देता है। इस रैपर ऑब्जेक्ट को सुरक्षित रूप से संशोधित किया जा सकता है, लेकिन इसमें महत्वपूर्ण सीमाएं हैं । वास्तविक विंडो ऑब्जेक्ट तक पहुंच unsafeWindow ( window.wrappedJSObject लिए window.wrappedJSObject ) द्वारा प्रदान की जाती है। unsafeWindow उपयोग Greasemonkey की मूल सुरक्षा समस्याओं को फिर से खोलता है और क्रोम में उपलब्ध नहीं है। जहां भी संभव हो इसे टालना चाहिए।

अच्छी खबर: Greasemonkey के नए सुरक्षा मॉडल के साथ एक सुरक्षित तरीके से काम करने के कम से कम दो तरीके हैं।

स्क्रिप्ट इंजेक्शन

अब Greasemonkey स्क्रिप्ट सुरक्षित रूप से डोम तक पहुंच सकते हैं, लक्ष्य दस्तावेज़ के <head> में एक <script> टैग इंजेक्ट करना मुश्किल है। इस तरह एक समारोह बनाएँ:

function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script); // run the script
    document.body.removeChild(script); // clean up
}

इसका उपयोग करना आसान है:

exec(function() {
    return Grooveshark.playNextSong();
});

स्थान हैक

कुछ मामलों में स्क्रिप्ट इंजेक्शन अधिक हो सकता है, खासकर जब आपको केवल पृष्ठ में किसी चर के मान को संशोधित करना या एक फ़ंक्शन निष्पादित करना है। स्थान हैक javascript: लाभ उठाता है javascript: दस्तावेज़ की सामग्री में कोड तक पहुंचने के लिए यूआरएल। यह Greasemonkey स्क्रिप्ट के भीतर से एक बुकमार्कलेट चलाने की तरह है।

location.assign("javascript:Grooveshark.playNextSong();void(0)");

बोनस स्क्रिप्ट

यहां एक पूर्ण Greasemonkey स्क्रिप्ट है जो ऊपर दिए गए उदाहरण प्रदर्शित करती है। आप इसे इस पेज पर चला सकते हैं।

// ==UserScript==
// @name           Content Function Test
// @namespace      lwburk
// @include        http://stackoverflow.com/questions/5006460/userscripts-greasemonkey-calling-a-websites-javascript-functions
// ==/UserScript==

function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script); // run the script
    document.body.removeChild(script); // clean up
}

window.addEventListener("load", function() {
    // script injection
    exec(function() {
        // alerts true if you're registered with Stack Overflow
        alert('registered? ' + isRegistered);
    });
    // location hack
    location.assign("javascript:alert('registered? ' + isRegistered);void(0)");
}, false);

मैं फ़ायरफ़ॉक्स और क्रोम के लिए उपयोगकर्तास्क्रिप्ट एक्सटेंशन बना रहा हूं और मैं वेबसाइट के जावास्क्रिप्ट में कुछ कोड का उपयोग करने की कोशिश कर रहा हूं, उदाहरण के लिए:

function: myFunction(){
    return  Grooveshark.playNextSong();
}

समस्या तब होती है जब मैं इस कोड का परीक्षण करता हूं, Grooveshark एक शून्य संदर्भ है।

मुझे पता है कि अन्य लोग भी हैं जिन्होंने इसे किया है:

BetterGrooveshark देखें

लेकिन मुझे नहीं पता कि मेरा सरल विस्तार ग्रूवेशर्क के जावास्क्रिप्ट कार्यों को क्यों नहीं बुला सकता है।

क्या मुझे काम करने के लिए दस्तावेज़ में अपनी स्क्रिप्ट को 'संलग्न' करने की आवश्यकता है ?: document.document.body.appendChild(script);

Greasemonkey पहले से ही मेरे एक्सटेंशन जावास्क्रिप्ट इंजेक्षन नहीं करता है? क्या कोई इसे मेरे लिए कृपया स्पष्ट कर सकता है।

धन्यवाद।


स्पष्ट कारणों से, आपकी GreaseMonkey स्क्रिप्ट्स (और क्रोम की उपयोगकर्ता स्क्रिप्ट) में घोषित कार्यों और चर को वेब पेज द्वारा घोषित किए गए लोगों से अलग रखा जाता है। फ़ायरफ़ॉक्स में जीएम स्क्रिप्ट के लिए, आप unsafeWindow माध्यम से वैश्विक चर का उपयोग कर सकते हैं।

सुरक्षा और संगतता के लिए सबसे अच्छा तरीका एक स्क्रिप्ट तत्व का उपयोग कर पृष्ठ में अपने कार्यों को इंजेक्ट करना है। मैं अपने उपयोगकर्ता स्क्रिप्ट में निम्न स्निपेट का उपयोग करता हूं:

function addFunction(func, exec) {
  var script = document.createElement("script");
  script.textContent = "-" + func + (exec ? "()" : "");
  document.body.appendChild(script);
}

यहां "-" यह सुनिश्चित करता है कि फ़ंक्शन को अभिव्यक्ति के रूप में पार्स किया गया है ताकि निष्पादन को तुरंत जोड़ने पर निष्पादित किया जा सके। आप इस तरह के फ़ंक्शन को कॉल करते हैं:

function myFunction () {
    return Grooveshark.playNextSong();
}

// Inject the function and execute it:
addFunction(myFunction, true);





userscripts