8
n8n 한국어amn8n.com

Bright Data MCP와 AIAgents를 사용하여 소셜 미디어 자료 검색 및 분석

고급

이것은Lead Generation, AI Summarization분야의자동화 워크플로우로, 50개의 노드를 포함합니다.주로 Set, Code, Form, Merge, Switch 등의 노드를 사용하며. AI를 사용하여 360도 소셜 미디어 보고서 - Bright Data MCP 생성

사전 요구사항
  • Google Drive API 인증 정보
  • OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "id": "B3qMasLQ1QMkxzGW",
  "meta": {
    "instanceId": "6665c2c703a55cd73d6f4e745f63a64420cb51f425e68de42882f34d312a7e40",
    "templateCredsSetupCompleted": true
  },
  "name": "Search and analyze social media profiles with Bright Data MCP and AIAgents",
  "tags": [],
  "nodes": [
    {
      "id": "19fda137-b8be-43b0-8828-0880db36deee",
      "name": "소셜 미디어 리서치 폼",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        352,
        336
      ],
      "webhookId": "a333c108-e2d5-4f37-9c75-5b0b10f3e8fb",
      "parameters": {
        "options": {},
        "formTitle": "Social Media Presence Researcher",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Full Name",
              "placeholder": "e.g., John Smith",
              "requiredField": true
            },
            {
              "fieldLabel": "Email Address",
              "placeholder": "e.g., john.smith@company.com"
            },
            {
              "fieldLabel": "Company/Organization",
              "placeholder": "e.g., TechCorp Inc"
            },
            {
              "fieldLabel": "Location",
              "placeholder": "e.g., San Francisco, CA"
            },
            {
              "fieldType": "textarea",
              "fieldLabel": "Known Social Handles",
              "placeholder": "Optional: List any known social media handles\nLinkedIn: john-smith\nTwitter: @jsmith\nGitHub: jsmith-dev"
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Search Depth",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Basic - Quick scan"
                  },
                  {
                    "option": "Comprehensive - Full analysis"
                  },
                  {
                    "option": "Deep - Maximum detail"
                  }
                ]
              },
              "requiredField": true
            },
            {
              "fieldType": "checkbox",
              "fieldLabel": "Platforms to Search",
              "fieldOptions": {
                "values": [
                  {
                    "option": "LinkedIn"
                  },
                  {
                    "option": "X/Twitter"
                  },
                  {
                    "option": "Instagram"
                  },
                  {
                    "option": "GitHub"
                  },
                  {
                    "option": "YouTube"
                  },
                  {
                    "option": "TikTok"
                  },
                  {
                    "option": "Facebook"
                  },
                  {
                    "option": "Reddit"
                  },
                  {
                    "option": "Pinterest"
                  },
                  {
                    "option": "Snapchat"
                  }
                ]
              }
            }
          ]
        },
        "formDescription": "Enter person details to discover and analyze their complete social media presence across all major platforms"
      },
      "typeVersion": 2.3
    },
    {
      "id": "e24ffee7-7895-4572-8de1-273baf764b8c",
      "name": "입력 검증기",
      "type": "n8n-nodes-base.code",
      "position": [
        576,
        336
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Get form data - handle both form and webhook inputs\nconst rawData = $input.item.json;\nconst formData = rawData.body || rawData; // Use body if it exists (webhook), otherwise use raw data (form)\n\n// Helper function to extract handles from text\nfunction parseKnownHandles(text) {\n  if (!text) return {};\n  \n  const handles = {};\n  const lines = text.split('\\n');\n  \n  lines.forEach(line => {\n    // Check for LinkedIn URLs or mentions\n    if (line.toLowerCase().includes('linkedin')) {\n      const urlMatch = line.match(/linkedin\\.com\\/in\\/([^/\\s?]+)/);\n      const textMatch = line.match(/linkedin:\\s*([A-Za-z0-9-]+)/i);\n      if (urlMatch) handles.linkedin = urlMatch[1];\n      else if (textMatch) handles.linkedin = textMatch[1];\n    }\n    \n    // Check for Twitter/X handles\n    if (line.toLowerCase().includes('twitter') || line.toLowerCase().includes('x:') || line.includes('@')) {\n      const match = line.match(/@([A-Za-z0-9_]+)|twitter:\\s*([A-Za-z0-9_]+)|x:\\s*([A-Za-z0-9_]+)/i);\n      if (match) handles.twitter = match[1] || match[2] || match[3];\n    }\n    \n    // Check for GitHub\n    if (line.toLowerCase().includes('github')) {\n      const urlMatch = line.match(/github\\.com\\/([A-Za-z0-9-]+)/);\n      const textMatch = line.match(/github:\\s*([A-Za-z0-9_-]+)/i);\n      if (urlMatch) handles.github = urlMatch[1];\n      else if (textMatch) handles.github = textMatch[1];\n    }\n    \n    // Check for Instagram\n    if (line.toLowerCase().includes('instagram')) {\n      const urlMatch = line.match(/instagram\\.com\\/@?([A-Za-z0-9_.]+)/);\n      const textMatch = line.match(/instagram:\\s*@?([A-Za-z0-9_.]+)/i);\n      if (urlMatch) handles.instagram = urlMatch[1];\n      else if (textMatch) handles.instagram = textMatch[1];\n    }\n    \n    // Check for YouTube\n    if (line.toLowerCase().includes('youtube')) {\n      const channelMatch = line.match(/youtube\\.com\\/(?:c\\/|@)([A-Za-z0-9_-]+)/);\n      const textMatch = line.match(/youtube:\\s*@?([A-Za-z0-9_-]+)/i);\n      if (channelMatch) handles.youtube = channelMatch[1];\n      else if (textMatch) handles.youtube = textMatch[1];\n    }\n    \n    // Check for Facebook\n    if (line.toLowerCase().includes('facebook')) {\n      const urlMatch = line.match(/facebook\\.com\\/([A-Za-z0-9.]+)/);\n      const textMatch = line.match(/facebook:\\s*([A-Za-z0-9.]+)/i);\n      if (urlMatch) handles.facebook = urlMatch[1];\n      else if (textMatch) handles.facebook = textMatch[1];\n    }\n    \n    // Check for TikTok\n    if (line.toLowerCase().includes('tiktok')) {\n      const urlMatch = line.match(/tiktok\\.com\\/@([A-Za-z0-9_.]+)/);\n      const textMatch = line.match(/tiktok:\\s*@?([A-Za-z0-9_.]+)/i);\n      if (urlMatch) handles.tiktok = urlMatch[1];\n      else if (textMatch) handles.tiktok = textMatch[1];\n    }\n  });\n  \n  return handles;\n}\n\n// Generate name variations for searching\nfunction generateNameVariations(fullName) {\n  if (!fullName) return [];\n  \n  const cleanName = fullName.trim();\n  const parts = cleanName.split(' ').filter(p => p); // Remove empty parts\n  const variations = new Set([cleanName]);\n  \n  if (parts.length === 1) {\n    // Single name - just return it\n    variations.add(parts[0]);\n  } else if (parts.length === 2) {\n    const [first, last] = parts;\n    variations.add(`${first} ${last}`);\n    variations.add(`${first}.${last}`);\n    variations.add(`${first}${last}`);\n    variations.add(`${first[0]}. ${last}`);\n    variations.add(`${first} ${last[0]}.`);\n    variations.add(`${last} ${first}`);\n    variations.add(`${last}, ${first}`);\n  } else if (parts.length === 3) {\n    const [first, middle, last] = parts;\n    variations.add(`${first} ${middle} ${last}`);\n    variations.add(`${first} ${last}`);\n    variations.add(`${first} ${middle[0]}. ${last}`);\n    variations.add(`${first[0]}. ${middle[0]}. ${last}`);\n    variations.add(`${last}, ${first} ${middle}`);\n    variations.add(`${last}, ${first}`);\n  } else if (parts.length >= 4) {\n    // Handle longer names (like Jean-Claude Van Damme Jr.)\n    // Take first and last parts as primary\n    const first = parts[0];\n    const last = parts[parts.length - 1];\n    const middle = parts.slice(1, -1).join(' ');\n    \n    variations.add(cleanName); // Full name\n    variations.add(`${first} ${last}`);\n    variations.add(`${last}, ${first}`);\n    if (middle) {\n      variations.add(`${first} ${middle[0]}. ${last}`);\n      variations.add(`${last}, ${first} ${middle}`);\n    }\n  }\n  \n  // Return as array\n  return Array.from(variations);\n}\n\n// Build search queries for each platform\nfunction buildSearchQueries(name, company, location, platform) {\n  const queries = [];\n  const baseQuery = `\"${name}\"`;\n  \n  switch(platform.toLowerCase()) {\n    case 'linkedin':\n      queries.push(`${baseQuery} site:linkedin.com/in`);\n      if (company) queries.push(`${baseQuery} \"${company}\" site:linkedin.com`);\n      if (location) queries.push(`${baseQuery} \"${location}\" site:linkedin.com`);\n      break;\n      \n    case 'x/twitter':\n      queries.push(`${baseQuery} site:twitter.com`);\n      queries.push(`${baseQuery} site:x.com`);\n      if (company) queries.push(`${baseQuery} \"${company}\" twitter`);\n      break;\n      \n    case 'github':\n      queries.push(`${baseQuery} site:github.com`);\n      if (company) queries.push(`${baseQuery} \"${company}\" github`);\n      break;\n      \n    case 'instagram':\n      queries.push(`${baseQuery} site:instagram.com`);\n      if (location) queries.push(`${baseQuery} \"${location}\" instagram`);\n      break;\n      \n    case 'youtube':\n      queries.push(`${baseQuery} site:youtube.com/@`);\n      queries.push(`${baseQuery} site:youtube.com/c/`);\n      if (company) queries.push(`${baseQuery} YouTube channel`);\n      break;\n      \n    case 'tiktok':\n      queries.push(`${baseQuery} site:tiktok.com/@`);\n      queries.push(`${baseQuery} TikTok`);\n      break;\n      \n    case 'facebook':\n      queries.push(`${baseQuery} site:facebook.com`);\n      if (location) queries.push(`${baseQuery} \"${location}\" facebook`);\n      break;\n      \n    case 'reddit':\n      queries.push(`${baseQuery} site:reddit.com/user`);\n      queries.push(`${baseQuery} reddit user`);\n      break;\n      \n    case 'pinterest':\n      queries.push(`${baseQuery} site:pinterest.com`);\n      break;\n      \n    case 'snapchat':\n      queries.push(`${baseQuery} snapchat`);\n      queries.push(`${baseQuery} \"snapcode\"`);\n      break;\n  }\n  \n  return queries;\n}\n\n// Validate required fields\nconst errors = [];\nif (!formData['Full Name']?.trim()) {\n  errors.push('Full Name is required');\n}\nif (!formData['Search Depth']) {\n  errors.push('Search Depth is required');\n}\nif (!formData['Platforms to Search'] || formData['Platforms to Search'].length === 0) {\n  errors.push('At least one platform must be selected');\n}\n\n// Process the form data\nconst validatedData = {\n  // Original inputs\n  fullName: formData['Full Name']?.trim() || '',\n  email: formData['Email Address']?.trim() || '',\n  company: formData['Company/Organization']?.trim() || '',\n  location: formData['Location']?.trim() || '',\n  searchDepth: formData['Search Depth'] || 'Comprehensive - Full analysis',\n  platformsToSearch: formData['Platforms to Search'] || [],\n  \n  // Parsed and generated data\n  knownHandles: parseKnownHandles(formData['Known Social Handles']),\n  nameVariations: generateNameVariations(formData['Full Name']),\n  \n  // Search configuration\n  searchConfig: {\n    depth: formData['Search Depth']?.includes('Basic') ? 'basic' : \n           formData['Search Depth']?.includes('Deep') ? 'deep' : 'comprehensive',\n    maxResultsPerPlatform: formData['Search Depth']?.includes('Basic') ? 5 : \n                           formData['Search Depth']?.includes('Deep') ? 20 : 10\n  },\n  \n  // Validation\n  isValid: errors.length === 0,\n  validationErrors: errors,\n  \n  // Timestamp\n  processedAt: new Date().toISOString()\n};\n\n// Build search queries for each selected platform\nvalidatedData.searchQueries = {};\nconst platforms = formData['Platforms to Search'] || [];\n\nif (validatedData.isValid) {\n  platforms.forEach(platform => {\n    validatedData.searchQueries[platform] = [];\n    \n    // Add queries for each name variation\n    validatedData.nameVariations.forEach(nameVar => {\n      const queries = buildSearchQueries(nameVar, formData['Company/Organization'], formData['Location'], platform);\n      validatedData.searchQueries[platform].push(...queries);\n    });\n    \n    // Remove duplicates\n    validatedData.searchQueries[platform] = [...new Set(validatedData.searchQueries[platform])];\n  });\n}\n\n// Add summary\nvalidatedData.summary = {\n  totalPlatforms: platforms.length,\n  hasKnownHandles: Object.keys(validatedData.knownHandles).length > 0,\n  nameVariationCount: validatedData.nameVariations.length,\n  totalSearchQueries: Object.values(validatedData.searchQueries).flat().length\n};\n\nreturn validatedData;"
      },
      "typeVersion": 2
    },
    {
      "id": "3b4ecc52-8cd6-43ee-8c14-33246c2b796e",
      "name": "Bright Data MCP",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "position": [
        2016,
        1456
      ],
      "parameters": {
        "options": {},
        "endpointUrl": "https://mcp.brightdata.com/mcp?token=YOUR_BRIGHT_DATA_TOKEN_HERE&unlocker=UNLOCKER_CODE_HERE&pro=1",
        "serverTransport": "httpStreamable"
      },
      "typeVersion": 1.1
    },
    {
      "id": "ac0cb825-f1a0-48db-9395-4f307f326c38",
      "name": "디스커버리 에이전트",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        864,
        336
      ],
      "parameters": {
        "text": "=You have been given information about {{ $json.fullName }} to find and verify their social media profiles.\n\n## Your Task:\nFind and verify social media profiles for this person across the platforms they selected.\n\n## Input Data:\n- Full Name: {{ $json.fullName }}\n- Company: {{ $json.company || \"Not provided\" }}\n- Location: {{ $json.location || \"Not provided\" }}\n- Email: {{ $json.email || \"Not provided\" }}\n- Known Handles: {{ JSON.stringify($json.knownHandles) }}\n- Platforms to Search: {{ JSON.stringify($json.platformsToSearch) }}\n- Search Depth: {{ $json.searchConfig.depth }}\n- Max Results Per Platform: {{ $json.searchConfig.maxResultsPerPlatform }}\n\n## Search Queries Available:\n{{ JSON.stringify($json.searchQueries, null, 2) }}\n\n## Instructions:\n\n1. **Search Phase**: For each platform in platformsToSearch:\n   - Use the search_engine tool with the provided queries\n   - Start with the first 2-3 queries per platform\n   - Look for profile URLs that match the person\n\n2. **Verification Phase**: For each potential profile found:\n   - Check if the profile name matches our target person\n   - Look for matching company, location, or other details\n   - Cross-reference with known handles if available\n   - Note any bio links that connect to other profiles\n\n3. **Confidence Scoring**: Assign confidence scores (0.0 to 1.0):\n   - 0.9-1.0: Perfect match (name, company, location all match)\n   - 0.7-0.9: Strong match (name matches, plus 1-2 other factors)\n   - 0.5-0.7: Possible match (name matches, some uncertainty)\n   - Below 0.5: Unlikely match (include only if no better options)\n\n4. **Evidence Collection**: For each profile, note:\n   - URL of the profile\n   - Handle/username\n   - Matching factors (what confirmed this is the right person)\n   - Any bio description or tagline\n   - Follower/connection count if visible\n\n## Important Guidelines:\n\n- If you find a profile with HIGH confidence on one platform, use that information to improve searches on other platforms\n- If known handles are provided, verify them first before searching\n- Use scrape_as_markdown if you need to get more details from a specific profile page\n- Limit your search to {{ $json.searchConfig.maxResultsPerPlatform }} results per platform\n- Focus on quality over quantity - better to have 3 verified profiles than 10 uncertain ones\n\n## Required Output Format:\nReturn your findings in the structured format defined by the output parser.",
        "options": {
          "systemMessage": "You are a Social Media Discovery Agent specialized in finding and verifying people's social media profiles across multiple platforms. You are thorough, analytical, and skilled at cross-referencing information to ensure accurate profile matching. You use search engines effectively and can identify the same person across different platforms by analyzing profile details, photos, bios, and cross-platform links."
        },
        "promptType": "define"
      },
      "retryOnFail": true,
      "typeVersion": 2.2
    },
    {
      "id": "cc09048c-a755-4725-93e9-6840dd176920",
      "name": "OpenAI 채팅 모델",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        800,
        560
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "3lTEzvz4p0zyelIS",
          "name": "OpenAi Romuald private"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c97b1714-0285-4d9c-8161-7f9619df1f3f",
      "name": "출력 검증기",
      "type": "n8n-nodes-base.code",
      "position": [
        1264,
        336
      ],
      "parameters": {
        "jsCode": "// Get the AI agent's output\nconst agentOutput = $input.item.json;\n\n// Helper function to normalize platform names\nfunction normalizePlatformName(platform) {\n  const mapping = {\n    'LinkedIn': 'linkedin',\n    'X/Twitter': 'twitter',\n    'Twitter': 'twitter',\n    'X': 'twitter',\n    'Instagram': 'instagram',\n    'GitHub': 'github',\n    'Youtube': 'youtube',\n    'YouTube': 'youtube',\n    'TikTok': 'tiktok',\n    'Facebook': 'facebook',\n    'Reddit': 'reddit',\n    'Pinterest': 'pinterest',\n    'Snapchat': 'snapchat'\n  };\n  \n  return mapping[platform] || platform.toLowerCase();\n}\n\n// Parse the agent's output\nlet discoveredProfiles = {};\nlet metadata = {\n  searchQueriesUsed: 0,\n  platformsChecked: 0,\n  profilesFound: 0,\n  highConfidenceProfiles: 0,\n  timeTakenSeconds: 0,\n  searchStartTime: new Date().toISOString(),\n  searchEndTime: new Date().toISOString()\n};\n\n// Parse the agent output\nlet parsedData = null;\ntry {\n  if (agentOutput.output && typeof agentOutput.output === 'string') {\n    // Parse the JSON string in the output field\n    parsedData = JSON.parse(agentOutput.output);\n  } else if (agentOutput.output && typeof agentOutput.output === 'object') {\n    parsedData = agentOutput.output;\n  } else if (agentOutput.profiles) {\n    parsedData = { profiles: agentOutput.profiles };\n  }\n} catch (e) {\n  console.error('Error parsing agent output:', e);\n}\n\n// Process the profiles OBJECT format (not array!)\nif (parsedData && parsedData.profiles && typeof parsedData.profiles === 'object') {\n  // Iterate over the platforms (object keys)\n  Object.entries(parsedData.profiles).forEach(([platform, profilesArray]) => {\n    const normalizedPlatform = normalizePlatformName(platform);\n    \n    // Check if this platform has any profiles found\n    if (profilesArray && Array.isArray(profilesArray) && profilesArray.length > 0) {\n      // Take the first (most confident) profile for each platform\n      const profile = profilesArray[0];\n      \n      discoveredProfiles[normalizedPlatform] = {\n        handle: profile.handle || profile.username || '',\n        url: profile.url || '',\n        confidence: profile.confidence_score || profile.confidence || 0.5,\n        markers: profile.matching_factors || [],\n        profileData: {\n          name: profile.name || '',\n          bio: profile.bio_description || profile.bio || '',\n          followers: profile.follower_count || profile.followers_connections || profile.followers || '',\n          company: profile.company || '',\n          location: profile.location || '',\n          notes: profile.notes || ''\n        }\n      };\n      \n      metadata.profilesFound++;\n      metadata.platformsChecked++;\n      \n      if (profile.confidence_score > 0.8 || profile.confidence > 0.8) {\n        metadata.highConfidenceProfiles++;\n      }\n    } else {\n      // Platform was checked but no profiles found\n      metadata.platformsChecked++;\n    }\n  });\n} else if (parsedData && parsedData.profilesDiscovered) {\n  // Handle the expected format if the agent returns it\n  discoveredProfiles = parsedData.profilesDiscovered;\n  if (parsedData.discoveryMetadata) {\n    metadata = { ...metadata, ...parsedData.discoveryMetadata };\n  }\n}\n\n// If still no profiles, try to extract from raw text\nif (Object.keys(discoveredProfiles).length === 0) {\n  const text = JSON.stringify(agentOutput);\n  \n  // Extract URLs using regex\n  const urlPatterns = {\n    linkedin: /linkedin\\.com\\/in\\/([a-zA-Z0-9-]+)/gi,\n    twitter: /(?:twitter|x)\\.com\\/([a-zA-Z0-9_]+)/gi,\n    github: /github\\.com\\/([a-zA-Z0-9-]+)/gi,\n    instagram: /instagram\\.com\\/@?([a-zA-Z0-9_.]+)/gi,\n    youtube: /youtube\\.com\\/(?:channel\\/|@)?([a-zA-Z0-9_-]+)/gi,\n    tiktok: /tiktok\\.com\\/@([a-zA-Z0-9_.]+)/gi\n  };\n  \n  for (const [platform, pattern] of Object.entries(urlPatterns)) {\n    const matches = text.matchAll(pattern);\n    for (const match of matches) {\n      if (!discoveredProfiles[platform]) {\n        discoveredProfiles[platform] = {\n          handle: match[1],\n          url: `https://${match[0]}`,\n          confidence: 0.5,\n          markers: [\"Found in search results\"],\n          profileData: {}\n        };\n        metadata.profilesFound++;\n      }\n    }\n  }\n}\n\n// Update platform count\nmetadata.platformsChecked = Object.keys(discoveredProfiles).length;\n\n// Build final output in the structure expected by the next nodes\nconst formattedOutput = {\n  profilesDiscovered: discoveredProfiles,\n  discoveryMetadata: metadata,\n  verificationDetails: {\n    crossPlatformLinks: [],\n    commonIdentifiers: {},\n    consistentData: {}\n  },\n  recommendedPrimaryProfiles: {},\n  searchErrors: [],\n  // Keep original input data for reference\n  originalInput: {\n    fullName: agentOutput.fullName || '',\n    company: agentOutput.company || '',\n    location: agentOutput.location || '',\n    email: agentOutput.email || ''\n  }\n};\n\n// Add verification details if we have multiple profiles\nif (Object.keys(discoveredProfiles).length > 1) {\n  // Extract common data across profiles\n  const allNames = new Set();\n  const allCompanies = new Set();\n  const allLocations = new Set();\n  \n  Object.values(discoveredProfiles).forEach(profile => {\n    if (profile.profileData) {\n      if (profile.profileData.name) allNames.add(profile.profileData.name);\n      if (profile.profileData.company) allCompanies.add(profile.profileData.company);\n      if (profile.profileData.location) allLocations.add(profile.profileData.location);\n    }\n  });\n  \n  formattedOutput.verificationDetails.consistentData = {\n    name: allNames.size === 1 ? Array.from(allNames)[0] : '',\n    company: allCompanies.size === 1 ? Array.from(allCompanies)[0] : '',\n    location: allLocations.size === 1 ? Array.from(allLocations)[0] : '',\n    profilePhoto: false // Would need actual photo comparison\n  };\n}\n\n// Add recommended profiles based on what was found\nif (discoveredProfiles.linkedin) {\n  formattedOutput.recommendedPrimaryProfiles.professional = {\n    platform: 'linkedin',\n    url: discoveredProfiles.linkedin.url,\n    reason: 'Primary professional network profile'\n  };\n}\n\nif (discoveredProfiles.twitter) {\n  formattedOutput.recommendedPrimaryProfiles.social = {\n    platform: 'twitter',\n    url: discoveredProfiles.twitter.url,\n    reason: 'Primary social media presence'\n  };\n}\n\nif (discoveredProfiles.github) {\n  formattedOutput.recommendedPrimaryProfiles.technical = {\n    platform: 'github',\n    url: discoveredProfiles.github.url,\n    reason: 'Primary technical/developer profile'\n  };\n}\n\nif (discoveredProfiles.youtube) {\n  formattedOutput.recommendedPrimaryProfiles.content = {\n    platform: 'youtube',\n    url: discoveredProfiles.youtube.url,\n    reason: 'Content creation and thought leadership'\n  };\n}\n\n// Add summary statistics\nformattedOutput.summary = {\n  totalProfilesFound: metadata.profilesFound,\n  highConfidenceMatches: metadata.highConfidenceProfiles,\n  platformsCovered: Object.keys(discoveredProfiles),\n  primaryProfile: formattedOutput.recommendedPrimaryProfiles.professional || \n                  formattedOutput.recommendedPrimaryProfiles.social || \n                  formattedOutput.recommendedPrimaryProfiles.technical ||\n                  null\n};\n\nreturn formattedOutput;"
      },
      "typeVersion": 2
    },
    {
      "id": "282c09b4-db66-4524-a4a8-67cb4433e1b6",
      "name": "프로필 검증기",
      "type": "n8n-nodes-base.code",
      "position": [
        1488,
        336
      ],
      "parameters": {
        "jsCode": "// Get discovered profiles from previous node\nconst discoveryOutput = $input.item.json;\nconst profiles = discoveryOutput.profilesDiscovered || {};\n\n// Initialize validation results\nconst validationResults = {\n  profilesValidated: {},\n  crossPlatformVerification: {\n    nameConsistency: 0,\n    locationConsistency: 0,\n    companyConsistency: 0,\n    overallConsistency: 0\n  },\n  confidenceScores: {},\n  verificationMatrix: {},\n  primaryIdentity: {\n    name: '',\n    company: '',\n    location: '',\n    email: '',\n    primaryPlatform: ''\n  },\n  validationFlags: [],\n  suggestedActions: []\n};\n\n// Extract all unique values across profiles\nconst names = new Set();\nconst companies = new Set();\nconst locations = new Set();\nconst bios = [];\nconst highestConfidenceProfile = { confidence: 0, platform: '' };\n\n// Analyze each profile\nObject.entries(profiles).forEach(([platform, profile]) => {\n  if (!profile || !profile.url) return;\n  \n  // Track confidence scores\n  validationResults.confidenceScores[platform] = profile.confidence || 0.5;\n  \n  // Track highest confidence profile\n  if (profile.confidence > highestConfidenceProfile.confidence) {\n    highestConfidenceProfile.confidence = profile.confidence;\n    highestConfidenceProfile.platform = platform;\n  }\n  \n  // Extract identity markers\n  if (profile.profileData) {\n    if (profile.profileData.name) names.add(profile.profileData.name);\n    if (profile.profileData.company) companies.add(profile.profileData.company);\n    if (profile.profileData.location) locations.add(profile.profileData.location);\n    if (profile.profileData.bio) bios.push({ platform, bio: profile.profileData.bio });\n  }\n  \n  // Build validated profile entry\n  validationResults.profilesValidated[platform] = {\n    ...profile,\n    validationStatus: profile.confidence >= 0.7 ? 'verified' : \n                      profile.confidence >= 0.5 ? 'probable' : 'uncertain',\n    validationNotes: []\n  };\n});\n\n// Calculate consistency scores\nvalidationResults.crossPlatformVerification.nameConsistency = \n  names.size <= 1 ? 1.0 : 0.5 / names.size;\nvalidationResults.crossPlatformVerification.companyConsistency = \n  companies.size <= 1 ? 1.0 : 0.5 / companies.size;\nvalidationResults.crossPlatformVerification.locationConsistency = \n  locations.size <= 1 ? 1.0 : 0.5 / locations.size;\n\n// Overall consistency score\nvalidationResults.crossPlatformVerification.overallConsistency = \n  (validationResults.crossPlatformVerification.nameConsistency + \n   validationResults.crossPlatformVerification.companyConsistency + \n   validationResults.crossPlatformVerification.locationConsistency) / 3;\n\n// Determine primary identity based on highest confidence profile\nif (highestConfidenceProfile.platform && profiles[highestConfidenceProfile.platform]) {\n  const primaryProfile = profiles[highestConfidenceProfile.platform];\n  validationResults.primaryIdentity = {\n    name: Array.from(names)[0] || discoveryOutput.originalInput?.fullName || '',\n    company: Array.from(companies)[0] || discoveryOutput.originalInput?.company || '',\n    location: Array.from(locations)[0] || discoveryOutput.originalInput?.location || '',\n    email: discoveryOutput.originalInput?.email || '',\n    primaryPlatform: highestConfidenceProfile.platform\n  };\n}\n\n// Create verification matrix (which platforms link to each other)\nObject.entries(profiles).forEach(([platform1, profile1]) => {\n  validationResults.verificationMatrix[platform1] = {};\n  \n  Object.entries(profiles).forEach(([platform2, profile2]) => {\n    if (platform1 === platform2) {\n      validationResults.verificationMatrix[platform1][platform2] = 1.0;\n    } else {\n      // Check for cross-references in bios or markers\n      let linkScore = 0;\n      \n      // Check if bio mentions other platform\n      if (profile1.profileData?.bio && \n          profile1.profileData.bio.toLowerCase().includes(platform2.toLowerCase())) {\n        linkScore += 0.5;\n      }\n      \n      // Check if markers mention cross-platform links\n      if (profile1.markers) {\n        profile1.markers.forEach(marker => {\n          if (marker.toLowerCase().includes(platform2.toLowerCase())) {\n            linkScore += 0.3;\n          }\n        });\n      }\n      \n      validationResults.verificationMatrix[platform1][platform2] = Math.min(linkScore, 1.0);\n    }\n  });\n});\n\n// Add validation flags based on findings\nif (validationResults.crossPlatformVerification.overallConsistency < 0.7) {\n  validationResults.validationFlags.push({\n    type: 'warning',\n    message: 'Inconsistent information across profiles - manual review recommended',\n    severity: 'medium'\n  });\n}\n\nif (names.size > 1) {\n  validationResults.validationFlags.push({\n    type: 'info',\n    message: `Multiple name variations found: ${Array.from(names).join(', ')}`,\n    severity: 'low'\n  });\n}\n\nif (Object.keys(profiles).length < 2) {\n  validationResults.validationFlags.push({\n    type: 'info',\n    message: 'Limited profiles found for cross-verification',\n    severity: 'low'\n  });\n}\n\n// Suggest actions for improving validation\nif (Object.keys(profiles).length < 3) {\n  validationResults.suggestedActions.push('Search additional platforms for better cross-verification');\n}\n\nObject.entries(validationResults.confidenceScores).forEach(([platform, score]) => {\n  if (score < 0.7) {\n    validationResults.suggestedActions.push(`Manual verification recommended for ${platform} profile`);\n    \n    // Add specific validation notes\n    if (validationResults.profilesValidated[platform]) {\n      validationResults.profilesValidated[platform].validationNotes.push(\n        'Low confidence score - additional verification needed'\n      );\n    }\n  }\n});\n\n// Calculate trust score for the entire profile set\nconst avgConfidence = Object.values(validationResults.confidenceScores)\n  .reduce((sum, score) => sum + score, 0) / Object.keys(validationResults.confidenceScores).length;\n\nvalidationResults.overallTrustScore = \n  (avgConfidence * 0.5) + \n  (validationResults.crossPlatformVerification.overallConsistency * 0.3) +\n  (Object.keys(profiles).length / 10 * 0.2); // More platforms = higher trust\n\n// Add metadata\nvalidationResults.validationMetadata = {\n  timestamp: new Date().toISOString(),\n  profilesAnalyzed: Object.keys(profiles).length,\n  highConfidenceProfiles: Object.values(validationResults.confidenceScores)\n    .filter(score => score >= 0.8).length,\n  validationMethod: 'cross-platform-analysis',\n  trustLevel: validationResults.overallTrustScore >= 0.8 ? 'high' :\n              validationResults.overallTrustScore >= 0.6 ? 'medium' : 'low'\n};\n\n// Pass through all original data plus validation results\nreturn {\n  ...discoveryOutput,\n  validationResults,\n  profilesValidated: validationResults.profilesValidated,\n  primaryIdentity: validationResults.primaryIdentity,\n  trustScore: validationResults.overallTrustScore,\n  proceedToAnalysis: validationResults.overallTrustScore >= 0.5 // Only proceed if trust is sufficient\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "b279af3a-8f2b-49e8-9218-1d9ec409103c",
      "name": "플랫폼을 항목으로 분할",
      "type": "n8n-nodes-base.code",
      "position": [
        1712,
        336
      ],
      "parameters": {
        "jsCode": "// Get the validated profiles from previous node\nconst validatedData = $input.item.json;\nconst profiles = validatedData.profilesDiscovered || {};\n\n// Create an array to hold separate items for each platform\nconst platformItems = [];\n\n// Process each discovered platform\nObject.entries(profiles).forEach(([platform, profileData]) => {\n  if (!profileData || !profileData.url) return;\n  \n  // Create an item for each platform\n  platformItems.push({\n    json: {\n      platform: platform.toLowerCase(),\n      profileUrl: profileData.url,\n      handle: profileData.handle,\n      confidence: profileData.confidence,\n      markers: profileData.markers,\n      profileData: profileData.profileData,\n      searchDepth: validatedData.searchConfig?.depth || 'comprehensive',\n      analysisDepth: validatedData.searchConfig?.depth || 'comprehensive',\n      originalInput: validatedData.originalInput || {},\n      primaryIdentity: validatedData.primaryIdentity || {},\n      trustScore: validatedData.trustScore || 0.5\n    }\n  });\n});\n\n// Return all platform items for processing\nreturn platformItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "90b1798a-b321-4fab-90f0-8a24862b7941",
      "name": "LinkedIn 프롬프트 빌더",
      "type": "n8n-nodes-base.set",
      "position": [
        2160,
        -144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1",
              "name": "platform",
              "type": "string",
              "value": "={{ $json.platform }}"
            },
            {
              "id": "2",
              "name": "profileUrl",
              "type": "string",
              "value": "={{ $json.profileUrl }}"
            },
            {
              "id": "3",
              "name": "analysisDepth",
              "type": "string",
              "value": "={{ $json.analysisDepth }}"
            },
            {
              "id": "4",
              "name": "systemPrompt",
              "type": "string",
              "value": "You are a LinkedIn profile analyst specializing in professional insights. You focus on career progression, skills assessment, network quality, thought leadership, and professional achievements. You use Bright Data MCP PRO tools to extract detailed LinkedIn data."
            },
            {
              "id": "5",
              "name": "userPrompt",
              "type": "string",
              "value": "=Analyze this LinkedIn profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Professional title and current position\n2. Career progression and trajectory\n3. Skills and endorsements\n4. Network size and quality\n5. Recent activity and posts\n6. Education and certifications\n7. Recommendations received\n8. Industry influence and thought leadership\n\nUse web_data_linkedin_person_profile to get full profile data.\nUse web_data_linkedin_posts to analyze recent activity.\n\nProvide structured insights about their professional standing."
            },
            {
              "id": "6",
              "name": "proTools",
              "type": "array",
              "value": "=[\"web_data_linkedin_person_profile\", \"web_data_linkedin_posts\"]"
            },
            {
              "id": "7",
              "name": "analysisFields",
              "type": "array",
              "value": "=[\"professionalTitle\", \"company\", \"skills\", \"connections\", \"recentActivity\", \"education\", \"certifications\"]"
            },
            {
              "id": "8",
              "name": "handle",
              "type": "string",
              "value": "={{ $json.handle }}"
            },
            {
              "id": "9",
              "name": "confidence",
              "type": "number",
              "value": "={{ $json.confidence }}"
            },
            {
              "id": "10",
              "name": "profileData",
              "type": "object",
              "value": "={{ $json.profileData }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ae097d74-0d6e-4d7e-8037-f78a420c8ddf",
      "name": "Twitter/X 프롬프트 빌더",
      "type": "n8n-nodes-base.set",
      "position": [
        2160,
        48
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1",
              "name": "platform",
              "type": "string",
              "value": "={{ $json.platform }}"
            },
            {
              "id": "2",
              "name": "profileUrl",
              "type": "string",
              "value": "={{ $json.profileUrl }}"
            },
            {
              "id": "3",
              "name": "analysisDepth",
              "type": "string",
              "value": "={{ $json.analysisDepth }}"
            },
            {
              "id": "4",
              "name": "systemPrompt",
              "type": "string",
              "value": "You are a Twitter/X analyst specializing in social media engagement and influence. You analyze tweet patterns, engagement metrics, topics of interest, and social influence. You use Bright Data MCP PRO tools to extract Twitter/X data."
            },
            {
              "id": "5",
              "name": "userPrompt",
              "type": "string",
              "value": "=Analyze this Twitter/X profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Tweet frequency and posting patterns\n2. Main topics and themes discussed\n3. Engagement rates (likes, retweets, replies)\n4. Follower count and growth\n5. Influence and reach metrics\n6. Sentiment of tweets\n7. Key hashtags used\n8. Interactions with other users\n\nUse web_data_x_posts to analyze tweets and engagement.\nUse search_engine for additional context if needed.\n\nProvide insights about their social media presence and influence."
            },
            {
              "id": "6",
              "name": "proTools",
              "type": "array",
              "value": "=[\"web_data_x_posts\", \"search_engine\"]"
            },
            {
              "id": "7",
              "name": "analysisFields",
              "type": "array",
              "value": "=[\"tweetFrequency\", \"topTopics\", \"engagement\", \"followers\", \"sentiment\", \"hashtags\"]"
            },
            {
              "id": "8",
              "name": "handle",
              "type": "string",
              "value": "={{ $json.handle }}"
            },
            {
              "id": "9",
              "name": "confidence",
              "type": "number",
              "value": "={{ $json.confidence }}"
            },
            {
              "id": "10",
              "name": "profileData",
              "type": "object",
              "value": "={{ $json.profileData }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "6ed900d1-2485-4a06-8c04-7063807ca605",
      "name": "Instagram 프롬프트 빌더",
      "type": "n8n-nodes-base.set",
      "position": [
        2160,
        240
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1",
              "name": "platform",
              "type": "string",
              "value": "={{ $json.platform }}"
            },
            {
              "id": "2",
              "name": "profileUrl",
              "type": "string",
              "value": "={{ $json.profileUrl }}"
            },
            {
              "id": "3",
              "name": "analysisDepth",
              "type": "string",
              "value": "={{ $json.analysisDepth }}"
            },
            {
              "id": "4",
              "name": "systemPrompt",
              "type": "string",
              "value": "You are an Instagram analyst specializing in visual content analysis and engagement metrics. You analyze content themes, posting patterns, visual aesthetics, and audience engagement. You use Bright Data MCP PRO tools for Instagram data extraction."
            },
            {
              "id": "5",
              "name": "userPrompt",
              "type": "string",
              "value": "=Analyze this Instagram profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Content themes and categories\n2. Posting frequency and schedule\n3. Engagement rate per post\n4. Follower demographics insights\n5. Hashtag strategy and reach\n6. Visual style and branding\n7. Stories and Reels performance\n8. Brand collaborations or sponsorships\n\nUse web_data_instagram_profiles for profile metrics.\nUse web_data_instagram_posts for content analysis.\nUse web_data_instagram_reels for video content.\n\nProvide insights about their content strategy and audience engagement."
            },
            {
              "id": "6",
              "name": "proTools",
              "type": "array",
              "value": "=[\"web_data_instagram_profiles\", \"web_data_instagram_posts\", \"web_data_instagram_reels\"]"
            },
            {
              "id": "7",
              "name": "analysisFields",
              "type": "array",
              "value": "=[\"contentThemes\", \"postingFrequency\", \"engagementRate\", \"hashtags\", \"visualStyle\", \"reelsPerformance\"]"
            },
            {
              "id": "8",
              "name": "handle",
              "type": "string",
              "value": "={{ $json.handle }}"
            },
            {
              "id": "9",
              "name": "confidence",
              "type": "number",
              "value": "={{ $json.confidence }}"
            },
            {
              "id": "10",
              "name": "profileData",
              "type": "object",
              "value": "={{ $json.profileData }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5167b40f-5645-4cac-bd77-2cb7094ee59b",
      "name": "YouTube 프롬프트 빌더",
      "type": "n8n-nodes-base.set",
      "position": [
        2160,
        432
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1",
              "name": "platform",
              "type": "string",
              "value": "={{ $json.platform }}"
            },
            {
              "id": "2",
              "name": "profileUrl",
              "type": "string",
              "value": "={{ $json.profileUrl }}"
            },
            {
              "id": "3",
              "name": "analysisDepth",
              "type": "string",
              "value": "={{ $json.analysisDepth }}"
            },
            {
              "id": "4",
              "name": "systemPrompt",
              "type": "string",
              "value": "You are a YouTube channel analyst specializing in content strategy and audience engagement. You analyze video content, upload patterns, viewer metrics, and channel growth. You use Bright Data MCP PRO tools for YouTube data extraction."
            },
            {
              "id": "5",
              "name": "userPrompt",
              "type": "string",
              "value": "=Analyze this YouTube channel in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Channel focus and content categories\n2. Upload schedule and consistency\n3. View counts and watch time metrics\n4. Subscriber count and growth rate\n5. Video production quality\n6. Audience engagement (likes, comments)\n7. Most popular videos and topics\n8. Monetization indicators\n\nUse web_data_youtube_profiles for channel statistics.\nUse web_data_youtube_videos for video analytics.\n\nProvide insights about their content strategy and channel performance."
            },
            {
              "id": "6",
              "name": "proTools",
              "type": "array",
              "value": "=[\"web_data_youtube_profiles\", \"web_data_youtube_videos\"]"
            },
            {
              "id": "7",
              "name": "analysisFields",
              "type": "array",
              "value": "=[\"channelFocus\", \"uploadSchedule\", \"viewMetrics\", \"subscribers\", \"topVideos\", \"engagement\"]"
            },
            {
              "id": "8",
              "name": "handle",
              "type": "string",
              "value": "={{ $json.handle }}"
            },
            {
              "id": "9",
              "name": "confidence",
              "type": "number",
              "value": "={{ $json.confidence }}"
            },
            {
              "id": "10",
              "name": "profileData",
              "type": "object",
              "value": "={{ $json.profileData }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "e62bfe80-f36c-4f69-91f5-995e9b478dca",
      "name": "GitHub 프롬프트 빌더",
      "type": "n8n-nodes-base.set",
      "position": [
        2160,
        624
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1",
              "name": "platform",
              "type": "string",
              "value": "={{ $json.platform }}"
            },
            {
              "id": "2",
              "name": "profileUrl",
              "type": "string",
              "value": "={{ $json.profileUrl }}"
            },
            {
              "id": "3",
              "name": "analysisDepth",
              "type": "string",
              "value": "={{ $json.analysisDepth }}"
            },
            {
              "id": "4",
              "name": "systemPrompt",
              "type": "string",
              "value": "You are a GitHub analyst specializing in technical expertise assessment and open-source contributions. You analyze repositories, coding patterns, collaboration, and technical skills. You use Bright Data MCP PRO tools for GitHub data extraction."
            },
            {
              "id": "5",
              "name": "userPrompt",
              "type": "string",
              "value": "=Analyze this GitHub profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Repository count and types\n2. Primary programming languages\n3. Contribution frequency and patterns\n4. Popular/starred repositories\n5. Collaboration and pull requests\n6. Code quality indicators\n7. Open source involvement\n8. Technical expertise areas\n\nUse web_data_github_repository_file for repository analysis.\nUse search_engine for additional context about projects.\n\nProvide insights about their technical skills and collaboration patterns."
            },
            {
              "id": "6",
              "name": "proTools",
              "type": "array",
              "value": "=[\"web_data_github_repository_file\", \"search_engine\"]"
            },
            {
              "id": "7",
              "name": "analysisFields",
              "type": "array",
              "value": "=[\"repositories\", \"languages\", \"contributions\", \"popularProjects\", \"collaboration\", \"expertise\"]"
            },
            {
              "id": "8",
              "name": "handle",
              "type": "string",
              "value": "={{ $json.handle }}"
            },
            {
              "id": "9",
              "name": "confidence",
              "type": "number",
              "value": "={{ $json.confidence }}"
            },
            {
              "id": "10",
              "name": "profileData",
              "type": "object",
              "value": "={{ $json.profileData }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "34cf7453-c52c-44c2-8b81-6903b15565cc",
      "name": "TikTok 프롬프트 빌더",
      "type": "n8n-nodes-base.set",
      "position": [
        2160,
        816
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1",
              "name": "platform",
              "type": "string",
              "value": "={{ $json.platform }}"
            },
            {
              "id": "2",
              "name": "profileUrl",
              "type": "string",
              "value": "={{ $json.profileUrl }}"
            },
            {
              "id": "3",
              "name": "analysisDepth",
              "type": "string",
              "value": "={{ $json.analysisDepth }}"
            },
            {
              "id": "4",
              "name": "systemPrompt",
              "type": "string",
              "value": "You are a TikTok analyst specializing in viral content and creator metrics. You analyze video performance, trend participation, audience engagement, and content strategy. You use Bright Data MCP PRO tools for TikTok data extraction."
            },
            {
              "id": "5",
              "name": "userPrompt",
              "type": "string",
              "value": "=Analyze this TikTok profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Content themes and niches\n2. Viral videos and reach\n3. Posting frequency\n4. Follower count and growth\n5. Engagement metrics (likes, comments, shares)\n6. Trend participation\n7. Audio and hashtag usage\n8. Creator fund eligibility indicators\n\nUse web_data_tiktok_profiles for creator statistics.\nUse web_data_tiktok_posts for video metrics.\n\nProvide insights about their content strategy and viral potential."
            },
            {
              "id": "6",
              "name": "proTools",
              "type": "array",
              "value": "=[\"web_data_tiktok_profiles\", \"web_data_tiktok_posts\"]"
            },
            {
              "id": "7",
              "name": "analysisFields",
              "type": "array",
              "value": "=[\"contentThemes\", \"viralVideos\", \"postingFrequency\", \"followers\", \"engagement\", \"trends\"]"
            },
            {
              "id": "8",
              "name": "handle",
              "type": "string",
              "value": "={{ $json.handle }}"
            },
            {
              "id": "9",
              "name": "confidence",
              "type": "number",
              "value": "={{ $json.confidence }}"
            },
            {
              "id": "10",
              "name": "profileData",
              "type": "object",
              "value": "={{ $json.profileData }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0b84e3a7-08f2-4428-b5be-2ace65b48b48",
      "name": "스위치",
      "type": "n8n-nodes-base.switch",
      "position": [
        1936,
        272
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "LinkedIn",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.platform }}",
                    "rightValue": "linkedin"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Twitter",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.platform }}",
                    "rightValue": "twitter"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Instagram",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.platform }}",
                    "rightValue": "instagram"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "YouTube",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.platform }}",
                    "rightValue": "youtube"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "GitHub",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.platform }}",
                    "rightValue": "github"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "TikTok",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.platform }}",
                    "rightValue": "tiktok"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "96782079-6878-4168-b4ac-43305b175dc4",
      "name": "리서치 에이전트",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2672,
        464
      ],
      "parameters": {
        "text": "={{ $json.userPrompt }}",
        "options": {
          "systemMessage": "={{ $json.systemPrompt }}"
        },
        "promptType": "define"
      },
      "retryOnFail": true,
      "typeVersion": 2.2
    },
    {
      "id": "f38a6156-f044-41b4-b919-67325b274b43",
      "name": "병합",
      "type": "n8n-nodes-base.merge",
      "position": [
        2384,
        272
      ],
      "parameters": {
        "numberInputs": 6
      },
      "typeVersion": 3.2
    },
    {
      "id": "5effc409-e30d-44cf-b648-f35be74b390e",
      "name": "OpenAI 채팅 모델1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2608,
        688
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "3lTEzvz4p0zyelIS",
          "name": "OpenAi Romuald private"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c41d9b89-f376-4f8f-bd58-b1ae819db71a",
      "name": "OpenAI 채팅 모델2",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3824,
        560
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "gpt-4.1"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "3lTEzvz4p0zyelIS",
          "name": "OpenAi Romuald private"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2235b8ab-ec5a-4294-ace7-4f01e302c27f",
      "name": "분석 결과 집계",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        3520,
        336
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData",
        "destinationFieldName": "platforms"
      },
      "typeVersion": 1
    },
    {
      "id": "e1bd36e1-90ec-4a77-8e7e-54c6b01271a9",
      "name": "병합1",
      "type": "n8n-nodes-base.merge",
      "position": [
        3072,
        336
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "1a830e97-d111-4a6c-8ca9-2cfc00e20763",
      "name": "필드 편집",
      "type": "n8n-nodes-base.set",
      "position": [
        3296,
        336
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d8df7c36-f9ae-4b63-a734-7bc7ab29a0a4",
              "name": "platform",
              "type": "string",
              "value": "={{ $json.platform }}"
            },
            {
              "id": "3b2bf0a7-da33-497a-9bbe-d7e8229c1755",
              "name": "profileUrl",
              "type": "string",
              "value": "={{ $json.profileUrl }}"
            },
            {
              "id": "75c498e7-17fe-4f1f-bce7-5597dcca12fe",
              "name": "profileData",
              "type": "object",
              "value": "={{ $json.profileData }}"
            },
            {
              "id": "5da9fb30-9d87-4406-8e13-9f11f96f61d2",
              "name": "research_result",
              "type": "string",
              "value": "={{ $json.output }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a4e5d89d-8929-49a9-97fa-87536e819b15",
      "name": "기본 LLM 체인",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        3744,
        336
      ],
      "parameters": {
        "text": "=## Social Media Intelligence Request\n\nAnalyze the following social media data and create a comprehensive intelligence report.\n\n## Platform Data:\n\n{{ $json.platforms.map((item, index) => {\n  const platform = item.platform;\n  const url = item.profileUrl;\n  const profileData = item.profileData;\n  const research = item.research_result;\n  \n  return `### Platform ${index + 1}: ${platform.toUpperCase()}\n- **URL**: ${url}\n- **Handle**: ${profileData.handle || 'N/A'}\n- **Bio**: ${profileData.bio || 'N/A'}\n- **Followers**: ${profileData.followers || 'N/A'}\n- **Confidence Score**: ${item.confidence || 'N/A'}\n\n**Research Analysis**:\n${research}\n`;\n}).join('\\n---\\n') }}\n\n## Request:\nPlease analyze this data and provide a comprehensive intelligence report following your standard analysis framework.",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are an Elite Social Media Intelligence Analyst specializing in creating actionable digital presence reports from multi-platform data. You excel at pattern recognition, behavioral analysis, and strategic assessment.  ## Core Competencies: - Multi-platform data synthesis and analysis - Professional profiling and behavioral assessment   - Digital influence measurement and network analysis - Content strategy evaluation and optimization insights - Risk assessment and due diligence - Strategic recommendation formulation  ## Report Structure Requirements:  Create a comprehensive intelligence report with the following sections:  ### 1. **Executive Summary** (2-3 paragraphs) - Synthesize who this person is professionally - Identify their digital presence strategy - Highlight their key areas of expertise and influence - Provide a high-level assessment of their professional standing  ### 2. **Platform-by-Platform Breakdown** For each platform analyzed, provide: - Platform name and profile URL - Key metrics (followers, engagement, activity level) - 3-5 bullet points of platform-specific insights - Unique value this platform adds to their digital presence  ### 3. **Cross-Platform Analysis** - Identify consistent themes across all platforms - Note any interesting variations or platform-specific personas - Assess overall digital brand coherence - Evaluate the strategic use of each platform  ### 4. **Professional Profile Assessment** - Current role(s) and responsibilities - Industry influence and thought leadership indicators - Technical skills and demonstrated expertise - Professional network strength and quality - Career trajectory insights  ### 5. **Content Strategy Evaluation** - Content creation frequency and patterns - Topic consistency across platforms - Audience engagement metrics and quality - Content production value and professionalism - Strategic content distribution approach  ### 6. **Digital Influence Metrics** - Total reach across all platforms - Engagement quality assessment - Growth trajectory and potential - Influence sphere and impact areas - Comparison to industry standards (if applicable)  ### 7. **Personality and Communication Analysis** - Communication style and tone - Professional vs. personal content balance - Values and interests demonstrated - Expertise areas consistently highlighted - Audience interaction patterns  ### 8. **Strategic Recommendations**  **For Professional Engagement:** - Best platforms for initial contact - Optimal messaging approach - Topics likely to resonate - Timing recommendations  **For Partnership/Collaboration:** - Collaboration opportunities - Mutual benefit areas - Potential synergies - Risk considerations  ### 9. **Risk Assessment** - Any controversial positions or statements - Reputation concerns - Inconsistencies between platforms - Potential red flags - Verification confidence levels  ### 10. **Contact Intelligence** - Preferred communication channels - Best times for engagement (based on activity patterns) - Response likelihood assessment - Professional contact protocols  ## Data Processing Framework:  **Input Data Structure:** - `platforms`: An array containing all platform data - Each element in the array has:   - `platform`: The platform name   - `profileUrl`: The URL of the profile   - `profileData`: Object with profile information   - `research_result`: The detailed analysis from the Research Agent  **Analysis Approach:** 1. Parse aggregated platform data from the platforms array 2. Extract patterns across multiple data points 3. Cross-reference information for verification 4. Identify consistent behaviors across platforms 5. Detect anomalies or inconsistencies 6. Recognize strategic platform usage 7. Assess content distribution patterns 8. Evaluate professional positioning 9. Assess market influence and reach 10. Identify collaboration opportunities  ## Output Standards:  **Quality Requirements:** - Structure your response with clear headers for each section - Use specific data points and examples from the analyses - Provide actionable insights, not just observations - Maintain professional tone while being thorough - Include confidence levels where appropriate - Focus on business-relevant intelligence - Base all conclusions on provided data - Distinguish between facts and inferences - Provide evidence for assessments  **Professional Standards:** - Maintain objectivity and balance - Respect privacy and ethical boundaries - Focus on publicly available information - Clear, structured presentation - Specific examples and data points - Professional yet accessible language - Comprehensive but concise coverage  ## Key Principles:  1. **Accuracy First:** Never fabricate or assume data not provided 2. **Context Matters:** Consider platform-specific norms and expectations 3. **Business Focus:** Prioritize insights relevant to professional engagement 4. **Ethical Analysis:** Respect personal boundaries and privacy 5. **Actionable Output:** Every insight should lead to potential action 6. **Data-Driven:** Process ALL platforms in the array, not just selected ones 7. **Pattern Recognition:** Look for patterns across all platforms in the array 8. **Verification:** Pay special attention to confidence scores for reliability  ## Important Notes: - Extract metrics from the research_result text when specific numbers aren't in profileData - Create a professional intelligence product that will inform important business decisions - Make every section count with specific, actionable insights backed by data from all analyzed platforms - Remember that this report may be used for business development, recruitment, or partnership evaluation purposes"
            }
          ]
        },
        "promptType": "define"
      },
      "retryOnFail": true,
      "typeVersion": 1.7
    },
    {
      "id": "f1748dac-778d-46b5-9e69-555dc0e8256f",
      "name": "콘텐츠 설정",
      "type": "n8n-nodes-base.set",
      "position": [
        4576,
        368
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1",
              "name": "markdown",
              "type": "string",
              "value": "={{ $json.text }}"
            },
            {
              "id": "2",
              "name": "fileName",
              "type": "string",
              "value": "=Document {{ $now.format('yyyy-MM-dd HH:mm') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "e2e77c09-bfec-4456-b9de-fa8cc5f9f31a",
      "name": "Markdown을 HTML로 변환",
      "type": "n8n-nodes-base.markdown",
      "position": [
        4752,
        272
      ],
      "parameters": {
        "mode": "markdownToHtml",
        "options": {
          "emoji": true,
          "tables": true
        },
        "markdown": "={{ $json.markdown }}"
      },
      "typeVersion": 1
    },
    {
      "id": "df76c7cd-5511-45bb-b1ac-940fbd70aec2",
      "name": "빈 Google 문서 생성",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        5200,
        656
      ],
      "parameters": {
        "name": "={{ $('Set Content').item.json.fileName }}",
        "content": "Temporary content",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {
          "convertToGoogleDocument": true
        },
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1Mu8ux5MKPyGsX7Nn98JC5tw5eXYpyoun",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1Mu8ux5MKPyGsX7Nn98JC5tw5eXYpyoun",
          "cachedResultName": "researcher_output"
        },
        "operation": "createFromText"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "BdRD0hG0tuE54hnO",
          "name": "AiAdvisors google drive"
        }
      },
      "retryOnFail": true,
      "typeVersion": 3
    },
    {
      "id": "2e1519e8-c33f-45d6-8afb-6271e8cc129e",
      "name": "HTML을 파일로 변환",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        4976,
        272
      ],
      "parameters": {
        "options": {
          "fileName": "content.html"
        },
        "operation": "toText",
        "sourceProperty": "data",
        "binaryPropertyName": "file"
      },
      "typeVersion": 1.1
    },
    {
      "id": "5a1705f8-0cb4-42ed-abbf-9933e3874ac4",
      "name": "MIME 유형을 HTML로 설정",
      "type": "n8n-nodes-base.code",
      "position": [
        5200,
        272
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const item = $input.item;\n\nif (item.binary && item.binary.file) {\n  item.binary.file.mimeType = 'text/html';\n}\n\nreturn item;"
      },
      "typeVersion": 2
    },
    {
      "id": "1f8d0d75-2d6b-4663-a42f-ed50e07dd027",
      "name": "HTML로 문서 업데이트",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        5648,
        368
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {
          "fields": [
            "webViewLink"
          ]
        },
        "operation": "update",
        "changeFileContent": true,
        "inputDataFieldName": "file"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "BdRD0hG0tuE54hnO",
          "name": "AiAdvisors google drive"
        }
      },
      "retryOnFail": true,
      "typeVersion": 3
    },
    {
      "id": "7019826a-0ec8-49f6-a681-e1bfa814d982",
      "name": "폼",
      "type": "n8n-nodes-base.form",
      "position": [
        5872,
        368
      ],
      "webhookId": "89719a84-54d4-4143-9564-454603c1c5d7",
      "parameters": {
        "options": {},
        "operation": "completion",
        "redirectUrl": "={{ $json.webViewLink }}",
        "respondWith": "redirect"
      },
      "typeVersion": 2.3
    },
    {
      "id": "a2471cbf-298d-462f-a403-a24330ba2a9f",
      "name": "병합2",
      "type": "n8n-nodes-base.merge",
      "position": [
        5424,
        368
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3
    },
    {
      "id": "20e11916-479e-4012-9ea2-01fb158fec86",
      "name": "개요",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        -480
      ],
      "parameters": {
        "color": 4,
        "width": 500,
        "height": 1416,
        "content": "## Social Media Intelligence Workflow with Bright Data and OpenAI\n\n## Who's it for\nBusiness development professionals, recruiters, sales teams, and market researchers who need comprehensive social media intelligence on individuals for lead qualification, due diligence, partnership evaluation, or candidate assessment.\n\n## How it works\n1. Enter target person's details through the web form (name, company, location)\n2. AI Discovery Agent searches across selected platforms using name variations\n3. Profile validator verifies discovered profiles with confidence scoring\n4. Platform-specific agents analyze each profile using Bright Data MCP tools\n5. GPT-4 synthesizes all data into a comprehensive intelligence report\n6. Report automatically generated as formatted Google Doc with direct link\n\n## Requirements\n- Bright Data MCP account with PRO access\n- OpenAI API key (or alternative LLM provider)\n- Google Drive OAuth connection for report delivery\n- n8n self-hosted instance or cloud account\n\n## How to set up\n1. **CRITICAL - Update Bright Data credentials**:\n   - Find \"Bright Data MCP\" node (look for red warning note)\n   - Replace YOUR_BRIGHT_DATA_TOKEN_HERE with your actual token\n   - Update UNLOCKER_CODE_HERE with your unlocker code\n2. **Update Google Drive settings**:\n   - Find \"Create Empty Google Doc\" node\n   - Select target folder ID\n3. Configure your LLM credentials (OpenAI or alternative)\n4. Test with your own name using \"Basic\" search depth\n\n## How to customize the workflow\n- **Add platforms**: Extend the Switch node with new cases and create corresponding prompt builders\n- **Modify analysis depth**: Edit the platform-specific prompt builders to focus on different metrics\n- **Change report format**: Update the final LLM Chain prompt to adjust report structure\n- **Add notifications**: Insert Slack or email nodes after report generation\n- **Adjust confidence thresholds**: Modify validators to change profile verification requirements\n- **Alternative outputs**: Replace Google Docs with PDF, Excel, or webhook to CRM\n\n## Security Note\nThis template uses placeholder values for sensitive data. You MUST update these before use. Never share workflows with real tokens."
      },
      "typeVersion": 1
    },
    {
      "id": "e256c0cf-e6e8-4c67-9d7f-ac1fa51dbd98",
      "name": "입력 섹션",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 740,
        "content": "## 1. Data Input & Validation\n[Learn more about Form Triggers](https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.formtrigger/)\n\nEnter person details through:\n• Web Form - User-friendly interface\n• Webhook - API integration\n\nRequired fields:\n- Full Name ✅\n- Search Depth ✅  \n- Platforms to Search ✅\n\nThe validator ensures data quality before processing."
      },
      "typeVersion": 1
    },
    {
      "id": "de224bd7-9078-4c64-aed9-5a5b5787431b",
      "name": "디스커버리 단계",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        704,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 492,
        "height": 736,
        "content": "## 2. Profile Discovery Phase\n[Learn about AI Agents](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/)\n\nThe Discovery Agent:\n• Searches across selected platforms\n• Uses name variations for better matching\n• Verifies profiles with confidence scoring\n• Stores conversation in simple memory\n\n💡 Tip: Higher search depth = more thorough results"
      },
      "typeVersion": 1
    },
    {
      "id": "7ce7cf02-8c6e-4e7f-8e13-f288dbcf9f66",
      "name": "검증",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 428,
        "height": 728,
        "content": "## 3. Cross-Platform Verification\n\nValidates discovered profiles by:\n• Checking name consistency\n• Comparing company/location data\n• Calculating trust scores\n• Flagging inconsistencies\n\nOnly profiles with >50% trust proceed to analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "fcc642a5-ed8a-43fc-84a5-a2981c62b068",
      "name": "플랫폼 분석",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2512,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 916,
        "content": "## 4. Platform-Specific Deep Analysis\n[Using Bright Data MCP PRO](https://docs.brightdata.com/)\n\nEach platform gets specialized analysis:\n• LinkedIn → Professional insights\n• X/Twitter → Engagement metrics  \n• GitHub → Technical expertise\n• Instagram → Content strategy\n• YouTube → Video performance\n• TikTok → Viral potential\n"
      },
      "typeVersion": 1
    },
    {
      "id": "034673db-9d24-4882-9c57-00a9047f0f09",
      "name": "리포트 생성",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3632,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 444,
        "height": 832,
        "content": "## 5. Intelligence Report Generation\n\nGPT-4.1 synthesizes all data into:\n• Executive Summary\n• Platform-by-platform breakdown\n• Professional profile assessment\n• Digital influence metrics\n• Strategic recommendations\n• Risk assessment\n\nReport delivered as formatted Google Doc."
      },
      "typeVersion": 1
    },
    {
      "id": "07e4685e-70ca-4648-8e4a-f2e3dfe695a5",
      "name": "맞춤 설정 가이드",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1856,
        -384
      ],
      "parameters": {
        "color": 5,
        "width": 640,
        "content": "💚 How to Customize:\n• Add platforms: Extend Switch node cases\n• Modify prompts: Edit platform prompt builders\n• Change report format: Update final LLM prompt\n• Add notifications: Insert Slack/email nodes\n• Adjust confidence thresholds: Edit validators"
      },
      "typeVersion": 1
    },
    {
      "id": "cfd8fbeb-42ee-45c4-bc4a-ee1718fe1763",
      "name": "리포트 전달",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4096,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 1972,
        "height": 836,
        "content": "## 6. Report Delivery to Google Drive\n\nThe final intelligence report is delivered as a formatted Google Doc using \nan advanced HTML injection technique.\n\n### How it Works:\n1. Report generated as Markdown \n2. Markdown converted to styled HTML\n3. HTML file created with proper MIME type\n4. Empty Google Doc created as container\n5. Doc updated with formatted HTML content\n6. User auto-redirected to final document\n\n### 📚 Attribution:\nThis HTML-to-Google-Docs technique was adapted from:\n**Roman Rozenberger** (@romek)\n[View Original Template](https://n8n.io/workflows/5147-convert-markdown-content-to-google-docs-document-with-automatic-formatting/)\n\nTheir innovative approach enables rich formatting that standard \nGoogle Docs API doesn't support directly.\n\n### 💡 Why This Method?\n- Preserves complex formatting (tables, lists, headers)\n- Maintains styling and structure\n- Works around Google Docs API limitations\n- Creates professional-looking reports\n\nThe user receives a direct link and is automatically \nredirected to view their personalized intelligence report."
      },
      "typeVersion": 1
    },
    {
      "id": "template-attribution",
      "name": "템플릿 출처",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -480
      ],
      "parameters": {
        "color": 3,
        "width": 348,
        "height": 336,
        "content": "## 📝 Template Information\n\n**Created by:** Romuald Członkowski\n**Company:** AiAdvisors\n**Version:** 1.0\n**Last Updated:** September 2025\n![AiAdvisors logo](https://www.aiadvisors.pl/_next/image?url=%2Flogo.png&w=3840&q=75)\n**Work with me** Go to [my page](https://www.aiadvisors.pl/en) and schedule a meeting"
      },
      "typeVersion": 1
    },
    {
      "id": "testing-guide",
      "name": "테스트 가이드",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        -352
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 280,
        "content": "## 🧪 Testing Your Workflow\n\n1. **Test with known profile:**\n   - Use your own name first\n   - Select 2-3 platforms you're active on\n   - Use \"Basic\" search depth for quick test\n\n2. **Verify each stage:**\n   - Check discovery finds correct profiles\n   - Confirm confidence scores make sense\n   - Review analysis depth\n\n3. **Test edge cases:**\n   - Common names (John Smith)\n   - Single name profiles\n   - Inactive accounts"
      },
      "typeVersion": 1
    },
    {
      "id": "platform-routing-note",
      "name": "플랫폼 라우팅 로직",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1856,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 644,
        "height": 1188,
        "content": "⚡ Smart Routing:\nEach platform gets its own:\n• Specialized prompts\n• Relevant MCP tools\n• Custom analysis fields\n\nAdd new platforms by:\n1. Adding Switch case\n2. Creating prompt builder\n3. Connecting to Merge node"
      },
      "typeVersion": 1
    },
    {
      "id": "bright-data-tools",
      "name": "Bright Data 도구",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2512,
        -320
      ],
      "parameters": {
        "color": 6,
        "width": 512,
        "height": 264,
        "content": "## 🔧 Bright Data MCP Tools\n\n**LinkedIn:** web_data_linkedin_person_profile\n**X/Twitter:** web_data_x_posts\n**Instagram:** web_data_instagram_profiles\n**YouTube:** web_data_youtube_profiles\n**GitHub:** web_data_github_repository_file\n**TikTok:** web_data_tiktok_profiles\n\nFallback: search_engine & scrape_as_markdown"
      },
      "typeVersion": 1
    },
    {
      "id": "output-formats",
      "name": "출력 형식",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4096,
        816
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 296,
        "content": "## 📄 Report Formats\n\nCurrent: Google Doc (HTML)\n\nEasy to add:\n• PDF export\n• Excel spreadsheet\n• Notion page\n• Slack message\n• Email report\n• Webhook to CRM"
      },
      "typeVersion": 1
    },
    {
      "id": "success-metrics",
      "name": "성공 지표",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1232,
        -240
      ],
      "parameters": {
        "color": 4,
        "width": 424,
        "height": 200,
        "content": "## 📈 Success Indicators\n\n✅ High confidence (>0.8) on 2+ platforms\n✅ Consistent data across profiles\n✅ Rich analysis per platform\n✅ Clear actionable insights\n\n⚠️ Warning signs:\n• <0.5 confidence scores\n• Conflicting information\n• Too many platforms with no data"
      },
      "typeVersion": 1
    },
    {
      "id": "2b44e531-dc0b-4b95-9984-d440650a45da",
      "name": "스티커 노트",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        960
      ],
      "parameters": {
        "width": 864,
        "height": 496,
        "content": "## Built with [n8n-mcp](https://www.n8n-mcp.com/)\nI used n8n-mcp and Claude Desktop as co-pilot when creating this workflow and documentation. Learn more on the webpage\n\n![n8n-mcp](https://www.n8n-mcp.com/hero.png)"
      },
      "typeVersion": 1
    },
    {
      "id": "5143af1d-9f82-4d09-a65d-2309fd72a0a5",
      "name": "스티커 노트1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1888,
        1072
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 512,
        "content": "## ⚠️ SETUP REQUIRED (1/3)\n\n1. Double-click this node\n2. In Endpoint URL, replace:\n   - YOUR_BRIGHT_DATA_TOKEN_HERE → Your token\n   - UNLOCKER_CODE_HERE → bd_yt (or your code)\n3. Save workflow\n\n[Get your Bright Data API key here](https://get.brightdata.com/qsg36y0kkq70)\n\nNever share workflows with real tokens!"
      },
      "typeVersion": 1
    },
    {
      "id": "688043b3-4be7-4691-a9f8-25d5ad3b97f0",
      "name": "스티커 노트3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5088,
        448
      ],
      "parameters": {
        "color": 3,
        "width": 288,
        "height": 416,
        "content": "## ⚠️ SETUP REQUIRED (3/3)\n\nReplace YOUR_FOLDER_ID_HERE\nor select folder from dropdown.\n\nReports save here."
      },
      "typeVersion": 1
    },
    {
      "id": "87218683-7f0f-4797-b5f0-6d52d8f4d201",
      "name": "심플 메모리",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        928,
        592
      ],
      "parameters": {
        "sessionKey": "={{ $execution.id }}_discovery",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "9a5f34b6-5c77-41c8-936f-b8956522af62",
      "name": "심플 메모리1",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        2736,
        688
      ],
      "parameters": {
        "sessionKey": "={{ $execution.id }}_{{ $json.platform }}",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    }
  ],
  "active": true,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "556838fa-e909-474a-819c-a35e0433bcc9",
  "connections": {
    "f38a6156-f044-41b4-b919-67325b274b43": {
      "main": [
        [
          {
            "node": "96782079-6878-4168-b4ac-43305b175dc4",
            "type": "main",
            "index": 0
          },
          {
            "node": "e1bd36e1-90ec-4a77-8e7e-54c6b01271a9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e1bd36e1-90ec-4a77-8e7e-54c6b01271a9": {
      "main": [
        [
          {
            "node": "1a830e97-d111-4a6c-8ca9-2cfc00e20763",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a2471cbf-298d-462f-a403-a24330ba2a9f": {
      "main": [
        [
          {
            "node": "1f8d0d75-2d6b-4663-a42f-ed50e07dd027",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0b84e3a7-08f2-4428-b5be-2ace65b48b48": {
      "main": [
        [
          {
            "node": "90b1798a-b321-4fab-90f0-8a24862b7941",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "ae097d74-0d6e-4d7e-8037-f78a420c8ddf",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6ed900d1-2485-4a06-8c04-7063807ca605",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "5167b40f-5645-4cac-bd77-2cb7094ee59b",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "e62bfe80-f36c-4f69-91f5-995e9b478dca",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "34cf7453-c52c-44c2-8b81-6903b15565cc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1a830e97-d111-4a6c-8ca9-2cfc00e20763": {
      "main": [
        [
          {
            "node": "2235b8ab-ec5a-4294-ace7-4f01e302c27f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f1748dac-778d-46b5-9e69-555dc0e8256f": {
      "main": [
        [
          {
            "node": "e2e77c09-bfec-4456-b9de-fa8cc5f9f31a",
            "type": "main",
            "index": 0
          },
          {
            "node": "df76c7cd-5511-45bb-b1ac-940fbd70aec2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "87218683-7f0f-4797-b5f0-6d52d8f4d201": {
      "ai_memory": [
        [
          {
            "node": "ac0cb825-f1a0-48db-9395-4f307f326c38",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "96782079-6878-4168-b4ac-43305b175dc4": {
      "main": [
        [
          {
            "node": "e1bd36e1-90ec-4a77-8e7e-54c6b01271a9",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "9a5f34b6-5c77-41c8-936f-b8956522af62": {
      "ai_memory": [
        [
          {
            "node": "96782079-6878-4168-b4ac-43305b175dc4",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "a4e5d89d-8929-49a9-97fa-87536e819b15": {
      "main": [
        [
          {
            "node": "f1748dac-778d-46b5-9e69-555dc0e8256f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3b4ecc52-8cd6-43ee-8c14-33246c2b796e": {
      "ai_tool": [
        [
          {
            "node": "ac0cb825-f1a0-48db-9395-4f307f326c38",
            "type": "ai_tool",
            "index": 0
          },
          {
            "node": "96782079-6878-4168-b4ac-43305b175dc4",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "e24ffee7-7895-4572-8de1-273baf764b8c": {
      "main": [
        [
          {
            "node": "ac0cb825-f1a0-48db-9395-4f307f326c38",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ac0cb825-f1a0-48db-9395-4f307f326c38": {
      "main": [
        [
          {
            "node": "c97b1714-0285-4d9c-8161-7f9619df1f3f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e2e77c09-bfec-4456-b9de-fa8cc5f9f31a": {
      "main": [
        [
          {
            "node": "2e1519e8-c33f-45d6-8afb-6271e8cc129e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c97b1714-0285-4d9c-8161-7f9619df1f3f": {
      "main": [
        [
          {
            "node": "282c09b4-db66-4524-a4a8-67cb4433e1b6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "cc09048c-a755-4725-93e9-6840dd176920": {
      "ai_languageModel": [
        [
          {
            "node": "ac0cb825-f1a0-48db-9395-4f307f326c38",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "2235b8ab-ec5a-4294-ace7-4f01e302c27f": {
      "main": [
        [
          {
            "node": "a4e5d89d-8929-49a9-97fa-87536e819b15",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5effc409-e30d-44cf-b648-f35be74b390e": {
      "ai_languageModel": [
        [
          {
            "node": "96782079-6878-4168-b4ac-43305b175dc4",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "c41d9b89-f376-4f8f-bd58-b1ae819db71a": {
      "ai_languageModel": [
        [
          {
            "node": "a4e5d89d-8929-49a9-97fa-87536e819b15",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "282c09b4-db66-4524-a4a8-67cb4433e1b6": {
      "main": [
        [
          {
            "node": "b279af3a-8f2b-49e8-9218-1d9ec409103c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2e1519e8-c33f-45d6-8afb-6271e8cc129e": {
      "main": [
        [
          {
            "node": "5a1705f8-0cb4-42ed-abbf-9933e3874ac4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1f8d0d75-2d6b-4663-a42f-ed50e07dd027": {
      "main": [
        [
          {
            "node": "7019826a-0ec8-49f6-a681-e1bfa814d982",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e62bfe80-f36c-4f69-91f5-995e9b478dca": {
      "main": [
        [
          {
            "node": "f38a6156-f044-41b4-b919-67325b274b43",
            "type": "main",
            "index": 4
          }
        ]
      ]
    },
    "5a1705f8-0cb4-42ed-abbf-9933e3874ac4": {
      "main": [
        [
          {
            "node": "a2471cbf-298d-462f-a403-a24330ba2a9f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "34cf7453-c52c-44c2-8b81-6903b15565cc": {
      "main": [
        [
          {
            "node": "f38a6156-f044-41b4-b919-67325b274b43",
            "type": "main",
            "index": 5
          }
        ]
      ]
    },
    "5167b40f-5645-4cac-bd77-2cb7094ee59b": {
      "main": [
        [
          {
            "node": "f38a6156-f044-41b4-b919-67325b274b43",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "df76c7cd-5511-45bb-b1ac-940fbd70aec2": {
      "main": [
        [
          {
            "node": "a2471cbf-298d-462f-a403-a24330ba2a9f",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "90b1798a-b321-4fab-90f0-8a24862b7941": {
      "main": [
        [
          {
            "node": "f38a6156-f044-41b4-b919-67325b274b43",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6ed900d1-2485-4a06-8c04-7063807ca605": {
      "main": [
        [
          {
            "node": "f38a6156-f044-41b4-b919-67325b274b43",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "ae097d74-0d6e-4d7e-8037-f78a420c8ddf": {
      "main": [
        [
          {
            "node": "f38a6156-f044-41b4-b919-67325b274b43",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "19fda137-b8be-43b0-8828-0880db36deee": {
      "main": [
        [
          {
            "node": "e24ffee7-7895-4572-8de1-273baf764b8c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b279af3a-8f2b-49e8-9218-1d9ec409103c": {
      "main": [
        [
          {
            "node": "0b84e3a7-08f2-4428-b5be-2ace65b48b48",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

고급 - 리드 생성, AI 요약

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
고급
노드 수50
카테고리2
노드 유형16
난이도 설명

고급 사용자를 위한 16+개 노드의 복잡한 워크플로우

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34