instagram-private-api
Version:
Instagram private API wrapper for full access to instagram
605 lines • 24.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const luxon_1 = require("luxon");
const repository_1 = require("../core/repository");
const Chance = require("chance");
class MediaRepository extends repository_1.Repository {
async info(mediaId) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/info/`,
method: 'GET',
form: this.client.request.sign({
igtv_feed_preview: false,
media_id: mediaId,
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
}),
});
return body;
}
async editMedia({ mediaId, captionText, }) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/edit_media/`,
method: 'POST',
form: this.client.request.sign({
igtv_feed_preview: false,
media_id: mediaId,
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
caption_text: captionText,
}),
});
return body;
}
async delete({ mediaId, mediaType = 'PHOTO', }) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/delete/`,
method: 'POST',
qs: {
media_type: mediaType,
},
form: this.client.request.sign({
igtv_feed_preview: false,
media_id: mediaId,
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
}),
});
return body;
}
async likeAction(options) {
const signedFormData = this.client.request.sign(Object.assign(Object.assign({ module_name: options.moduleInfo.module_name, media_id: options.mediaId, _csrftoken: this.client.state.cookieCsrfToken }, lodash_1.omit(options.moduleInfo, 'module_name')), { radio_type: this.client.state.radioType, _uid: this.client.state.cookieUserId, device_id: this.client.state.deviceId, _uuid: this.client.state.uuid }));
const { body } = await this.client.request.send({
url: `/api/v1/media/${options.mediaId}/${options.action}/`,
method: 'POST',
form: Object.assign(Object.assign({}, signedFormData), { d: options.d }),
});
return body;
}
async like(options) {
return this.likeAction(Object.assign({ action: 'like' }, options));
}
async unlike(options) {
return this.likeAction(Object.assign({ action: 'unlike' }, options));
}
async likeComment(commentId) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${commentId}/comment_like/`,
method: 'POST',
});
return body;
}
async unlikeComment(commentId) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${commentId}/comment_unlike/`,
method: 'POST',
});
return body;
}
async checkOffensiveComment(commentText, mediaId) {
const { body } = await this.client.request.send({
url: '/api/v1/media/comment/check_offensive_comment/',
method: 'POST',
form: this.client.request.sign({
media_id: mediaId,
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
comment_text: commentText,
}),
});
return body;
}
async commentsBulkDelete(mediaId, commentIds) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/comment/bulk_delete/`,
method: 'POST',
form: this.client.request.sign({
comment_ids_to_delete: commentIds.join(','),
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
}),
});
return body;
}
async comment({ mediaId, text, replyToCommentId, module = 'self_comments_v2', }) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/comment/`,
method: 'POST',
form: this.client.request.sign({
user_breadcrumb: this.client.request.userBreadcrumb(text.length),
idempotence_token: new Chance().guid(),
_csrftoken: this.client.state.cookieCsrfToken,
radio_type: this.client.state.radioType,
_uid: this.client.state.cookieUserId,
device_id: this.client.state.deviceId,
_uuid: this.client.state.uuid,
comment_text: text,
containermodule: module,
replied_to_comment_id: replyToCommentId,
}),
});
return body.comment;
}
async commentsDisable(mediaId) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/disable_comments/`,
method: 'POST',
form: this.client.request.sign({
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
}),
});
return body;
}
async commentsEnable(mediaId) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/enable_comments/`,
method: 'POST',
form: this.client.request.sign({
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
}),
});
return body;
}
async likers(id) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${id}/likers/`,
});
return body;
}
async blocked() {
const { body } = await this.client.request.send({
url: `/api/v1/media/blocked/`,
});
return body.media_ids;
}
async uploadFinish(options) {
if (options.video) {
options.video = lodash_1.defaultsDeep(options.video, {
clips: [{ length: options.video.length, source_type: options.source_type }],
poster_frame_index: 0,
audio_muted: false,
});
}
const { body } = await this.client.request.send({
url: '/api/v1/media/upload_finish/',
method: 'POST',
headers: {
retry_context: JSON.stringify({ num_step_auto_retry: 0, num_reupload: 0, num_step_manual_retry: 0 }),
},
form: this.client.request.sign(Object.assign({ timezone_offset: this.client.state.timezoneOffset, _csrftoken: this.client.state.cookieCsrfToken, source_type: options.source_type, _uid: this.client.state.cookieUserId, device_id: this.client.state.deviceId, _uuid: this.client.state.uuid, upload_id: options.upload_id, device: this.client.state.devicePayload }, options.video)),
qs: options.video ? { video: '1' } : {},
});
return body;
}
applyConfigureDefaults(options, defaults) {
const width = options.width || 1520;
const height = options.height || 2048;
const devicePayload = this.client.state.devicePayload;
return lodash_1.defaultsDeep(options, Object.assign({ _csrftoken: this.client.state.cookieCsrfToken, _uid: this.client.state.cookieUserId, _uuid: this.client.state.uuid, device: devicePayload, extra: { source_width: width, source_height: height } }, defaults));
}
async configure(options) {
const devicePayload = this.client.state.devicePayload;
const now = luxon_1.DateTime.local().toFormat('yyyy:mm:dd HH:mm:ss');
const width = options.width || 1520;
const height = options.height || 2048;
const form = this.applyConfigureDefaults(options, {
width,
height,
upload_id: Date.now().toString(),
timezone_offset: this.client.state.timezoneOffset,
date_time_original: now,
date_time_digitalized: now,
caption: '',
source_type: '4',
media_folder: 'Camera',
edits: {
crop_original_size: [width, height],
crop_center: [0.0, -0.0],
crop_zoom: 1.0,
},
camera_model: devicePayload.model,
scene_capture_type: 'standard',
device_id: this.client.state.deviceId,
creation_logger_session_id: this.client.state.clientSessionId,
software: '1',
camera_make: devicePayload.manufacturer,
});
if (typeof form.usertags !== 'undefined') {
form.usertags = JSON.stringify(form.usertags);
}
if (typeof form.location !== 'undefined') {
form.location = JSON.stringify(form.location);
}
const { body } = await this.client.request.send({
url: '/api/v1/media/configure/',
method: 'POST',
form: this.client.request.sign(form),
});
return body;
}
async configureVideo(options) {
const now = luxon_1.DateTime.local().toFormat('yyyy:mm:dd HH:mm:ss');
const form = this.applyConfigureDefaults(options, {
width: options.width,
height: options.height,
upload_id: Date.now().toString(),
timezone_offset: this.client.state.timezoneOffset,
date_time_original: now,
caption: '',
source_type: '4',
device_id: this.client.state.deviceId,
filter_type: '0',
audio_muted: false,
poster_frame_index: 0,
});
if (typeof form.usertags !== 'undefined') {
form.usertags = JSON.stringify(form.usertags);
}
if (typeof form.location !== 'undefined') {
form.location = JSON.stringify(form.location);
}
const { body } = await this.client.request.send({
url: '/api/v1/media/configure/',
method: 'POST',
qs: {
video: '1',
},
form: this.client.request.sign(form),
});
return body;
}
static stringifyStoryStickers(form) {
const serialize = (obj) => {
if (typeof obj !== 'undefined' && Array.isArray(obj) && obj.length > 0 && typeof obj[0] !== 'string') {
return JSON.stringify(obj);
}
return obj;
};
form.story_hashtags = serialize(form.story_hashtags);
form.story_locations = serialize(form.story_locations);
form.reel_mentions = serialize(form.reel_mentions);
form.story_polls = serialize(form.story_polls);
form.story_sliders = serialize(form.story_sliders);
form.story_questions = serialize(form.story_questions);
form.story_countdowns = serialize(form.story_countdowns);
form.attached_media = serialize(form.attached_media);
form.story_cta = serialize(form.story_cta);
form.story_chats = serialize(form.story_chats);
form.story_quizs = serialize(form.story_quizs);
}
async configureToStory(options) {
const now = Date.now();
const width = options.width || 1520;
const height = options.height || 2048;
const form = this.applyConfigureDefaults(options, {
width,
height,
source_type: '3',
configure_mode: '1',
client_shared_at: now.toString(),
edits: {
crop_original_size: [width, height],
crop_center: [0.0, -0.0],
crop_zoom: 1.0,
},
});
form.source_type = '3';
if (form.configure_mode === '1') {
MediaRepository.stringifyStoryStickers(form);
}
else if (form.configure_mode === '2') {
if (typeof form.recipient_users !== 'string') {
form.recipient_users = JSON.stringify(form.recipient_users ? [form.recipient_users.map(x => Number(x))] : []);
}
form.thread_ids = JSON.stringify(form.thread_ids || []);
}
const { body } = await this.client.request.send({
url: '/api/v1/media/configure_to_story/',
method: 'POST',
form: this.client.request.sign(form),
});
return body;
}
async configureToStoryVideo(options) {
const now = Date.now();
const devicePayload = this.client.state.devicePayload;
const form = lodash_1.defaultsDeep(options, {
supported_capabilities_new: JSON.stringify(this.client.state.supportedCapabilities),
timezone_offset: '0',
_csrftoken: this.client.state.cookieCsrfToken,
client_shared_at: now.toString(),
configure_mode: '1',
source_type: '3',
video_result: '',
_uid: this.client.state.cookieUserId,
date_time_original: new Date().toISOString().replace(/[-:]/g, ''),
device_id: this.client.state.deviceId,
_uuid: this.client.state.uuid,
device: devicePayload,
clips: [
{
length: options.length,
source_type: '3',
},
],
extra: {
source_width: options.width,
source_height: options.height,
},
audio_muted: false,
poster_frame_index: 0,
});
form.source_type = '3';
if (form.configure_mode === '1') {
MediaRepository.stringifyStoryStickers(form);
}
else if (form.configure_mode === '2') {
if (typeof form.recipient_users !== 'string') {
form.recipient_users = JSON.stringify(form.recipient_users ? [form.recipient_users.map(x => Number(x))] : []);
}
form.thread_ids = JSON.stringify(form.thread_ids || []);
}
const { body } = await this.client.request.send({
url: '/api/v1/media/configure_to_story/',
method: 'POST',
qs: {
video: '1',
},
form: this.client.request.sign(form),
});
return body;
}
async configureSidecar(options) {
const isVideo = (arg) => arg.length !== undefined;
const devicePayload = this.client.state.devicePayload;
const sidecarId = options.upload_id || Date.now().toString();
const now = luxon_1.DateTime.local().toFormat('yyyy:mm:dd HH:mm:ss');
options = lodash_1.defaultsDeep(options, {
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
timezone_offset: '0',
source_type: '4',
device_id: this.client.state.deviceId,
caption: '',
client_sidecar_id: sidecarId,
upload_id: sidecarId,
device: devicePayload,
});
options.children_metadata = options.children_metadata.map(item => {
const { width, height } = item;
item = lodash_1.defaultsDeep(item, {
timezone_offset: '0',
caption: null,
source_type: '4',
extra: { source_width: width, source_height: height },
edits: { crop_original_size: [width, height], crop_center: [0.0, -0.0], crop_zoom: 1.0 },
device: devicePayload,
});
if (typeof item.extra !== 'string') {
item.extra = JSON.stringify(item.extra);
}
if (typeof item.edits !== 'string') {
item.edits = JSON.stringify(item.edits);
}
if (typeof item.device !== 'string') {
item.device = JSON.stringify(item.device);
}
if (item.usertags && typeof item.usertags !== 'string') {
item.usertags = JSON.stringify(item.usertags);
}
if (isVideo(item)) {
item = lodash_1.defaultsDeep(item, {
filter_type: '0',
video_result: '',
date_time_original: now,
audio_muted: 'false',
clips: [{ length: item.length, source_type: '4' }],
poster_frame_index: '0',
});
const clips = item;
if (typeof clips !== 'string') {
item.clips = JSON.stringify(clips);
}
}
return item;
});
if (typeof options.location !== 'string') {
options.location = JSON.stringify(options.location);
}
const { body } = await this.client.request.send({
url: '/api/v1/media/configure_sidecar/',
method: 'POST',
form: this.client.request.sign(options),
});
return body;
}
async configureToIgtv(options) {
const form = lodash_1.defaultsDeep(options, {
caption: '',
date_time_original: new Date().toISOString().replace(/[-:]/g, ''),
igtv_share_preview_to_feed: '0',
clips: [
{
length: options.length,
source_type: options.source_type || '4',
},
],
audio_muted: false,
poster_frame_index: 0,
filter_type: '0',
timezone_offset: this.client.state.timezoneOffset,
media_folder: options.source_type !== '4' ? 'Camera' : undefined,
source_type: '4',
device: this.client.state.devicePayload,
retryContext: { num_step_auto_retry: 0, num_reupload: 0, num_step_manual_retry: 0 },
});
const retryContext = options.retryContext;
delete form.retryContext;
const { body } = await this.client.request.send({
url: '/api/v1/media/configure_to_igtv/',
method: 'POST',
qs: {
video: '1',
},
headers: {
is_igtv_video: '1',
retry_context: JSON.stringify(retryContext),
},
form: this.client.request.sign(Object.assign(Object.assign({}, form), { _csrftoken: this.client.state.cookieCsrfToken, _uid: this.client.state.cookieUserId, _uuid: this.client.state.uuid })),
});
return body;
}
async onlyMe(mediaId) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/only_me/`,
method: 'POST',
form: this.client.request.sign({
media_id: mediaId,
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
}),
});
return body;
}
async undoOnlyMe(mediaId) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/undo_only_me/`,
method: 'POST',
form: this.client.request.sign({
media_id: mediaId,
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
}),
});
return body;
}
async seen(reels, module = 'feed_timeline') {
const { body } = await this.client.request.send({
url: `/api/v2/media/seen/`,
method: 'POST',
qs: {
reel: 1,
live_vod: 0,
},
form: this.client.request.sign({
reels,
container_module: module,
reel_media_skipped: [],
live_vods: [],
live_vods_skipped: [],
nuxes: [],
nuxes_skipped: [],
_uuid: this.client.state.uuid,
_uid: this.client.state.cookieUserId,
_csrftoken: this.client.state.cookieCsrfToken,
device_id: this.client.state.deviceId,
}),
});
return body;
}
async save(mediaId, collection_ids) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/save/`,
method: 'POST',
form: this.client.request.sign({
added_collection_ids: collection_ids ? JSON.stringify(collection_ids) : undefined,
_uuid: this.client.state.uuid,
_uid: this.client.state.cookieUserId,
_csrftoken: this.client.state.cookieCsrfToken,
device_id: this.client.state.deviceId,
}),
});
return body;
}
async unsave(mediaId) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/unsave/`,
method: 'POST',
});
return body;
}
async storyPollVote(mediaId, pollId, vote) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/${pollId}/story_poll_vote/`,
method: 'POST',
form: this.client.request.sign({
_csrftoken: this.client.state.cookieCsrfToken,
radio_type: this.client.state.radioType,
_uid: this.client.state.cookieUserId,
vote,
_uuid: this.client.state.uuid,
}),
});
return body;
}
async storyQuestionResponse(mediaId, questionId, options) {
const chance = new Chance();
if (typeof options.response === 'undefined') {
options = lodash_1.defaultsDeep(options, { music_browse_session_id: chance.guid({ version: 4 }) });
}
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/${questionId}/story_question_response/`,
method: 'POST',
form: this.client.request.sign(Object.assign({ client_context: chance.guid({ version: 4 }), mutation_token: chance.guid({ version: 4 }), _csrftoken: this.client.state.cookieCsrfToken, _uid: this.client.state.cookieUserId, _uuid: this.client.state.uuid }, options)),
});
return body;
}
async storySliderVote(mediaId, sliderId, vote) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/${sliderId}/story_slider_vote/`,
method: 'POST',
form: this.client.request.sign({
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid,
vote: vote.toFixed(8),
}),
});
return body;
}
async storyQuizAnswer(mediaId, quizId, answer) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${mediaId}/${quizId}/story_quiz_answer/`,
method: 'POST',
form: this.client.request.sign({
_csrftoken: this.client.state.cookieCsrfToken,
_uuid: this.client.state.uuid,
answer,
}),
});
return body;
}
async storyCountdownAction(countdownId, action) {
const { body } = await this.client.request.send({
url: `/api/v1/media/${countdownId}/${action}/`,
method: 'POST',
form: this.client.request.sign({
_csrftoken: this.client.state.cookieCsrfToken,
_uid: this.client.state.cookieUserId,
_uuid: this.client.state.uuid
}),
});
return body;
}
async storyCountdownFollow(countdownId) {
return this.storyCountdownAction(countdownId, 'follow_story_countdown');
}
async storyCountdownUnfollow(countdownId) {
return this.storyCountdownAction(countdownId, 'unfollow_story_countdown');
}
}
exports.MediaRepository = MediaRepository;
//# sourceMappingURL=media.repository.js.map