воскресенье, 1 сентября 2013 г.

bash скрипт использующий API вконтакте без авторизации


bash скрипт использующий API ВК без авторизации:

#!/bin/bash

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


Комментариев нет:

Отправить комментарий

Постоянные читатели

Популярные сообщения