0

ダウンロード中の特定のファイルが Gmail の添付ファイルかどうかを検出する方法はありますか?
ダウンロードソースに基づいてダウンロードを整理するのに役立つGreasemonkeyスクリプトを作成する方法を探しています.Gmailの電子メールの添付ファイルは他のものとは異なる動作をします.

これまでのところ、添付ファイルが にリダイレクトされることがわかりましたがhttps://mail-attachment.googleusercontent.com/attachment/u/0/、これでは不十分だと思います。

編集

アドオンはユーザースクリプトよりも強力であるため、アドオンのアイデアを追求することにしました。ただし、検出の問題は未解決のままです。

4

3 に答える 3

2

これは、1 つの質問だけでは複雑すぎます。少なくとも次の主要部分があります。

  1. ユーザーがクリックしたときにダウンロードをリダイレクトするか、選択したファイルを自動的にダウンロードしますか? 質問を明確にします。
  2. GM スクリプトは、適切なダウンロード リンクを特定し、どのページで、どのビューを表示するかを特定する必要があります。 gMail の場合、これは簡単な作業ではなく、質問をより明確にする必要があります。さまざまなビューと AJAX が関係していることを考えると、この問題についてだけ質問する価値があります。
  3. 特定されたら、スクリプトはおそらくそれらのリンクのクリックを傍受する必要があります。(あなたの目標 (明確にしてください!) と Firefox 拡張機能で何ができるかによって異なります。)
  4. 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);
    }
}
于 2013-01-31T01:49:58.907 に答える
-1

あなたが言っていることから遠く離れて、あなたができる唯一のことは、アドオン(Firefox)と拡張機能(必要に応じてChrome用)を作成することです.

添付ファイルのダウンロードを詳しく見ると、次の場合に発生します。

1) 添付ファイルのアイコンをクリックします

2) ダウンロードをクリックした場合

<a>これら2つのことについて、値を含むタグのクリックイベントを見つけることができますdownload_url。拡張機能を作成するためにjs/jqueryを使用して簡単に行うことができます。

したがって、ユーザーが添付ファイルをダウンロードしようとしたときの機能を作成できます。

于 2013-01-30T08:13:28.447 に答える
-1

Gmail コンテキスト ガジェットを使用して、Google 側の動作を変更できます。

Gmail コンテキスト ガジェット

Contextual Gadget は添付ファイルに直接アクセスできませんが、サーバー側では IMAP を使用して添付ファイルにアクセスできます (ガジェットによって識別される Gmail メッセージ ID に基づいて):

Gmail IMAP 拡張機能

ガジェットとサーバー側 IMAP を使用すると、ブラウザーに依存しないという利点があります。

ダウンロードした Gmail の添付ファイルに対して、ダウンロードしたものとは異なる方法で何をしたいのか (別の場所に保存しますか? 添付データに対してアクションを実行しますか?)、完全には明確ではありませんが、コンテキスト ガジェットと IMAP を使用すると、変更する機会がいくらか得られるはずです。ブラウザのダウンロードが開始される前に、必要に応じて添付データをダウンロードします。

于 2013-01-30T14:59:38.917 に答える