n8n-nodes-instagram-integrations
Version:
N8N nodes for Instagram API integration with OAuth2 authentication
1,166 lines (1,165 loc) • 110 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Instagram = void 0;
const n8n_workflow_1 = require("n8n-workflow");
const GenericFunctions_1 = require("./GenericFunctions");
class Instagram {
constructor() {
this.description = {
displayName: 'Instagram',
name: 'instagram',
icon: 'file:instagram-large.svg',
group: ['transform'],
version: 1,
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
description: 'Send messages and interact with Instagram users via Messaging API',
defaults: {
name: 'Instagram',
},
inputs: ['main'],
outputs: ['main'],
credentials: [
{
name: 'instagramOAuth2Api',
required: true,
},
],
properties: [
{
displayName: 'Resource',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Comment',
value: 'comment',
},
{
name: 'Media',
value: 'media',
},
{
name: 'Message',
value: 'message',
},
{
name: 'Post',
value: 'post',
},
{
name: 'Story',
value: 'story',
},
{
name: 'User',
value: 'user',
},
],
default: 'message',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['comment'],
},
},
options: [
{
name: 'Delete',
value: 'deleteComment',
description: 'Delete a comment on your media',
action: 'Delete a comment',
},
{
name: 'Get Comments',
value: 'getComments',
description: 'Get comments on a media post',
action: 'Get comments on a media post',
},
{
name: 'Get Replies',
value: 'getReplies',
description: 'Get replies to a comment',
action: 'Get replies to a comment',
},
{
name: 'Hide/Unhide',
value: 'toggleVisibility',
description: 'Hide or unhide a comment',
action: 'Hide or unhide a comment',
},
{
name: 'Reply',
value: 'replyToComment',
description: 'Reply to a comment publicly',
action: 'Reply to a comment',
},
{
name: 'Send Private Reply',
value: 'sendPrivateReply',
description: 'Send a private DM to a commenter',
action: 'Send a private reply to a commenter',
},
],
default: 'getComments',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['message'],
},
},
options: [
{
name: 'Send Audio',
value: 'sendAudio',
description: 'Send an audio message',
action: 'Send an audio message',
},
{
name: 'Send Button Template',
value: 'sendButtonTemplate',
description: 'Send a message with buttons',
action: 'Send a button template message',
},
{
name: 'Send Generic Template',
value: 'sendGenericTemplate',
description: 'Send a carousel of cards',
action: 'Send a generic template message',
},
{
name: 'Send Image',
value: 'sendImage',
description: 'Send an image message',
action: 'Send an image message',
},
{
name: 'Send Quick Replies',
value: 'sendQuickReplies',
description: 'Send a message with quick reply options',
action: 'Send a message with quick replies',
},
{
name: 'Send Text',
value: 'sendText',
description: 'Send a text message',
action: 'Send a text message',
},
{
name: 'Send Video',
value: 'sendVideo',
description: 'Send a video message',
action: 'Send a video message',
},
{
name: 'Upload Media',
value: 'uploadMedia',
description: 'Upload media to Instagram',
action: 'Upload media',
},
],
default: 'sendText',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['media'],
},
},
options: [
{
name: 'Get Media',
value: 'getMedia',
description: 'Get media object information',
action: 'Get media',
},
{
name: 'Get Media Children',
value: 'getMediaChildren',
description: 'Get children of a carousel album',
action: 'Get media children',
},
{
name: 'List Media',
value: 'listMedia',
description: 'Get list of media objects',
action: 'List media',
},
],
default: 'listMedia',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['post'],
},
},
options: [
{
name: 'Create Single Post',
value: 'createSinglePost',
description: 'Create a single image or video post',
action: 'Create a single post',
},
{
name: 'Create Carousel Post',
value: 'createCarouselPost',
description: 'Create a carousel post with multiple images/videos',
action: 'Create a carousel post',
},
{
name: 'Create Reel',
value: 'createReel',
description: 'Create a reel (short video)',
action: 'Create a reel',
},
{
name: 'Publish Post',
value: 'publishPost',
description: 'Publish a media container',
action: 'Publish a post',
},
],
default: 'createSinglePost',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['story'],
},
},
options: [
{
name: 'Create Story',
value: 'createStory',
description: 'Create a story (image or video)',
action: 'Create a story',
},
],
default: 'createStory',
},
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['user'],
},
},
options: [
{
name: 'Get My Profile',
value: 'getMyProfile',
description: 'Get authenticated account profile information',
action: 'Get my profile',
},
{
name: 'Get Profile',
value: 'getProfile',
description: 'Get user profile information by ID',
action: 'Get user profile',
},
],
default: 'getMyProfile',
},
{
displayName: 'Media ID',
name: 'commentMediaId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['getComments'],
},
},
default: '',
placeholder: '17895695668004550',
description: 'ID of the media post to get comments from',
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['comment'],
operation: ['getComments'],
},
},
default: false,
description: 'Whether to return all comments or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['comment'],
operation: ['getComments'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
},
default: 50,
description: 'Max number of comments to return',
},
{
displayName: 'Comment ID',
name: 'commentId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['getReplies'],
},
},
default: '',
placeholder: '17870913679156914',
description: 'ID of the comment to get replies from',
},
{
displayName: 'Comment ID',
name: 'commentId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['replyToComment'],
},
},
default: '',
placeholder: '17870913679156914',
description: 'ID of the comment to reply to',
},
{
displayName: 'Reply Message',
name: 'replyMessage',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['replyToComment'],
},
},
default: '',
placeholder: 'Thanks for your comment!',
description: 'The message to post as a reply to the comment',
},
{
displayName: 'Comment ID',
name: 'commentId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['sendPrivateReply'],
},
},
default: '',
placeholder: '17870913679156914',
description: 'ID of the comment to reply to privately. The commenter will receive a DM.',
},
{
displayName: 'Private Message',
name: 'privateMessage',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['sendPrivateReply'],
},
},
default: '',
placeholder: 'Thanks for commenting! Here is more info...',
description: 'The private message to send to the commenter via DM. Must be sent within 7 days of the comment.',
},
{
displayName: 'Comment ID',
name: 'commentId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['deleteComment'],
},
},
default: '',
placeholder: '17870913679156914',
description: 'ID of the comment to delete',
},
{
displayName: 'Comment ID',
name: 'commentId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['toggleVisibility'],
},
},
default: '',
placeholder: '17870913679156914',
description: 'ID of the comment to hide or unhide',
},
{
displayName: 'Action',
name: 'hideAction',
type: 'options',
required: true,
displayOptions: {
show: {
resource: ['comment'],
operation: ['toggleVisibility'],
},
},
options: [
{
name: 'Hide',
value: 'hide',
description: 'Hide the comment from public view',
},
{
name: 'Unhide',
value: 'unhide',
description: 'Make the comment visible again',
},
],
default: 'hide',
description: 'Whether to hide or unhide the comment',
},
{
displayName: 'Recipient ID',
name: 'recipientId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendText'],
},
},
default: '',
placeholder: '1234567890',
description: 'Instagram-scoped user ID (IGSID) of the recipient',
},
{
displayName: 'Message',
name: 'messageText',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendText'],
},
},
default: '',
placeholder: 'Hello from N8N!',
description: 'Text message to send (max 1000 characters)',
},
{
displayName: 'Recipient ID',
name: 'recipientId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendImage'],
},
},
default: '',
placeholder: '1234567890',
description: 'Instagram-scoped user ID (IGSID) of the recipient',
},
{
displayName: 'Image URL',
name: 'imageUrl',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendImage'],
},
},
default: '',
placeholder: 'https://example.com/photo.jpg',
description: 'Public HTTPS URL of the image (JPG, PNG)',
},
{
displayName: 'Is Reusable',
name: 'isReusable',
type: 'boolean',
displayOptions: {
show: {
resource: ['message'],
operation: ['sendImage'],
},
},
default: false,
description: 'Whether to make the attachment reusable for multiple recipients',
},
{
displayName: 'Recipient ID',
name: 'recipientId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendAudio'],
},
},
default: '',
placeholder: '1234567890',
description: 'Instagram-scoped user ID (IGSID) of the recipient',
},
{
displayName: 'Audio URL',
name: 'audioUrl',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendAudio'],
},
},
default: '',
placeholder: 'https://example.com/voice.mp3',
description: 'Public HTTPS URL of the audio file',
},
{
displayName: 'Is Reusable',
name: 'isReusable',
type: 'boolean',
displayOptions: {
show: {
resource: ['message'],
operation: ['sendAudio'],
},
},
default: false,
description: 'Whether to make the attachment reusable for multiple recipients',
},
{
displayName: 'Recipient ID',
name: 'recipientId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendVideo'],
},
},
default: '',
placeholder: '1234567890',
description: 'Instagram-scoped user ID (IGSID) of the recipient',
},
{
displayName: 'Video URL',
name: 'videoUrl',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendVideo'],
},
},
default: '',
placeholder: 'https://example.com/video.mp4',
description: 'Public HTTPS URL of the video file',
},
{
displayName: 'Is Reusable',
name: 'isReusable',
type: 'boolean',
displayOptions: {
show: {
resource: ['message'],
operation: ['sendVideo'],
},
},
default: false,
description: 'Whether to make the attachment reusable for multiple recipients',
},
{
displayName: 'Recipient ID',
name: 'recipientId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendButtonTemplate'],
},
},
default: '',
placeholder: '1234567890',
description: 'Instagram-scoped user ID (IGSID) of the recipient',
},
{
displayName: 'Message Text',
name: 'messageText',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendButtonTemplate'],
},
},
default: '',
placeholder: 'Choose an option:',
description: 'Text to display above buttons (max 640 characters)',
},
{
displayName: 'Buttons',
name: 'buttons',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
maxValues: 3,
},
displayOptions: {
show: {
resource: ['message'],
operation: ['sendButtonTemplate'],
},
},
default: {},
placeholder: 'Add Button',
options: [
{
name: 'button',
displayName: 'Button',
values: [
{
displayName: 'Type',
name: 'type',
type: 'options',
options: [
{
name: 'Web URL',
value: 'web_url',
},
{
name: 'Postback',
value: 'postback',
},
],
default: 'web_url',
description: 'Type of button',
},
{
displayName: 'Title',
name: 'title',
type: 'string',
default: '',
placeholder: 'Click Me',
description: 'Button title (max 20 characters)',
},
{
displayName: 'URL',
name: 'url',
type: 'string',
displayOptions: {
show: {
type: ['web_url'],
},
},
default: '',
placeholder: 'https://example.com',
description: 'Button URL (must be HTTPS)',
},
{
displayName: 'Payload',
name: 'payload',
type: 'string',
displayOptions: {
show: {
type: ['postback'],
},
},
default: '',
placeholder: 'BUTTON_CLICKED',
description: 'Postback payload (max 1000 characters)',
},
],
},
],
},
{
displayName: 'Recipient ID',
name: 'recipientId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendGenericTemplate'],
},
},
default: '',
placeholder: '1234567890',
description: 'Instagram-scoped user ID (IGSID) of the recipient',
},
{
displayName: 'Elements',
name: 'elements',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
maxValues: 10,
},
displayOptions: {
show: {
resource: ['message'],
operation: ['sendGenericTemplate'],
},
},
default: {},
placeholder: 'Add Element',
options: [
{
name: 'element',
displayName: 'Element',
values: [
{
displayName: 'Buttons',
name: 'buttons',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
maxValues: 3,
},
default: {},
placeholder: 'Add Button',
options: [
{
name: 'button',
displayName: 'Button',
values: [
{
displayName: 'Type',
name: 'type',
type: 'options',
options: [
{
name: 'Web URL',
value: 'web_url',
},
{
name: 'Postback',
value: 'postback',
},
],
default: 'web_url',
description: 'Type of button',
},
{
displayName: 'Title',
name: 'title',
type: 'string',
default: '',
placeholder: 'Click Me',
description: 'Button title (max 20 characters)',
},
{
displayName: 'URL',
name: 'url',
type: 'string',
default: '',
placeholder: 'https://example.com',
description: 'Button URL (must be HTTPS)',
},
{
displayName: 'Payload',
name: 'payload',
type: 'string',
default: '',
placeholder: 'BUTTON_CLICKED',
description: 'Postback payload (max 1000 characters)',
},
]
},
]
},
{
displayName: 'Default Action',
name: 'default_action',
type: 'fixedCollection',
default: {},
options: [
{
name: 'action',
displayName: 'Action',
values: [
{
displayName: 'URL',
name: 'url',
type: 'string',
default: '',
placeholder: 'https://example.com',
description: 'URL to open when card is tapped (must be HTTPS)',
},
]
},
]
},
{
displayName: 'Image URL',
name: 'image_url',
type: 'string',
default: '',
placeholder: 'https://example.com/image.jpg',
description: 'Image URL for the card',
},
{
displayName: 'Subtitle',
name: 'subtitle',
type: 'string',
default: '',
placeholder: 'Card subtitle',
description: 'Element subtitle (max 80 characters)',
},
{
displayName: 'Title',
name: 'title',
type: 'string',
default: '',
placeholder: 'Card Title',
description: 'Element title (max 80 characters)',
},
],
},
],
},
{
displayName: 'Recipient ID',
name: 'recipientId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendQuickReplies'],
},
},
default: '',
placeholder: '1234567890',
description: 'Instagram-scoped user ID (IGSID) of the recipient',
},
{
displayName: 'Message Text',
name: 'messageText',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['sendQuickReplies'],
},
},
default: '',
placeholder: 'Choose an option:',
description: 'Text message to display with quick replies',
},
{
displayName: 'Quick Replies',
name: 'quickReplies',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
maxValues: 13,
},
displayOptions: {
show: {
resource: ['message'],
operation: ['sendQuickReplies'],
},
},
default: {},
placeholder: 'Add Quick Reply',
options: [
{
name: 'quickReply',
displayName: 'Quick Reply',
values: [
{
displayName: 'Title',
name: 'title',
type: 'string',
default: '',
placeholder: 'Option 1',
description: 'Quick reply title (max 20 characters)',
},
{
displayName: 'Payload',
name: 'payload',
type: 'string',
default: '',
placeholder: 'OPTION_1',
description: 'Payload sent back when clicked (max 1000 characters)',
},
],
},
],
},
{
displayName: 'Media Type',
name: 'mediaType',
type: 'options',
displayOptions: {
show: {
resource: ['message'],
operation: ['uploadMedia'],
},
},
options: [
{
name: 'Image',
value: 'IMAGE',
},
{
name: 'Video',
value: 'VIDEO',
},
{
name: 'Reels',
value: 'REELS',
},
{
name: 'Stories',
value: 'STORIES',
},
],
default: 'IMAGE',
description: 'Type of media to upload',
},
{
displayName: 'Media URL',
name: 'mediaUrl',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['uploadMedia'],
},
},
default: '',
placeholder: 'https://example.com/image.jpg',
description: 'Public URL of the media file',
},
{
displayName: 'Caption',
name: 'caption',
type: 'string',
displayOptions: {
show: {
resource: ['message'],
operation: ['uploadMedia'],
},
},
default: '',
placeholder: 'Check out this photo!',
description: 'Caption for the media',
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['media'],
operation: ['listMedia'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['media'],
operation: ['listMedia'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
},
default: 50,
description: 'Max number of results to return',
},
{
displayName: 'Fields',
name: 'mediaFields',
type: 'multiOptions',
displayOptions: {
show: {
resource: ['media'],
operation: ['listMedia'],
},
},
options: [
{ name: 'Caption', value: 'caption' },
{ name: 'Comments Count', value: 'comments_count' },
{ name: 'ID', value: 'id' },
{ name: 'Is Comment Enabled', value: 'is_comment_enabled' },
{ name: 'Like Count', value: 'like_count' },
{ name: 'Media Type', value: 'media_type' },
{ name: 'Media URL', value: 'media_url' },
{ name: 'Owner', value: 'owner' },
{ name: 'Permalink', value: 'permalink' },
{ name: 'Thumbnail URL', value: 'thumbnail_url' },
{ name: 'Timestamp', value: 'timestamp' },
{ name: 'Username', value: 'username' },
],
default: ['id', 'media_type', 'media_url', 'permalink', 'timestamp'],
description: 'Fields to retrieve for each media item',
},
{
displayName: 'Media ID',
name: 'mediaId',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['media'],
operation: ['getMedia', 'getMediaChildren'],
},
},
default: '',
placeholder: '17895695668004550',
description: 'ID of the media object',
},
{
displayName: 'Fields',
name: 'mediaDetailFields',
type: 'multiOptions',
displayOptions: {
show: {
resource: ['media'],
operation: ['getMedia'],
},
},
options: [
{ name: 'Caption', value: 'caption' },
{ name: 'Children', value: 'children' },
{ name: 'Comments Count', value: 'comments_count' },
{ name: 'ID', value: 'id' },
{ name: 'Is Comment Enabled', value: 'is_comment_enabled' },
{ name: 'Like Count', value: 'like_count' },
{ name: 'Media Product Type', value: 'media_product_type' },
{ name: 'Media Type', value: 'media_type' },
{ name: 'Media URL', value: 'media_url' },
{ name: 'Owner', value: 'owner' },
{ name: 'Permalink', value: 'permalink' },
{ name: 'Shortcode', value: 'shortcode' },
{ name: 'Thumbnail URL', value: 'thumbnail_url' },
{ name: 'Timestamp', value: 'timestamp' },
{ name: 'Username', value: 'username' },
],
default: ['id', 'media_type', 'media_url', 'permalink', 'caption'],
description: 'Fields to retrieve for the media object',
},
{
displayName: 'Media Type',
name: 'postMediaType',
type: 'options',
required: true,
displayOptions: {
show: {
resource: ['post'],
operation: ['createSinglePost'],
},
},
options: [{ name: 'Image', value: 'IMAGE' },
{ name: 'Video', value: 'VIDEO' },
],
default: 'IMAGE',
description: 'Type of media for the post',
},
{
displayName: 'Image URL',
name: 'postImageUrl',
type: 'string',
required: true,
displayOptions: {
show: {