n8n-nodes-postora 1.0.0
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/LICENSE.md +21 -0
- package/README.md +59 -0
- package/dist/credentials/PostoraApi.credentials.d.ts +8 -0
- package/dist/credentials/PostoraApi.credentials.js +38 -0
- package/dist/credentials/PostoraApi.credentials.js.map +1 -0
- package/dist/nodes/Postora/Postora.node.d.ts +10 -0
- package/dist/nodes/Postora/Postora.node.js +517 -0
- package/dist/nodes/Postora/Postora.node.js.map +1 -0
- package/dist/nodes/Postora/postora.png +0 -0
- package/package.json +51 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Postora
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# n8n-nodes-postora
|
|
2
|
+
|
|
3
|
+
This is an [n8n](https://n8n.io/) community node for [Postora](https://postora.cloud) — the AI-powered social media management platform.
|
|
4
|
+
|
|
5
|
+
Publish content to **Instagram, Facebook, TikTok, YouTube, Twitter/X, LinkedIn, Pinterest, Threads, Bluesky, and Reddit** directly from your n8n workflows.
|
|
6
|
+
|
|
7
|
+
[n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.
|
|
12
|
+
|
|
13
|
+
1. Go to **Settings → Community Nodes**
|
|
14
|
+
2. Click **Install a community node**
|
|
15
|
+
3. Enter `n8n-nodes-postora`
|
|
16
|
+
4. Click **Install**
|
|
17
|
+
|
|
18
|
+
## Operations
|
|
19
|
+
|
|
20
|
+
### Post
|
|
21
|
+
- **Create** — Publish content to one or more social media platforms
|
|
22
|
+
- **Get Status** — Check the publishing status of a post
|
|
23
|
+
- **List** — List recent posts with optional status filter
|
|
24
|
+
|
|
25
|
+
### Media
|
|
26
|
+
- **Upload** — Upload an image or video file to use in posts
|
|
27
|
+
|
|
28
|
+
### Account
|
|
29
|
+
- **List** — List all connected social media accounts
|
|
30
|
+
|
|
31
|
+
## Credentials
|
|
32
|
+
|
|
33
|
+
You need a Postora API key to use this node:
|
|
34
|
+
|
|
35
|
+
1. Sign up at [postora.cloud](https://postora.cloud)
|
|
36
|
+
2. Go to **Settings → API Keys**
|
|
37
|
+
3. Generate a new API key
|
|
38
|
+
4. In n8n, create a new **Postora API** credential and paste the key
|
|
39
|
+
|
|
40
|
+
## Platform-Specific Options
|
|
41
|
+
|
|
42
|
+
When creating a post, you can set platform-specific options:
|
|
43
|
+
|
|
44
|
+
| Platform | Options |
|
|
45
|
+
|----------|---------|
|
|
46
|
+
| YouTube | Title, Privacy (public/unlisted/private), Category ID |
|
|
47
|
+
| TikTok | Privacy level, Allow Comments/Duet/Stitch |
|
|
48
|
+
| Pinterest | Board ID, Title |
|
|
49
|
+
| Reddit | Subreddit, Title |
|
|
50
|
+
|
|
51
|
+
## Resources
|
|
52
|
+
|
|
53
|
+
- [Postora Website](https://postora.cloud)
|
|
54
|
+
- [API Documentation](https://postora.cloud/docs/api)
|
|
55
|
+
- [n8n Community Nodes Docs](https://docs.n8n.io/integrations/community-nodes/)
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
[MIT](LICENSE.md)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IAuthenticateGeneric, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export declare class PostoraApi implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
documentationUrl: string;
|
|
6
|
+
properties: INodeProperties[];
|
|
7
|
+
authenticate: IAuthenticateGeneric;
|
|
8
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PostoraApi = void 0;
|
|
4
|
+
class PostoraApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'postoraApi';
|
|
7
|
+
this.displayName = 'Postora API';
|
|
8
|
+
this.documentationUrl = 'https://postora.cloud/docs/api';
|
|
9
|
+
this.properties = [
|
|
10
|
+
{
|
|
11
|
+
displayName: 'API Key',
|
|
12
|
+
name: 'apiKey',
|
|
13
|
+
type: 'string',
|
|
14
|
+
typeOptions: { password: true },
|
|
15
|
+
default: '',
|
|
16
|
+
required: true,
|
|
17
|
+
description: 'Your Postora API key. Find it in Settings → API Keys at postora.cloud.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
displayName: 'Base URL',
|
|
21
|
+
name: 'baseUrl',
|
|
22
|
+
type: 'string',
|
|
23
|
+
default: 'https://api.postora.cloud/functions/v1/n8n-api',
|
|
24
|
+
description: 'Postora API base URL. Only change if using a self-hosted instance.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
this.authenticate = {
|
|
28
|
+
type: 'generic',
|
|
29
|
+
properties: {
|
|
30
|
+
headers: {
|
|
31
|
+
'x-api-key': '={{$credentials.apiKey}}',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.PostoraApi = PostoraApi;
|
|
38
|
+
//# sourceMappingURL=PostoraApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostoraApi.credentials.js","sourceRoot":"","sources":["../../credentials/PostoraApi.credentials.ts"],"names":[],"mappings":";;;AAMA,MAAa,UAAU;IAAvB;QACE,SAAI,GAAG,YAAY,CAAC;QACpB,gBAAW,GAAG,aAAa,CAAC;QAC5B,qBAAgB,GAAG,gCAAgC,CAAC;QAEpD,eAAU,GAAsB;YAC9B;gBACE,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,wEAAwE;aACtF;YACD;gBACE,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,gDAAgD;gBACzD,WAAW,EAAE,oEAAoE;aAClF;SACF,CAAC;QAEF,iBAAY,GAAyB;YACnC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,WAAW,EAAE,0BAA0B;iBACxC;aACF;SACF,CAAC;IACJ,CAAC;CAAA;AAhCD,gCAgCC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IExecuteFunctions, ILoadOptionsFunctions, INodeExecutionData, INodePropertyOptions, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare class Postora implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
methods: {
|
|
5
|
+
loadOptions: {
|
|
6
|
+
getAccounts(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Postora = void 0;
|
|
4
|
+
const platformOptions = [
|
|
5
|
+
{ name: '1. Facebook', value: 'facebook' },
|
|
6
|
+
{ name: '2. Instagram', value: 'instagram' },
|
|
7
|
+
{ name: '3. Threads', value: 'threads' },
|
|
8
|
+
{ name: '4. YouTube (Beta)', value: 'youtube' },
|
|
9
|
+
{ name: '5. Pinterest', value: 'pinterest' },
|
|
10
|
+
{ name: '6. LinkedIn (Personal Only)', value: 'linkedin' },
|
|
11
|
+
{ name: '7. Bluesky', value: 'bluesky' },
|
|
12
|
+
// { name: '8. X / Twitter (Coming Soon)', value: 'twitter' },
|
|
13
|
+
// { name: '9. TikTok (Coming Soon)', value: 'tiktok' },
|
|
14
|
+
// { name: '10. Reddit (Coming Soon)', value: 'reddit' },
|
|
15
|
+
];
|
|
16
|
+
class Postora {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.description = {
|
|
19
|
+
displayName: 'Postora',
|
|
20
|
+
name: 'postora',
|
|
21
|
+
icon: 'file:postora.png',
|
|
22
|
+
group: ['transform'],
|
|
23
|
+
version: 1,
|
|
24
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
25
|
+
description: 'Publish content to social media platforms via Postora',
|
|
26
|
+
defaults: {
|
|
27
|
+
name: 'Postora',
|
|
28
|
+
},
|
|
29
|
+
inputs: ['main'],
|
|
30
|
+
outputs: ['main'],
|
|
31
|
+
credentials: [
|
|
32
|
+
{
|
|
33
|
+
name: 'postoraApi',
|
|
34
|
+
required: true,
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
properties: [
|
|
38
|
+
// ── Resource ──
|
|
39
|
+
{
|
|
40
|
+
displayName: 'Resource',
|
|
41
|
+
name: 'resource',
|
|
42
|
+
type: 'options',
|
|
43
|
+
noDataExpression: true,
|
|
44
|
+
options: [
|
|
45
|
+
{ name: 'Post', value: 'post' },
|
|
46
|
+
{ name: 'Media', value: 'media' },
|
|
47
|
+
{ name: 'Account', value: 'account' },
|
|
48
|
+
],
|
|
49
|
+
default: 'post',
|
|
50
|
+
},
|
|
51
|
+
// ── Post Operations ──
|
|
52
|
+
{
|
|
53
|
+
displayName: 'Operation',
|
|
54
|
+
name: 'operation',
|
|
55
|
+
type: 'options',
|
|
56
|
+
noDataExpression: true,
|
|
57
|
+
displayOptions: { show: { resource: ['post'] } },
|
|
58
|
+
options: [
|
|
59
|
+
{ name: 'Create', value: 'create', description: 'Create and publish a post', action: 'Create a post' },
|
|
60
|
+
{ name: 'Get Status', value: 'getStatus', description: 'Get post status and results', action: 'Get post status' },
|
|
61
|
+
{ name: 'List', value: 'list', description: 'List recent posts', action: 'List posts' },
|
|
62
|
+
],
|
|
63
|
+
default: 'create',
|
|
64
|
+
},
|
|
65
|
+
// ── Media Operations ──
|
|
66
|
+
{
|
|
67
|
+
displayName: 'Operation',
|
|
68
|
+
name: 'operation',
|
|
69
|
+
type: 'options',
|
|
70
|
+
noDataExpression: true,
|
|
71
|
+
displayOptions: { show: { resource: ['media'] } },
|
|
72
|
+
options: [
|
|
73
|
+
{ name: 'Upload', value: 'upload', description: 'Upload a media file', action: 'Upload media' },
|
|
74
|
+
],
|
|
75
|
+
default: 'upload',
|
|
76
|
+
},
|
|
77
|
+
// ── Account Operations ──
|
|
78
|
+
{
|
|
79
|
+
displayName: 'Operation',
|
|
80
|
+
name: 'operation',
|
|
81
|
+
type: 'options',
|
|
82
|
+
noDataExpression: true,
|
|
83
|
+
displayOptions: { show: { resource: ['account'] } },
|
|
84
|
+
options: [
|
|
85
|
+
{ name: 'List', value: 'list', description: 'List connected accounts', action: 'List accounts' },
|
|
86
|
+
],
|
|
87
|
+
default: 'list',
|
|
88
|
+
},
|
|
89
|
+
// ═══════════════════════════════════
|
|
90
|
+
// Post → Create fields (reordered: Platform first)
|
|
91
|
+
// ═══════════════════════════════════
|
|
92
|
+
{
|
|
93
|
+
displayName: 'Platform',
|
|
94
|
+
name: 'platform',
|
|
95
|
+
type: 'options',
|
|
96
|
+
noDataExpression: true,
|
|
97
|
+
options: platformOptions,
|
|
98
|
+
default: 'facebook',
|
|
99
|
+
required: true,
|
|
100
|
+
displayOptions: { show: { resource: ['post'], operation: ['create'] } },
|
|
101
|
+
description: 'Target platform for the post',
|
|
102
|
+
},
|
|
103
|
+
...platformOptions.map((p) => ({
|
|
104
|
+
displayName: 'Social Accounts',
|
|
105
|
+
name: `socialAccounts_${p.value}`,
|
|
106
|
+
type: 'multiOptions',
|
|
107
|
+
noDataExpression: true,
|
|
108
|
+
typeOptions: {
|
|
109
|
+
loadOptionsMethod: 'getAccounts',
|
|
110
|
+
},
|
|
111
|
+
default: [],
|
|
112
|
+
required: true,
|
|
113
|
+
displayOptions: { show: { resource: ['post'], operation: ['create'], platform: [p.value] } },
|
|
114
|
+
description: `Select ${p.name.replace(/^\d+\.\s*/, '')} accounts to post to`,
|
|
115
|
+
})),
|
|
116
|
+
{
|
|
117
|
+
displayName: 'Caption',
|
|
118
|
+
name: 'caption',
|
|
119
|
+
type: 'string',
|
|
120
|
+
typeOptions: { rows: 4 },
|
|
121
|
+
default: '',
|
|
122
|
+
required: true,
|
|
123
|
+
displayOptions: { show: { resource: ['post'], operation: ['create'] } },
|
|
124
|
+
description: 'The post caption / text content',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
displayName: 'Media Source',
|
|
128
|
+
name: 'mediaSource',
|
|
129
|
+
type: 'options',
|
|
130
|
+
options: [
|
|
131
|
+
{ name: 'None', value: 'none' },
|
|
132
|
+
{ name: 'URL', value: 'url' },
|
|
133
|
+
{ name: 'Binary Data', value: 'binary' },
|
|
134
|
+
],
|
|
135
|
+
default: 'none',
|
|
136
|
+
displayOptions: { show: { resource: ['post'], operation: ['create'] } },
|
|
137
|
+
description: 'How to attach media to the post',
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
displayName: 'Media URLs',
|
|
141
|
+
name: 'mediaUrls',
|
|
142
|
+
type: 'string',
|
|
143
|
+
default: '',
|
|
144
|
+
displayOptions: { show: { resource: ['post'], operation: ['create'], mediaSource: ['url'] } },
|
|
145
|
+
description: 'Comma-separated media URLs (images or videos). The API will download and attach them to the post.',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
displayName: 'Binary Property',
|
|
149
|
+
name: 'mediaBinaryProperty',
|
|
150
|
+
type: 'string',
|
|
151
|
+
default: 'data',
|
|
152
|
+
displayOptions: { show: { resource: ['post'], operation: ['create'], mediaSource: ['binary'] } },
|
|
153
|
+
description: 'Name of the binary property containing the media file(s). For multiple files, use comma-separated names (e.g., data,data1,data2).',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
displayName: 'Schedule At',
|
|
157
|
+
name: 'scheduledAt',
|
|
158
|
+
type: 'dateTime',
|
|
159
|
+
default: '',
|
|
160
|
+
displayOptions: { show: { resource: ['post'], operation: ['create'] } },
|
|
161
|
+
description: 'Schedule post for a future time (ISO 8601). Leave empty to post immediately.',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
displayName: 'Additional Options',
|
|
165
|
+
name: 'additionalOptions',
|
|
166
|
+
type: 'collection',
|
|
167
|
+
placeholder: 'Add Option',
|
|
168
|
+
default: {},
|
|
169
|
+
displayOptions: { show: { resource: ['post'], operation: ['create'] } },
|
|
170
|
+
options: [
|
|
171
|
+
// YouTube options
|
|
172
|
+
{
|
|
173
|
+
displayName: 'YouTube Title',
|
|
174
|
+
name: 'youtubeTitle',
|
|
175
|
+
type: 'string',
|
|
176
|
+
default: '',
|
|
177
|
+
description: 'Title for YouTube videos',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
displayName: 'YouTube Visibility',
|
|
181
|
+
name: 'youtubeVisibility',
|
|
182
|
+
type: 'options',
|
|
183
|
+
options: [
|
|
184
|
+
{ name: 'Public', value: 'public' },
|
|
185
|
+
{ name: 'Unlisted', value: 'unlisted' },
|
|
186
|
+
{ name: 'Private', value: 'private' },
|
|
187
|
+
],
|
|
188
|
+
default: 'public',
|
|
189
|
+
description: 'YouTube video visibility setting',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
displayName: 'YouTube Category',
|
|
193
|
+
name: 'youtubeCategory',
|
|
194
|
+
type: 'string',
|
|
195
|
+
default: '22',
|
|
196
|
+
description: 'YouTube category ID (default: People & Blogs)',
|
|
197
|
+
},
|
|
198
|
+
// TikTok options
|
|
199
|
+
{
|
|
200
|
+
displayName: 'TikTok Privacy',
|
|
201
|
+
name: 'tiktokPrivacy',
|
|
202
|
+
type: 'options',
|
|
203
|
+
options: [
|
|
204
|
+
{ name: 'Public', value: 'PUBLIC_TO_EVERYONE' },
|
|
205
|
+
{ name: 'Friends', value: 'MUTUAL_FOLLOW_FRIENDS' },
|
|
206
|
+
{ name: 'Followers', value: 'FOLLOWER_OF_CREATOR' },
|
|
207
|
+
{ name: 'Only Me', value: 'SELF_ONLY' },
|
|
208
|
+
],
|
|
209
|
+
default: 'PUBLIC_TO_EVERYONE',
|
|
210
|
+
description: 'TikTok video privacy level',
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
displayName: 'TikTok Allow Comments',
|
|
214
|
+
name: 'tiktokAllowComments',
|
|
215
|
+
type: 'boolean',
|
|
216
|
+
default: false,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
displayName: 'TikTok Allow Duet',
|
|
220
|
+
name: 'tiktokAllowDuet',
|
|
221
|
+
type: 'boolean',
|
|
222
|
+
default: false,
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
displayName: 'TikTok Allow Stitch',
|
|
226
|
+
name: 'tiktokAllowStitch',
|
|
227
|
+
type: 'boolean',
|
|
228
|
+
default: false,
|
|
229
|
+
},
|
|
230
|
+
// Pinterest options
|
|
231
|
+
{
|
|
232
|
+
displayName: 'Pinterest Board ID',
|
|
233
|
+
name: 'pinterestBoardId',
|
|
234
|
+
type: 'string',
|
|
235
|
+
default: '',
|
|
236
|
+
description: 'Pinterest board to pin to',
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
displayName: 'Pinterest Title',
|
|
240
|
+
name: 'pinterestTitle',
|
|
241
|
+
type: 'string',
|
|
242
|
+
default: '',
|
|
243
|
+
},
|
|
244
|
+
// Reddit options
|
|
245
|
+
{
|
|
246
|
+
displayName: 'Reddit Subreddit',
|
|
247
|
+
name: 'redditSubreddit',
|
|
248
|
+
type: 'string',
|
|
249
|
+
default: '',
|
|
250
|
+
description: 'Subreddit name (without r/)',
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
displayName: 'Reddit Title',
|
|
254
|
+
name: 'redditTitle',
|
|
255
|
+
type: 'string',
|
|
256
|
+
default: '',
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
},
|
|
260
|
+
// ═══════════════════════════════════
|
|
261
|
+
// Post → Get Status fields
|
|
262
|
+
// ═══════════════════════════════════
|
|
263
|
+
{
|
|
264
|
+
displayName: 'Post ID',
|
|
265
|
+
name: 'postId',
|
|
266
|
+
type: 'string',
|
|
267
|
+
default: '',
|
|
268
|
+
required: true,
|
|
269
|
+
displayOptions: { show: { resource: ['post'], operation: ['getStatus'] } },
|
|
270
|
+
description: 'The ID of the post to check',
|
|
271
|
+
},
|
|
272
|
+
// ═══════════════════════════════════
|
|
273
|
+
// Post → List fields
|
|
274
|
+
// ═══════════════════════════════════
|
|
275
|
+
{
|
|
276
|
+
displayName: 'Status Filter',
|
|
277
|
+
name: 'statusFilter',
|
|
278
|
+
type: 'options',
|
|
279
|
+
displayOptions: { show: { resource: ['post'], operation: ['list'] } },
|
|
280
|
+
options: [
|
|
281
|
+
{ name: 'All', value: '' },
|
|
282
|
+
{ name: 'Pending', value: 'pending' },
|
|
283
|
+
{ name: 'Processing', value: 'processing' },
|
|
284
|
+
{ name: 'Completed', value: 'completed' },
|
|
285
|
+
{ name: 'Failed', value: 'failed' },
|
|
286
|
+
],
|
|
287
|
+
default: '',
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
displayName: 'Limit',
|
|
291
|
+
name: 'limit',
|
|
292
|
+
type: 'number',
|
|
293
|
+
typeOptions: { minValue: 1, maxValue: 100 },
|
|
294
|
+
default: 20,
|
|
295
|
+
displayOptions: { show: { resource: ['post'], operation: ['list'] } },
|
|
296
|
+
},
|
|
297
|
+
// ═══════════════════════════════════
|
|
298
|
+
// Media → Upload fields
|
|
299
|
+
// ═══════════════════════════════════
|
|
300
|
+
{
|
|
301
|
+
displayName: 'Binary Property',
|
|
302
|
+
name: 'binaryPropertyName',
|
|
303
|
+
type: 'string',
|
|
304
|
+
default: 'data',
|
|
305
|
+
required: true,
|
|
306
|
+
displayOptions: { show: { resource: ['media'], operation: ['upload'] } },
|
|
307
|
+
description: 'Name of the binary property containing the file to upload',
|
|
308
|
+
},
|
|
309
|
+
],
|
|
310
|
+
};
|
|
311
|
+
this.methods = {
|
|
312
|
+
loadOptions: {
|
|
313
|
+
async getAccounts() {
|
|
314
|
+
try {
|
|
315
|
+
const credentials = await this.getCredentials('postoraApi');
|
|
316
|
+
const baseUrl = credentials.baseUrl;
|
|
317
|
+
const apiKey = credentials.apiKey;
|
|
318
|
+
const platform = this.getCurrentNodeParameter('platform');
|
|
319
|
+
console.log(`[Postora DEBUG] getAccounts called — platform: "${platform}"`);
|
|
320
|
+
let url = `${baseUrl}/api/v1/accounts`;
|
|
321
|
+
if (platform) {
|
|
322
|
+
url += `?platform=${encodeURIComponent(platform)}`;
|
|
323
|
+
}
|
|
324
|
+
console.log(`[Postora DEBUG] Requesting URL: ${url}`);
|
|
325
|
+
const response = await this.helpers.httpRequest({
|
|
326
|
+
method: 'GET',
|
|
327
|
+
url,
|
|
328
|
+
headers: { 'x-api-key': apiKey },
|
|
329
|
+
json: true,
|
|
330
|
+
});
|
|
331
|
+
console.log(`[Postora DEBUG] Response: ${JSON.stringify(response)?.substring(0, 500)}`);
|
|
332
|
+
if (!response?.accounts || !Array.isArray(response.accounts)) {
|
|
333
|
+
return [];
|
|
334
|
+
}
|
|
335
|
+
return response.accounts.map((account, index) => {
|
|
336
|
+
const displayName = account.name || account.platform_username || 'Unknown';
|
|
337
|
+
return {
|
|
338
|
+
name: `${index + 1}. ${displayName}`,
|
|
339
|
+
value: account.id,
|
|
340
|
+
};
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
console.log(`[Postora ERROR] getAccounts failed: ${error?.message}`);
|
|
345
|
+
console.log(`[Postora ERROR] Stack: ${error?.stack}`);
|
|
346
|
+
throw new Error(`Failed to load accounts: ${error?.message || 'Unknown error'}`);
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
async execute() {
|
|
353
|
+
const items = this.getInputData();
|
|
354
|
+
const returnData = [];
|
|
355
|
+
const resource = this.getNodeParameter('resource', 0);
|
|
356
|
+
const operation = this.getNodeParameter('operation', 0);
|
|
357
|
+
const credentials = await this.getCredentials('postoraApi');
|
|
358
|
+
const baseUrl = credentials.baseUrl;
|
|
359
|
+
for (let i = 0; i < items.length; i++) {
|
|
360
|
+
try {
|
|
361
|
+
let responseData;
|
|
362
|
+
// ── Account → List ──
|
|
363
|
+
if (resource === 'account' && operation === 'list') {
|
|
364
|
+
responseData = await this.helpers.httpRequest({
|
|
365
|
+
method: 'GET',
|
|
366
|
+
url: `${baseUrl}/api/v1/accounts`,
|
|
367
|
+
headers: { 'x-api-key': credentials.apiKey },
|
|
368
|
+
json: true,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
// ── Post → Create ──
|
|
372
|
+
else if (resource === 'post' && operation === 'create') {
|
|
373
|
+
const platform = this.getNodeParameter('platform', i);
|
|
374
|
+
if (['twitter', 'tiktok', 'reddit'].includes(platform)) {
|
|
375
|
+
throw new Error(`The selected platform (${platform}) is coming soon and is not yet available for publishing.`);
|
|
376
|
+
}
|
|
377
|
+
const caption = this.getNodeParameter('caption', i);
|
|
378
|
+
const socialAccounts = this.getNodeParameter(`socialAccounts_${platform}`, i);
|
|
379
|
+
const mediaSource = this.getNodeParameter('mediaSource', i, 'none');
|
|
380
|
+
const mediaUrls = mediaSource === 'url'
|
|
381
|
+
? this.getNodeParameter('mediaUrls', i, '')
|
|
382
|
+
.split(',').map(s => s.trim()).filter(Boolean)
|
|
383
|
+
: [];
|
|
384
|
+
const scheduledAt = this.getNodeParameter('scheduledAt', i, '');
|
|
385
|
+
const additionalOptions = this.getNodeParameter('additionalOptions', i, {});
|
|
386
|
+
const body = {
|
|
387
|
+
caption,
|
|
388
|
+
platforms: [platform],
|
|
389
|
+
};
|
|
390
|
+
if (socialAccounts.length)
|
|
391
|
+
body.account_ids = socialAccounts;
|
|
392
|
+
if (mediaUrls.length)
|
|
393
|
+
body.media_urls = mediaUrls;
|
|
394
|
+
// Binary data → base64 (supports multiple comma-separated property names)
|
|
395
|
+
if (mediaSource === 'binary') {
|
|
396
|
+
const binaryProp = this.getNodeParameter('mediaBinaryProperty', i, 'data');
|
|
397
|
+
const binaryProps = binaryProp.split(',').map(p => p.trim()).filter(Boolean);
|
|
398
|
+
const base64Files = [];
|
|
399
|
+
for (const prop of binaryProps) {
|
|
400
|
+
const bd = this.helpers.assertBinaryData(i, prop);
|
|
401
|
+
const buf = await this.helpers.getBinaryDataBuffer(i, prop);
|
|
402
|
+
base64Files.push(`data:${bd.mimeType};base64,${buf.toString('base64')}`);
|
|
403
|
+
}
|
|
404
|
+
body.media_base64 = base64Files;
|
|
405
|
+
}
|
|
406
|
+
if (scheduledAt)
|
|
407
|
+
body.scheduled_at = scheduledAt;
|
|
408
|
+
// Platform-specific metadata
|
|
409
|
+
if (platform === 'youtube') {
|
|
410
|
+
body.youtube_visibility = additionalOptions.youtubeVisibility || 'public';
|
|
411
|
+
}
|
|
412
|
+
if (additionalOptions.youtubeTitle)
|
|
413
|
+
body.youtube_title = additionalOptions.youtubeTitle;
|
|
414
|
+
if (additionalOptions.youtubeCategory)
|
|
415
|
+
body.youtube_category = additionalOptions.youtubeCategory;
|
|
416
|
+
if (additionalOptions.tiktokPrivacy)
|
|
417
|
+
body.tiktok_privacy = additionalOptions.tiktokPrivacy;
|
|
418
|
+
if (additionalOptions.tiktokAllowComments !== undefined)
|
|
419
|
+
body.tiktok_allow_comments = additionalOptions.tiktokAllowComments;
|
|
420
|
+
if (additionalOptions.tiktokAllowDuet !== undefined)
|
|
421
|
+
body.tiktok_allow_duet = additionalOptions.tiktokAllowDuet;
|
|
422
|
+
if (additionalOptions.tiktokAllowStitch !== undefined)
|
|
423
|
+
body.tiktok_allow_stitch = additionalOptions.tiktokAllowStitch;
|
|
424
|
+
if (additionalOptions.pinterestBoardId)
|
|
425
|
+
body.pinterest_board_id = additionalOptions.pinterestBoardId;
|
|
426
|
+
if (additionalOptions.pinterestTitle)
|
|
427
|
+
body.pinterest_title = additionalOptions.pinterestTitle;
|
|
428
|
+
if (additionalOptions.redditSubreddit)
|
|
429
|
+
body.reddit_subreddit = additionalOptions.redditSubreddit;
|
|
430
|
+
if (additionalOptions.redditTitle)
|
|
431
|
+
body.reddit_title = additionalOptions.redditTitle;
|
|
432
|
+
responseData = await this.helpers.httpRequest({
|
|
433
|
+
method: 'POST',
|
|
434
|
+
url: `${baseUrl}/api/v1/post`,
|
|
435
|
+
headers: {
|
|
436
|
+
'x-api-key': credentials.apiKey,
|
|
437
|
+
'Content-Type': 'application/json',
|
|
438
|
+
},
|
|
439
|
+
body,
|
|
440
|
+
json: true,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
// ── Post → Get Status ──
|
|
444
|
+
else if (resource === 'post' && operation === 'getStatus') {
|
|
445
|
+
const postId = this.getNodeParameter('postId', i);
|
|
446
|
+
responseData = await this.helpers.httpRequest({
|
|
447
|
+
method: 'GET',
|
|
448
|
+
url: `${baseUrl}/api/v1/post/${postId}`,
|
|
449
|
+
headers: { 'x-api-key': credentials.apiKey },
|
|
450
|
+
json: true,
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
// ── Post → List ──
|
|
454
|
+
else if (resource === 'post' && operation === 'list') {
|
|
455
|
+
const statusFilter = this.getNodeParameter('statusFilter', i, '');
|
|
456
|
+
const limit = this.getNodeParameter('limit', i, 20);
|
|
457
|
+
let url = `${baseUrl}/api/v1/posts?limit=${limit}`;
|
|
458
|
+
if (statusFilter)
|
|
459
|
+
url += `&status=${statusFilter}`;
|
|
460
|
+
responseData = await this.helpers.httpRequest({
|
|
461
|
+
method: 'GET',
|
|
462
|
+
url,
|
|
463
|
+
headers: { 'x-api-key': credentials.apiKey },
|
|
464
|
+
json: true,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
// ── Media → Upload ──
|
|
468
|
+
else if (resource === 'media' && operation === 'upload') {
|
|
469
|
+
const binaryPropertyName = this.getNodeParameter('binaryPropertyName', i);
|
|
470
|
+
const binaryData = this.helpers.assertBinaryData(i, binaryPropertyName);
|
|
471
|
+
const buffer = await this.helpers.getBinaryDataBuffer(i, binaryPropertyName);
|
|
472
|
+
const boundary = '----n8nFormBoundary' + Math.random().toString(36).substring(2);
|
|
473
|
+
const fileName = binaryData.fileName || 'upload';
|
|
474
|
+
const mimeType = binaryData.mimeType || 'application/octet-stream';
|
|
475
|
+
const header = Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${fileName}"\r\nContent-Type: ${mimeType}\r\n\r\n`);
|
|
476
|
+
const footer = Buffer.from(`\r\n--${boundary}--\r\n`);
|
|
477
|
+
const multipartBody = Buffer.concat([header, buffer, footer]);
|
|
478
|
+
responseData = await this.helpers.httpRequest({
|
|
479
|
+
method: 'POST',
|
|
480
|
+
url: `${baseUrl}/api/v1/media/upload`,
|
|
481
|
+
headers: {
|
|
482
|
+
'x-api-key': credentials.apiKey,
|
|
483
|
+
'Content-Type': `multipart/form-data; boundary=${boundary}`,
|
|
484
|
+
},
|
|
485
|
+
body: multipartBody,
|
|
486
|
+
});
|
|
487
|
+
// Parse JSON response if it comes back as a string
|
|
488
|
+
if (typeof responseData === 'string') {
|
|
489
|
+
try {
|
|
490
|
+
responseData = JSON.parse(responseData);
|
|
491
|
+
}
|
|
492
|
+
catch (_) { /* keep as-is */ }
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (Array.isArray(responseData)) {
|
|
496
|
+
returnData.push(...responseData.map((item) => ({ json: item })));
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
returnData.push({ json: responseData ?? {} });
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
catch (error) {
|
|
503
|
+
if (this.continueOnFail()) {
|
|
504
|
+
returnData.push({
|
|
505
|
+
json: { error: error.message },
|
|
506
|
+
pairedItem: { item: i },
|
|
507
|
+
});
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
throw error;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
return [returnData];
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
exports.Postora = Postora;
|
|
517
|
+
//# sourceMappingURL=Postora.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Postora.node.js","sourceRoot":"","sources":["../../../nodes/Postora/Postora.node.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-postora",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "n8n community node for Postora — publish to social media platforms (Instagram, Facebook, TikTok, YouTube, Pinterest, Twitter/X, LinkedIn, Threads, Bluesky, Reddit)",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"n8n-community-node-package",
|
|
7
|
+
"n8n",
|
|
8
|
+
"postora",
|
|
9
|
+
"social-media",
|
|
10
|
+
"automation"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"homepage": "https://postora.cloud",
|
|
14
|
+
"author": {
|
|
15
|
+
"name": "Postora",
|
|
16
|
+
"url": "https://postora.cloud"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/lolotam/postora-n8n-community-node"
|
|
21
|
+
},
|
|
22
|
+
"main": "dist/nodes/Postora/Postora.node.js",
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc && gulp build:icons",
|
|
25
|
+
"dev": "tsc --watch",
|
|
26
|
+
"prepublishOnly": "npm run build",
|
|
27
|
+
"lint": "tsc --noEmit"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist"
|
|
31
|
+
],
|
|
32
|
+
"n8n": {
|
|
33
|
+
"n8nNodesApiVersion": 1,
|
|
34
|
+
"credentials": [
|
|
35
|
+
"dist/credentials/PostoraApi.credentials.js"
|
|
36
|
+
],
|
|
37
|
+
"nodes": [
|
|
38
|
+
"dist/nodes/Postora/Postora.node.js"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@n8n/node-cli": "^0.23.1",
|
|
43
|
+
"@types/node": "^22.0.0",
|
|
44
|
+
"gulp": "^4.0.2",
|
|
45
|
+
"n8n-workflow": "^1.0.0",
|
|
46
|
+
"typescript": "^5.5.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"n8n-workflow": "*"
|
|
50
|
+
}
|
|
51
|
+
}
|