Skip to content

Instantly share code, notes, and snippets.

@kde713
Created December 4, 2017 19:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kde713/94ccc95cfd2622232bb6f4ad080a11a2 to your computer and use it in GitHub Desktop.
Save kde713/94ccc95cfd2622232bb6f4ad080a11a2 to your computer and use it in GitHub Desktop.
Instagram Unofficial API for Web
var DEFAULT_INSTAAPI_RESPONSE_DICT = {
"notexist": "Could not find requested member or post",
"unknown": "Unknown error occured"
};
var INSTAAPI_VER = "0.1.0";
var InstaApi = function (initCallBack, responseDict) {
if (!responseDict) responseDict = DEFAULT_INSTAAPI_RESPONSE_DICT;
this.responseDict = responseDict;
this.version_ = INSTAAPI_VER;
this.request_ = function (requestJson, callBack) {
var ajaxConfigure = {
method: requestJson.method,
url: "https://www.instagram.com/" + requestJson.endPoint,
complete: function (result) {
callBack(result.status, result.responseText);
}
};
if (requestJson.method === "POST") {
if (requestJson.isJson) {
ajaxConfigure['contentType'] = "application/json; charset=UTF-8";
ajaxConfigure['dataType'] = "json";
ajaxConfigure['data'] = requestJson.params;
} else {
var seperateFlag = false;
var encodedParams = "";
$.each(requestJson.params, function (key, value) {
if (seperateFlag) {
encodedParams += "&" + key + "=" + encodeURIComponent(value);
} else {
encodedParams = key + "=" + encodeURIComponent(value);
seperateFlag = true;
}
});
ajaxConfigure['data'] = encodedParams;
}
} else if (requestJson.method == "GET") {
if (requestJson.params) {
var seperateFlag = false;
var encodedParams = "";
$.each(requestJson.params, function (key, value) {
if (seperateFlag) {
encodedParams += "&" + key + "=" + encodeURIComponent(value);
} else {
encodedParams = "?" + key + "=" + encodeURIComponent(value);
seperateFlag = true;
}
});
ajaxConfigure['url'] += encodedParams;
}
} else {
// Invalid Method
callBack(false, null);
return;
}
$.ajax(ajaxConfigure);
};
this.getUser = function (username, callBack) {
var clonedResponseDict = this.responseDict;
this.request_({
method: "GET",
endPoint: username,
params: {'__a': '1'}
}, function (result, data) {
if (result === 200) {
try {
data = JSON.parse(data)["user"];
var userInfo = {
id: data['id'],
username: data['username'],
dispname: data['full_name'],
follower: data['followed_by']['count'],
following: data['follows']['count'],
articles_count: data['media']['count'],
profile_img: data['profile_pic_url'],
is_private: data['is_private']
};
if (Object.keys(data).indexOf('profile_pic_url_hd') !== -1) userInfo["profile_img"] = data['profile_pic_url_hd'];
callBack(true, userInfo);
} catch (e) {
callBack(false, {err: clonedResponseDict["unknown"]});
}
} else {
var errorMessage = clonedResponseDict["unknown"];
if (result === 404) errorMessage = clonedResponseDict["notexist"];
callBack(false, {err: errorMessage})
}
});
};
this.getArticleDetail = function (shortCode, callBack) {
var clonedResponseDict = this.responseDict;
this.request_({
method: "GET",
endPoint: "p/" + shortCode,
params: {'__a': '1'}
}, function (result, data) {
if (result === 200) {
try {
data = JSON.parse(data)['graphql']['shortcode_media'];
var articleInfo = {
'img': data['display_url'],
'like': Number(data['edge_media_preview_like']['count'])
};
callBack(true, articleInfo);
} catch (e) {
callBack(false, {err: clonedResponseDict["unknown"]});
}
} else {
var errorMessage = clonedResponseDict["unknown"];
if (result === 404) errorMessage = clonedResponseDict["notexist"];
callBack(false, {err: errorMessage})
}
});
};
this.getUserFeed = function (userId, articleCount, cursor, callBack) {
var clonedResponseDict = this.responseDict;
var query = {
id: userId,
first: articleCount
};
if (cursor) query['after'] = cursor;
this.request_({
method: "GET",
endPoint: "graphql/query/",
params: {query_id: "17888483320059182", variables: JSON.stringify(query)}
}, function (result, data) {
if (result === 200) {
try {
data = JSON.parse(data)['data']['user']['edge_owner_to_timeline_media'];
var articleList = [];
$.each(data['edges'], function (idx, node) {
var nodeData = node['node'];
articleList.push({
is_video: nodeData['is_video'],
url: nodeData['shortcode'],
img: nodeData['thumbnail_src'],
likes: nodeData['edge_media_preview_like']['count'],
id: nodeData['id']
});
});
callBack(true, {
cursor: data['page_info']['end_cursor'],
more: data['page_info']['has_next_page'],
articles: articleList
});
} catch (e) {
callBack(false, {err: clonedResponseDict["unknown"]});
}
} else {
var errorMessage = clonedResponseDict["unknown"];
if (result === 404) errorMessage = clonedResponseDict["notexist"];
callBack(false, {err: errorMessage})
}
});
};
this.request_({
method: "GET",
endPoint: ""
}, function (result, data) {
initCallBack(result === 200);
})
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment