1

Il y a quelques questions à ce sujet, mais la «solution» générale d'utilisation de unsafeWindow ne fonctionne pas pour moi. J'essaie d'utiliser le Stack Exchange Javascript SDK.Impossible d'utiliser la bibliothèque requise lorsqu'une valeur @grant est définie

Cela fonctionne:

// ==UserScript== 
// @name  testing 
// @include  http://stackoverflow.com/* 
// @require  https://api.stackexchange.com/js/2.0/all.js 
// @version  1 
// @grant  none 
// ==/UserScript== 

console.log(SE); 
SE.init({ 
    clientId: 1234, 
    key: 'my key', 
    channelUrl: location.protocol + '//stackoverflow.com/blank', 
    complete: function (d) { 
    console.log(d); 
    console.log('SE init'); 
    } 
}); 

Cela ne veut pas:

// ==UserScript== 
// @name  testing 
// @include  http://stackoverflow.com/* 
// @require  https://api.stackexchange.com/js/2.0/all.js 
// @version  1 
// @grant  GM_setValue 
// ==/UserScript== 

console.log(SE); 
SE.init({ 
    clientId: 1234, 
    key: 'my key', 
    channelUrl: location.protocol + '//stackoverflow.com/blank', 
    complete: function (d) { 
    console.log(d); 
    console.log('SE init'); 
    } 
}); 

Cependant, les deux versions du journal Object { authenticate: n(), init: r() }console.log(SE) que je ne comprends pas, car cela signifie que le script a accès à la Objet SE.

Par "ne fonctionne pas", je veux dire qu'il ne fait rien; rien n'est enregistré sur la console après la première console.log(SE).

Je ne comprends pas comment faire fonctionner cette bibliothèque. Quelqu'un a-t-il une idée? Cela concerne le sandbox activé sur Firefox lorsqu'une valeur d'attribution est définie. Soit dit en passant, cela fonctionne sur Chrome de toute façon, mais je crois comprendre que les deux sandbox sont considérablement différents. Est-il possible de contourner ce sandbox Firefox qui empêche la fonction SE.init() de s'exécuter? J'ai essayé unsafeWindow.SE... mais cela ne fonctionne pas - je ne pense pas que cela devrait faire la différence parce que le script a toujours accès à l'objet SE; c'est juste avoir du mal à l'appeler!

+0

Votre fonction doit être exportée dans le contexte de la page Web: [Écoute d'un événement de mon script greasemonkey] (http://stackoverflow.com/a/38357589) – wOxxOm

+0

@wOxxOm hmm J'essaie 'exportFunction (SE, unsafeWindow , {defineAs: 'SE'}); 'mais cela ne semble pas fonctionner:/ –

+0

@wOxxOm même l'exportation de cette fonction dans l'ensemble ne fait rien:' complete: exportFunction (function (d) {console.log (d) ; console.log ('SE init');}, unsafeWindow) '.C'est comme si le code ne passait pas le début de SE.init! –

Répondre

2

Un hack serait d'injecter du code entier, y compris le script simple API, dans la page Web et utiliser la messagerie (dispatchEvent + addEventListerner pour l'événement « message » sur l'objet de la fenêtre) pour accéder GM_ fonctions qui ne sont pas disponible pour un script injecté. Il n'est pas aussi sécurisé qu'un sandbox GM: la clé API peut être interceptée via un observateur/écouteur de mutation DOM ou un écouteur d'événement onbeforescriptexecute si vous avez installé une extension ou un script utilisateur spécialement ciblé pour voler la clé.

// ==UserScript== 
// @name  testing 
// @include  http://stackoverflow.com/* 
// @include  https://stackoverflow.com/* 
// @resource SE_JS_API https://api.stackexchange.com/js/2.0/all.js 
// @version  1 
// @grant  GM_setValue 
// @grant  GM_getResourceText 
// ==/UserScript== 

document.head.appendChild(document.createElement('script')).text = 
    GM_getResourceText('SE_JS_API') + ';(' + function() { 
    SE.init({ 
     clientId: 1234, 
     key: 'my key', 
     channelUrl: location.protocol + '//stackoverflow.com/blank', 
     complete: function (d) { 
     console.log(d); 
     console.log('SE init'); 
     } 
    }); 
    } + ')(); this.remove();' 

Le script de l'API est déclarée comme une ressource afin qu'elle soit téléchargée qu'une seule fois, lorsque le script est installé et stocké sur le disque dur de l'utilisateur à côté du script.

Vous pouvez également injecter de l'API et l'appeler via unsafeWindow et exportFunction pour vos callbacks:

document.head.appendChild(document.createElement('script')).text = 
    GM_getResourceText('SE_JS_API'); 

unsafeWindow.SE.init({ 
    clientId: 1234, 
    key: 'my key', 
    channelUrl: location.protocol + '//stackoverflow.com/blank', 
    complete: exportFunction(function (d) { 
    console.log(d); 
    console.log('SE init'); 
    }, unsafeWindow), 
}); 

Une bonne solution est d'accéder au actual API manuellement via GM_xmlhttpRequest jusqu'à ce que quelqu'un publie une meilleure bibliothèque. Dans Tampermonkey, vous devrez également ajouter une autorisation pour l'URL de l'API:
// @connect api.stackexchange.com.

+0

Je ne pense pas que 'GM_xmlhttpRequest' aidera dans ce cas. Pour s'authentifier, vous ouvrez une nouvelle fenêtre et utilisez la messagerie pour communiquer entre la page cible et le domaine d'authentification. 'GM_xmlhttpRequest' ne peut pas (facilement) faire ce qui est nécessaire. –

+0

Merci, +1. Cela semble devoir fonctionner; Je vais l'essayer dès que possible :) –