开发者

How to get a user's Instagram feed

I'd like to get a user's Instagram feed using PHP. I've signed up 开发者_运维问答for an Instagram Developer Account and tried pulling in a user's info and photos, but the response isn't stable. Sometimes I get a response and other times I keep getting the error: access_token is missing. Is there a solid example of getting a user's feed of photos by username?

Ideally, I'd like it to be as simple as:

$instagram = new Instagram();
$photos = $instagram->getPhotos("username-goes-here");

Where Instagram is a class that handles all the requests. Any help or direction is appreciated. Thanks!


Try this,

<?php

  function fetchData($url){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 20);
  $result = curl_exec($ch);
  curl_close($ch); 
  return $result;
  }

  $result = fetchData("https://api.instagram.com/v1/users/ID-GOES-HERE/media/recent/?access_token=TOKEN-GOES-HERE");
  $result = json_decode($result);
  foreach ($result->data as $post) {
    // Do something with this data.
  }
?>

May this help you.


I did this:

<?php

  function fetchData($url){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 20);
  $result = curl_exec($ch);
  curl_close($ch); 
  return $result;
  }

  $result = fetchData("https://api.instagram.com/v1/users/USER ID HERE/media/recent/?access_token=ACCES TOKEN HERE&count=14");


  $result = json_decode($result);
  foreach ($result->data as $post) {
     if(empty($post->caption->text)) {
       // Do Nothing
     }
     else {
        echo '<a class="instagram-unit" target="blank" href="'.$post->link.'">
        <img src="'.$post->images->low_resolution->url.'" alt="'.$post->caption->text.'" width="100%" height="auto" />
        <div class="instagram-desc">'.htmlentities($post->caption->text).' | '.htmlentities(date("F j, Y, g:i a", $post->caption->created_time)).'</div></a>';
     }

  }
?>


Taking what i have seen around the internet and on this page, I have created an Instagram class (very simple, only for pulling feed, etc.') below.

class Instagram {
    public static $result;
    public static $display_size = 'thumbnail'; // you can choose between "low_resolution", "thumbnail" and "standard_resolution"
    public static $access_token = "DEFAULTACCESSTOKEN"; // default access token, optional
    public static $count = 10;
    public static function fetch($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
    function __construct($Token=null){
        if(!empty($Token)){
            self::$access_token = $Token;

            // Remove from memory -- not sure if really needed.
            $Token = null;
            unset($Token);
        }
        self::$result = json_decode(self::fetch("https://api.instagram.com/v1/users/self/media/recent?count=" . self::$count . "&access_token=" . self::$access_token), true);
    }
}
$Instagram = new Instagram('ACCESSTOKENIFCHANGEDORNULLOREMPTY');
foreach ($Instagram::$result->data as $photo) {
    $img = $photo->images->{$Instagram::$display_size};
}


Update: 15.6.2017 - Instagram has changed the end point, the following does not work anymore.

Since it's not anymore possible to get random users feed without approved application, I've figured out how to get it using the unofficial API:

#!/bin/bash
instagram_user_id=25025320
count=12
csrftoken=$(curl --head -k https://www.instagram.com/ 2>&1 | grep -Po "^Set-Cookie: csrftoken=\K(.*?)(?=;)")
curl "https://www.instagram.com/query/" -H "cookie: csrftoken=$csrftoken;" -H "x-csrftoken: $csrftoken" -H "referer: https://www.instagram.com/" --data "q=ig_user($instagram_user_id)%20%7B%20media.after(0%2C%20$count)%20%7B%0A%20%20count%2C%0A%20%20nodes%20%7B%0A%20%20%20%20caption%2C%0A%20%20%20%20code%2C%0A%20%20%20%20comments%20%7B%0A%20%20%20%20%20%20count%0A%20%20%20%20%7D%2C%0A%20%20%20%20date%2C%0A%20%20%20%20dimensions%20%7B%0A%20%20%20%20%20%20height%2C%0A%20%20%20%20%20%20width%0A%20%20%20%20%7D%2C%0A%20%20%20%20display_src%2C%0A%20%20%20%20id%2C%0A%20%20%20%20is_video%2C%0A%20%20%20%20likes%20%7B%0A%20%20%20%20%20%20count%0A%20%20%20%20%7D%2C%0A%20%20%20%20owner%20%7B%0A%20%20%20%20%20%20id%2C%0A%20%20%20%20%20%20username%2C%0A%20%20%20%20%20%20full_name%2C%0A%20%20%20%20%20%20profile_pic_url%0A%20%20%20%20%7D%2C%0A%20%20%20%20thumbnail_src%2C%0A%20%20%20%20video_views%0A%20%20%7D%2C%0A%20%20page_info%0A%7D%0A%20%7D" -k

I will improve this answer with PHP later, I need to do this with PHP too.


Answers should be updated, as now the only possible way is trough Instagram Facebook API --> https://developers.facebook.com/docs/instagram/oembed


Found this medium article:- https://medium.com/@bkwebster/how-to-get-instagram-api-access-token-and-fix-your-broken-feed-c8ad470e3f02

 <?php
                    $user_id=xxxxxx;//User ID is the first string of numbers before the first dot (.)
                    $count=2;
                    $width=100;
                    $height=100;
                    $url = 'https://api.instagram.com/v1/users/'.$user_id.'/media/recent/?access_token=xxxxxx.83c3b89.257e2fd9c2bd40c181a2a4fb9576628c&count='.$count;

                    // Also Perhaps you should cache the results as the instagram API is slow
                    $cache = './'.sha1($url).'.json';
                    if(file_exists($cache) && filemtime($cache) > time() - 60*60){
                        // If a cache file exists, and it is newer than 1 hour, use it
                        $jsonData = json_decode(file_get_contents($cache));
                    } else {
                        $jsonData = json_decode((file_get_contents($url)));
                        file_put_contents($cache,json_encode($jsonData));
                    }
                    foreach ($jsonData->data as $key=>$value) {
                        ?>
                        <ul class="w3_footer_grid_list1">
                            <li><label class="fa fa-instagram" aria-hidden="true"></label><a target="_blank" href="<?php echo $value->link;?>"><i><?php echo $value->caption->text; ?> </i></a><?php  ?>
                            </li>
                            <a target="_blank" href="<?php echo $value->link;?>">
                            <img src="<?php echo  $value->images->low_resolution->url;?>" alt="'.$value->caption->text.'" width="<?php echo $width;?>" height="<?php echo $height;?>" />
                            </a>
                        </ul>
                        <?php
                    }
                ?>


this function goes in your App class, but can be a regular function and it will work anyways.

<?php
    public function instagram(){
      $user = 'your user here';
      // you can get your token from here: https://instagram.pixelunion.net/
      $access_token = 'your access token here';
      $photo_count = 6;// you can choose the amount. 20 is the max per query

      $json_link = "https://api.instagram.com/v1/users/self/media/recent/?";
      $json_link .="access_token={$access_token}&count={$photo_count}";
      $json = file_get_contents($json_link);
      return json_decode($json);
    }

the result can be navigated interactively using this tool: http://jsonviewer.stack.hu/

How to get a user's Instagram feed

in my case i'm using blade template engine (https://laravel.com/docs/5.8/blade)

so the template will be

@foreach($instagram->data as $gram)
   <img src="{{$gram->images->thumbnail->url}}">
@endforeach

that's it!


try this one a crawler type in raw form.

function feed_instagram($url = "https://www.instagram.com/titaniumheart_")
{  
    //$url ie https://www.instagram.com/titaniumheart_

    $dom = new DOMDocument();
    @$dom->loadHTMLFile($url);
    $f=$dom->saveHTML();  //load the url (crawl)

    $key="";    
    $swquote=0;     
    echo "<div>";

    for ($x=0;$x<strlen($f);$x++)
    {
       $c=substr($f,$x,1);
       //echo $c."-";
        if ($c==chr(34)) 
        {
            if($swquote==0)
            {
                $swquote=1; //to start get chars
            } else
            {
                $swquote=0;
                //echo $key;
                if($key=="code")
                {
                    //get the number of comments
                    $m=substr($f,$x+4,100);
                    $code= substr($m,0,strpos($m,chr(34)));
                    echo "code is ".$code;
                    echo "<br>";
                }               
                if($key=="comments")
                {
                    //get the number of comments
                    $m=substr($f,$x+12,20);
                    $comments= substr($m,0,strpos($m,"}"));
                    echo "number of comments is ".$comments;
                    echo "<br>";
                }
                if($key=="caption")
                {
                    //get the number of comments
                    $m=substr($f,$x+4,200);
                    $caption= substr($m,0,strpos($m,chr(34)));
                    echo "caption is ".$caption;
                    echo "<br>";
                }
                if($key=="likes")
                {
                    //get the number of comments
                    $m=substr($f,$x+12,20);
                    $likes= substr($m,0,strpos($m,"}"));
                    echo "number of likes is ".$likes;
                    echo "<br>";
                }
                if($key=="thumbnail_src")
                {
                    //get the number of comments
                    $m=substr($f,$x+4,200);
                    $src= substr($m,0,strpos($m,"?"));
                    echo "<br>image source is ".$src;
                    echo "<br>";                                    
                    echo "<a href=\"https://www.instagram.com/p/".$code."/\">";
                    echo "<img src=\"".$src."\">";
                    echo "</a><br>";                    
                }                               
               $key="";
        }

    }else
    {
        if($swquote==1)
        {
            $key.=$c;
        }
    }           
}
echo "</div>";
}

usage: https://www.instagram.com/titaniumheart_");?>

take note: you must enabled extension "php_openssl" on php.ini.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜