Информация для тех, кому интересно как же это все работает. И как можно было самому до всего этого дойти. Конечно тут без знания программирования, HTML, Javascript не обойтись. Если у Вас нет этих знаний, то скорее всего информация, которая пойдет ниже, Вам не поможет.
Первое что нужно понять - это что такое подмена URL в браузере и что нам дает вставка такого Javascript кода в адресной строке. Так вот, когда страница контакта с музыкой открыта, то HtmlDocument браузера содержится полностью ее код. И здесь не только HTML, но и подгруженные CSS, Javascripts и так далее. Когда же мы вставляем Javascript в адресную строку, то он тут же прописывается в HtmlDocument.
Вернемся к странице с музыкой, давайте посмотрим ее HTML код. В нем вы можете увидеть тэги, в которые завернуты мини-плееры для песен. Выглядят они следующим образом:
Код: Выделить всё
<tr>
<td style="width: 20px; vertical-align:top">
<img class="playimg"
onclick="return operate(63101308,4373,18572987,'037180c89420',279);"
id="imgbutton63101308" nosorthandle="true" src="images/play.gif"/>
</td>
<td style="width: 440px;">
<div style='float:left'>
<b id="performer63101308">
<a href='gsearch.php?section=audio&c[q]=Alexander Rybak'>Alexander Rybak</a>
</b> -
<span id="title63101308">Fairytale (Subway Funk drum'n'bass bootleg)</span>
</div><div class="duration">4:39</div>
</td>
</tr>
По названию любой композиции легко можно найти кусок HTML кода, отвечающий за отображение плеера для этой песни. Посмотрим внимательнее на этот блок. В нем видно, что при нажатии на картинку с классом playimg вызывается некоторая функция operate(63101308,4373,18572987,'037180c89420',279). Мне кажется, что тут даже из названий все понятно. Очевидно, что функция operate и есть та самая функция, которая заставляет зазвучать песню. Будем искать ее реализацию.
Смотрим снова HTML код страницы, а именно ищем в head подключение Javascript-ов. В коде можно найти целых 7 таких подключений. К счастью их названия говорят сами за себя, поэтому нам не придется искать нашу функцию во всех, а мы сразу заглянем в /js/audio.js. Открыть этот файл можно по адресу
http://vkontakte.ru/js/audio.js. Если вы воспользуетесь поиском и найдете в файле функцию operate, то здесь вы увидите, что данная функция разбирает входные параметры и с ними вызывает другую функцию doOperate. Сейчас мне интересна функция doOperate, т.к. в ней происходит классная вещь: параметры записываются в некий массив fileInfo! А нам разве не mp3 файл вытащить нужно?
Осталось понять что из себя представляет структура fileInfo, т.е. как из нее получить имя файла. Если еще покопаться в Javascript файле, то можно найти очень много интересных функций. Не буду описывать все мои поиски, основной находкой было то, что есть еще некая флэшка, находящаяся по адресу
http://vkontakte.ru/swf/AudioPlayer_wall.swf. Я ее зачем-то выкачал, думал декомпилироваться прийдется. Потом вспомнил, что к флэшке все равно по GET или POST запросу пойдет обращение. Поэтому все обошлось без декомпиляций и помог мне обычный HTTP сниффер. Зашел я на страницу с песнями, запустил сниффер, нажал Play и увидел, что запрос идет сначала к флэшке, а потом уходит по адресу
http://cs4373.vkontakte.ru/u18572987/au ... c89420.mp3. О да, этот URL имеет много общего с параметрами, передающимися в функцию operate.
Кстати, флэшка эта похоже отвечает только за отображение бегунка, т.к. в нее никакие данные по HTTP не передавались, но все могло быть иначе. Конечно я сделал много лишних шагов. Можно было сразу сниффером воспользоваться, т.к. понятно, что mp3 где-то удаленно хранится и к ней 100% будет идти обращение. Тогда бы нам вообще никакого дела до флэшки не было. Но я надеюсь описание всего хода моих мыслей поможет Вам в поисках при решении других задач.
Дело остается за малым: написать свою функцию operate, которая будет обрабатывать событие onclick и отдавать нам mp3-ку с сервера контакта. Для тех, кто увлекся и забыл: функция была приведена в начале статьи. Чтобы она сработала, мы ее просто вставляем в адресную строку браузера, подменяя ей ту, что была загружена вместе со страницей в HtmlDocument. Пользуйтесь на здоровье!