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


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


 



 

















推荐阅读
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
  • 使用EF Core在.Net Core控制台应用中操作SQLite数据库
    本文介绍如何利用Visual Studio 2019和Windows 10环境,通过Entity Framework Core(EF Core)实现对SQLite数据库的读写操作。项目源代码可从百度网盘下载。 ... [详细]
  • DropBlock:一种卷积网络的正则化技术
    本文详细探讨了DropBlock这一正则化方法在卷积神经网络中的应用与效果。通过结构化的dropout方式,即在特征图中连续区域内的单元同时被丢弃,DropBlock有效解决了传统dropout在卷积层应用时效果不佳的问题。更多理论分析及其实现细节可参考原文链接。 ... [详细]
  • Java 中静态和非静态嵌套类的区别 ... [详细]
  • 本文详细介绍了Keycloak框架中UserRepresentation类下的isEnabled()方法的功能与应用,并通过多个实际代码示例说明其在用户管理中的具体实现。 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 本文详细介绍了Python的multiprocessing模块,该模块不仅支持本地并发操作,还支持远程操作。通过使用multiprocessing模块,开发者可以利用多核处理器的优势,提高程序的执行效率。 ... [详细]
  • 搜索引擎架构设计
    本文详细介绍了搜索引擎的主要组成部分,包括爬虫模块、索引模块和搜索模块。其中,索引模块采用了高效的二元分词技术进行数据存储,而搜索模块则基于ASP.NET框架实现了一个用户友好的界面和高效的搜索算法。 ... [详细]
  • 在现代移动应用开发中,尤其是iOS应用,处理来自服务器的JSON数据是一项基本技能。无论是使用Swift还是PHP,有效地解析和利用JSON数据对于提升用户体验至关重要。本文将探讨如何在Swift中优雅地处理JSON,以及PHP中处理JSON的一些技巧。 ... [详细]
  • 本文探讨了在使用Apache Flink向Kafka发送数据过程中遇到的事务频繁失败问题,并提供了详细的解决方案,包括必要的配置调整和最佳实践。 ... [详细]
  • 本文详细介绍了Python中的流程控制与条件判断技术,包括数据导入、数据变换、统计描述、假设检验、可视化以及自定义函数的创建等方面的内容。 ... [详细]
  • 本文探讨了在Windows 8系统中使用C#语言开发的小工具遇到的进程无法强制终止的问题,包括可能的原因及解决方案。 ... [详细]
  • 本文介绍了一种算法,用于在一个给定的二叉树中找到一个节点,该节点的子树包含最大数量的值小于该节点的节点。如果存在多个符合条件的节点,可以选择任意一个。 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
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社区 版权所有