youtube-dlに基づく:VK music

画像

2020年にはさまざまな音楽サービスを利用していますが、過ぎ去った時代の遺物として、忘れられていたVKプロフィールでは、多くの人が音楽を持っています。ダウンロード機能はありませんが、どうしても録音を保存する必要がある場合はどうすればよいですか?

このようなソフトウェアはパブリックドメインで見つからなかったため、VKを介した承認が必要ないくつかのWebサービス(安全性はあまり高くありません)を除いて、最新のC#でセルフホストユーティリティを作成してオーディオをアップロードするプロセスを検討します。これにより、プロファイルデータがサードパーティにマージされません。サービス。



プログラマーの仕事の価値の1つは、シンプルさと、可能であれば簡潔なコードです。したがって、いくつかの既存のライブラリを接着して、目的のソリューションを取得します。

ユーティリティは次のように機能します。

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


まず、リポジトリを作成し、プロジェクトの依存関係を1つの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>


その後、明確な良識を持って、コードを書き始めることができます。プロファイルへのフルアクセスを備えたVKのユーティリティの承認が必要になります。ご覧のとおり、.NETエコシステムのおかげで、これを行うのは非常に簡単です。

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


ロードされたオーディオ録音のエントリポイントとフィルタについて説明しましょう。これにはトップレベルのプログラムを使用し、apiを初期化しながら、Application.csファイルで引数を検証します。

var vk = args.Length switch
{
    3 => LoginToVkApi(args[0], args[1]),
    _ => throw new ArgumentException("Invalid arguments. Usage:\n" +
        "  dotnet vkm [login] [password] [audio]\n" +
    )
};


オーディオ録音を検索するための補題を大文字にする

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


また、エントリを含むすべてのオーディオ録音にLinqを使用します。habrauserに感謝しますSuperHackerVk通常のでmp3リンクを取得する方法について

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


最後に、残っているのは、見つかったオーディオをアップロードすることだけです。

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


それで全部です!ユーティリティは書かれていて、個人的に使用する準備ができています。毎年、C#があらゆる範囲のタスクを解決できる優れたマルチツールになっていることは注目に値します。逆に、発表されたときに言語が乱雑に見える構文機能の拡張により、コードを短くして、シンプルで理解しやすくすることができます。



マイナーな追加と起動ドキュメントを含むGitHub上のリポジトリ

みなさん、素晴らしい一日を!



All Articles