これは、1 つの質問だけでは複雑すぎます。少なくとも次の主要部分があります。
- ユーザーがクリックしたときにダウンロードをリダイレクトするか、選択したファイルを自動的にダウンロードしますか? 質問を明確にします。
- GM スクリプトは、適切なダウンロード リンクを特定し、どのページで、どのビューを表示するかを特定する必要があります。 gMail の場合、これは簡単な作業ではなく、質問をより明確にする必要があります。さまざまなビューと AJAX が関係していることを考えると、この問題についてだけ質問する価値があります。
- 特定されたら、スクリプトはおそらくそれらのリンクのクリックを傍受する必要があります。(あなたの目標 (明確にしてください!) と Firefox 拡張機能で何ができるかによって異なります。)
- Greasemonkey は、ユーザーが開始したダウンロードをインターセプトするか、自動ダウンロードを許可する拡張機能と対話する必要があります。以下に、自動ダウンロードのアプローチについて詳しく説明します。
スクリプトが適切なファイルの URL やリンクを特定したら (詳細については新しい質問を開き、必要なページとリンクの種類の写真を含めてください)、次のような Firefox アドオンと連携できます。これらのファイルを自動的に保存します。
追加のアドオンの助けを借りて、Greasemonkey からファイルを自動的に保存します。
警告: 以下は、教育のみを目的とした実用的な概念実証です。セキュリティ機能はなく、実際のサーフィンのためにそのまま使用すると、一部の Web ページまたはスクリプト作成者または拡張機能作成者がそれを使用して、コンピューターを完全に pwn します。
アドオン ビルダーまたは SDK を使用して、危険をインストールまたは「テスト」する場合。危険。危険。ファイルダウンロードユーティリティ、
次に、次のような Greasemonkey スクリプトを使用して、ファイルを自動的に保存できます。
// ==UserScript==
// @name _Call our File download add-on to trigger a file download.
// @include https://mail.google.com/mail/*
// @include https://stackoverflow.com/questions/14440362/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
var fileURL = "http://userscripts.org/scripts/source/29222.user.js";
var savePath = "D:\\temp\\";
var extensionLoaded = false;
window.addEventListener ("ImAlivefromExtension", function (zEvent) {
console.log ("The test extension appears to be loaded!", zEvent.detail);
extensionLoaded = true;
} );
window.addEventListener ("ReplyToDownloadRequest", function (zEvent) {
//var xxxx = JSON.parse (zEvent.detail);
console.log ("Extension replied: ", zEvent.detail);
} );
$("body").prepend ('<button id="gmFileDownloadBtn">Click to File download request.</button>');
$("#gmFileDownloadBtn").click ( function () {
if (extensionLoaded) {
detailVal = JSON.stringify (
{targFileURL: fileURL, targSavePath: savePath}
);
var zEvent = new CustomEvent (
"SuicidalDownloadRequestToAddOn",
{"detail": detailVal }
);
window.dispatchEvent (zEvent);
}
else {
alert ("The file download extension is not loaded!");
}
} );
この SO 質問ページ
でスクリプトをテストできます。
他の拡張機能、ユーザー スクリプト、Web ページ、またはプラグインは、スプーフィング イベントをリッスンまたは送信できることに注意してください。これまでのところ唯一のセキュリティは、拡張機能が実行されるページを制限することです。
参考までに、拡張ソースファイルを以下に示します。残りは、Firefox のアドオン SDK によって提供されます。
コンテンツ スクリプト:
var zEvent = new CustomEvent ("ImAlivefromExtension",
{"detail": "GM, DANGER, DANGER, DANGER, File download utility" }
);
window.dispatchEvent (zEvent)
window.addEventListener ("SuicidalDownloadRequestToAddOn", function (zEvent) {
console.log ("Extension received download request: ", zEvent.detail);
//-- Relay request to extension main.js
self.port.emit ("SuicidalDownloadRequestRelayed", zEvent.detail);
//-- Reply back to GM, or whoever is pretending to be GM.
var zEvent = new CustomEvent ("ReplyToDownloadRequest",
{"detail": "Your funeral!" }
);
window.dispatchEvent (zEvent)
} );
バックグラウンド JS:
//--- For security, MAKE THESE AS RESTRICTIVE AS POSSIBLE!
const includePattern = [
'https://mail.google.com/mail/*',
'https://stackoverflow.com/questions/14440362/*'
];
let {Cc, Cu, Ci} = require ("chrome");
Cu.import ("resource://gre/modules/Services.jsm");
Cu.import ("resource://gre/modules/XPCOMUtils.jsm");
Cu.import ("resource://gre/modules/FileUtils.jsm");
let data = require ("sdk/self").data;
let pageMod = require ('sdk/page-mod');
let dlManageWindow = Cc['@mozilla.org/download-manager-ui;1'].getService (Ci.nsIDownloadManagerUI);
let fileURL = "";
let savePath = "";
let activeWindow = Services.wm.getMostRecentWindow ("navigator:browser");
let mod = pageMod.PageMod ( {
include: includePattern,
contentScriptWhen: 'end',
contentScriptFile: [ data.url ('ContentScript.js') ],
onAttach: function (worker) {
console.log ('DANGER download utility attached to: ' + worker.tab.url);
worker.port.on ('SuicidalDownloadRequestRelayed', function (message) {
var detailVal = JSON.parse (message);
fileURL = detailVal.targFileURL;
savePath = detailVal.targSavePath;
console.log ("Received request to \ndownload: ", fileURL, "\nto:", savePath);
downloadFile (fileURL, savePath);
} );
}
} );
function downloadFile (fileURL, savePath) {
dlManageWindow.show (activeWindow, 1);
try {
let newFile;
let fileURIToDownload = Services.io.newURI (fileURL, null, null);
let persistWin = Cc['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
.createInstance (Ci.nsIWebBrowserPersist);
let fileName = fileURIToDownload.path.slice (fileURIToDownload.path.lastIndexOf ('/') + 1);
let fileObj = new FileUtils.File (savePath);
fileObj.append (fileName);
if (fileObj.exists ()) {
console.error ('*** Error! File "' + fileName + '" already exists!');
}
else {
let newFile = Services.io.newFileURI (fileObj);
let newDownload = Services.downloads.addDownload (
0, fileURIToDownload, newFile, fileName, null, null, null, persistWin, false
);
persistWin.progressListener = newDownload;
persistWin.savePrivacyAwareURI (fileURIToDownload, null, null, null, "", newFile, false);
}
} catch (exception) {
console.error ("Error saving the file! ", exception);
dump (exception);
}
}