大学里,总有一些老师让做的力所能及的事情,打扰我们的休息时间。在线答题就是一个,给个题库,还得弄到多少分以上才能通过。
回忆起上次的答题,懒惰的我做了个插件,做插件不费劲么?没办法,谁让我懒呢。。
那是一次宗教的答题,,100道题,给了个题库,让我们答,分数不够的,重新弄,反正是没限制。于是我来了精神。
给了个题库,这样的:
所以,首先要把答案给捋下来,弄成json,便于查询。
原理就是python 操作excel,用 xlrd库,将题目和答案搞出来:
# -*- coding: UTF-8 -*-import xlrdfrom collections import OrderedDictimport jsonimport codecsxlrd.Book.encoding = 'utf-8'wb = xlrd.open_workbook('zjzs.xlsx')convert_list = []sh = wb.sheet_by_index(0)title = sh.row_values(0)for rownum in range(1, sh.nrows): # 从1到284行 rowvalue = sh.row_values(rownum) # 读取一行 single = OrderedDict() print rowvalue[1], rowvalue[2], rowvalue[7] single["name"] = rowvalue[2] single["value"] = rowvalue[7] # for colnum in range(0, len(rowvalue)): # print(title[colnum], rowvalue[colnum])# single[title[colnum]] = rowvalue[colnum] convert_list.append(single)#j = json.dumps(convert_list)print jwith codecs.open('file.json', "w", "utf-8") as f: f.write(j)
最终得出一坨json。
然后,看一看界面:
也就是,我需要获取到tr标签里面的题目,然后将题目与题库里的东西比对,得出此题的正确答案。然后,可以根据查询得到的答案自动选择相应的答案。
不多说,开始实施。
自己编写浏览器插件,看看360给的api: http://open.chrome.360.cn/extension_dev/notifications.html
也就是最最基础也是两个文件,一个清单文件,一个执行文件。
先写个demo吧:
浏览器插件demo:
manifes.json
"name": "demo", //插件名字 "description": "demo", //描述 "version": "2.0", "permissions": [ "activeTab" //权限:一般写tabs,或者activetab,应该是上下文之类的 ], "background": { //后台执行的程序 "scripts": ["background.js"], "persistent": false }, "browser_action": { "default_title": "demo" }, "manifest_version": 2}
background.js
chrome.browserAction.onClicked.addListener(function(tab) { // 谷歌api,插件被点击监听 //tab执行脚本,通过文件能执行多条语句。 chrome.tabs.executeScript({file: "content.js"});//通过JS文件});
3. content.js
//这里面写测试东西,比如:alert(1);
然后浏览器用开发人员选项,将插件导入,点击插件,弹出弹框之后,说明可以用。开始弄我的答题脚本:
// 这里字符串一大堆,name value型的var jsonText = '[{"name": "\u4e0b\u5217\uff08 \uff09\u4e0d\u662f\u793e\u4f1a\u4e3b\u4e49\u6838\u5fc3\u4ef7\u503c\u89c2\u7684\u5185\u5bb9\u3002", "value": "D"}, {"name": "\u4e0b\u5217\u4e0d\u5c5e\u4e8e\u201c\u4e94\u7231\u201d\u7684\u57fa\u672c\u5185\u5bb9\u7684\u662f\uff08 \uff09\u3002", "value": "A"}, {"name": "\u300a\u5baa\u6cd5\u300b\u7b2c\u4e09\u5341\u516d\u6761\u89c4\u5b9a\uff0c\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd\u516c\u6c11\u6709\u5b97\u6559\u4fe1\u4ef0\u81ea\u7531\uff0c\u4efb\u4f55\u56fd\u5bb6\u673a\u5173\u3001\u793e\u4f1a\u56e2\u4f53\u548c\uff08 \uff09\u4e0d\u5f97\u5f3a\u5236\u516c\u6c11\u4fe1\u4ef0\u5b97\u6559\u6216\u8005\u4e0d\u4fe1\u4ef0\u5b97\u6559,\u4e0d\u5f97\u6b67\u89c6\u4fe1\u4ef0\u5b97\u6559\u7684\u516c\u6c11\u548c\u4e0d\u4fe1\u4ef0\u5b97\u6559\u7684\u516c\u6c11\u3002", "value": "C"}]';var jsonObj = JSON.parse(jsonText);var tbody = document.getElementsByTagName("tbody")[0];// 获取tr节点var timu = tbody.getElementsByTagName("tr");// 获取下一个节点function getNextNode(ele) { return ele.nextElementSibling || ele.nextSibling;}// 往后面几个节点选中 value是答案, i是tbody的第几个trfunction daanwanghoumian(value,i) { if (value == "正确"){ timu[i+1].getElementsByTagName("input")[0].checked = true; }else if (value == "错误"){ timu[i+2].getElementsByTagName("input")[0].checked = true; }else { if (value.indexOf("A")!= -1){ timu[i+1].getElementsByTagName("input")[0].checked = true; } if (value.indexOf("B")!= -1){ timu[i+2].getElementsByTagName("input")[0].checked = true; } if (value.indexOf("C")!= -1){ timu[i+3].getElementsByTagName("input")[0].checked = true; } if (value.indexOf("D")!= -1){ timu[i+4].getElementsByTagName("input")[0].checked = true; } }}for (let i = 0; i < timu.length; i++) { // 获取所有的tr, 得到题目,id带topicid的,是题目,其他是内容 if (timu[i].id.indexOf("topicid") != -1){ var bioati = timu[i].getElementsByTagName("font")[0].innerText.split("、")[1].replace(/(^\s+)|(\s+$)/g,""); if (bioati.indexOf("( )") != -1){ var a = bioati.split("( )"); bioati = a[0].length > a[1].length ? a[0] : a[1]; } for (let j = 0; j < jsonObj.length; j++) { if (jsonObj[j].name.indexOf(bioati) != -1){ timu[i].getElementsByTagName("font")[0].innerText = timu[i].getElementsByTagName("font")[0].innerText + " " + jsonObj[j].value + "|||"; daanwanghoumian(jsonObj[j].value,i); break; } } }}// 对下面的全选, 时间更改var lix = document.getElementsByClassName("bd")[0].getElementsByTagName("ul")[0].getElementsByTagName("li");for (let i = 0; i < lix.length; i++) { lix[i].classList.add("on");}document.getElementById("countdown_time").id = 'bb';document.getElementById("bb").innerText = "考试还有15分33秒";
基本代码是从33行到51行,也就是tbody里面一堆的tr,td标签,通过循环,获取tr标签里的题目,然后截取一段,因为有的题目长,总不能全部都拿来比较,万一有不同的呢,比较之后(jsonObj[j].name.indexOf(bioati) != -1),将答案写到题目后面,并通过 daanwanghoumian 函数,自动点击正确的答案。
至于后面那点,修改考试时间,无关紧要了,毕竟,用插件挺快的,学校还要截图。。
点关注,不迷路