Pular para conteúdo

LINKEDIN PROFILE GET - Obter Perfil do Usuário

O que é esta operação?

O LinkedIn Profile Get é a operação responsável por obter informações do perfil do usuário autenticado no LinkedIn, incluindo nome, sobrenome, ID e dados básicos profissionais.

Por que esta operação existe?

Integrar dados profissionais do LinkedIn em automações. O Profile Get existe para:

  1. Personalização: Usar nome do usuário em mensagens e flows
  2. Identificação: Obter ID único do LinkedIn para outras operações
  3. Validação: Confirmar autenticação e permissões
  4. Enriquecimento: Adicionar dados profissionais ao CRM
  5. Onboarding: Capturar informações básicas de novos usuários

Como funciona internamente?

Quando o Profile Get é executado, o sistema:

  1. Valida access token do LinkedIn OAuth 2.0
  2. Faz requisição GET para https://api.linkedin.com/v2/me
  3. Envia headers de autorização e content-type
  4. Recebe resposta com dados do perfil
  5. Armazena resultado na variável especificada
  6. Retorna contexto atualizado para próximo node

Código interno (linkedin.executor.ts:48-74):

private async handleProfile(operation: string, data: any, accessToken: string, context: ExecutionContext): Promise<any> {
  const baseUrl = 'https://api.linkedin.com/v2';

  switch (operation) {
    case 'get':
      // Get current user profile
      const profileResponse = await axios.get(`${baseUrl}/me`, {
        headers: {
          'Authorization': `Bearer ${accessToken}`,
          'Content-Type': 'application/json',
        },
      });
      return profileResponse.data;

    // ...
  }
}

Quando você DEVE usar esta operação?

Use Profile Get sempre que precisar de dados do perfil do usuário:

Casos de uso:

  1. Personalização de mensagens: "Olá {{firstName}}, bem-vindo!"
  2. Identificação de usuário: Obter ID único para outras operações
  3. Validação de autenticação: Testar se token é válido
  4. Enriquecimento de CRM: Adicionar dados do LinkedIn ao Salesforce
  5. Onboarding automatizado: Capturar dados para cadastro
  6. Analytics: Rastrear qual usuário iniciou o flow

Quando NÃO usar Profile Get:

  • Obter e-mail: Use Profile Get Email específico
  • Dados de outros usuários: API não permite (apenas perfil autenticado)
  • Histórico de posts: Use Post List

Parâmetros Detalhados

config.accessToken (string, obrigatório)

O que é: Token de acesso OAuth 2.0 do LinkedIn.

Como obter: 1. Crie aplicação em LinkedIn Developers 2. Configure OAuth 2.0 3. Solicite escopo r_liteprofile 4. Use token retornado

Flow completo para testar:

{
  "name": "LinkedIn - Obter Perfil",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Configurar Token",
        "parameters": {
          "name": "linkedin_token",
          "value": "SEU_ACCESS_TOKEN_AQUI"
        }
      }
    },
    {
      "id": "linkedin_1",
      "type": "linkedin",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Obter Perfil",
        "resource": "profile",
        "operation": "get",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "responseVariable": "meuPerfil"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Mostrar Dados",
        "parameters": {
          "message": "✅ Perfil obtido!\n\nNome: {{meuPerfil.localizedFirstName}}\nSobrenome: {{meuPerfil.localizedLastName}}\nID: {{meuPerfil.id}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "linkedin_1" },
    { "source": "linkedin_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Execute o flow. Você verá seu nome, sobrenome e ID do LinkedIn!

responseVariable (string, opcional)

O que é: Nome da variável onde o resultado será armazenado.

Padrão: "linkedInResult"

Flow completo para testar:

{
  "name": "LinkedIn - Variable Customizada",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Token",
        "parameters": {
          "name": "linkedin_token",
          "value": "SEU_TOKEN"
        }
      }
    },
    {
      "id": "linkedin_1",
      "type": "linkedin",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Obter Meu Perfil",
        "resource": "profile",
        "operation": "get",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "responseVariable": "dadosUsuario"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Saudação",
        "parameters": {
          "message": "Olá {{dadosUsuario.localizedFirstName}}! 👋"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "linkedin_1" },
    { "source": "linkedin_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Parâmetros

Campo Tipo Obrigatório Descrição
resource string Sim Sempre "profile"
operation string Sim Sempre "get"
config.accessToken string Sim Token OAuth 2.0 do LinkedIn
responseVariable string Não Nome da variável de resposta (padrão: linkedInResult)

Exemplo 1: Personalizar Mensagem com Nome

Objetivo: Buscar perfil do usuário e personalizar saudação

JSON para Importar

{
  "name": "LinkedIn - Saudação Personalizada",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Configurar Token",
        "parameters": {
          "name": "linkedin_token",
          "value": "SEU_ACCESS_TOKEN_AQUI"
        }
      }
    },
    {
      "id": "linkedin_1",
      "type": "linkedin",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Perfil",
        "resource": "profile",
        "operation": "get",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "responseVariable": "perfil"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Saudação",
        "parameters": {
          "message": "🎯 Olá, {{perfil.localizedFirstName}} {{perfil.localizedLastName}}!\n\nSeja bem-vindo ao nosso sistema."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "linkedin_1" },
    { "source": "linkedin_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 🎯 Olá, José Roberto!

Seja bem-vindo ao nosso sistema.

Exemplo 2: Validar Autenticação

Objetivo: Testar se o token do LinkedIn é válido antes de continuar

JSON para Importar

{
  "name": "LinkedIn - Validar Token",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Token",
        "parameters": {
          "name": "linkedin_token",
          "value": "SEU_TOKEN"
        }
      }
    },
    {
      "id": "linkedin_1",
      "type": "linkedin",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Testar Token",
        "resource": "profile",
        "operation": "get",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "responseVariable": "validacao"
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Token Válido?",
        "parameters": {
          "variable": "validacao.id",
          "operator": "exists"
        }
      }
    },
    {
      "id": "message_success",
      "type": "message",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "✅ Token válido! Autenticado como {{validacao.localizedFirstName}}"
        }
      }
    },
    {
      "id": "message_error",
      "type": "message",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Erro",
        "parameters": {
          "message": "❌ Token inválido ou expirado. Por favor, faça login novamente."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "linkedin_1" },
    { "source": "linkedin_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_success", "label": "true" },
    { "source": "condition_1", "target": "message_error", "label": "false" },
    { "source": "message_success", "target": "end_1" },
    { "source": "message_error", "target": "end_1" }
  ]
}

Saída esperada (sucesso):

Sistema: ✅ Token válido! Autenticado como José

Exemplo 3: Enriquecer CRM com Dados do LinkedIn

Objetivo: Obter perfil do LinkedIn e criar/atualizar lead no Salesforce

JSON para Importar

{
  "name": "LinkedIn → Salesforce Integration",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Tokens",
        "parameters": {
          "name": "linkedin_token",
          "value": "SEU_LINKEDIN_TOKEN"
        }
      }
    },
    {
      "id": "linkedin_1",
      "type": "linkedin",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Perfil LinkedIn",
        "resource": "profile",
        "operation": "get",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "responseVariable": "linkedinProfile"
      }
    },
    {
      "id": "linkedin_2",
      "type": "linkedin",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Buscar Email",
        "resource": "profile",
        "operation": "get_email",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "responseVariable": "linkedinEmail"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Confirmar Dados",
        "parameters": {
          "message": "📊 Dados capturados do LinkedIn:\n\nNome: {{linkedinProfile.localizedFirstName}} {{linkedinProfile.localizedLastName}}\nEmail: {{linkedinEmail.elements[0].handle~.emailAddress}}\n\nCriando lead no Salesforce..."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "linkedin_1" },
    { "source": "linkedin_1", "target": "linkedin_2" },
    { "source": "linkedin_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 📊 Dados capturados do LinkedIn:

Nome: José Roberto
Email: jose@exemplo.com

Criando lead no Salesforce...

Resposta do Node

{
  "localizedFirstName": "José",
  "localizedLastName": "Roberto",
  "id": "abcd1234",
  "firstName": {
    "localized": {
      "pt_BR": "José"
    },
    "preferredLocale": {
      "country": "BR",
      "language": "pt"
    }
  },
  "lastName": {
    "localized": {
      "pt_BR": "Roberto"
    },
    "preferredLocale": {
      "country": "BR",
      "language": "pt"
    }
  }
}

Campos Retornados

Campo Tipo Descrição
id string ID único do usuário no LinkedIn
localizedFirstName string Nome no idioma do usuário
localizedLastName string Sobrenome no idioma do usuário
firstName object Nome com localização detalhada
lastName object Sobrenome com localização detalhada

Boas Práticas

SIM: - Armazene tokens em variáveis seguras (não hardcode) - Valide resposta antes de usar dados - Trate erros de autenticação com CONDITION - Cache dados do perfil (não busque repetidamente) - Use responseVariable descritivo

NÃO: - Não exponha access token em logs ou mensagens - Não assuma que campos sempre existem (valide) - Não faça múltiplas chamadas desnecessárias - Não ignore erros de API

Dicas

💡 Token expira: Implemente refresh token flow para renovação automática 💡 Rate limits: LinkedIn permite ~100k chamadas por dia por app 💡 Cache inteligente: Salve dados do perfil em banco para evitar chamadas 💡 Campos localizados: Use localizedFirstName para simplicidade

Próximo Node

Profile Get Email - Obter endereço de e-mail → Post Create - Criar publicação no LinkedIn → Company List Managed - Listar empresas gerenciadas