1、申请ID:KennyAss
2、个人邮箱:1091192337@qq.com
3、原创技术文章:记一次对作业发表软件的html封包分析以及对作业图片的分析(本人学生,因作业繁重而有感开发这个程序)
发表作业软件:小鑫作业
使用工具:VisualStudio(C#),Fidder抓包工具
NuGet程序依赖项:AipSdk(百度AI支持库),HAP(HtmlAgilityPack),Newtonsoft.Json(Json解析)
首先手机连接Fidder端口,打开fidder,打开小鑫作业。
获取登录Token
登录,获取Token
,点击Json格式,发现这是Json格式的,
然后用Json解析出[C#] 纯文本查看 复制代码 public class Login_1 {
/// <summary>
///
/// </summary>
public string userName { get; set; }
/// <summary>
///
/// </summary>
public int userId { get; set; }
/// <summary>
///
/// </summary>
public string sqlName { get; set; }
/// <summary>
///
/// </summary>
public string realName { get; set; }
/// <summary>
///
/// </summary>
public string schCode { get; set; }
/// <summary>
///
/// </summary>
public string andToken { get; set; }
/// <summary>
///
/// </summary>
public int schoolId { get; set; }
/// <summary>
///
/// </summary>
public string schName { get; set; }
/// <summary>
///
/// </summary>
public int userRole { get; set; }
/// <summary>
///
/// </summary>
public string schMark { get; set; }
}
public class Root_1
{
/// <summary>
/// 登录成功
/// </summary>
public string msg { get; set; }
/// <summary>
///
/// </summary>
public Login_1 data { get; set; }
/// <summary>
///
/// </summary>
public string state { get; set; }
}
然后分析登录表单,写出模拟登录代码
[C#] 纯文本查看 复制代码 System.Net.WebClient WebClientObj = new System.Net.WebClient();
System.Collections.Specialized.NameValueCollection PostVars = new System.Collections.Specialized.NameValueCollection();
PostVars.Add("userPass", textBox2.Text.Trim());
PostVars.Add("userName", textBox1.Text.Trim());
PostVars.Add("platform", "android");
try
{
WebClientObj.Encoding = Encoding.UTF8;
byte[] byRemoteInfo = WebClientObj.UploadValues("http://xxzy.xinkaoyun.com:8081/holidaywork/login", "POST", PostVars);
string sRemoteInfo = System.Text.Encoding.UTF8.GetString(byRemoteInfo);
LoginObj = JsonConvert.DeserializeObject<Root_1>(sRemoteInfo);
PostVars.Clear();
PostVars.Add("token", LoginObj.data.andToken);
byRemoteInfo = WebClientObj.UploadValues("http://xxzy.xinkaoyun.com:8081/holidaywork/student/getStudent", "POST", PostVars);
sRemoteInfo = System.Text.Encoding.UTF8.GetString(byRemoteInfo);
MessageBox.Show(LoginObj.msg);
LoginObj_2 = JsonConvert.DeserializeObject<Root_2>(sRemoteInfo);
if (LoginObj.msg == "登录成功")
{
this.Hide();
main.Show();
}
//这是获取返回信息
}
catch
{
}
返回值是一个Token,这个Token以后会有用
Token获取科目信息
上面的参数是提交一个Token,我们照猫画虎,继续写出获取科目的代码然后用JSON解析。
同样用一个结构体保存,然后获取某一科目的详细信息,这里的表单内容就是Token,StuID,...都是上几步获取的,我们这里最主要提供指定科目的SID就好
返回值我们只要taskId(代表指定作业代号)
我们就直接一步步往下走获取指定的试卷题目。
同上,先解析,提取数据,这里到了关键:这里的teaTitle=<p><img title="image.png" alt="image.png" src="http://zuoye2.xinkaoyun.com/uploadImg/image/20190122/6368377149812397507548687.png"/></p>明显就是一个URL,我们打开它,会发现
明显就是一个图片,但是问题是我们需要利用Html解析到src的内容
用HAP就很容易办到,关键代码:[C#] 纯文本查看 复制代码 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(item.teaTitle);
HtmlNodeCollection hrefList = doc.DocumentNode.SelectNodes(".//img[@src]");
if (hrefList != null)
{
foreach (HtmlNode href in hrefList)
{
HtmlAttribute att = href.Attributes["src"];
if (att != null)
{
string url = att.Value;
if (url != null)
{
Image _image = Image.FromStream(WebRequest.Create(url).GetResponse().GetResponseStream());
imageList1.Images.Add(_image);
List_images.Add(_image);
}
break;
}
}
}
这里有一个图片集,这段代码最后循环遍历,把Image添加进去。
最后再用ListView把他显示出来。
最终文字识别还是没有能自己写出来,毕竟自己还是个高一学生,没有能力写出OCR来。只能先用百度AI的文字识别了。
[C#] 纯文本查看 复制代码
Ocr ocr = new Ocr(ApiKey, SecretToken);
var _bytes = imageToByte(List_images[listView1.SelectedItems[0].Index]);
var jObj= this.Text.IndexOf("数学")<0?ocr.GeneralBasic(_bytes):ocr.AccurateBasic(_bytes);//因为数学比较坑,测试的过程中出了比较多的错误,这里特判了一下数学
最后调用外部浏览器,用百度搜索问题得到答案。
[C#] 纯文本查看 复制代码 if (textBox1.Text != string.Empty)
{
CallWebBrowser("http://www.baidu.com/s?wd=" + HttpUtility.UrlEncode(textBox1.Text.Trim(), Encoding.GetEncoding("gb2312")));
}
[C#] 纯文本查看 复制代码 public static void CallWebBrowser(string URL)
{
System.Diagnostics.Process.Start("explorer.exe", URL);
}
这两个函数在这里。
最后,希望自己能够审核通过,如果审核通过,我会更加努力的在论坛学习更多的技术 |