当前位置:网站首页>WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)
WebView2 通过 PuppeteerSharp 实现RPA获取壁纸 (案例版)
2022-08-11 00:17:00 【蓝创精英团队】
此案例是《.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,技术又深一层次的展开,一个好的技术,必定用到合适的场景上才是最合适的。
代码地址
https://github.com/kesshei/WangZheRongYao.git
https://gitee.com/kesshei/WangZheRongYao.git
阅
一键三连呦!,感谢大佬的支持,您的支持就是我的动力!
版权
蓝创精英团队
边栏推荐
- Part of the reserve bank is out of date
- Where can I download IEEE papers?
- ③ 关系数据库标准语言SQL 数据查询(SELECT)
- 软件测试证书(1)—— 软件评测师
- Analysis of LENS CRA and SENSOR CRA Matching Problems
- The Missing Semester of Your CS Education
- I caught a 10-year-old Ali test developer, and after talking about it, I made a lot of money...
- 【pypdf2】合并PDF、旋转、缩放、裁剪、加密解密、添加水印
- Why do programming languages have the concept of variable types?
- [21-day learning challenge - kernel notes] (5) - devmem read and write register debugging
猜你喜欢
Starting a new journey - Mr. Maple Leaf's first blog
[Excel知识技能] 将“假“日期转为“真“日期格式
7. yaml
In 22 years, the salary of programmers nationwide in January was released, only to know that there are so many with annual salary of more than 400,000?
IEEE的论文哪里可以下载?
C language, operators of shift operators (> >, < <) explanation
7. yaml
Mysql.慢Sql
ArcGIS Pro 创建tpk
3d打印出现stl文件物体不是流形,意味着不是水密体...解决办法
随机推荐
图片懒加载(纯手写)
App regression testing, what are the efficient testing methods?
5. Lombok
微信小程序内部A页面向内嵌H5页面跳转,并且传参
工程师如何对待开源
C language, operators of shift operators (> >, < <) explanation
Introduction to Qt (6) - Implementation of the lottery system
“蔚来杯“2022牛客暑期多校训练营3 DF题解
14. Thymeleaf
9. Rest style request processing
[数据可视化] 图表设计原则
复制带随机指针的链表——LeetCode
【.NET Core】使用 NPOI 读写Excel 文件
【openpyxl】只读模式、只写模式
2022下半年软考「高项」易混淆知识点汇总(2)
微信小程序自定义navigationBar
Difference Between Image Recognition and Semantic Segmentation
李彦宏拆墙交朋友,大厂“塑料友情”能否帮百度啃下硬骨头?
"NIO Cup" 2022 Nioke Summer Multi-School Training Camp 4 ADHK Problem Solving
[Excel知识技能] 将“假“日期转为“真“日期格式