Advertisement
dsda

VK Music Saver

Mar 24th, 2013
474
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.84 KB | None | 0 0
  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 "Задание завершено! Удачи!"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement