发表于 2019-2-4 20:09

申请会员ID:KennyAss【申请通过】

1、申请ID:KennyAss

2、个人邮箱:1091192337@qq.com
3、原创技术文章:记一次对作业发表软件的html封包分析以及对作业图片的分析(本人学生{:1_936:},因作业繁重而有感开发这个程序)


发表作业软件:小鑫作业
使用工具:VisualStudio(C#),Fidder抓包工具
NuGet程序依赖项:AipSdk(百度AI支持库),HAP(HtmlAgilityPack),Newtonsoft.Json(Json解析)

首先手机连接Fidder端口,打开fidder,打开小鑫作业。

获取登录Token,点击Json格式,发现这是Json格式的,

然后用Json解析出    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; }
    }


然后分析登录表单,写出模拟登录代码

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,我们照猫画虎,继续写出获取科目的代码然后用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就很容易办到,关键代码:                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把他显示出来。

最终文字识别还是没有能自己写出来,毕竟自己还是个高一学生{:1_937:},没有能力写出OCR来。只能先用百度AI的文字识别了。


                Ocr ocr = new Ocr(ApiKey, SecretToken);

                var _bytes = imageToByte(List_images.Index]);

                var jObj= this.Text.IndexOf("数学")<0?ocr.GeneralBasic(_bytes):ocr.AccurateBasic(_bytes);//因为数学比较坑,测试的过程中出了比较多的错误,这里特判了一下数学

最后调用外部浏览器,用百度搜索问题得到答案。

            if (textBox1.Text != string.Empty)
            {
                CallWebBrowser("http://www.baidu.com/s?wd=" + HttpUtility.UrlEncode(textBox1.Text.Trim(), Encoding.GetEncoding("gb2312")));
            }

      public static void CallWebBrowser(string URL)
      {
            System.Diagnostics.Process.Start("explorer.exe", URL);
      }

这两个函数在这里。

最后,希望自己能够审核通过,如果审核通过,我会更加努力的在论坛学习更多的技术

Hmily 发表于 2019-2-8 19:50

I D:KennyAss
邮箱:1091192337@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

ps:过程有些简单,考虑到小朋友有很好的动手能力给予通过,期待未来可以有更优秀的分享。

KennyAss 发表于 2019-2-10 20:03

新人报道

lu_ 发表于 2019-2-11 21:52

同是高一,为何楼主这么优秀。以后跟着楼主如何{:301_1001:}

chengerxinCHENG 发表于 2019-3-14 19:53

文章挺好的&#128516;

fuckyoua 发表于 2019-3-15 11:33

KennyAss 发表于 2019-2-10 20:03
新人报道

see ass go玩家?
页: [1]
查看完整版本: 申请会员ID:KennyAss【申请通过】