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 ...
随机推荐
- c++实现对windwos 下socket 的封装(实现封包及拆包处理)
SuperSocket.h #pragma once #include<string> #include<iostream> #include <WINSOCK2.H&g ...
- gitlab 之 cicd
1.使用 docker 安装 gitlab docker run -d --hostname gitlab \ --env GITLAB_OMNIBUS_CONFIG="ex ...
- java(二)Web部分
2.1.1讲一下http get和post请求的区别? GET和POST请求都是http的请求方式,用户通过不同的http的请求方式完成对资源(url)的不同操作.GET,POST,PUT,DELET ...
- Eclipse下用NDK编译生成so文件
我们在安装环境的时候安装了NDK,可以在eclipse下直接生成so文件.NDK的压缩包里面自带了一些sample工程,NDK的文件直接解压到某个目录下即可. 第一次生成so文件的时候,我们先使用 ...
- 虚拟机找不到/mnt/hgfs挂载目录——debian与 vmware
如果在安装好 VMware Tools 并在设置里面设定好共享目录之后仍然找不到 /mnt/hgfs 默认挂载目录,那么尝试以下步骤: 1. 确认VMware Tools 和共享目录设定已经完成: 2 ...
- VSCode插件开发全攻略(五)跳转到定义、自动补全、悬停提示
更多文章请戳VSCode插件开发全攻略系列目录导航. 跳转到定义 跳转到定义其实很简单,通过vscode.languages.registerDefinitionProvider注册一个provide ...
- 通过Weeman+Ettercap配合拿下路由器管理权限
通过Weeman+Ettercap配合拿下路由器管理权限 本文转自>>>i春秋学院 本篇文章主要介绍如何在接入无线网络后如何拿到路由器的管理权限,至于如何得到路由器连接密码可以参考 ...
- 关键字提取算法TF-IDF
在文本分类的学习过程中,在“如何衡量一个关键字在文章中的重要性”的问题上,遇到了困难.在网上找了很多资料,大多数都提到了这个算法,就是今天要讲的TF-IDF. 总起 TF-IDF,理解起来相当简单,他 ...
- SpringMVC框架二:SpringMVC与MyBatis整合
下面整合SpringMVC和MyBatis框架,并做一个小案例 创建数据库springmvc,并创建两张表,加入一些数据: 两张表:商品表,用户表 CREATE DATABASE springmvc; ...
- redux源码学习笔记 - combineReducers
上一篇有了解到,reducer函数的两个为:当前state和此次dispatch的action. state的结构是JavaScript对象,每个key都可以代表着不同意义的数据.比如说 { list ...