@pakoor/n8n-nodes-instagram 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/credentials/InstagramAccessTokenApi.credentials.js +3 -3
- package/dist/credentials/InstagramOAuth2Api.credentials.d.ts +1 -1
- package/dist/credentials/InstagramOAuth2Api.credentials.d.ts.map +1 -1
- package/dist/credentials/InstagramOAuth2Api.credentials.js +17 -14
- package/dist/credentials/InstagramOAuth2Api.credentials.js.map +1 -1
- package/dist/services/InstagramApiClient.d.ts +1 -1
- package/dist/services/InstagramApiClient.js +1 -1
- package/dist/services/InstagramHelpers.d.ts +4 -1
- package/dist/services/InstagramHelpers.d.ts.map +1 -1
- package/dist/services/InstagramHelpers.js +57 -7
- package/dist/services/InstagramHelpers.js.map +1 -1
- package/package.json +1 -1
|
@@ -36,7 +36,7 @@ class InstagramAccessTokenApi {
|
|
|
36
36
|
};
|
|
37
37
|
this.test = {
|
|
38
38
|
request: {
|
|
39
|
-
baseURL: 'https://graph.facebook.com/
|
|
39
|
+
baseURL: 'https://graph.facebook.com/v23.0',
|
|
40
40
|
url: '/me',
|
|
41
41
|
qs: {
|
|
42
42
|
fields: 'id,name',
|
|
@@ -63,7 +63,7 @@ class InstagramAccessTokenApi {
|
|
|
63
63
|
// First, try a simple API call to validate the token
|
|
64
64
|
await this.helpers.httpRequest({
|
|
65
65
|
method: 'GET',
|
|
66
|
-
url: 'https://graph.facebook.com/
|
|
66
|
+
url: 'https://graph.facebook.com/v23.0/me',
|
|
67
67
|
qs: {
|
|
68
68
|
fields: 'id,name',
|
|
69
69
|
access_token: accessToken,
|
|
@@ -76,7 +76,7 @@ class InstagramAccessTokenApi {
|
|
|
76
76
|
// Get pages connected to the user
|
|
77
77
|
const pagesResponse = await this.helpers.httpRequest({
|
|
78
78
|
method: 'GET',
|
|
79
|
-
url: 'https://graph.facebook.com/
|
|
79
|
+
url: 'https://graph.facebook.com/v23.0/me/accounts',
|
|
80
80
|
qs: {
|
|
81
81
|
fields: 'instagram_business_account,id,name',
|
|
82
82
|
access_token: accessToken,
|
|
@@ -16,7 +16,7 @@ export declare class InstagramOAuth2Api implements ICredentialType {
|
|
|
16
16
|
*/
|
|
17
17
|
preAuthentication(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<IDataObject>;
|
|
18
18
|
/**
|
|
19
|
-
* Test credentials
|
|
19
|
+
* Test credentials using Facebook Graph API
|
|
20
20
|
*/
|
|
21
21
|
test: ICredentialTestRequest;
|
|
22
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstagramOAuth2Api.credentials.d.ts","sourceRoot":"","sources":["../../src/credentials/InstagramOAuth2Api.credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,eAAe,EAChB,MAAM,cAAc,CAAC;AAEtB,qBAAa,kBAAmB,YAAW,eAAe;IACxD,IAAI,SAAwB;IAC5B,OAAO,WAAiB;IACxB,WAAW,SAA0B;IACrC,gBAAgB,SAAwE;IAExF,UAAU,EAAE,eAAe,EAAE,CA8F3B;IAEF;;;OAGG;IACH,YAAY,EAAE,oBAAoB,CAOhC;IAEF;;;OAGG;IACG,iBAAiB,CACrB,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,8BAA8B,GAC1C,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"InstagramOAuth2Api.credentials.d.ts","sourceRoot":"","sources":["../../src/credentials/InstagramOAuth2Api.credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC9B,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,eAAe,EAChB,MAAM,cAAc,CAAC;AAEtB,qBAAa,kBAAmB,YAAW,eAAe;IACxD,IAAI,SAAwB;IAC5B,OAAO,WAAiB;IACxB,WAAW,SAA0B;IACrC,gBAAgB,SAAwE;IAExF,UAAU,EAAE,eAAe,EAAE,CA8F3B;IAEF;;;OAGG;IACH,YAAY,EAAE,oBAAoB,CAOhC;IAEF;;;OAGG;IACG,iBAAiB,CACrB,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,8BAA8B,GAC1C,OAAO,CAAC,WAAW,CAAC;IAqEvB;;OAEG;IACH,IAAI,EAAE,sBAAsB,CAS1B;CACH"}
|
|
@@ -18,19 +18,19 @@ class InstagramOAuth2Api {
|
|
|
18
18
|
displayName: 'Authorization URL',
|
|
19
19
|
name: 'authUrl',
|
|
20
20
|
type: 'hidden',
|
|
21
|
-
default: 'https://
|
|
21
|
+
default: 'https://www.facebook.com/v23.0/dialog/oauth',
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
displayName: 'Access Token URL',
|
|
25
25
|
name: 'accessTokenUrl',
|
|
26
26
|
type: 'hidden',
|
|
27
|
-
default: 'https://
|
|
27
|
+
default: 'https://graph.facebook.com/v23.0/oauth/access_token',
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
displayName: 'Scope',
|
|
31
31
|
name: 'scope',
|
|
32
32
|
type: 'hidden',
|
|
33
|
-
default: '
|
|
33
|
+
default: 'instagram_basic,instagram_content_publish,instagram_manage_comments,instagram_manage_messages,pages_show_list,pages_read_engagement,business_management',
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
displayName: 'Auth URI Query Parameters',
|
|
@@ -111,15 +111,15 @@ class InstagramOAuth2Api {
|
|
|
111
111
|
},
|
|
112
112
|
};
|
|
113
113
|
/**
|
|
114
|
-
* Test credentials
|
|
114
|
+
* Test credentials using Facebook Graph API
|
|
115
115
|
*/
|
|
116
116
|
this.test = {
|
|
117
117
|
request: {
|
|
118
|
-
baseURL: 'https://graph.
|
|
118
|
+
baseURL: 'https://graph.facebook.com/v23.0',
|
|
119
119
|
url: '/me',
|
|
120
120
|
method: 'GET',
|
|
121
121
|
qs: {
|
|
122
|
-
fields: 'id,
|
|
122
|
+
fields: 'id,name',
|
|
123
123
|
},
|
|
124
124
|
},
|
|
125
125
|
};
|
|
@@ -141,17 +141,19 @@ class InstagramOAuth2Api {
|
|
|
141
141
|
if (tokenExpiresAt > now + sevenDaysInSeconds) {
|
|
142
142
|
return {};
|
|
143
143
|
}
|
|
144
|
-
// Token near expiration, try to refresh
|
|
144
|
+
// Token near expiration, try to refresh using Facebook Graph API
|
|
145
145
|
const totalLifetime = 60 * 24 * 60 * 60;
|
|
146
146
|
const tokenAge = now - (tokenExpiresAt - totalLifetime);
|
|
147
147
|
if (tokenAge >= 24 * 60 * 60) {
|
|
148
148
|
try {
|
|
149
149
|
const refreshed = (await this.helpers.httpRequest({
|
|
150
150
|
method: 'GET',
|
|
151
|
-
url: 'https://graph.
|
|
151
|
+
url: 'https://graph.facebook.com/v23.0/oauth/access_token',
|
|
152
152
|
qs: {
|
|
153
|
-
grant_type: '
|
|
154
|
-
|
|
153
|
+
grant_type: 'fb_exchange_token',
|
|
154
|
+
client_id: credentials.clientId,
|
|
155
|
+
client_secret: clientSecret,
|
|
156
|
+
fb_exchange_token: longLivedToken,
|
|
155
157
|
},
|
|
156
158
|
}));
|
|
157
159
|
return {
|
|
@@ -165,18 +167,19 @@ class InstagramOAuth2Api {
|
|
|
165
167
|
}
|
|
166
168
|
return {};
|
|
167
169
|
}
|
|
168
|
-
// No long-lived token - exchange short-lived for long-lived
|
|
170
|
+
// No long-lived token - exchange short-lived for long-lived using Facebook Graph API
|
|
169
171
|
if (!shortLivedToken) {
|
|
170
172
|
return {};
|
|
171
173
|
}
|
|
172
174
|
try {
|
|
173
175
|
const exchanged = (await this.helpers.httpRequest({
|
|
174
176
|
method: 'GET',
|
|
175
|
-
url: 'https://graph.
|
|
177
|
+
url: 'https://graph.facebook.com/v23.0/oauth/access_token',
|
|
176
178
|
qs: {
|
|
177
|
-
grant_type: '
|
|
179
|
+
grant_type: 'fb_exchange_token',
|
|
180
|
+
client_id: credentials.clientId,
|
|
178
181
|
client_secret: clientSecret,
|
|
179
|
-
|
|
182
|
+
fb_exchange_token: shortLivedToken,
|
|
180
183
|
},
|
|
181
184
|
}));
|
|
182
185
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstagramOAuth2Api.credentials.js","sourceRoot":"","sources":["../../src/credentials/InstagramOAuth2Api.credentials.ts"],"names":[],"mappings":";;;AAUA,MAAa,kBAAkB;IAA/B;QACE,SAAI,GAAG,oBAAoB,CAAC;QAC5B,YAAO,GAAG,CAAC,WAAW,CAAC,CAAC;QACxB,gBAAW,GAAG,sBAAsB,CAAC;QACrC,qBAAgB,GAAG,oEAAoE,CAAC;QAExF,eAAU,GAAsB;YAC9B;gBACE,WAAW,EAAE,YAAY;gBACzB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,mBAAmB;aAC7B;YACD;gBACE,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"InstagramOAuth2Api.credentials.js","sourceRoot":"","sources":["../../src/credentials/InstagramOAuth2Api.credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -129,7 +129,7 @@ export declare class InstagramApiError extends Error {
|
|
|
129
129
|
toJSON(): IInstagramError;
|
|
130
130
|
}
|
|
131
131
|
export declare class InstagramApiClient {
|
|
132
|
-
protected readonly baseUrl = "https://graph.facebook.com/
|
|
132
|
+
protected readonly baseUrl = "https://graph.facebook.com/v23.0";
|
|
133
133
|
protected readonly accessToken: string;
|
|
134
134
|
protected readonly accountId: string;
|
|
135
135
|
constructor(accessToken: string, accountId: string);
|
|
@@ -34,7 +34,7 @@ class InstagramApiError extends Error {
|
|
|
34
34
|
exports.InstagramApiError = InstagramApiError;
|
|
35
35
|
class InstagramApiClient {
|
|
36
36
|
constructor(accessToken, accountId) {
|
|
37
|
-
this.baseUrl = 'https://graph.facebook.com/
|
|
37
|
+
this.baseUrl = 'https://graph.facebook.com/v23.0';
|
|
38
38
|
this.accessToken = accessToken;
|
|
39
39
|
this.accountId = accountId;
|
|
40
40
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { IDataObject, IExecuteFunctions, IHookFunctions, IHttpRequestMethods, ILoadOptionsFunctions, IWebhookFunctions } from 'n8n-workflow';
|
|
2
2
|
/**
|
|
3
3
|
* Get access token from credentials.
|
|
4
|
+
* Supports both OAuth2 and Access Token credential types.
|
|
4
5
|
*
|
|
5
6
|
* The token lifecycle is handled by n8n's preAuthentication system:
|
|
6
7
|
* 1. On first use, preAuthentication exchanges the short-lived OAuth token for a 60-day long-lived token
|
|
@@ -13,12 +14,14 @@ export declare function getAccessToken(this: IExecuteFunctions | IWebhookFunctio
|
|
|
13
14
|
*/
|
|
14
15
|
export declare function getAccessTokenFromAccessTokenCredential(this: IExecuteFunctions | IWebhookFunctions | IHookFunctions | ILoadOptionsFunctions): Promise<string>;
|
|
15
16
|
/**
|
|
16
|
-
* Get Instagram Business Account ID from the authenticated user
|
|
17
|
+
* Get Instagram Business Account ID from the authenticated user.
|
|
18
|
+
* Uses Facebook Graph API to get pages and find connected Instagram Business Account.
|
|
17
19
|
*/
|
|
18
20
|
export declare function getInstagramBusinessAccountId(this: IExecuteFunctions | IWebhookFunctions | IHookFunctions | ILoadOptionsFunctions): Promise<string>;
|
|
19
21
|
/**
|
|
20
22
|
* Make an authenticated API request to Instagram Graph API
|
|
21
23
|
* Token is automatically retrieved from credentials
|
|
24
|
+
* Uses Facebook Graph API for Instagram Business accounts
|
|
22
25
|
*/
|
|
23
26
|
export declare function instagramApiRequest(this: IExecuteFunctions | IWebhookFunctions | IHookFunctions | ILoadOptionsFunctions, method: IHttpRequestMethods, endpoint: string, body?: IDataObject, qs?: IDataObject): Promise<unknown>;
|
|
24
27
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstagramHelpers.d.ts","sourceRoot":"","sources":["../../src/services/InstagramHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EAErB,iBAAiB,EAGlB,MAAM,cAAc,CAAC;AAItB
|
|
1
|
+
{"version":3,"file":"InstagramHelpers.d.ts","sourceRoot":"","sources":["../../src/services/InstagramHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EAErB,iBAAiB,EAGlB,MAAM,cAAc,CAAC;AAItB;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,cAAc,GAAG,qBAAqB,GACnF,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAED;;GAEG;AACH,wBAAsB,uCAAuC,CAC3D,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,cAAc,GAAG,qBAAqB,GACnF,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,cAAc,GAAG,qBAAqB,GACnF,OAAO,CAAC,MAAM,CAAC,CA4DjB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,cAAc,GAAG,qBAAqB,EACpF,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,WAAgB,EACtB,EAAE,GAAE,WAAgB,GACnB,OAAO,CAAC,OAAO,CAAC,CAyBlB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,iBAAiB,GAAG,qBAAqB,EAC/C,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,WAAgB,EACtB,EAAE,GAAE,WAAgB,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC,CA4BpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAST"}
|
|
@@ -43,6 +43,7 @@ const n8n_workflow_1 = require("n8n-workflow");
|
|
|
43
43
|
const crypto = __importStar(require("crypto"));
|
|
44
44
|
/**
|
|
45
45
|
* Get access token from credentials.
|
|
46
|
+
* Supports both OAuth2 and Access Token credential types.
|
|
46
47
|
*
|
|
47
48
|
* The token lifecycle is handled by n8n's preAuthentication system:
|
|
48
49
|
* 1. On first use, preAuthentication exchanges the short-lived OAuth token for a 60-day long-lived token
|
|
@@ -50,6 +51,12 @@ const crypto = __importStar(require("crypto"));
|
|
|
50
51
|
* 3. n8n automatically persists the new token to the database
|
|
51
52
|
*/
|
|
52
53
|
async function getAccessToken() {
|
|
54
|
+
// Determine which credential type is being used
|
|
55
|
+
const authType = this.getNodeParameter('authentication', 0, 'oAuth2');
|
|
56
|
+
if (authType === 'accessToken') {
|
|
57
|
+
return getAccessTokenFromAccessTokenCredential.call(this);
|
|
58
|
+
}
|
|
59
|
+
// OAuth2 flow
|
|
53
60
|
const credentials = (await this.getCredentials('instagramOAuth2Api'));
|
|
54
61
|
const now = Math.floor(Date.now() / 1000);
|
|
55
62
|
// Check for persisted long-lived token first (set by preAuthentication)
|
|
@@ -83,25 +90,67 @@ async function getAccessTokenFromAccessTokenCredential() {
|
|
|
83
90
|
return accessToken;
|
|
84
91
|
}
|
|
85
92
|
/**
|
|
86
|
-
* Get Instagram Business Account ID from the authenticated user
|
|
93
|
+
* Get Instagram Business Account ID from the authenticated user.
|
|
94
|
+
* Uses Facebook Graph API to get pages and find connected Instagram Business Account.
|
|
87
95
|
*/
|
|
88
96
|
async function getInstagramBusinessAccountId() {
|
|
97
|
+
const accessToken = await getAccessToken.call(this);
|
|
89
98
|
try {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
99
|
+
// First, try to get Instagram account directly via /me (for Instagram Graph API tokens)
|
|
100
|
+
try {
|
|
101
|
+
const directResponse = (await this.helpers.request({
|
|
102
|
+
method: 'GET',
|
|
103
|
+
url: 'https://graph.instagram.com/v23.0/me',
|
|
104
|
+
qs: {
|
|
105
|
+
fields: 'id,username',
|
|
106
|
+
access_token: accessToken,
|
|
107
|
+
},
|
|
108
|
+
json: true,
|
|
109
|
+
}));
|
|
110
|
+
if (directResponse && directResponse.id) {
|
|
111
|
+
return directResponse.id;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Instagram Graph API didn't work, try Facebook Graph API flow
|
|
93
116
|
}
|
|
94
|
-
|
|
117
|
+
// Get pages connected to the user via Facebook Graph API
|
|
118
|
+
const pagesResponse = (await this.helpers.request({
|
|
119
|
+
method: 'GET',
|
|
120
|
+
url: 'https://graph.facebook.com/v23.0/me/accounts',
|
|
121
|
+
qs: {
|
|
122
|
+
fields: 'instagram_business_account{id,username},id,name',
|
|
123
|
+
access_token: accessToken,
|
|
124
|
+
},
|
|
125
|
+
json: true,
|
|
126
|
+
}));
|
|
127
|
+
// Find the first page with an Instagram Business Account
|
|
128
|
+
if (pagesResponse.data && pagesResponse.data.length > 0) {
|
|
129
|
+
for (const page of pagesResponse.data) {
|
|
130
|
+
if (page.instagram_business_account?.id) {
|
|
131
|
+
return page.instagram_business_account.id;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
throw new Error('No Instagram Business Account found. Make sure your Facebook Page is connected to an Instagram Business or Creator account.');
|
|
95
136
|
}
|
|
96
137
|
catch (error) {
|
|
138
|
+
const errorMessage = error.message;
|
|
139
|
+
// Check for common OAuth errors
|
|
140
|
+
if (errorMessage.includes('Invalid OAuth access token') || errorMessage.includes('Cannot parse access token')) {
|
|
141
|
+
throw new n8n_workflow_1.NodeApiError(this.getNode(), error, {
|
|
142
|
+
message: 'Invalid access token. Please reconnect your Instagram account with the correct permissions.',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
97
145
|
throw new n8n_workflow_1.NodeApiError(this.getNode(), error, {
|
|
98
|
-
message: 'Failed to fetch Instagram Business Account ID: ' +
|
|
146
|
+
message: 'Failed to fetch Instagram Business Account ID: ' + errorMessage,
|
|
99
147
|
});
|
|
100
148
|
}
|
|
101
149
|
}
|
|
102
150
|
/**
|
|
103
151
|
* Make an authenticated API request to Instagram Graph API
|
|
104
152
|
* Token is automatically retrieved from credentials
|
|
153
|
+
* Uses Facebook Graph API for Instagram Business accounts
|
|
105
154
|
*/
|
|
106
155
|
async function instagramApiRequest(method, endpoint, body = {}, qs = {}) {
|
|
107
156
|
// Get access token automatically
|
|
@@ -113,7 +162,8 @@ async function instagramApiRequest(method, endpoint, body = {}, qs = {}) {
|
|
|
113
162
|
...qs,
|
|
114
163
|
access_token: accessToken,
|
|
115
164
|
},
|
|
116
|
-
|
|
165
|
+
// Use Facebook Graph API for Instagram Business accounts
|
|
166
|
+
url: `https://graph.facebook.com/v23.0${endpoint}`,
|
|
117
167
|
json: true,
|
|
118
168
|
};
|
|
119
169
|
if (Object.keys(body).length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstagramHelpers.js","sourceRoot":"","sources":["../../src/services/InstagramHelpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"InstagramHelpers.js","sourceRoot":"","sources":["../../src/services/InstagramHelpers.ts"],"names":[],"mappings":"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"}
|