Files
2026-07-13 13:34:48 +08:00

246 lines
7.3 KiB
TypeScript

import { posthogHelper } from '@botpress/common'
import { z, IntegrationDefinition, messages } from '@botpress/sdk'
import proactiveConversation from 'bp_modules/proactive-conversation'
import proactiveUser from 'bp_modules/proactive-user'
import { dmChannelMessages } from './definitions/channel'
export const INTEGRATION_NAME = 'instagram'
export const INTEGRATION_VERSION = '4.1.11'
const commonConfigSchema = z.object({
replyToComments: z
.boolean()
.default(false)
.title('Reply to Comments')
.describe('If enabled, the bot will reply to comments on posts.'),
})
export default new IntegrationDefinition({
name: INTEGRATION_NAME,
version: INTEGRATION_VERSION,
title: 'Instagram',
description: 'Automate interactions, manage comments, and send/receive messages all in real-time.',
icon: 'icon.svg',
readme: 'hub.md',
configuration: {
identifier: {
linkTemplateScript: 'linkTemplate.vrl',
},
schema: commonConfigSchema,
},
configurations: {
manual: {
title: 'Manual Configuration',
description: 'Configure by manually supplying the Meta app details',
schema: z
.object({
clientSecret: z
.string()
.secret()
.title('Client Secret')
.describe('Instagram App secret from API setup View used for webhook signature check'),
verifyToken: z
.string()
.secret()
.title('Verify Token')
.describe('Token used for verifying the Callback URL at API setup View'),
accessToken: z
.string()
.secret()
.title('Access token')
.describe('Access Token for the Instagram Account from the API setup View'),
instagramId: z.string().title('Instagram account ID').describe('Instagram Account Id from API setup View'),
})
.merge(commonConfigSchema),
},
sandbox: {
title: 'Sandbox Configuration',
description: 'Sandbox configuration, for testing purposes only',
schema: z.object({}),
identifier: {
linkTemplateScript: 'sandboxLinkTemplate.vrl',
},
},
},
states: {
oauth: {
type: 'integration',
schema: z.object({
accessToken: z
.string()
.title('Access token')
.describe('Access token used to authenticate requests to the Instagram API'),
instagramId: z
.string()
.title('Instagram account ID')
.describe('The Instagram account ID associated with the access token'),
expirationTime: z
.number()
.title('Expiration time')
.describe('The time when the access token expires, expressed as a Unix timestamp (epoch) in milliseconds'),
}),
},
},
identifier: {
extractScript: 'extract.vrl',
fallbackHandlerScript: 'fallbackHandler.vrl',
},
channels: {
channel: {
title: 'Direct Message',
description: 'Direct message conversation between an Instagram user and the bot',
messages: dmChannelMessages,
message: {
tags: {
id: {
title: 'Message ID',
description: 'The Instagram message ID',
},
senderId: {
title: 'Sender ID',
description: 'The Instagram user ID of the message sender',
},
recipientId: {
title: 'Recipient ID',
description: 'The Instagram user ID of the message recipient',
},
commentId: {
title: 'Comment ID',
description: 'The Instagram comment ID under which the direct message conversation was started',
},
},
},
conversation: {
tags: {
id: {
title: 'Conversation ID',
description: 'The Instagram user ID of the user in the conversation',
},
commentId: {
title: 'Comment ID',
description: 'The Instagram comment ID under which the direct message conversation was started',
},
lastCommentId: {
title: 'Last Comment ID',
description: 'The Instagram comment ID of the last comment from which a direct message was sent',
},
},
},
},
commentReplies: {
title: 'Comment Replies',
description: 'Replies to comments on an Instagram post',
messages: {
text: messages.defaults.text,
},
message: {
tags: {
id: {
title: 'Comment ID',
description: 'The unique ID of the comment',
},
postId: {
title: 'Post ID',
description: 'The Instagram post ID where the comment was posted',
},
},
},
conversation: {
tags: {
id: {
title: 'Comment ID',
description: 'The Instagram comment ID under which the reply was posted',
},
postId: {
title: 'Post ID',
description: 'The Instagram post ID where the comment was posted',
},
userId: {
title: 'User ID',
description: 'The Instagram user ID of the user who sent the comment',
},
},
},
},
},
actions: {},
events: {},
secrets: {
...posthogHelper.COMMON_SECRET_NAMES,
CLIENT_ID: {
description: 'The client ID of the OAuth Meta app.',
},
CLIENT_SECRET: {
description: 'The client secret of the OAuth Meta app.',
},
VERIFY_TOKEN: {
description: 'The verify token of the OAuth Meta app.',
},
SANDBOX_CLIENT_SECRET: {
description: 'The client secret of the Sandbox Meta app',
},
SANDBOX_VERIFY_TOKEN: {
description: 'The verify token for the Sandbox Meta App Webhooks subscription',
},
SANDBOX_ACCESS_TOKEN: {
description: 'Access token for the Sandbox Meta App',
},
SANDBOX_INSTAGRAM_ID: {
description: 'Instagram ID for the Sandbox Instagram profile',
},
},
user: {
tags: {
id: {
title: 'User ID',
description: 'The Instagram user ID',
},
},
},
entities: {
user: {
title: 'User',
description: 'An Instagram user',
schema: z
.object({
id: z.string().title('ID').describe('The Instagram user ID'),
})
.title('User')
.describe('The user object fields'),
},
dm: {
title: 'Direct Message',
description: 'An Instagram direct message conversation',
schema: z
.object({
id: z.string().title('User ID').describe('The Instagram user ID of the user in the conversation'),
commentId: z
.string()
.optional()
.title('Comment ID')
.describe('The Instagram comment ID under which the direct message conversation was started'),
})
.title('Conversation')
.describe('The conversation object fields'),
},
},
attributes: {
category: 'Communication & Channels',
guideSlug: 'instagram',
repo: 'botpress',
},
})
.extend(proactiveUser, ({ entities }) => ({
entities: {
user: entities.user,
},
}))
.extend(proactiveConversation, ({ entities }) => ({
entities: {
conversation: entities.dm,
},
actions: {
getOrCreateConversation: { name: 'getOrCreateConversationDm' },
},
}))