Получение фотографий из Instagram с определенным хэштегом

На главной странице одного из моих сайтов я показываю ленту Instagram с тремя последними фотографиями. Я достиг этого с помощью следующего кода:

function rudr_instagram_api_curl_connect( $api_url ){
    $connection_c = curl_init(); // initializing
    curl_setopt( $connection_c, CURLOPT_URL, $api_url ); // API URL to connect
    curl_setopt( $connection_c, CURLOPT_RETURNTRANSFER, 1 ); // return the result, do not print
    curl_setopt( $connection_c, CURLOPT_TIMEOUT, 20 );
    $json_return = curl_exec( $connection_c ); // connect and get json data
    curl_close( $connection_c ); // close connection
    return json_decode( $json_return ); // decode and return
}
$access_token = 'access_token';
$image_return = 3;
$user_search = rudr_instagram_api_curl_connect("https://api.instagram.com/v1/users/self/media/recent?access_token=".$access_token);

$user_id = $user_search->data[0]->id; // or use string 'self' to get your own media
$return = rudr_instagram_api_curl_connect("https://api.instagram.com/v1/users/self/media/recent?access_token=".$access_token."&count=".$image_return);

// var_dump( $return ); // if you want to display everything the function returns

foreach ($return->data as $post) {
    echo '<div class="col-sm-12 col-md-4 mb-3 text-center">
           <a href="'.$post->link.'" target="_blank">
           <img src="' . $post->images->standard_resolution->url . '"  class="img-fluid img-thumbnail bx-shadow"/>
           </a>
           <p><i class="fa fa-tag" aria-hidden="true"></i> ' . $post->caption->text . '<br><i class="fa fa-heart" aria-hidden="true"></i> '.$post->likes->count.' <i class="fa fa-comment" aria-hidden="true"></i> '.$post->comments->count.'<br><i class="fa fa-clock-o" aria-hidden="true"></i> ' . date('M j, Y', $post->created_time) . '</p>
          </div>';
}

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

Я заметил в решении, что в URL-адресе была просто переменная tags, поэтому я изменил свой код, добавив переменную $hashtag = "bodypiercing"; и добавив ее в URL-адрес как $return = rudr_instagram_api_curl_connect("https://api.instagram.com/v1/tags/".$hashtag."/users/self/media/recent?access_token=".$access_token."&count=".$image_return);.

Вот этот полный код:

function rudr_instagram_api_curl_connect( $api_url ){
    $connection_c = curl_init(); // initializing
    curl_setopt( $connection_c, CURLOPT_URL, $api_url ); // API URL to connect
    curl_setopt( $connection_c, CURLOPT_RETURNTRANSFER, 1 ); // return the result, do not print
    curl_setopt( $connection_c, CURLOPT_TIMEOUT, 20 );
    $json_return = curl_exec( $connection_c ); // connect and get json data
    curl_close( $connection_c ); // close connection
    return json_decode( $json_return ); // decode and return
}
$access_token = 'access_token';
$image_return = 3;
$hashtag = "bodypiercing";
$user_search = rudr_instagram_api_curl_connect("https://api.instagram.com/v1/users/self/media/recent?access_token=".$access_token);

$user_id = $user_search->data[0]->id; // or use string 'self' to get your own media
$return = rudr_instagram_api_curl_connect("https://api.instagram.com/v1/tags/".$hashtag."/users/self/media/recent?access_token=".$access_token."&count=".$image_return);

// var_dump( $return ); // if you want to display everything the function returns

foreach ($return->data as $post) {
    echo '<div class="col-sm-12 col-md-4 mb-3 text-center">
           <a href="'.$post->link.'" target="_blank">
           <img src="' . $post->images->standard_resolution->url . '"  class="img-fluid img-thumbnail bx-shadow"/>
           </a>
           <p><i class="fa fa-tag" aria-hidden="true"></i> ' . $post->caption->text . '<br><i class="fa fa-heart" aria-hidden="true"></i> '.$post->likes->count.' <i class="fa fa-comment" aria-hidden="true"></i> '.$post->comments->count.'<br><i class="fa fa-clock-o" aria-hidden="true"></i> ' . date('M j, Y', $post->created_time) . '</p>
          </div>';
}

Однако это приводит к следующему:

Notice: Trying to get property of non-object in /home/jesse666toxik/public_html/php/index.main.php on line 42

Warning: Invalid argument supplied for foreach() in /home/jesse666toxik/public_html/php/index.main.php on line 42

Что я мог сделать не так, чтобы эта одна переменная сделала это?

Результаты var_dump:

Notice
: Undefined property: stdClass::$data in
/home/jesse666toxik/public_html/php/index.main.php
on line
37


Notice
: Trying to get property of non-object in
/home/jesse666toxik/public_html/php/index.main.php
on line
37

NULL 
Notice
: Trying to get property of non-object in
/home/jesse666toxik/public_html/php/index.main.php
on line
42


Warning
: Invalid argument supplied for foreach() in
/home/jesse666toxik/public_html/php/index.main.php
on line
42

person Jesse Elser    schedule 14.12.2017    source источник
comment
Раскомментируйте var_dump($return). Что возвращается? Ваш код ожидает, что это будет объект с параметром data, который содержит массив. Так ли это?   -  person ceejayoz    schedule 15.12.2017
comment
Ваша переменная $return, похоже, возвращает пользователя, вызов API такой же, как и для $user_search   -  person SierraOscar    schedule 15.12.2017
comment
@ceejayoz Отредактировал и включил результаты var_dump. @MacroMan, который изначально был примером из учебника. Я не уверен, почему это было так, но это сработало.   -  person Jesse Elser    schedule 15.12.2017
comment
Упс понял, что я опубликовал результаты var_dump с рабочим кодом. Исправлена.   -  person Jesse Elser    schedule 15.12.2017


Ответы (1)


Судя по информации на странице, на которую вы ссылаетесь, вы используете неправильный URL-адрес, вы вставили часть URL-адреса хэштега в исходный URL-адрес пользователя.

В цитируемой статье используется этот URL:

$url = 'https://api.instagram.com/v1/tags/'.$tag.'/media/recent?client_id='.$client_id;

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

person miknik    schedule 14.12.2017
comment
Ну, я использую users/self в своем URL-адресе, так как я получаю свои собственные изображения. Просто кажется, что вставка /tags/hashtag в мой URL все равно должна ограничивать возврат. Я немного поработаю и попробую этот URL. - person Jesse Elser; 15.12.2017
comment
К сожалению, этот URL-адрес запрашивает access_token, который у меня есть. При добавлении он не возвращает изображения. Я ввел URL-адрес прямо в браузер, а не код, и вот что я получил {"meta": {"code": 400, "error_type": "OAuthPermissionsException", "error_message": "This request requires scope=public_content, but this access token is not authorized with this scope. The user must re-authorize your application with scope=public_content to be granted this permissions."}} - person Jesse Elser; 15.12.2017
comment
Есть только 3 конечных точки для запросов тегов от API. Получить информацию об объекте тега. Получите список недавно помеченных медиафайлов и выполните поиск тегов по имени. Нет возможности ограничить пользователем. Лучше всего использовать хэштег, который никто другой не будет использовать для изображений, которые вы хотите разместить на своем веб-сайте, а затем выполнить поиск по нему. - person miknik; 15.12.2017
comment
У вашего access_token нет разрешений, необходимых для этого вызова API. Вам необходимо запросить новый и утвердить разрешения для новых областей. - person miknik; 15.12.2017
comment
Я читал кое-что об этом разрешении, которое необходимо, и там говорится, что приложения больше не принимаются. Теперь я действительно в растерянности. - person Jesse Elser; 15.12.2017