n8n-nodes-scraperapi 0.2.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 +21 -0
- package/README.md +185 -0
- package/dist/credentials/ScraperApiApi.credentials.d.ts +9 -0
- package/dist/credentials/ScraperApiApi.credentials.js +47 -0
- package/dist/credentials/ScraperApiApi.credentials.js.map +1 -0
- package/dist/nodes/ScraperApi/GenericFunctions.d.ts +23 -0
- package/dist/nodes/ScraperApi/GenericFunctions.js +111 -0
- package/dist/nodes/ScraperApi/GenericFunctions.js.map +1 -0
- package/dist/nodes/ScraperApi/ScraperApi.node.d.ts +5 -0
- package/dist/nodes/ScraperApi/ScraperApi.node.js +326 -0
- package/dist/nodes/ScraperApi/ScraperApi.node.js.map +1 -0
- package/dist/nodes/ScraperApi/descriptions/BatchDescription.d.ts +3 -0
- package/dist/nodes/ScraperApi/descriptions/BatchDescription.js +143 -0
- package/dist/nodes/ScraperApi/descriptions/BatchDescription.js.map +1 -0
- package/dist/nodes/ScraperApi/descriptions/CrawlDescription.d.ts +3 -0
- package/dist/nodes/ScraperApi/descriptions/CrawlDescription.js +103 -0
- package/dist/nodes/ScraperApi/descriptions/CrawlDescription.js.map +1 -0
- package/dist/nodes/ScraperApi/descriptions/ExtractDescription.d.ts +3 -0
- package/dist/nodes/ScraperApi/descriptions/ExtractDescription.js +157 -0
- package/dist/nodes/ScraperApi/descriptions/ExtractDescription.js.map +1 -0
- package/dist/nodes/ScraperApi/descriptions/MapDescription.d.ts +3 -0
- package/dist/nodes/ScraperApi/descriptions/MapDescription.js +63 -0
- package/dist/nodes/ScraperApi/descriptions/MapDescription.js.map +1 -0
- package/dist/nodes/ScraperApi/descriptions/SearchDescription.d.ts +3 -0
- package/dist/nodes/ScraperApi/descriptions/SearchDescription.js +148 -0
- package/dist/nodes/ScraperApi/descriptions/SearchDescription.js.map +1 -0
- package/dist/nodes/ScraperApi/descriptions/StatisticsDescription.d.ts +3 -0
- package/dist/nodes/ScraperApi/descriptions/StatisticsDescription.js +48 -0
- package/dist/nodes/ScraperApi/descriptions/StatisticsDescription.js.map +1 -0
- package/dist/nodes/ScraperApi/descriptions/WebhookDescription.d.ts +3 -0
- package/dist/nodes/ScraperApi/descriptions/WebhookDescription.js +93 -0
- package/dist/nodes/ScraperApi/descriptions/WebhookDescription.js.map +1 -0
- package/dist/nodes/ScraperApi/descriptions/shared.d.ts +15 -0
- package/dist/nodes/ScraperApi/descriptions/shared.js +91 -0
- package/dist/nodes/ScraperApi/descriptions/shared.js.map +1 -0
- package/dist/nodes/ScraperApi/scraper-geonode.svg +252 -0
- package/dist/nodes/ScraperApiTrigger/ScraperApiTrigger.node.d.ts +12 -0
- package/dist/nodes/ScraperApiTrigger/ScraperApiTrigger.node.js +169 -0
- package/dist/nodes/ScraperApiTrigger/ScraperApiTrigger.node.js.map +1 -0
- package/dist/nodes/ScraperApiTrigger/scraper-geonode.svg +252 -0
- package/dist/package.json +63 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/index.js +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IHookFunctions, INodeType, INodeTypeDescription, IWebhookFunctions, IWebhookResponseData } from 'n8n-workflow';
|
|
2
|
+
export declare class ScraperApiTrigger implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
webhookMethods: {
|
|
5
|
+
default: {
|
|
6
|
+
checkExists(this: IHookFunctions): Promise<boolean>;
|
|
7
|
+
create(this: IHookFunctions): Promise<boolean>;
|
|
8
|
+
delete(this: IHookFunctions): Promise<boolean>;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
webhook(this: IWebhookFunctions): Promise<IWebhookResponseData>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScraperApiTrigger = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const GenericFunctions_1 = require("../ScraperApi/GenericFunctions");
|
|
6
|
+
const shared_1 = require("../ScraperApi/descriptions/shared");
|
|
7
|
+
const SIGNATURE_HEADER = 'x-webhook-signature';
|
|
8
|
+
function isValidSignature(secret, rawBody, providedHeader) {
|
|
9
|
+
const provided = providedHeader.replace(/^sha256=/i, '').trim().toLowerCase();
|
|
10
|
+
if (!provided)
|
|
11
|
+
return false;
|
|
12
|
+
const payload = Buffer.isBuffer(rawBody) ? rawBody : Buffer.from(rawBody, 'utf8');
|
|
13
|
+
const expected = (0, crypto_1.createHmac)('sha256', secret).update(payload).digest('hex');
|
|
14
|
+
if (expected.length !== provided.length)
|
|
15
|
+
return false;
|
|
16
|
+
try {
|
|
17
|
+
return (0, crypto_1.timingSafeEqual)(Buffer.from(expected, 'hex'), Buffer.from(provided, 'hex'));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
class ScraperApiTrigger {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.description = {
|
|
26
|
+
displayName: 'Scraper API Trigger',
|
|
27
|
+
name: 'scraperApiTrigger',
|
|
28
|
+
icon: 'file:scraper-geonode.svg',
|
|
29
|
+
group: ['trigger'],
|
|
30
|
+
version: 1,
|
|
31
|
+
subtitle: '={{$parameter["event_type"]}}',
|
|
32
|
+
description: 'Starts the workflow when the Scraper API delivers a webhook event',
|
|
33
|
+
defaults: { name: 'Scraper API Trigger' },
|
|
34
|
+
inputs: [],
|
|
35
|
+
outputs: ['main'],
|
|
36
|
+
credentials: [{ name: 'scraperApiApi', required: true }],
|
|
37
|
+
webhooks: [
|
|
38
|
+
{
|
|
39
|
+
name: 'default',
|
|
40
|
+
httpMethod: 'POST',
|
|
41
|
+
responseMode: 'onReceived',
|
|
42
|
+
path: 'webhook',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
properties: [
|
|
46
|
+
{
|
|
47
|
+
displayName: 'Event Type',
|
|
48
|
+
name: 'event_type',
|
|
49
|
+
type: 'options',
|
|
50
|
+
options: shared_1.eventTypeOptions,
|
|
51
|
+
default: 'extract_completed',
|
|
52
|
+
required: true,
|
|
53
|
+
description: 'Which Scraper API event should trigger this workflow',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
displayName: 'Description',
|
|
57
|
+
name: 'description',
|
|
58
|
+
type: 'string',
|
|
59
|
+
default: 'n8n workflow webhook',
|
|
60
|
+
description: 'Free-form description stored on the webhook record',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
displayName: 'Verify Signature',
|
|
64
|
+
name: 'verifySignature',
|
|
65
|
+
type: 'boolean',
|
|
66
|
+
default: true,
|
|
67
|
+
description: 'Whether to verify the X-Webhook-Signature header against the secret returned at registration; rejects mismatched payloads',
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
this.webhookMethods = {
|
|
72
|
+
default: {
|
|
73
|
+
async checkExists() {
|
|
74
|
+
const webhookData = this.getWorkflowStaticData('node');
|
|
75
|
+
if (!webhookData.webhookId)
|
|
76
|
+
return false;
|
|
77
|
+
try {
|
|
78
|
+
await GenericFunctions_1.scraperApiRequest.call(this, {
|
|
79
|
+
method: 'GET',
|
|
80
|
+
url: `/v1/webhooks/${webhookData.webhookId}`,
|
|
81
|
+
});
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
delete webhookData.webhookId;
|
|
86
|
+
delete webhookData.secret;
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
async create() {
|
|
91
|
+
const webhookUrl = this.getNodeWebhookUrl('default');
|
|
92
|
+
if (!webhookUrl)
|
|
93
|
+
return false;
|
|
94
|
+
const eventType = this.getNodeParameter('event_type');
|
|
95
|
+
const description = this.getNodeParameter('description', 'n8n workflow webhook');
|
|
96
|
+
const response = (await GenericFunctions_1.scraperApiRequest.call(this, {
|
|
97
|
+
method: 'POST',
|
|
98
|
+
url: '/v1/webhooks',
|
|
99
|
+
body: {
|
|
100
|
+
url: webhookUrl,
|
|
101
|
+
event_type: eventType,
|
|
102
|
+
description,
|
|
103
|
+
},
|
|
104
|
+
}));
|
|
105
|
+
if (!response.id)
|
|
106
|
+
return false;
|
|
107
|
+
const webhookData = this.getWorkflowStaticData('node');
|
|
108
|
+
webhookData.webhookId = response.id;
|
|
109
|
+
if (response.secret)
|
|
110
|
+
webhookData.secret = response.secret;
|
|
111
|
+
return true;
|
|
112
|
+
},
|
|
113
|
+
async delete() {
|
|
114
|
+
const webhookData = this.getWorkflowStaticData('node');
|
|
115
|
+
if (!webhookData.webhookId)
|
|
116
|
+
return true;
|
|
117
|
+
try {
|
|
118
|
+
await GenericFunctions_1.scraperApiRequest.call(this, {
|
|
119
|
+
method: 'DELETE',
|
|
120
|
+
url: `/v1/webhooks/${webhookData.webhookId}`,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
}
|
|
125
|
+
delete webhookData.webhookId;
|
|
126
|
+
delete webhookData.secret;
|
|
127
|
+
return true;
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async webhook() {
|
|
133
|
+
var _a, _b, _c, _d;
|
|
134
|
+
const req = this.getRequestObject();
|
|
135
|
+
const body = ((_a = req.body) !== null && _a !== void 0 ? _a : {});
|
|
136
|
+
const headers = ((_b = req.headers) !== null && _b !== void 0 ? _b : {});
|
|
137
|
+
const verify = this.getNodeParameter('verifySignature', true);
|
|
138
|
+
if (verify) {
|
|
139
|
+
const staticData = this.getWorkflowStaticData('node');
|
|
140
|
+
const secret = staticData.secret;
|
|
141
|
+
const rawHeader = (_c = headers[SIGNATURE_HEADER]) !== null && _c !== void 0 ? _c : headers[SIGNATURE_HEADER.toUpperCase()];
|
|
142
|
+
const signature = Array.isArray(rawHeader) ? rawHeader[0] : rawHeader;
|
|
143
|
+
if (!secret) {
|
|
144
|
+
return {
|
|
145
|
+
webhookResponse: { statusCode: 500, body: 'Webhook secret not stored — re-activate workflow' },
|
|
146
|
+
noWebhookResponse: false,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (!signature) {
|
|
150
|
+
return {
|
|
151
|
+
webhookResponse: { statusCode: 401, body: 'Missing X-Webhook-Signature header' },
|
|
152
|
+
noWebhookResponse: false,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const rawBody = (_d = req.rawBody) !== null && _d !== void 0 ? _d : Buffer.from(JSON.stringify(body), 'utf8');
|
|
156
|
+
if (!isValidSignature(secret, rawBody, signature)) {
|
|
157
|
+
return {
|
|
158
|
+
webhookResponse: { statusCode: 401, body: 'Invalid signature' },
|
|
159
|
+
noWebhookResponse: false,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
workflowData: [this.helpers.returnJsonArray([{ headers, body }])],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.ScraperApiTrigger = ScraperApiTrigger;
|
|
169
|
+
//# sourceMappingURL=ScraperApiTrigger.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScraperApiTrigger.node.js","sourceRoot":"","sources":["../../../nodes/ScraperApiTrigger/ScraperApiTrigger.node.ts"],"names":[],"mappings":"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"}
|