一.分析問題
刷網課題目?網上找人代shua???風險太大了!因爲這個涉及到異地登錄,很容易被檢測出來!學分就沒啦!!因爲我選的是《大學生創新創業》課,平時視頻開靜音讓它自己放吧,可是還有那麼多題啊!!!看了一下其他大牛的做法,一言不合python抓包,JS也可以抓的;我也準備動手了,我準備用C#,因爲我們最近在學C#,而這個可以作爲一個小項目加個分之類的。本來我就不喜歡聽課+寫作業;現在有個項目可以加加分,網課題也做了,一舉兩得!
智慧樹的官網我觀察過很久,最新的一次觀察,智慧樹已經在網站性能方面增加了不少安全措施:
- 網站的源代碼看不了【之前可以看!】
- 網站上的題目不能複製。
- 網站題目的參考項是圖片,也不能複製。
二.整理思路
我的思路很簡單,想辦法把後臺源碼抓下來;因爲他的題目就在後臺源碼裏的,再對源碼進行字符轉化+過濾[正則過濾首先]。這是一個簡單的思路框架!
但問題是你看不到後臺源碼,我試着用常規抓取,結果失敗了!【什麼python
,js
一樣不能抓!】所以我換了一個思路,把網站離線pull
到我的git
倉庫裏,利用分配的網址做抓取,期間注意把我們的配置文件改成以index
爲索引的文件。
我最後得到了我需要抓取的網址了:
https://jackieling.github.io/JackieLing/
自定義一個抓取方法吧:
形參分別表示傳入的網址和網站的後臺源碼。
public static string getwebcode2(string url, string encoder)
{
}
WebClient是一種更高級別的抽象,是HttpWebRequest爲了簡化最常見任務而創建的,使用過程中你會發現他缺少基本的header,timeoust的設置,不過這些可以通過繼承httpwebrequest來實現。相對來說,WebClient比WebRequest更加簡單,它相當於封裝了request和response方法,不過需要說明的是,Webclient和WebRequest繼承的是不同類,兩者在繼承上沒有任何關係。使用WebClient可能比HttpWebRequest直接使用更慢(大約幾毫秒),但卻更爲簡單,減少了很多細節,代碼量也比較少。所以我寫的這段代碼還不算最精簡的,你還可以寫更短的。
public static string getwebcode2(string url, string encoder)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//request.Method = "GET ";
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream, Encoding.GetEncoding(encoder));
string SourceCode = readStream.ReadToEnd();
response.Close();
readStream.Close();
return SourceCode;
}
接下來拿到信息之後開始過濾,其實我的過濾也不嚴謹,所以後邊會用C語言做輔助:
string[] aryReg ={
@"<script[^>]*?>.*?</script>",
@"<(\/\s*)?!?((\w+:)?\w+)(\w+(\s*=?\s*(([""'])(\\[""'tbnr]|[^\7])*?\7|\w+)|.{0})|\s)*?(\/\s*)?>",
@"([\r\n])[\s]+",
@"&(quot|#34);",
@"&(amp|#38);",
@"&(lt|#60);",
@"&(gt|#62);",
@"&(nbsp|#160);",
@"&(iexcl|#161);",
@"&(cent|#162);",
@"&(pound|#163);",
@"&(copy|#169);",
@"&#(\d+);",
@"-->",
@"<!--.*\n"
};
string[] aryRep = {
"",
"",
"",
"\"",
"&",
"<",
">",
" ",
"\xa1",//chr(161),
"\xa2",//chr(162),
"\xa3",//chr(163),
"\xa9",//chr(169),
"",
"\r\n",
""
};
string newReg = aryReg[0];
string strOutput = strHtml;
for (int i = 0; i < aryReg.Length; i++)
{
Regex regex = new Regex(aryReg[i], RegexOptions.IgnoreCase);
strOutput = regex.Replace(strOutput, aryRep[i]);
}
strOutput.Replace("<", "");
strOutput.Replace(">", "");
strOutput.Replace("\r\n", "");
return strOutput;
過濾完成我會把代碼進行再次過濾,和保存;C語言進行讀寫操作,存到了一個名爲“代碼.txt”的文件中!
這個其實很亂,然後我寫了一段C語言輔助一下:
fi = fopen("D:\\代碼.txt", "rb");
if (NULL == fi) {
printf("Can not open file 2.txt!\n");
return;
}
fo = fopen("最終代碼.txt", "w");
while (1) {
c1 = fgetc(fi);
if (EOF == c1) break;
if ('0' <= c1 && c1 <= '9' || '\r' == c1 || '\n' == c1) {
fputc(c1, fo);
continue;
}
if(0x81u <= c1 && c1 <= 0xFEu)
{
if (c1 >= 0&&c1 <= 9)
{
break;
}
else {
c2 = fgetc(fi);
if (EOF == c2) break;
fputc(c1, fo);
fputc(c2, fo);
continue;
}
}
}
fcloseall();
最新的信息被我們寫入保存到了一個名爲“最終代碼.txt”的文件中去了,打開看一下:
我們看到了熟悉的二進制啊,因爲我的C代碼就是把那些過濾不完全的標籤進行格式化轉換,轉換成數字!但是我們看到我們的漢字也變成了亂碼,這個不急!我們把它格式調節一下,我是用vscode調的!
nice啊,看到下圖,文字顯示正常,接下來就只需要把數字踢出去就OK了,你可能在想又寫一段代碼???當然不是,只需要打開我們默默無聞的WPS或者word文檔!
在文檔裏將數字替換出去即可!!!
這些就是我們替換過濾出來的題目了,打開我們的公衆號,隨便複製一個問題進去,公衆號就會自動回覆答案,你再拿出手機,用手機刷題,電腦打開公衆號複製得到答案!!!
關注小哥公衆號“編程小哥令狐”
三.視頻全盤操作記錄紀實
這裏可以查看我整個操作的流程視頻