На хабре уже были топики, посвященные открытому 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, если она есть на сервере, то работа ведется с ее помощью, если нет, то пытаемся работать через сокеты. Пока проблем не было.