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 ...
随机推荐
- latex 常用自定义_随时更新
1.向量定义 代码: \newcommand{\vector}[1]{${#1}_1,{#1}_2,\cdots,{#1}_n$} 效果: a1,a2,...,an
- python对象的for迭代实现
第一种:__iter__ 实现__iter__的对象,是可迭代对象.__iter__方法可以直接封装一个迭代器,从而实现for循环 class A: def __init__(self): self. ...
- CentOS7安装OpenLDAP+MySQL+PHPLDAPadmin
安装环境:CentOS 7 1.安装和设置数据库 在CentOS7下,默认安装的数据库为MariaDB,属于MySQL数据库的一个分支,所以我还是使用了MariaDB.安装命令为: [root@loc ...
- LeetCode刷题:第一题 两数之和
从今天开始刷LeetCode 第一题:两数之和 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种 ...
- day_11函数的形参与实参
昨天讲了函数的定义和简单分类 1:什么是函数:具体特定功能的代码快 --特定功能代码作为一个整体,并给该整体命名,就是函数. 函数的优点: 1:减少代码的冗余 2:结构清晰,可读性强 3:具有复用性, ...
- Centos6.5 安装MYSQL 5.5 -5.6.-5.7 一键yum快速安装 ,初始配置
Centos6.5 安装MYSQL 5.5 ---5.6---5.7 一键yum快速安装 ,初始配置 第一步:安装mysql-5.5---- 5.6 ---- 5.7的yum源 [root@sv03 ...
- 【转载】sql monitor
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27067062/viewspace-2129635/ SQL Monitor Report 1. SQL Monit ...
- C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)
前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ...
- MySQL--MHA与GTID
##==========================================## MySQL 5.6版本引入GTID来解决主从切换时BINLOG位置点难定位的问题,MHA从0.56版本开始 ...
- Windows 10 IoT Core 17127 for Insider 版本更新
昨天,微软发布了Windows 10 IoT Core 17127 for Insider 版本更新,本次更新只修正了一些Bug,没有发布新的特性.相比于17120,修复了一个已知的问题. 一些已知的 ...