Здравствуйте,
я пишу скриптик для закачивания музыки с контакта. Первая версия, которая была утеряна, простая - через curl авторизируюсь, открываю страничку поиска с введенными параметрами поиска (исполнитель, название) и получаю страничку-результат.
Хочу усовершенствовать.
Во-первых, нужна какая-то проверка на то, авторизирован уже пользователь или нет. Я так понимаю, что для этого нужно проверять куки? Или как корректнее это провернуть?
Во-вторых, я получаю файл. Могу ли я его через jquery пропустить и по тегам получить ссылки на песни? Как тогда передать переменную, содержащую файл? Или регекспами в php лучше? Или есть еще какие-то способы?
1. KvitkaLavi - 20 Мая, 2012 - 00:19:40 - перейти к сообщению
2. OrmaJever - 20 Мая, 2012 - 00:53:56 - перейти к сообщению
1) открываете главную страницу вк и в заголовках ищите редирект на страницу пользователя или feed, если его нет значит и авторизации нет.
2) парсить сылку на песню регулярками
2) парсить сылку на песню регулярками
3. DeepVarvar - 20 Мая, 2012 - 02:36:54 - перейти к сообщению
KvitkaLavi, OrmaJever, bash скрипт использующий API вконтакте без авторизации, давно им сам пользуюсь:
Спойлер (Отобразить)
CODE (javascript):
скопировать код в буфер обмена
скопировать код в буфер обмена
- #!/bin/bash
- #################################################################
- ########### VKSearch script (c) snoopcatt, 2010-2011 ############
- ########### Licensed under GNU GPL v2. ##########################
- #################################################################
- #####################################################
- sys_version="0.3b"
- sys_method='audio.search'
- sys_temp='/tmp'
- vkapi_secret='dTckAoaSzH'
- vkapi_appid='1696393'
- vkapi_id="5807425"
- cfg_save_to="$HOME"
- cfg_new_playlist='1'
- cfg_write_tags='0'
- cfg_search_count='300'
- cfg_mplayer='/usr/bin/mplayer -playlist'
- cfg_wget="/usr/bin/curl -#"
- cfg_mode='play'
- ######################################################
- Info() {
- echo "[$(date +%k:%M:%S)] $1"
- [ "$2" == "die" ] && exit 1
- }
- ShowHelp() {
- echo "VKSearch $sys_version: Поиск, прослушивание и закачка музыки с сайта VKontakte.ru!"
- echo "Для работы скрипта не требуется авторизация ВКонтакте. by snoopcatt, © 2010-2011. Лицензировано под GNU GPL v2."
- echo -e "* Использование: vksearch [опции] запрос"
- echo -e "\t--help: показать это сообщение и закрыть vksearch\n"
- echo -e "\t--user-playlist: использовать плейлист пользователя по ID"
- echo -e "\t--search: использовать поиск по всей коллекции ВК\n"
- echo -e "\t--play: проиграть найденный список треков"
- echo -e "\t--get: скачать найденный список треков"
- echo -e "\t--play-one: проиграть один из найденных треков"
- echo -e "\t--get-one: скачать один трек"
- echo -e "\t--make-playlist: создать плейлист\n"
- echo -e "\t--count=N: искать N треков"
- echo -e "\t--save-to=PATH: сохранять плейлист и треки в указанный PATH"
- echo -e "\t--write-tags: записывать Id3v2 теги в скачанные треки"
- echo -e "\t--get-lyrics: скачать текст песни"
- exit 0
- }
- GetParams() {
- for var in $@
- do
- case $var in
- --help) ShowHelp;;
- --user-playlist) sys_method='audio.get' ;;
- --search) sys_method='audio.search' ;;
- --get-lyrics) sys_method='audio.getLyrics' && cfg_mode='get-lyrics' ;;
- --play) cfg_mode=play ;;
- --get) cfg_mode=get ;;
- --play-one) cfg_mode=play && cfg_search_count=1 ;;
- --get-one) cfg_mode=get && cfg_search_count=1 ;;
- --make-playlist) cfg_mode=make-playlist ;;
- --count=*) cfg_search_count=$(echo $var | cut -d '=' -f 2) ;;
- --save-to=*) cfg_save_to=$(echo $var | cut -d '=' -f 2) ;;
- --write-tags) cfg_write_tags=1 ;;
- --*) Info "Ошибка разбора аргументов: Неизвестный параметр $var" die ;;
- *) [ -z "$query" ] && query="${var}" || query="${query} ${var}" ;;
- esac
- done
- [ -z "$query" ] && ShowHelp
- }
- Request() {
- Info "Добро пожаловать в VKSearch $sys_version!"
- Info "Загрузка списка треков..."
- case $sys_method in
- "audio.get")
- vkapi_signature=$(echo -n "${vkapi_id}api_id=${vkapi_appid}method=audio.gettest_mode=1uid=${query}v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
- wget "http://api.vkontakte.ru/api.php?api_id=${vkapi_appid}&method=audio.get&uid=${query}&test_mode=1&v=2.0&sig=${vkapi_signature}" -qO "${sys_temp}/vksearch.out"
- found=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l) ;;
- "audio.search")
- vkapi_signature=$(echo -n "${vkapi_id}api_id=1696393count=${cfg_search_count}method=audio.searchq=${query}test_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
- wget "http://api.vkontakte.ru/api.php?api_id=1696393&count=${cfg_search_count}&v=2.0&method=audio.search&sig=${vkapi_signature}&test_mode=1&q=$query" -qO "${sys_temp}/vksearch.out"
- found=$(cat ${sys_temp}/vksearch.out | sed -ne 's,<count>\([^<]*\)</count>,\1,p'|sed 's/^[ \t]*//') ;;
- "audio.getLyrics")
- vkapi_signature=$(echo -n "${vkapi_id}api_id=1696393count=1lyrics=1method=audio.searchq=${query}test_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
- wget "http://api.vkontakte.ru/api.php?api_id=1696393&count=1&v=2.0&lyrics=1&method=audio.search&sig=${vkapi_signature}&test_mode=1&q=$query" -qO ${sys_temp}/vksearch.out
- lyrics_id="$(cat ${sys_temp}/vksearch.out | sed -n 's|<lyrics_id>\(.*\)</lyrics_id>|\1|p'|sed 's/^[ \t]*//')"
- vkapi_signature=$(echo -n "${vkapi_id}api_id=${vkapi_appid}lyrics_id=${lyrics_id}method=audio.getLyricstest_mode=1v=2.0${vkapi_secret}"|md5sum|awk '{print $1}')
- wget "http://api.vkontakte.ru/api.php?api_id=${vkapi_appid}&method=audio.getLyrics&lyrics_id=${lyrics_id}&test_mode=1&v=2.0&sig=${vkapi_signature}" -qO ${sys_temp}/vksearch.lyrics
- found=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l) ;;
- esac
- error_msg="$(cat ${sys_temp}/vksearch.out | sed -n 's|<error_msg>\(.*\)</error_msg>|\1|p'|sed 's/^[ \t]*//'|head -n1 )"
- error_code="$(cat ${sys_temp}/vksearch.out | sed -n 's|<error_code>\(.*\)</error_code>|\1|p'|sed 's/^[ \t]*//'|head -n1)"
- [ -n "$error_msg" ] && Info "Ошибка: $error_msg (Код $error_code)" die
- song_count=$(cat ${sys_temp}/vksearch.out | grep '<url>'|wc -l )
- [ $song_count -eq 0 ] && Info "По запросу ${query} не найдено ни одного трека..." die || Info "По запросу ${query} найдено ${found} композиций. Обработка первых ${song_count}."
- }
- Parse() {
- OLD_IFS=$IFS
- IFS=$'\n'
- song_urls=( `cat ${sys_temp}/vksearch.out | sed -n 's|<url>\(.*\)</url>|\1|p'|sed 's/^[ \t]*//' ` )
- song_artists=( `cat ${sys_temp}/vksearch.out | sed -n 's|<artist>\(.*\)</artist>|\1|p'|sed 's/^[ \t]*//' ` )
- song_titles=( `cat ${sys_temp}/vksearch.out | sed -n 's|<title>\(.*\)</title>|\1|p'|sed 's/^ //' ` )
- song_durations=( `cat ${sys_temp}/vksearch.out |sed -n 's|<duration>\(.*\)</duration>|\1|p'|sed 's/^[ \t]*//' ` )
- song_counts=$(( ${#song_urls[@]} - 1 ))
- IFS=$OLD_IFS
- }
- RemoveDoubles() {
- rm ${sys_temp}/vksearch.pars* 2>&-
- Info "Начинаю удаление треков с одинаковой длительностью..."
- for i in `seq 0 $song_counts`
- do
- echo "<1>${song_durations[$i]}<2>${song_artists[$i]}<3>${song_titles[$i]}<4>${song_urls[$i]}<5>" >> ${sys_temp}/vksearch.parsing
- done
- cat ${sys_temp}/vksearch.parsing | sort -n | uniq -w 6 > ${sys_temp}/vksearch.parsed
- cat ${sys_temp}/vksearch.parsing | sort -n | uniq -w 6 -d > ${sys_temp}/vksearch.doubles
- OLD_IFS=$IFS
- IFS=$'\n'
- song_urls=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<4>\([^<]*\)<5>.*,\1,p' ` )
- song_artists=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<2>\([^<]*\)<3>.*,\1,p' ` )
- song_titles=( `cat ${sys_temp}/vksearch.parsed | sed -ne 's,.*<3>\([^<]*\)<4>.*,\1,p' ` )
- song_durations=( `cat ${sys_temp}/vksearch.parsed |sed -ne 's,.*<1>\([^<]*\)<2>.*,\1,p' ` )
- song_counts=$(( ${#song_urls[@]} - 1 ))
- IFS=$OLD_IFS
- Info "В плейлисте осталось ${#song_urls[@]} треков."
- }
- MakePlaylist() {
- [ $cfg_new_playlist -eq 1 ] && rm $cfg_save_to/VKontakte_PlayList.m3u 2>&-
- [ -f "$cfg_save_to/VKontakte_PlayList.m3u" ] || echo -ne "#EXTM3U\n" > $cfg_save_to/VKontakte_PlayList.m3u
- for i in `seq 0 $song_counts`
- do
- echo -e "#EXTINF:${song_durations[$i]},${song_artists[$i]} - ${song_titles[$i]}\n${song_urls[$i]}\n" >> $cfg_save_to/VKontakte_PlayList.m3u
- done
- Info "Плейлист сохранен как $cfg_save_to/VKontakte_PlayList.m3u"
- }
- GetFiles() {
- cd "$cfg_save_to"
- for i in `seq 0 $song_counts`
- do
- Info "Начинаю закачку: ${song_artists[$i]} - ${song_titles[$i]}"
- $cfg_wget "${song_urls[$i]}" > "${song_artists[$i]} - ${song_titles[$i]}.mp3"
- Info "Файл ${song_artists[$i]} - ${song_titles[$i]} был загружен!"
- [ "$cfg_write_tags" -eq 1 ] && id3 -2 -a "${song_artists[$i]}" -t "${song_titles[$i]}" "${song_artists[$i]} - ${song_titles[$i]}.mp3"
- done
- }
- SaveLyrics() {
- cd "$cfg_save_to"
- cat ${sys_temp}/vksearch.lyrics|sed 's/<.*>//g;/^[[:space:]]*$/d;s/^[ \t]*//' > "${song_artists[0]} - ${song_titles[0]}.txt"
- Info "Текст песни ${song_artists[0]} - ${song_titles[0]} сохранён!"
- }
- MediaPlay() {
- ${cfg_mplayer} "$cfg_save_to/VKontakte_PlayList.m3u"
- }
- GetParams $*
- Request
- Parse
- RemoveDoubles
- case $cfg_mode in
- play)
- MakePlaylist
- MediaPlay ;;
- get)
- GetFiles ;;
- make-playlist)
- MakePlaylist ;;
- get-lyrics)
- SaveLyrics ;;
- esac