pgrimaud/instagram-user-feed
Composer 安装命令:
composer require pgrimaud/instagram-user-feed
包简介
This is a scraper to easily fetch any feed and interact with Instagram (like, follow, etc.) without OAuth for PHP.
README 文档
README
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
Information
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. 🙏💓
Features
- Fetch profile data of user
- Fetch medias of user
- Fetch stories of user
- Fetch highlights stories of user
- Fetch detailed post of user
- Fetch feed of followers
- Fetch feed of followings
- Follow or unfollow users
- Like or unlike posts
- Fetch posts of hashtag
- Fetch comments of a post
- Fetch live-streaming info
- Fetch Reels
- Fetch IGTV
- Fetch medias where a user has been tagged on
- Fetch HD profile picture
- Post a message to a media
- NEW: Login with cookies 🎉
- NEW: Fetch connected user timeline 🎉
This version can retrieve ANY Instagram feed using web scraping.
⚠️ Version ^5.0 is no more maintained. ⚠️
Installation
composer require pgrimaud/instagram-user-feed
Changelog
v7.0.0 - 2023-12-31:
- Drop support for PHP < 8.2
v6.16.6 - 2023-12-31:
- Add support for Symfony 7
- Fix login error "Unable to extract JSON data" (n1crask)
v6.16.5 - 2023-12-24:
- Medias are no longer returned after fetching a profile.
$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) - Same for IGTV (cookieguru)
- Fix imap_delete second parameter (deepvision7)
v6.16 - 2022-08-02:
- Login with cookies. Thanks to nsmle (example here) 🎉.
- Fetch connected user timeline. Thanks to nsmle (example here) 🎉.
- Add full support for Symfony 6
- Add checks on missing properties to avoid errors
v6.15 - 2022-06-02:
- ⚠️ ⚠️ Fix profile endpoint. Please update to this last version!
v6.12 - 2021-09-20:
- Add method to post message on a media (example here) 🎉.
- Add method to get HD profile picture (example here) 🎉.
v6.11 - 2021-09-13:
- Add method to fetch medias where a user has been tagged on (example here) 🎉.
v6.10 - 2021-09-03:
- Add method to fetch IGTV (example here) 🎉.
- Add method to fetch Reels (example here) 🎉.
- Split dirty tests in multiple files.
v6.9 - 2021-09-02:
- Add method to fetch Instagram live-streaming info. Thanks to David-Kurniawan
- Minor fixes.
v6.8 - 2021-07-08:
- Add video url in media feed. Thanks to @Nispeon
- Add helper to download media (ref to #205 : strict-origin-when-cross-origin). Thanks to @Nispeon
- Minor changes and improvements.
v6.7 - 2021-01-31:
- New feature: get post of hashtag.
- New feature: get comments of post.
- Add support for PHP 8.
- Minor changes and improvements.
v6.6 - 2020-10-06:
- New feature: like and unlike posts.
- Retrieval #hashtags and @mentions from stories.
- Minor changes and improvements.
v6.5 - 2020-09-14:
- New feature: follow and unfollow users. Thanks to @David-Kurniawan)
- Minor fixes.
v6.4 - 2020-08-30:
- New feature: fetch followers and followings feeds. Thanks to @David-Kurniawan)
- Minor improvements.
v6.3 -2020-07-03:
- Add checkpoint challenge bypass using IMAP configuration.
v6.2 - 2020-06-01:
- Improve medias crawling && cache constraints.
v6.1 - 2020-05-21:
- New feature: Fetch stories and highlights stories.
v6.0 - 2020-05-20
- Please upgrade from ^5.0 for cookies session stability.
Version ^6.8: strict-origin-when-cross-origin
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
Version ^6.3: Checkpoint challenge bypass
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.
How it works?
- The lib will try to login
- Got 400 error "checkpoint_required"
- Trigger email verification
- Connect to your email inbox using IMAP credentials
- Wait for Instagram verification email
- Parse verification code from email
- Make a request to instagram with this code to complete verification
- Verification is done, then save session automatically*
*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 🎉
Version ^6.0: Login
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.
Usage
New in 6.0 Cache : This library implements PSR-6 for greatest interoperability.
<?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
Basic usage :
<?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\Model\InstagramMedia 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:Instagram\Model\InstagramProfile:private] => QVFEblBGclVyOEtCMmRLZkVxUUdVbmhsYXNMZmMmplNWtZRkJnRnZOSUdMM1BDRmt3ZA== )
Paginate
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());
Stories
<?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);
Contributors
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!
Feedback
You found a bug? You need a new feature? You can create an issue if needed or contact me on Twitter.
License
Licensed under the terms of the MIT License.
pgrimaud/instagram-user-feed 适用场景与选型建议
pgrimaud/instagram-user-feed 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 666.21k 次下载、GitHub Stars 达 942, 最近一次更新时间为 2018 年 01 月 05 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「api」 「sdk」 「feed」 「social」 「instagram」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 pgrimaud/instagram-user-feed 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 pgrimaud/instagram-user-feed 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 pgrimaud/instagram-user-feed 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A PSR-7 compatible library for making CRUD API endpoints
Alfabank REST API integration
Zero-dependency raw PHP DNS resolver, domain-ownership verification, and intoDNS/MxToolbox-style diagnostics. Queries authoritative nameservers directly over sockets — never trusts the recursive cache for ownership checks.
A lightweight plain-PHP framework for database-backed CRUD APIs.
bughq error tracking - PHP SDK
ABsurge PHP SDK for feature flags and A/B testing
统计信息
- 总下载量: 666.21k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 947
- 点击次数: 26
- 依赖项目数: 6
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2018-01-05