Workflow: Daily Language Learning
Integrations: airtable, cron, function, hackerNews, lingvaNex, set, vonage

{"id": "7", "name": "Daily Language Learning", "nodes": [{"name": "Daily trigger", "type": "n8n-nodes-base.cron", "position": [620, 750], "parameters": {"triggerTimes": {"item": [{"hour": 8}]}}, "typeVersion": 1}, {"name": "Get top 3 articles", "type": "n8n-nodes-base.hackerNews", "position": [820, 750], "parameters": {"limit": 3, "resource": "all", "additionalFields": {"tags": ["front_page"]}}, "typeVersion": 1}, {"name": "Extract words", "type": "n8n-nodes-base.function", "position": [1020, 750], "parameters": {"functionCode": "const words = [];\nconst regex = /\\d/g;\nconst newItems = [];\n\n// Splits titles into words and removes numbers\n// using regular expressions\n\nfor(let i=0; i < items.length; i++) {\n  let split_titles = []; \n  split_titles = items[i].json.title.split(' ');\n  for(let j=0; j < split_titles.length; j++) {\n    if(regex.test(split_titles[j])) {\n      continue;\n    } else {\n      words.push(split_titles[j]);\n    }\n  }\n}\n\n// Removes all duplicate words by converting the\n// array into a set and then back into an array\n\nconst uniqueWords = [...new Set(words)];\n\n// Transform the array to the data structure expected\n// by n8n\n\nfor(let k=0; k < uniqueWords.length; k++) {\n  newItems.push({json: { words: uniqueWords[k] }});\n}\n\nreturn newItems;"}, "typeVersion": 1}, {"name": "Translate", "type": "n8n-nodes-base.lingvaNex", "position": [1220, 750], "parameters": {"text": "={{$node[\"Extract words\"].json[\"words\"]}}", "options": {}, "translateTo": "de_DE"}, "credentials": {"lingvaNexApi": "LingvaNex"}, "typeVersion": 1}, {"name": "Filter data ", "type": "n8n-nodes-base.set", "position": [1420, 750], "parameters": {"values": {"string": [{"name": "English word", "value": "={{$node[\"Translate\"].json[\"source\"]}}"}, {"name": "Translated word", "value": "={{$node[\"Translate\"].json[\"result\"]}}"}]}, "options": {}, "keepOnlySet": true}, "typeVersion": 1}, {"name": "Save today's words", "type": "n8n-nodes-base.airtable", "position": [1620, 850], "parameters": {"table": "Table 1", "options": {}, "operation": "append", "application": "app4Y6qcCHIO1cYNB"}, "credentials": {"airtableApi": "Airtable"}, "typeVersion": 1}, {"name": "Craft message", "type": "n8n-nodes-base.function", "position": [1620, 650], "parameters": {"functionCode": "const number_of_words = 5;\nconst words = [];\n\n// Crafts the words to be sent in en_word : translated_word format\n// and adds them to an array\n\nfor(let i=0; i < number_of_words; i++) {\n  words.push(items[i].json['English word'] + ' : ' + items[i].json['Translated word']);\n}\n\n// Takes all the items from the array and converts them into a comma\n// separated string\n\nconst words_of_the_day = words.join(', ');\n\nreturn [{json: {words_of_the_day: words_of_the_day}}];"}, "typeVersion": 1}, {"name": "Send SMS", "type": "n8n-nodes-base.vonage", "position": [1820, 650], "parameters": {"to": "+4915225152610", "from": "Vonage APIs", "message": "=Good morning, here are your words for today\n{{$node[\"Craft message\"].json[\"words_of_the_day\"]}}", "additionalFields": {}}, "credentials": {"vonageApi": "Vonage"}, "typeVersion": 1}], "active": false, "settings": {}, "connections": {"Translate": {"main": [[{"node": "Filter data ", "type": "main", "index": 0}]]}, "Filter data ": {"main": [[{"node": "Craft message", "type": "main", "index": 0}, {"node": "Save today's words", "type": "main", "index": 0}]]}, "Craft message": {"main": [[{"node": "Send SMS", "type": "main", "index": 0}]]}, "Daily trigger": {"main": [[{"node": "Get top 3 articles", "type": "main", "index": 0}]]}, "Extract words": {"main": [[{"node": "Translate", "type": "main", "index": 0}]]}, "Get top 3 articles": {"main": [[{"node": "Extract words", "type": "main", "index": 0}]]}}}