Скачать видео с Вконтакте.РУ
Наткнулся я тут вконтакте на довольно интересную группу:”Советские психоделические мультики”) ну и т.к. у меня анлим и надо что-то качать, решил качнуть все мультфильмы из группы)) Собственно начал думать как это сделать, есть онлайн сервисы, также есть плагин для Firefox и userjs для Opera, но есть одно большое но в любом из этих способов нужно качать по одному файлу, да и к тому же ручами заходить копировать и т.д и т.п.,
вроде есть какой-то софт под винду, но хрен с ним, под линукс чёт даж искать не стал. Вся прелесь в программировании: если нет нежного тебе софта, напиши) Хотел в начале написать скрипт на bash’е, но потом передумал и решил написать на python. Собственно вот, что получилось:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | # -*- coding: utf8 -*- import httplib import re import os #param url = 'линк до списка с видео' email = 'мыло' id = 'айди' hash = 'хэш пароля' # def pb_str(prc, ch, width) : return ch * int((prc * width) / 100) plinks = re.compile('<div class="aname"><a href="(video-[0-9]*_[0-9]*)">') phost = re.compile('http://(.*)/assets/videos/[a-f0-9]*\.vk.flv') pvtag = re.compile('so\.addVariable\(\'vtag\',\'(.*?)\'\);') pvkid = re.compile('so\.addVariable\(\'vkid\',\'(.*?)\'\);') pname = re.compile('<h1>.*» (.*)</h1>') width = 60 print 'Скачивание списка видеофайлов...' conn = httplib.HTTP('vkontakte.ru') conn.putrequest('GET', url) conn.putheader('Host', 'vkontakte.ru') conn.putheader('Cookie', 'remixemail='+email+';remixmid='+id+';remixpass='+hash) conn.endheaders() conn.getreply() content = conn.getfile().read() conn.close() all = plinks.findall(content) print 'Готово' print str(len(all))+' файлов для скачки' count = 0 for i in all: count += 1 conn.connect('vkontakte.ru',80) conn.putrequest('GET', 'http://vkontakte.ru/'+i) conn.putheader('Host', 'vkontakte.ru') conn.putheader('Cookie', 'remixemail='+email+';remixmid='+id+';remixpass='+hash) conn.endheaders() conn.getreply() content = conn.getfile().read() conn.close() vtag = pvtag.search(content).group(1) vkid = pvkid.search(content).group(1) name = unicode(pname.search(content).group(1), 'cp1251') print str(count)+' : '+name filename = name +'.flv' conn.connect('vkadre.ru',80) conn.putrequest('GET', 'http://vkadre.ru/get_video?vkid='+vkid+'&vtag='+vtag) conn.putheader('Host', 'vkadre.ru') conn.endheaders() link = conn.getreply()[2]['Location'] host = phost.search(link).group(1) conn.close() if os.path.isfile(filename): fstat = os.stat(filename) conn.connect(host,80) conn.putrequest('GET', link) conn.putheader('Host', host) conn.endheaders() size = conn.getreply()[2]['Content-Length'] conn.close() if fstat.st_size < int(size): conn.connect(host,80) conn.putrequest('GET', link) conn.putheader('Host', host) conn.putheader('Range', 'bytes='+str(fstat.st_size)+'-') conn.endheaders() conn.getreply() flv_file = open(filename, 'ab') src_flv = conn.getfile() get = fstat.st_size while True: kb = src_flv.read(1024) get += 1024 if not kb: break flv_file.write(kb) perc = round(get/(float(size))*100,3) if perc > 100: perc = 100.0 print '\r' + str(perc).rjust(7) + '% [' + \ pb_str(perc, '*', width).ljust(width, ' ') + ']', flv_file.close() conn.close() print ' Ok' else: print ' Ok' else: conn.connect(host,80) conn.putrequest('GET', link) conn.putheader('Host', host) conn.endheaders() size = conn.getreply()[2]['Content-Length'] flv_file = open(filename, 'wb') src_flv = conn.getfile() get = 0 while True: kb = src_flv.read(1024) get += 1024 if not kb: break flv_file.write(kb) perc = round(get/(float(size))*100,3) print '\r' + str(perc).rjust(7) + '% [' + \ pb_str(perc, '*', width).ljust(width, ' ') + ']', flv_file.close() conn.close() print ' Ok' print 'Все файлы скачаны' |
Собстенно скрип тянет страничку со списком видео вытаскивает, линки на них и скачивает по одному название файла берётся из названия видео. Т.к. скорость анлима у меня не ахти и нат на фряхе я ещё не настроил в следствии чего инет нужно иногда отрубать на ноуте, в скрип добавил возможность докачки файла. Т.е. после запуска он проверяет если файл с таким именем уже существует и его размер меньше необходимого то докачивает иначае переходит к следующему файлу. В винде скорее всего будут проблемы с кодировками, но мне как-то пока пофиг, переходить на винду не собираюсь)
более новая версия скрипта лежит тут