热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#爬虫Fiddler插件开发自动生成代码

哈喽^_^一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成












  哈喽^_^


  一般我们在编写网页爬虫的时候经常会使用到Fiddler 这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成封包代码就尤为重要了(其实之前已经有第三方的插件了,自己编写主要是为了适配自定义的http请求模块)!


 首先注册拖拽事件 允许直接在Fiddler Session列表中拖入Session到插件界面



1         private void TrCode_Load(object sender, System.EventArgs e)
2 {
3 AllowDrop = true;
4 DragDrop += TrCode_DragDrop;
5 DragOver += TrCode_DragOver;
6 }




 1         private void TrCode_DragOver(object sender, DragEventArgs e)
2 {
3 e.Effect = e.Data.GetDataPresent("Fiddler.Session[]") ? DragDropEffects.Copy : DragDropEffects.None;
4 }
5
6 private void TrCode_DragDrop(object sender, DragEventArgs e)
7 {
8 //获取拖入的Session数据 数据格式Fiddler.Session[]
9 var data = (Session[])e.Data.GetData("Fiddler.Session[]");
10 if (_sessiOns== data)
11 {
12 return;
13 }
14 _sessiOns= data;
15 if ((data == null)) return;
16 if (data.Length > 1)
17 {
18 AnalyticSession(data);
19 }
20 else
21 {
22 //多个也只获取第一个进行解析
23 AnalyticSession(data[0]);
24 }
25 }


获取到Session了 开始解析 并且生成代码 (生成的代码可以根据自己的情况去自定义 )



  1         /// 
2 /// 生成TrCode
3 ///

4 ///
5 ///
6 private void GenerateTrCode(Session session, bool addMethodName = false)
7 {
8
9 var stringBuilder = new StringBuilder(500);
10 string uri;
11 if (cbxGetPlaceholder.Checked && session.fullUrl.Split(\'?\').Length > 1)
12 {
13 var str = session.fullUrl;
14 var getUrl = str.Split(\'?\');
15 if (getUrl.Length == 2)
16 {
17 str = getUrl[1];
18 str = GetUrlParameters(str);
19 }
20 uri = getUrl[0] + "?" + str;
21 }
22 else
23 {
24 uri = session.fullUrl;
25 }
26 if (!addMethodName)
27 {
28 var strParameter = string.Empty;
29 var list = new List();
30 if (cbxPostPlaceholder.Checked)
31 {
32 list.AddRange(_listParameterInfo.Where(i => i.SubmitMethod == "Post"));
33 }
34 if (cbxGetPlaceholder.Checked)
35 {
36 list.AddRange(_listParameterInfo.Where(i => i.SubmitMethod == "Get"));
37 }
38 foreach (var parameter in list)
39 {
40 strParameter += $",string {parameter.ParameterName}";
41 }
42 if (!string.IsNullOrWhiteSpace(strParameter))
43 {
44 strParameter = strParameter.Remove(0, 1);
45 }
46 stringBuilder.AppendLine($@"
47 public void Submit({strParameter})
48 {{");
49 }
50 stringBuilder.AppendLine($"var submitType = new SubmitType();");
51 stringBuilder.AppendLine($"submitType.Url=\"{uri}\";");
52 if (session.RequestMethod == "POST")
53 {
54 if (session.RequestBody.Length > 0)
55 {
56 string submitString;
57 if (cbxPostPlaceholder.Checked)
58 {
59 var str = Uri.UnescapeDataString(Encoding.UTF8.GetString(session.RequestBody));
60 submitString = GetUrlParameters(str);
61 stringBuilder.AppendLine($"submitType.SubmitString = $\"{submitString}\";");
62 }
63 else
64 {
65 submitString = Uri.UnescapeDataString(Encoding.UTF8.GetString(session.RequestBody));
66 //字符 转义
67 submitString = submitString.Replace("{", "{{");
68 submitString = submitString.Replace("}", "}}");
69 submitString = submitString.Replace("\"", "\\\"");
70 stringBuilder.AppendLine($"submitType.SubmitString = \"{submitString}\";");
71 }
72 }
73 }
74 var nameValue = new NameValueCollection();
75 var addedCOntentType= false;
76 foreach (var headers in session.RequestHeaders)
77 {
78 switch (headers.Name)
79 {
80 case "Accept":
81 stringBuilder.AppendLine($"submitType.Accept = \"{headers.Value}\";");
82 break;
83 case "Accept-Encoding":
84 stringBuilder.AppendLine($"submitType.AcceptEncoding = \"{headers.Value}\";");
85 break;
86 case "Accept-Language":
87 stringBuilder.AppendLine($"submitType.AcceptLanguage = \"{headers.Value}\";");
88 break;
89 case "User-Agent":
90 stringBuilder.AppendLine($"submitType.UserAgent = \"{headers.Value}\";");
91 break;
92 case "Content-Type":
93 addedCOntentType= true;
94 stringBuilder.AppendLine($"submitType.COntentType= \"{headers.Value}\";");
95 break;
96 case "Referer":
97 stringBuilder.AppendLine($"submitType.Referer = \"{headers.Value}\";");
98 break;
99 case "Content-Length":
100 break;
101 case "Host":
102 break;
103 case "Connection":
104 break;
105 case "COOKIE":
106 stringBuilder.AppendLine(checkBoxCOOKIE.Checked
107 ? "submitType.COOKIEs = \"{COOKIEs}\";"
108 : $"submitType.COOKIEs = \"{headers.Value}\";");
109 break;
110 case "Origin":
111 stringBuilder.AppendLine($"submitType.Origin = \"{headers.Value}\";");
112 break;
113 case "Cache-Control":
114 stringBuilder.AppendLine($"submitType.CacheCOntrol= \"{headers.Value}\";");
115 break;
116 case "If-Modified-Since":
117 stringBuilder.AppendLine("//浏览器端缓存页面的最后修改时间,一般可以不使用,使用请使用上一个响应的结果");
118 stringBuilder.AppendLine("//submitType.IfModifiedSince = \"\";");
119 break;
120 default:
121 nameValue.Add(headers.Name, headers.Value);
122 break;
123 }
124 }
125 //如果不包含Content-Type 则给空
126 if (!addedContentType)
127 {
128 stringBuilder.AppendLine("submitType.COntentType= string.Empty;");
129 }
130 if (checkBoxProxy.Checked)
131 {
132
133 stringBuilder.AppendLine("submitType.AddProxyUri(runDataModel.ProxyUri);");
134 }
135 stringBuilder.AppendLine("submitType.UseCOOKIEHelper = true;");
136 foreach (var key in nameValue.AllKeys)
137 {
138 stringBuilder.AppendLine($"submitType.RequestHeaders.Add(\"{key}\",\"{nameValue[key]}\");");
139 }
140
141 if (cbxImg.Checked)
142 {
143 var str = $@"
144 var image = {(session.RequestMethod == "POST" ? "Post" : "Get")}.Image(submitType);
145 var validateCode = new ValidateCode {{ Image = image,COOKIEs = submitType.ReturnCOOKIEs }};
146 return validateCode;
147 ";
148 stringBuilder.AppendLine(str);
149 }
150 else
151 {
152 stringBuilder.AppendLine(session.RequestMethod == "POST" ? "var html = Post.Html(submitType);" : "var html = Get.Html(submitType);");
153
154 }
155 if (!addMethodName)
156 {
157 stringBuilder.AppendLine(@"
158 }");
159 }
160 txtCode.Text = stringBuilder.ToString();
161 }


到这里就可以直接通过拖拽生成代码了


 



 

















推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
author-avatar
狗血饭团联_367
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有