Статьи

Создание базового приложения для поиска видео с API Vimeo и Slim

В этом уроке вы познакомитесь с основами API Vimeo. С его помощью вы можете получить информацию о конкретном пользователе или получить информацию о видео, загруженных пользователем. Если видео является приватным, вы можете получить его только через API, если пользователь дал разрешение на ваше приложение.

Vimeo Logo

Создание нового приложения

Первое, что вам нужно, это учетная запись Vimeo. Если у вас есть, перейдите на developer.vimeo.com и нажмите Мои приложения . Это перечислит все приложения, которые вы создали. Поскольку это ваш первый раз, он должен быть пустым. Нажмите кнопку « Создать новое приложение» , чтобы начать создание нового приложения. Введите имя, описание, URL-адрес и URL-адрес обратного вызова приложения. В качестве URL-адреса и URL-адреса обратного вызова вы можете ввести URL-адрес на компьютере разработчика (например, http://homestead.app

vimeo new app

Нажмите на кнопку « Создать приложение» , когда закончите добавлять детали. Вы будете перенаправлены на страницу приложения, где вы можете щелкнуть вкладку «аутентификация», чтобы отобразить токены, которые можно использовать для взаимодействия с API. Нам это понадобится позже.

API Playground

Прежде чем перейти к написанию кода демонстрационного приложения, взгляните на API Playground . Это инструмент, предоставляемый Vimeo, поэтому разработчики могут поиграться с API без необходимости что-либо кодировать. Он позволяет вам вызывать определенные конечные точки API, устанавливать пользовательские значения для параметров, которые могут быть переданы через эти конечные точки, и видеть фактический результат, который представляет собой строку JSON.

Установите флажок «Аутентифицировать этот вызов как {ваше имя пользователя}», чтобы все вызовы API выполнялись от имени вашей учетной записи Vimeo. Если вы не установите этот флажок, вызовы API будут выполняться как запрос без проверки подлинности. Это означает, что он не будет использовать учетные данные вашего приложения или конкретного пользователя для выполнения запросов к API. По сути, он ограничивается только доступом к общедоступной информации.

Возвращаясь к API Playground, выберите приложение, которое вы создали ранее. Вы можете нажать кнопку вызова , чтобы выполнить запрос. URL-адрес по умолчанию, используемый на игровой площадке, — https://api.vimeo.com/ Чтобы изменить это, вы можете нажать на ссылку (Очистить …) в левой части экрана. Оттуда вы можете выбрать конечную точку, в которую вы хотите отправить запрос. Вы можете попробовать конечную точку пользователя для начинающих. После выбора он позволяет вводить идентификатор конкретного пользователя и выполнять поиск пользователей, указав набор параметров.

api playground users

В приведенном выше примере вы ищете пользователя с именем «ash ketchum». Это можно сделать, указав значение для параметра query Вы также можете увидеть, какие параметры являются обязательными, а какие необязательными. Параметры, которые вы можете указать, довольно понятны. Продолжайте играть с различными значениями, чтобы ознакомиться с вызовами API, которые вы можете сделать.

Если вы изучите результаты, по умолчанию возвращается 25 строк на страницу. Он также показывает общее количество строк, возвращаемых запросом. В данном случае это 16. Это очевидно и для данных подкачки: nextnull

vimeo user

Из приведенного выше ответа все пользовательские данные находятся внутри массива data Каждый пользователь — это объект с одинаковым набором свойств. Если вы хотите получить более подробную информацию о конкретном пользователе, вы можете извлечь его идентификатор из значения uri В данном случае это /users/31515513151551 Вы можете скопировать это и использовать его в качестве значения для {user_id}

 "data": [
        {
            "uri": "/users/3151551",
            "name": "ash ketchum",
            "link": "https://vimeo.com/user3151551",
...

Обратите внимание, что некоторые конечные точки требуют аутентифицированного пользователя для выполнения запроса. Это означает, что для выполнения запроса вы должны установить флажок Аутентифицировать этот вызов как {ваше имя пользователя} . Примером такой конечной точки является конечная точка me Эта конкретная конечная точка позволяет вашему приложению запрашивать данные о текущем аутентифицированном пользователе.

Создание демо

Предпосылки

Начиная с этого момента, мы предполагаем, что вы используете нашу коробку Homestead Improved Vagrant, чтобы следовать за ней. Это виртуальная среда разработки, настроенная для обычных приложений PHP, так что у каждого читателя одинаковая отправная точка.

Для демонстрации вы будете использовать Slim Framework , шаблонизатор Twig и библиотеку Vimeo PHP . Давайте установим их:

 composer require slim/slim twig/twig slim/views vimeo/vimeo-api

Бутстрапирование

В рабочем каталоге создайте файл index.php

 <?php
session_start();
require_once 'vendor/autoload.php';

Определите константу для идентификатора клиента, секрета клиента и URI перенаправления, используемого вашим приложением. Убедитесь, что URI перенаправления, который вы добавили в сведения о вашем приложении, соответствует URL, который вы используете здесь.

 define('CLIENT_ID', 'your vimeo client id');
define('CLIENT_SECRET', 'your vimeo client secret');
define('REDIRECT_URI', 'your vimeo redirect or callback url');

Создайте новый экземпляр приложения Slim и передайте Twig для опции view Это позволяет использовать Twig для обработки представлений. Кроме того, установите параметры парсера для представления.

 $app = new \Slim\Slim(array(
    'view' => new \Slim\Views\Twig() //use twig for handling views
));

$view = $app->view();
$view->parserOptions = array(
    'debug' => true, //enable error reporting in the view
    'cache' => dirname(__FILE__) . '/cache' //set directory for caching views
);

Добавьте следующее, чтобы использовать библиотеку Vimeo.

 $vimeo = new \Vimeo\Vimeo(CLIENT_ID, CLIENT_SECRET);

Получение неаутентифицированных токенов

Вы можете выполнять запросы к API Vimeo без входа пользователя в систему и разрешения вашего приложения. Вы можете сделать это, приобретя токены без аутентификации, используя метод clientCredentials Возвращает токен доступа, который можно использовать для запроса общедоступных данных. Количество конечных точек API, которые вы можете использовать с токеном без аутентификации, довольно ограничено, поэтому вы не будете использовать его в этом руководстве.

 $app->get('/token', function() use ($app, $vimeo) {

    $token = $vimeo->clientCredentials();

    echo $token['body']['access_token'];

});

Происходит вход в систему

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

 $app->get('/login', function () use ($app, $vimeo) {

    if($app->request->get('code') && $app->request->get('state') == $_SESSION['state']){

        $code = $app->request->get('code');

        $token = $vimeo->accessToken($code, REDIRECT_URI);

        $access_token = $token['body']['access_token'];
        $vimeo->setToken($access_token);

        $_SESSION['user.access_token'] = $access_token;

        $page_data = array(
            'user' => $token['body']['user']
        );

    }else{

        $scopes = array('public', 'private');
        $state = substr(str_shuffle(md5(time())), 0, 10);
        $_SESSION['state'] = $state;

        $url = $vimeo->buildAuthorizationEndpoint(REDIRECT_URI, $scopes, $state);

        $page_data = array(
            'url' => $url
        );
    }

    $app->render('login.php', $page_data);

});

Разбивая его, вы сначала проверяете, передаются ли код и состояние в качестве параметров запроса. Для дополнительной безопасности вы также проверяете, совпадает ли состояние с состоянием, которое ранее было сохранено в сеансе.

 if($app->request->get('code') && $app->request->get('state') == $_SESSION['state']){
    ...   
}

Если вышеприведенное условие возвращает true Вы можете сделать это, вызвав метод accessToken Затем извлеките токен доступа из результата, который был возвращен, и затем вызовите метод setToken Также сохраните токен доступа в сеансе, чтобы вы могли получить к нему доступ позже. Наконец, создайте массив, в котором хранятся данные, которые вы передадите в представление позже. В данном случае это пользовательские данные.

 $code = $app->request->get('code');

$token = $vimeo->accessToken($code, REDIRECT_URI);

$access_token = $token['body']['access_token'];
$vimeo->setToken($access_token);

$_SESSION['user.access_token'] = $access_token;

$page_data = array(
    'user' => $token['body']['user']
);

Если условие возвращает false В этом случае вы указываете только publicprivate Это означает, что приложение может иметь доступ только к общедоступным и частным данным пользователя. Есть и другие, такие как uploadinteract Примеры таких взаимодействий включают лайки, комментирование или добавление видео в список просмотра.

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

 $scopes = array('public', 'private');
$state = substr(str_shuffle(md5(time())), 0, 10);
$_SESSION['state'] = $state;

$url = $vimeo->buildAuthorizationEndpoint(REDIRECT_URI, $scopes, $state);

$page_data = array(
    'url' => $url
);

Наконец, просмотрите представление входа в систему.

 $app->render('login.php', $page_data);

Вот вид входа в систему ( templates/login.php

 {% if url %}
<a href="{{ url }}">login to vimeo</a>
{% else %}
<h1>Hello {{ user.name }}!</h1>
<h2>websites</h2>
<ul>
{% for website in user.websites %}
    <li>
        <a href="{{ website.link }}">{{ website.name }}</a>
    </li>
{% endfor %}
</ul>
{% endif %}

Из приведенного выше кода вы можете видеть, что мы просто проверяем, существует ли URL. Если так, то выведите ссылку авторизации. Если это не так, то поприветствуйте пользователя и перечислите его сайты. Когда пользователь нажимает на ссылку авторизации, он перенаправляется на страницу Vimeo, где он может проверить, какие конкретные области он хочет разрешить. После нажатия кнопки «Разрешить» пользователь будет перенаправлен на указанный вами URL-адрес перенаправления. Уникальный код и состояние будут переданы в качестве параметра запроса в тот URL-адрес перенаправления, который вы затем сможете обменять на токен доступа.

vimeo auth

Получение пользовательского канала

Вы можете получить пользовательский фид, сделав запрос к конечной точке /me/feed Вы также можете передать необязательный параметр per_page Это позволяет вам контролировать количество строк, возвращаемых в ответе. Если этот параметр не указан, он использует значение по умолчанию, равное 25. После этого извлеките body

 $app->get('/me/feed', function () use ($app, $vimeo) {

    $vimeo->setToken($_SESSION['user.access_token']);
    $response = $vimeo->request('/me/feed', array('per_page' => 10));

    $page_data = $response['body'];

    $app->render('feed.php', $page_data);

});

Вот код для feed.php То, что он делает, это перебирает все элементы канала, а затем показывает миниатюрное изображение, которое представляет видео, ссылку на фактическое видео в Vimeo, описание и теги, прикрепленные к этому видео.

 <h1>User Feed</h1>
{% for feed in data %}
    <li>
        <img src="{{ feed.clip.pictures.sizes[0]['link'] }}" alt="{{ feed.clip.name }}">
        <div>
            <a href="{{ feed.clip.link }}">{{ feed.clip.name }}</a>
        </div>
        <p>
            {{ feed.clip.description }}
        </p>
        <div>
            {% for tag in feed.clip.tags %}
            <span>{{ tag.name }}</span>
            {% endfor %}
        </div>
    </li>
{% endfor %}

Поиск видео

API Vimeo также позволяет искать видео с помощью запроса. В приведенном ниже коде инициализируйте данные страницы в пустой массив. Если query/videos Затем вы передаете этот запрос вместе с результатами API в качестве данных для представления videos.php

 $app->get('/videos', function () use ($app, $vimeo) {

    $page_data = array();

    if($app->request->get('query')){

        $vimeo->setToken($_SESSION['user.access_token']);
        $query = $app->request->get('query');
        $response = $vimeo->request('/videos', array('query' => $query));

        $page_data = array(
            'query' => $query,
            'results' => $response['body']
        );
    }

    $app->render('videos.php', $page_data);

});

Для videos.php

 <form>
    <input type="text" name="query" value="{{ query }}">
    <button type="submit">Search</button>
</form>

После этого выведите результаты поиска. Если в элементе результатов в данных страницы, которые были переданы ранее, есть значение, выполните цикл по нему и отобразите миниатюру для видео. Обычно это первое изображение в массиве изображений, которое возвращает API. Таким образом, доступ к изображению по индексу 0 и извлечение его ссылки позволяет получить первый элемент. Далее выведите ссылку на видео, используя название видео в качестве текста. Наконец, выведите ссылку на пользователя, который загрузил видео, и покажите описание видео. Если переменная results

 <h1>Search Results</h1>
<div>
{% if results %}
<ul>    
{% for row in results.data %}
    <li>
        <img src="{{ row.pictures.sizes[0]['link'] }}" alt="{{ row.name }}">
        <div>
            <a href="{{ row.link }}">{{ row.name }}</a>
        </div>
        <div>
            by: <a href="{{ row.user.link }}">{{ row.user.name }}</a>
        </div>
        <p>
            {{ row.description }}
        </p>
    </li>
{% endfor %}
</ul>
{% else %}
    No search results.
{% endif %} 
</div>

Вывод

В этой части мы использовали API-интерфейс Vimeo для создания элементарного видеоприложения с использованием Silex и Twig. Мы добавили функцию входа в систему и фида пользователей и добавили функцию поиска видео. Вы можете проверить код, используемый в этой статье в этом репозитории Github .

Если у вас возник интерес, рассмотрите возможность присоединиться к нам в последующем посте, который расширит основную информацию, представленную здесь, и добавит лайки, списки наблюдения и загрузки видео. Будьте на связи!