WebView2 通過 PuppeteerSharp 實現RPA獲取壁紙 (案例版)

此案例是《.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;}}
}

所用到的王者實體信息

///?<summary>
///?英雄的信息
///?</summary>
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;?}
}
///?<summary>
///?英雄皮膚
///?</summary>
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目錄下。

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

e418a50a7b29633dc40bfb39e7a03a95.png

整整齊齊,很完整,都是我喜歡的英雄和買不起的皮膚。

8b71e4759a752e09ae23a0908bbbf1dd.png

而且,獲取到的包含了皮膚的名稱

總結

基于WebView2,技術又深一層次的展開,一個好的技術,必定用到合適的場景上才是最合適的。

代碼地址

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

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

一鍵三連呦!,感謝大佬的支持,您的支持就是我的動力!

版權

藍創精英團隊(公眾號同名,CSDN 同名,CNBlogs 同名)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]2022 年 Java 行業分析報告

你好&#xff0c;我是看山。 前段時間介紹了從 Java8 到 Java17 每個版本比較有特點的新特性&#xff08;收錄在 從小工到專家的 Java 進階之旅 專欄&#xff09;&#xff0c;今天看到 JRebel 發布了《2022 年 Java 發展趨勢和分析》&#xff0c;于是借此分析一下 Java 行業的現…

Mysql 數據庫學習筆記03 存儲過程

一、存儲過程&#xff1a;如下 通過 out 、inout 將結果輸出&#xff0c;可以輸出多個值。 * 調用存儲過程&#xff1a; call 存儲名稱&#xff08;參數1&#xff0c;參數2&#xff0c;...&#xff09;; 如指定參數不符合要求&#xff0c;返回 Empty Set * 查詢存儲過…

android 代碼混淆模板

#指定代碼的壓縮級別 -optimizationpasses 5 #包明不混合大小寫 -dontusemixedcaseclassnames #不去忽略非公共的庫類 -dontskipnonpubliclibraryclasses#優化 不優化輸入的類文件 -dontoptimize#預校驗 -dontpreverify#混淆時是否記錄日志 -verbose# 混淆時所采用的算法 -opt…

vue+vuecli+webapck2實現多頁面應用

準備工作 在本地用vue-cli新建一個項目&#xff0c;首先安裝vue-cil&#xff0c;命令&#xff1a; npm install -g vue-cli 新建一個vue項目,創建一個基于"webpack"的項目,項目名為vuedemo&#xff1a; vue init webpack vuedemo 這里有一個地方需要改一下&#xff0…

一文把Docker、Kubernetes搞懂:什么是Docker?什么是Kubernetes?Docker和Kubernetes有什么關系和區別?通俗解釋Docker、Kubernetes

一、Docker解決的問題 1、統一標準 ● 應用構建 ○ Java、C、JavaScript——編程各異 ○ 打成軟件包 ○ .exe&#xff08;類似Windows&#xff0c;最終也只是生產exe執行&#xff09; ○ 使用docker build … 打包成 鏡像——這就類似于exe ● 應用分享 ○ 所有軟件的鏡像放到一…

Python-高階函數

#encodingUTF-8import sys # 高階函數高階函數實際上是參數可接受函數的函數即參數為函數的函數 # map()map()接收兩個參數&#xff0c;一個是函數&#xff0c;一個是序列&#xff0c;將此函數分別作用于該序列的每個元素&#xff0c;返回處理后的序列結果def c2(x): return x…

程序員雙手飛快敲鍵盤的時候是在敲代碼嗎?

當你看到一個程序員的兩只手在鍵盤上上下翻飛&#xff0c;行云流水的時候&#xff0c;多半不是在敲擊代碼大概率是在跟產品經理撕逼討論需求另一種可能就是在跟測試打口水仗10%幾率是在論壇碼字摸魚或者和人家開噴了。1%幾率是在跟MM聊天可以手速飛快而不需要停下思考的代碼&am…

erlang-17版本的編碼方式

最近在騰訊云租了個云主機&#xff1a;鏡像提供方&#xff1a;選擇服務市場 &#xff1a;多語言環境&#xff08;Centos 7.0 64位 Python Perl Ruby Erlang &#xff09; 他們集成軟件安裝的是erlang-17版本&#xff0c;我之前用erlang-16版本一直沒遇到什么問題&#xff1b; 這…

幾分鐘上線一個網站 真是神器

1、ToolJet 簡介 ToolJet 是一個開源的低代碼框架&#xff0c;可以快速構建和部署內部工具&#xff0c;而無需工程團隊付出太多努力。您可以連接到您的數據源&#xff0c;例如數據庫&#xff08;如 PostgreSQL、MongoDB、Elasticsearch 等&#xff09;、API 端點&#xff08;To…

翻譯:用戶變量(User-Defined Variable)(已提交到MariaDB官方手冊)

本文為mariadb官方手冊&#xff1a;User-Defined Variables的譯文。 原文&#xff1a;https://mariadb.com/kb/en/user-defined-variables/我提交到MariaDB官方手冊的譯文&#xff1a;https://mariadb.com/kb/zh-cn/user-defined-variables/ 用戶變量是指由用戶創建&#xff0…

移植Python3到TQ2440(一)

平臺 硬件&#xff1a;TQ2440 64MB內存 256MB NandFlashbootloader&#xff1a;U-Boot 2015.04kernel&#xff1a;linux-4.9Python: Python-3.6.0工具鏈&#xff1a;arm-none-linux-gnueabi-gcc 4.8.3概述 現在樹莓派很火&#xff0c;在樹莓派上面用戶可以通過Python來控制板…

WinForm(六)組合布局屬性

WinForm是基于控件的&#xff0c;不像codemark的架構&#xff0c;可以非常靈活的用mark來布局&#xff0c;它只能用控件布局屬性和窗口控件來完成對UI的布局。容器控件有一組控件叫容器控件&#xff0c;對布局特別有作用&#xff0c;它們分別是&#xff1a;TableLayoutPanel&am…

Qt 網絡編程

QT 網絡編程 TCP 編程 模塊引入 QT network 頭文件 #include <QTcpServer> // TCP服務器端使用 #include <QTcpSocket> // TCP服務器和客戶端都使用 編程流程 服務端 1&#xff09;實例化 QTcpServer 對象 -----------------------------> socket 2&#x…

HDU 5037 Frog(2014年北京網絡賽 F 貪心)

開始就覺得有思路&#xff0c;結果越敲越麻煩。。。   題意很簡單&#xff0c;就是說一個青蛙從0點跳到m點&#xff0c;最多可以跳l的長度&#xff0c;原有石頭n個&#xff08;都僅表示一個點&#xff09;。但是可能跳不過去&#xff0c;所以你是上帝&#xff0c;可以隨便在哪…

Kafka高性能高吞吐的原因總結

1、磁盤順序讀寫 保證了消息的堆積 順序讀寫 磁盤會預讀,預讀即在讀取的起始地址連續讀取多個頁面&#xff0c;主要時間花費在了傳輸時間,而這個時間兩種讀寫可以認為是一樣的。 隨機讀寫 因為數據沒有在一起&#xff0c;將預讀浪費掉了&#xff0c;需要多次尋道和旋…

日利率

2019獨角獸企業重金招聘Python工程師標準>>> 利率計算 轉載于:https://my.oschina.net/u/3342652/blog/1649028

linux下使用tar命令

解壓語法&#xff1a;tar [主選項輔選項] 文件或者目錄 使用該命令時&#xff0c;主選項是必須要有的&#xff0c;它告訴tar要做什么事情&#xff0c;輔選項是輔助使用的&#xff0c;可以選用。主選項&#xff1a;c 創建新的檔案文件。如果用戶想備份一個目錄或是一些文件&…

Kafka 安裝詳解

注意&#xff1a;確保有JDK1.8版本及以上 官方文檔&#xff1a;https://kafka.apache.org/quickstart 清華鏡像下載&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/ 首先下載安裝包&#xff0c;在linux及Windows都可以使用。 1. Centos 安裝部署 1.1 下載 將下…

【Maui正式版】創建可跨平臺的Maui程序,以及有關依賴注入、MVVM雙向綁定的實現和演示...

前言&#xff1a;Maui終于在2022年8月9日推送出來了。今兒就迫不及待來把玩一下先。A、我本地已有VS2022&#xff0c;不過版本比較老&#xff0c;此處選擇更新。工具 -> 獲取功能和更新里面&#xff0c;可以獲取到新版本更新。B、最新版本是17.3.0&#xff0c;我本地只有17.…

學go語言能做什么工作?

Go語言主要用作服務器端開發&#xff0c;其定位是用來開發“大型軟件”的&#xff0c;適合于很多程序員一起開發大型軟件&#xff0c;并且開發周期長&#xff0c;支持云計算的網絡服務。Go語言能夠讓程序員快速開發&#xff0c;并且在軟件不斷的增長過程中&#xff0c;它能讓程…