CefSharp的簡單應用,制作自動學習視頻軟件(基於Chromium)


CefSharp在NuGet的簡介是“The CefSharp Chromium-based browser component”,機翻的意思就是“基於Cefsharp Chromium的瀏覽器組件”

請注意本文不會有太多功能的詳細介紹,只有實現相關需求的基本功能

請注意本次使用CefSharp版本為57.0.0,最新版本可能相關用法已經不適用

播放視頻需安裝相關Flash軟件才能播放

 

本次編寫要實現的主要功能是

1:播放視頻,

    (本次打開指定網址默認會播放視頻)

2:自動跳轉下一條視頻,

    (學習進度100%時跳轉下一個網址)

3:自動點擊驗證

    (執行JavaScript代碼)

成品軟件界面如下

一:添加相關引用,NuGet 搜索安裝 CefSharp.WinForms,CefSharp.Common(本次使用版本為57.0.0)

 

二:項目屬性中平台要進行設置

三:編寫代碼

      具體實現方式是,有兩個窗口,一個瀏覽學習列表頁(獲取內頁學習頁面鏈接),另一個瀏覽內頁學習頁面進行學習

  CefSharp.WinForms.ChromiumWebBrowser browser = null;

  CefSharp.WinForms.ChromiumWebBrowser browserChild = null;

public Form1()
        {
            InitializeComponent();
            //必須進行初始化,否則出不來頁面啦。
            CefSharp.Cef.Initialize();

            //實例化控件 即課程列表頁查看和獲取具體學習頁面路徑
            browser = new CefSharp.WinForms.ChromiumWebBrowser("http://xxx.xxx.cn");
            //設置停靠方式
            browser.Dock = DockStyle.Fill;
            //加入到當前窗體中
            this.tabControl1.TabPages[0].Controls.Add(browser);
            //綁定新窗口打開事件
            browser.LifeSpanHandler = new NewWindowCreatedEventHandler();
            //browser.LoadHandler = new NewLoadHandler();
            //browser.FrameLoadEnd += Browser_FrameLoadEnd;

            //實例化子控件 即學習頁面
            browserChild = new CefSharp.WinForms.ChromiumWebBrowser("about:blank");
            //設置停靠方式
            browserChild.Dock = DockStyle.Fill;
            //加入到當前窗體中
            this.tabControl1.TabPages[1].Controls.Add(browserChild);
            Control.CheckForIllegalCrossThreadCalls = false;//防止出現  線程間操作無效:
        }
        /// <summary>
        /// 打開新窗口事件處理(在當前瀏覽器窗口打開)
        /// </summary>
        internal class NewWindowCreatedEventHandler : ILifeSpanHandler
        {
            public bool DoClose(IWebBrowser browserControl, IBrowser browser)
            {
                return false;
            }

            public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
            {

            }

            public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
            {

            }

            public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl,
    string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures,
    IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
            {
                newBrowser = null;
                var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
                chromiumWebBrowser.Load(targetUrl);
                return true; //Return true to cancel the popup creation copyright by codebye.com.
            }
        }

 執行JavaScript代碼方法

string BrowserEvaluateScriptAsync(string scriptStr)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("function tempFunction() {");
            sb.AppendLine(scriptStr);
            sb.AppendLine("}");
            sb.AppendLine("tempFunction();");
            string resultStr = "";
            try
            {
                var task = browser.GetBrowser().GetFrame(browser.GetBrowser().GetFrameNames()[0]).EvaluateScriptAsync(sb.ToString());
                task.ContinueWith(t =>
                {
                    if (!t.IsFaulted)
                    {
                        var response = t.Result;
                        if (response.Success == true)
                        {
                            if (response.Result != null)
                            {
                                resultStr = response.Result.ToString();
                            }
                        }
                    }
                }, TaskScheduler.FromCurrentSynchronizationContext());
                return resultStr;
            }
            catch (Exception ex)
            {
                return resultStr;
            }
        }

 獲取內頁學習頁面鏈接代碼,實現方式是獲取頁面的html然后用正則表達式去匹配當前頁的鏈接

//獲取課程列表
        private void GetDataList_Click(object sender, EventArgs e)
        {
            Log("獲取課程列表");
            if (browser != null)
            {
                try
                {
                    StringBuilder sb = new StringBuilder();
                    sb.AppendLine("function tempFunction() {");
                    sb.AppendLine(" return document.body.innerHTML; ");
                    sb.AppendLine("}");
                    sb.AppendLine("tempFunction();");
                    var task = browser.GetBrowser().GetFrame(browser.GetBrowser().GetFrameNames()[0]).EvaluateScriptAsync(sb.ToString());
                    task.ContinueWith(t =>
                    {
                        if (!t.IsFaulted)
                        {
                            var response = t.Result;
                            if (response.Success == true)
                            {
                                if (response.Result != null)
                                {
                                    string resultStr = response.Result.ToString();
                                    Regex r = new Regex("(/knowledge/document/[\\S]*.html)|(/knowledge/video/[\\S]*.html)|(/package/video/[\\S]*.html)|(/package/document/[\\S]*.html)|(/knowledge/scorm/[\\S]*.html)|(/package/scorm/[\\S]*.html)|(/package/ebook/[\\S]*.html)");//構造表達式package/scorm
                                        MatchCollection matches = r.Matches(resultStr);
                                    foreach (Match match in matches)
                                    {
                                        string word = match.Groups["word"].Value;
                                        int index = match.Index;
                                        richTextBox1.AppendText(match.Value.Replace("\"", ""));
                                        richTextBox1.AppendText("\r\n");
                                    }
                                    SetConfig(LastHistroyDataList, richTextBox1.Text);
                                    Log("獲取課程列表成功!(添加" + matches.Count.ToString() + "列數據)");
                                    tabControl1.SelectedIndex = 2;
                                }
                            }
                        }
                    }, TaskScheduler.FromCurrentSynchronizationContext());
                }
                catch (Exception ex)
                {
                    Log("獲取課程列表失敗!(js執行失敗)");
                }
            }
            else
            {
                Log("獲取課程列表失敗!(瀏覽器獲取失敗)");
            }
        }

 接下來定時判斷具體學習頁面是否到達100%的進度,如果達到100%的進度,瀏覽下一個鏈接即可

//判斷頁面是否顯示 “已經完成學習”
        string PanDuanWanCheng()
        {
            if (browserChild != null)
            {
                try
                {
                    StringBuilder sb = new StringBuilder();
                    sb.AppendLine("function tempFunction() {");
                    sb.AppendLine("return document.getElementById('ScheduleText').innerText;");
                    sb.AppendLine("}");
                    sb.AppendLine("tempFunction();");
                    string resultStr = "";
                    var task = browserChild.GetBrowser().GetFrame(browserChild.GetBrowser().GetFrameNames()[0]).EvaluateScriptAsync(sb.ToString());
                    task.ContinueWith(t =>
                    {
                        if (!t.IsFaulted)
                        {
                            var response = t.Result;
                            if (response.Success == true)
                            {
                                if (response.Result != null)
                                {
                                    resultStr = response.Result.ToString();
                                    if (resultStr == "100%")
                                    {
                                        string nowLearnTitle = GetNowLearnTitle();
                                        //Log("課程已完成!" + browserChild.Url.ToString() + "(" + nowLearnTitle + ")");
                                        //完成操作
                                        if (learnWithDataList)
                                        {
                                            BroserChildStarWithDataList();
                                        }
                                        return "1";
                                    }
                                }
                            }
                        }
                        return "0";
                    }, TaskScheduler.FromCurrentSynchronizationContext());
                }
                catch (Exception ex)
                { }
            }
            return "0";
        }

 


免責聲明!

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



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