检测Gmail附件下载(Detecting Gmail attachment downloads)

2019-10-17 14:42发布

有没有一种方法来检测是否正在下载一个特定的文件是一个Gmail附件?
我正在寻找一种方式来写一个脚本Greasemonkey的这将帮助我整理下载,基于他们的下载来源,比如Gmail电子邮件附件将不得不从其他的东西,不同的行为。

到目前为止,我已经发现,附件重定向到https://mail-attachment.googleusercontent.com/attachment/u/0/ ,我的猜测是不够的。

编辑

由于加载项会比userscript更加强大,我已经决定继续添加跟帖。 然而,检测的问题仍然没有解决。

Answer 1:

这是只有一个问题太复杂; 它至少有以下主要部分:

  1. 你想,当用户点击重定向下载或自动下载选择的文件吗? 澄清问题。
  2. 您的通用脚本必须找出相应的下载链接,并在其网页,并为其中的观点? 对于Gmail,这不是一个简单的任务,而这个问题需要更清晰。 这是值得整个问题只是给出的各种意见和AJAX涉及这个问题。
  3. 一旦确定,剧本大概需要拦截这些链接的点击。 (取决于你的目标(澄清!)什么的Firefox扩展可以做。)
  4. Greasemonkey的需要的扩展名,或者截取用户启动下载,或允许自动下载交互。 我已经详细介绍了自动下载的方式,以下。

一旦你的脚本已经确定的相应文件的URL和/或链接(打开一个新的问题,与更多的帮助,包括广告的网页类型的图片,你想链接),它可以与Firefox的界面插件,像下面的一个,自动保存这些文件。


从Greasemonkey的自动保存文件与一个额外的帮助附加:

警告:以下是概念的只有教育工作的证明。 它有没有安全功能,如果你使用它,不被用于实际的冲浪,一些网页或编剧或作家的扩展用它来完全PWN您的计算机。

如果您使用的加载项Builder或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!");
    }
} );


您可以在测试脚本, 这太问题页面 。

请注意,任何其他扩展名,userscript,网页,或插件可以收听或发送恶搞事件,唯一的安全,到目前为止,是限制延长运行在哪个页面。

作为参考,所述延伸源文件是如下。 其余的是通过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);
    }
}


Answer 2:

到目前为止,从你说的话,你唯一可以做的事情正在插件(火狐)和扩展(铬如果你想)。

如果你有附件的下载细看,当它发生:

1)您点击附件图标

2)如果你点击下载

对于这两样东西,你可以找到的点击事件<a>包含标记download_url value.You可以轻松地用JS / jQuery的为creting扩展。

因此,当用户尝试下载附件您可以编写功能。



Answer 3:

你可以使用Gmail上下文小工具来修改谷歌方面的行为:

Gmail的Contexual小工具

上下文小工具没有附件,但服务器端直接访问,您可以使用IMAP访问附件(基于小工具识别的Gmail邮件ID):

Gmail的IMAP扩展

使用小工具和服务器端的IMAP已被浏览器无关的优势。

这不是完全清楚你想,而不是任何给定的下载完成的Gmail附件做不同的东西(它保存到不同的位置?在附件数据执行操作?),但上下文小工具和IMAP应该给你一些机会修改根据需要在浏览器下载开始前附件数据。



文章来源: Detecting Gmail attachment downloads