Ejemplo n.º 1
0
        public void OpenUrl(string url)
        {
            CustomChrominWebBrowser browser = new CustomChrominWebBrowser(url);

            browser.LifeSpanHandler = LifeSpanHandler;

            var page = new ChrominViewModel(browser);

            browser.RequestHandler  = new CustomRequestHandler();
            browser.LoadHandler     = new CustomLoadHandler(page);
            browser.MenuHandler     = new CustomMenuHandler();
            browser.DownloadHandler = DownloadHandler;
            //browser.StatusMessage += Browser_StatusMessage;

            //browser.CommandBindings.Add(new CommandBinding(CustomDownloadHandler.DownloadUpdated,new ExecutedRoutedEventHandler(DownloadUpdated)));//,new CanExecuteRoutedEventHandler(CanDownloadUpdated)
            page.IsSelected = true;
            PreLoad         = page;
            if (PageList.Count > 0)
            {
                PageList.Insert(GetCurentPageIndex() + 1, page);
            }
            else
            {
                PageList.Add(page);
            }
        }
        public static void MakeSubTask(CustomChrominWebBrowser w, Models.Task task, string title, string url, int taskIndex)
        {
            if (url == null)
            {
                LogHelper.Debug(String.Concat(w.ID, " 产生了空的子url ", task.Action));
                return;
            }
            if (!url.StartsWith(@"http://") && !url.StartsWith(@"https://"))
            {
                string i = GetDomain(task.Action, true);
                url = i + url;
            }

            Models.Task subtask = new Models.Task
            {
                Action        = url,
                Index         = taskIndex,
                WorkDirectory = GetPath(task.WorkDirectory, title)
            };

            if (task.AssignTo == FocuseToType.MAIN)
            {
                PushTask(subtask);
                LogHelper.Debug("向主队列添加任务 " + subtask.Action);
            }
            else
            {
                w.PushTask(subtask);
                LogHelper.Debug("向本地列添加任务 " + subtask.Action);
            }
        }
Ejemplo n.º 3
0
        //解析Task
        public async Task <int> ExcuteAnalysis(CustomChrominWebBrowser w, CefSharp.IFrame frame, LinkedList <Models.Task> Rules, Models.Task infoTask, TaskViewModel taskViewModel)
        {
            int index      = 0;
            int ErrorCount = 0;

            foreach (var item in Rules)
            {
                object symbol = true;
                if (item.MatchSymbol != null)
                {
                    symbol = Convert.ToBoolean(await TaskHelper.Excute(frame, (string)item.MatchSymbol));
                }

                //获取页面缓存数据集
                Dictionary <string, NetSource> FileData = ((CustomRequestHandler)w.RequestHandler).GetMemoryData();

                if ((bool)symbol)
                {
                    index++;
                    LogHelper.Debug(string.Format("规则[{0}]匹配标记 返回True,将执行此规则", item.Action));
                    //转换任务Task到解析Task
                    item.ConvertToRunTask(infoTask);
                    try
                    {
                        var _result = await TaskHelper.Excute(w, FileData, frame, item, taskViewModel);

                        if (_result)
                        {
                            LogHelper.Debug(string.Format("{0}完成解析任务{1}", w.ID, item.ID));
                        }
                        else
                        {
                            LogHelper.Debug(string.Format("{0}在解析任务{1}时出现错误", w.ID, item.ID));
                        }
                    }
                    catch (Exception e)
                    {
                        ErrorCount++;
                        LogHelper.Debug(string.Format("{0}在解析任务{1}时出现错误 Error:{2}", w.ID, item.ID, e.Message));
                    }
                }
                else
                {
                    LogHelper.Debug(string.Format("规则[{0}]匹配标记 返回False,将跳过此规则", item.Action));
                }
            }
            //清除页面文件的自定义缓存数据
            ((CustomRequestHandler)w.RequestHandler).ReleaseCustomData();

            if (Rules.Count == 0)
            {
                LogHelper.Debug(string.Format("{0} 没有匹配的规则用于解析[{1}]", w.ID, w.Info?.Action));
            }
            return(ErrorCount);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 从TaskVIewList中移除已完成Task的对象
        /// </summary>
        /// <param name="ce"></param>
        public void RemoveTaskBrowserView(CustomChrominWebBrowser ce)
        {
            ChrominViewModel target = null;

            foreach (var item in TaskList)
            {
                if (item.WebBrowser == ce)
                {
                    target = item; break;
                }
            }
            if (target != null)
            {
                App.Current.Dispatcher.Invoke(() => { TaskList.Remove(target); });
            }
        }
Ejemplo n.º 5
0
        //Task分配循环
        private void BK_DoWork(object sender, DoWorkEventArgs e)
        {
            while (TaskHelper.HasTask())
            {
                CustomChrominWebBrowser browser = null;     //尝试从对象池中获取一个可用对象

                while (browser == null)
                {
                    //任务队列还有任务
                    browser = BH.Get();
                    Thread.Sleep(2000);
                    //LogHelper.Debug("继续 等待可用对象");
                }
                {
                    var _MainTask = TaskHelper.PopTask();
                    if (_MainTask == null)
                    {
                        return;
                    }
                    //LogHelper.Debug(string.Format("取得任务[{0}],及可用对象", _MainTask.Action));

                    //LogHelper.Debug(string.Format("池=>{1}/{0} ", BH.GetPoolSize(), BH.GetObjectSize()));
                    browser.Info = _MainTask;
                    //获取到可用对象则进行解析任务

                    browser.RequestHandler = new CustomRequestHandler();
                    if (browser.LifeSpanHandler == null)
                    {
                        browser.LifeSpanHandler = LifeSpanHandler;
                    }
                    browser.LoadHandler = new CustomLoadHandler();
                    ((CustomLoadHandler)browser.LoadHandler).OnStateChange += Browser_StateChanged;

                    browser.FrameLoadStart -= Browser_FrameLoadStart;
                    browser.FrameLoadStart += Browser_FrameLoadStart;

                    var page = new ChrominViewModel(browser);
                    //PreLoad = page;
                    App.Current.Dispatcher.BeginInvoke(new Action(() =>
                    {
                        browser.Address = browser.Info.Action;
                        TaskList.Add(page);
                    }));
                }
            }
        }
Ejemplo n.º 6
0
        private TaskViewModel GetTaskViewModel(CustomChrominWebBrowser ccwb)
        {
            lock (TaskListLocker)
            {
                for (int i = 0; i < TaskViewList.Count; i++)
                {
                    if (TaskViewList[i].ID == ccwb.ID)
                    {
                        return(TaskViewList[i]);
                    }
                }
                var tvm = new TaskViewModel()
                {
                    ID = ccwb.ID, TotalCount = 1, Title = ccwb.Info.Action
                };                                                                                 //初始时必然是 一个task已经在执行中,所以totalcount应为1

                App.Current.Dispatcher.Invoke(() => { TaskViewList.Insert(0, tvm); });
                return(tvm);
            }
        }
 public ChrominViewModel(CustomChrominWebBrowser browser)
 {
     _WebBrowser = browser;
 }
        public static async Task <bool> Excute(CustomChrominWebBrowser w, Dictionary <string, NetSource> memorydata, IFrame frame, Models.Task task, TaskViewModel taskViewModel = null)
        {
            var cmds = task.ExcuteSequence.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
            //按解析规则顺序 依次执行对应函数
            object data  = null;
            string title = null;

            try
            {
                foreach (var item in cmds)
                {
                    switch (item)
                    {
                    case "Title":
                        LogHelper.Debug(w.ID + " 解析Title " + task.Title);
                        title = (string) await Excute(frame, task.Title);

                        title = title.Trim();
                        break;

                    case "Data":
                        LogHelper.Debug(w.ID + " 解析Data " + task.Data);
                        data = await Excute(frame, (string)task.Data);

                        if (data is List <object> )
                        {
                            List <string> temp = new List <string>();
                            foreach (var sub in (List <object>)data)
                            {
                                temp.Add((string)sub);
                            }
                            data = temp;
                        }
                        break;

                    case "ExDo":
                        await Excute(frame, (string)task.ExDo);

                        break;

                    default:
                        break;
                    }
                }
            }catch (Exception Excerr)
            {
                LogHelper.Debug(string.Format("解析任务[{0}]时出错,请检查解析规则是否正确。错误信息:{1}", task.Action, Excerr.Message));
                return(false);
            }

            //处理最终生成的数据
            int index = 0;

            switch (task.DataType)
            {
            case FocuseOnType.URL:

                if (data is string)
                {
                    //传递生成的子任务数量
                    if (taskViewModel != null && task.AssignTo != FocuseToType.MAIN)
                    {
                        taskViewModel.TotalCount += 1;
                    }
                    MakeSubTask(w, task, title, (string)data, task.Index);
                }
                else
                {
                    index = 0;

                    if (task.ReverseData)
                    {
                        ((List <string>)data).Reverse();
                    }

                    foreach (var sub in (IList)data)
                    {
                        var url = (string)sub;
                        MakeSubTask(w, task, title, url, index);
                        index++;
                    }
                    //传递生成的子任务数量
                    if (taskViewModel != null && task.AssignTo != FocuseToType.MAIN)
                    {
                        taskViewModel.TotalCount += index;
                    }
                }

                break;

            case FocuseOnType.DATA:
                if (data is string)
                {
                    var url = (string)data;
                    if (memorydata.ContainsKey(url))
                    {
                        var md = memorydata[url];
                        SaveMemoryToFile(md, GetPath(task.WorkDirectory, title), url, task.AttachName);
                    }
                    else
                    {
                        MissSourceSaveToFile(GetPath(task.WorkDirectory, title), url, task.AttachName);
                    }
                }
                else
                {
                    index = 0;
                    foreach (var item in (IList)data)
                    {
                        var url = (string)item;
                        if (memorydata.ContainsKey(url))
                        {
                            var md = memorydata[url];
                            SaveMemoryToFile(md, GetPath(task.WorkDirectory, string.Format("{0} {1}", task.Index, title)), url, task.AttachName, index.ToString());
                        }
                        else
                        {
                            MissSourceSaveToFile(GetPath(task.WorkDirectory, string.Format("{0} {1}", task.Index, title)), url, task.AttachName, index.ToString());
                            //LogHelper.Debug(w.ID + " 没有找到指定的资源 " + url);
                        }
                        index++;
                    }
                }

                break;

            case FocuseOnType.TEXT:
                if (data is string)
                {
                    SaveTextToFile((string)data, GetPath(task.WorkDirectory, title), task.AttachName);
                }
                else
                {
                    index = 0;
                    foreach (var item in (IEnumerable)data)
                    {
                        var _data = item as string;
                        SaveTextToFile((string)_data, GetPath(task.WorkDirectory, string.Format("{0} {1}", task.Index, title)), task.AttachName, index.ToString());
                        index++;
                    }
                }

                break;

            default:
                break;
            }
            LogHelper.Debug(String.Concat("任务 ", task.Action, " 执行完毕 "));
            return(true);
        }