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 上的存储库不需要任何更改。
我尝试修改一个 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 上的存储库不需要任何更改。