热门标签 | 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 }


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


 



 

















推荐阅读
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • C# LiNQ 查询 join连接
    C# LiNQ 查询 join连接 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
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社区 版权所有