@pakoor/n8n-nodes-instagram 0.1.14 → 0.1.15
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/InstagramOAuth2Api.credentials.d.ts +6 -6
- package/dist/credentials/InstagramOAuth2Api.credentials.d.ts.map +1 -1
- package/dist/credentials/InstagramOAuth2Api.credentials.js +48 -44
- package/dist/credentials/InstagramOAuth2Api.credentials.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import type { ICredentialDataDecryptedObject, ICredentialTestRequest, ICredentialType, IDataObject, IHttpRequestHelper, INodeProperties } from 'n8n-workflow';
|
|
1
|
+
import type { ICredentialDataDecryptedObject, ICredentialTestRequest, ICredentialType, IDataObject, IHttpRequestHelper, INodeProperties, IAuthenticateGeneric } from 'n8n-workflow';
|
|
2
2
|
export declare class InstagramOAuth2Api implements ICredentialType {
|
|
3
3
|
name: string;
|
|
4
4
|
extends: string[];
|
|
5
5
|
displayName: string;
|
|
6
6
|
documentationUrl: string;
|
|
7
7
|
properties: INodeProperties[];
|
|
8
|
+
/**
|
|
9
|
+
* Authenticate requests by adding access token to query string
|
|
10
|
+
*/
|
|
11
|
+
authenticate: IAuthenticateGeneric;
|
|
8
12
|
/**
|
|
9
13
|
* Pre-authentication hook that exchanges short-lived OAuth token for a long-lived token
|
|
10
|
-
* and refreshes it when near expiration. n8n automatically persists the returned values.
|
|
11
|
-
*
|
|
12
|
-
* This is called by n8n before each API request when the credential has an expirable field.
|
|
13
|
-
* If this function returns new credential data, n8n will persist it to the database.
|
|
14
14
|
*/
|
|
15
15
|
preAuthentication(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<IDataObject>;
|
|
16
16
|
/**
|
|
17
|
-
* Test
|
|
17
|
+
* Test credentials using Facebook Graph API
|
|
18
18
|
*/
|
|
19
19
|
test: ICredentialTestRequest;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstagramOAuth2Api.credentials.d.ts","sourceRoot":"","sources":["../../src/credentials/InstagramOAuth2Api.credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,8BAA8B,EAC9B,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,MAAM,cAAc,CAAC;AAEtB,qBAAa,kBAAmB,YAAW,eAAe;IACzD,IAAI,SAAwB;IAC5B,OAAO,WAAiB;IACxB,WAAW,SAA0B;IACrC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"InstagramOAuth2Api.credentials.d.ts","sourceRoot":"","sources":["../../src/credentials/InstagramOAuth2Api.credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,8BAA8B,EAC9B,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,MAAM,cAAc,CAAC;AAEtB,qBAAa,kBAAmB,YAAW,eAAe;IACzD,IAAI,SAAwB;IAC5B,OAAO,WAAiB;IACxB,WAAW,SAA0B;IACrC,gBAAgB,SAA+G;IAE/H,UAAU,EAAE,eAAe,EAAE,CAwF3B;IAEF;;OAEG;IACH,YAAY,EAAE,oBAAoB,CAOhC;IAEF;;OAEG;IACG,iBAAiB,CACtB,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,8BAA8B,GACzC,OAAO,CAAC,WAAW,CAAC;IA2EvB;;OAEG;IACH,IAAI,EAAE,sBAAsB,CAS1B;CACF"}
|
|
@@ -6,7 +6,7 @@ class InstagramOAuth2Api {
|
|
|
6
6
|
this.name = 'instagramOAuth2Api';
|
|
7
7
|
this.extends = ['oAuth2Api'];
|
|
8
8
|
this.displayName = 'Instagram OAuth2 API';
|
|
9
|
-
this.documentationUrl = 'https://developers.facebook.com/docs/instagram-api/
|
|
9
|
+
this.documentationUrl = 'https://developers.facebook.com/docs/instagram-platform/instagram-api-with-instagram-login/business-login';
|
|
10
10
|
this.properties = [
|
|
11
11
|
{
|
|
12
12
|
displayName: 'Grant Type',
|
|
@@ -18,25 +18,25 @@ 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',
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
displayName: 'Auth URI Query Parameters',
|
|
37
37
|
name: 'authQueryParameters',
|
|
38
38
|
type: 'hidden',
|
|
39
|
-
default: '',
|
|
39
|
+
default: 'display=page&extras={"setup":{"channel":"IG_API_ONBOARDING"}}',
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
displayName: 'Authentication',
|
|
@@ -49,19 +49,18 @@ class InstagramOAuth2Api {
|
|
|
49
49
|
name: 'accountInfoNotice',
|
|
50
50
|
type: 'notice',
|
|
51
51
|
default: '',
|
|
52
|
-
description: 'After connecting your account,
|
|
52
|
+
description: 'After connecting your account, n8n will automatically exchange your token for a long-lived one (60 days) and persist it.',
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
|
-
displayName: 'Client ID',
|
|
55
|
+
displayName: 'Client ID (App ID)',
|
|
56
56
|
name: 'clientId',
|
|
57
57
|
type: 'string',
|
|
58
58
|
default: '',
|
|
59
59
|
required: true,
|
|
60
|
-
description: 'The
|
|
61
|
-
placeholder: '1234567890123456',
|
|
60
|
+
description: 'The App ID from your Meta Developer Console > App Settings > Basic.',
|
|
62
61
|
},
|
|
63
62
|
{
|
|
64
|
-
displayName: 'Client Secret',
|
|
63
|
+
displayName: 'Client Secret (App Secret)',
|
|
65
64
|
name: 'clientSecret',
|
|
66
65
|
type: 'string',
|
|
67
66
|
typeOptions: {
|
|
@@ -69,8 +68,7 @@ class InstagramOAuth2Api {
|
|
|
69
68
|
},
|
|
70
69
|
default: '',
|
|
71
70
|
required: true,
|
|
72
|
-
description: 'The
|
|
73
|
-
placeholder: 'abc123def456...',
|
|
71
|
+
description: 'The App Secret from your Meta Developer Console > App Settings > Basic.',
|
|
74
72
|
},
|
|
75
73
|
{
|
|
76
74
|
displayName: 'Webhook Verify Token',
|
|
@@ -79,11 +77,9 @@ class InstagramOAuth2Api {
|
|
|
79
77
|
typeOptions: { password: true },
|
|
80
78
|
default: '',
|
|
81
79
|
required: false,
|
|
82
|
-
description: 'Optional: Custom verification token for webhook setup
|
|
83
|
-
placeholder: 'my_custom_verify_token_2024',
|
|
80
|
+
description: 'Optional: Custom verification token for webhook setup. Only needed if using Instagram Trigger node.',
|
|
84
81
|
},
|
|
85
|
-
// Hidden
|
|
86
|
-
// This enables n8n's preAuthentication system to persist the token
|
|
82
|
+
// Hidden fields for long-lived token persistence
|
|
87
83
|
{
|
|
88
84
|
displayName: 'Long-Lived Token',
|
|
89
85
|
name: 'longLivedToken',
|
|
@@ -101,89 +97,97 @@ class InstagramOAuth2Api {
|
|
|
101
97
|
},
|
|
102
98
|
];
|
|
103
99
|
/**
|
|
104
|
-
*
|
|
100
|
+
* Authenticate requests by adding access token to query string
|
|
101
|
+
*/
|
|
102
|
+
this.authenticate = {
|
|
103
|
+
type: 'generic',
|
|
104
|
+
properties: {
|
|
105
|
+
qs: {
|
|
106
|
+
access_token: '={{$credentials.longLivedToken || $credentials.oauthTokenData?.access_token}}',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Test credentials using Facebook Graph API
|
|
105
112
|
*/
|
|
106
113
|
this.test = {
|
|
107
114
|
request: {
|
|
108
|
-
baseURL: 'https://graph.
|
|
115
|
+
baseURL: 'https://graph.facebook.com/v23.0',
|
|
109
116
|
url: '/me',
|
|
110
117
|
method: 'GET',
|
|
111
118
|
qs: {
|
|
112
|
-
fields: 'id,
|
|
119
|
+
fields: 'id,name',
|
|
113
120
|
},
|
|
114
121
|
},
|
|
115
122
|
};
|
|
116
123
|
}
|
|
117
124
|
/**
|
|
118
125
|
* Pre-authentication hook that exchanges short-lived OAuth token for a long-lived token
|
|
119
|
-
* and refreshes it when near expiration. n8n automatically persists the returned values.
|
|
120
|
-
*
|
|
121
|
-
* This is called by n8n before each API request when the credential has an expirable field.
|
|
122
|
-
* If this function returns new credential data, n8n will persist it to the database.
|
|
123
126
|
*/
|
|
124
127
|
async preAuthentication(credentials) {
|
|
125
128
|
const now = Math.floor(Date.now() / 1000);
|
|
126
129
|
const longLivedToken = credentials.longLivedToken;
|
|
127
130
|
const tokenExpiresAt = credentials.tokenExpiresAt || 0;
|
|
131
|
+
const clientId = credentials.clientId;
|
|
128
132
|
const clientSecret = credentials.clientSecret;
|
|
129
133
|
const oauthTokenData = credentials.oauthTokenData;
|
|
130
134
|
const shortLivedToken = oauthTokenData?.access_token;
|
|
131
|
-
//
|
|
135
|
+
// 1. Check if existing long-lived token is valid
|
|
132
136
|
if (longLivedToken && tokenExpiresAt > 0) {
|
|
133
|
-
// Token is still valid with more than 7 days remaining
|
|
134
137
|
const sevenDaysInSeconds = 7 * 24 * 60 * 60;
|
|
138
|
+
// If expiring in > 7 days, return as is
|
|
135
139
|
if (tokenExpiresAt > now + sevenDaysInSeconds) {
|
|
136
|
-
return {};
|
|
140
|
+
return {};
|
|
137
141
|
}
|
|
138
|
-
//
|
|
139
|
-
//
|
|
142
|
+
// If nearing expiration (< 7 days), try to refresh
|
|
143
|
+
// Refresh requires token to be > 24 hours old
|
|
140
144
|
const totalLifetime = 60 * 24 * 60 * 60; // 60 days
|
|
141
145
|
const tokenAge = now - (tokenExpiresAt - totalLifetime);
|
|
142
146
|
if (tokenAge >= 24 * 60 * 60) {
|
|
143
147
|
try {
|
|
144
|
-
const refreshed = await this.helpers.httpRequest({
|
|
148
|
+
const refreshed = (await this.helpers.httpRequest({
|
|
145
149
|
method: 'GET',
|
|
146
|
-
url: 'https://graph.
|
|
150
|
+
url: 'https://graph.facebook.com/v23.0/oauth/access_token',
|
|
147
151
|
qs: {
|
|
148
|
-
grant_type: '
|
|
149
|
-
|
|
152
|
+
grant_type: 'fb_exchange_token',
|
|
153
|
+
client_id: clientId,
|
|
154
|
+
client_secret: clientSecret,
|
|
155
|
+
fb_exchange_token: longLivedToken,
|
|
150
156
|
},
|
|
151
|
-
});
|
|
157
|
+
}));
|
|
152
158
|
return {
|
|
153
159
|
longLivedToken: refreshed.access_token,
|
|
154
160
|
tokenExpiresAt: now + refreshed.expires_in,
|
|
155
161
|
};
|
|
156
162
|
}
|
|
157
163
|
catch (error) {
|
|
158
|
-
|
|
159
|
-
console.warn('Instagram: Failed to refresh long-lived token, continuing with current token', error);
|
|
164
|
+
console.warn('Instagram: Failed to refresh long-lived token', error);
|
|
160
165
|
return {};
|
|
161
166
|
}
|
|
162
167
|
}
|
|
163
|
-
return {};
|
|
168
|
+
return {};
|
|
164
169
|
}
|
|
165
|
-
//
|
|
170
|
+
// 2. Exchange short-lived token for long-lived one
|
|
166
171
|
if (!shortLivedToken) {
|
|
167
|
-
// No token available at all
|
|
168
172
|
return {};
|
|
169
173
|
}
|
|
170
174
|
try {
|
|
171
|
-
const exchanged = await this.helpers.httpRequest({
|
|
175
|
+
const exchanged = (await this.helpers.httpRequest({
|
|
172
176
|
method: 'GET',
|
|
173
|
-
url: 'https://graph.
|
|
177
|
+
url: 'https://graph.facebook.com/v23.0/oauth/access_token',
|
|
174
178
|
qs: {
|
|
175
|
-
grant_type: '
|
|
179
|
+
grant_type: 'fb_exchange_token',
|
|
180
|
+
client_id: clientId,
|
|
176
181
|
client_secret: clientSecret,
|
|
177
|
-
|
|
182
|
+
fb_exchange_token: shortLivedToken,
|
|
178
183
|
},
|
|
179
|
-
});
|
|
184
|
+
}));
|
|
180
185
|
return {
|
|
181
186
|
longLivedToken: exchanged.access_token,
|
|
182
187
|
tokenExpiresAt: now + exchanged.expires_in,
|
|
183
188
|
};
|
|
184
189
|
}
|
|
185
190
|
catch (error) {
|
|
186
|
-
// Exchange failed - the short-lived token may be expired
|
|
187
191
|
console.error('Instagram: Failed to exchange OAuth token for long-lived token', error);
|
|
188
192
|
return {};
|
|
189
193
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstagramOAuth2Api.credentials.js","sourceRoot":"","sources":["../../src/credentials/InstagramOAuth2Api.credentials.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"InstagramOAuth2Api.credentials.js","sourceRoot":"","sources":["../../src/credentials/InstagramOAuth2Api.credentials.ts"],"names":[],"mappings":"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"}
|