На хабре уже были топики, посвященные открытому API для работы с сервисом ruTube. В примере, который можно скачать с сайта ruTube (http://rutube.ru/partners/phpapi.html), отправка ролика осуществляется следующим образом (код взят из примера без правок):
Мы предлагаем код, отправляющий данные с использованием библиотеки cURL:
Данный подход может применяться, когда не сервере отключена поддержка сокетов, но есть cURL. Код, как Вы видите, более компактный получился, ну и cURL работает пошустрее сокетов.
Мы применили такой подход в модуле, написанном для CMS S.Builder, который взаимодействует с сервисом ruTube. Проверяется наличие библиотеки cURL, если она есть на сервере, то работа ведется с ее помощью, если нет, то пытаемся работать через сокеты. Пока проблем не было.
- if (move_uploaded_file($_FILES['data']['tmp_name'], $fname)) 
- {
-   //конструируем пост запрос к rutube на загрузку файлов
-   $bnd = md5(uniqid(time()));
-   
-   $data2 = add_var('save', 'y');
-   $data2 .= add_var('rt_mode', 'do_upload');
-   $data2 .= add_var('rt_developer_key', $rt_developer_key);
-   $data2 .= add_var('rt_redirect_ok', 'http://'.$_SERVER['SERVER_NAME'].'/upload.html?redirect=ok');
-   $data2 .= add_var('rt_redirect_error', 'http://'.$_SERVER['SERVER_NAME'].'/upload.html?redirect=error');
-   $data2 .= add_var('rt_auto_publish', $auto_publish);
-   $data2 .= add_var('rt_user', '');
-   $data2 .= add_var('rt_sign', '');
-   $data2 .= add_var('rt_enc', 'UTF-8');  
-   $data2 .= add_var('referer', 'http://'.$_SERVER['SERVER_NAME'].'/upload.html');
-   $data2 .= add_var('title', $name);
-   $data2 .= add_var('rt_tags', $tags);
-   $data2 .= add_var('comment', $description);
-   $data2 .= add_var('category', $rutube_cat);
-   $data2 .= '--'.$bnd."\r\n";
-   $data2 .= 'Content-Disposition: form-data; name="data"; filename="'.$_FILES['data']['name'].'"'."\r\n";
-   $data2 .= "Content-Type: application/octet-stream\r\n";
-   $data2 .= "Content-Transfer-Encoding: binary\r\n";
-   $data2 .= "\r\n";
-  
-   $data3 = "\r\n";
-   $data3 .= '--'.$bnd."--\r\n";
-       
-   $data1 = "POST uploader.rutube.ru/cgi-bin/jsapi.cgi HTTP/1.0\r\n";
-   $data1 .= "Host: uploader.rutube.ru\r\n";
-   $data1 .= "Content-Type: multipart/form-data; boundary=".$bnd."\r\n";
-   $data1 .= "Content-Length: ".(mb_strlen($data2.$data3, '8bit')+filesize($fname))."\r\n";
-   $data1 .= "Connection: close\r\n";
-   $data1 .= "\r\n";
-           
-   $f = fsockopen('uploader.rutube.ru', 80);
-   fwrite($f, $data1.$data2);
-   $f2 = fopen($fname, 'r');
-   while (!feof($f2)) 
-   {
-     $buff = fread($f2, 1024*128);
-     fwrite($f, $buff);
-   }
-   fclose($f2);
-   fwrite($f, $data3);
-   $response = '';
-   
-   while (!feof($f)) $response .= fgets($f, 128);
-     fclose($f);
-   
-   $response=split("\r\n\r\n",$response);
-   $response = trim(preg_replace('/.*Location:.*redirect=(\S*).*/i', '$1', strtr($response[0],array("\n" =>' ', "\r" => ' '))));
-       
-   if (strpos($response, 'error') === false) 
-   {
-     //ролик успешно загружен на rutube
-     $response = preg_replace('/.*rt_movie_id=(.*)/i', '$1', $response); //полученный временный id
-     $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);
-         
-     header('Location: http://'.$_SERVER['SERVER_NAME'].'/upload.html?successful');
-   }
- }
* This source code was highlighted with Source Code Highlighter.Мы предлагаем код, отправляющий данные с использованием библиотеки cURL:
- if (move_uploaded_file($_FILES['data']['tmp_name'], $fname))
- {
-   $array_var = array('save' => 'y',
-              'rt_mode' => 'do_upload',
-              'rt_developer_key' => $rt_developer_key,
-              'rt_redirect_ok' => 'http://'.$_SERVER['SERVER_NAME'].'/upload.html?redirect=ok',
-              'rt_redirect_error' => 'http://'.$_SERVER['SERVER_NAME'].'/upload.html?redirect=error',
-              'rt_auto_publish' => $auto_publish,
-              'rt_user' => '',
-              'rt_sign' => '',
-              'rt_enc' => 'UTF-8',
-              'referer' => 'http://'.$_SERVER['SERVER_NAME'].'/upload.html',
-              'title' => $name,
-              'rt_tags' => $tags,
-              'comment' => $description,
-              'category' => $rutube_cat,
-              'data'=> '@'.$fname
-             );
-             
-   $ch = curl_init();
-   curl_setopt($ch, CURLOPT_URL, "http://uploader.rutube.ru/cgi-bin/jsapi.cgi"); 
-   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
-   curl_setopt($ch, CURLOPT_POSTFIELDS, $array_var);
-   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-   
-   $response = curl_exec($ch);
-   curl_close($ch);
-  
-   if ($response)
-   {
-     $response = split("\r\n\r\n", $response);
-     $response = trim(preg_replace('/.*Location:.*redirect=(\S*).*/i', '$1', strtr($response[0],array("\n" =>' ', "\r" => ' '))));
-       
-     if (strpos($response, 'error') === false) 
-     {
-       //ролик успешно загружен на rutube
-       $response = preg_replace('/.*rt_movie_id=(.*)/i', '$1', $response); //полученный временный id
-       $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);
-         
-       header('Location: http://'.$_SERVER['SERVER_NAME'].'/upload.html?successful');
-     }
-   }
- }
* This source code was highlighted with Source Code Highlighter.Данный подход может применяться, когда не сервере отключена поддержка сокетов, но есть cURL. Код, как Вы видите, более компактный получился, ну и cURL работает пошустрее сокетов.
Мы применили такой подход в модуле, написанном для CMS S.Builder, который взаимодействует с сервисом ruTube. Проверяется наличие библиотеки cURL, если она есть на сервере, то работа ведется с ее помощью, если нет, то пытаемся работать через сокеты. Пока проблем не было.


