import { get } from 'https';
const startDataString = 'window._sharedData = ';
const getInstagramUrl = (id: string) => `https://www.instagram.com/${id}/`;
const getJsonData = (html:string): Object => {
const startIndex = html.indexOf(startDataString) + startDataString.length
const endIndex = html.indexOf(';</script>', startIndex)
const substring = html.substring(startIndex, endIndex)
const data = JSON.parse(substring)
return getImages(data)
};
const getImages = (data: any): Array<Object> => {
if (data == null || data.entry_data == null ||
data.entry_data.ProfilePage == null || data.entry_data.ProfilePage.length === 0) {
return [];
}
const [profilePage, ..._] = data.entry_data.ProfilePage;
return profilePage.graphql.user.edge_owner_to_timeline_media.edges.map((edge: any) => {
const { node: media } = edge;
let caption = '';
let likes = 0;
if (media.edge_media_to_caption && media.edge_media_to_caption.edges && media.edge_media_to_caption.edges.length > 0) {
caption = media.edge_media_to_caption.edges[0].node.text;
}
if (media.edge_media_preview_like && media.edge_media_preview_like.count) {
likes = media.edge_media_preview_like.count;
}
return {
id: media.id,
thumbnail: media.thumbnail_src,
isVideo: media.is_video,
likes,
mediaUrl: media.display_url,
dimensions: media.dimensions,
takenAt: media.taken_at_timestamp,
owner: media.owner,
caption
};
});
}
export default async user => {
return new Promise((resolve, reject) => {
const userUrl = getInstagramUrl(user);
let html = '';
get(userUrl, res => {
res.on('data', chunk => {
html += chunk;
});
res.on('end', () => {
resolve(getJsonData(html));
});
}).on('error', err => reject(err));
});
};