本篇以 C# 程式碼說明如何搜尋 Youtube 歌曲及下載 mp3/mp4 格式檔
爬蟲程式
爬蟲程式並不是 Python 的專利,其實 Java, C# 等程式語言都支援。使用 C# 有個方便之處,就是可以直接編譯成 .exe 檔,讓使用者按二下就可以直接執行。這可比 Python 方便多了。
2025/01/01 更新
2025/01/01 開始,Youtube 又新增了po token 的機制,它是一種動態產生的授權權杖,在顴看影片時,會作為參數發送確保請求來自有效的YouTube 會話。
要破解 po token 的機制,需把 YoutubeExplode 及 YoutubeExplode.Converter 更新到 6.5.3。
新版完整碼
新版不使用 selenium 搜尋,直接使用 YoutubeExplode/YoutubeExplode.Converter 搜尋及下載,程式更精簡,搜尋到的資料更多,完整代碼如下。
🔒 更多內容,請登入會員繼續閱讀。
立即登入YoutubeDLSharp
YoutubeDLSharp 使用 yt-dlp 進行下載,請由工具/NuGet最件管理員/管理方案的 NuGet 套件安裝。
YoutubeExplode/YoutubeExplode.Converter
C# 支援 YouTube 影片下載的套件不多,而且大都不能用了,比如 VideoLibrary 下載高清影片時沒有聲音,sharpGrabber 則無法使用。
本人測試目前最好用的套件,就屬 YoutubeExplode 這個套件,請由 NuGet 搜尋並安裝。
Youtube 自 2024/10月開始不支援 muxer 下載,所以還需安裝 YoutubeExplode.Converter 套件,將 Audio 及 Video 合併成 mp4。
官方文件說明網址如下 : https://github.com/Tyrrrz/YoutubeExplode

ffmpeg
新版代碼會自動下載 yt-dlp.exe 及 ffmpeg,所以底下不需操作,在此僅作記錄。
YoutubeExplode.Converter 採用了 ffmpeg 將音頻及視頻合併成 mp4。所以需先下載 ffmpeg,請到 https://ffmpeg.org/ 按下 Download,選取 Windows 版本, Windows builds from gyan.dev, 拉到 release builds,最後下載 ffmpeg-release-full.7z,然後將 .7z 解壓縮。
解開後的 bin/ffmpeg.exe 必需連同編譯好的程式一起放到 release 目錄中。請回到 C#,於專案名稱按右鍵/加入/現有項目,檔案類型選 .exe,然後加入剛剛解壓後的 bin/ffmpeg.exe 檔。最後於方案總管點選 ffmpeg.exe,屬性複製到輸出目錄選取 “永遠複製“。

下載 影片/音樂 的代碼如下
🔒 更多內容,請登入會員繼續閱讀。
立即登入FolderBrowserDialog
FolderBrowserDialog 可以開啟檔案總管的瀏覽對話方塊,但只有 Windows Form 支援這個對話方框, WPF 一直不支援,所以只能在 WPF 中啟用 Windows Form。
自 .net 6.0 開始,要在 WPF 中要啟用 Windows Form,需使用 notepad++ 開啟 WPF 專案下的 .csproj 檔,然後在 PropertyGroup 區塊中加入如下藍色代碼
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
UI 版面設計
UI 的畫面設計如下代碼
🔒 更多內容,請登入會員繼續閱讀。
立即登入使用者控制項
顯示在 ScrollViewer 裏的 item 蠻複雜的,所以就請使用者控制項先制定其樣式,再由主程式產生 item 並加入 ScrollViewer 中。
請在專案 Youtube 處按右鍵/加入/新增項目/使用者控制項(WPF),名稱鍵入 SearchItem。
SearchItem.xaml 詳細內容如下
<UserControl x:Class="MahalYT.SearchItem"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MahalYT"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Border BorderBrush="Black" BorderThickness="0.5" Height="Auto" Margin="2,1,2,1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Name="item" Background="#c0c0c0" VerticalContentAlignment="Center" />
<CheckBox Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Name="chk"/>
<StackPanel Grid.Column="2" VerticalAlignment="Center" Orientation="Vertical" HorizontalAlignment="Stretch">
<TextBox Name="txtTitle" Background="#f9f9f9" IsReadOnly="True" Height="30" VerticalContentAlignment="Center" FontSize="14" BorderThickness="0"/>
<TextBox Name="txtUrl" Background="#eeeeee" IsReadOnly="True" Height="30" VerticalContentAlignment="Center" FontSize="14" BorderThickness="0"/>
</StackPanel>
</Grid>
</Border>
</UserControl>
Icon 注意事項
Icon 圖示是這個專案的代表,此 Icon 也會顯示在桌面的快捷鍵上。
請由右方方案總管的專案按右鍵/屬性/應用程式,在圖示選擇 .ico 檔,此檔會被 copy 到專案之下。然後記得要在方案總管的 .icon 檔點一下,下方檔案屬性 “複製到輸出目錄” 要選擇 “永遠複製”。如果沒有作此步驟,使用者在執行 setup.exe時,會出現 “缺少需要的套件” 之類的錯誤。
變更 .netFramework 版本
如果專案開發到一半,想要更改專案的 .netFrameWork 版本,由專案按右鍵/屬性/應用程式/一般,把目標 framework 改成新的版本,如下圖所示。

UI上顯示版號
在 UI 裏要顯示目前的版本,需使用如下代碼顯示
//底下才是取得版本的正確方式
lblVersion.Content =
$"Version : {Assembly.GetExecutingAssembly().GetName().Version!.ToString()}";
上面的版號,還需在檔案總管的專案按右鍵/內容,在一般頁往下拉到組件版本及檔案版本,修改這二個版號才會正確。

發佈專案
專案完成後,就是要發佈安裝檔給人下載安裝並執行,如何發佈,有許多要注意的事項。
請從建置/發佈選取範圍,第一次發佈請按新設定檔,若第二次及以上發佈請由更多動作/編輯。
1. 發佈位置 : 使用預設的 bin\publish。
2. 安裝位置請選擇從網站,指定 URL 如 https://ip/static/mahalyt。
3. 設定/選項/資訊清單,請勾選 “建立桌面捷徑”。

4. 在同樣的設定畫面,進入必要條件,勾選跟專案相同的 .NET Desktop 執行階段 8.0.13 (x64)。

5. 同樣在設定畫面填入發佈版本。

6. 上述畫面選更新設定,指定此應用程式所需的最低版本請輸入比發佈版本少一號。
7. 然後在最後的設定/目標執行階段,選擇 win-x64,檔案發行選項要勾選產生單一檔案。如果產生單一檔案沒有勾,則安裝後是無法執行的。

8. 最後再按發佈,就會在專案下的 bin下產生 publish 目錄。再使用 winscp 將 publish 下的所有檔案目錄都 copy 到網站的 \static\mahalyt 下。
9. 使用 winscp 將 publish 下的所有檔案目錄都 copy 到網站的 \static\mahalyt 下。把 setup.exe 傳給使用者,就會自動由上述的網站下載安裝。
執行檔下載
本範例已編譯成執行檔,在執行此應用程式前,會自動提示下載 .net 8.0.10 sdk framework,請依指示下載並安裝
然後請到本站 https://mahaljsp.ddns.net/static/mahalyt/setup.exe 下載並執行 setup.exe 安裝檔。
下載時瀏覽器會警告此程式 “可能不安全”,請按 “保留”。請放心,本程式絕對沒有病毒,瀏覽器只要是下載 .exe 檔都會提出這樣的警告。

安裝時,請選擇 “其他資訊”,再選擇 “仍要執行”


安裝完就會自動開啟本程式,桌面上也會自動產生快捷鍵 “MahalYT”。

安裝Selenium 套件
本例使用 YoutubeExplode 進行搜尋,不用等待 webdriver 開啟,所以速度非常的快。這邊加入 Selenium 套件僅作記錄而以,底下的說明可以略過。
請進入 “工具/NuGet套件管理員/管理方案的NuGet套件”,然後在瀏覽頁籤中搜尋 Selenium,安裝 Selenium.WebDriver 及 DotNetSeleniumExtras.WaitHelpers 二個套件。

請注意 Selenium.Support 已被淘汰掉了,改用 DotNetSeleniumExtras.WaitHelpers。
下載 WebDriver.exe
網路上的教學都說需先下載 chromedriver.exe檔,但本人測試後是不需要安裝 chromedriver 的。因為 Selenium.WebDriver 套件會自動下載與 Chrome 相同版本的 chromedriver.exe,如此也省去了 Chrome 瀏覽器版本更新的問題。
開啟Browser
開啟 Browser 會花費蠻久的時間(1~2秒),所以必需將開啟 browser 的功能寫在新的執行緒上。本例使用 async Task 來執行。但建構子 MainWindow 是不淮加入 async 的,所以必需把開啟 browser 寫在 Window_Loaded 方法中,如下代碼
🔒 更多內容,請登入會員繼續閱讀。
立即登入搜尋歌曲
搜尋歌曲需使用 Selenium 操作 browser, 代碼如下

老師您好,
執行過程
browser = new ChromeDriver(service, options);這段出現下方錯誤:
QA.Selenium.NoSuchDriverException: ‘Unable to obtain chrome using Selenium Manager; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location‘
是否須要先下載安裝 chromedriver.exe檔後,並於下述指定完整路徑
ChromeDriverService service = ChromeDriverService.CreateDefaultService(@” chromedriver.exe檔完整路徑”);
以上,請問還是有其他學生未注意到的地方,敬請老師賜教,感謝
如果使用舊版的 Selenium.WebDriver 套件,會找不到適合新 Chrome 的 webdriver.exe。這是因為新的 webdriver.exe 下載位置被 Google 變更了。
只要把 Selenium.WebDriver 套件更新到最新版本,就可以自動下載了。