Firefox 附加组件:使用时间、用户名、计算机名保存到文本文件的 HTTP 日志不会创建文本文件

Firefox add-on: HTTP Log that saves to text file with time, username, computername doesn't create text file

我尝试修改一个 Firefox 附加组件以将 HTTP 请求保存到我提到的位置的文本文件中,其中包含系统名称和用户名以及时间(如果请求包含 "flag=unknown")。就是监控我的下属在我给的站点上是怎么工作的。但它不起作用。我不知道如何让它工作。下面是我的代码

Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
function HttpRequestLogger() {
  var httpRequestLogger = {
    observe: function(subject, topic, data) {
      if (topic == "http-on-modify-request") {
        var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
        var ref = httpChannel.referrer ? httpChannel.referrer.spec : "(none)";
        var buffer = ref + " " + httpChannel.requestMethod + " " 
                         + httpChannel.URI.spec + "\n";
        var n = buffer.search("flag=unknown");
        If (n > 0) {
          fos.write(buffer + "^" + ThisUserName + "^" + TimeStamp + "\r\n");
        }
      }
    }
  };

  var file = 'T:\test';
  file.append("log.txt");
  var fos = Components.classes["@mozilla.org/network/file-output-stream;1"]
                      .createInstance(Components.interfaces.nsIFileOutputStream);

  fos.init(file, 0x02 | 0x08 | 0x10, -1, 0);

  var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                  .getService(Components.interfaces.nsIObserverService);
  observerService.addObserver(httpRequestLogger, "http-on-modify-request", false);
}

HttpRequestLogger.prototype.classID = 
                                Components.ID('{c4a9bb50-b9b2-11e0-a4dd-0800200c9a66}');
HttpRequestLogger.prototype.classDescription = 'Http Request Logger XPCOM Component';
HttpRequestLogger.prototype.contractID = '@prekageo/HttpRequestLogger;1';
var NSGetFactory = XPCOMUtils.generateNSGetFactory([HttpRequestLogger]);

var nsIEnvironment = Components.classes["@mozilla.org/process/environment;1"]
                               .getService(Components.interfaces.nsIEnvironment);
var ThisUserName = nsIEnvironment.get("UserName");
var ThisUserName = nsIEnvironment.get("ComputerName");
var date = new Date();
var TimeStamp = date.toLocaleString();

FYKI:我不知道让classID保持原样是否错误。 原始代码的学分转到 @prekageo/HttpRequestLogger.

嗯,第一个问题是 file 是一个字符串,而不是以下语句中所需的 nsIFile

fos.init(file, 0x02 | 0x08 | 0x10, -1, 0);

请参阅:nsIFileOutputStream 其中显示 init() 具有以下参数:

void init(in nsIFile file, in long ioFlags, in long perm, in long behaviorFlags);

请注意,它也应该是语句的 nsIFile:file.append("log.txt");

您应该执行如下操作:

...
var FileUtils = Components.utils.import("resource://gre/modules/FileUtils.jsm").FileUtils;

var file = new FileUtils.File( 'T:\test' );
file.append("log.txt");
...

问题二:
注意:'T:\test' 中的 \ 而不是 \。单个 \ 只是引用字符串文字中的下一个字符。您需要字符串实际包含一个 \,因此它需要用另一个 \.

引用

问题三:
您的使用:

fos.write(buffer + "^" + ThisUserName + "^" + TimeStamp + "\r\n");

不包含 write() 所需的长度计数。

可能的问题:
您正在观察者之外创建您的 TimeStamp 一次。这将为所有条目生成一个时间戳。

解决这些问题,稍微清理和优化一下,得到以下经过测试的功能代码:

Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
function HttpRequestLogger() {
  var httpRequestLogger = {
    observe: function(subject, topic, data) {
      if (topic == "http-on-modify-request") {
        var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
        var ref = httpChannel.referrer ? httpChannel.referrer.spec : "(none)";
        var buffer = ref + " " + httpChannel.requestMethod + " " 
                         + httpChannel.URI.spec + "\n";
        searchRegExp.lastIndex = 0; //Make sure searching from begining.
        if(searchRegExp.test(buffer) ) {
          var date = new Date();
          var TimeStamp = date.toLocaleString();
          buffer += "^" + ThisUserName + "^" + TimeStamp + "\r\n";
          fos.write(buffer, buffer.length);
        }
      }
    }
  };

  //Explicitly define the RegExp here once so it is not implicitly done each time
  //  the observer is called. This saves time in the observer, which, if possible, we
  //  should code to be fast.
  var searchRegExp = /flag=unknown/;

  var FileUtils = Components.utils
                            .import("resource://gre/modules/FileUtils.jsm").FileUtils;

  var file = new FileUtils.File( "T:\test" );
  file.append("log.txt");

  var fos = Components.classes["@mozilla.org/network/file-output-stream;1"]
                      .createInstance(Components.interfaces.nsIFileOutputStream);
  // PR_WRONLY | PR_CREATE_FILE | PR_APPEND
  fos.init(file, 0x02 | 0x08 | 0x10, -1, 0);


  var nsIEnvironment = Components.classes["@mozilla.org/process/environment;1"]
                                 .getService(Components.interfaces.nsIEnvironment);
  var ThisUserName = nsIEnvironment.get("UserName");
  var ThisComputerName = nsIEnvironment.get("ComputerName");

  var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                  .getService(Components.interfaces.nsIObserverService);
  observerService.addObserver(httpRequestLogger, "http-on-modify-request", false);
}

HttpRequestLogger.prototype.classID =
                                Components.ID('{c4a9bb50-b9b2-11e0-a4dd-0800200c9a66}');
HttpRequestLogger.prototype.classDescription = 'Http Request Logger XPCOM Component';
HttpRequestLogger.prototype.contractID = '@prekageo/HttpRequestLogger;1';
var NSGetFactory = XPCOMUtils.generateNSGetFactory([HttpRequestLogger]);

来自 prekageo/http-request-logger 的其他文件 GitHub 上的存储库不需要任何更改。