Im Jahr 2020 nutzen wir verschiedene Musikdienste, aber als Relikt einer vergangenen Ära haben viele in einem vergessenen VK-Profil Musik. Es gibt keine Download-Funktion, aber was ist, wenn Sie die Audioaufnahme dringend speichern müssen?
Da solche Software nicht öffentlich zugänglich war, mit Ausnahme einiger Webdienste, für die eine Autorisierung über VK erforderlich ist (was nicht sehr sicher ist), werden wir im Rahmen der Kürzung den Prozess der Erstellung eines selbst gehosteten Dienstprogramms in modernem C # zum Hochladen Ihrer Audiodaten in Betracht ziehen, bei dem Profildaten nicht an Dritte zusammengeführt werden Dienstleistungen.
Einer der Werte der Arbeit eines Programmierers ist die Einfachheit und, wenn möglich, der prägnante Code. Daher werden wir mehrere vorhandene Bibliotheken zusammenkleben, um die gewünschte Lösung zu erhalten.
Das Dienstprogramm funktioniert folgendermaßen:
dotnet vkm [login] [password] [audio-lemma]
Lassen Sie uns zunächst ein Repository erstellen und die Projektabhängigkeiten in einer csproj-Datei beschreiben
<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>
Danach können Sie mit gutem Gewissen mit dem Schreiben von Code beginnen. Wir benötigen eine Autorisierung des Dienstprogramms in VK mit vollem Zugriff auf unser Profil. Und wie wir sehen können, ist dies dank des .NET-Ökosystems unglaublich einfach:
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;
}
}
Beschreiben wir den Einstiegspunkt und den Filter der geladenen Audioaufnahmen. Wir verwenden hierfür Programme der obersten Ebene und validieren die Argumente direkt in der Datei Application.cs, während wir die API initialisieren
var vk = args.Length switch
{
3 => LoginToVkApi(args[0], args[1]),
_ => throw new ArgumentException("Invalid arguments. Usage:\n" +
" dotnet vkm [login] [password] [audio]\n" +
)
};
Bringen Sie das Lemma dazu, nach einer Audioaufnahme in Großbuchstaben zu suchen
var lemma = args.Last().ToUpperInvariant();
Und wir verwenden Linq für alle Audioaufnahmen mit seinem Eintrag. Besonderer Dank geht an habrauserSuperHackerVkfür einen Weg, um einen MP3-Link mit einem regulären zu bekommen .
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"
)));
Schließlich müssen Sie nur noch Ihr gefundenes Audio hochladen:
using var http = new HttpClient();
foreach (var (title, url) in audios)
{
$"Downloading {title}...".Println(DarkBlue);
await WriteAllBytesAsync($"{title}.mp3", await http.GetByteArrayAsync(url));
}
Das ist alles! Das Dienstprogramm ist geschrieben und für den persönlichen Gebrauch bereit. Es fällt auf, dass C # von Jahr zu Jahr mehr und mehr zu einem guten Multitool wird, mit dem Sie eine Vielzahl von Aufgaben lösen können. Durch die Erweiterung der syntaktischen Funktionen, die die Sprache bei Ankündigung zu überladen scheinen, können Sie in der Praxis den Code verkürzen und ihn einfach und verständlich machen.
GitHub-Repository mit geringfügigen Ergänzungen und Startdokumentation .
Habt einen schönen Tag allerseits!