上回讲到,我们拿到了易班的题库
自动答题
嗯~自动答题
dom树分析
首先分析某班答题网页的dom树
差不多结构如图所示
应该就是利用lform表单,在刚开始加载的时候就加载了试题。
题库加载
首先先把html页面加载到程序里面
string date = System.IO.File.ReadAllText("jsondate.txt");
string[] obj = date.Split(new[] { "------" }, StringSplitOptions.None);
for (int i = 0; i < obj.Length; i++)
{
list.Add(Getobj(obj[i]));
}
将json字符串转化为对象
public static Rootobject Getobj(string date)
{
return JsonConvert.DeserializeObject<Rootobject>(date);
}
利用htmlagilitypack对dom树解析
HtmlDocument doc = new HtmlDocument();
doc.DetectEncodingAndLoad("html.txt");
var nodes = doc.DocumentNode.SelectNodes("//*[@class='ep_tt_topic']");
foreach (var item in nodes)
{
var node = item.SelectNodes(".//span");
foreach(var it in node)
{
string str = it.OuterHtml;
str= str.Replace("<span>","");
str = str.Replace("</span>", "");
title.Add(str);
}
}
首先,先把html文件加载进来,注意点是,这个加载方式,不能直接使用load函数,这样做会乱码,毕竟是老外的东西,对中文的支持性差点也可以理解。
使用detectencodingandload,这样就会读取html的编码格式,然后自适应
然后根据开发者对dom树的命名我们轻松找到了每个题的题干。
还有就是,开发者在开发的时候会为了方便或者是实现功能,会在命名的时候更接近语义,比如getxxx,setxxx,或者就是前端的class还有id,class起名字可以统一修改css,id可以单个访问,但是这样做,也会给第三方带来可趁之机。所以矛与盾必然相互依存,其他的规则性的亦如此。
然后是这个东西短时间改动的可能性也不大,要改的话,起码得捋一遍业务逻辑吧,对于一些规划不合理的后端,直接可以重写了。
数据检索
数据检索很简单,直接一个linq就ok
var answer = list.Where(q => q.data.shitilist[0].title==item).FirstOrDefault().data.shitilist[0].old_answer;
然后我们就获得了答案的一个数组
自动答题
这一部分主要是前端的js和jquery,我不怎么会,凑合着用吧
//定义一个int型60个长度的数组,用于存放答案
var datelist=new Array();
for(var i=0;i<document.getElementsByClassName("ep_t_ul").length;i++)
{
document.getElementsByClassName("ep_t_ul")[i].children[datelist[i]].checked=true;
}
//网上好像是说,document.getElementsByClassName("")这个东西返回的是一个htmlcollection的东西
//这种数据类型用 for(var item in document.getElementsByClassName(""))比较好
//目测是利用了迭代器之类的原理,我也不是搞前端的,也就没深究
上面代码大概率有问题,懒得弄了,路过的前端大佬帮忙改改吧
内置浏览器加载网页
其实完成了上面一系列的步骤之后,差不多完成一套试题在1min以内吧。
但是操作还是过于复杂
第一要登录
第二要复制html代码到程序
第三要复制js脚本到控制台
so,我们在干脆一点,把所有的操作放到csharp的程序里面
首先新建winform项目,引入谷歌的内核,因为winform的浏览器控件是ie内核,js可能会出现问题。所以换成谷歌的,方法百度有
第二步,账号和密码的自动填写,
document.getElementById("account-txt").value="你的账号";
document.getElementById("password-txt").value="password";
差不多是这样吧,我也不太清楚~~前端大佬继续帮忙
然后验证码就没有办法了,文字识别是个大问题,尤其是中文
第三步,登录成功之后,自动加载html代码到上面讲的程序里面,返回js脚本,内置浏览器加载脚本,然后提交答案,因为在一个浏览器里面,所以登录成功之后,就不用考虑安全性了,cookie已经加载进来了
上面只是想法,不要打我,估计差不多也能实现,只是没时间做了,有做出来的大佬,记得发我一份一起学习一下,hhhh。
这样一个自动刷课的业务逻辑就差不多写完了。刷一个人的时间也就是输个验证码的时间
其实这个东西可以做成一个webservice,然后配个前端就可以大规模使用了,还是那句话,做出来的大佬,发我一份共同学习一下。
本文章为技术交流,如果用于非合规用途,所产生的后果自负,本人不承担任何责任,技术无罪