Posted by Janne Cederberg on Dec. 23, 2017
Reading time: approx. 2 minute(s)
Reading time: approx. 2 minute(s)
Wanting to make a family video for Christmas I found myself wanting to extract images from my own Instagram account. Here’s quick notes (for myself for future reference) on how I did it. This is not really a tutorial, a technical skill is expected nor do I think this is the best possible solution available. It’s just the fastest reasonable approach I came up with:
- Log into Instagram on the browser (only needed if the images you want are non-public).
- Browse to the profile/tag you want to extract images from.
- Open Developer Tools (
F12
on Windows and Linux,Cmd+I
on Mac, I guess). - Go to
Console
view in the Developer Tools. - Run the code under heading Code A until the images you want are loaded as top-most images (in case they were not the latest images).
- Instagram loads images in 12 image batches
- After the first 12 Instagram will automatically load more if you keep scrolling down but you want to get to where the images you want are at the top
- Once you’ve got the first images you want to extract as the ones at the top, start running under heading Code B and copy-paste the output from the Developer Tools' Console view to a text editor, notepad etc.
- Once you’ve completed the list in the notepad application, remove unnecessary debugging headers (such as
VM123:1
) preferrably using regular expressions and then save the listing as plaintext. - Run
wget -i list.txt
wherelist.txt
is the name of the file you created in step 7.
Code A
const USERNAME = 'username';
location.href = `https://www.instagram.com/${USERNAME}/?max_id=${_sharedData.entry_data.ProfilePage[0].user.media.page_info.end_cursor}`;
Code B
const USERNAME = 'username' // set this
const DELAY = 5 // seconds before moving to next part in pagination
for (let n of _sharedData.entry_data.ProfilePage[0].user.media.nodes) {
if (n.is_video) { // video
let code = n.code
fetch(`https://www.instagram.com/p/${code}/?__a=1`, {credentials: 'same-origin'}).then(function (response) {
return response.json()
}).then(function(data) {
console.log(data.graphql.shortcode_media.video_url)
})
} else if (n.__typename === 'GraphSidecar') { // multiple images in a single post
let code = n.code
fetch(`https://www.instagram.com/p/${code}/?__a=1`, {credentials: 'same-origin'}).then(function (response) {
return response.json()
}).then(function (data) {
for(let edges of data.graphql.shortcode_media.edge_sidecar_to_children.edges) {
console.log(edges.node.display_url)
}
})
} else {
console.log(n.thumbnail_src.replace(/\/s[0-9]{3}x[0-9]{3}\//, '/s1440x1440/'))
}
}
setTimeout(function() {
let end_cursor = _sharedData.entry_data.ProfilePage[0].user.media.page_info.end_cursor
location.href = `https://www.instagram.com/${USERNAME}/?max_id=${end_cursor}`
}, DELAY*1000)
So now you’ve got your images on your computer and you can create collage pictures, videos or whatever you come up with from them.
Known limitations
- Currently if there are multiple videos in a single post (can there be?), then this will not get their URLs