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


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


 



 

















推荐阅读
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
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社区 版权所有