0

有没有办法检测正在下载的特定文件是否是 Gmail 附件?
我正在寻找一种编写 Greasemonkey 脚本的方法,该脚本可以帮助我根据下载源组织下载,比如 Gmail 电子邮件附件的行为与其他内容不同。

到目前为止,我发现附件重定向到https://mail-attachment.googleusercontent.com/attachment/u/0/,我想这还不够。

编辑

由于附加组件比用户脚本更强大,我决定追求附加组件的想法。然而,检测问题仍未解决。

4

3 回答 3

2

这对于一个问题来说太复杂了;它至少有以下主要部分:

  1. 您想在用户点击时重定向下载,还是自动下载选定文件? 澄清问题。
  2. 您的 GM 脚本必须确定适当的下载链接、在哪些页面上以及针对哪些视图? 对于 gMail 来说,这不是一项简单的任务,问题需要更清楚。鉴于所涉及的观点和 AJAX 的多样性,仅在这个问题上就值得提出一个完整的问题。
  3. 一旦确定,脚本可能需要拦截对这些链接的点击。(取决于您的目标(澄清!)以及 Firefox 扩展可以做什么。)
  4. Greasemonkey 需要与拦截用户启动下载或允许自动下载的扩展交互。我在下面详细介绍了自动下载方法。

一旦您的脚本确定了适当的文件 URL 和/或链接(打开一个新问题以获得更多帮助,并包含您想要的页面类型和链接的图片。),它可以与 Firefox 附加组件交互,例如下面的一个,自动保存这些文件。


在附加插件的帮助下自动保存来自 Greasemonkey 的文件:

警告:以下是仅用于教育的工作概念证明。它没有安全功能,如果您按原样使用它,进行实际冲浪,某些网页或脚本编写器或扩展程序编写器使用它来完全 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 question page 上测试脚本。

请注意,任何其他扩展程序、用户脚本、网页或插件都可以侦听或发送欺骗事件,到目前为止,唯一的安全措施是限制扩展程序在哪些页面上运行。

作为参考,扩展源文件如下。其余部分由 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>包含值的标签的单击事件。您可以download_url使用 js/jquery 进行创建扩展轻松地做到这一点。

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

于 2013-01-30T08:13:28.447 回答
-1

您可以使用 Gmail 上下文小工具来修改 Google 端的行为:

Gmail 上下文小工具

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

Gmail IMAP 扩展程序

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

与任何给定的下载相比,您希望对下载的 Gmail 附件做些什么并不完全清楚(将其保存到不同的位置?对附件数据执行操作?)但是上下文小工具和 IMAP 应该给您一些修改的机会在浏览器下载开始之前根据需要添加附件数据。

于 2013-01-30T14:59:38.917 回答