Яндекс.Метрика

    Песочница

    Массовое переименование аудиозаписей вконтакте, PHP

    Доброго времени суток. Пару дней назад, один мой хороший знакомый, попросил меня написать скрипт для массового переименования аудиозаписей в заданной группе вконтакте. Язык, на котором должен быть написан скрипт оказался PHP. Честно признаться, с PHP я до этого не работал, да и вообще кодером не являюсь, так пара пар(прошу прощения за тавтологию) в университете, на почти гуманитарном факультете. Но, всегда было интересно начать, поэтому от задания не отказался. Собственно, вот что получилось:

    #Ввод логина и пароля
    $login = 'EMAIL';
    $passwd = 'PASSWORD';
    $vk = auth($login,$passwd);
    
    if ($vk) { 
    	
    	#GID группы вконтакте, $vk
    	renameRecords('GID',$vk);
    	curl_close($vk); 
    	
    }
    
    function auth($login, $passwd) {
    
    	#Маскируемся под браузер
    	$userAgent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1';
    	$cookie = '';
    	
    	$ch = curl_init();
    	curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
    	curl_setopt($ch, CURLOPT_POST, true);   
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    	curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    	curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');
    	
    	#Создаем POST-запрос для авторизации
    	$post = array( 
    			'act' => 'login',
    			'al_frame' => '1',
    			'from_host' => 'vk.com',
    			'email' => $login,
    			'pass' => $passwd
    		);
    	
    	#Получаем куки
    	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    	$answer = curl_exec($ch);
    	
    	#В ответе от сервера приходит js-скрипт, содержащий строку печенья
    	$value = substr($answer, strpos($answer, "setCookieEx('sid', '") + 20, 60);
    	
    	#Если пароль был неверным, строка будет содержать кусок js, 
    	#с пробелами и прочими мусорными символами
    	if (strpos($value, " ")) {
    		echo "Неверный пароль";
    		return 0;
    	}
    	
    	#Устанавливаем кук на cURL-сессию
    	$cookie = 'remixsid=' . $value;
    	curl_setopt($ch, CURLOPT_COOKIE, $cookie); 
    	
    	echo "Auth complete";
    	return $ch;
    	
    }
    
    function renameRecords($gid, $vk) {
    	
    	#Аналогично блоку авторизации, создаем POST-запрос
    	$post = array(
    			   'act' => 'load_audios_silent',
    			   'al' => 1,
    			   'edit' => 0,
    			   'gid' => $gid,
    			   'id' => 0
    			);
    			
    	curl_setopt($vk, CURLOPT_URL, 'http://vk.com/audio');
    	curl_setopt($vk, CURLOPT_POSTFIELDS, http_build_query($post));
    	
    	#В ответе получаем дерево всех аудиозаписей группы
    	$response = curl_exec($vk); 
    	
    	#Из ответа, с помощью регулярных выражений, достаем
    	#значения 'aid', наименования исполнителей и песен ('names')
    	#а так-же значение hash, необходимое для редактирования записей
    	preg_match_all("#'-{$gid}'\,'(\d+)'#", $response, $aid);
    	preg_match_all("#'\d+:\d+'\,'(.+?)'\,'(.+?)'#", $response, $names);
    	preg_match("#\"edit_hash\":\"(.+?)\"#", $response, $hash);
    	
    	unset($response);
    	unset($post);
    	
    	#Запрос для редактирования названия песни
    	$post = array(
    				'act' => 'edit_audio',
    				'al' => 1,
    				'text' => 'notext',
    				'oid' => "-" . $gid,
    				'hash' => $hash[1]
    			);
    			
    	for($i = 0, $cnt = count($aid[1]); $i < $cnt; $i++) {
    	
    		#Цикл пробегает по массиву значений полученных с помощью
    		#регулярных выражений и устанавливает необходимые значения в тело запроса
    		$post['aid'] = $aid[1][$i];
    		$post['performer'] = iconv('windows-1251', 'utf-8', $names[1][$i]);
    		$post['title'] = iconv('windows-1251', 'utf-8', $names[2][$i]);
    		curl_setopt($vk, CURLOPT_POSTFIELDS, http_build_query($post));
    		curl_exec($vk);
    	}
    	
    
    }
    
    


    Таким образом, с помощью операций конкатенации, мы можем прикрепить любой текст к названию песни, либо исполнителя. К примеру:

    $post['title'] = iconv('windows-1251', 'utf-8', $names[2][$i]) . " [Здесь был Вася]";
    

    В результате, к названию каждой композиции в необходимой группе, приклеится текст [Здесь был Вася]. Разумеется, для данной операции вы должны обладать соответствующими правами в группе, на которую нацелились. Возможно, что кому-то помимо моего знакомого, пригодится этот скрипт, поэтому выкладываю на всеобщее обозрение.