Warning 2023-12-31 - Version 7.0.0 will drop support for PHP < 8.2
Warning 2022-11-09 - Instagram changed his DOM AGAIN... Please update to this version 6.16.4
Warning 2022-06-01 - Instagram changed his DOM content and profile data loading. Please update to this version 6.15.0
Easily fetch any Instagram feed and more without OAuth for PHP.
If you like or use this package, please share your love by starring this repository, follow @pgrimaud or become a sponsor.
This version can retrieve ANY Instagram feed using web scraping.
composer require pgrimaud/instagram-user-feed
v7.0.0 - 2023-12-31:
v6.16.6 - 2023-12-31:
v6.16.5 - 2023-12-24:
$profile->getMedias()
will always
return an empty array after calling $api->getProfile()
. It is necessary to call
$api->getMoreMedias($profile)
to return the first 12 media (cookieguru)v6.16 - 2022-08-02:
v6.15 - 2022-06-02:
v6.12 - 2021-09-20:
v6.11 - 2021-09-13:
v6.10 - 2021-09-03:
v6.9 - 2021-09-02:
v6.8 - 2021-07-08:
v6.7 - 2021-01-31:
v6.6 - 2020-10-06:
v6.5 - 2020-09-14:
v6.4 - 2020-08-30:
v6.3 -2020-07-03:
v6.2 - 2020-06-01:
v6.1 - 2020-05-21:
v6.0 - 2020-05-20
Facebook added a new CORS policy, and you can't display the data directly.
You can now download media on your storage or server to serve it directly on your website. You can find an example here.
Example:
<?php
// include vendor & classes
// random picture from instagram
$url = 'https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-19/s150x150/156309873_1632221153646196_1273891214497323498_n.jpg?tp=1&_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_ohc=vbxGNZrjPmUAX8CIDdC&edm=ABfd0MgBAAAA&ccb=7-4&oh=ae5811c07f0e73b945eb203cd58c2101&oe=60EDD1EE&_nc_sid=7bff83'
// define directory
$downloadDir = __DIR__ . '/../assets'; // change it
$fileName = MediaDownloadHelper::downloadMedia($url, $downloadDir);
// file was downloaded here : __DIR__ . '/../assets/v-t51.2885-19-s150x150-156309873_1632221153646196_1273891214497323498_n.jpg
Some people may have trouble to login with this library. It happens for "old" Instagram accounts or if you're using it on some shared hosting (not all, I don't know why...).
You can now automatically bypass the checkpoint challenge. (email verification with code). You can find an example here.
Tips: you should create a dummy instagram account using a dummy e-mailbox to use this feature.
*Saving session with cache driver is very important here. The Instagram session is valid for... 1 YEAR. So in theory, using a cache driver and one account will trigger only one real login to Instagram then reusing session for a long time.
Thanks to @ibnux and @eldark for help
In version ^6.0, login is now mandatory, it will save cookies (session) to simulate "real" requests to Instagram.
They improve their bot detection and without real session data in the headers requests, your IP could be easily soft-ban by Instagram.
Then, you can't fetch a lot of data without login.
Tips: you just have to create or use a dummy account to use easily this package.
New in 6.0 Cache : This library implements PSR-6 for greatest interoperability.
<?php
use InstagramApi;
use SymfonyComponentCacheAdapterFilesystemAdapter;
$cachePool = new FilesystemAdapter('Instagram', 0, __DIR__ . '/../cache');
$api = new Api($cachePool);
$api->login('username', 'password'); // mandatory
$profile = $api->getProfile('robertdowneyjr');
echo $profile->getUserName(); // robertdowneyjr
echo $profile->getFullName(); // Robert Downey Jr. Official
<?php
$api = new Api($cachePool);
$api->login('username', 'password');
$profile = $api->getProfile('robertdowneyjr');
print_r($profile);
InstagramHydratorComponentFeed Object
(
[id] => 1518284433
[userName] => robertdowneyjr
[fullName] => Robert Downey Jr. Official
[biography] => @officialfootprintcoalition @coreresponse
[followers] => 46382057
[following] => 50
[profilePicture] => https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-19/s320x320/72702032_542075739927421_3928117925747097600_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_ohc=h2zGWoshNjUAX9ze3jb&oh=cf6441cfc3f258da3bf4cfef29686c7d&oe=5EEEC338
[externalUrl] => http://coreresponse.org/covid19
[private] =>
[verified] => 1
[mediaCount] => 453
(
[0] => InstagramModelInstagramMedia Object
(
[id] => 2307655221969878423
[typeName] => GraphImage
[height] => 1350
[width] => 1080
[thumbnailSrc] => https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-15/sh0.08/e35/c0.180.1440.1440a/s640x640/96225997_178111910111734_5886065436455432375_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_cat=1&_nc_ohc=GqcYpSEbz8gAX_GF1Ep&oh=1b293215142d407faca46a2fd28eab71&oe=5EF0EBDF
[link] => https://www.instagram.com/p/CAGcDKplv2X/
[date] => DateTime Object
(
[date] => 2020-05-12 22:06:01.000000
[timezone_type] => 3
[timezone] => Europe/Paris
)
[displaySrc] => https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-15/e35/p1080x1080/96225997_178111910111734_5886065436455432375_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_cat=1&_nc_ohc=GqcYpSEbz8gAX_GF1Ep&oh=6c19ddef96fdc07d7926b05e36cb2bed&oe=5EEED2CE
[caption] => The sweetest things are worth waiting for…Susan and I are producing a @Netflix original series, Sweet Tooth, based on the comic by @Jefflemire. Can’t wait to share it with you all. @NXonNetflix @warnerbrostv #SweetTooth
[comments] => 3308
[likes] => 687988
[thumbnails] => Array
(
[0] => stdClass Object
(
[src] => https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-15/e35/c0.180.1440.1440a/s150x150/96225997_178111910111734_5886065436455432375_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_cat=1&_nc_ohc=GqcYpSEbz8gAX_GF1Ep&oh=24b300201afc0e0c82166c6288e0ed5b&oe=5EF00196
[config_width] => 150
[config_height] => 150
)
[1] => stdClass Object
(
[src] => https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-15/e35/c0.180.1440.1440a/s240x240/96225997_178111910111734_5886065436455432375_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_cat=1&_nc_ohc=GqcYpSEbz8gAX_GF1Ep&oh=203d0a3d01d77a2978739c96eb67e607&oe=5EEF6DE0
[config_width] => 240
[config_height] => 240
)
[2] => stdClass Object
(
[src] => https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-15/e35/c0.180.1440.1440a/s320x320/96225997_178111910111734_5886065436455432375_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_cat=1&_nc_ohc=GqcYpSEbz8gAX_GF1Ep&oh=7b9cee64460e1c9c501e59621e6ccfb2&oe=5EF18BE6
[config_width] => 320
[config_height] => 320
)
[3] => stdClass Object
(
[src] => https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-15/e35/c0.180.1440.1440a/s480x480/96225997_178111910111734_5886065436455432375_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_cat=1&_nc_ohc=GqcYpSEbz8gAX_GF1Ep&oh=f3d8c31eca2d3c3ab6653b3ed3ebe4f4&oe=5EEFEAC0
[config_width] => 480
[config_height] => 480
)
[4] => stdClass Object
(
[src] => https://scontent-cdt1-1.cdninstagram.com/v/t51.2885-15/sh0.08/e35/c0.180.1440.1440a/s640x640/96225997_178111910111734_5886065436455432375_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_cat=1&_nc_ohc=GqcYpSEbz8gAX_GF1Ep&oh=1b293215142d407faca46a2fd28eab71&oe=5EF0EBDF
[config_width] => 640
[config_height] => 640
)
)
[location] =>
[video] =>
[videoViewCount] => 0
)
...
[endCursor:InstagramModelInstagramProfile:private] => QVFEblBGclVyOEtCMmRLZkVxUUdVbmhsYXNMZmMmplNWtZRkJnRnZOSUdMM1BDRmt3ZA==
)
If you want to use paginate on medias, just call getMoreMedias
method.
<?php
$api = new Api($cachePool);
$api->login($credentials->getLogin(), $credentials->getPassword());
$profile = $api->getProfile('twhiddleston');
print_r($profile->getMedias()); // 12 first medias
do {
$profile = $api->getMoreMedias($profile);
print_r($profile->getMedias()); // 12 more medias
// avoid 429 Rate limit from Instagram
sleep(1);
} while ($profile->hasMoreMedias());
<?php
use InstagramApi;
use SymfonyComponentCacheAdapterFilesystemAdapter;
$cachePool = new FilesystemAdapter('Instagram', 0, __DIR__ . '/../cache');
$api = new Api($cachePool);
$api->login('username', 'password'); // mandatory
$profile = $api->getProfile('starwars'); // we need instagram username
sleep(1);
$feedStories = $api->getStories($profile->getId());
$stories = $feedStories->getStories();
print_r($stories);
Thanks goes to these wonderful people (emoji key):
Pierre Grimaud |
Jan Östlund |
Tim Bond |
Dlinny |
René |
ikiselev1989 |
Pezhvak |
David Greminger |
Nana YAMANE |
David Kurniawan |
gtapps |
Chun-Sheng, Li |
schelmo |
Mojtaba |
Georgy Gusev |
Jibran Ijaz |
Julien Cousin-Alliot |
n-richaud |
Dmitry Afonin |
Andrei Firoiu |
Fiki Pratama |
Carl |
Peter Kampjes |
Bob Brown |
nagajoomlapro |
cleveng |
BMRG14 |
Sinan Portakal |
deepvision7 |
Yusuf Özdemir |
Kadir Melih Can |
This project follows the all-contributors specification. Contributions of any kind welcome!
You found a bug? You need a new feature? You can create an issue if needed or contact me on Twitter.
Licensed under the terms of the MIT License.