instagram-private-api
Version:
Instagram private API wrapper for full access to instagram
174 lines • 8.51 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const repository_1 = require("../core/repository");
const Chance = require("chance");
const debug_1 = require("debug");
class UploadRepository extends repository_1.Repository {
constructor() {
super(...arguments);
this.chance = new Chance();
}
async photo(options) {
const uploadId = options.uploadId || Date.now();
const name = `${uploadId}_0_${lodash_1.random(1000000000, 9999999999)}`;
const contentLength = options.file.byteLength;
UploadRepository.uploadDebug(`Uploading ${options.file.byteLength}b as ${uploadId} (photo, jpeg)`);
const { body } = await this.client.request.send({
url: `/rupload_igphoto/${name}`,
method: 'POST',
headers: {
X_FB_PHOTO_WATERFALL_ID: options.waterfallId || this.chance.guid(),
'X-Entity-Type': 'image/jpeg',
Offset: 0,
'X-Instagram-Rupload-Params': JSON.stringify(UploadRepository.createPhotoRuploadParams(options, uploadId)),
'X-Entity-Name': name,
'X-Entity-Length': contentLength,
'Content-Type': 'application/octet-stream',
'Content-Length': contentLength,
'Accept-Encoding': 'gzip',
},
body: options.file,
});
return body;
}
async video(options) {
const video = options.video;
const uploadId = options.uploadId || Date.now();
const name = options.uploadName || `${uploadId}_0_${lodash_1.random(1000000000, 9999999999)}`;
const contentLength = video.byteLength;
const waterfallId = options.waterfallId || this.chance.guid({ version: 4 });
const ruploadParams = UploadRepository.createVideoRuploadParams(options, uploadId);
UploadRepository.uploadDebug(`Uploading ${options.video.byteLength}b as ${uploadId} (video, mp4, not segmented). Info: ${JSON.stringify(ruploadParams)}`);
const { body } = await this.client.request.send({
url: `/rupload_igvideo/${name}`,
method: 'POST',
qs: {},
headers: Object.assign(Object.assign({}, this.getBaseHeaders(ruploadParams)), { X_FB_VIDEO_WATERFALL_ID: waterfallId, 'X-Entity-Type': 'video/mp4', Offset: options.offset || 0, 'X-Entity-Name': name, 'X-Entity-Length': contentLength, 'Content-Type': 'application/octet-stream', 'Content-Length': contentLength, 'Accept-Encoding': 'gzip' }),
body: video,
});
return body;
}
async initVideo({ name, ruploadParams, waterfallId }) {
UploadRepository.uploadDebug(`Initializing video upload: ${JSON.stringify(ruploadParams)}`);
const { body } = await this.client.request.send({
url: `/rupload_igvideo/${name}`,
method: 'GET',
headers: Object.assign(Object.assign({}, this.getBaseHeaders(ruploadParams)), { X_FB_VIDEO_WATERFALL_ID: waterfallId, 'X-Entity-Type': 'video/mp4', 'Accept-Encoding': 'gzip' }),
}, true);
return body;
}
async startSegmentedVideo(ruploadParams) {
UploadRepository.uploadDebug(`Starting segmented video upload: ${JSON.stringify(ruploadParams)}`);
const { body } = await this.client.request.send({
url: `/rupload_igvideo/${this.chance.guid({ version: 4 })}`,
qs: {
segmented: true,
phase: 'start',
},
method: 'POST',
body: '',
headers: Object.assign(Object.assign({}, this.getBaseHeaders(ruploadParams)), { 'Accept-Encoding': 'gzip', 'Content-Length': 0 }),
});
return body;
}
async videoSegmentInit(options) {
UploadRepository.uploadDebug(`Initializing segmented video upload: ${JSON.stringify(options)}`);
const { body } = await this.client.request.send({
url: `/rupload_igvideo/${options.transferId}`,
method: 'GET',
qs: {
segmented: true,
phase: 'transfer',
},
headers: Object.assign(Object.assign({}, this.getBaseHeaders(options.ruploadParams)), { 'Stream-Id': options.streamId, 'Segment-Start-Offset': options.startOffset, X_FB_VIDEO_WATERFALL_ID: options.waterfallId, 'Segment-Type': '2', 'Accept-Encoding': 'gzip' }),
}, true);
return body;
}
async videoSegmentTransfer(options) {
UploadRepository.uploadDebug(`Transfering segmented video: ${options.segment.byteLength}b, stream position: ${options.startOffset}`);
const { body } = await this.client.request.send({
url: `/rupload_igvideo/${options.transferId}`,
qs: {
segmented: true,
phase: 'transfer',
},
method: 'POST',
headers: Object.assign(Object.assign({}, this.getBaseHeaders(options.ruploadParams)), { 'X-Entity-Length': options.segment.byteLength, 'X-Entity-Name': options.transferId, 'Stream-Id': options.streamId, 'X-Entity-Type': 'video/mp4', 'Segment-Start-Offset': options.startOffset, 'Segment-Type': '2', X_FB_VIDEO_WATERFALL_ID: options.waterfallId, Offset: 0, 'Content-Length': options.segment.byteLength }),
body: options.segment,
});
return body;
}
async endSegmentedVideo({ ruploadParams, streamId }) {
UploadRepository.uploadDebug(`Ending segmented video upload of ${streamId}`);
const { body } = await this.client.request.send({
url: `/rupload_igvideo/${this.chance.guid({ version: 4 })}`,
qs: {
segmented: true,
phase: 'end',
},
method: 'POST',
body: '',
headers: Object.assign(Object.assign({}, this.getBaseHeaders(ruploadParams)), { 'Accept-Encoding': 'gzip', 'Content-Length': 0, 'Stream-Id': streamId }),
});
return body;
}
getBaseHeaders(ruploadParams) {
return {
'X-IG-Connection-Type': this.client.state.connectionTypeHeader,
'X-IG-Capabilities': this.client.state.capabilitiesHeader,
'X-IG-App-ID': this.client.state.fbAnalyticsApplicationId,
'Accept-Encoding': 'gzip',
'X-Instagram-Rupload-Params': JSON.stringify(ruploadParams),
};
}
static createPhotoRuploadParams(options, uploadId) {
const ruploadParams = {
retry_context: JSON.stringify({ num_step_auto_retry: 0, num_reupload: 0, num_step_manual_retry: 0 }),
media_type: '1',
upload_id: uploadId.toString(),
xsharing_user_ids: JSON.stringify([]),
image_compression: JSON.stringify({ lib_name: 'moz', lib_version: '3.1.m', quality: '80' }),
};
if (options.isSidecar) {
ruploadParams.is_sidecar = '1';
}
return ruploadParams;
}
static createVideoRuploadParams(options, uploadId, retryContext) {
var _a, _b;
const { duration, width, height } = options;
const ruploadParams = {
retry_context: JSON.stringify(retryContext || { num_step_auto_retry: 0, num_reupload: 0, num_step_manual_retry: 0 }),
media_type: options.mediaType || '2',
xsharing_user_ids: JSON.stringify([]),
upload_id: uploadId.toString(),
upload_media_height: (_a = height) === null || _a === void 0 ? void 0 : _a.toString(),
upload_media_width: (_b = width) === null || _b === void 0 ? void 0 : _b.toString(),
upload_media_duration_ms: duration.toString(),
};
if (options.isSidecar) {
ruploadParams.is_sidecar = '1';
}
if (options.forAlbum) {
ruploadParams.for_album = '1';
}
if (options.isDirect) {
ruploadParams.direct_v2 = '1';
}
if (options.forDirectStory) {
ruploadParams.for_direct_story = '1';
ruploadParams.content_tags = '';
}
if (options.isIgtvVideo) {
ruploadParams.is_igtv_video = '1';
}
if (options.isDirectVoice) {
ruploadParams.is_direct_voice = '1';
}
return ruploadParams;
}
}
exports.UploadRepository = UploadRepository;
UploadRepository.uploadDebug = debug_1.default('ig:upload');
//# sourceMappingURL=upload.repository.js.map
;