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

в 22:31, , рубрики: pandora.com, python, музыка, метки: , ,

Для тех, кто не знает, 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'u041du0435u0438u0437u0432u0435u0441u0442u0435u043d', 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» — директория, куда будет сохраняться скачанная музыка.

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

Автор: sallyruthstruik

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js