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

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

Наткнулся я тут вконтакте на довольно интересную группу:»Советские психоделические мультики») ну и т.к. у меня анлим и надо что-то качать, решил качнуть все мультфильмы из группы)) Собственно начал думать как это сделать, есть онлайн сервисы, также есть плагин для Firefox и userjs для Opera, но есть одно большое но в любом из этих способов нужно качать по одному файлу, да и к тому же ручами заходить копировать и т.д и т.п.,
вроде есть какой-то софт под винду, но хрен с ним, под линукс чёт даж искать не стал. Вся прелесь в программировании: если нет нежного тебе софта, напиши) Хотел в начале написать скрипт на bash’е, но потом передумал и решил написать на python. Собственно вот, что получилось:

# -*- 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 'Все файлы скачаны'

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

14 комментариев на запись «Скачать видео с Вконтакте.РУ»

  1. 123123 пишет:

    задрот

  2. 123123 пишет:

    задрот

  3. VampiRUS пишет:

    )

  4. Mike пишет:

    Напишите пожалуйста скрипт по оперу в винде.Очень удобно было бы.
    буду очень благодарен!

  5. VampiRUS пишет:

    музыка, видео

  6. Mike пишет:

    Напишите пожалуйста скрипт по оперу в винде.Очень удобно было бы.
    буду очень благодарен!

  7. VampiRUS пишет:

    музыка, видео

  8. Alik пишет:

    рассуждения о сервисах и програмах для контакта
    http://msoft32.narod.ru

  9. Alik пишет:

    рассуждения о сервисах и програмах для контакта
    http://msoft32.narod.ru

  10. Drums пишет:

    спасибо большое, очень удобная вещь!

  11. Drums пишет:

    спасибо большое, очень удобная вещь!

  12. irakli пишет:

    8)

  13. irakli пишет:

    8)

  14. sindikat пишет:

    Замечательно! Я тоже сначала хотел bash-скрипт написать, но вы сократили мне работу. Спасибо!

Оставить комментарий

Вы так же можете оставить комментарий используя ваш OpenId, для этого нужно войти.