Basé sur youtube-dl: VK music

image

En 2020, nous utilisons différents services de musique, mais en tant que relique d'une époque révolue, dans un profil VK oublié, beaucoup ont de la musique. Il n'y a pas de fonction de téléchargement, mais que faire si vous avez désespérément besoin de sauvegarder l'enregistrement audio?

Étant donné qu'un tel logiciel n'a pas été trouvé dans le domaine public, à l'exception de quelques services Web nécessitant une autorisation via VK (ce qui n'est pas très sûr), dans le cadre de la coupe, nous examinerons le processus de création d'un utilitaire auto-hébergé dans C # moderne pour télécharger votre audio, qui ne fusionne pas les données de profil à des tiers. prestations de service.



L'une des valeurs du travail d'un programmeur est la simplicité et, si possible, la concision du code. Par conséquent, nous allons coller plusieurs bibliothèques existantes pour obtenir la solution souhaitée.

L'utilitaire fonctionnera comme ceci:

 dotnet vkm [login] [password] [audio-lemma]


Tout d'abord, créons un référentiel et décrivons les dépendances du projet dans un fichier 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>


Après cela, en toute conscience, vous pouvez commencer à écrire du code. Nous aurons besoin d'une autorisation de l'utilitaire dans VK avec un accès complet à notre profil. Et comme nous pouvons le voir, grâce à l'écosystème .NET, il est incroyablement facile de le faire:

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;
    }
}


Décrivons le point d'entrée et le filtre des enregistrements audio chargés. Nous utilisons des programmes de premier niveau pour cela et validons les arguments directement dans le fichier Application.cs, lors de l'initialisation de l'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" +
    )
};


Apporter le lemme pour rechercher un enregistrement audio en majuscules

var lemma = args.Last().ToUpperInvariant();


Et nous utilisons Linq pour tous les enregistrements audio avec son entrée. Remerciements particuliers à habrauserSuperHackerVkpour un moyen d'obtenir un lien mp3 avec un fichier régulier .

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"
    )));


Enfin, il ne vous reste plus qu'à télécharger votre audio trouvé:

using var http = new HttpClient();
foreach (var (title, url) in audios)
{
    $"Downloading {title}...".Println(DarkBlue);
    await WriteAllBytesAsync($"{title}.mp3", await http.GetByteArrayAsync(url));
}


C'est tout! L'utilitaire est écrit et prêt pour un usage personnel. On voit comment C # se transforme de plus en plus chaque année en un bon multi-outil qui vous permet de résoudre n'importe quel éventail de tâches. Les améliorations des capacités syntaxiques qui semblent encombrer le langage lorsqu'elles sont annoncées, en pratique, au contraire, vous permettent de raccourcir le code et de le rendre simple et compréhensible.



Dépôt GitHub avec ajouts mineurs et documentation de lancement .

passez une bonne journée tout le monde!



All Articles