写了个百度空间的firefox用户脚本,遇到this的问题,请高手指教!!

Freeze_Soul 2008-09-22 09:37:59
写了个FireFox的用户脚本,在firefox下运行(也可存为html测试),主要是针对百度空间访问留言发消息等操作,遇到一些问题,向大家求教
只说主要的,关于this上下文的问题,红色字体标注的位置,此处this在执行中并不一直是HiBaiDuSpider 实例本身,还望请高手指教,对于用面向对象实现javascript应用,还属新手,希望大家多多指点,特别说明一下,此脚本并非恶意,并不能完全实现功能,百度对留言验证码和发消息都有一定限制,并不能完全实现,这里只是作为学习之用。

对于此代码面向对象机制的实现不足,还请高手指点.

完全脚本可访问:http://hi.baidu.com/freezesoul/blog/item/81eada3359a84c45ad4b5ff5.html

// ==UserScript==
// @name HiBaiDu
// @namespace http://hi.baidu.com/freezesoul
// @description HiBaiDuSpider
// @include http://hi.baidu.com/
// ==/UserScript==


////用户空间////
var _userlink = "http://hi.baidu.com/freezesoul";
////发送文本////
var _sendtext = "abc";
////验证码字典/////
////由于百度对同一验证码出现的次数有限制,因此并不是特别牢靠////
var _imgcode = new Array();
var _imgvalue = new Array();
////验证码获得代码////
_imgcode[0] = "###";
////验证码值////
_imgvalue[0] = "###";


////用户性别1男2女3不限////
var _sex = "3";
////用户年龄起始值////
var _age_from = "";
////用户年龄结束值////
var _age_to = "";
////省份////
var _reside_province = "";
////市////
var _reside_city = "";
////兴趣////
var _word = "baidu";


HiBaiDuSpider = function() {
//获得页面数
HiBaiDuSpider.PageNum = 1;
//获得空间总数
HiBaiDuSpider.Num = 0;
//ajax行为参数
HiBaiDuSpider.StopAjax = false;
//模式窗口
此处略、、、、

HiBaiDuSpider.ModalAlertText = this.ModalAlert(this);

var _BDFPageHtml;

var BDCommitSpider = new CommitSpider();
var BDSendMSpider = new SendMSpider();

this.OnSuccess = function() {
//获得页面HTML
_BDFPageHtml = this.GetResponseText();
//找百度空间用户
var findLinks = new RegExp('<td valign="top" class="f">([^\*]*?)</' + 'script>','gi');

if(findLinks.test(_BDFPageHtml))
{
var urls = _BDFPageHtml.match(findLinks);
//留言爬虫工厂

for (var i = 0; i < urls.length; i++) {

//找用户空间Link
var findLink = new RegExp('<a href=\'([^\*]*?)\' target=\'_blank\'><img src=\'http://img.baidu.com/passport/hi.gif\' border=\'0\' align=\'absmiddle\'></a>"','gi');
var match1 = findLink.exec(urls[i]);
var link = match1[1];

var findname = new RegExp('http://hi.baidu.com/sys/checkuser/([^\*]*?)/0" target="_blank">','gi');
var match2 = findname.exec(urls[i]);
var username = match2[1];

//访问空间,留下脚印
this.GetData(link + "/profile");

//准备留言参数
var strparam = "ct=10";
strparam += "&cm=5";
strparam += ("&spRefURL=" + encodeURIComponent(link));
strparam += "&spBCmtFlag=2";
strparam += ("&spBCmtURL=" + encodeURIComponent(_userlink + "/profile"));
strparam += ("&spBCmtAuthor=" + encodeURIComponent(_userlink.replace("http://hi.baidu.com/","")));
strparam += ("&spBCmtText=" + encodeURIComponent(_sendtext));
strparam += ("&spVcode=" + _imgcode[i]);
strparam += ("&spVerifyKey=" + _imgvalue[i]);

//BDCommitSpider._strLen = strparam.length;
//创建Ajax爬虫留言
BDCommitSpider.GetData(link + "/commit" , strparam);

//document.domain = "baidu.com";

//发送消息
BDSendMSpider.GetData("http://msg.baidu.com/?ct=22&cm=MailSend&tn=bmSubmit&sn=" + encodeURIComponent("freeze_soul") + "&co=" + encodeURIComponent(_sendtext));
//记录访问总数

HiBaiDuSpider.Num++;
//输出访问结果
HiBaiDuSpider.ModalAlertText.innerHTML += "<a href='" + link + "/profile' target='_blank' >" + link.replace("http://hi.baidu.com/","") + "</a><br/>";

}
//页面累加
HiBaiDuSpider.PageNum++;

//判断是否关闭Ajax行为
if(!HiBaiDuSpider.StopAjax)
{
//递归调用

this.GetData('http://hi.baidu.com/sys/uquerys/?type=3&sex' + _sex + '=1&age_from=' + _age_from + '&age_to='+ _age_to + '&reside_province' + encodeURIComponent(_reside_province) + '&reside_city' + encodeURIComponent(_reside_city) + '&word=' + encodeURIComponent(_word) + '&pn=' + HiBaiDuSpider.PageNum);
}
}
else
{
alert("You Have Visited " + HiBaiDuSpider.Num + " Spaces.");
}
}
//创建一个Ajax
this.GetData = function(Url) {
//初始化一个Ajax
this.InitializeRequest('get', Url);
//提交
this.Commit(null);
}

}



CommitSpider = function(){
this.GetData = function(Url,data) {
//初始化一个Ajax
this.InitializeRequest('post', Url ,true);
//提交
this.Commit(data);
}
}
SendMSpider = function(){
this.GetData = function(Url) {
//初始化一个Ajax
this.InitializeRequest('get', Url);
//提交
this.Commit(null);
}
}

Ajax = function() {
此处实现了一个几个本的ajax操作类,具体代码可查看http://hi.baidu.com/freezesoul/blog/item/81eada3359a84c45ad4b5ff5.html
}

//继承
HiBaiDuSpider.prototype = new Ajax();
CommitSpider.prototype = new Ajax();
SendMSpider.prototype = new Ajax();

BDSpider = new HiBaiDuSpider();
//出发
BDSpider.GetData('http://hi.baidu.com/sys/uquerys/?type=3&sex' + _sex + '=1&age_from=' + _age_from + '&age_to='+ _age_to + '&reside_province' + encodeURIComponent(_reside_province) + '&reside_city' + encodeURIComponent(_reside_city) + '&word=' + encodeURIComponent(_word));
...全文
119 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Go 旅城通票 2008-09-23
  • 打赏
  • 举报
回复
你是如何绑定this.OnSuccess 方法的??

如果处理不好闭包,此时的this.OnSuccess中调用的this对象就不是HiBaiDuSpider的实例了

你最好加一个闭包变量,使用闭包变量来调用方法,这样可以避免this使用不当时长生的错误

这样试试

HiBaiDuSpider = function() { 
var PackUp=this;//======================================闭包变量
//获得页面数
HiBaiDuSpider.PageNum = 1;
//获得空间总数
HiBaiDuSpider.Num = 0;
//ajax行为参数
HiBaiDuSpider.StopAjax = false;
//模式窗口
此处略、、、、

HiBaiDuSpider.ModalAlertText = this.ModalAlert(this);

var _BDFPageHtml;

var BDCommitSpider = new CommitSpider();
var BDSendMSpider = new SendMSpider();

this.OnSuccess = function() {
//获得页面HTML
_BDFPageHtml = PackUp.GetResponseText(); //==========使用闭包变量,而不是this对象
/*

其他的代码

*/
luojihaidao 2008-09-23
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
UP

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧