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

原文地址:https://www.cnblogs.com/leiyongbo/p/10387182.html

时间: 2024-10-10 02:53:46

CefSharp的简单应用,制作自动学习视频软件(基于Chromium)的相关文章

陈松松:学习视频制作之前,新手经常有疑问的7个问题

这是我写的第77篇原创视频营销文章 陈松松,6年视频营销实战经验 大家一听到视频制作, 都感觉老难了,也不知道从哪里知道的,还是凭自己的感觉,欢迎留言! 其实视频制作真的特别简单, 哪怕你对电脑懂的不是很多,一样可以学会,在你学习之前不要特意的去躲避它,都能学会. 在你没有接触之前, 不要轻易下结论, 也不要凭自己的感觉说这个难,说那个难, 那样你会错过很多机会. 只有自己真正的使用了才最清楚. 今天跟一位朋友私聊, 聊着聊着就聊到了视频剪辑方面, 虽然只聊了几句, 但是一下子就显现出刚开始接触

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

绕过超星学习通鼠标移开自动暂停视频的方法

绕过超星学习通鼠标移开自动暂停视频的方法 说明 原理:通过开发者模式删除鼠标监听事件 安全性:本方法不会被学习通检测以及警告,可放心使用 其他:可以用油猴插件进行自动挂机学习,但被学习通警告的风险较大(该门成绩分数为0) 1. 进入页面 用Google Chrome浏览器打开超星学习通页面,并进入到学生学习页面(其他浏览器大同小异) 2. 进入开发者模式 按下快捷键F12进入开发者模式 3. 打开监听事件 选择Event Listeners事件监听选项卡 4. 选择鼠标监听事件 点击mouseo

终极指南:如何为iOS8应用制作预览视频

最近一两个月里,苹果的世界里出现了很多新东西,比如屏幕更大的iPhone 6,可穿戴设备Apple Watch,iOS8,以及旨在帮助用户更好的发现应用的App Store改版等等. 说到App Store的改版,最值得设计师.开发者和市场人员关注的大概就是视频预览功能了.官方将其称为“应用预览(App Previews)”,如今已经正式出现在iOS8的App Store当中.自然,已经有一大波设计师和开发者为他们的产品制作了预览视频并通过iTunes Connect上传.坦率的说,如果你也有自

APP_Store - 怎样为iOS8应用制作预览视频

关于iOS 8应用预览视频的话题,从设计.技术规范,到录屏.编辑工具,介绍的都比较详尽:建议收藏,在接下来用的到的时候作以参考.下面进入译文. 最近一两个月里,苹果的世界里出现了很多新东西,比如屏幕更大的iPhone 6,可穿戴设备Apple Watch,iOS8,以及旨在帮助用户更好的发现应用的App Store改版等等. 说到App Store的改版,最值得设计师.开发者和市场人员关注的大概就是视频预览功能了.官方将其称为“应用预览(App Previews)”,如今已经正式出现在iOS8的

Python学习教程(Python学习路线+Python学习视频):Python数据结构

Python学习教程(Python学习路线+Python学习视频):Python数据结构   数据结构引言:   数据结构是组织数据的方式,以便能够更好的存储和获取数据.数据结构定义数据之间的关系和对这些数据的操作方式.数据结构屏蔽了数据存储和操作的细节,让程序员能更好的处理业务逻辑,同时拥有快速的数据存储和获取方式. 在这篇文章中,你将了解到多种数据结构以及这些数据结构在Python中实现的方式.    抽象数据类型和数据结构 数据结构是抽象数据类型(ADT)的实现,通常,是通过编程语言提供的

SharePoint 如何制作自动跳转页面

SharePoint 如何制作自动跳转页面 SharePoint制作自动跳转的页面非常简单,只要在页面上添加一个Web部件--内容编辑器,加入相应的js代码即可. 本文介绍如何制作自动跳转页面. 1. 新建ASPX页面,命名RedirectingPage. 2. 编辑页面,添加内容编辑器Web部件. 3. 编辑Web部件,选择编辑HTML源代码. 4. 输入js代码,点击确定,保存. 5. 在SharePoint站点首页编辑页面,输入"[["选择RedirectingPage,再输入&

CSharp、.Net学习视频分享与开发技术QQ交流群

欢迎进群大家以后一起交流 C#..Net技术交流群: 242497960  2000人  点击快速度加群 建议大家进群,还有更多群共享里源码项目等您下载进群看公告传智播客视频链接: http://pan.baidu.com/s/147Wt0 密码:jsi6传智播客视频 链接:http://pan.baidu.com/s/1iTmG4 密码:61dv C++链接: http://pan.baidu.com/s/16KSIM  进群索要 黑马训练营链接: http://pan.baidu.com/s

写测试感悟,获取软件测试学习视频资料

大家好,我是TT,互联网测试行业多年,没有牛逼的背景,也没有什么可炫耀的,唯独比他人更努力,在职场打拼.遇到过的坑,走过的弯路,愿意与大家分享,分享自己的经验,少走弯路.首发于个人公众号[测试架构师] 原文如下: 今天重新系统的整理了一些学习资料,电子书,视频教程等!以活动参与方式发放. 活动规则: 从个人角度,简单聊聊软件测试,自己对软件测试的思考.通过文章底部的评论区留言(微信公众号测试架构师),活动结束将发送给点赞最高的前10名读者.   获取方式有两种: 1.文章底部评论区留言方式,点赞