
Research
/Security News
9 Malicious NuGet Packages Deliver Time-Delayed Destructive Payloads
Socket researchers discovered nine malicious NuGet packages that use time-delayed payloads to crash applications and corrupt industrial control systems.
scraper-instagram
Advanced tools
Scrape data from Instagram without applying for the authenticated API.
From npm
yarn add scraper-instagram
or
npm i scraper-instagram --save
git clone https://git.kaki87.net/KaKi87/ig-scraper.gityarn install or npm installyarn test or npm run testOptional environment variables for more complete testing :
SESSION_ID : a session ID for authentication test and authenticated testsPUBLIC_PROFILE : a public profile to accessPRIVATE_PROFILE : a private profile to accessSTORY_PROFILE_ID : a profile ID with a story to readSTORY_PROFILE_USERNAME : a profile username with a story to readHASHTAG (default value : cat) : a hashtag to fetchLOCATION_ID (default value : 6889842 aka. Paris) : a location to fetchPOST : a post to fetchSEARCH_PROFILE : a profile to search forSEARCH_HASHTAG (default value : cats) : a hashtag to search forSEARCH_LOCATION (default value : Paris) : a location to search forMethods not covered by tests :
subscribeUserPostssubscribeHashtagPostssubscribeAccountNotificationsconst Insta = require('scraper-instagram');
const InstaClient = new Insta();
Authentication allows you to access private profile as long as you follow them.
Ctrl + Shift + I)sessionid cookie value
application tabstorage tabInstaClient.authBySessionId(yourSessionId)
.then(account => console.log(account))
.catch(err => console.error(err));
If authentication is successfull, you'll get the form data from accounts/edit :
{
"first_name": "",
"last_name": "",
"email": "",
"is_email_confirmed": true,
"is_phone_confirmed": true,
"username": "",
"phone_number": "",
"gender": 1,
"birthday": null,
"biography": "",
"external_url": "",
"chaining_enabled": true,
"presence_disabled": false,
"business_account": false,
"usertag_review_enabled": false
}
If your session ID is invalid, you'll get the 401 error.
Username/password authentication may be supported in the future.
These methods allows you to get specific elements from Instagram while you know exactly what you're looking for.
get may return errors in the two following cases.
406)204)401)429)409)InstaClient.getProfile(username)
.then(profile => console.log(profile))
.catch(err => console.error(err));
Result
id string - Instagram identifier, only used for storiesname string - public full namepic url - public profile picturebio string - public biography
website url - public website
private boolean - account private stateaccess boolean - access to the profile's feed
verified boolean - account verified statefollowers integer - number of users following this profilefollowing integer - number of users this profile followsposts integer - number of posts this profile publishedlastPosts array of posts - last posts
[]) when the profile doesn't have any post but null if access is false (denied).link url - link to the profile's pagebusiness string - business category (when applicable and profile unblocked)user object - user relevant properties (while authenticated) :
mutualFollowers array of usernames - people following you and this profileblocking boolean - you blocked this profileblocked boolean - this profile blocked you (only available property in user while true)requesting boolean - you sent a follow request to this profile (if private)requested boolean - this profile sent you a follow request (if yours is private)following boolean - you're following this profilefollowed boolean - this profile follows youInstaClient.getProfileStoryById(id)
.then(profile => console.log(profile))
.catch(err => console.error(err));
InstaClient.getProfileStory(username)
.then(profile => console.log(profile))
.catch(err => console.error(err));
unread boolean - profile story is unreadauthor object - a subset of profile
usernamepicuser object - user relevant properties
requestingfollowingitems array of stories - profile stories
url string - link to original story file (jpg, mp4, ...)type string - story type : photo or videotimestamp epochexpirationTimestamp epochThose methods will return null when a profile has no story.
Note : calling this method will not mark the story as read.
InstaClient.getHashtag(hashtag)
.then(hashtag => console.log(hashtag))
.catch(err => console.error(err));
Result
pic url - hashtag profile pic (can't find out how it is chosen)posts integer - number of posts containing this hashtagfeaturedPosts array of posts - featured posts published with this hashtag
lastPosts array of posts - last posts published with this hashtag
link url - link to the hashtag's pageuser object - user relevant properties (while authenticated) :
following boolean - you subscribed to this hashtag (receiving posts in your personal feed)Unfortunately, using IDs is currently the only way to get a location, at least for now.
InstaClient.getLocation(id)
.then(location => console.log(location))
.catch(err => console.error(err));
Result
pic url - location profile picposts integer - posts published from that locationaddress object
street stringzipCode stringcity stringlatitude floatlongitude floatwebsite url - place's websitephone string - place's contact phone numberfeaturedPosts array of posts - featured posts published from this location
lastPosts array of posts - last posts published from this locationlink url - link to this location's pageThis is a subset of a real post, containing the following properties :
shortcode string - post identifiercaption string - post descriptioncomments integer - number of commentslikes integer - number of likesthumbnail url - post thumbnail
The shortcode is the post's identifier : the link to a post is instagram.com/p/shortcode.
InstaClient.getPost(shortcode)
.then(post => console.log(post))
.catch(err => console.error(err));
Result
author object - a subset of a profile's properties.
username stringname stringpic urlverified booleanlink urllocation
name stringcity stringcontents array of posts
type string - post type : photo or videourl string - link to original post file (jpg, mp4, ...)type is video :
thumbnail string - link to thumbnail
views integer - number of viewstagged array of usernames - people tagged in post contentslikes integer - number of likescaption string - post descriptionhashtags array of hashtags - hashtags mentioned in post descriptionmentions array of usernames - people mentioned in post descriptionedited boolean - caption editedcomments array of objects (Max 40)
user string - comment author's usernamecontent string - comment contenttimestamp epochhashtags array of hashtagsmentions array of usernameslikes integercommentCount integertimestamp epochlink string - link to the postPaginated getters allows bulk data downloads.
Params :
maxCount integer - max number of items to returnpageId string (optional) - page navigation identifierResult : array + nextPageId property
Sample :
(async () => {
const page0 = await somePaginatedGetter(someId, 50);
const page1 = await somePaginatedGetter(someId, 50, page0.nextPageId);
const page2 = await somePaginatedGetter(someId, 50, page1.nextPageId);
})();
The pageId/nextPageId property may contain a string of digits, a base64 string, or a JSON string, but always must be leaved untouched.
Result in array : full post object
InstaClient.getProfilePostsById(profileId, maxCount, pageId)
.then(posts => console.log(posts))
.catch(err => console.error(err));
InstaClient.getProfilePosts(profileUsername, maxCount, pageId)
.then(posts => console.log(posts))
.catch(err => console.error(err));
InstaClient.getPostComments(shortcode, maxCount, pageId)
.then(posts => console.log(posts))
.catch(err => console.error(err));
Result in array : comment object
InstaClient.getHashtagPosts(hashtag, maxCount, pageId)
.then(posts => console.log(posts))
.catch(err => console.error(err));
Result in array : partial post object
InstaClient.getLocationPostsById(locationId, maxCount, pageId)
.then(posts => console.log(posts))
.catch(err => console.error(err));
Result in array : partial post object
InstaClient.searchProfile(query)
.then(profiles => console.log(profiles))
.catch(err => console.error(err));
Result in array : a subset of profile.
usernamenamepicprivateverifiedfollowersuser
followingInstaClient.searchHashtag(hashtag)
.then(hashtags => console.log(hashtags))
.catch(err => console.error(err));
Result in array : a subset of hashtag.
namepostsInstaClient.searchLocation(location)
.then(locations => console.log(locations))
.catch(err => console.error(err));
Result in array : a subset of location.
idnameaddress
streetcitylatitudelongitudeoptions object (optional)
interval integer (optional) - time in seconds between requests. Default : 30lastPostShortcode string (optional) - shortcode from which to begin if not the next one to be published.fullPosts boolean (optional) - fetch full post data, additional request requiredInstaClient.subscribeUserPosts(username, (post, err) => {
if(post)
console.log(post.shortcode);
else
console.error(err);
}, {
interval,
lastPostShortcode,
fullPosts
});
InstaClient.subscribeHashtagPosts(hashtag, (post, err) => {
if(post)
console.log(post.shortcode);
else
console.error(err);
}, {
interval,
lastPostShortcode,
fullPosts
});
InstaClient.getAccountNotifications()
.then(notifications => console.log(notifications))
.catch(err => console.error(err));
Result in array : notification
id string - Notification identifiertimestamp epochtype string - Notification type : like, mention, comment, followpost
shortcodethumbnailby
usernamenamepiccontent string - Comment content (when applicable)options object (optional)
interval integer (optional) - time in seconds between requests. Default : 30lastNotificationId string (optional) - Notification IDInstaClient.subscribeAccountNotifications((post, err) => {
if(post)
console.log(post.shortcode);
else
console.error(err);
}, {
interval,
lastNotificationId
});
InstaClient.getAccountStories()
.then(stories => console.log(stories))
.catch(err => console.error(err));
Result in array : inbox-like
unreadauthor object - a subset of a profile's properties.
idusernamepicuser object - user relevant properties
requestingfollowing1.0.0 (2019-03-26) • Initial release1.0.1 (2019-03-27)
1.0.2 (2019-03-27) • Added support for videos1.0.4 (2019-03-27)
1.0.5 (2019-03-27) • Added proper error for private accounts1.0.6 (2019-03-31) • Private account access doesn't require mutual follow1.0.7 (2019-04-03) • Added profile's last posts analytics #1 + more1.0.8 (2019-04-14)
id properties1.0.9
business property to profile (when applicable)1.0.10 (2020-01-26) • Fixed post comments on anonymous session1.0.11 (2020-04-18)
401 detection1.0.12 (2020-06-16) • Small fix & refactor1.0.13 (2020-07-10) • Added support for stories1.0.14 (2020-10-17) • Fixed access to own private profile1.0.15 (2020-12-19)
429 detection1.0.16 (2020-12-25)
commentCount propertytimestamp propertyid propertygetProfilePostsById & getProfilePosts methodsgetPostComments methodgetHashtagPosts methodgetLocationPostsById method409 detection401 detectionshortcode property1.0.17 (2021-01-2?)
409 detection2.0.0 (202?-??-??)
getLocation to getLocationByIdpost & error parametersFAQs
Instagram scraper without authenticated API
The npm package scraper-instagram receives a total of 46 weekly downloads. As such, scraper-instagram popularity was classified as not popular.
We found that scraper-instagram demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
Socket researchers discovered nine malicious NuGet packages that use time-delayed payloads to crash applications and corrupt industrial control systems.

Security News
Socket CTO Ahmad Nassri discusses why supply chain attacks now target developer machines and what AI means for the future of enterprise security.

Security News
Learn the essential steps every developer should take to stay secure on npm and reduce exposure to supply chain attacks.