LINE (plugin)

O LINE conecta ao OpenClaw via LINE Messaging API. O plugin roda como um receptor de webhook no gateway e usa seu channel access token + channel secret para autenticação.

Status: suportado via plugin. Mensagens diretas, chats em grupo, mídia, localizações, mensagens Flex, mensagens de template e respostas rápidas são suportadas. Reações e threads não são suportadas.

Plugin necessário

Instale o plugin LINE:

openclaw plugins install @openclaw/line

Checkout local (quando rodando a partir de um repositório git):

openclaw plugins install ./extensions/line

Configuração

  1. Crie uma conta LINE Developers e abra o Console: https://developers.line.biz/console/
  2. Crie (ou escolha) um Provider e adicione um canal Messaging API.
  3. Copie o Channel access token e o Channel secret das configurações do canal.
  4. Habilite Use webhook nas configurações da Messaging API.
  5. Defina a URL do webhook para o endpoint do seu gateway (HTTPS obrigatório):
https://gateway-host/line/webhook

O gateway responde à verificação de webhook do LINE (GET) e eventos de entrada (POST). Se precisar de um caminho personalizado, defina channels.line.webhookPath ou channels.line.accounts.<id>.webhookPath e atualize a URL correspondente.

Nota de segurança:

  • A verificação de assinatura do LINE depende do corpo da requisição (HMAC sobre o corpo bruto), então o OpenClaw aplica limites estritos de pré-autenticação no corpo e timeout antes da verificação.

Configurar

Configuração mínima:

{
  channels: {
    line: {
      enabled: true,
      channelAccessToken: "LINE_CHANNEL_ACCESS_TOKEN",
      channelSecret: "LINE_CHANNEL_SECRET",
      dmPolicy: "pairing",
    },
  },
}

Variáveis de ambiente (apenas conta padrão):

  • LINE_CHANNEL_ACCESS_TOKEN
  • LINE_CHANNEL_SECRET

Arquivos de token/secret:

{
  channels: {
    line: {
      tokenFile: "/path/to/line-token.txt",
      secretFile: "/path/to/line-secret.txt",
    },
  },
}

tokenFile e secretFile devem apontar para arquivos regulares. Symlinks são rejeitados.

Múltiplas contas:

{
  channels: {
    line: {
      accounts: {
        marketing: {
          channelAccessToken: "...",
          channelSecret: "...",
          webhookPath: "/line/marketing",
        },
      },
    },
  },
}

Controle de acesso

Mensagens diretas usam pareamento por padrão. Remetentes desconhecidos recebem um código de pareamento e suas mensagens são ignoradas até a aprovação.

openclaw pairing list line
openclaw pairing approve line <CODE>

Allowlists e políticas:

  • channels.line.dmPolicy: pairing | allowlist | open | disabled
  • channels.line.allowFrom: IDs de usuário LINE permitidos para DMs
  • channels.line.groupPolicy: allowlist | open | disabled
  • channels.line.groupAllowFrom: IDs de usuário LINE permitidos para grupos
  • Sobrescritas por grupo: channels.line.groups.<groupId>.allowFrom
  • Nota de runtime: se channels.line está completamente ausente, o runtime faz fallback para groupPolicy="allowlist" para verificações de grupo (mesmo se channels.defaults.groupPolicy estiver definido).

IDs do LINE são case-sensitive. IDs válidos se parecem com:

  • Usuário: U + 32 caracteres hex
  • Grupo: C + 32 caracteres hex
  • Sala: R + 32 caracteres hex

Comportamento de mensagens

  • Texto é dividido em 5000 caracteres.
  • Formatação Markdown é removida; blocos de código e tabelas são convertidos em cards Flex quando possível.
  • Respostas em streaming são armazenadas em buffer; o LINE recebe chunks completos com uma animação de carregamento enquanto o agente trabalha.
  • Downloads de mídia são limitados por channels.line.mediaMaxMb (padrão 10).

Dados do canal (mensagens ricas)

Use channelData.line para enviar respostas rápidas, localizações, cards Flex ou mensagens de template.

{
  text: "Aqui está",
  channelData: {
    line: {
      quickReplies: ["Status", "Ajuda"],
      location: {
        title: "Escritório",
        address: "Rua Principal, 123",
        latitude: 35.681236,
        longitude: 139.767125,
      },
      flexMessage: {
        altText: "Card de status",
        contents: {
          /* Payload Flex */
        },
      },
      templateMessage: {
        type: "confirm",
        text: "Prosseguir?",
        confirmLabel: "Sim",
        confirmData: "yes",
        cancelLabel: "Não",
        cancelData: "no",
      },
    },
  },
}

O plugin LINE também inclui um comando /card para presets de mensagem Flex:

/card info "Bem-vindo" "Obrigado por entrar!"

Resolução de problemas

  • Verificação de webhook falha: confirme que a URL do webhook é HTTPS e que o channelSecret corresponde ao console do LINE.
  • Sem eventos de entrada: confirme que o caminho do webhook corresponde a channels.line.webhookPath e que o gateway está acessível pelo LINE.
  • Erros de download de mídia: aumente channels.line.mediaMaxMb se a mídia exceder o limite padrão.