{
  "id": "7vlFEfwMDxHgN4T5",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Twitter Auto Liking (Profile Post Extractor) - Creators Hub",
  "tags": [
    {
      "id": "Tl9QVfvwkdFQyffg",
      "name": "n8n Creators Hub",
      "createdAt": "2025-08-01T09:19:22.310Z",
      "updatedAt": "2025-08-01T09:19:22.310Z"
    }
  ],
  "nodes": [
    {
      "id": "c6e770b5-380e-4732-a13c-b1edd7cfd7f1",
      "name": "Wait1",
      "type": "n8n-nodes-base.wait",
      "position": [
        -112,
        -832
      ],
      "parameters": {
        "amount": 15
      },
      "typeVersion": 1.1
    },
    {
      "id": "6d9a71e8-f02e-4efa-ad2d-1405794b4591",
      "name": "Get Random Post",
      "type": "n8n-nodes-base.code",
      "position": [
        -2544,
        -832
      ],
      "parameters": {
        "jsCode": "const data = $input.all().map(item => item.json);\n\nif (!data || data.length === 0) {\n  throw new Error('No Instagram posts data found');\n}\n\n// Get a random post\nconst randomPost = data[Math.floor(Math.random() * data.length)];\n\n// Return only postUrl and description\nreturn {\n  json: {\n    postUrl: randomPost.tweetUrl\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "35c31150-4817-46ca-a455-ee96931ecbb1",
      "name": "Create CSV Binary",
      "type": "n8n-nodes-base.code",
      "position": [
        -1040,
        -832
      ],
      "parameters": {
        "jsCode": "// Extract correct values\nconst tweetUrl = $('Get Random Post').first().json.postUrl;\n\n// Clean utility\nconst clean = str => String(str || \"\").replace(/[\\u200B-\\u200D\\uFEFF]/g, \"\").trim();\n\n// Escape and quote single data row\nconst row = [\n  `\"${clean(tweetUrl).replace(/\"/g, '\"\"')}\"`\n];\n\n// Convert to buffer without header or BOM\nconst csvBuffer = Buffer.from(row.join(\",\") + \"\\n\", \"utf8\");\n\n// Return binary file\nreturn [\n  {\n    binary: {\n      data: {\n        data: csvBuffer,\n        mimeType: \"text/csv\",\n        fileName: \"phantombuster_clean.csv\"\n      }\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "2658a86d-7a7a-473a-8042-ce8ddd903073",
      "name": "Upload CSV",
      "type": "n8n-nodes-base.microsoftSharePoint",
      "position": [
        -848,
        -832
      ],
      "parameters": {
        "site": {
          "__rl": true,
          "mode": "list",
          "value": "plemeo.sharepoint.com,f304c34c-1252-4b99-a852-059c2036c718,c3bf26ab-bf44-4334-8e5b-e8b680bb9e1d",
          "cachedResultName": "plemeo"
        },
        "folder": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWAY4RSXX7PGSC5CL27V2Y7XYSNQZ",
          "cachedResultName": "Phantombuster"
        },
        "fileName": "twitter_posts_to_like.csv",
        "operation": "upload",
        "fileContents": "data",
        "requestOptions": {}
      },
      "credentials": {
        "microsoftSharePointOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a0c010f7-412c-4965-a553-b93a42ed1470",
      "name": "Get Response",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        128,
        -832
      ],
      "parameters": {
        "agentId": "7281446865767808",
        "operation": "getOutput",
        "additionalFields": {}
      },
      "credentials": {
        "phantombusterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7a3f97aa-8a1d-4cca-ab24-a1cacbc9ee92",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2096,
        -1360
      ],
      "parameters": {
        "color": 5,
        "width": 1400,
        "height": 400,
        "content": "## Get Twitter Posts By Scraping defined Profiles\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b2c79320-dc4f-42c4-90c0-22b9f496b990",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -944
      ],
      "parameters": {
        "width": 980,
        "height": 300,
        "content": "## Launch Autoliking Agent to Like Tweet\n"
      },
      "typeVersion": 1
    },
    {
      "id": "647d5d1d-6f10-4b40-831c-c9cb1dda30b9",
      "name": "Get Autoliking Agent",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        -560,
        -832
      ],
      "parameters": {
        "agentId": "275516550112020",
        "operation": "get"
      },
      "credentials": {
        "phantombusterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "cab368e6-7e0d-4e2b-8f12-3652003898c3",
      "name": "Launch AL Agent",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        -336,
        -832
      ],
      "parameters": {
        "agentId": "275516550112020",
        "jsonParameters": true,
        "additionalFields": {
          "argumentsJson": "={\n  \"spreadsheetUrl\": \"{{$('Upload CSV').item.json['@content.downloadUrl']}}\",\n  \"sessionCookie\": \"{{ $('Set ENV Variables').first().json.ENV_SESSION_COOKIE }}\"\n}"
        }
      },
      "credentials": {
        "phantombusterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "627f9fcc-6a94-46c2-8c7c-2c64f5bc9c4f",
      "name": "Set ENV Variables",
      "type": "n8n-nodes-base.set",
      "position": [
        -912,
        -1680
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e24e8c1a-c6c9-4ae2-a0ef-e0e7369dc262",
              "name": "ENV_SEARCH_HASHTAGS",
              "type": "string",
              "value": "={{ $json.output.parseJson().hashtag }}"
            },
            {
              "id": "cf050595-8ad9-4f78-bca4-f463e8b9982e",
              "name": "ENV_SESSION_COOKIE",
              "type": "string",
              "value": "={{ $('Select Cookie').first().json.output.parseJson().session_cookie }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "96caed29-d191-4da5-9d34-045c2c7a676f",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2032,
        -1680
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "triggerAtMinute": 5
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "cca8b3ac-2470-48f0-b53f-68b9ba7f61b4",
      "name": "Update file",
      "type": "n8n-nodes-base.microsoftSharePoint",
      "position": [
        -1216,
        -832
      ],
      "parameters": {
        "file": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWA3IDDODOJRNIRH3WEA77A27CBYU",
          "cachedResultName": "twitter_posts_already_liked.csv"
        },
        "site": {
          "__rl": true,
          "mode": "list",
          "value": "plemeo.sharepoint.com,f304c34c-1252-4b99-a852-059c2036c718,c3bf26ab-bf44-4334-8e5b-e8b680bb9e1d",
          "cachedResultName": "plemeo"
        },
        "folder": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWAY4RSXX7PGSC5CL27V2Y7XYSNQZ",
          "cachedResultName": "Phantombuster"
        },
        "fileName": "twitter_posts_already_liked.csv",
        "operation": "update",
        "fileContents": "data",
        "requestOptions": {},
        "changeFileContent": true
      },
      "credentials": {
        "microsoftSharePointOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "36fee782-f44a-4a74-b0e6-d32deba563a0",
      "name": "Download file",
      "type": "n8n-nodes-base.microsoftSharePoint",
      "position": [
        -2368,
        -832
      ],
      "parameters": {
        "file": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWA3IDDODOJRNIRH3WEA77A27CBYU",
          "cachedResultName": "twitter_posts_already_liked.csv"
        },
        "site": {
          "__rl": true,
          "mode": "list",
          "value": "plemeo.sharepoint.com,f304c34c-1252-4b99-a852-059c2036c718,c3bf26ab-bf44-4334-8e5b-e8b680bb9e1d",
          "cachedResultName": "plemeo"
        },
        "folder": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWAY4RSXX7PGSC5CL27V2Y7XYSNQZ",
          "cachedResultName": "Phantombuster"
        },
        "requestOptions": {}
      },
      "credentials": {
        "microsoftSharePointOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d0031b62-cf49-4ba1-81cf-ea06d245b24c",
      "name": "Check if in List",
      "type": "n8n-nodes-base.code",
      "position": [
        -2000,
        -832
      ],
      "parameters": {
        "jsCode": "const randomPost = normalizeUrl($('Get Random Post').first().json.postUrl);\nconst allItems = $('Extract from File').all();\n\nif (!allItems || allItems.length === 0) {\n  return [{ json: { isDuplicate: false } }];\n}\n\nfunction normalizeUrl(url) {\n  if (typeof url !== 'string') {\n    console.log(\"\ud83d\udea8 NOT A STRING:\", url);\n    return '';\n  }\n  return url.trim().toLowerCase().replace(/\\/$/, '');\n}\n\n// Helper function to get postUrl value regardless of BOM\nfunction getPostUrl(item) {\n  const json = item.json;\n  // Try normal field name first\n  if (json.postUrl) return json.postUrl;\n  \n  // Look for any field containing \"postUrl\"\n  const postUrlKey = Object.keys(json).find(key => key.includes('postUrl'));\n  return postUrlKey ? json[postUrlKey] : null;\n}\n\nconsole.log(\"\u2705 randomPost:\", randomPost);\nconsole.log(\"\u2705 allItems:\", allItems);\n\nlet isDuplicate = false;\n\nfor (const item of allItems) {\n  const candidateRaw = getPostUrl(item);\n  const candidate = normalizeUrl(candidateRaw);\n\n  console.log(`\ud83d\udfe0 Comparing:\\n\u2192 raw: ${candidateRaw}\\n\u2192 normalized: ${candidate}\\n\u2192 target: ${randomPost}`);\n\n  if (candidate === randomPost) {\n    isDuplicate = true;\n    break;\n  }\n}\n\nreturn [{ json: { isDuplicate } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "f36f1ef6-8869-4517-ad3c-850b1796df3e",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -1824,
        -832
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "bcef43b3-e773-45ba-b245-19ab3fc1e508",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $('Check if in List').first().json.isDuplicate }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "c7fc61b1-a07c-4b05-a16b-f0aef290e15f",
      "name": "Wait2",
      "type": "n8n-nodes-base.wait",
      "position": [
        -2704,
        -832
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "e61e59bb-ea2a-43c3-8392-41a6d37d9166",
      "name": "Prepare Updated Data",
      "type": "n8n-nodes-base.code",
      "position": [
        -1600,
        -832
      ],
      "parameters": {
        "jsCode": "const existingUrls = $('Extract from File').all().map(item => {\n  // Get the first key (which has the BOM) and use its value\n  const firstKey = Object.keys(item.json)[0];\n  return { postUrl: item.json[firstKey] };\n});\n\nconsole.log(\"existingUrls: \", existingUrls);\n\nconst randomPost = $('Get Random Post').first().json.postUrl;\nconsole.log(\"randomPost: \", randomPost);\n\nreturn [\n  ...existingUrls,\n  { postUrl: randomPost }\n].map(entry => ({ json: entry }));"
      },
      "typeVersion": 2
    },
    {
      "id": "787a8e4d-0db7-4d64-a944-563c25aabe6f",
      "name": "Extract from File",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -2176,
        -832
      ],
      "parameters": {
        "options": {
          "headerRow": true
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "8b8f121a-4559-47df-ba4a-e8be3c244eab",
      "name": "Convert to File",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        -1392,
        -832
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "3577e201-49d7-4532-a89d-25003d7e1de9",
      "name": "Get Available Session Cookies",
      "type": "n8n-nodes-base.microsoftSharePoint",
      "position": [
        -1776,
        -1680
      ],
      "parameters": {
        "file": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWA34GI5X5O5IFVHKQPOE25PSALOH",
          "cachedResultName": "twitter_session_cookies.txt"
        },
        "site": {
          "__rl": true,
          "mode": "list",
          "value": "plemeo.sharepoint.com,f304c34c-1252-4b99-a852-059c2036c718,c3bf26ab-bf44-4334-8e5b-e8b680bb9e1d",
          "cachedResultName": "plemeo"
        },
        "folder": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWAY4RSXX7PGSC5CL27V2Y7XYSNQZ",
          "cachedResultName": "Phantombuster"
        },
        "requestOptions": {}
      },
      "credentials": {
        "microsoftSharePointOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f6dd4baa-cdd1-4b55-b6b4-22f368feb428",
      "name": "Extract Cookies",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -1552,
        -1680
      ],
      "parameters": {
        "options": {},
        "operation": "text"
      },
      "typeVersion": 1
    },
    {
      "id": "d1265483-a58c-4822-87e1-a2de388469e5",
      "name": "Select Cookie",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1264,
        -1680
      ],
      "parameters": {
        "text": "=##################  PROMPT  ##################\n\n**ROLE:**  You are a session-cookie selector.\n\n**CURRENT BERLIN TIME**  \nDate\u2009&\u2009time : {{ $now.setZone('Europe/Berlin').format('DD HH:mm:ss') }}  \nHour (00-23): {{ $now.setZone('Europe/Berlin').format('HH') }}\n\n**SESSION COOKIES (keep order):**  \n{{ $json.data }}\n\n**SELECTION LOGIC**\n\n1. Let  \n   \u2022 N = number of cookies in the list (2 \u2264 N \u2264 4).  \n   \u2022 H = current hour as an integer (0\u201323).  \n   \u2022 W = 24 \u00f7 N \u2003(the width of each time slice in hours, always an integer).\n\n2. Determine the slice index:  \n   sliceIndex = floor(H \u00f7 W)\u2003\u2003// 0-based\n\n3. Choose the cookie at position *(sliceIndex + 1)* in the list.  \n   \u2022 Example when N = 4 (W = 6):  \n     00-05 \u2192 1st, 06-11 \u2192 2nd, 12-17 \u2192 3rd, 18-23 \u2192 4th  \n   \u2022 Example when N = 3 (W = 8):  \n     00-07 \u2192 1st, 08-15 \u2192 2nd, 16-23 \u2192 3rd  \n   \u2022 Example when N = 2 (W = 12):  \n     00-11 \u2192 1st, 12-23 \u2192 2nd\n\n**OUTPUT FORMAT**  \nReturn only the selected session cookie value in a valid JSON-Field called \"session_cookie\", nothing else.\n\n##############################################",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 2
    },
    {
      "id": "addb3be4-24ae-4dff-84ae-0a472ff200fb",
      "name": "OpenAI Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -1232,
        -1520
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "chatgpt-4o-latest",
          "cachedResultName": "chatgpt-4o-latest"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "0d837b39-b583-47f1-89a2-ecb9d08ff033",
      "name": "Get Profile Extractor Agent",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        -2016,
        -1216
      ],
      "parameters": {
        "agentId": "8659+1234567890",
        "operation": "get"
      },
      "credentials": {
        "phantombusterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3d1caf00-2462-43ed-80b2-4cfd03dd2fb8",
      "name": "Get List of Accounts",
      "type": "n8n-nodes-base.microsoftSharePoint",
      "position": [
        -1840,
        -1216
      ],
      "parameters": {
        "file": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWAYTFGE7UCNBL5FL6WE45C6RHJML",
          "cachedResultName": "twitter_profiles_to_scrape.csv"
        },
        "site": {
          "__rl": true,
          "mode": "list",
          "value": "plemeo.sharepoint.com,f304c34c-1252-4b99-a852-059c2036c718,c3bf26ab-bf44-4334-8e5b-e8b680bb9e1d",
          "cachedResultName": "plemeo"
        },
        "folder": {
          "__rl": true,
          "mode": "list",
          "value": "01M45PWAY4RSXX7PGSC5CL27V2Y7XYSNQZ",
          "cachedResultName": "Phantombuster"
        },
        "fileName": "twitter_profiles_to_scrape.csv",
        "operation": "update",
        "requestOptions": {}
      },
      "credentials": {
        "microsoftSharePointOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "81fbec14-f944-45cb-8100-d85ec61bb0f9",
      "name": "If Empty",
      "type": "n8n-nodes-base.if",
      "position": [
        -848,
        -1216
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "77805c7a-32a4-492e-9084-6a459e8d6b65",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.isEmpty() }}",
              "rightValue": "true"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "6023c9b1-c98f-4507-8b04-865c675da934",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1344,
        -1216
      ],
      "parameters": {
        "url": "https://api.phantombuster.com/api/v2/agents/fetch?id=8659+1234567890",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "phantombusterApi"
      },
      "credentials": {
        "phantombusterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ba1d5f3e-5304-49dc-9aad-ea0bb8237ffd",
      "name": "HTTP Request1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1184,
        -1216
      ],
      "parameters": {
        "url": "=https://phantombuster.s3.amazonaws.com/{{ $json.data?.orgS3Folder || $json.orgS3Folder }}/{{ $json.data?.s3Folder || $json.s3Folder }}/filtered_result.csv\n",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "phantombusterApi"
      },
      "credentials": {
        "phantombusterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "0a3c2d98-049f-46b5-8177-85264eb75688",
      "name": "Prepare Posts",
      "type": "n8n-nodes-base.code",
      "position": [
        -1008,
        -1216
      ],
      "parameters": {
        "jsCode": "// Split the \"data\" field into lines\nconst raw = $json[\"data\"] || \"\";\nconst lines = raw.split(\"\\n\").map(l => l.trim()).filter(Boolean);\n\n// First line is the header (\"tweetUrl\")\nconst header = lines.shift();\n\n// Build an array of { tweetUrl } objects\nreturn lines.map(url => {\n  return {\n    json: {\n      tweetUrl: url\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1777b14e-bb81-45df-9abd-231d3983f755",
      "name": "Wait3",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1504,
        -1216
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "c0d92811-5b1f-4209-8b3a-3a0b2ed14654",
      "name": "Launch Agent1",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        -1680,
        -1216
      ],
      "parameters": {
        "agentId": "={{ $('Get Profile Extractor Agent').item.json.id }}",
        "jsonParameters": true,
        "additionalFields": {
          "argumentsJson": "={\n  \"numberOfTweetsPerProfile\": 20,\n  \"feedType\": \"tweet\",\n  \"filters\": \"tweetLink\",\n  \"spreadsheetUrl\": \"{{$('Get List of Accounts').item.json['@content.downloadUrl']}}\",\n  \"sessionCookie\": \"{{$('Set ENV Variables').item.json.ENV_SESSION_COOKIE}}\"\n}"
        }
      },
      "credentials": {
        "phantombusterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8bbe1e90-0cfc-4b9f-9486-870f9c5f059a",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2096,
        -1792
      ],
      "parameters": {
        "color": 6,
        "width": 1400,
        "height": 400,
        "content": "## Start Workflow and Retrieve Session Cookie\n"
      },
      "typeVersion": 1
    },
    {
      "id": "809c4f0e-0166-424e-9568-0409af09bcab",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2480,
        -1792
      ],
      "parameters": {
        "width": 352,
        "height": 256,
        "content": "### 1) Hashtag & Cookie Selection  \n**What it does**  \n\u2022 Downloads cookie list \u2192 **Select Cookie** (GPT-4o) picks one based on time slice.  \n\n**Credentials**  \nOpenAI + SharePoint OAuth2.\n\n**Tweaks**    \n\u2022 Add/remove cookies in SharePoint file."
      },
      "typeVersion": 1
    },
    {
      "id": "9f503394-0d7a-46ea-98dc-caa1036d559d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2736,
        -944
      ],
      "parameters": {
        "color": 3,
        "width": 2040,
        "height": 300,
        "content": "## Get Random Post, Check if Already Liked and Upload to SharePoint\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7452d2d1-3d1a-42d6-bf73-de404305fffa",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2560,
        -1360
      ],
      "parameters": {
        "width": 432,
        "height": 304,
        "content": "### 2) Tweet Scraping & Deduplication  \n**What it does**  \n\u2022 Runs Phantombuster Profile Extractor Agent \u2192 gets ~20 tweets.  \n\u2022 Chooses one at random, compares with `twitter_posts_already_liked.csv`.\n\n**Credentials**  \nPhantombuster API + SharePoint OAuth2.\n\n**Tweaks**  \n\u2022 Change duplicate logic inside **Check if in List**."
      },
      "typeVersion": 1
    },
    {
      "id": "3d61e6bb-5311-4051-ac7e-94706f41e20d",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2736,
        -624
      ],
      "parameters": {
        "width": 464,
        "height": 272,
        "content": "### 3) CSV Upload & Auto-like Launch  \n**What it does**  \n\u2022 Creates a 1-row CSV with the chosen tweet URL.  \n\u2022 Uploads it to SharePoint and passes the public link to the Autolike Agent.\n\n**Credentials**  \nSharePoint OAuth2 + Phantombuster API.\n\n**Tweaks**  \n\u2022 Change file/folder names in **Upload CSV**.  \n\u2022 Replace SharePoint with another storage provider."
      },
      "typeVersion": 1
    },
    {
      "id": "5f001e85-76c2-457a-b9bc-693bff694259",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -624
      ],
      "parameters": {
        "width": 400,
        "height": 288,
        "content": "### 4) Rate Limiting & Scheduling  \n**What it does**  \n\u2022 Hourly **Schedule Trigger** plus **Wait** nodes throttle launches to \u22481 000 likes/day.\n\n**Credentials**  \nNone\n\n**Tweaks**  \n\u2022 Edit the cron rule or `Wait` durations to meet your own limits.  \n\u2022 Remove **Wait** nodes if Phantombuster limits are higher on your plan."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c4cb49d1-f823-4898-bd71-8d22d57bf2a7",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Wait2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Prepare Updated Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "Get Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait2": {
      "main": [
        [
          {
            "node": "Get Random Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait3": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Empty": {
      "main": [
        [],
        [
          {
            "node": "Wait2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload CSV": {
      "main": [
        [
          {
            "node": "Get Autoliking Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update file": {
      "main": [
        [
          {
            "node": "Create CSV Binary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "HTTP Request1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request1": {
      "main": [
        [
          {
            "node": "Prepare Posts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Launch Agent1": {
      "main": [
        [
          {
            "node": "Wait3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Posts": {
      "main": [
        [
          {
            "node": "If Empty",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Select Cookie": {
      "main": [
        [
          {
            "node": "Set ENV Variables",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to File": {
      "main": [
        [
          {
            "node": "Update file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Cookies": {
      "main": [
        [
          {
            "node": "Select Cookie",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Random Post": {
      "main": [
        [
          {
            "node": "Download file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Launch AL Agent": {
      "main": [
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if in List": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get Available Session Cookies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create CSV Binary": {
      "main": [
        [
          {
            "node": "Upload CSV",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Check if in List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set ENV Variables": {
      "main": [
        [
          {
            "node": "Get Profile Extractor Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "Select Cookie",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Get Autoliking Agent": {
      "main": [
        [
          {
            "node": "Launch AL Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get List of Accounts": {
      "main": [
        [
          {
            "node": "Launch Agent1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Updated Data": {
      "main": [
        [
          {
            "node": "Convert to File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Profile Extractor Agent": {
      "main": [
        [
          {
            "node": "Get List of Accounts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Available Session Cookies": {
      "main": [
        [
          {
            "node": "Extract Cookies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}