/ php

Сокращение ссылок с adf.ly API с помощью PHP

В этой статье я покажу вам, как сокращать ссылки в PHP, используя API adf.ly.
Adf.ly - один из самых популярных сервисов для сокращения ссылок, с оплатой за переходы по вашим ссылкам. Этот сервис, помимо того, что сокращает ссылки, делая их более читаемымы, так же, позволяет заработать немного денег их клиентам. Их сервис имеет API, которое позволяет легко управлять собственными ссылками и своим аккаунтом.

Перед тем, как начём

Прежде всего, вы уже должны быть зарегистрированы на сайте adf.ly, после чего, нужно перейти на страницу API-доступа, включить доступ к API, и сохранить значения: ID пользователя, API ключи (открытый, и секретный).

Как делать запросы к API

Как гласит документация AdFly, при запросах к API, сначала нужно пройти аутентификацию. Она бывает нескольких видов:

  • обыная аутентификация (base)
  • HMAC-аутентификация (нужно сгенерировать особый токен перед запросом)

Примеры их реализации будут рассмотрены подробнее немного ниже

Но, основное, что нужно знать перед работой с API:

  • Перед выполнением запроса, независимо от типа аутентификации, нужно добавить ID пользователя _user_id, публичный ключ _api_key, а так же, текущее Unix-время _timestamp к списку параметров.
  • Все сокращаемые url-адреса должны быть URL-закодированы, т.е. обработаны функцией urlencode, и, если они передаются в виде массива, то должны быть отсортированы, по принципу байт-сортировки (значит, что параметр "param[10]" будет расположен перед параметром "param[2]").
  • В случае HMAC-аутентификации, хеш строки (по алгоритму sha256) создаётся их всех заданных параметров с шага №1, подписанного вашим приватным ключом. И добавляется в список параметров под ключом _hash.

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

Сокращение ссылки по API

Здесь нет сложной работы с http-клиентом, потому, этот пример я покажу без использования curl, используя контекст потока, как я показывал в этой статье.

Если вам нужна реализации с использованием CURL, то можете почитать эту статью, после чего, вы без проблем сможете переписать текущую реализацию на свой лад (к слову, это будет отличная практика).

Как мы выяснили ранее, ADF.LY API имеет несколько различных проверок аутентификации пользователя:

  • обычная аутентификация, при которой достаточно передавать только ID пользователя, и публичный ключ (опять таки, взятые из кабинета клиента)
  • HMAC-аутентификация, которая требует создании специального хеша, подписанного секретным ключом, взятым из кабинета adf.ly.

На странице документации вы можете подробнее изучить все доступные методы, и особенности интерфейса. Но, я, в контексте этой статьи разберу 2 примера: обычное сокращение ссылки, и получение списка всех сокращённых URL-адресов (для этого потребуется пройти HMAC-аутентификацию).

Скрипт сокращения ссылки

Для сокращения ссылок я написал функцию, которая возвращает массив параметров (errors, warnings, page, data), где в последнем, и будет находиться полезная информация о сокращённой ссылке:

function shortifyUrl($url, $user_id, $public_key) {
    $api_url = 'https://api.adf.ly/v1/shorten';

    // формируем массив параметров
    $params = [
        'url' => $url,
        '_user_id' => $user_id,
        '_api_key' => $public_key,
        '_timestamp' => time(),
    ];

    // Создаём контектст для POST-запроса
    $context = stream_context_create([
        'http' => [
            'method' => 'POST',
            // передаёт тело POST-запроса в виде: url=...&_user_id=...&...
            'content' => http_build_query($params)
        ]
    ]);

    // делаем запрос к API, и получаем результат
    $response = file_get_contents($api_url, false, $context);

    return json_decode($response, true);
}

Вот так выглядит успешный запрос на сокращение ссылки: succes-request

То есть, полезные данные содержатся под ключом data, а все возникшие ошибки в errors. В рамках этой статьи не производится никаких проверок на ошибки, но в реальных проектах - проверки на наличие ошибок делать обязательно.

И теперь, для получения сокращённой ссылки, просто достанем данные из полученных параметров:

$user_id = '79797977979'; // ваш user_id
$public_key = 'yourpublickey'; // ваш public_key


$short_url = shortifyUrl('https://badcode.ru', $user_id, $public_key);
$url = $short_url['data'][0]['short_url']; // http://dapalan.com/LO1

Скрипт получения списка всех сокращённых ссылок (пример создания токена)

Опять обращаясь к документации, можно увидеть, что за это отвечает метод urls, который требует пройти HMAC аутентификацию.

Для этого, напишем новую функцию:

function adflyUrls($user_id, $public_key, $secret_key) {
    $api_url = 'https://api.adf.ly/v1/urls';

    $params = [
        '_user_id' => $user_id,
        '_api_key' => $public_key,
        '_timestamp' => time(),
    ];

    // сортируем массив в нужно порядке
    ksort($params);
    // создаём хеш, и добавляем его к списку параметров
    $params['_hash'] = hash_hmac('sha256', http_build_query($params), $secret_key);

    // формируем финальный URL-адрес, по которому будет обращаться
    $api_url .= '?' . http_build_query($params);

    // делаем запрос к API, и получаем результат
    $res = file_get_contents($api_url);

    return json_decode($res, true);
}

А воспользоваться этой функцией можно подобным образом:

$user_id = 79797799; // ваш user_id
$public_key = 'yourpublic';
$secret_key = 'your-secret-key';

$response = adflyUrls($user_id, $public_key, $secret_key);
$urls = $response['data']; // массив URL-адресов

// а так можно их распечатать на странице
foreach($urls as $url) {
    echo "id: {$url['id']} url: {$url['url']} short_url: {$url['short_url']}" . PHP_EOL;
}

И выполнив этот код, успешный результат будет похож на этот: links-api

Если в вашем аккаунте слишком много ссылок, то API вернёт лишь часть из них. Для этого, у них существует параметр _page, который позволяет делать постраничный вывод ссылок. Это выходит за рамки статьи, но с этим вы без проблем сможете разобраться по документации.

Резюме

В этой статье я, на примере сокращения ссылки на PHP, и вывода списка всех ссылок, показал, как работать с API ADF.LY на PHP. Так же, я показал, как создать токен для работы с API adf.ly. Теперь вы, без проблем сможете разобраться с многими различными API, ввиду похожести реализаций на любом из сайтов.

Теперь вы запросто можете использовать эту функцию на реальном проекте. Например, этот скрипт можно использовать для монетизации своего сайта. К примеру, если ваш сайт посвящён публикации каких-то материалов, со ссылкой на них, то вы можете написать скрипт, который смог бы автоматически заменять все ваши ссылки на сокращённые через сервис adf.ly. Это лишь моя идея, ограниченная моим воображением. Вы же можете придумать применение везде, где только угодно :)