Полный пример API отображения Instagram Basic PHP

Вот пример сценария, который я написал для API базового отображения Instagram (Facebook). Я сделал это для себя, потому что я не использовал API Instagram с тех пор, как их устаревший API был отключен, и мне нужно было ознакомиться с предстоящими проектами. Его очень легко понять и он предназначен для учебных целей. Он охватывает все функции (я думаю). Я бы хотел критику.

define('client_id', 'your client id here');
define('client_secret', 'your client secret here');
define('redirect_uri', 'your Redirect URI here');

if (isset($_GET['code'])) {
    try{
        #gets code
        $code = $_GET['code'];
        echo '<pre>'.$code.'</pre>';

        #gets short lived access token
        $authorize = get_short_lived_access_token($code);
        echo '<pre>'.$authorize.'</pre>';
        $result = json_decode($authorize);
        $short_lived_access_token = $result->access_token;
        $user_id = $result->user_id;

        #exchanges short lived access token for long lived access token
        $access_token = get_long_lived_access_token($short_lived_access_token, $user_id);
        $result = json_decode($access_token);
        echo '<pre>'.$access_token.'</pre>';
        $long_lived_access_token = $result->access_token;

        #gets user data
        $user = get_user_data($long_lived_access_token, $user_id);
        echo '<pre>'.$user.'</pre>';

        #gets a list of all media
        $media = get_user_media_id($long_lived_access_token, $user_id);
        echo '<pre>'.$media.'</pre>';

        #gets each media entry
        $media = json_decode($media);
        $i = 0;
        foreach($media->data as $media_data){
            $media_id = $media_data->id;
            $media_child = get_user_media_data($long_lived_access_token, $user_id, $media_id);
            echo '<pre>'.$media_child.'</pre>';
            $media_child = json_decode($media_child);
            echo '<img src="'.$media_child->media_url.'"><br><br>';
            if (++$i == 5) break;
        }

        #refreshes access token
        $refresh = refresh_access_token($long_lived_access_token);
        echo '<pre>'.$refresh.'</pre>';

    }catch (Exception $e){
    echo json_encode(array('response'=>'error','message'=>$e->getMessage()));
    }
}else{
    echo 'instagram not connected<br>';
}

echo '<a href="https://api.instagram.com/oauth/authorize?client_id='.client_id.'&redirect_uri='.redirect_uri.'&scope=user_profile,user_media&response_type=code" target="_blank">connect your instagram</a>';

function get_short_lived_access_token($code){
    $url="https://api.instagram.com/oauth/access_token";
    $data = array(
                'client_id'     => client_id,
                'client_secret' => client_secret,
                'grant_type'    => 'authorization_code',
                'redirect_uri'  => redirect_uri,
                'code'          => $code
            );
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, true);    
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

function get_long_lived_access_token($access_token, $user_id){
    $url="https://graph.instagram.com/access_token/?";
    $data = array(
                'client_secret' => client_secret,
                'access_token'  => $access_token,
                'grant_type'    => 'ig_exchange_token'
            );
    $string = http_build_query($data);
    $ch = curl_init($url.$string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

function get_user_data($access_token, $user_id){
    $url="https://graph.instagram.com/".$user_id.'/?';
    $data = array(
                'access_token'  => $access_token,
                'fields'        => 'username,account_type,media_count'
            );
    $string = http_build_query($data);
    $ch = curl_init($url.$string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);
    return ($result);
}

function get_user_media_id($access_token, $user_id){
    $url="https://graph.instagram.com/".$user_id.'/media/?';
    $data = array(
                'access_token'  => $access_token,
                'fields'        => 'id,timestamp'
            );
    $string = http_build_query($data);
    $ch = curl_init($url.$string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);
    return ($result);
}

function get_user_media_data($access_token, $user_id, $media_id){
    $url="https://graph.instagram.com/".$media_id.'/?';
    $data = array(
                'access_token'  => $access_token,
                'fields'        => 'caption,id,media_type,media_url,permalink,thumbnail_url,timestamp'
            );
    $string = http_build_query($data);
    $ch = curl_init($url.$string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);
    return ($result);
}

function refresh_access_token($access_token){
    $url="https://graph.instagram.com/refresh_access_token/?";
    $data = array(
                'access_token'  => $access_token,
                'grant_type'    => 'ig_refresh_token'
            );
    $string = http_build_query($data);
    $ch = curl_init($url.$string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    curl_close($ch);
    return ($result);
}

1 ответ
1

Общий отзыв

Было бы разумно поместить все функции и константы в класс для инкапсуляции. Таким образом, константы могут быть размещены в пространстве имен. Возможно, было бы разумно иметь константу для базовых URL-адресов, например:

const API_URL = 'https://api.instagram.com';
const GRAPH_URL = 'https://graph.instagram.com';

Между функциями есть некоторая избыточность. Было бы разумно иметь функцию, которая обрабатывает функции cURL — возможно, принимает URL-адрес или путь, который может быть добавлен к базовому URL-адресу (например, определенному с использованием const в виде https://graph.instagram.com/), если URL-адрес действительно содержит TLD, параметр для данных и необязательный параметр для метода, который будет обрабатывать CURLOPT_POST.

Желательно следовать рекомендованным стандартам — например, Рекомендации по стандартам PHP — особенно ПСР-1 а также ПСР-12.

В try/catch похоже на то, что ваш здравый смысл критиковал в более раннем обзоре как «бессмысленный код культа карго». Выполните любую из функций, вызываемых в try блокировать исключения? Я мог понять, что это используется, если звонки json_decode() прошедший JSON_THROW_ON_ERROR как $flags параметр

Целенаправленная обратная связь

Постоянный формат

Как это принято во многих объектно-ориентированных языках программирования, ПСР-1 рекомендует константы объявлять заглавными буквами:

Константы класса ДОЛЖНЫ быть объявлены в верхнем регистре с разделителями подчеркивания.
1

Таким образом было бы проще определить CLIENT_ID как константа по сравнению с client_id, и аналогично для двух других констант.

Формат массива

Нет ничего плохого в использовании array() но на момент написания PHP имеет активную поддержку версий 8.0 и 7.4., а поскольку массивы PHP 5.4 можно объявлять с помощью синтаксис коротких массивов (PHP 5.4) — т.е. [].

Вернуться раньше

После трех define строк есть этот код:

if (isset($_GET['code'])) {
    try{
        #gets code

и в конце этого блока это:

}else{
    echo 'instagram not connected<br>';
}

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

if (!isset($_GET['code'])) {
    return 'instagram not connected<br>';
}
try {
    #gets code

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

Счетчик итераций с foreach

Вместо этого foreach который вручную поддерживает $i:

   $i = 0;
   foreach($media->data as $media_data){

с последним шагом:

        if (++$i == 5) break;

Используйте этот формат:

foreach ($media->data as $i => $media_data) {

И последний шаг:

    if ($i === 5) break;

Хотя обновление не является неправильным $i вручную, это можно обработать итерацией.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *