Em 2020, utilizamos diversos serviços de música, mas como relíquia de uma época passada, no esquecido perfil VK, muitos têm música. Não há função de download, mas e se você precisar desesperadamente salvar a gravação de áudio?
Como tal software não foi encontrado em domínio público, exceto por alguns serviços da web que requerem autorização via VK (o que não é muito seguro), a seguir consideraremos o processo de criação de um utilitário auto-hospedado em C # moderno para enviar seu áudio, que não mescla dados de perfil a terceiros Serviços.
Um dos valores do trabalho do programador é a simplicidade e, se possível, a concisão do código. Portanto, iremos colar várias bibliotecas existentes para obter a solução desejada.
O utilitário funcionará assim:
dotnet vkm [login] [password] [audio-lemma]
Em primeiro lugar, vamos criar um repositório e descrever as dependências do projeto em um arquivo 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>
Depois disso, com a consciência limpa, você pode começar a escrever códigos. Precisaremos de autorização do utilitário em VK com acesso total ao nosso perfil. E, como podemos ver, graças ao ecossistema .NET, é incrivelmente fácil fazer isso:
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;
}
}
Vamos descrever o ponto de entrada e o filtro das gravações de áudio carregadas. Usamos programas de nível superior para isso e validamos os argumentos diretamente no arquivo Application.cs, ao inicializar a 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" +
)
};
Trazendo o lema para procurar uma gravação de áudio em maiúsculas
var lemma = args.Last().ToUpperInvariant();
E usamos o Linq para todas as gravações de áudio com sua entrada. Agradecimentos especiais para habrauserSuperHackerVkpara obter um link de mp3 com um 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"
)));
Finalmente, tudo o que resta é fazer o upload do áudio encontrado:
using var http = new HttpClient();
foreach (var (title, url) in audios)
{
$"Downloading {title}...".Println(DarkBlue);
await WriteAllBytesAsync($"{title}.mp3", await http.GetByteArrayAsync(url));
}
Isso é tudo! O utilitário está escrito e pronto para uso pessoal. É notável como o C # está se transformando cada vez mais em uma boa ferramenta multifuncional a cada ano que permite resolver qualquer variedade de tarefas. Aprimoramentos nos recursos sintáticos que parecem confundir a linguagem quando anunciados, na prática, ao contrário, permitem encurtar o código e torná-lo simples e compreensível.
Repositório GitHub com pequenas adições e documentação de lançamento .
Tenha um ótimo dia a todos!