SHARE
TWEET

VK Music Saver

dsda Mar 24th, 2013 325 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4.  
  5. # курл нужен чтобы получить линк по которому нас отослали
  6. import pycurl
  7. # для того чтобы забирать вывод из курла
  8. import cStringIO
  9. import urllib
  10. # для парсинга страницы
  11. import lxml.html
  12. import os
  13. # регулярки
  14. import re
  15.  
  16. email = ''
  17. password = ''
  18. # ID нашего приложения
  19. appID = ''
  20.  
  21. # путь куда качаем
  22. path = "download"
  23.  
  24. if appID == '': appID = raw_input("VK Application ID: ");
  25.  
  26.  
  27. def getAuthUserRawData():
  28.     global email, password
  29.     email = raw_input("Email: ")
  30.     password = raw_input("Password: ")
  31.     return
  32.  
  33. # LOGIN INTO VK.COM
  34. def authIntoVk(email, password):
  35.     url = 'https://login.vk.com/?act=login&soft=1&utf8=1&'
  36.    
  37.     buf = cStringIO.StringIO()
  38.  
  39.     c = pycurl.Curl()
  40.     c.setopt(c.URL, url)
  41.     c.setopt(c.FOLLOWLOCATION, 1)
  42.     c.setopt(c.COOKIEJAR, "cookie.txt")
  43.     c.setopt(c.COOKIEFILE, "cookie.txt")
  44.     c.setopt(c.WRITEFUNCTION, buf.write)
  45.    
  46.     postFields = '_origin=https://oauth.vk.com'
  47.     postFields += '&email=' + email + '&pass=' + password
  48.     c.setopt(c.POSTFIELDS, postFields)
  49.     c.setopt(c.POST, 1)
  50.     c.perform()
  51.     c.close()
  52.     buf.close()
  53.     return
  54.  
  55.  
  56. # GET TOKEN
  57. def GetTokens():
  58.     global appID
  59.     url = 'http://api.vkontakte.ru/oauth/authorize?'
  60.     # тут id нашего приложения
  61.     url += 'client_id='+appID
  62.     url += '&scope=audio'
  63.     url += '&redirect_uri=http://api.vk.com/blank.html'
  64.     url += '&display=page'
  65.     url += '&response_type=token'
  66.  
  67.     buf = cStringIO.StringIO()
  68.     # for suppress output
  69.     storage = cStringIO.StringIO()
  70.     c = pycurl.Curl()
  71.     c.setopt(c.URL, url)
  72.     c.setopt(c.FOLLOWLOCATION, 1)
  73.     c.setopt(c.COOKIEJAR, "cookie.txt")
  74.     c.setopt(c.COOKIEFILE, "cookie.txt")
  75.    
  76.     c.setopt(c.HEADERFUNCTION, buf.write)
  77.     # for suppress output
  78.     c.setopt(c.WRITEFUNCTION, storage.write)
  79.    
  80.     c.perform()
  81.     tokenURL = c.getinfo(c.EFFECTIVE_URL)
  82.     c.close()
  83.  
  84.     buf.close()
  85.     storage.close()
  86.     return tokenURL
  87.  
  88. if os.path.isfile('cookie.txt') != True: getAuthUserRawData()
  89. authIntoVk(email, password)
  90. link = GetTokens()
  91.  
  92. access_token = re.search('access_token=([0-9A-Fa-f]+)&', link)
  93. expires_in = re.search('expires_in=([0-9A-Fa-f]+)&', link)
  94. user_id = re.search('user_id=([0-9A-Fa-f]+)', link)
  95.  
  96. if access_token is None:
  97.     print 'Не удалось, возможно не правильно указан ID приложения или что-то еще =)';
  98.     exit()
  99.  
  100. access_token = access_token.group(1)
  101. expires_in = expires_in.group(1)
  102. user_id = user_id.group(1)
  103.  
  104. # PARSING!!!!!!!!
  105.  
  106. url = "https://api.vkontakte.ru/method/audio.get.xml?uid=" + user_id + "&access_token=" + access_token
  107. page = urllib.urlopen(url)
  108. html = page.read()
  109.  
  110. print "Список музла получен, парсим..."
  111.  
  112. artistMas = []
  113. titleMas = []
  114. urlMas = []
  115. number = 0
  116.  
  117. print "Парсим на предмет исполнителей..."
  118.  
  119. doc  = lxml.html.document_fromstring(html)
  120. for artist in doc.cssselect('artist'):
  121.     artistMas.append(artist.text)
  122.     number = number + 1
  123.    
  124. print "OK"
  125. print "Парсим на предмет названий..."
  126.  
  127. for title in doc.cssselect('title'):
  128.     titleMas.append(title.text)
  129.    
  130. print "OK"
  131. print "Парсим на предмет ссылок..."
  132.  
  133. for urlm in doc.cssselect('url'):
  134.     urlMas.append(urlm.text)
  135.    
  136. print "OK"
  137.  
  138. print ""
  139.  
  140. if os.path.exists(path):
  141.     "Папка уже есть, начинаем докачку"
  142. else:
  143.     os.makedirs(path)
  144.  
  145. print "Нам нужно скачать кучу файлов. Вычисляем количество..."
  146. print number
  147.  
  148. answer = raw_input("Готов?: ")
  149. if answer == "y":
  150.     print "Пошла закачка, пошла родимая!"
  151. else:
  152.     print "Вот же какой трусливый! Ну и ладно!"
  153.     exit()
  154.  
  155. for i in xrange(0, number-1):
  156.     print "Загружается:"
  157.     print i
  158.     print " "
  159.    
  160.     filename_new = path+"/"+artistMas[i]+ " - " + titleMas[i] + ".mp3";
  161.     if os.path.exists(filename_new):
  162.         print "Этот файл уже загружен, переходим к следующему"
  163.     else:                              
  164.         downCmd = "wget -P" + path + " " + urlMas[i]
  165.         os.popen(downCmd)
  166.  
  167.         p = re.compile(r"[0-9a-zA-Z]+\.mp3$")
  168.         filename = p.findall(urlMas[i])
  169.        
  170.         try:
  171.             os.rename(path+"/"+filename[0], path+"/"+artistMas[i]+ " - " + titleMas[i] + ".mp3")
  172.         except:
  173.             print "Невозможно переименовать, оставляю изначальное имя файла!"
  174.    
  175.     print " "
  176.    
  177. print "Задание завершено! Удачи!"
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top