Вот пример сценария, который я написал для 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 ответ
Общий отзыв
Было бы разумно поместить все функции и константы в класс для инкапсуляции. Таким образом, константы могут быть размещены в пространстве имен. Возможно, было бы разумно иметь константу для базовых 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 вручную, это можно обработать итерацией.
