mirror of
https://github.com/n8n-io/n8n.git
synced 2025-02-21 02:56:40 -08:00
feat(RSS Feed Trigger Node): Add RSS feed trigger node (#7386)
Github issue / Community forum post (link here to close automatically): https://community.n8n.io/t/rss-trigger/14203
This commit is contained in:
parent
83762e051d
commit
689360ee06
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"node": "n8n-nodes-base.rssFeedReadTrigger",
|
||||||
|
"nodeVersion": "1.0",
|
||||||
|
"codexVersion": "1.0",
|
||||||
|
"categories": ["Core Nodes"],
|
||||||
|
"resources": {
|
||||||
|
"primaryDocumentation": [
|
||||||
|
{
|
||||||
|
"url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.rssfeedreadtrigger/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
import type {
|
||||||
|
IDataObject,
|
||||||
|
INodeExecutionData,
|
||||||
|
INodeType,
|
||||||
|
INodeTypeDescription,
|
||||||
|
IPollFunctions,
|
||||||
|
} from 'n8n-workflow';
|
||||||
|
import { NodeOperationError } from 'n8n-workflow';
|
||||||
|
import Parser from 'rss-parser';
|
||||||
|
import moment from 'moment';
|
||||||
|
|
||||||
|
export class RssFeedReadTrigger implements INodeType {
|
||||||
|
description: INodeTypeDescription = {
|
||||||
|
displayName: 'RSS Feed Trigger',
|
||||||
|
name: 'rssFeedReadTrigger',
|
||||||
|
icon: 'fa:rss',
|
||||||
|
group: ['trigger'],
|
||||||
|
version: 1,
|
||||||
|
description: 'Starts a workflow when an RSS feed is updated',
|
||||||
|
subtitle: '={{$parameter["event"]}}',
|
||||||
|
defaults: {
|
||||||
|
name: 'RSS Feed Trigger',
|
||||||
|
color: '#b02020',
|
||||||
|
},
|
||||||
|
polling: true,
|
||||||
|
inputs: [],
|
||||||
|
outputs: ['main'],
|
||||||
|
properties: [
|
||||||
|
{
|
||||||
|
displayName: 'Feed URL',
|
||||||
|
name: 'feedUrl',
|
||||||
|
type: 'string',
|
||||||
|
default: 'https://blog.n8n.io/rss/',
|
||||||
|
required: true,
|
||||||
|
description: 'URL of the RSS feed to poll',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
async poll(this: IPollFunctions): Promise<INodeExecutionData[][] | null> {
|
||||||
|
const pollData = this.getWorkflowStaticData('node');
|
||||||
|
const feedUrl = this.getNodeParameter('feedUrl') as string;
|
||||||
|
|
||||||
|
const now = moment().utc().format();
|
||||||
|
const startDate = (pollData.lastTimeChecked as string) || now;
|
||||||
|
|
||||||
|
const endDate = now;
|
||||||
|
|
||||||
|
if (!feedUrl) {
|
||||||
|
throw new NodeOperationError(this.getNode(), 'The parameter "URL" has to be set!');
|
||||||
|
}
|
||||||
|
|
||||||
|
const parser = new Parser();
|
||||||
|
|
||||||
|
let feed: Parser.Output<IDataObject>;
|
||||||
|
try {
|
||||||
|
feed = await parser.parseURL(feedUrl);
|
||||||
|
} catch (error) {
|
||||||
|
if (error.code === 'ECONNREFUSED') {
|
||||||
|
throw new NodeOperationError(
|
||||||
|
this.getNode(),
|
||||||
|
`It was not possible to connect to the URL. Please make sure the URL "${feedUrl}" it is valid!`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new NodeOperationError(this.getNode(), error as Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
const returnData: IDataObject[] = [];
|
||||||
|
|
||||||
|
if (feed.items) {
|
||||||
|
if (this.getMode() === 'manual') {
|
||||||
|
return [this.helpers.returnJsonArray(feed.items[0])];
|
||||||
|
}
|
||||||
|
feed.items.forEach((item) => {
|
||||||
|
if (Date.parse(item.isoDate as string) >= Date.parse(startDate)) {
|
||||||
|
returnData.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
pollData.lastTimeChecked = endDate;
|
||||||
|
|
||||||
|
if (Array.isArray(returnData) && returnData.length !== 0) {
|
||||||
|
return [this.helpers.returnJsonArray(returnData)];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -684,6 +684,7 @@
|
||||||
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
|
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
|
||||||
"dist/nodes/Rocketchat/Rocketchat.node.js",
|
"dist/nodes/Rocketchat/Rocketchat.node.js",
|
||||||
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
|
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
|
||||||
|
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
|
||||||
"dist/nodes/Rundeck/Rundeck.node.js",
|
"dist/nodes/Rundeck/Rundeck.node.js",
|
||||||
"dist/nodes/S3/S3.node.js",
|
"dist/nodes/S3/S3.node.js",
|
||||||
"dist/nodes/Salesforce/Salesforce.node.js",
|
"dist/nodes/Salesforce/Salesforce.node.js",
|
||||||
|
|
Loading…
Reference in a new issue