上回講到,我們拿到了易班的題庫
自動答題
嗯~自動答題
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
然後我們就獲得了答案的一個數組
自動答題
這一部分主要是前端的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,然後配個前端就可以大規模使用了,還是那句話,做出來的大佬,發我一份共同學習一下。
本文章為技術交流,如果用于非合規用途,所産生的後果自負,本人不承擔任何責任,技術無罪