1. 程式人生 > >C#爬蟲----Fiddler 插件開發 自動生成代碼

C#爬蟲----Fiddler 插件開發 自動生成代碼

ner pac nec 包含 def 不包含 格式 color 緩存

  哈嘍^_^

  一般我們在編寫網頁爬蟲的時候經常會使用到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         /// <summary>
  2         /// 生成TrCode
  3         /// </summary>
  4         /// <param name="session"></param>
  5         /// <param name="addMethodName"></param>
  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<ParameterInfo>();
 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         }

到這裏就可以直接通過拖拽生成代碼了

技術分享圖片

C#爬蟲----Fiddler 插件開發 自動生成代碼