zoukankan      html  css  js  c++  java
  • 通过CefSharp实现浏览器自动输入自动点击按钮等

          本程序基于CefSharp实现自动打开一个网站,自动输入账号密码自动注册。然后跳转到商品页自动输入评论的内容然后提交。完全模拟人为在浏览器的所有操作,包括自动输入,自动点击等操作。

          本解决方案可以应用于网络爬虫,刷单,刷评论,参与自动秒杀活动。抢票程序等等。

          最终效果如下:

    cefsharp是一个在c#中使用Chrome浏览器内核实现浏览器功能的插件,类似于c#中的WebBrowser功能。

    主要代码:

    1、引用

    <wpf:ChromiumWebBrowser x:Name="webBrowser" Address="https://www.walmart.com/account/login"/>

    2、执行JavaScript

    public async void EvaluateJavaScript(string s, bool addCommonJs = false)
            {
                try
                {
                    if (addCommonJs)
                    {
                        s = commonJs + s;
                    }
                    var response = await webBrowser.EvaluateScriptAsync(s);
                    if (response.Success && response.Result is IJavascriptCallback)
                    {
                        response = await ((IJavascriptCallback)response.Result).ExecuteAsync("This is a callback from EvaluateJavaScript");
                    }
    
                    var EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
                }
                catch (Exception e)
                {
                    MessageBox.Show("Error while evaluating Javascript: " + e.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
    

     3、设置cookie

    public static void SetCefCookies(string url, CookieCollection cookies)
            {
                //Cef.GetGlobalCookieManager().SetStoragePath(Environment.CurrentDirectory, true);
                foreach (System.Net.Cookie c in cookies)
                {
                    var cookie = new CefSharp.Cookie
                    {
                        Creation = DateTime.Now,
                        Domain = c.Domain,
                        Name = c.Name,
                        Value = c.Value,
                        Expires = c.Expires
                    };
                    Task<bool> task = Cef.GetGlobalCookieManager().SetCookieAsync(url, cookie);
                    while (!task.IsCompleted)
                    {
                        continue;
                    }
                    bool b = task.Result;
                }
            }
    

      4、获取当前页面的html源码

    private string GetHTMLFromWebBrowser()
            {
                // call the ViewSource method which will open up notepad and display the html. 
                // this is just so I can compare it to the html returned in GetSourceAsync() 
                // This is displaying all the html code (including child frames) 
                //webBrowser.GetBrowser().MainFrame.ViewSource();
    
                // Get the html source code from the main Frame. 
                // This is displaying only code in the main frame and not any child frames of it. 
                Task<String> taskHtml = webBrowser.GetBrowser().MainFrame.GetSourceAsync();
    
                string response = taskHtml.Result;
                return response;
            }
    

      5、拦截json请求结果

     public class DefaultResourceHandler : ResourceRequestHandler
        {
            public event EventHandler<JsonResponseHandlerEventArgs> json_response_handler;
            private Dictionary<ulong, MemoryStreamResponseFilter> responseDictionary = new Dictionary<ulong, MemoryStreamResponseFilter>();
            public DefaultResourceHandler() { }
            public DefaultResourceHandler(EventHandler<JsonResponseHandlerEventArgs> json_response_handler) {
                this.json_response_handler = json_response_handler;
            }
            protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
            {
                if (response.MimeType.Equals("application/json", StringComparison.OrdinalIgnoreCase)
                    || (response.Headers["Content-Type"] != null && response.Headers["Content-Type"].ToLower().Contains("application/json")))
                {
                    return JsonResponseFilter.CreateFilter(request.Identifier.ToString());
                }
                return null;
            }
            
            protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
            {
                var filter = JsonResponseFilter.GetFileter(request.Identifier.ToString()) as JsonResponseFilter;
                if (filter != null)
                {
                    var encode = !string.IsNullOrEmpty(response.Charset)
                        ? Encoding.GetEncoding(response.Charset)
                        : Encoding.UTF8;
                    using (var read = new StreamReader(filter.GetStream(), encode))
                    {
                        //获取到的json内容
                        var text = read.ReadToEnd();
                        json_response_handler?.Invoke(response, new JsonResponseHandlerEventArgs(request, response, text));
                        Trace.WriteLine(response.MimeType + "=>" + request.Url + "::" + text);
                    }
                }
            }
        }
    

      

  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/cinser/p/14546281.html
Copyright © 2011-2022 走看看