/var/log/life.log
Блог программиста из солнечной Бурятии

Скачать видео с Вконтакте.РУ

Наткнулся я тут вконтакте на довольно интересную группу:”Советские психоделические мультики”) ну и т.к. у меня анлим и надо что-то качать, решил качнуть все мультфильмы из группы)) Собственно начал думать как это сделать, есть онлайн сервисы, также есть плагин для 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>.*&raquo; (.*)</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 'Все файлы скачаны'

Собстенно скрип тянет страничку со списком видео вытаскивает, линки на них и скачивает по одному название файла берётся из названия видео. Т.к. скорость анлима у меня не ахти и нат на фряхе я ещё не настроил в следствии чего инет нужно иногда отрубать на ноуте, в скрип добавил возможность докачки файла. Т.е. после запуска он проверяет если файл с таким именем уже существует и его размер меньше необходимого то докачивает иначае переходит к следующему файлу. В винде скорее всего будут проблемы с кодировками, но мне как-то пока пофиг, переходить на винду не собираюсь)
более новая версия скрипта лежит тут