Получение любимых аудиозаписей с pandora.com

от автора

Для тех, кто не знает, pandora.com — интернет-радио, которое подбирает песни, согласно предпочтениям пользователей. Недавно один мой друг захотел скачать список любимых аудиозаписей. Но на самой пандоре, такой возможности нет. Поэтому пришлось влезть в ее нутро…

Итак, с пандоры будем получать список названий песен и исполнителей, потом с помощью API контакта будем их скачивать.

Шаг 1. Идем на пандору, и смотрим, что у нас происходит при запросе списка любимых песен. Наблюдаем такой запрос:

Request URL:http://www.pandora.com/content/tracklikes?likeStartIndex=0&thumbStartIndex=5&webname=evgeny.vyalyy&cachebuster=1367100054190 Request Method:GET Status Code:200 OK  Request Headersview source Accept:*/* Accept-Charset:windows-1251,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:ru,en-US;q=0.8,en;q=0.6 Cookie:at=wNCFSbEDa7LTetjSbEwrXhkSGCSClV6j9vdiwaygcF8uwpsRlRg7usr3YsGsoHBfLJI3/y+zfNsMtHtvG5AA2Qg%3D%3D; v3ad=1:20:1:48206::5:0:0:0:505:011:MI:26163:0:1:0:0; __utma=118078728.1866197791.1367091864.1367091864.1367098565.2; __utmb=118078728.4.10.1367098565; __utmc=118078728; __utmz=118078728.1367091864.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); v2regbstage=true; atn=AT-1367099945481-858 Host:www.pandora.com Proxy-Connection:keep-alive Referer:http://www.pandora.com/profile/likes/evgeny.vyalyy User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22 X-Requested-With:XMLHttpRequest Query String Parametersview sourceview URL encoded likeStartIndex:0 thumbStartIndex:5 webname:evgeny.vyalyy cachebuster:1367100054190v 

Попробуем смоделировать этот запрос. Используем связку python requests + BeautifulSoup:

resp = response.get("http://www.pandora.com/content/tracklikes?likeStartIndex=0&thumbStartIndex=5&webname=evgeny.vyalyy&cachebuster=1367100054190",      headers={"Cookie":"at=wNCFSbEDa7LTetjSbEwrXhkSGCSClV6j9vdiwaygcF8uwpsRlRg7usr3YsGsoHBfLJI3/y+zfNsMtHtvG5AA2Qg%3D%3D; v3ad=1:20:1:48206::5:0:0:0:505:011:MI:26163:0:1:0:0; __utma=118078728.1866197791.1367091864.1367091864.1367098565.2; __utmb=118078728.4.10.1367098565; __utmc=118078728; __utmz=118078728.1367091864.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); v2regbstage=true; atn=AT-1367099945481-858"})  soup = BeautifulSoup.BeautifulSoup(resp.text) print soup 

Получаем много много не очень информативного html.

Но наш запрос содержит как-то подозрительно много параметров. Попробуем чуть сократить:

resp = response.get("http://www.pandora.com/content/tracklikes?likeStartIndex=0&thumbStartIndex=5&webname=evgeny.vyalyy",      headers={"Cookie":"at=wNCFSbEDa7LTetjSbEwrXhkSGCSClV6j9vdiwaygcF8uwpsRlRg7usr3YsGsoHBfLJI3/y+zfNsMtHtvG5AA2Qg%3D%3D;"})  soup = BeautifulSoup.BeautifulSoup(resp.text) print soup 

Ура, ответ не изменился!
Теперь, покопавшись в ответе, получаем, что вся информация хранится в div-е с классом infobox-body. Вот как выглядит этот div:

<div class="infobox-body"> <h3 class="s-0 line-h-1_4 normal"> <a href="/lynyrd-skynyrd/live-from-freedom-hall/sweet-home-alabama-live-from-freedom-hall" class="first">Sweet Home Alabama (Live From Freedom Hall)</a> </h3> <p class="s-0 line-h-1_4"> 						by <a href="/lynyrd-skynyrd">Lynyrd Skynyrd</a> </p> <p class="s-0 line-h-1_4"> <span class="profile_user_name">You</span> liked this on <a href="#" data-viewer-is-owner="true" data-station-id="1380018751859442317" class="like_context_stationname">The Offspring Radio</a>. 	 					</p> </div> 

Итак, теперь мы можем вытащить всю интересующую нас информацию:

import re PATT = re.compile(">(.*?)<") for x in soup.findAll(attrs={"class":"infobox-body"}):         print [PATT.findall(str(x.a))[0], PATT.findall(str(x.p.a))[0]] 

Первый шаг пройден! =)

Шаг второй. Поиск и скачивание записей из vk.com

Идем на vk.com/editapp?act=create и создаем новое приложение. Теперь надо получить access_token. Чтобы не мучаться, я решил получать access_token вручную, и просто вставлять его в тело скрипта. Итак, идем на
https://oauth.vk.com/authorize?client_id=3608669&scope=audio&redirect_uri=https://oauth.vk.com/blank&display=wap&response_type=token
Нас редиректит на новую страницу
https://oauth.vk.com/blank.html#access_token=***&expires_in=86400&user_id=17738938

Вытаскиваем из якоря интересующий нас access_token. Его мы будем использовать для запросов к vk.api.

Пишем небольшую функцию поиска аудио:

ACCESS_TOKEN = *** def audio_search(string):     resp = r.get("https://api.vk.com/method/audio.search?q=%(q)s&sort=2&access_token=%(ACCESS_TOKEN)s"%{"q":string, "ACCESS_TOKEN":ACCESS_TOKEN})     return resp.json() 

Она возвращает самый популярный результат поиска строки string(среди аудиозаписей).
Ответ функции такой:

>>> audio_search("My little horse") {u'response': [1, {u'album': u'27504721', u'artist': u'\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d', u'url': u'http://cs521522.vk.me/u3391535/audios/746ddef4902c.mp3', u'title': u'my little horse', u'duration': 208, u'aid': 159749117, u'owner_id': 3391535}]} 

Теперь мы знаем url для скачивания. Скачать можно с помощью стандартной функции urllib.urlretrieve.

Итого получился вот такой скрипт:

yadi.sk/d/MrUThxsN4P3zs

Как с ним работать:

1) Скрипт требует установленных пакетов requests и BeautifulSoup( sudo pip install requests BeautifulSoup)
2) Нужно получить значение куки at =… с pandora.com
3) Нужно получить ACCESS_TOKEN как это сделано выше
4) Нужно установить параметр COUNT_OF_SONGS — число песен, которое хочется скачать (None, если надо скачать все)
5) DOWNLOAD_FOLDER_NAME = «audio» — директория, куда будет сохраняться скачанная музыка.

Соответствующие параметры прописать в теле скрипта.
Слушайте любимую музыку, и помните, что пиратство — грех =)

ссылка на оригинал статьи http://habrahabr.ru/post/178215/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *