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

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

能夠用喜極而泣來形容測試有效以後的心情!!!cookie

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

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

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

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

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

1、攔截響應:.net

一、具體代碼:翻譯

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);
        //        }
        //    }


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

            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);
                }
            }

2、若是要攔截請求

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

相關文章
相關標籤/搜索