في عام 2020 ، نستخدم خدمات موسيقية مختلفة ، ولكن كأحد بقايا حقبة ماضية ، في ملف تعريف VK المنسي ، يمتلك الكثيرون موسيقى. لا توجد وظيفة تنزيل ، ولكن ماذا لو كنت في أمس الحاجة إلى حفظ التسجيل الصوتي؟
نظرًا لأن مثل هذا البرنامج لم يتم العثور عليه في المجال العام ، باستثناء بعض خدمات الويب التي تتطلب ترخيصًا عبر VK (وهو ليس آمنًا جدًا) ، فسننظر في عملية إنشاء أداة مساعدة ذاتية الاستضافة في C # الحديثة لتحميل الصوت الخاص بك ، والتي لا تدمج بيانات ملف التعريف إلى جهة خارجية خدمات.
إحدى قيم عمل المبرمج هي البساطة ، وإذا أمكن ، الرمز المختصر. لذلك ، سنقوم بلصق العديد من المكتبات الموجودة للحصول على الحل المطلوب.
ستعمل الأداة على النحو التالي:
dotnet vkm [login] [password] [audio-lemma]
بادئ ذي بدء ، دعونا ننشئ مستودعًا ونصف تبعيات المشروع في ملف 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;
}
}
دعونا نصف نقطة الدخول وتصفية التسجيلات الصوتية المحملة. نحن نستخدم برامج عالية المستوى لهذا الأمر ونتحقق من صحة الوسائط في ملف 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" +
)
};
جلب lemma للبحث عن تسجيل صوتي بأحرف كبيرة
var lemma = args.Last().ToUpperInvariant();
ونستخدم Linq لجميع التسجيلات الصوتية مع إدخالها. شكر خاص ل habrauserسوبيرهاكرل طريقة للحصول على وصلة 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 مع إضافات طفيفة ووثائق التشغيل .
اتمنى لكم يوما سعيدا!