开发简单插件的步骤

1). 新建文件夹,文件夹包含manifest.json的文件,内容如下

{
  "manifest_version": 2,
  "name": "灯塔在线",
  "description": "灯塔在线-答题辅助",
  "version": "1.0",  
  "icons": {
    "128" : "icon.png"
  },
  "permissions": [
    "tabs", "http://*/*","https://*/*"
  ],

  "content_scripts": [
    {"js":["jquery-3.3.1.min.js","actions.js"],"matches":["*://xxjs.dtdjzx.gov.cn/monidati.html","*://xxjs.dtdjzx.gov.cn/kaishijingsai.html"]}
  ]    
}

解释: 在content_scripts属性中我们定义了一个匹配规则,当URL符合*://www.google.com/规则的时候,就将js注入到页面中。

js:[]如果有点三方的js依赖,需要放到数组第一个的位置。

2). 写js答题脚本,为了简单,直接调用

主要思路:提取问题、正则匹配答案、递归。

需要注意到是eq()返回的jquery对象,但是[0]下标的方式返回的是dom对象。

$(function() {
	//alert("灯塔插件初始化完成~");
	getStart();
});

function getStart() {
	//获取`display != none`的元素, 取第一个
	var targetLi = $("ul.W_ti_ul li:visible");
	if(targetLi.length > 0) {

		var firstLi = targetLi.eq(0);		
		var answerStrs = new Array();
 	 		 
		//模拟答题
		if (/monidati.html/.test(window.location.href)) { //表示是模拟答题
			
			//answerStrs =  firstLi.find('div.W_ml45').attr('answer'); // A,B,C
			
			var question = $(firstLi[0]).find('h1 span.w_fz18').eq(1).text();
			
			console.log(question);
			console.log(firstLi);
			answerStrs = searchAnswer(question, firstLi[0]);

		}else  if (/kaishijingsai.html/.test(window.location.href)) { //正式答题
			
			//非模拟答题的情况 baseURI
			console.log(targetLi);
			console.log(firstLi[0]);
			var question = $(firstLi[0]).find('h1 span.W_ml10').eq(0).text();		
			console.log(question);
			
			//测试
			answerStrs = searchAnswer(question, firstLi[0]);
			
		}else {
			return;
		}

		var map = {
			'A': 0,
			'B': 1,
			'C': 2,
			'D': 3
		};

		if(answerStrs.length == 1) {
			//单选
			var index = map[answerStrs[0]];
			firstLi.find('input[type=radio]').eq(index).click();

		} else if(answerStrs.length > 1) {
			//多选
			for(var i = 0; i < answerStrs.length; i++) {
				var chars = answerStrs[i];
				var index = map[chars];
				firstLi.find('input[type=checkbox]').eq(index).click();
			}
		}
		//递归结束条件
		if($('.w_btn_tab_down').hasClass('W_bgcol') && answerStrs.length != 0 ) {
			
			return;
			
		} else {
			setTimeout(function() {
					$('.w_btn_tab_down').click();
					getStart();
				},
				10);
		}
		
	}
}

function searchAnswer(question, selections){
	
	//测试
	//var res = tikuString.match(/(?<=\n全党要坚定执行党的政治路线,严格遵守政治纪律和政治规矩,在政治立场、()上同党中央保持高度一致。)[\s\S]*?(?=\*{5})/g); //返回数组	
	//var regExp = new RegExp( "(?<=\n" + question + ")[\s\S]*?(?=\*{5})","g");
	//(?<=\n问题描述)[\s\S]*?(?=\*{5})/g); 	
	//需要转义,否则报错:	Invalid regular expression: missing /
	
	console.log('问题:' + question.trim());
	
	eval("var reg = /(?<=" + question.trim()  + ")[\\s\\S]*?(?=\\*{5})/g;"); 	
	var res = tikuString.match(reg);	
	
	if (res == null) {
		//未匹配到答案
		  console.log('未匹配到答案');		
			//return [];
			return new Array();
	}
	
	if (res.length > 0 ) {
					 	
	 	var str = res[0].trim();
	 	console.log(str);
	 	var resultArray = str.split("\n"); //字符分割
	 	console.log(resultArray); //["政治方向", "政治原则", "政治道路"]
 
	 	var selectionDivs = $(selections).find('div.W_ml45');
	 	var finialResultArray = new Array();
	 	
	 	for (var i = 0; i < selectionDivs.length; i++) {
	 		
	 			var node = selectionDivs.eq(i);	 		 			
				var textString = node.find('sapn').text(); //A.政治制度						
				var aswer = textString.split('.');						
				if (aswer.length > 0) {						
					var answord = aswer.pop();
					console.log(answord);
					//遍历答案数组
					for (var j = 0; j < resultArray.length; j++) {
						var keyword = resultArray[j];
						//存在空格数量和答案不匹配的								
						if (keyword.trim().replace(/\s/g,"") == answord.trim().replace(/\s/g,"") ) {									
							//表示该选项是正确答案
							var xxAnswer =  node.find('input').attr('value');																			
							finialResultArray.push(xxAnswer);									
						}
					}
				}	
	 	}	 		 				
		console.log(finialResultArray);	 		 	
	 	return  finialResultArray;	 	
	}	
	return new Array();
}



var tikuString = `《党章》要求,党的各级领导干部要坚持党的群众路线,自觉地接受党和群众的批评和监督,加强道德修养,讲党性、重品行、作表率,做到自重、自省、自警、自励,反对()和奢靡之风,反对任何滥用职权、谋求私利的行为。
形式主义
官僚主义
享乐主义
******************************
党的各级领导干部必须()、清正廉洁,模范地履行《党章》所规定的党员的各项义务。
信念坚定
为民服务
勤政务实
敢于担当
******************************
省略5000字
`;

TODO

可以完善的内容:

  • 添加pageAction
  • 优化正则匹配

参考资料

这本书写的很用心 http://www.ituring.com.cn/book/1421