黃聰:C#使用GeckoFx攔截監控Http數據


找了整整兩天,在大海撈針之后,終於在上古代碼中找到了一個可用的。。。。

可以用喜極而泣來形容測試有效之后的心情!!!

跟cefsharp相比geckofx最大的優點就是模式更接近於IE,包括node、xml、xpath以及單獨設置cookie等。但是資料、問答等實在是太古老太古老了。

如果已入坑geckofx的朋友,請一定要記住,遇到問題先不用去滿世界搜索,請第一時間去官網的 Issues 版塊搜索關鍵字。

具體方法:https://bitbucket.org/geckofx/ -> 選擇版本 ->左側點擊 Issues -> 右側 Find Issues -> 右鍵谷歌翻譯網頁

最好每個版本里面都進去搜一下,我就是在上古時代的29.0里搜到的答案

文章原地址:https://bitbucket.org/geckofx/geckofx-29.0/issues/197/getting-content-on-observer-response

一、攔截響應:

1、具體代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Gecko.Net;
using Gecko.Observers;

namespace GeckofxWebBrowser.GeckofxExtension
    {
    public class MyObserver : BaseHttpModifyRequestObserver
        {
        public delegate void TicketLoadedEventHandler(HttpChannel p_HttpChannel, object sender, System.EventArgs e);
        /// <summary>
        /// 處理事件委托
        /// </summary>
        public event TicketLoadedEventHandler TicketLoadedEvent;
        /// <summary>
        /// 需要攔截的網址,只要獨一無二的關鍵詞既可
        /// </summary>
        public List<string> targetUrls = new List<string>() { };
        protected override void ObserveRequest(HttpChannel p_HttpChannel)
            {
            if (p_HttpChannel != null)
                {
                if (targetUrls.Any(s => p_HttpChannel.Uri.AbsoluteUri.Contains(s)))
                    {
                    TraceableChannel oTC = p_HttpChannel.CastToTraceableChannel();
                    StreamListenerTee oStream = new StreamListenerTee();
                    oStream.Completed += (sender, e) => TicketLoadedEvent(p_HttpChannel, sender, e);
                    oTC.SetNewListener(oStream);
                    }
                }
            }






        //********************* TicketLoadedEvent 事件處理參考 *********************
        /// <summary>
        /// 主要是如何讀取response數據,p_HttpChannel內可獲取url、header等,header內應該也包含setcookie,沒去測試
        /// </summary>
        /// <param name="p_HttpChannel"></param>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //private void MyObserver_TicketLoadedEvent(HttpChannel p_HttpChannel, object sender, EventArgs e)
        //    {
        //    if (sender is StreamListenerTee)
        //        {
        //        StreamListenerTee oStream = sender as StreamListenerTee;
        //        byte[] aData = oStream.GetCapturedData();
        //        string sData = Encoding.UTF8.GetString(aData);
        //        }
        //    }


        }
    }
2、使用方法:將攔截類加入到觀察器

            MyObserver MyObs = new MyObserver();
            MyObs.TicketLoadedEvent += MyObs_TicketLoadedEvent;//如何處理捕捉到的response
            MyObs.targetUrls = new List<string>() {“baidu.com”,“163.com” };//添加要攔截的url關鍵詞
            ObserverService.AddObserver(MyObs);//添加觀察器
           
        private void MyObs_TicketLoadedEvent(Gecko.Net.HttpChannel p_HttpChannel, object sender, EventArgs e)
            {
            if (sender is StreamListenerTee)
                {
                StreamListenerTee oStream = sender as StreamListenerTee;
                byte[] aData = oStream.GetCapturedData();
                string sData = Encoding.UTF8.GetString(aData);
                }
            }

二、如果要攔截請求

//在初始化的時候先設置這兩樣
browser.UseHttpActivityObserver = true;
browser.ObserveHttpModifyRequest += Browser_ObserveHttpModifyRequest;//
private void Browser_ObserveHttpModifyRequest(object sender, GeckoObserveHttpModifyRequestEventArgs e)
{
//在這里通過 e 的各項屬性做具體處理,可以判斷url,可以判斷標頭、包括post內容等
}

---------------------
作者:jwb7832007
來源:CSDN
原文:https://blog.csdn.net/jwb7832007/article/details/80884128
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM