首页 > 其他分享 >WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)

WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)

时间:2023-05-16 22:01:01浏览次数:47  
标签:string PuppeteerSharp await WebView2 RPA 获取 var div public


此案例是《.Net WebView2 项目,实现 嵌入 WEB 页面 Chromium内核》文的续集。

主要是针对WebView2的一些微软自己封装的不熟悉的API,有一些人已经对 PuppeteerSharp很熟悉了,那么,直接用 PuppeteerSharp的话,那就降低了学习成本,那还是很有必须要的。

之前自己也RPA获取过联盟的高 清 原画,现在就获取下王者的高 清 壁纸。

王者壁纸自动化获取逻辑分析

其实它的逻辑很简单, 就是官网,打开后,在右下角就看到了皮肤页面部分。

这个时候,点击更多,就会打开全部英雄详情的页面。

这个时候,单点任意一个英雄,就会新开一个页面,这个英雄自己的页面,可以看到具体的皮肤信息了。

这里可以看到有6个皮肤,那么,到这里我就可以获取这6个皮肤作为高清王者的皮肤了。

那么,让程序自动化操作,并把这些信息处理保存好,就是我们要做到的事情。

新建一个WPF项目

新建一个 WPF 项目,要添加 Nuget 包

Install-Package Microsoft.Web.WebView2 -Version 1.0.1293.44
Install-Package PuppeteerSharp -Version 7.1.0
Install-Package HtmlAgilityPack -Version 1.11.43

MainWindow.xaml

界面大致样子和布局

<DockPanel>
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" HorizontalAlignment="Right">
        <Label Name = "loginfo" Content="未采集"/>
        <Button Name="start" DockPanel.Dock="Right" Width="150" Content="开始采集" Click="start_Click"/>
    </StackPanel>
    <wpf:WebView2 Name = "webView2"/>
</DockPanel>

右上角一个提示信息,一个采集的按钮,布局很是简单

如何启用 PuppeteerSharp

其实都是基于谷歌的DevTools协议来的,所以,只要WebView2开启了Debugging端口即可。

var result = await CoreWebView2Environment.CreateAsync(null, System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "cache"),
    new CoreWebView2EnvironmentOptions($"--remote-debugging-port={Port}"));
await webView2.EnsureCoreWebView2Async(result);

通过WebVeiw2的游览器启动参数 : --remote-debugging-port=6666 来开启DevTools协议的支持。

PuppeteerSharpHelper
public class PuppeteerSharpHelper
{
    /// <summary>
    /// 获取游览器对象
    /// </summary>
    public static Task<Browser> GetBrowser(int port, int height, int width)
    {
        return Puppeteer.ConnectAsync(new ConnectOptions { DefaultViewport = new ViewPortOptions() { Height = height, Width = width }, BrowserWSEndpoint = WSEndpointResponse.GetWebSocketDebuggerUrl(port) });
    }
    internal class WSEndpointResponse
    {
        public string WebSocketDebuggerUrl { get; set; }
        public static string GetWebSocketDebuggerUrl(int port)
        {
            string data;
            using (var client = new HttpClient())
            {
                data = client.GetStringAsync($"http://127.0.0.1:{port}/json/version").Result;
            }
            return JsonConvert.DeserializeObject<WSEndpointResponse>(data).WebSocketDebuggerUrl;
        }
    }
}

所用到的王者实体信息

public class HeroInfo
{
    public string Name { get; set; }
    public string Url { get; set; }
    public string TargetUrl()
    {
        return $"https://pvp.qq.com/web201605/{Url}";
    }
    public List<HeroSkin> HeroSkins { get; set; }
}
public class HeroSkin
{
    public HeroSkin(string name, string url)
    {
        this.Name = name;
        this.Url = "https:" + url;
    }
    public string Name { get; set; }
    public string Url { get; set; }
}

RPA的核心代码

private async void start_Click(object sender, RoutedEventArgs e)
{
    var herolistPath = await Currentpage.EvaluateExpressionAsync<string>("document.querySelector('body > div.wrapper > div.main > div:nth-child(3) > div.skin_center.fl > div.item_header > a').href");

    await Currentpage.GoToAsync(herolistPath, WaitUntilNavigation.DOMContentLoaded);
    loginfo.Content = "开始获取内容";
    var herolist = await Currentpage.EvaluateExpressionAsync<string>("document.querySelector('body > div.wrapper > div > div > div.herolist-box > div.herolist-content > ul').innerHTML");
    var heros = GetHeroInfos(herolist);
    loginfo.Content = $"获取全部英雄信息共:{heros.Count}条";
    foreach (var item in heros)
    {
        await Currentpage.GoToAsync(item.TargetUrl(), WaitUntilNavigation.DOMContentLoaded);
        Thread.Sleep(100);
        var skins = await Currentpage.EvaluateExpressionAsync<string>("document.querySelector('body > div.wrapper > div.zk-con1.zk-con > div > div > div.pic-pf > ul').innerHTML");
        item.HeroSkins = GetHeroSkins(skins);
    }
    loginfo.Content = "开始下载资源";
    var count = 0;
    //开始执行下载
    foreach (var item in heros)
    {
        count++;
        loginfo.Content = $"资源一共:{heros.Count}条,正在下载第{count}条,还剩下:{heros.Count - count}";
        var HearoPath = System.IO.Path.Combine(ImagesPath, item.Name);
        if (!System.IO.Directory.Exists(HearoPath))
        {
            System.IO.Directory.CreateDirectory(HearoPath);
        }
        foreach (var skin in item.HeroSkins)
        {
            await WebHelper.DownloadFile(skin.Url, System.IO.Path.Combine(HearoPath, $"{skin.Name}.jpg"));
        }
    }
    loginfo.Content = "获取完毕,等待查看!";
}

效果如下:

需要点击获取按钮,就会执行自动化获取操作,然后把获取的内容存储到当前项目bin目录images目录下。

下面就是下载完后的效果。

WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)_wpf


整整齐齐,很完整,都是我喜欢的英雄和买不起的皮肤。

WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)_System_02


而且,获取到的包含了皮肤的名称

总结

基于WebView2,技术又深一层次的展开,一个好的技术,必定用到合适的场景上才是最合适的。

代码地址

https://github.com/kesshei/WangZheRongYao.git



版权

蓝创精英团队


标签:string,PuppeteerSharp,await,WebView2,RPA,获取,var,div,public
From: https://blog.51cto.com/kesshei/6287460

相关文章

  • 设置键盘只能输入数字( phoneNumTextField.keyboardType = UIKeyboardTypeNumberPad;)
    //手机号码textFieldphoneNumTextField=[[UITextFieldalloc]initWithFrame:CGRectMake(0,0,[[UIScreenmainScreen]bounds].size.width,40)];UIView*phoneImage=[[UIViewalloc]initWithFrame:CGRectMake(0,0,40,40)];phoneImage.backgroundColor=[U......
  • 【商战风云】交行RPA选型,一次竟然选三家?-RPA学习天地
     在国有银行总行级别RPA选型中,交行应该是比较晚的银行。在去年中旬,交通银行总行才第一次进行了RPA入围选型。 值得关注应该是,不同于以往选型,这次一共要选取国内的3家RPA厂商同时作为供应商。 1一次入围三家RPA厂商作为供应商 在行业力推信创背景下,海外的RPA企业有退出逐......
  • 【RPA】使用影刀读写Excel的若干问题及解决方案
    RPA是机器人流程自动化(Roboticprocessautomation)的简称,它可以通过低代码开发方式,模仿最终用户在电脑的手动操作,创建工作流,实现工作流程的自动化。该技术起源于上世纪90年代,2015年至今进入高速发展阶段,应用链条更长,功能不断增强。“影刀”便是一款值得推荐的RPA工具。在使用RPA......
  • -L、-rpath和-rpath-link的区别 [转]
    https://blog.csdn.net/Q1302182594/article/details/42102961?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6-42102961-blog-26229287.235^v31^pc_relevant_default_base3&depth_1-utm_source......
  • AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?
    GPT等AI大模型震撼来袭,基于RPA的超级自动化仍是最佳落地载体文/王吉伟关于RPA已死的说法,在中国RPA元年(2019年)投资机构疯狂抢项目之时就已经有了。说它会死的,一般会认为RPA是一种过时的技术,一种打补丁的技术,一种不稳定的技术。在很多人眼里,依赖UI抓取实现的自动化,最终都会被基于API......
  • AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?
     GPT等AI大模型震撼来袭,基于RPA的超级自动化仍是最佳落地载体对话弘玑CPO贾岿,深入了解国产RPA厂商对AI大模型的探索与实践文/王吉伟 关于RPA已死的说法,在中国RPA元年(2019年)投资机构疯狂抢项目之时就已经有了。说它会死的,一般会认为RPA是一种过时的技术,一种打补丁的技术,......
  • MFC-SHGetSpecialFolderPath获取指定的系统路径
     CStringstr;TCHARpath[MAX_PATH];BOOLb=SHGetSpecialFolderPath(NULL,path,CSIDL_PROGRAM_FILES_COMMONX86,0);//获取指定的系统路径/*参数1:HWNDhwndOwner窗口所有者的句柄。可以NULL参数2:LPTSTRlpszPath返回路径的缓冲区,该缓......
  • 【四二学堂】基于UiBot RPA开发入门---流程判断
    流程块一:dimaa=1Returna流程块二:TracePrint"a的值等于1时执行的模块"流程块三:TracePrint"a的值不等于1时执行的模块"......
  • 【四二学堂】基于UiBot RPA开发入门---Excel操作
    dimobjExcelWorkBook=""dimiRowsobjExcelWorkBook=Excel.OpenExcel(@res"测试数据一.xlsx",true,"Excel","","")iRows=Excel.GetRowsCount(objExcelWorkBook,"Sheet1")Excel.WriteRow(objExcelWorkBook,&......
  • 工作流自动化和RPA自动化,哪个更适合你?
    2018年,一款名为《Overcooked!2》(又名“胡闹厨房”、“分手厨房”)的多人合作模拟类游戏风靡全球,在游戏中,玩家扮演厨师在充满各种障碍和危险的厨房里准备食材、烹饪、上菜和清理,需要在尽可能短的时间内完成客人的订单。《胡闹厨房》的做菜流程严格遵循现实:从取材-切菜-加工(蒸炸煮煎等......