@robinpath/instagram
Advanced tools
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const InstagramModule: ModuleAdapter; | ||
| export default InstagramModule; | ||
| export { InstagramModule }; | ||
| export { InstagramFunctions, InstagramFunctionMetadata, InstagramModuleMetadata, InstagramCredentialTypes, } from "./instagram.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,eAAe,EAAE,aAQtB,CAAC;AAEF,eAAe,eAAe,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC"} |
| import { InstagramFunctions, InstagramFunctionMetadata, InstagramModuleMetadata, InstagramCredentialTypes, configureInstagram, } from "./instagram.js"; | ||
| const InstagramModule = { | ||
| name: "instagram", | ||
| functions: InstagramFunctions, | ||
| functionMetadata: InstagramFunctionMetadata, | ||
| moduleMetadata: InstagramModuleMetadata, | ||
| credentialTypes: InstagramCredentialTypes, | ||
| configure: configureInstagram, | ||
| global: false, | ||
| }; | ||
| export default InstagramModule; | ||
| export { InstagramModule }; | ||
| export { InstagramFunctions, InstagramFunctionMetadata, InstagramModuleMetadata, InstagramCredentialTypes, } from "./instagram.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,MAAM,eAAe,GAAkB;IACrC,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,kBAAkB;IAC7B,gBAAgB,EAAE,yBAAyB;IAC3C,cAAc,EAAE,uBAAuB;IACvC,eAAe,EAAE,wBAAwB;IACzC,SAAS,EAAE,kBAAkB;IAC7B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,eAAe,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC"} |
| /** | ||
| * RobinPath Instagram Module (Node port) | ||
| * | ||
| * Instagram Business integration via the Meta Graph API (v19.0). Mirror of | ||
| * packages/php/instagram/src/index.php for the WordPress plugin; shares the | ||
| * same credential contract, metadata shape, and error taxonomy so the | ||
| * visual editor can render both identically. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes | ||
| * a credential slug as its first argument; the module resolves the stored | ||
| * access token and IG Business User ID at call time via the injected | ||
| * ModuleHost. | ||
| * | ||
| * Publishing follows IG's two-step container flow: | ||
| * 1. POST /{ig-user-id}/media → returns { id: <creation_id> } | ||
| * 2. POST /{ig-user-id}/media_publish → returns { id: <published_media_id> } | ||
| * | ||
| * Credential type declared by this module: | ||
| * - instagram_business_token : { accessToken, igUserId } → query-string `access_token` | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureInstagram(h: ModuleHost): void; | ||
| export declare const InstagramFunctions: Record<string, BuiltinHandler>; | ||
| export declare const InstagramCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const InstagramFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const InstagramModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=instagram.d.ts.map |
| {"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../src/instagram.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEtD;AAiYD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAM7D,CAAC;AAIF,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,EA2B1D,CAAC;AA2EF,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA+MtE,CAAC;AAIF,eAAO,MAAM,uBAAuB,EAAE,cAkCrC,CAAC"} |
| /** | ||
| * RobinPath Instagram Module (Node port) | ||
| * | ||
| * Instagram Business integration via the Meta Graph API (v19.0). Mirror of | ||
| * packages/php/instagram/src/index.php for the WordPress plugin; shares the | ||
| * same credential contract, metadata shape, and error taxonomy so the | ||
| * visual editor can render both identically. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes | ||
| * a credential slug as its first argument; the module resolves the stored | ||
| * access token and IG Business User ID at call time via the injected | ||
| * ModuleHost. | ||
| * | ||
| * Publishing follows IG's two-step container flow: | ||
| * 1. POST /{ig-user-id}/media → returns { id: <creation_id> } | ||
| * 2. POST /{ig-user-id}/media_publish → returns { id: <published_media_id> } | ||
| * | ||
| * Credential type declared by this module: | ||
| * - instagram_business_token : { accessToken, igUserId } → query-string `access_token` | ||
| */ | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Instagram module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureInstagram(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const API_BASE = "https://graph.facebook.com/v19.0/"; | ||
| const CREDENTIAL_TYPE = "instagram_business_token"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| function isErrorReturn(v) { | ||
| return !!v && typeof v === "object" && "error" in v; | ||
| } | ||
| function isPlainObject(v) { | ||
| return !!v && typeof v === "object" && !Array.isArray(v); | ||
| } | ||
| async function resolveCredential(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const accessToken = String(fields.accessToken ?? ""); | ||
| if (!accessToken) { | ||
| return errorReturn(`Credential '${credentialSlug}' has no \`accessToken\` field.`, "token_missing"); | ||
| } | ||
| const igUserId = String(fields.igUserId ?? ""); | ||
| if (!igUserId) { | ||
| return errorReturn(`Credential '${credentialSlug}' has no \`igUserId\` field.`, "ig_user_id_missing"); | ||
| } | ||
| return { accessToken, igUserId }; | ||
| } | ||
| // ── HTTP helper (normalized envelope, never throws for API errors) ───── | ||
| async function callGraph(resolved, method, path, params) { | ||
| const token = resolved.accessToken; | ||
| const label = `${method} ${path}`; | ||
| const cleanPath = path.replace(/^\/+/, ""); | ||
| const headers = { Accept: "application/json" }; | ||
| const init = { method, headers }; | ||
| let url = `${API_BASE}${cleanPath}`; | ||
| if (method === "GET" || method === "DELETE") { | ||
| const sp = new URLSearchParams(); | ||
| for (const [k, v] of Object.entries(params)) { | ||
| if (v === undefined || v === null) | ||
| continue; | ||
| sp.set(k, String(v)); | ||
| } | ||
| sp.set("access_token", token); | ||
| url = `${url}?${sp.toString()}`; | ||
| } | ||
| else { | ||
| headers["Content-Type"] = "application/x-www-form-urlencoded"; | ||
| const sp = new URLSearchParams(); | ||
| for (const [k, v] of Object.entries(params)) { | ||
| if (v === undefined || v === null) | ||
| continue; | ||
| sp.set(k, String(v)); | ||
| } | ||
| sp.set("access_token", token); | ||
| init.body = sp.toString(); | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(url, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = null; | ||
| } | ||
| if (!isPlainObject(decoded)) { | ||
| return errorReturn(`Meta returned non-JSON for ${label}: ${raw.slice(0, 200)}`, "transport"); | ||
| } | ||
| if (isPlainObject(decoded.error)) { | ||
| const metaErr = decoded.error; | ||
| const metaMsg = String(metaErr.message ?? "unknown_error"); | ||
| return errorReturn(`Meta ${label} failed: ${metaMsg}`, "meta_error", { | ||
| meta_error: metaMsg, | ||
| meta: metaErr, | ||
| status: response.status, | ||
| }); | ||
| } | ||
| return decoded; | ||
| } | ||
| // ── Container status polling (for Reels) ─────────────────────────────── | ||
| async function sleep(ms) { | ||
| return new Promise((resolve) => setTimeout(resolve, ms)); | ||
| } | ||
| /** | ||
| * Poll a video container's status_code until it reports FINISHED (or errors). | ||
| * Returns `null` on success; an ErrorReturn on failure / timeout. | ||
| */ | ||
| async function pollContainerStatus(resolved, creationId, maxSeconds) { | ||
| const deadline = Date.now() + maxSeconds * 1000; | ||
| let delay = 2; // start at 2s, back off to 5s | ||
| while (Date.now() < deadline) { | ||
| const status = await callGraph(resolved, "GET", creationId, { | ||
| fields: "status_code,status", | ||
| }); | ||
| if (isErrorReturn(status)) | ||
| return status; | ||
| const code = String(status.status_code ?? ""); | ||
| if (code === "FINISHED") | ||
| return null; | ||
| if (code === "ERROR" || code === "EXPIRED") { | ||
| return errorReturn(`IG container processing failed: ${String(status.status ?? code)}`, "container_failed"); | ||
| } | ||
| await sleep(delay * 1000); | ||
| delay = Math.min(5, delay + 1); | ||
| } | ||
| return errorReturn("Video container did not finish processing within the polling window. Retry later.", "processing_timeout"); | ||
| } | ||
| // ── Handlers ─────────────────────────────────────────────────────────── | ||
| const getMedia = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = (isPlainObject(args[1]) ? args[1] : {}); | ||
| const resolved = await resolveCredential(cred); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| const limitRaw = opts.limit !== undefined ? Number(opts.limit) | 0 : 25; | ||
| const limit = Math.max(1, Math.min(100, limitRaw)); | ||
| const fields = String(opts.fields ?? "id,caption,media_type,media_url,permalink,timestamp"); | ||
| const result = await callGraph(resolved, "GET", `${resolved.igUserId}/media`, { limit, fields }); | ||
| if (isErrorReturn(result)) | ||
| return result; | ||
| const data = Array.isArray(result.data) ? result.data : []; | ||
| return data; | ||
| }; | ||
| const getMediaItem = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const mediaId = String(args[1] ?? ""); | ||
| const fields = args[2] !== undefined | ||
| ? String(args[2]) | ||
| : "id,caption,media_type,media_url,permalink,timestamp,like_count,comments_count"; | ||
| if (!mediaId) { | ||
| return errorReturn("`mediaId` is required.", "validation_failed"); | ||
| } | ||
| const resolved = await resolveCredential(cred); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| return (await callGraph(resolved, "GET", mediaId, { fields })); | ||
| }; | ||
| const publishPhoto = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const imageUrl = String(args[1] ?? ""); | ||
| const caption = args[2] !== undefined ? String(args[2]) : ""; | ||
| if (!imageUrl) { | ||
| return errorReturn("`imageUrl` is required.", "validation_failed"); | ||
| } | ||
| const resolved = await resolveCredential(cred); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| // Step 1: create container. | ||
| const containerBody = { image_url: imageUrl }; | ||
| if (caption !== "") | ||
| containerBody.caption = caption; | ||
| const container = await callGraph(resolved, "POST", `${resolved.igUserId}/media`, containerBody); | ||
| if (isErrorReturn(container)) { | ||
| const c = container; | ||
| if (!c.code || c.code === "meta_error") | ||
| c.code = "container_failed"; | ||
| return c; | ||
| } | ||
| const creationId = String(container.id ?? ""); | ||
| if (!creationId) { | ||
| return errorReturn("IG did not return a creation_id for the container.", "container_failed"); | ||
| } | ||
| // Step 2: publish. | ||
| const published = await callGraph(resolved, "POST", `${resolved.igUserId}/media_publish`, { creation_id: creationId }); | ||
| if (isErrorReturn(published)) { | ||
| const p = published; | ||
| if (!p.code || p.code === "meta_error") | ||
| p.code = "publish_failed"; | ||
| p.creation_id = creationId; | ||
| return p; | ||
| } | ||
| published.creation_id = creationId; | ||
| return published; | ||
| }; | ||
| const publishVideo = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const videoUrl = String(args[1] ?? ""); | ||
| const caption = args[2] !== undefined ? String(args[2]) : ""; | ||
| if (!videoUrl) { | ||
| return errorReturn("`videoUrl` is required.", "validation_failed"); | ||
| } | ||
| const resolved = await resolveCredential(cred); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| // Step 1: create REELS container (FEED video is deprecated). | ||
| const containerBody = { | ||
| media_type: "REELS", | ||
| video_url: videoUrl, | ||
| }; | ||
| if (caption !== "") | ||
| containerBody.caption = caption; | ||
| const container = await callGraph(resolved, "POST", `${resolved.igUserId}/media`, containerBody); | ||
| if (isErrorReturn(container)) { | ||
| const c = container; | ||
| if (!c.code || c.code === "meta_error") | ||
| c.code = "container_failed"; | ||
| return c; | ||
| } | ||
| const creationId = String(container.id ?? ""); | ||
| if (!creationId) { | ||
| return errorReturn("IG did not return a creation_id for the container.", "container_failed"); | ||
| } | ||
| // Step 1b: poll status_code until FINISHED (videos process async). Up to ~60s. | ||
| const status = await pollContainerStatus(resolved, creationId, 60); | ||
| if (status) { | ||
| const s = status; | ||
| s.creation_id = creationId; | ||
| return s; | ||
| } | ||
| // Step 2: publish. | ||
| const published = await callGraph(resolved, "POST", `${resolved.igUserId}/media_publish`, { creation_id: creationId }); | ||
| if (isErrorReturn(published)) { | ||
| const p = published; | ||
| if (!p.code || p.code === "meta_error") | ||
| p.code = "publish_failed"; | ||
| p.creation_id = creationId; | ||
| return p; | ||
| } | ||
| published.creation_id = creationId; | ||
| return published; | ||
| }; | ||
| const getInsights = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const mediaId = String(args[1] ?? ""); | ||
| const metrics = Array.isArray(args[2]) | ||
| ? args[2] | ||
| : ["impressions", "reach", "engagement"]; | ||
| if (!mediaId) { | ||
| return errorReturn("`mediaId` is required.", "validation_failed"); | ||
| } | ||
| const resolved = await resolveCredential(cred); | ||
| if (isErrorReturn(resolved)) | ||
| return resolved; | ||
| const metric = metrics.map((m) => String(m)).join(","); | ||
| const result = await callGraph(resolved, "GET", `${mediaId}/insights`, { metric }); | ||
| if (isErrorReturn(result)) | ||
| return result; | ||
| const data = Array.isArray(result.data) ? result.data : []; | ||
| return data; | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const InstagramFunctions = { | ||
| getMedia, | ||
| getMediaItem, | ||
| publishPhoto, | ||
| publishVideo, | ||
| getInsights, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const InstagramCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Instagram Business Token", | ||
| icon: "instagram", | ||
| fields: [ | ||
| { | ||
| name: "accessToken", | ||
| title: "Access Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "EAAG...", | ||
| description: "Meta Graph access token with `instagram_basic`, `instagram_content_publish`, and `pages_read_engagement` scopes. Tied to the Facebook Page connected to your IG Business account.", | ||
| }, | ||
| { | ||
| name: "igUserId", | ||
| title: "IG Business User ID", | ||
| type: "text", | ||
| required: true, | ||
| placeholder: "17841400000000000", | ||
| description: "The Instagram Business User ID (NOT your @username). Look it up via /{page-id}?fields=instagram_business_account in the Graph API Explorer.", | ||
| pattern: "^[0-9]+$", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Shared parameter metadata ────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `instagram_business_token` credential. The token and IG User ID are decrypted at call time and never appear in logs.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_instagram", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const mediaIdParam = { | ||
| name: "mediaId", | ||
| title: "Media ID", | ||
| description: "IG media object ID, as returned by `getMedia` or by `publishPhoto` / `publishVideo`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "17895695668004550", | ||
| validation: { pattern: "^[0-9]+$" }, | ||
| }; | ||
| const captionParam = { | ||
| name: "caption", | ||
| title: "Caption", | ||
| description: "Optional caption. Supports line breaks, @mentions and #hashtags. Note Instagram's caption length limit is 2,200 characters.", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: false, | ||
| allowExpression: true, | ||
| rows: 4, | ||
| placeholder: "Sunset over the canyon\n\n#travel #goldenhour", | ||
| }; | ||
| const publishResponseSchema = { | ||
| type: "object", | ||
| properties: { | ||
| id: { type: "string", description: "Published media ID" }, | ||
| creation_id: { | ||
| type: "string", | ||
| description: "The container ID created in step 1 (kept for traceability)", | ||
| }, | ||
| error: { | ||
| type: "string", | ||
| description: "Module error (transport, missing credential)", | ||
| }, | ||
| meta_error: { type: "string", description: "Meta-side error message" }, | ||
| }, | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| token_missing: "The credential exists but does not have an `accessToken` field.", | ||
| ig_user_id_missing: "The credential exists but does not have an `igUserId` field.", | ||
| transport: "Network failure calling graph.facebook.com — see error message.", | ||
| meta_error: "Meta returned an error envelope — see meta_error message and code.", | ||
| }; | ||
| // ── Exports: function metadata ───────────────────────────────────────── | ||
| export const InstagramFunctionMetadata = { | ||
| // ── Read ─────────────────────────────────────────────────────────── | ||
| getMedia: { | ||
| title: "List media", | ||
| summary: "Fetch recent media posted by the IG Business account", | ||
| description: "GETs `/{ig-user-id}/media`. Returns the `data` array directly, ordered most-recent-first.", | ||
| group: "read", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["instagram", "media", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n limit : int 1-100 (default 25)\n fields : comma-separated list (default 'id,caption,media_type,media_url,permalink,timestamp')", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "array", | ||
| returnDescription: "Array of media objects with the requested fields.", | ||
| errors: commonErrors, | ||
| example: 'instagram.getMedia "my_instagram" {limit: 10}', | ||
| }, | ||
| getMediaItem: { | ||
| title: "Get media item", | ||
| summary: "Fetch a single media object by ID", | ||
| description: "GETs `/{media-id}`. Returns the media object with the requested fields.", | ||
| group: "read", | ||
| action: "read", | ||
| icon: "eye", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["instagram", "media", "read"], | ||
| parameters: [ | ||
| credentialParam, | ||
| mediaIdParam, | ||
| { | ||
| name: "fields", | ||
| title: "Fields", | ||
| description: "Comma-separated list of fields to fetch.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: false, | ||
| defaultValue: "id,caption,media_type,media_url,permalink,timestamp,like_count,comments_count", | ||
| allowExpression: true, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "Single media object.", | ||
| errors: { | ||
| ...commonErrors, | ||
| media_not_found: "No media with that ID is visible to this token.", | ||
| }, | ||
| example: 'instagram.getMediaItem "my_instagram" "17895695668004550"', | ||
| }, | ||
| // ── Publishing ───────────────────────────────────────────────────── | ||
| publishPhoto: { | ||
| title: "Publish photo", | ||
| summary: "Publish a photo via the two-step container flow", | ||
| description: "Combines IG's two-step publishing flow into one call:\n 1. POST `/{ig-user-id}/media` with `image_url` + `caption` → container ID\n 2. POST `/{ig-user-id}/media_publish` with `creation_id` → published media ID\n\nThe `imageUrl` must be publicly reachable HTTPS — Instagram fetches it server-side.", | ||
| group: "publish", | ||
| action: "write", | ||
| icon: "image", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["instagram", "photo", "publish"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "imageUrl", | ||
| title: "Image URL", | ||
| description: "Publicly reachable HTTPS URL of the JPEG to publish. Must satisfy IG's aspect-ratio rules (square, 4:5 portrait, or 1.91:1 landscape).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "https://cdn.example.com/photo.jpg", | ||
| validation: { pattern: "^https?://" }, | ||
| }, | ||
| captionParam, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id: <published_media_id>, creation_id: <container_id> }.", | ||
| returnSchema: publishResponseSchema, | ||
| errors: { | ||
| ...commonErrors, | ||
| container_failed: "IG could not create the media container (bad URL, unsupported format, aspect-ratio violation).", | ||
| publish_failed: "IG accepted the container but rejected publish (rate limit, daily quota).", | ||
| }, | ||
| examples: [ | ||
| { | ||
| title: "Publish a product photo", | ||
| code: 'instagram.publishPhoto "my_instagram" "https://cdn.example.com/sku-42.jpg" "New drop. Limited stock.\\n\\n#new #drop"', | ||
| }, | ||
| ], | ||
| example: 'instagram.publishPhoto "my_instagram" "https://example.com/x.jpg" "Hi"', | ||
| }, | ||
| publishVideo: { | ||
| title: "Publish Reel", | ||
| summary: "Publish a video as a Reel via the two-step container flow", | ||
| description: "Combines IG's two-step Reels flow into one call. Container is created with `media_type=REELS` and `video_url` (FEED video is deprecated for IG Business).\n\nIG processes the video asynchronously after the container is created — this method polls `status_code` on the container for up to 60s before publishing. Long videos may exceed that window; on a `processing_timeout` error you can call `publishVideo` again later with the same URL or fetch the container directly.", | ||
| group: "publish", | ||
| action: "write", | ||
| icon: "video", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["instagram", "video", "reel", "publish"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "videoUrl", | ||
| title: "Video URL", | ||
| description: "Publicly reachable HTTPS URL of the MP4 to publish as a Reel. See IG's spec for codec/duration/dimension constraints.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "https://cdn.example.com/reel.mp4", | ||
| validation: { pattern: "^https?://" }, | ||
| }, | ||
| captionParam, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ id: <published_media_id>, creation_id: <container_id> }.", | ||
| returnSchema: publishResponseSchema, | ||
| errors: { | ||
| ...commonErrors, | ||
| container_failed: "IG could not create the Reels container.", | ||
| processing_timeout: "Video did not finish processing within the polling window. Retry later.", | ||
| publish_failed: "IG accepted the container but rejected publish.", | ||
| }, | ||
| example: 'instagram.publishVideo "my_instagram" "https://example.com/r.mp4" "First reel"', | ||
| }, | ||
| // ── Insights ─────────────────────────────────────────────────────── | ||
| getInsights: { | ||
| title: "Get media insights", | ||
| summary: "Pull per-media analytics for one or more metrics", | ||
| description: "GETs `/{media-id}/insights`. Returns the `data` array of metric values. Available metrics depend on media type — common: `impressions`, `reach`, `engagement`, `saved`, `video_views`.", | ||
| group: "insights", | ||
| action: "query", | ||
| icon: "bar-chart-2", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["instagram", "insights", "analytics"], | ||
| parameters: [ | ||
| credentialParam, | ||
| mediaIdParam, | ||
| { | ||
| name: "metrics", | ||
| title: "Metrics", | ||
| description: "Array of metric names. Common: `impressions`, `reach`, `engagement`, `saved`, `video_views`.", | ||
| dataType: "array", | ||
| formInputType: "json", | ||
| required: false, | ||
| defaultValue: ["impressions", "reach", "engagement"], | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| }, | ||
| ], | ||
| returnType: "array", | ||
| returnDescription: "Array of metric objects: { name, period, values: [{ value }] }.", | ||
| errors: { | ||
| ...commonErrors, | ||
| unsupported_metric: "The requested metric is not available for this media type.", | ||
| }, | ||
| example: 'instagram.getInsights "my_instagram" "17895..." ["impressions", "reach"]', | ||
| }, | ||
| }; | ||
| // ── Exports: module metadata ─────────────────────────────────────────── | ||
| export const InstagramModuleMetadata = { | ||
| slug: "instagram", | ||
| title: "Instagram", | ||
| summary: "Publish photos and Reels to Instagram Business accounts, list recent media, and pull post insights via the Meta Graph API", | ||
| description: "Instagram Business integration via the Meta Graph API (v19.0). All operations require a saved `instagram_business_token` credential containing an access token and the connected IG Business User ID.\n\nPublishing uses Instagram's two-step container flow under the hood (create container → publish), exposed as a single `publishPhoto` / `publishVideo` call that returns the published media ID. Errors are returned as `{error: '...', meta_error: '...'}` rather than thrown.", | ||
| category: "communication", | ||
| icon: "icon.svg", | ||
| color: "#E4405F", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/instagram", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| publish: { | ||
| title: "Publishing", | ||
| description: "Publish photos and Reels via the two-step container flow.", | ||
| order: 1, | ||
| }, | ||
| read: { | ||
| title: "Read", | ||
| description: "List recent media and fetch individual posts.", | ||
| order: 2, | ||
| }, | ||
| insights: { | ||
| title: "Insights", | ||
| description: "Per-media analytics and reach metrics.", | ||
| order: 3, | ||
| }, | ||
| }, | ||
| methods: Object.keys(InstagramFunctions), | ||
| }; | ||
| //# sourceMappingURL=instagram.js.map |
| {"version":3,"file":"instagram.js","sourceRoot":"","sources":["../src/instagram.ts"],"names":[],"mappings":"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"} |
+20
-8
| { | ||
| "name": "@robinpath/instagram", | ||
| "version": "0.1.1", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,12 +23,18 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "Instagram module for RobinPath.", | ||
| "description": "Instagram Business integration via the Meta Graph API — publish photos and Reels using the two-step container flow, list recent media, and pull post insights with a token tied to a connected IG Business account.", | ||
| "keywords": [ | ||
| "instagram", | ||
| "social media" | ||
| "social media", | ||
| "meta", | ||
| "graph", | ||
| "business", | ||
| "social", | ||
| "publish", | ||
| "reels" | ||
| ], | ||
@@ -38,7 +44,13 @@ "license": "MIT", | ||
| "category": "social-media", | ||
| "type": "integration", | ||
| "auth": "bearer-token", | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 21, | ||
| "baseUrl": "https://graph.facebook.com/v22.0" | ||
| "baseUrl": "https://graph.facebook.com/v22.0", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/instagram | ||
| ```bash | ||
| npm install @robinpath/instagram | ||
| robinpath add @robinpath/instagram | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
53068
874.8%10
400%654
Infinity%2
100%