Скачування музики з Вконтакте за альбомами - VKontakte Music Backuper

  1. 1. Авторизація
  2. 2.Отримання списку аудіо-записів
  3. 2.2 Розбір спеціальних запитів
  4. 3. Завантаження mp3-файлів
  5. 4. Необхідні дрібниці
  6. 4.1. Усунення неприпустимих символів в іменах файлів
  7. 4.2.Транслітерація імен файлів
  8. 4.3.Пропуск завантажених файлів
  9. висновок

Ті, кому цікаво кінцеве додаток для скачування музики з Вконтакте за альбомами, можуть завантажити його по   засланні

Ті, кому цікаво кінцеве додаток для скачування музики з Вконтакте за альбомами, можуть завантажити його по засланні . Для запуску потрібно .Net Framework 3.5 - можна скачати з сайту Microsoft.com . Користуватися дуже просто - ввести електронну пошту, пароль, авторизуватися. Якщо потрібно, змінити ID користувача для якого показаний список аудіо. Далі поставити галочки на альбомах, які потрібно завантажити і натиснути кнопку «скачати альбоми». Можна качати окремі композиції. З тими ж, кого цікавлять букви і реалізація, продовжуємо. Користувачі Linux і Mac Os можуть скористатися додатком за допомогою проекту Mono , В Ubuntu мені було досить виконати повну установку Mono командою sudo apt-get install mono-complete. Далі можна запускати програму з консолі командою mono VkontakteMusicBackuper.exe або звичайним подвійним кліком. Крім того, можна скористатися сервісом Muzico.biz , Щоб слухати і завантажувати і записи прямо з сайту.

Велика і могутня соціальна мережа Вконтакте давно набула слави хостингу аудіо-записів. Судячи з кількості людей, у яких список музики складають сотні і тисячі композицій, викачування музики є досить нагальною проблемою.

Звичайно ж, посилання на mp3-файли доступні у вихідному коді сторінки. Крім того, є розширення у вигляді Букмарклет, такі як savefrom.net, які відображають посилання на скачування прямо при відтворенні музики або відео. Існує дуже зручний додаток для пошуку і скачування музики з вконтакте під назвою VKMusic . Хоч там і заявлена ​​підтримка альбомів, ті альбоми, що створює сам користувач скачати можна.

Тому пишемо свій велосипед. Знання про те на C # зробити скачування файлів по http, парсити html рано чи пізно стануть в нагоді. Правильніше було б використовувати Вконтакте API, але там все одно теж немає можливості отримання альбомів.

1. Авторизація

При авторизації користувача у відповіді повертається ID користувача, а так само remixsid - ключ, що зберігається в cookies браузера і переданий на випадок повторних запитів до сайту. Повторюємо авторизацію Вконтакте:

public class VKUserInfo {public String SID {get; set; } Public int UserID {get; set; }} Public static class VKUtils {/// <summary> Авторизація до Vkontakte.ru з отриманням id і SID користувача </ summary> public static VKUserInfo LoginToVkontakte (String email, String password) {// створюємо запит HttpWebRequest wrGETURL = (HttpWebRequest) WebRequest.Create ( "http://vkontakte.ru/login.php?m=1&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;email=" + email + "; pass =" + password); // Забороняємо редирект wrGETURL.AllowAutoRedirect = false; // Виставляємо таймаут wrGETURL.Timeout = 100000; // отримуємо вся відповідь HttpWebResponse myHttpWebResponse = (HttpWebResponse) wrGETURL.GetResponse (); // отримуємо Headers, що прийшли у відповіді string headers = myHttpWebResponse.Headers.ToString (); // записуємо відповідь в потік StreamReader myStreamReadermy = new StreamReader (myHttpWebResponse.GetResponseStream (), Encoding.GetEncoding (одна тисяча двісті п'ятьдесят одна)); // отримуємо рядок з відповіддю string page = myStreamReadermy.ReadToEnd (); // це регулярний вираз, яке видирає з змінної headers (а її ми отримали вище) значення sid Regex sidregex = new Regex ( "sid = ([a-z0-9] +); exp"); Match ssid = sidregex.Match (headers); String sid = ssid.Groups [1] .Value; // Отримання ID користувача int id = 0; String location = myHttpWebResponse.Headers [ "Location"]; if ((location! = null) & amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; & amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; (location.Length> 3)) {location = location.Substring (3); Int32.TryParse (location, out id); } VKUserInfo info = new VKUserInfo () {SID = sid, UserID = id}; return info; }}

2.Отримання списку аудіо-записів

2.1 Прямий розбір HTML-сторінок

Перша думка була парсити безпосередньо сторінку з аудіо. Все було б добре, якби повсюдно запроваджене достаток AJAX і просто JavaScript. При перегляді сторінки з аудіо є список аудіо-записів, що зберігається в об'єкті cur.audioList, за яким формується висновок. Записи в цьому об'єкті, звичайно зберігаються зручно за альбомами, але без інтерпретації JavaScript способів отримати такий же список я не знаю. Тому переходимо до наступного пункту.

2.2 Розбір спеціальних запитів

Вибираємо вкладку «Мережа» в FireBug і відкриваємо сторінку з аудіозаписами. В очі кидається POST запит до адресою vk.com/audio c приблизно таким вмістом (в кінці id користувача)

act = load_audios_silent & al = 1 & edit = 0 & gid = 0 & id = 1

public static String PostRequest (String url, Cookie sidCookie) {// створюємо запит HttpWebRequest wrPOSTURL = (HttpWebRequest) System.Net.WebRequest.Create (url); wrPOSTURL.Method = "Post"; //wrGETURL.Headers.Add (cook.ToString ()); wrPOSTURL.Headers [ "Cookie"] = sidCookie.ToString (); HttpWebResponse myHttpWebResponse = (HttpWebResponse) wrPOSTURL.GetResponse (); StreamReader myStreamReadermy = new StreamReader (myHttpWebResponse.GetResponseStream (), Encoding.GetEncoding (1251)); string page = myStreamReadermy.ReadToEnd (); return page; }


У відповіді є шматок з приблизно таким змістом:
{ «All»: [

[ '1', '111975538', 'http: //cs4606.vk.com/u86478002/audio/9a974e71ebce.mp3','177','2: 57', 'The Daydream', 'Wedding Day', ' 0 ',' 16634864 ',' 0 '],
[ '1', '111975520', 'http: //cs4523.vk.com/u715254/audio/45f926acea24.mp3','263','4: 23', 'Radio Monte Carlo (105.9 fm)', ' And I just want you ',' 0 ',' 16634867 ',' 0 ']
]}

Тут перша одиничка - id користувача, числа 16634864 та 16634867 - ідентифікатори альбомів, які описані після аудіозаписів.

З приводу альбомів є один момент, який варто згадати. За простоті душевній, думав, що можна одну і ту ж пісню класти в кілька альбомів. Насправді ж, при додаванні пісні до альбому, вона видаляється з попереднього. Кожна пісня зберігається тільки в одному альбомі.

3. Завантаження mp3-файлів

Залишилося зробити скачування mp3-файлів з Вконтакте за тим самим отриманим посиланнях. Дуже просте рішення без відновлення завантаження, при помилці скачування файлу він просто пропускається. Нижче - обробник DoWork для BackGroundWorker

private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e) {try {List <song> current_list = songs_to_download.ToList (); Song current = null; for (int i = 0; i <current_list.Count; i ++) {try {current = current_list & # 91; i & # 93 ;; // the URL to download the file from string sUrlToReadFileFrom = current.DownloadURL; // the path to write the file to string sFilePathToWriteFileTo = MusicDownloader.GetPath (current, albums, txtDirOut.Text, cbAlbumCatalog.Checked, cbAuthorCatalogs.Checked, CbTranslit.Checked); // first, we need to get the exact size (in bytes) of the file we are downloading Uri url = new Uri (sUrlToReadFileFrom); System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create (url); // if (cook! = Null) {request.Headers & # 91; "Cookie" & # 93; = Cook.ToString (); } // System.Net.HttpWebResponse response = (System.Net.HttpWebResponse) request.GetResponse (); response.Close (); // gets the size of the file in bytes Int64 iSize = response.ContentLength; // keeps track of the total bytes downloaded so we can update the progress bar Int64 iRunningByteTotal = 0; // use the webclient object to download the file using (System.Net.WebClient client = new System.Net.WebClient ()) {// open the file at the remote URL for reading using (System.IO.Stream streamRemote = client .OpenRead (new Uri (sUrlToReadFileFrom))) {// using the FileStream object, we can write the downloaded bytes to the file system using (Stream streamLocal = new FileStream (sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None) ) {// loop the stream and get the file into the byte buffer int iByteSize = 0; byte & # 91; & # 93; byteBuffer = new byte & # 91; iSize & # 93 ;; while ((iByteSize = streamRemote.Read (byteBuffer, 0, byteBuffer.Length))> 0) {// write the bytes to the file system at the file path specified streamLocal.Write (byteBuffer, 0, iByteSize); streamLocal.Flush (); // iRunningByteTotal + = iByteSize; // calculate the progress out of a base "100" double dIndex = (double) (iRunningByteTotal); double dTotal = (double) byteBuffer.Length; double dProgressPercentage = (dIndex / dTotal); int iProgressPercentage = (int) (dProgressPercentage * 100); // update the progress bar int iTotalPercentage = (int) ((double) i / current_list.Count * 100); backgroundWorker1.ReportProgress (iTotalPercentage, new DownloadState () {SongName = current.FileNameForSave, SongPercent = iProgressPercentage, TotalCount = current_list.Count, index = i}); } // clean up the file stream streamLocal.Close (); } // close the connection to the remote server streamRemote.Close (); }}} Catch (Exception exc) {AddLog ( "Файл" + current.FileNameForSave + "Помилка:" + exc.Message); }} BackgroundWorker1.ReportProgress (100, new DownloadState () {SongName = "Завантаження завершено", SongPercent = 100}); } Catch (Exception exc) {ShowException (exc); backgroundWorker1.ReportProgress (0, new DownloadState () {SongName = "Помилка при скачуванні", SongPercent = 0}); }}

4. Необхідні дрібниці

Якщо зберігати файли просто утворюючи шлях по імені альбому, виконавцеві і назвою композиції, виникають наступні проблеми:

4.1. Усунення неприпустимих символів в іменах файлів

Не всі символи однаково корисні, тому при генерації імені файлу, лапки я заміняю на апострофи, а всі інші неприпустимі символи - на символ підкреслення.

4.2.Транслітерація імен файлів

Галочка в додатку за замовчуванням відключена, але якщо хтось не хоче, імена файлів можуть транслітеруватись в латиницю.

4.3.Пропуск завантажених файлів

Якщо опція включена, то якщо є файл на диску вже є і його розмір збігається з розміром файлу на сервері, файл скачиваться ще раз не буде.

висновок

Все, таким інструментом вже можна користуватися. Звичайно ж, необхідний повноцінний менеджер завантаження, тут немає підтримки proxy-серверів і багато-багато інших кошерних речей. Якщо додаток буде затребуване, можна і дописати, поки ж цих можливостей вистачає.

Слід пам'ятати, що використання подібних інструментів призводить до порушення Користувальницької угоди ВКонтакте.

Пункт 5.3.9 (забороняється). використовувати без спеціального на те дозволу Адміністрації Сайту автоматизовані скрипти (програми) для збору інформації на Сайті і (або) взаємодії з Сайтом і його сервісами

Приємного прослуховування!

[Audio: http: //yahnev.ru/music/Radio%20MonteCarlo%20 (105.9% 20fm)% 20-% 20And% 20I% 20just% 20want% 20you.mp3]

завантажити вихідний код додатки
Посилання по темі:

Php?
IRC (Internet Relay Chat)