Pada tahun 2020, kami menggunakan layanan musik yang berbeda, tetapi sebagai peninggalan zaman dulu, dalam profil VK yang terlupakan, banyak yang memiliki musik. Tidak ada fungsi unduh, tetapi bagaimana jika Anda sangat ingin menyimpan rekaman audio?
Karena perangkat lunak semacam itu tidak ditemukan di domain publik, kecuali untuk beberapa layanan web yang memerlukan otorisasi melalui VK (yang tidak terlalu aman), kami akan mempertimbangkan proses pembuatan utilitas yang dihosting sendiri di C # modern untuk mengunggah audio Anda, yang tidak menggabungkan data profil ke pihak ketiga. jasa.
Salah satu nilai kerja seorang programmer adalah kesederhanaan dan, jika mungkin, kode yang ringkas. Oleh karena itu, kami akan merekatkan beberapa pustaka yang ada untuk mendapatkan solusi yang diinginkan.
Utilitas akan bekerja seperti ini:
dotnet vkm [login] [password] [audio-lemma]
Pertama-tama, mari buat repositori dan jelaskan dependensi proyek dalam satu file csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- -->
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<!-- null , NRE -->
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<!-- C# 9 top-level -->
<LangVersion>9</LangVersion>
</PropertyGroup>
<ItemGroup>
<!-- VK API -->
<PackageReference Include="VkNet" Version="1.56.0" />
<!-- , -->
<PackageReference Include="VkNet.AudioBypassService" Version="1.7.0" />
</ItemGroup>
</Project>
Setelah itu, dengan hati nurani yang bersih, Anda bisa mulai menulis kode. Kami memerlukan otorisasi utilitas di VK dengan akses penuh ke profil kami. Dan seperti yang bisa kita lihat, berkat ekosistem .NET, sangat mudah untuk melakukan ini:
static class Vk
{
internal static VkApi LoginToVkApi(string login, string password)
{
// ,
var api = new VkApi(new ServiceCollection().AddAudioBypass());
api.Authorize(new ApiAuthParams
{
ApplicationId = 1980660,
Login = login,
Password = password,
Settings = All
});
$"Login as vk.com/id{api.UserId}".Println(DarkBlue);
return api;
}
}
Mari kita gambarkan titik masuk dan filter dari rekaman audio yang dimuat. Kami menggunakan program tingkat atas untuk ini dan memvalidasi argumen langsung di file Application.cs, saat menginisialisasi api
var vk = args.Length switch
{
3 => LoginToVkApi(args[0], args[1]),
_ => throw new ArgumentException("Invalid arguments. Usage:\n" +
" dotnet vkm [login] [password] [audio]\n" +
)
};
Membawa lemma untuk mencari rekaman audio dalam huruf besar
var lemma = args.Last().ToUpperInvariant();
Dan kami menggunakan Linq untuk semua rekaman audio dengan entri-nya. Terima kasih khusus kepada habrauserSuperHackerVkuntuk cara mendapatkan mp3-link dengan regular .
var audios = vk.Audio.Get(new AudioGetParams { Count = 6000 })
.Where(x => x.Title.ToUpperInvariant().Contains(lemma))
.Select(x => (x.Title, Url: Regex.Replace(
x.Url.ToString(),
@"/[a-zA-Z\d]{6,}(/.*?[a-zA-Z\d]+?)/index.m3u8()",
@"$1$2.mp3"
)));
Terakhir, yang tersisa hanyalah mengunggah audio yang Anda temukan:
using var http = new HttpClient();
foreach (var (title, url) in audios)
{
$"Downloading {title}...".Println(DarkBlue);
await WriteAllBytesAsync($"{title}.mp3", await http.GetByteArrayAsync(url));
}
Itu saja! Utilitas ditulis dan siap untuk penggunaan pribadi. Sangat terlihat bagaimana C # berubah menjadi multitool yang baik setiap tahun yang memungkinkan Anda menyelesaikan berbagai tugas. Peningkatan kapabilitas sintaksis yang tampaknya mengacaukan bahasa saat diumumkan, dalam praktiknya, sebaliknya, memungkinkan Anda mempersingkat kode dan membuatnya sederhana dan mudah dipahami.
Repositori di GitHub dengan tambahan kecil dan dokumentasi peluncuran .
Semoga harimu menyenangkan semuanya!