天天看點

某班題庫技術分析(2)

上回講到,我們拿到了易班的題庫

自動答題

嗯~自動答題

dom樹分析

首先分析某班答題網頁的dom樹

某班題庫技術分析(2)

差不多結構如圖所示

某班題庫技術分析(2)

應該就是利用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,然後配個前端就可以大規模使用了,還是那句話,做出來的大佬,發我一份共同學習一下。

本文章為技術交流,如果用于非合規用途,所産生的後果自負,本人不承擔任何責任,技術無罪