C#爬虫----Fiddler 插件开发 自动生成代码
哈喽^_^
一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成封包代码就尤为重要了(其实之前已经有第三方的插件了,自己编写主要是为了适配自定义的http请求模块)!
首先注册拖拽事件 允许直接在Fiddler Session列表中拖入Session到插件界面
private void TrCode_Load(object sender, System.EventArgs e)
{
AllowDrop = true;
DragDrop += TrCode_DragDrop;
DragOver += TrCode_DragOver;
}
private void TrCode_DragOver(object sender, DragEventArgs e)
{
e.Effect = e.Data.GetDataPresent("Fiddler.Session[]") ? DragDropEffects.Copy : DragDropEffects.None;
} private void TrCode_DragDrop(object sender, DragEventArgs e)
{
//获取拖入的Session数据 数据格式Fiddler.Session[]
var data = (Session[])e.Data.GetData("Fiddler.Session[]");
if (_sessions == data)
{
return;
}
_sessions = data;
if ((data == null)) return;
if (data.Length > )
{
AnalyticSession(data);
}
else
{
//多个也只获取第一个进行解析
AnalyticSession(data[]);
}
}
获取到Session了 开始解析 并且生成代码 (生成的代码可以根据自己的情况去自定义 )
/// <summary>
/// 生成TrCode
/// </summary>
/// <param name="session"></param>
/// <param name="addMethodName"></param>
private void GenerateTrCode(Session session, bool addMethodName = false)
{ var stringBuilder = new StringBuilder();
string uri;
if (cbxGetPlaceholder.Checked && session.fullUrl.Split('?').Length > )
{
var str = session.fullUrl;
var getUrl = str.Split('?');
if (getUrl.Length == )
{
str = getUrl[];
str = GetUrlParameters(str);
}
uri = getUrl[] + "?" + str;
}
else
{
uri = session.fullUrl;
}
if (!addMethodName)
{
var strParameter = string.Empty;
var list = new List<ParameterInfo>();
if (cbxPostPlaceholder.Checked)
{
list.AddRange(_listParameterInfo.Where(i => i.SubmitMethod == "Post"));
}
if (cbxGetPlaceholder.Checked)
{
list.AddRange(_listParameterInfo.Where(i => i.SubmitMethod == "Get"));
}
foreach (var parameter in list)
{
strParameter += $",string {parameter.ParameterName}";
}
if (!string.IsNullOrWhiteSpace(strParameter))
{
strParameter = strParameter.Remove(, );
}
stringBuilder.AppendLine($@"
public void Submit({strParameter})
{{");
}
stringBuilder.AppendLine($"var submitType = new SubmitType();");
stringBuilder.AppendLine($"submitType.Url=\"{uri}\";");
if (session.RequestMethod == "POST")
{
if (session.RequestBody.Length > )
{
string submitString;
if (cbxPostPlaceholder.Checked)
{
var str = Uri.UnescapeDataString(Encoding.UTF8.GetString(session.RequestBody));
submitString = GetUrlParameters(str);
stringBuilder.AppendLine($"submitType.SubmitString = $\"{submitString}\";");
}
else
{
submitString = Uri.UnescapeDataString(Encoding.UTF8.GetString(session.RequestBody));
//字符 转义
submitString = submitString.Replace("{", "{{");
submitString = submitString.Replace("}", "}}");
submitString = submitString.Replace("\"", "\\\"");
stringBuilder.AppendLine($"submitType.SubmitString = \"{submitString}\";");
}
}
}
var nameValue = new NameValueCollection();
var addedContentType = false;
foreach (var headers in session.RequestHeaders)
{
switch (headers.Name)
{
case "Accept":
stringBuilder.AppendLine($"submitType.Accept = \"{headers.Value}\";");
break;
case "Accept-Encoding":
stringBuilder.AppendLine($"submitType.AcceptEncoding = \"{headers.Value}\";");
break;
case "Accept-Language":
stringBuilder.AppendLine($"submitType.AcceptLanguage = \"{headers.Value}\";");
break;
case "User-Agent":
stringBuilder.AppendLine($"submitType.UserAgent = \"{headers.Value}\";");
break;
case "Content-Type":
addedContentType = true;
stringBuilder.AppendLine($"submitType.ContentType = \"{headers.Value}\";");
break;
case "Referer":
stringBuilder.AppendLine($"submitType.Referer = \"{headers.Value}\";");
break;
case "Content-Length":
break;
case "Host":
break;
case "Connection":
break;
case "Cookie":
stringBuilder.AppendLine(checkBoxCookie.Checked
? "submitType.Cookies = \"{cookies}\";"
: $"submitType.Cookies = \"{headers.Value}\";");
break;
case "Origin":
stringBuilder.AppendLine($"submitType.Origin = \"{headers.Value}\";");
break;
case "Cache-Control":
stringBuilder.AppendLine($"submitType.CacheControl = \"{headers.Value}\";");
break;
case "If-Modified-Since":
stringBuilder.AppendLine("//浏览器端缓存页面的最后修改时间,一般可以不使用,使用请使用上一个响应的结果");
stringBuilder.AppendLine("//submitType.IfModifiedSince = \"\";");
break;
default:
nameValue.Add(headers.Name, headers.Value);
break;
}
}
//如果不包含Content-Type 则给空
if (!addedContentType)
{
stringBuilder.AppendLine("submitType.ContentType = string.Empty;");
}
if (checkBoxProxy.Checked)
{ stringBuilder.AppendLine("submitType.AddProxyUri(runDataModel.ProxyUri);");
}
stringBuilder.AppendLine("submitType.UseCookieHelper = true;");
foreach (var key in nameValue.AllKeys)
{
stringBuilder.AppendLine($"submitType.RequestHeaders.Add(\"{key}\",\"{nameValue[key]}\");");
} if (cbxImg.Checked)
{
var str = $@"
var image = {(session.RequestMethod == "POST" ? "Post" : "Get")}.Image(submitType);
var validateCode = new ValidateCode {{ Image = image,Cookies = submitType.ReturnCookies }};
return validateCode;
";
stringBuilder.AppendLine(str);
}
else
{
stringBuilder.AppendLine(session.RequestMethod == "POST" ? "var html = Post.Html(submitType);" : "var html = Get.Html(submitType);"); }
if (!addMethodName)
{
stringBuilder.AppendLine(@"
}");
}
txtCode.Text = stringBuilder.ToString();
}
到这里就可以直接通过拖拽生成代码了

C#爬虫----Fiddler 插件开发 自动生成代码的更多相关文章
- Eclipse 使用mybatis generator插件自动生成代码
Eclipse 使用mybatis generator插件自动生成代码 标签: mybatis 2016-12-07 15:10 5247人阅读 评论(0) 收藏 举报 .embody{ paddin ...
- mybatis generator maven插件自动生成代码
如果你正为无聊Dao代码的编写感到苦恼,如果你正为怕一个单词拼错导致Dao操作失败而感到苦恼,那么就可以考虑一些Mybatis generator这个差价,它会帮我们自动生成代码,类似于Hiberna ...
- java如何在eclipse编译时自动生成代码
用eclipse写java代码,自动编译时,如何能够触发一个动作,这个动作是生成本项目的代码,并且编译完成后,自动生成的代码也编译好了, java编辑器中就可以做到对新生成的代码的自动提示? 不生成代 ...
- MyBatis自动生成代码示例
在项目中使用到mybatis时,都会选择自动生成实体类,Mapper,SqlMap这三个东东. 手头上在用的又不方便,找了下网上,其实有很多文章,但有些引用外部文件时不成功,也不方便,所以重新整理了下 ...
- MyBatis使用Generator自动生成代码
MyBatis中,可以使用Generator自动生成代码,包括DAO层. MODEL层 .MAPPING SQL映射文件. 第一步: 配置好自动生成代码所需的XML配置文件,例如(generator. ...
- mybatis 自动生成代码(mybatis generator)
pom.xml 文件配置 引入 mybatis generator <properties> <mysql.connector.version>5.1.44</mysql ...
- ButterKnife的使用以及不能自动生成代码问题的解决
ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又 ...
- 【MyBatis】MyBatis自动生成代码查询之爬坑记
前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...
- mybatis-generator : 自动生成代码
[参考文章]:mybatis generator自动生成代码时 只生成了insert 而没有其他 [参考文章]:Mybatis Generator最完整配置详解 1. pom <plugin&g ...
随机推荐
- Windows平台最方便最易用的法语输入法
原文:http://wenwen.sogou.com/z/q1700007921.htm 对于XP,在“控制面板”中选择“输入法区域设置”,单击“更改”,出现一个“设置”框:选择“添加”,然后选择“法 ...
- admob sdk
https://support.google.com/admob/answer/2993059?hl=zh-Hans admob sample http://china.inmobi.com/sdk/ ...
- JavaScript基础学习笔记整理
1.关于JS: (1)脚本语言——不需要编译的语言(常见有cmd,t-sql)----解释性语言; (2)动态类型的语言——1.代码只有执行到那个位置才知道那个变量中存储的是什么 2.对象中没有某个属 ...
- autium designer 软件使用:
1mil=0.0254mm 1,英文输入法A建,对齐方式. 2,焊盘,过孔区别 作为安装孔时,焊盘和过孔在内孔覆铜上有区别,焊盘的内控通过设置属性可以没有覆铜,而过孔不可以.如果选中焊盘属性Adv ...
- jquery validate 校验使用总结
一.jquery.validator表单验证id和name问题 因为后台是struts,表单提交,所有输入框的值保存在name=对象.名字中,而jquery.validator表单验证用的是name, ...
- lua-01
ctrl + shift + L 多行编辑 ctrl + D 继续向下选中下一个相同的文本 Alt + F3 选中所有相同所选中德文本 =>Lua的快捷键 回调代码: function fact ...
- Javascript高级编程学习笔记(33)—— 客户端检测(2)怪癖检测
怪癖检测 和能力检测类似,但其目标不同 能力检测的目的是判断浏览器支不支持某种能力 而怪癖检测的目的是判断浏览器是否存在某些缺陷 这种时候需要我们执行一段代码来判断浏览器是否有这样的缺陷 或者说是怪癖 ...
- Python学习笔记【第十篇】:Python面向对象进阶
保护对象的属性 如果有一个对象,当需要对其进行修改属性时,有2种方法 对象名.属性名 = 数据 ---->直接修改 对象名.方法名() ---->间接修改 为了更好的保存属性安全,即不能随 ...
- Cloud-Platform部署学习
1. Cloud-Platform部署学习 1.1. 介绍 Cloud-Platform是国内首个基于Spring Cloud微服务化开发平台,核心技术采用Spring Boot2以及Spring C ...
- django(2.1) url
函数path() 1参数route:是一个匹配url的准则,这些准则不会匹配get或者post参数或者域名. 2参数view:当django找到了一个匹配准则,就会调用这个特定的视图函数,并传入一个h ...