[VKMS] Скрипт для массового скачивания музыки вконтакте

Discussion in 'PHP' started by De-visible, 23 Jan 2011.

  1. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66


    Вот накидал пару дней назад, может кому тоже понадобится.
    Можно скачивать по автору, по направлению музыки, вообщем по всему что можно ввести в поиск vkontakte.ru


    Основные параметры:

    Code:
    
    YouLogin    = "youemail@gmail.com" Ваше мыло
    YouPassword = "youpass" Ваш пароль
    TracksKey   = "psy" Критерий поиска
    MaxTracks   = "200" # Сколько треков скачивать.
    
    

    PHP:

    #-------------------------------------------------------------------------------
    # Name:        vkmsearch.py
    # Greetz:      KAS_ONE (thanks you for idea!)
    # Author:      dex
    # Created:     18.01.2011
    # Copyright:   (c) dex aka De-visible 2011
    # Site/Blog:   http://netc0ding.blogspot.com
    # Icq:         22-3333-575
    #-------------------------------------------------------------------------------
    #!/usr/bin/env python
    # -*- coding:windows-1251 -*-

    import cookielib
    import urllib
    import urllib2
    import re
    timesys

    #Datas 

    YouLogin    "youemail@gmail.com" # Your email
    YouPassword "youpass" # your password
    TracksKey   "psy" # What search?
    MaxTracks   "200" # tracks count


    def trace(messagetype_ ""):
        print 
    "     "+type_+" [ "+message+" ]"


    def aboutMe():
        print 
    "\n","-"*10
        trace
    ("Author:      dex aka De-visible","[!!!]")
        
    trace("Site/Blog:   netc0ding.blogspot.com","[!!!]")
        
    trace("ICQ#: 223333575","[!!!]")
        print 
    "-"*10,"\n"

    def Logins(Login ""# Auth function
                
    Password ""):
                    
    trace("try to become authorized")
                    
    time.sleep(1)
                    
    cook cookielib.CookieJar()
                    
    opener urllib2.build_opener(urllib2.HTTPCookieProcessor(cook))
                    
    urllib2.install_opener(opener)
                    
    datas = {
                            
    'act':'login',
                            
    'q':'1',
                            
    'al_frame':'1',
                            
    'expire':"",
                            
    "captcha_sid":"",
                            
    "captcha_key":"",
                            
    "from_host":"vkontakte.ru",
                            
    "email":Login,
                            
    "pass":Password
                        
    }
                    
    headers = {
                        
    "User-Agent":"Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6""Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
                        
    }
                    
    params urllib.urlencode(datas)
                    
    req urllib2.Request('http://login.vk.com/?act=login',params,headers)
                    try:
                        
    page urllib2.urlopen(req).read()
                    
    except:
                        
    trace("Login is Fuck")
                        return {
    "ERROR":page}
                    if 
    'parent.onLoginDone' in page:
                        
    trace("Login is OK")
                        return {
    "OK":cook}
                    else:
                        
    trace("Login is Fuck")
                        return {
    "NO":page}
                    

    def createlink(one,two,three):
        
    #http://cs4431.vkontakte.ru/u42272533/audio/98c665cbd408.mp3 [2,3,4]
        
    return 'http://cs'+one+'.vkontakte.ru/u'+two+'/audio/'+three+'.mp3'


    def SearchMusic(namecookiemaxsize 0): # Music search function
        
    time.sleep(1)
        
    trace("search music, key = {"+name+"}")
        
    link "http://vkontakte.ru/gsearch.php?section=audio&q="+name+"&name=1"
        
    link_for_search link
        cook 
    cookielib.CookieJar()
        
    cook cookie
        opener 
    urllib2.build_opener(urllib2.HTTPCookieProcessor(cook))
        
    headers = {
                        
    "Referer":"http://vkontakte.ru/groups.php",
                        
    "User-Agent":"Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6""Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",'Accept-Charset''windows-1251,utf-8;q=0.7,*;q=0.7'"Keep-Alive""115""Connection":"keep-alive"
                        
    }
        
    opener.addheaders.append(("User-Agent","Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6"))
        
    urllib2.install_opener(opener)
        
    pages_ int(maxsize)/100
        
    if pages_ <> 0:
            
    mp3 = []
            for 
    i in range(0,pages_):
                if 
    <>0:
                    
    link link_for_search "&offset=" str(i*100)
                try:
                    
    page urllib2.urlopen(link).read()
                
    except:
                    
    page=""
                
    if page <> '':
                    
    audio re.findall(r"return operate(.*?)\;",page)
                    for 
    track in audio:
                        
    track[1:-1].split(',')
                        
    mp3.append({'name':t[3][1:-1],"link":createlink(t[1],t[2],t[3][1:-1])})
            
    count len(mp3)
            
    trace(str(count)+" tracks are found")
            return 
    mp3
        
    else:
            
    mp3 = []
            try:
                
    page urllib2.urlopen(link_for_search).read()
            
    except:
                
    page=""
            
    if page <> '':
                
    audio re.findall(r"return operate(.*?)\;",page)
                for 
    track in audio:
                    
    track[1:-1].split(',')
                    
    mp3.append({'name':t[3][1:-1],"link":createlink(t[1],t[2],t[3][1:-1])})
        
    count len(mp3)
        
    trace(str(count)+" tracks are found")
        return 
    mp3


    def Download
    (music,cookie):
        
    time.sleep(1)
        
    cj cookielib.CookieJar()
        
    cj cookie
        opener 
    urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        
    urllib2.install_opener(opener)
        
    link music["link"]
        
    track ""
        
    name music["name"]
        try:
            
    info urllib2.urlopen(link).info()
            
    bytes re.findall(r"Content\-Length\: (.*?)\r\n",str(info))
            
    byte_ bytes.pop()
            
    byte_ int(byte_)
            
    size byte_/1024/1024
            trace
    ("File size = "+str(size)+"mb")
        
    except:
            
    pass
        
    try:
            
    trace("link = "+'\"'+link+'\"')
            
    trace("Download.... ")
            
    track urllib2.urlopen(link).read()
        
    except:
            return 
    "None"
        
    return {"name":name,"file":track}

    def save_music(music):
        
    name music["name"]
        
    tfile music["file"]
        try:
            
    with open(name+'.mp3','wb') as myfile:
                
    myfile.write(tfile)
        
    except:
            return 
    False
        trace
    ("Save file "+name+'.mp3')
        return 
    True

    def main
    ():
        
    aboutMe()
        
    logs Logins(YouLogin,YouPassword)
        if 
    "OK" in logs:
            
    datas SearchMusic(TracksKeylogs["OK"],MaxTracks)
            
    count_ 0
            
    for one_data in datas:
                
    to_data Download(one_data,logs["OK"])
                
    count_ += 1
                
    if (save_music(to_data)):
                    print 
    " ok"
                
    if (count_ == int(MaxTracks)) or (count_ int(MaxTracks)):
                    break
            
    trace('The task is executed, completed')
            
    trace('Tracks count = '+str(count_))
            
    aboutMe()
            
    raw_input()
            
    sys.exit(0)
        else:
            
    aboutMe()
            
    trace('Exit...(3 sec)')
            
    time.sleep(4)
            
    sys.exit(0)

    if 
    __name__ == "__main__":
        
    main()
        



    Код без пробелов на дампе: _http://dumpz.org/29144/
    Будут улучшения, пока просто было необходимо, вот и написал.
     
    2 people like this.
  2. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    норм.. но все же... как с повторением? как с количеством минут прослушивания в день? ведь в вк есть такое ограничение!
     
  3. immortalist

    immortalist Member

    Joined:
    16 Jan 2010
    Messages:
    99
    Likes Received:
    64
    Reputations:
    37
    Спасибо, почитал сорец - оказывается питон совсем не сложный ЯП =)
     
  4. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    я писал такой на Perl:
    PHP:
    #usr/bin/perl
    use LWP::UserAgent;
    use 
    HTTP::Request;
    use 
    HTTP::Cookies;
    $| = 
    1;
    ######################
    $login 'user@mail.ru';
    $password "CoolPass";
    $count 0;
    $begin 1;
    ######################
    $ua LWP::UserAgent->new('Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.6.30 Version/10.61');
    $ua->cookie_jar(HTTP::Cookies->new(file => 'cookie.txt'autosave => 1));
    $req HTTP::Request->new(POST => 'http://login.vk.com/?act=login');
    $req->content_type('application/x-www-form-urlencoded');
    $req->content("email=".$login."&pass=".$password);
    push @{$ua->requests_redirectable}, POST;
    $res $ua->request($req);

    $req HTTP::Request->new(GET => 'http://vkontakte.ru/audio.php');
    $res $ua->request($req);

    $result $res->as_string();
    @
    matches $result =~ m#return operate\(.*?,'(.*?)',\d*?\)#ig;
    $count = ($#matches+1) unless $count<=0;
    if($begin>=2)
    {
      
    $begin -= 2;
      for(
    $i=0;$i<=$begin;$i++)
      {
        
    shift @matches;
      }
    }
    for(
    $i=0;$i<$count;$i++)
    {
      
    $req HTTP::Request->new(GET => $matches[$i]);
      
    $matches[$i] =~ m#audio/(.*?)\.mp3$#i;
      
    print "Loading ".$1.".mp3... ";
      
    $res $ua->request($req,$1.".mp3");
      if(
    $res->is_success)
      {
        print 
    "ok\n";
      }
      else
      {
        print 
    "bad!\n";
      }
    }
    print 
    "Done.";
    скачивает из трек листа
     
  5. immortalist

    immortalist Member

    Joined:
    16 Jan 2010
    Messages:
    99
    Likes Received:
    64
    Reputations:
    37
    надо вот так:
    PHP:
    $password 'CoolPass';
    иначе не пашет :)
     
  6. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    как это 0_о у меня все работает... пахать не будет только если будут символы $,@,% и т.д., потому что интерпретируется как переменная
     
  7. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    Откуда информация? Просто я слушаю целыми днями музыку в ВК, лень скачивать.
     
    _________________________
  8. Romaxa55

    Romaxa55 Banned

    Joined:
    19 Oct 2005
    Messages:
    144
    Likes Received:
    30
    Reputations:
    4
    Может mp3 сервис сделать из этого. оч удобно, зашел на сайт набрал, прослушал и скачал... это не сложно реализовать правда на пыхе токо смогу
     
  9. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    +1. Откуда информация, просто каждый день качаю хз по сколько треков и все в норме, а вот с повторениями пока не решил, что можно сделать. Простой парсинг на одинаковость слов в названии песни, не прокатит... Ну вообщем пока думаем).
     
  10. GAiN

    GAiN Elder - Старейшина

    Joined:
    2 Apr 2011
    Messages:
    2,531
    Likes Received:
    166
    Reputations:
    99

    а тут нет самой поисковой формы ввода - только скрипт ? и где можно взять эту форму?
     
  11. shkur

    shkur New Member

    Joined:
    25 Sep 2011
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Подскажите как получить название файла mp3 vkontakte hash

    кто знает алгоритм хеша названия файла mp3 vkontakte? вот ссылка http://cs4956.vkontakte.ru/u76692345/audio/0cfc7f3a1...
    это Camo & Krooked Reincarnation 2ой трек в моём плейлисте. Ну или где почитать.
    Если зайти с другого ip ссыль не работает. Т.е. как минимум хэш привязан к ip.
     
    #11 shkur, 28 Sep 2011
    Last edited: 28 Sep 2011
  12. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Ну дак он к ип и привязан.
     
  13. shkur

    shkur New Member

    Joined:
    25 Sep 2011
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    не совсем:
    Code:
    Меняется ли хеш от времени [Camo & Krooked - Reincarnation] 
    ip		filename	time
    178.140.70.200	85d2b9d27c92	28.09.11 01:19
    178.140.70.200	1f4d29716bec	28.09.11 09:54