Получить видео с vk.com при помощи PHP

в 8:24, , рубрики: php, vk.com, Программирование, Социальные сети и сообщества, метки:

Получить видео с ВК при помощи PHP

У меня возникла проблема — как получить видео с всеми известной соц.сети vkontakte.ru. и установить его на сайте. Ключевой момент, я не хотел использовать IFRAME или же ещё какие-то сервисы ВК, я хотел чтобы видео выглядело так, как будто оно лежит у меня на сайте. Облазив пару десятков сайтов, максимально что я нашёл, это сайты для загрузки видео, такие как ВИДЕОСЕЙВЕР и тп. Это всё не подходило, поскольку мне нужен был код которой я мог интегрировать в свой PHP движок.
Нашлось пару самописных PHP скриптов – которые стоили от 30 до 500 у.е. Но половину из них были закодированы Zend Encoder – ом или же просто использовали свои сервера для поиска видео-файлов и не имели особой ценности для меня.
Так началось вдохновение. Я решил использовать мобильную версию поскольку она намного проще. Первым дело я составил алгоритм получение видео с ВК.

image

Вход В ВК

Первым куском кода был вход в ВК. Я порылся в интернете и нашел нечто подобное:


(Код с учётом моих исправление)

 ini_set('error_reporting', E_ALL);
ini_set ('display_errors', 1);

$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.13) ' . 'Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729)';

$login = ‘логин’;
$password = ‘пароль’;
function curl_gets_exec($ch, $redirects = 0, $curlopt_returntransfer = true, $curlopt_maxredirs = 10, $curlopt_header = false) {

    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($ch); 
    	$header=substr($data,0,curl_getinfo($ch,CURLINFO_HEADER_SIZE));
	$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	$exceeded_max_redirects = $curlopt_maxredirs > $redirects;
    $exist_more_redirects = false;
    if ($http_code == 301 || $http_code == 302) {
        if ($exceeded_max_redirects) {
            list($header) = explode("rnrn", $data, 2);
            $matches = array();
            preg_match('/(Location:|URI:)(.*?)n/', $header, $matches);
            $url = trim(array_pop($matches));
            $url_parsed = parse_url($url);
            if (isset($url_parsed)) {
                curl_setopt($ch, CURLOPT_URL, $url);
                $redirects++;
                return curl_gets_exec($ch, $redirects, $curlopt_returntransfer, $curlopt_maxredirs, $curlopt_header);
            }
        }
        else {
            $exist_more_redirects = true;
        }
    }
    if ($data !== false) {
        if (!$curlopt_header)
            list(,$data) = explode("rnrn", $data, 2);
        if ($exist_more_redirects) return false;
        if ($curlopt_returntransfer) {
            return $data;
        }
        else {
            echo $data;
            if (curl_errno($ch) === 0) return true;
            else return false;
        }
    }
    else {
        return false;
    }
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch,CURLOPT_REFERER,'http://m.vk.com/login?fast=1&hash=&s=0&to='); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_COOKIEFILE,'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_URL, 'https://login.vk.com/?act=login&from_host=m.vk.com&from_protocol=http&ip_h=&pda=1');
$answer = curl_gets_exec($ch);
$post = array(
            'email' => $login,
            'pass' => $password
        );

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$answer = curl_gets_exec($ch);
</code>

Данный кусок кода делает довольно несложные действия – создаётся запрос , такой как будто бы его делал ваш браузер эмулируя вход пользователя в систему ВК,
Более детально :
<source lang="php">
curl_setopt($ch,CURLOPT_REFERER,'http://m.vk.com/login?fast=1&hash=&s=0&to=');  // от куда отправляться данные 
curl_setopt($ch, CURLOPT_COOKIEFILE,'cookie.txt'); // куда упадут кукисы (не забудьте создать этот файл на сервере и назначить ему права 777 , -  'cookie.txt' )
curl_setopt($ch, CURLOPT_URL, 'https://login.vk.com/?act=login&from_host=m.vk.com&from_protocol=http&ip_h=&pda=1'); // куда 
отправить данные
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); //Данные для пост запроса (в нашем случае – это ваши пароль и логин)

function curl_gets_exec – это функция для более удобной работы с CURL, обработки редиректов и тп.
Остальные параметры можно найти — php.net/manual/ru/book.curl.php

Парсиг Видео

Теперь оставалось найти видео и распарсить его.
Как известно видеофайлы ВК имеют вид — vk.com/video2409212_161721801
Несложно догадаться что он состоит из 2 кусочков «2409212» и «161721801».
Поэтому я использовал 2 переменных $vid и $oid, которые начал принимать GET запросам

$vid=$_GET['vid'];
$oid=$_GET['oid'];

И сформировал такую ссылку

$link="http://m.vk.com/video{$vid}_{$oid}";

Дальше мы отправлем данные ВК и получаем HTML текс с страницы видео, весь HTML ложиться в переменную $answer

curl_setopt($ch, CURLOPT_URL, $link);
$answer = curl_gets_exec($ch);

Чтобы много не замариваться, я использовал для парсинга библиотеку simple_html_dom, её можно скачать в интернете или я выложил её здесь – v.plirex.com/simplehtmldom.rar
Создаем обек Simple

include "simplehtmldom/simple_html_dom.php";
$html = new simple_html_dom();

Загружаем в ней HTML текст

$html->load($answer);

Находим первый элемент DOM системы «video», если просмотреть страницу vk.com/video2409212_161721801 в HTML коде то мы видим что ссылочки на видео, хранятся именно в этом элементе

$div_video=$html->find('video',0);

Проверяем есть ли там нужное нам видео

if($div_video->outertext=="")die(“Video not found”);

внутри video примерно такой HTML код

<video preload="none" controls="controls" poster="http://cs527213.userapi.com/u11174769/video/l_18a03288.jpg">
<source src="http://cs527213.userapi.com/u11174769/videos/dc3277461b.720.mp4" type="video/mp4"></source>
<source src="http://cs527213.userapi.com/u11174769/videos/dc3277461b.480.mp4" type="video/mp4"></source>
<source src="http://cs527213.userapi.com/u11174769/videos/dc3277461b.360.mp4" type="video/mp4"></source>
<source src="http://cs527213.userapi.com/u11174769/videos/dc3277461b.240.mp4" type="video/mp4"></source>
<div class="img"><img src="http://cs527213.userapi.com/u11174769/video/l_18a03288.jpg" alt=""></div>
<div class="no_pl"> Название </div>
</video>

Как видно есть элементы 'source' в которых содержаться ссылочки на видео.
Хочу заметить что эти ссылочки активны только для этого пользователя, и только после просмотра основного документа видео, те ссылки vk.com/video2409212_161721801.
Ссылки на видео имеют вид — cs527213.userapi.com/u11174769/videos/dc3277461b.240.mp4
Где u11174769 – уникальный кеш, который каждый раз новый.

$sVideo=$div_video->find('source');

//Преобразуем полученные данные в массив ссылок на видео 
$aBuf="";
$j=0;
foreach($sVideo as $post) {
 /*$aBuf[$j]=$post->outertext;
  $aBuf[$j]=substr($aBuf[$j],stripos($aBuf[$j],'src="')+5,strlen($aBuf[$j]));
 $aBuf[$j]=substr($aBuf[$j],0,stripos($aBuf[$j],'" type'));
*/
$aBuf[$j]=$post->src;
 $j++;
 //echo "{$aBuf[$j]} n |";
}

Сохранение

Берем первую попавшуюся ссылку и скачиваем её

$link= $aBuf[0];
header('Content-type: content=video/mp4');
header("Content-Disposition: attachment; filename=vPlirex.mpg");
header("Pragma: no-cache");
header("Expires: 0");

$tFile = fopen($link,'r');
while (!feof($tFile))
{
   echo( fgets($tFile));
}
fclose($tFile);

Вывод

Я описал краткое руководство для скачивание видео с ВК. Данный код не является идеальным и требует много доработок. 1-м делом избавиться от хранения кукисов в ФАЙЛЕ, а в дальнейшем сделать возможность выбирать какого качества скачивать видео.
Но подобного примера в интернете я не нашел. Так что дерзайте.
Вот ссылка на полный исходник с библиотекой v.plirex.com/v.plirex.com.rar
Также я сделал демку на домене v.plirex.com

Автор: XProx

Источник

Поделиться

* - обязательные к заполнению поля