Скачивание всех аудиозаписей вконтакте с помощью Perl

18 Июн
2012

Сегодня я расскажу и покажу довольно полезный скрипт, написанный блогаюзером victorvonspok на ЯП Perl, который может скачивать сразу все аудиозаписи пользователя с Вконтакте.
Скрипт довольно примитивен и прост, вы сохраняете предварительно проскролленную (так как вконтакт использует подгрузку, то никак иначе не получилось) .htm страничку с аудиозаписями в папку со скриптом, запускаете скрипт и дальше он делает всё за вас.

Как оно работает?

Итак, для начала подключим нужные модули.
#!/usr/local/bin/perl

	use strict;
	use EV;
	use AnyEvent::HTTP;
	use Coro;

Задаём максимальное количество одновременно скачиваемых файлов.
	$AnyEvent::HTTP::MAX_PER_HOST = 2;

Создаём каталог, в который в дальнейшем будет скачиваться наша музыка.
	opendir D, '.';
	mkdir ('audio', 0755) unless (readdir D) =~ /audio/;
	closedir D;

Проверяем наличие предварительно сохранённой audio.htm
	my $file = 'audio.htm';
	open (F, $file) or die "Can't open audio.htm";

Сохраняем содержимое файла в одну переменную.
	my $page = join ('', <F>);

Парсим ссылки на mp3-файлы, и записываем их в хеш, где в качестве ключа у нас выступает url, а в качестве значения — название песни и имя исполнителя.
	my %mp3;
	while ($page =~ m{value="(http://.*?mp3).*?return false">(.*?)</a>.*?<span class="title">(.*?)</span>}sgi){
		my $url = $1;
		my $name1 = $2;
		my $name2 = $3;
		$name1 =~ s%<.*>|[!@$#^&*();:"<>?]%%g;
		$name2 =~ s%<.*>|[!@$#^&*();:"<>?]|\s$%%g;
		$mp3 {$url} = $name1.($name2 ? ' - '.$name2 : '').'.mp3';
	}
	delete $mp3 {''};
	
	close (F);

Каждый url мы добавляем в очередь на скачивание.
	foreach my $url (keys %mp3){
		my $filename = $mp3 {$url};
		
		if ($filename and (not -e "audio/$filename" or -z "audio/$filename")){
			do {
				http_get (
					$url,
					sub {
						my ($content) = <hh user=_>;
						
						open (MP3, ">audio/$filename");
						binmode (MP3);
						print MP3 $content;
						close (MP3);
						
						print $filename." DOWNLOADED\n";
					}
				);
			} while (-z "audio/$filename");
		}
	}

EV::run;

Cсылка на скачивание файла: клик
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх