Pull to refresh

Закачка ролика на ruTube с использованием cURL

Reading time6 min
Views3.3K
На хабре уже были топики, посвященные открытому API для работы с сервисом ruTube. В примере, который можно скачать с сайта ruTube (http://rutube.ru/partners/phpapi.html), отправка ролика осуществляется следующим образом (код взят из примера без правок):

  1. if (move_uploaded_file($_FILES['data']['tmp_name'], $fname))
  2. {
  3.   //конструируем пост запрос к rutube на загрузку файлов
  4.   $bnd = md5(uniqid(time()));
  5.   
  6.   $data2 = add_var('save', 'y');
  7.   $data2 .= add_var('rt_mode', 'do_upload');
  8.   $data2 .= add_var('rt_developer_key', $rt_developer_key);
  9.   $data2 .= add_var('rt_redirect_ok', 'http://'.$_SERVER['SERVER_NAME'].'/upload.html?redirect=ok');
  10.   $data2 .= add_var('rt_redirect_error', 'http://'.$_SERVER['SERVER_NAME'].'/upload.html?redirect=error');
  11.   $data2 .= add_var('rt_auto_publish', $auto_publish);
  12.   $data2 .= add_var('rt_user', '');
  13.   $data2 .= add_var('rt_sign', '');
  14.   $data2 .= add_var('rt_enc', 'UTF-8');  
  15.   $data2 .= add_var('referer', 'http://'.$_SERVER['SERVER_NAME'].'/upload.html');
  16.   $data2 .= add_var('title', $name);
  17.   $data2 .= add_var('rt_tags', $tags);
  18.   $data2 .= add_var('comment', $description);
  19.   $data2 .= add_var('category', $rutube_cat);
  20.   $data2 .= '--'.$bnd."\r\n";
  21.   $data2 .= 'Content-Disposition: form-data; name="data"; filename="'.$_FILES['data']['name'].'"'."\r\n";
  22.   $data2 .= "Content-Type: application/octet-stream\r\n";
  23.   $data2 .= "Content-Transfer-Encoding: binary\r\n";
  24.   $data2 .= "\r\n";
  25.  
  26.   $data3 = "\r\n";
  27.   $data3 .= '--'.$bnd."--\r\n";
  28.       
  29.   $data1 = "POST uploader.rutube.ru/cgi-bin/jsapi.cgi HTTP/1.0\r\n";
  30.   $data1 .= "Host: uploader.rutube.ru\r\n";
  31.   $data1 .= "Content-Type: multipart/form-data; boundary=".$bnd."\r\n";
  32.   $data1 .= "Content-Length: ".(mb_strlen($data2.$data3, '8bit')+filesize($fname))."\r\n";
  33.   $data1 .= "Connection: close\r\n";
  34.   $data1 .= "\r\n";
  35.           
  36.   $f = fsockopen('uploader.rutube.ru', 80);
  37.   fwrite($f, $data1.$data2);
  38.   $f2 = fopen($fname, 'r');
  39.   while (!feof($f2))
  40.   {
  41.     $buff = fread($f2, 1024*128);
  42.     fwrite($f, $buff);
  43.   }
  44.   fclose($f2);
  45.   fwrite($f, $data3);
  46.   $response = '';
  47.   
  48.   while (!feof($f)) $response .= fgets($f, 128);
  49.     fclose($f);
  50.   
  51.   $response=split("\r\n\r\n",$response);
  52.   $response = trim(preg_replace('/.*Location:.*redirect=(\S*).*/i', '$1', strtr($response[0],array("\n" =>' ', "\r" => ' '))));
  53.       
  54.   if (strpos($response, 'error') === false)
  55.   {
  56.     //ролик успешно загружен на rutube
  57.     $response = preg_replace('/.*rt_movie_id=(.*)/i', '$1', $response); //полученный временный id
  58.     $sql->Query('INSERT INTO movie SET category_id='.$category.',name="'.SQL_STR.'",description="'.SQL_STR.'",date='.time().', author = "'.SQL_STR.'",user_id='.$user['id'].',status=1,rutube_id="'.SQL_STR.'", tags="'.SQL_STR.'"', $name, $description, $author, $response, $tags);
  59.         
  60.     header('Location: http://'.$_SERVER['SERVER_NAME'].'/upload.html?successful');
  61.   }
  62. }
* This source code was highlighted with Source Code Highlighter.


Мы предлагаем код, отправляющий данные с использованием библиотеки cURL:

  1. if (move_uploaded_file($_FILES['data']['tmp_name'], $fname))
  2. {
  3.   $array_var = array('save' => 'y',
  4.              'rt_mode' => 'do_upload',
  5.              'rt_developer_key' => $rt_developer_key,
  6.              'rt_redirect_ok' => 'http://'.$_SERVER['SERVER_NAME'].'/upload.html?redirect=ok',
  7.              'rt_redirect_error' => 'http://'.$_SERVER['SERVER_NAME'].'/upload.html?redirect=error',
  8.              'rt_auto_publish' => $auto_publish,
  9.              'rt_user' => '',
  10.              'rt_sign' => '',
  11.              'rt_enc' => 'UTF-8',
  12.              'referer' => 'http://'.$_SERVER['SERVER_NAME'].'/upload.html',
  13.              'title' => $name,
  14.              'rt_tags' => $tags,
  15.              'comment' => $description,
  16.              'category' => $rutube_cat,
  17.              'data'=> '@'.$fname
  18.             );
  19.             
  20.   $ch = curl_init();
  21.   curl_setopt($ch, CURLOPT_URL, "http://uploader.rutube.ru/cgi-bin/jsapi.cgi");
  22.   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
  23.   curl_setopt($ch, CURLOPT_POSTFIELDS, $array_var);
  24.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  25.   
  26.   $response = curl_exec($ch);
  27.   curl_close($ch);
  28.  
  29.   if ($response)
  30.   {
  31.     $response = split("\r\n\r\n", $response);
  32.     $response = trim(preg_replace('/.*Location:.*redirect=(\S*).*/i', '$1', strtr($response[0],array("\n" =>' ', "\r" => ' '))));
  33.       
  34.     if (strpos($response, 'error') === false)
  35.     {
  36.       //ролик успешно загружен на rutube
  37.       $response = preg_replace('/.*rt_movie_id=(.*)/i', '$1', $response); //полученный временный id
  38.       $sql->Query('INSERT INTO movie SET category_id='.$category.',name="'.SQL_STR.'",description="'.SQL_STR.'",date='.time().', author = "'.SQL_STR.'",user_id='.$user['id'].',status=1,rutube_id="'.SQL_STR.'", tags="'.SQL_STR.'"', $name, $description, $author, $response, $tags);
  39.         
  40.       header('Location: http://'.$_SERVER['SERVER_NAME'].'/upload.html?successful');
  41.     }
  42.   }
  43. }
* This source code was highlighted with Source Code Highlighter.


Данный подход может применяться, когда не сервере отключена поддержка сокетов, но есть cURL. Код, как Вы видите, более компактный получился, ну и cURL работает пошустрее сокетов.

Мы применили такой подход в модуле, написанном для CMS S.Builder, который взаимодействует с сервисом ruTube. Проверяется наличие библиотеки cURL, если она есть на сервере, то работа ведется с ее помощью, если нет, то пытаемся работать через сокеты. Пока проблем не было.
Tags:
Hubs:
Total votes 17: ↑9 and ↓8+1
Comments12

Articles