Aviso 31/12/2023 - A versão 7.0.0 abandonará o suporte para PHP <8.2
Aviso 09/11/2022 - O Instagram mudou seu DOM NOVAMENTE... Atualize para esta versão 6.16.4
Aviso 01/06/2022 - O Instagram alterou seu conteúdo DOM e carregamento de dados de perfil. Atualize para esta versão 6.15.0
Obtenha facilmente qualquer feed do Instagram e muito mais sem OAuth para PHP.
Se você gosta ou usa este pacote, compartilhe seu amor marcando este repositório, siga @pgrimaud ou torne-se um patrocinador.
Esta versão pode recuperar QUALQUER feed do Instagram usando web scraping .
composer require pgrimaud/instagram-user-feed
v7.0.0 - 31/12/2023:
v6.16.6 - 31/12/2023:
v6.16.5 - 24/12/2023:
$profile->getMedias()
sempre retornará um array vazio após chamar $api->getProfile()
. É necessário chamar $api->getMoreMedias($profile)
para retornar as 12 primeiras mídias (cookieguru)v6.16 - 02/08/2022:
v6.15 - 02/06/2022:
v6.12 - 20/09/2021:
v6.11 - 13/09/2021:
v6.10 - 03/09/2021:
v6.9 - 02/09/2021:
v6.8 - 08/07/2021:
v6.7 - 31/01/2021:
v6.6 - 06/10/2020:
v6.5 - 14/09/2020:
v6.4 - 30/08/2020:
v6.3 -2020-07-03:
v6.2 - 01/06/2020:
v6.1 - 21/05/2020:
v6.0 - 20/05/2020
O Facebook adicionou uma nova política CORS e você não pode exibir os dados diretamente.
Agora você pode baixar mídia em seu armazenamento ou servidor para servi-la diretamente em seu site. Você pode encontrar um exemplo aqui.
Exemplo:
<?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
Algumas pessoas podem ter problemas para fazer login nesta biblioteca. Isso acontece para contas “antigas” do Instagram ou se você estiver usando em alguma hospedagem compartilhada (nem todas, não sei porque...).
Agora você pode ignorar automaticamente o desafio do ponto de verificação. (verificação de e-mail com código). Você pode encontrar um exemplo aqui.
Dicas: você deve criar uma conta fictícia no Instagram usando uma caixa de e-mail fictícia para usar esse recurso.
*Salvar sessão com driver de cache é muito importante aqui. A sessão do Instagram é válida por... 1 ANO . Então, em teoria, usar um driver de cache e uma conta acionará apenas um login real no Instagram e, em seguida, reutilizará a sessão por um longo tempo.
Obrigado a @ibnux e @eldark pela ajuda
Na versão ^6.0 o login agora é obrigatório , ele salvará cookies (sessão) para simular solicitações "reais" ao Instagram.
Eles melhoram a detecção de bots e sem dados reais da sessão nas solicitações de cabeçalho, seu IP pode ser facilmente banido pelo Instagram.
Então, você não pode buscar muitos dados sem login.
Dicas: basta criar ou usar uma conta fictícia para utilizar facilmente este pacote.
Novidade no Cache 6.0 : Esta biblioteca implementa PSR-6 para maior interoperabilidade.
<?php
use Instagram Api ;
use Symfony Component Cache Adapter FilesystemAdapter ;
$ 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 );
Instagram Hydrator Component Feed 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 ] => Instagram ModelInstagramMedia 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==
)
Se você quiser usar paginate em mídias, basta chamar o método getMoreMedias
.
<?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 Instagram Api ;
use Symfony Component Cache Adapter FilesystemAdapter ;
$ 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 );
Os agradecimentos vão para essas pessoas maravilhosas (chave emoji):
Pedro 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 |
Carlos | Pedro Campjes | Bob Brown | nagajoomlapro | Cleveng | BMRG14 | Sinan Portakal |
visão profunda7 | Yusuf Özdemir | Kadir Melih pode |
Este projeto segue a especificação de todos os contribuidores. Contribuições de qualquer tipo são bem-vindas!
Você encontrou um bug? Você precisa de um novo recurso? Você pode criar um problema, se necessário, ou entrar em contato comigo no Twitter.
Licenciado sob os termos da Licença MIT.