Pular para conteúdo

LINKEDIN POST LIST - Listar Publicações do Usuário

O que é esta operação?

O LinkedIn Post List é a operação responsável por listar as publicações (posts) do usuário autenticado no LinkedIn, permitindo análise de conteúdo histórico e métricas de engajamento.

Por que esta operação existe?

Análise de conteúdo e métricas de performance. O Post List existe para:

  1. Analytics: Analisar performance de posts anteriores
  2. Auditoria: Verificar histórico de publicações
  3. Moderação: Revisar conteúdo publicado
  4. Backup: Arquivar posts para registro
  5. Pesquisa: Encontrar posts específicos

Como funciona internamente?

Quando o Post List é executado, o sistema:

  1. Valida access token com escopo r_liteprofile e r_member_social
  2. Define limite de posts a retornar (padrão 50)
  3. Monta query com filtro por autor
  4. Faz GET para /v2/ugcPosts?q=authors
  5. Processa paginação se necessário
  6. Retorna array de posts com metadados
  7. Armazena resultado na variável especificada

Código interno (linkedin.executor.ts:111-120):

case 'list':
  // List user's posts
  const limit = data.limit || 50;
  const listResponse = await axios.get(`${baseUrl}/ugcPosts?q=authors&authors=List(urn:li:person:${data.personId || 'me'})&count=${limit}`, {
    headers: {
      'Authorization': `Bearer ${accessToken}`,
      'Content-Type': 'application/json',
    },
  });
  return listResponse.data;

Quando você DEVE usar esta operação?

Use Post List sempre que precisar analisar posts históricos:

Casos de uso:

  1. Dashboard analytics: Mostrar posts recentes e métricas
  2. Content audit: Revisar conteúdo publicado
  3. Backup automatizado: Salvar posts em banco de dados
  4. Buscar por hashtag: Filtrar posts com hashtags específicas
  5. Análise de frequência: Verificar ritmo de publicação
  6. Moderação de conteúdo: Revisar posts problemáticos

Quando NÃO usar Post List:

  • Posts de outros usuários: API retorna apenas posts próprios
  • Comentários: Não lista comentários, apenas posts principais
  • Posts de empresa: Use operações de company para isso

Parâmetros Detalhados

limit (number, opcional)

O que é: Número máximo de posts a retornar.

Padrão: 50

Máximo: 100 por requisição

Flow completo para testar:

{
  "name": "LinkedIn - Listar Últimos 10 Posts",
  "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_ACCESS_TOKEN"
        }
      }
    },
    {
      "id": "linkedin_1",
      "type": "linkedin",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Listar Posts",
        "resource": "posts",
        "operation": "list",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "limit": 10,
        "responseVariable": "meusPosts"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Mostrar Quantidade",
        "parameters": {
          "message": "📊 Total de posts encontrados: {{meusPosts.paging.total}}\n\nPrimeiro post: {{meusPosts.elements[0].specificContent.com.linkedin.ugc.ShareContent.shareCommentary.text}}"
        }
      }
    },
    {
      "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 para ver seus últimos 10 posts!

config.accessToken (string, obrigatório)

O que é: Token OAuth 2.0 com escopos r_liteprofile e r_member_social.

Parâmetros

Campo Tipo Obrigatório Descrição
resource string Sim Sempre "posts"
operation string Sim Sempre "list"
limit number Não Número de posts (padrão: 50, máx: 100)
config.accessToken string Sim Token OAuth 2.0
responseVariable string Não Nome da variável de resposta (padrão: linkedInResult)

Exemplo 1: Analytics Dashboard

Objetivo: Criar dashboard com últimos posts e estatísticas

JSON para Importar

{
  "name": "LinkedIn - Analytics Dashboard",
  "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": "Buscar Posts",
        "resource": "posts",
        "operation": "list",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "limit": 50,
        "responseVariable": "posts"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Dashboard",
        "parameters": {
          "message": "📊 ANALYTICS DASHBOARD\n\n📝 Total de posts: {{posts.paging.total}}\n📅 Posts retornados: {{posts.paging.count}}\n\n🎯 Últimos 3 posts:\n1. {{posts.elements[0].specificContent.com.linkedin.ugc.ShareContent.shareCommentary.text}}\n2. {{posts.elements[1].specificContent.com.linkedin.ugc.ShareContent.shareCommentary.text}}\n3. {{posts.elements[2].specificContent.com.linkedin.ugc.ShareContent.shareCommentary.text}}"
        }
      }
    },
    {
      "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: 📊 ANALYTICS DASHBOARD

📝 Total de posts: 127
📅 Posts retornados: 50

🎯 Últimos 3 posts:
1. Feliz em compartilhar...
2. Nova conquista...
3. Dica do dia...

Exemplo 2: Backup Automatizado

Objetivo: Salvar posts em banco de dados para backup

JSON para Importar

{
  "name": "LinkedIn - Backup Posts",
  "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": "Buscar Todos Posts",
        "resource": "posts",
        "operation": "list",
        "config": {
          "accessToken": "{{linkedin_token}}"
        },
        "limit": 100,
        "responseVariable": "allPosts"
      }
    },
    {
      "id": "loop_1",
      "type": "loop",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Iterar Posts",
        "parameters": {
          "array": "{{allPosts.elements}}",
          "itemVariable": "currentPost"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Log",
        "parameters": {
          "message": "💾 Salvando post: {{currentPost.id}}"
        }
      }
    },
    {
      "id": "message_final",
      "type": "message",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Concluído",
        "parameters": {
          "message": "✅ Backup concluído! {{allPosts.paging.count}} posts salvos."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "linkedin_1" },
    { "source": "linkedin_1", "target": "loop_1" },
    { "source": "loop_1", "target": "message_1" },
    { "source": "message_1", "target": "loop_1" },
    { "source": "loop_1", "target": "message_final", "label": "done" },
    { "source": "message_final", "target": "end_1" }
  ]
}

Resposta do Node

{
  "paging": {
    "count": 10,
    "start": 0,
    "total": 127,
    "links": []
  },
  "elements": [
    {
      "id": "urn:li:share:123456789",
      "author": "urn:li:person:abcd1234",
      "lifecycleState": "PUBLISHED",
      "specificContent": {
        "com.linkedin.ugc.ShareContent": {
          "shareCommentary": {
            "text": "Conteúdo do post aqui..."
          },
          "shareMediaCategory": "NONE"
        }
      },
      "visibility": {
        "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
      },
      "created": {
        "actor": "urn:li:person:abcd1234",
        "time": 1642512000000
      }
    }
  ]
}

Campos Retornados

Campo Tipo Descrição
paging.count number Número de posts retornados
paging.total number Total de posts disponíveis
elements array Array de posts
elements[].id string URN do post
elements[].specificContent object Conteúdo do post
elements[].created.time number Timestamp criação
elements[].visibility object Configuração de visibilidade

Boas Práticas

SIM: - Use paginação para listar todos os posts - Armazene results em cache temporário - Use LOOP para processar cada post - Valide se array elements existe - Limite requisições (rate limits)

NÃO: - Não busque todos os posts repetidamente - Não ignore paginação (limite 100/req) - Não assuma que elements tem itens - Não faça chamadas em loop infinito

Dicas

💡 Paginação: Use paging.total para calcular páginas necessárias 💡 Cache: Salve resultados por 1 hora para evitar chamadas 💡 Filtros: Processe localmente (API não tem filtros avançados) 💡 Performance: Busque apenas o necessário (use limit baixo)

Próximo Node

Post Create - Criar nova publicação → Profile Get - Obter dados do perfil → Company List Managed - Listar empresas gerenciadas