1

これに関連していくつか質問がありますが、unsafeWindowを使用する一般的な「解決策」は私のために働いていません。@grant値が設定されているときに必要なライブラリを使用できません

私はStack Exchange Javascript SDKを使用しようとしています。

これは動作します:

// ==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'); 
    } 
}); 

これはない:それはスクリプトがアクセス権を有することを意味するので、

// ==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'); 
    } 
}); 

をただし、両方のバージョンは、私が理解することはできませんconsole.log(SE)ためObject { authenticate: n(), init: r() }を記録SEオブジェクト。

「機能しない」とは、何もしないことを意味します。最初のconsole.log(SE)の後にコンソールに何も記録されません。

このライブラリをどのように動作させるかわかりません。誰にもアイデアはありますか?これは、許可値が設定されているときにFirefoxで有効になっているサンドボックスに関連しています。

これはちょっとChromeで動作しますが、私の理解では2つのサンドボックスはかなり異なっています。 SE.init()機能を実行できないFirefoxのサンドボックスを回避する方法はありますか?私はunsafeWindow.SE...を試しましたが、うまくいきません - スクリプトは常にSEオブジェクトにアクセスできるので、違いはありません。それは実際にそれを呼び出すのに問題があるだけです!

+0

あなたの関数をWebページのコンテキストにエクスポートする必要があります:[私のgreasemonkeyスクリプトからのイベントを聞く](http://stackoverflow.com/a/38357589) – wOxxOm

+0

@wOxxOm hmm私は 'exportFunction(SE、unsafeWindow/ –

+0

@wOxxOm内でその関数をエクスポートしても何もしません: 'complete:exportFunction(function(d){console.log(d) ; console.log( 'SE init');}、unsafeWindow) '。コードが実際にSE.initの開始をパスしないかのようです! –

答えて

2

迅速なハックはウェブページに、簡単な-APIスクリプトを含むあなたの全体のコードを、注入し(ウィンドウオブジェクトの「メッセージ」イベントのためには、dispatchEvent + addEventListerner)メッセージングを使用していないGM_機能にアクセスすることであろう注入されたスクリプトで使用できます。

GMサンドボックスほど安全ではありません。キーを盗むために特別にターゲット設定された拡張子やuserscriptをインストールしている場合、APIキーはDOM mutation observer/listenerまたはonbeforescriptexecuteイベントリスナー経由で傍受されます。

// ==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();' 

APIスクリプトは、それが一度だけ、スクリプトがインストールされているときにダウンロードし、スクリプトと一緒にユーザーのハードドライブに保存されているように、リソースとして宣言されています。また

、APIを注入して、コールバックにunsafeWindowexportFunctionを経由して、それを呼び出す:

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), 
}); 

適切な解決策誰かがより良いライブラリを公開するまでGM_xmlhttpRequestを経由して、手動でactual APIにアクセスすることです。 Tampermonkeyでは、API URLのアクセス許可を追加する必要があります:
// @connect api.stackexchange.com

+0

この場合、 'GM_xmlhttpRequest'が助けになるとは思わない。認証するには、実際に新しいウィンドウを開き、メッセージングを使用してターゲットページと認証ドメイン間で通信します。 'GM_xmlhttpRequest'は必要なことを(簡単に)行うことができません。 –

+0

ありがとうございます。これはうまくいくはずです。私はすぐにそれを試してみる:) –

関連する問題