Darmowy szablon automatyzacji

Twórz i publikuj posty na blogu z Arkuszy Google

4431
27 dni temu
35
bloków


Co to jest

Automatyzacja służąca do planowania, tworzenia szkiców, finalizowania i publikowania pomysłów na posty tekstowe na blogu WordPress. Działa etapowo, oddając kontrolę użytkownikowi pomiędzy poszczególnymi krokami. Do planowania tematów oraz konfiguracji modeli LLM i promptów można wykorzystać arkusz Google Spreadsheet.

Funkcjonalności

  • Planuje, tworzy szkice i finalizuje tematy postów blogowych określone w arkuszu Google Spreadsheet przy użyciu modelu LLM z promptami skonfigurowanymi w tym samym arkuszu (w tym wybór modelu).
  • Zapisuje wyniki w odpowiednich kolumnach arkusza "Schedule".
  • Oddaje kontrolę użytkownikowi w celu sprawdzenia lub zmiany wyników oraz ustawienia kolejnej akcji dla workflow.
  • Ostatecznie publikuje post na blogu WordPress.

Ograniczenia

  • Prawdopodobnie lekko przeinżynierowane.
  • Brak generowania mediów.
  • Niektóre modele LLM nie działają ze względu na format ich wyjścia.

Jak to działa

Workflow jest uruchamiany ręcznie lub zgodnie z harmonogramem co godzinę. Pobiera dane z arkusza Google Spreadsheet, aby uzyskać konfigurację promptów/kontekstu oraz tematy blogowe wraz z ich statusem i następną akcją. W zależności od statusu i akcji każdego tematu, wykorzystuje model LLM do kolejnej akcji ("plan"→"draft"→"final") lub publikuje napisaną treść na blogu WordPress ("publish").

Kroki konfiguracji

  1. Zaimportuj workflow.
  2. Utwórz własną kopię arkusza Google Spreadsheet.
  3. Zaktualizuj dane uwierzytelniające, używając indywidualnych danych dla:
    • Google Spreadsheets
    • OpenRouter
  4. Edytuj węzeł "Settings" i wprowadź indywidualne wartości dla:
    • URL Twojej kopii arkusza
    • URL Twojego bloga WordPress
    • Nazwa użytkownika WordPress
    • Hasło aplikacji WordPress (ciąg 4x4 znaków alfanumerycznych), które prawdopodobnie musisz najpierw utworzyć, a Twój użytkownik WordPress musi mieć włączoną uwierzytelnianie dwuskładnikowe.
  5. W swojej kopii arkusza:
    • Dostosuj kolumnę "Value" w arkuszu "Config" dla promptów/kontekstu itp.
    • Wypełnij arkusz "Schedule" co najmniej jednym wierszem, w którym określisz:
      • "Topic"
      • "Schedulded" date (YYYY-MM-DD HH:mm:ss)
      • "Status" jako "idea"
      • "Action" jako "plan" (aby rozpocząć tę akcję)

Przykłady zastosowań

Ta automatyzacja może być szczególnie przydatna dla twórców treści, marketerów i właścicieli firm, którzy chcą usprawnić proces publikowania postów na blogu. Oto kilka potencjalnych zastosowań:

  • Automatyczne generowanie pomysłów na posty blogowe w oparciu o trendy branżowe.
  • Tworzenie spersonalizowanych treści dla różnych segmentów odbiorców.
  • Optymalizacja harmonogramu publikacji w celu maksymalizacji zaangażowania.
  • Generowanie wstępnych szkiców postów, które można następnie edytować i dostosowywać.
  • Automatyczne publikowanie gotowych treści na blogu WordPress, oszczędzając czas i wysiłek.
  • Współpraca zespołowa, gdzie członkowie zespołu mogą przeglądać i edytować treści przed publikacją.
  • Testowanie różnych promptów i modeli LLM w celu znalezienia najbardziej efektywnych kombinacji.


   Skopiuj kod szablonu   
{"id":"b0KRVIuuUxE5afHo","meta":{"instanceId":"98bf0d6aef1dd8b7a752798121440fb171bf7686b95727fd617f43452393daa3","templateCredsSetupCompleted":true},"name":"Blog Automation TEMPLATE","tags":[{"id":"uumvgGHY5e6zEL7V","name":"Published Template","createdAt":"2025-02-10T11:18:10.923Z","updatedAt":"2025-02-10T11:18:10.923Z"}],"nodes":[{"id":"20e00146-6bda-4a8a-9544-bf7e5fd4e12e","name":"Settings","type":"n8n-nodes-base.set","position":[-420,-160],"parameters":{"options":{},"assignments":{"assignments":[{"id":"528b371f-0fba-4be1-9801-0502652da23e","name":"urlSpreadsheet","type":"string","value":"https://docs.google.com/spreadsheets/d/1Kg1-U6mJF4bahH1jCw8kT48MiKz1UMC5n-9q77BHM3Q/edit?gid=0#gid=0"},{"id":"1be018c7-51fe-4ea2-967d-ce47a2e8795c","name":"urlWordpress","type":"string","value":"SUBDOMAIN.wordpress.com"},{"id":"95377f4f-184b-46a7-94c7-b2313c314cb2","name":"wordpressUsername","type":"string","value":"YourUserName"},{"id":"fdc99dc6-d9b0-4d2f-b770-1d8b6b360cad","name":"wordpressApplicationPassword","type":"string","value":"y0ur app1 p4ss w0rd"},{"id":"517cb9ff-24fc-41d6-8bcc-253078f56356","name":"sheetSchedule","type":"string","value":"=Schedule"},{"id":"584e11da-546b-4472-8674-33ca7e8f4f30","name":"sheetConfig","type":"string","value":"Config"},{"id":"ba38cb1e-fd97-4aed-9147-1946c318ddab","name":"actionPublish","type":"string","value":"publish"},{"id":"678394b5-20af-4718-9249-4ff6a3c77018","name":"actionUpdate","type":"string","value":""},{"id":"f375b2fa-8772-4313-9d6b-a104edd918b3","name":"sheetLog","type":"string","value":"Log"},{"id":"3d7f9677-c753-4126-b33a-d78ef701771f","name":"","type":"string","value":""}]}},"typeVersion":3.4},{"id":"35731842-9215-43df-9009-9b130d663237","name":"ScheduleTrigger","type":"n8n-nodes-base.scheduleTrigger","position":[-620,-280],"parameters":{"rule":{"interval":[{"field":"hours"}]}},"typeVersion":1.2},{"id":"4c284d44-ac46-4cdf-9dcb-727b464269a0","name":"ManualTrigger","type":"n8n-nodes-base.manualTrigger","position":[-620,-100],"parameters":{},"typeVersion":1},{"id":"b63e7345-67d0-4761-8c1a-49275f34e88d","name":"Schedule","type":"n8n-nodes-base.googleSheets","position":[-220,-80],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"name","value":"={{ $('Settings').item.json.sheetSchedule }}"},"documentId":{"__rl":true,"mode":"url","value":"={{ $('Settings').item.json.urlSpreadsheet }}"}},"credentials":{"googleSheetsOAuth2Api":{"id":"XeXufn5uZvHp3lcX","name":"Google Sheets account 2"}},"notesInFlow":true,"typeVersion":4.5},{"id":"5fed06a3-3188-4aed-8040-04e245b74e20","name":"Config","type":"n8n-nodes-base.code","position":[40,-220],"parameters":{"jsCode":"let a = $("fetchConfig").all();nlet params = {};na.forEach(p => params[p.json.Key] = p.json.Value);nnreturn params;n"},"typeVersion":2},{"id":"685490c8-6b45-40c2-b4db-e97a81c4be8e","name":"fetchConfig","type":"n8n-nodes-base.googleSheets","position":[-220,-220],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"name","value":"={{ $('Settings').item.json.sheetConfig }}"},"documentId":{"__rl":true,"mode":"url","value":"={{ $('Settings').item.json.urlSpreadsheet }}"}},"credentials":{"googleSheetsOAuth2Api":{"id":"XeXufn5uZvHp3lcX","name":"Google Sheets account 2"}},"notesInFlow":true,"typeVersion":4.5},{"id":"52a39db8-f9cc-44bb-9c3e-a9abf5821a04","name":"AgentLLM","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[-400,440],"parameters":{"model":"={{ $json.model }}","options":{}},"credentials":{"openAiApi":{"id":"66JEQJ5kJel1P9t3","name":"OpenRouter"}},"typeVersion":1.1},{"id":"6a311ac4-032b-42da-b06e-c916209d2843","name":"IfScheduledNow","type":"n8n-nodes-base.if","position":[-620,780],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"bb707069-b372-4bbd-8ba5-b7f6b492ab9d","operator":{"type":"number","operation":"gte"},"leftValue":"={{ DateTime.now().ts }}","rightValue":"={{ DateTime.fromFormat($json.row.Scheduled, "yyyy-MM-dd HH:mm:ss").ts }}"}]},"looseTypeValidation":true},"typeVersion":2.2},{"id":"845e419b-15ad-4548-86c5-44bda0433b71","name":"PreparedData","type":"n8n-nodes-base.code","position":[40,-80],"parameters":{"mode":"runOnceForEachItem","jsCode":"function replacePlaceholders(text, row, config) {n function checkProp(prop, lookup) {n // console.log('checkProp:' + prop);n if (!lookup.hasOwnProperty(prop)) return false;n let value = lookup[prop];n if (typeof(value) == 'string') {n value = value.trim();n if (value == '') return false;n }n // console.log('checkProp found:', value)n return value;n }n function replaceMatch(fullMatch, prop) { n prop = prop.trim();n // Return the corresponding valuen return checkProp(prop, row)n || checkProp(prop, config)n || checkProp(prop + checkProp('Context', row), config)n || `[could not find "${ prop }]"`;n }nn if (typeof(text) != 'string') return '';nn // Regex to capture {{ ... }}n const pattern = /\{\{\s*([^}]+)\s*\}\}/gn const result = text.replace(pattern, replaceMatch);n return result.trim();n}nnconst row = $json;nconst settings = $("Settings").first().json;nconst config = $("Config").first().json;nconst prompt_key = 'prompt_' + row.Action;nconst prompt = replacePlaceholders(config[prompt_key], row, config);nconst model_key = prompt_key + '_model';nconst model = replacePlaceholders(config[model_key], row, config);nconst outputFormat = config[prompt_key + '_outputFormat'];nconst takeAction = row.Action != row.Status;nconst action = row.Actionnn// console.log('prompt', prompt);nn// console.log(prompt);nreturn { takeAction, action, model_key, model, prompt_key, prompt, outputFormat, row, config, settings }"},"typeVersion":2},{"id":"db294805-df67-4266-919f-94fb0f32c593","name":"RecombinedDataRow","type":"n8n-nodes-base.code","position":[40,280],"parameters":{"mode":"runOnceForEachItem","jsCode":"/**n * Attempts to parse the "text" property in a JSON objectn * that may contain malformed or incorrectly escaped JSON.n *n * @param {Object} raw - A string to parse.n * @returns {Object|null} The parsed JSON object if successful, or null if all attempts fail.n */nfunction parseTextAsJson(raw) {n // 1) First, try a direct parse.n try {n return JSON.parse(raw);n } catch (e) {n // Continue to next strategyn }nn // Common "fix-up" strategies:n // Strategy A: Attempt to remove over-escaped quotes like `\\"` -> `"`n try {n const fixedA = raw.replace(/\\"/g, '"');n return JSON.parse(fixedA);n } catch (e) {n // Continuen }nn // Strategy B: Remove escaped newlines, tabs, carriage returns if they’re suspectedn try {n const fixedB = rawn .replace(/\\n/g, ' ')n .replace(/\\r/g, ' ')n .replace(/\\t/g, ' ');n return JSON.parse(fixedB);n } catch (e) {n // Continuen }nn // Strategy C: Replace single quotes with double quotes (useful if the JSON was incorrectly quoted).n // NOTE: This is a very rough fix. If your data legitimately includes single quotes you may needn // a more nuanced approach.n try {n const fixedC = raw.replace(/'/g, '"');n return JSON.parse(fixedC);n } catch (e) {n // Continuen }nn // Strategy D: Combine strategies or chain them if needed:n // For example, single-quote fix plus removing new lines, etc.n try {n let fixedD = raw.replace(/\\"/g, '"');n fixedD = fixedD.replace(/\\n|\\r|\\t/g, ' ');n fixedD = fixedD.replace(/'/g, '"');n return JSON.parse(fixedD);n } catch (e) {n // If all attempts fail, log or handle the error as neededn console.error('Could not parse "text" property as JSON.', e);n return { 'Fulltext': raw };n }n}nnfunction isolateCurlySubstring(str) {n // This pattern greedily matches everything from the first '{' to the last '}'.n const match = str.match(/\{[\s\S]*\}/);n n // If a match is found, return it; otherwise return the entire string.n return match ? match[0] : str;n}nnfunction fixJsonSyntax(str) {n str = str.replace('\"', '"');n str = strn .split(/("[^"]*"|'[^']*')/)n .map((part, i) => i % 2 ? part : part.replace(/\n/g, " "))n .join("");n return str;n}nnfunction normalizeLLMOutput(param, iteration = 3) {n // If it's not an object or it's null or an array, just return it as is.n // (In some workflows, you might decide to throw an error or handle differently.)n if (!iteration || typeof param !== 'object' || param === null || Array.isArray(param)) {n return param;n }nn // Get the object's own property keysn const keys = Object.keys(param);nn // If there's more than one property, we assume it's already the complex object we want.n if (keys.length > 1) {n // console.log('keys > 1 → return param', param);n return param;n }nn // If there are no properties, just return it (though this is likely an empty object).n if (keys.length === 0) {n return param;n }nn // If there's exactly one property, it might be a JSON-string that we need to parse.n const singleKey = keys[0];n const value = param[singleKey];n // If that single property is a string, fix it and try to parse it as JSON.n if (typeof value === 'string') {n try {n return parseTextAsJson(isolateCurlySubstring(value));n } catch (e) {n console.log('value is string → parse failed with error:', e.toString(), '→ return param:', param, 'value:', value);n // Parsing failed; perhaps it's just a plain string or invalid JSON, so return as is.n return param;n }n }nn // Otherwise, repeat this process itratively.n return normalizeLLMOutput(value, iteration-1);n}nnconst preparedData = $("PreparedData").itemMatching($itemIndex).json;nconst row = preparedData.row;nlet gen = normalizeLLMOutput($json);nlet fulltext = gen.hasOwnProperty('Fulltext') ? gen.Fulltext : gen;nn// Append any fulltext field returned to the fieldn// in our data row corresponding to the current action. ngen[row.Action] = fulltext;nn// Concatenate any generated fields with those already exisitingn// in our data row (using seperator if necessary),n// so we don't loose any pre-entered data.nconst combined = {};nObject.keys(gen).forEach(key => {n const a = String(row[key] ?? "");n const b = String(gen[key]);n combined[key] = (a && b) ? (a + "\n---\n" + b) : (a || b);n});nn// Add the row number and set the new status to the action just performed.ncombined.row_number = row.row_number;ncombined.Status = row.Action;ncombined.model = preparedData.model;nnreturn combined;"},"typeVersion":2},{"id":"e0c993c1-678f-4236-8976-735cccb49fee","name":"SaveBackToSheet","type":"n8n-nodes-base.googleSheets","position":[480,280],"parameters":{"columns":{"value":{},"schema":[{"id":"ID","type":"string","display":true,"removed":false,"required":false,"displayName":"ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Topic","type":"string","display":true,"removed":false,"required":false,"displayName":"Topic","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Scheduled","type":"string","display":true,"removed":false,"required":false,"displayName":"Scheduled","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Status","type":"string","display":true,"removed":false,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Action","type":"string","display":true,"removed":false,"required":false,"displayName":"Action","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Context","type":"string","display":true,"removed":false,"required":false,"displayName":"Context","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Idea","type":"string","display":true,"removed":false,"required":false,"displayName":"Idea","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Content","type":"string","display":true,"removed":false,"required":false,"displayName":"Content","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Length","type":"string","display":true,"removed":false,"required":false,"displayName":"Length","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Media","type":"string","display":true,"removed":false,"required":false,"displayName":"Media","defaultMatch":false,"canBeUsedToMatch":true},{"id":"LinksInternal","type":"string","display":true,"removed":false,"required":false,"displayName":"LinksInternal","defaultMatch":false,"canBeUsedToMatch":true},{"id":"LinksExternal","type":"string","display":true,"removed":false,"required":false,"displayName":"LinksExternal","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Title","type":"string","display":true,"removed":false,"required":false,"displayName":"Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Sections","type":"string","display":true,"removed":false,"required":false,"displayName":"Sections","defaultMatch":false,"canBeUsedToMatch":true},{"id":"MainPoints","type":"string","display":true,"removed":false,"required":false,"displayName":"MainPoints","defaultMatch":false,"canBeUsedToMatch":true},{"id":"GuidingPrinciple","type":"string","display":true,"removed":false,"required":false,"displayName":"GuidingPrinciple","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Metaphor","type":"string","display":true,"removed":false,"required":false,"displayName":"Metaphor","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Draft","type":"string","display":true,"removed":false,"required":false,"displayName":"Draft","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Final","type":"string","display":true,"removed":false,"required":false,"displayName":"Final","defaultMatch":false,"canBeUsedToMatch":true},{"id":"internal notes","type":"string","display":true,"removed":false,"required":false,"displayName":"internal notes","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"string","display":true,"removed":false,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"autoMapInputData","matchingColumns":["row_number"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{"handlingExtraData":"ignoreIt"},"operation":"update","sheetName":{"__rl":true,"mode":"name","value":"={{ $('Settings').item.json.sheetSchedule }}"},"documentId":{"__rl":true,"mode":"url","value":"={{ $('Settings').item.json.urlSpreadsheet }}"}},"credentials":{"googleSheetsOAuth2Api":{"id":"XeXufn5uZvHp3lcX","name":"Google Sheets account 2"}},"typeVersion":4.5},{"id":"e0b982d9-d24e-4fd0-bc03-8642cd4c988b","name":"IfActionPublish","type":"n8n-nodes-base.if","position":[500,-80],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"c3735d0d-da54-44e7-afe6-fdfacb6117f2","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.row.Action }}","rightValue":"={{ $('Settings').item.json.actionPublish }}"}]}},"typeVersion":2.2},{"id":"1d5c2731-61a1-434c-bdf1-294217e4ac1c","name":"IfTakeAction","type":"n8n-nodes-base.if","position":[260,-80],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"85536861-b213-4567-9c9a-f844a28b5405","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.takeAction }}","rightValue":""}]}},"typeVersion":2.2},{"id":"aae766a4-d29e-4357-a344-74ee36a382e1","name":"IfPromptExists","type":"n8n-nodes-base.if","position":[-600,280],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"73333657-16ed-4b0d-a81f-34add6c22a1b","operator":{"type":"string","operation":"notEmpty","singleValue":true},"leftValue":"={{ $json.prompt }}","rightValue":""}]}},"typeVersion":2.2},{"id":"5b4c4bdf-8997-4c19-8e95-8c84b725404c","name":"Basic LLM Chain","type":"@n8n/n8n-nodes-langchain.chainLlm","position":[-360,280],"parameters":{"text":"={{ $json.prompt }}","promptType":"define"},"typeVersion":1.5},{"id":"8dc422a3-6b86-4f57-8c4c-df6422f72f57","name":"CreatePost","type":"n8n-nodes-base.httpRequest","position":[-220,780],"parameters":{"url":"=https://{{ $('Settings').item.json.urlWordpress }}/xmlrpc.php","body":"={{ $json.xmlRequestBody }}","method":"POST","options":{},"sendBody":true,"contentType":"raw","sendHeaders":true,"rawContentType":"text/xml","headerParameters":{"parameters":[{"name":"Content-Type","value":"text/xml"}]}},"typeVersion":4.2},{"id":"6ad42453-d56b-4bae-aaf3-eb689df998cc","name":"SetToPublish","type":"n8n-nodes-base.googleSheets","position":[700,780],"parameters":{"columns":{"value":{"Status":"={{ $('Settings').item.json.actionPublish }}","row_number":"={{ $('PreparedData').item.json.row.row_number }}"},"schema":[{"id":"ID","type":"string","display":true,"removed":false,"required":false,"displayName":"ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Topic","type":"string","display":true,"removed":false,"required":false,"displayName":"Topic","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Scheduled","type":"string","display":true,"removed":false,"required":false,"displayName":"Scheduled","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Status","type":"string","display":true,"removed":false,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Action","type":"string","display":true,"removed":false,"required":false,"displayName":"Action","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Context","type":"string","display":true,"removed":false,"required":false,"displayName":"Context","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Ideas","type":"string","display":true,"removed":false,"required":false,"displayName":"Ideas","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Content","type":"string","display":true,"removed":false,"required":false,"displayName":"Content","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Length","type":"string","display":true,"removed":false,"required":false,"displayName":"Length","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Media","type":"string","display":true,"removed":false,"required":false,"displayName":"Media","defaultMatch":false,"canBeUsedToMatch":true},{"id":"LinksInternal","type":"string","display":true,"removed":false,"required":false,"displayName":"LinksInternal","defaultMatch":false,"canBeUsedToMatch":true},{"id":"LinksExternal","type":"string","display":true,"removed":false,"required":false,"displayName":"LinksExternal","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Sections","type":"string","display":true,"removed":false,"required":false,"displayName":"Sections","defaultMatch":false,"canBeUsedToMatch":true},{"id":"MainPoints","type":"string","display":true,"removed":false,"required":false,"displayName":"MainPoints","defaultMatch":false,"canBeUsedToMatch":true},{"id":"GuidingPrinciple","type":"string","display":true,"removed":false,"required":false,"displayName":"GuidingPrinciple","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Metaphor","type":"string","display":true,"removed":false,"required":false,"displayName":"Metaphor","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Title","type":"string","display":true,"removed":false,"required":false,"displayName":"Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"draft","type":"string","display":true,"removed":false,"required":false,"displayName":"draft","defaultMatch":false,"canBeUsedToMatch":true},{"id":"words","type":"string","display":true,"removed":false,"required":false,"displayName":"words","defaultMatch":false,"canBeUsedToMatch":true},{"id":"final","type":"string","display":true,"removed":false,"required":false,"displayName":"final","defaultMatch":false,"canBeUsedToMatch":true},{"id":"words","type":"string","display":true,"removed":false,"required":false,"displayName":"words","defaultMatch":false,"canBeUsedToMatch":true},{"id":"TeaserTitle","type":"string","display":true,"removed":false,"required":false,"displayName":"TeaserTitle","defaultMatch":false,"canBeUsedToMatch":true},{"id":"TeaserText","type":"string","display":true,"removed":false,"required":false,"displayName":"TeaserText","defaultMatch":false,"canBeUsedToMatch":true},{"id":"internal notes","type":"string","display":true,"removed":false,"required":false,"displayName":"internal notes","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"string","display":true,"removed":false,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["row_number"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"name","value":"={{ $('Settings').item.json.sheetSchedule }}"},"documentId":{"__rl":true,"mode":"url","value":"={{ $('Settings').item.json.urlSpreadsheet }}"}},"credentials":{"googleSheetsOAuth2Api":{"id":"XeXufn5uZvHp3lcX","name":"Google Sheets account 2"}},"typeVersion":4.5},{"id":"a1af0f00-de59-48d4-93d2-9cc20e7f1c1c","name":"PrepareXmlPost","type":"n8n-nodes-base.code","position":[-380,780],"parameters":{"mode":"runOnceForEachItem","jsCode":"const username = $('Settings').item.json.wordpressUsername;nconst password = $('Settings').item.json.wordpressApplicationPassword;nconst blogId = 0;nconst published = 1; // 0 = draft, 1 = publishednconst title = $json.row.Title;nconst text = $json.row.final;nn// Helper function to escape XML special charactersnfunction escapeXml(unsafe) {n return unsafe.replace(/[<>&'"]/g, (c) => {n switch (c) {n case '<': return '<';n case '>': return '>';n case '&': return '&';n case '\'': return ''';n case '"': return '"';n default: return c;n }n });n}nn// Your actual post text, which may contain characters needing escapingnconst titleEscaped = escapeXml(title);nconst textEscaped = escapeXml(text);nn// Build the XML payloadnconst xmlData = `nn wp.newPostn nn ${blogId}nnn ${username}nnn ${password}nnn n n n post_titlen ${titleEscaped}n n n post_contentn ${textEscaped}n n n nnn ${published}nn n`;nnn// Add a new field called 'myNewField' to the JSON of the itemn$input.item.json.xmlRequestBody = xmlData;nnreturn $input.item;"},"typeVersion":2},{"id":"00e6d2ab-6dc4-42ba-8a92-04a35d104908","name":"HandleXMLRPCResponse","type":"n8n-nodes-base.code","position":[40,780],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Get the XML response from the incoming JSONnconst xmlResponse = $json.data;nn// Helper function to extract a value by matching a regex patternnfunction extractValue(pattern, xml) {n const match = xml.match(pattern);n return match ? match[1] : null;n}nn// Check if the XML contains a faultnif (xmlResponse.indexOf("") !== -1) {n // Extract the faultCode and faultString using regexn // This regex matches the value inside or for faultCoden const faultCode = extractValue(/faultCode<\/name>\s*<(?:int|string)>(.*?)<\/(?:int|string)>/s, xmlResponse);n // This regex extracts the faultString from within n const faultString = extractValue(/faultString<\/name>\s*(.*?)<\/string>/s, xmlResponse);n return { 'errorCode': faultCode, 'error': faultString };n} else {n // Otherwise, assume a successful response.n // The post ID is contained inside a tag within n const postId = extractValue(/[\s\S]*?(.*?)<\/string>/, xmlResponse);n return { postId };n}"},"typeVersion":2},{"id":"23212e92-4ad1-4a8c-8e0a-04d8d2a4511d","name":"PostingSuccessful","type":"n8n-nodes-base.if","position":[480,780],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"815d85a1-8f91-4338-977f-503f02c53ea2","operator":{"type":"string","operation":"exists","singleValue":true},"leftValue":"={{ $('HandleXMLRPCResponse').item.json.postId }}","rightValue":""}]}},"typeVersion":2.2},{"id":"45c786f0-d795-4ed4-b6d2-f005b43e797f","name":"LogStatus","type":"n8n-nodes-base.googleSheets","position":[260,280],"parameters":{"columns":{"value":{"Date":"={{ $now }}","Type":"=info","Message":"=Status {{ $json.Status }} for row {{ $('PreparedData').item.json.row.row_number }}"},"schema":[{"id":"Date","type":"string","display":true,"required":false,"displayName":"Date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Type","type":"string","display":true,"required":false,"displayName":"Type","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Message","type":"string","display":true,"required":false,"displayName":"Message","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"name","value":"={{ $('Settings').item.json.sheetLog }}"},"documentId":{"__rl":true,"mode":"url","value":"={{ $('Settings').item.json.urlSpreadsheet }}"}},"credentials":{"googleSheetsOAuth2Api":{"id":"XeXufn5uZvHp3lcX","name":"Google Sheets account 2"}},"typeVersion":4.5},{"id":"f58306f5-a5e9-4e44-9c5d-3810e18e6605","name":"LogPublished","type":"n8n-nodes-base.googleSheets","position":[260,780],"parameters":{"columns":{"value":{"Date":"={{ $now }}","Type":"={{ $json.errorCode ? 'error' : 'info' }}","Message":"=Publishing row {{ $('PreparedData').item.json.row.row_number }}: {{ $json.postId }}{{ $json.errorCode }}{{ $json.error }}"},"schema":[{"id":"Date","type":"string","display":true,"required":false,"displayName":"Date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Type","type":"string","display":true,"required":false,"displayName":"Type","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Message","type":"string","display":true,"required":false,"displayName":"Message","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"name","value":"={{ $('Settings').item.json.sheetLog }}"},"documentId":{"__rl":true,"mode":"url","value":"={{ $('Settings').item.json.urlSpreadsheet }}"}},"credentials":{"googleSheetsOAuth2Api":{"id":"XeXufn5uZvHp3lcX","name":"Google Sheets account 2"}},"typeVersion":4.5},{"id":"c227b790-e1ee-4370-9f24-a734443d1e97","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-460,-300],"parameters":{"width":180,"height":360,"content":"## Settings"},"typeVersion":1},{"id":"904da209-68fd-4139-885f-bd3f25034aeb","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-440,180],"parameters":{"color":3,"width":380,"height":380,"content":"## Author Blog-PostnUsing OpenRouter to make model fully configurable for each authoring stage"},"typeVersion":1},{"id":"29f35bf0-6dd3-4c3c-b688-73eb46781c87","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-40,-300],"parameters":{"color":5,"height":360,"content":"## Post-process Datan{{ Placehoder }} replacement"},"typeVersion":1},{"id":"296c3257-836d-488c-b048-72261180e286","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[220,180],"parameters":{"color":4,"width":180,"height":380,"content":"## Log to Sheet"},"typeVersion":1},{"id":"42a06803-087f-4dc4-9dd5-1f0281942a30","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[420,180],"parameters":{"color":6,"width":420,"height":380,"content":"## Save Result To Sheet"},"typeVersion":1},{"id":"7a6393e9-ae81-4b9b-856b-7be18f783cf4","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-440,620],"parameters":{"color":3,"width":380,"height":380,"content":"## Publish Blog-PostnUse a generic XMLHttpRequest with subsequent response handling, since the Wordpress node did not work at all."},"typeVersion":1},{"id":"2d154bd4-c3bc-4137-90ce-7885bac77c71","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-40,180],"parameters":{"color":5,"height":380,"content":"## Post-process DatanNormalize and re-merge output data structure. "},"typeVersion":1},{"id":"83834b00-a647-403f-b88a-4c38d9750eb0","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[-40,620],"parameters":{"color":5,"height":380,"content":"## Post-process DatanExtract post id or error message from response."},"typeVersion":1},{"id":"e7494d0b-b796-437e-b977-a5350b1a8dc5","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[220,620],"parameters":{"color":4,"width":180,"height":380,"content":"## Log to Sheet"},"typeVersion":1},{"id":"1d036f6a-c6e4-428d-b0ce-1e710eb7d90c","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[420,620],"parameters":{"color":6,"width":420,"height":380,"content":"## Save Status To Sheet"},"typeVersion":1},{"id":"105e0743-b4e8-47d7-a4bf-3939df43a43c","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[-640,160],"parameters":{"color":7,"width":1500,"height":420,"content":"## Authoringn## Stage"},"typeVersion":1},{"id":"80fefb90-35b2-4f0b-b4d5-1cca8519361d","name":"Sticky Note11","type":"n8n-nodes-base.stickyNote","position":[-640,600],"parameters":{"color":7,"width":1500,"height":420,"content":"## Publishingn## Stage"},"typeVersion":1},{"id":"99b0a7b7-6513-47b0-af16-ee66d37dd821","name":"Sticky Note12","type":"n8n-nodes-base.stickyNote","position":[-260,-300],"parameters":{"width":200,"height":360,"content":"## Config & Data"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"7005e556-a7ae-484c-af71-57c75abd3e17","connections":{"Config":{"main":[[]]},"AgentLLM":{"ai_languageModel":[[{"node":"Basic LLM Chain","type":"ai_languageModel","index":0}]]},"Schedule":{"main":[[{"node":"PreparedData","type":"main","index":0}]]},"Settings":{"main":[[{"node":"fetchConfig","type":"main","index":0},{"node":"Schedule","type":"main","index":0}]]},"LogStatus":{"main":[[{"node":"SaveBackToSheet","type":"main","index":0}]]},"CreatePost":{"main":[[{"node":"HandleXMLRPCResponse","type":"main","index":0}]]},"fetchConfig":{"main":[[{"node":"Config","type":"main","index":0}]]},"IfTakeAction":{"main":[[{"node":"IfActionPublish","type":"main","index":0}]]},"LogPublished":{"main":[[{"node":"PostingSuccessful","type":"main","index":0}]]},"PreparedData":{"main":[[{"node":"IfTakeAction","type":"main","index":0}]]},"SetToPublish":{"main":[[]]},"ManualTrigger":{"main":[[{"node":"Settings","type":"main","index":0}]]},"IfPromptExists":{"main":[[{"node":"Basic LLM Chain","type":"main","index":0}]]},"IfScheduledNow":{"main":[[{"node":"PrepareXmlPost","type":"main","index":0}]]},"PrepareXmlPost":{"main":[[{"node":"CreatePost","type":"main","index":0}]]},"Basic LLM Chain":{"main":[[{"node":"RecombinedDataRow","type":"main","index":0}]]},"IfActionPublish":{"main":[[{"node":"IfScheduledNow","type":"main","index":0}],[{"node":"IfPromptExists","type":"main","index":0}]]},"SaveBackToSheet":{"main":[[]]},"ScheduleTrigger":{"main":[[{"node":"Settings","type":"main","index":0}]]},"PostingSuccessful":{"main":[[{"node":"SetToPublish","type":"main","index":0}]]},"RecombinedDataRow":{"main":[[{"node":"LogStatus","type":"main","index":0}]]},"HandleXMLRPCResponse":{"main":[[{"node":"LogPublished","type":"main","index":0}]]}}}
  • CSV
  • Sheet
  • Spreadsheet
  • GS
  • API
  • Request
  • URL
  • Build
  • cURL
  • cpde
  • Javascript
  • JS
  • Python
  • Script
  • Custom Code
  • Function
  • LangChain
Planeta AI 2025 
magic-wandmenu linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram