通过一次 REST API 调用,向 10 个社交平台发布视频、图片、文字与文档。
集成
ghl-integration
试用Ferramenta de integração com o GoHighLevel (GHL) API v2. Permite gerenciar contatos, mover cartões no Kanban, identificar leads sem resposta, adicionar contatos a fluxos, ENVIAR MENSAGENS DIRETAS e receber novos leads instantaneamente via WEBHOOK.
它能做什么
GoHighLevel (GHL) API v2 Integration Skill **Desenvolvido por / Créditos:** Rafa Martins (rafacpti@gmail.com)
技能文档
GoHighLevel (GHL) API v2 Integration Skill
Desenvolvido por / Créditos: Rafa Martins (rafacpti@gmail.com)
Esta skill permite ao Hermes interagir com a API v2 do GoHighLevel por meio do utilitário local ghl_client.py e receber eventos instantâneos com ghl_webhook_server.py.
⚠️ REGRA DE GOVERNANÇA E HUMAN-IN-THE-LOOP (CRÍTICO)
Para proteção contra loops e destruição de dados acidentais no CRM:
- PROIBIDO DELETAR contatos, oportunidades, mensagens, tarefas ou notas de forma autônoma.
- PROIBIDO DESATIVAR OU ALTERAR Workflows/Automações estruturais no GHL.
- Se houver comandos para destruição de dados ou cancelamento em lote, o Hermes DEVE pausar e solicitar autorização explícita do usuário humano primeiro.
- Operações de exclusão na API devem sempre usar confirmação manual (
Human-in-the-Loop).
🚨 PITFALL: mensagens de broadcast de TERCEIROS contaminam relatórios
As conversas retornadas por --action unanswered incluem listas de transmissão, grupos e
comunidades que o próprio usuário assina (ex.: comunidades de API/dev, avisos de "estamos ao
vivo", convites para imersões/webinars). Elas trazem URLs promocionais de terceiros.
Se um relatório automatizado (cron de auditoria) extrai URLs dessas conversas e as mistura com as URLs reais dos criativos de anúncio, cria um ativo fantasma que parece campanha ativa. Isso já aconteceu e gerou o falso positivo "Evolution Imersão" em relatório de Meta Ads.
Regras:
- URLs vindas de conversas do GHL nunca entram em tabelas de "Auditoria de Landing Pages"
ou de destinos de anúncio. Essas tabelas só aceitam URLs extraídas de
adcreatives. - Se links de conversas forem relevantes, coloque-os em seção separada rotulada como "links recebidos de terceiros (não são destinos de anúncio)".
- Antes de tratar um remetente como lead, verifique se é pessoa física:
phonecom formato+120363330319945564(muito longo, sem DDI válido) indica grupo/broadcast, não contato. - Ao investigar de onde saiu um nome estranho em relatório, faça grep primeiro nos outputs do
cron e nos dumps de sessão — antes de acusar a plataforma de anúncios:
grep -i -n -E "" /root/.hermes/cron/output/*.txt grep -rhoi -E ".{0,300}" /root/.hermes/sessions/*.json | sort -u | head
⚡ Variáveis de Ambiente Necessárias (Adicionar ao .env ou config.yaml)
GHL_API_KEY=sua_location_api_key_aqui
GHL_LOCATION_ID=seu_location_id_aqui
GHL_WEBHOOK_PORT=8080
MANAGER_PHONE=telefone_do_gestor_para_alertas
🟢 WEBHOOK EM TEMPO REAL: RECEBER LEADS
Para receber leads de forma síncrona sem colisões multi-conta:
- Inicie o servidor HTTP interno do Hermes:
python3 /root/.hermes/metaads/ghl_webhook_server.py - No Workflow do GoHighLevel, aponte a ação HTTP POST de Webhook para:
http://IP_DO_HERMES:GHL_WEBHOOK_PORT/webhook/
🛠️ Comandos de Execução no Terminal
O agente executa estas tarefas chamando diretamente o script /root/.hermes/metaads/ghl_client.py via Python:
1. Enviar Mensagem Direta (E-mail, SMS ou WhatsApp via STEVO)
# Enviar E-mail
python3 /root/.hermes/metaads/ghl_client.py --action send_msg --contact-id --msg-type "Email" --subject "Sua Proposta Chegou!" --message "Olá, segue aqui a sua proposta comercial."
# Enviar SMS ou WhatsApp
python3 /root/.hermes/metaads/ghl_client.py --action send_msg --contact-id --msg-type "WhatsApp" --message "Olá! Vimos seu cadastro no Instagram. Como podemos te ajudar?"
2. Encontrar Leads Sem Resposta (Inbound pendentes)
python3 /root/.hermes/metaads/ghl_client.py --action unanswered
3. Mover Lead no Kanban (Mudar Etapa)
python3 /root/.hermes/metaads/ghl_client.py --action update_opp_stage --opp-id --stage-id
4. Criar Contato com Tags do Meta Ads
python3 /root/.hermes/metaads/ghl_client.py --action create_contact --email "exemplo@email.com" --name "João Silva" --phone "+551****9999" --tags "meta-ads"
💡 COMPORTAMENTOS CONHECIDOS & TROUBLESHOOTING
- Diferença entre Conversation ID e Contact ID:
Ao executar a listagem de leads sem resposta via
--action unanswered, saiba que a chave"id"no payload de conversas representa o Conversation ID daquela conversa específica. No entanto, para enviar mensagens (--action send_msg) ou manipular o contato, é obrigatório passar o Contact ID (que vem sob a chave"contactId"no payload bruto do GHL). Sempre certifique-se de obter e usar o ID do contato e não o ID da conversa.- Header de Versão Obrigatório (
Version: 2021-04-15): Ao fazer chamadas diretas REST para a API do LeadConnector/GHL (/conversations/search), utilize obrigatoriamente o headerVersion: 2021-04-15. O uso de versões mais recentes (como2021-07-28) retorna payload vazio ({"conversations": []}). - Workaround via raw API / Helper Script: Para obter o
contactIdde cada conversa retornada pelo script, faça chamada direta utilizando obrigatoriamente a base da API v2 (https://services.leadconnectorhq.com— NUNCA utilizerest.gohighlevel.comlegada, pois ela retorna 0 conversas nos endpoints v2). Para evitar erros de parsing de.env(como 401 Invalid JWT por aspas não tratadas), importe o cliente diretamente:import sys, requests sys.path.append('/root/.hermes/metaads') import ghl_client headers = ghl_client.get_headers() loc_id = ghl_client.GHL_LOCATION_ID url = f"{ghl_client.GHL_API_BASE}/conversations/search" params = {"locationId": loc_id, "limit": 30} res = requests.get(url, headers=headers, params=params) for conv in res.json().get("conversations", []): conv_id = conv.get("id") contact_id = conv.get("contactId") # ← o campo correto name = conv.get("contactName") phone = conv.get("phone") - Ordenação Temporal de Mensagens (
dateAdded): Ao consultar/conversations/{conv_id}/messages, as mensagens na lista podem vir desordenadas. Para identificar com certeza quem enviou a última mensagem (inboundvsoutbound), ordene a lista pordateAdded(ISO 8601):sorted_msgs = sorted(msgs, key=lambda x: x.get("dateAdded", "")) last_msg = sorted_msgs[-1] if sorted_msgs else None - Notas sobre f-strings no terminal Python one-liner: Ao escrever
-cone-liners Python com f-strings, evite backslashes dentro das chaves do f-string (sintaxe inválida no Python 3.11-). Use variáveis intermediárias:# ERRADO: print(f"{d.get(\"key\")}") # CERTO: val = d.get("key") print(f"{val}")
- Header de Versão Obrigatório (
- Triagem de Mensagens Sem Resposta:
Para classificar leads obtidos via
--action unanswered, utilize a taxonomia de triagem definida emreferences/unanswered_leads_triaging_patterns.md(classificando entre Faturamento, Notificação de Sistema, Erro de Integração ou Engajamento Ativo). - Queda de Conexão do Gateway (WhatsApp Inativo):
Se o webhook ou cron relatar que o serviço "não está rodando" ou retornar tags do tipo
[P-mon] papi_disconnectedno campo de últimas mensagens, vejareferences/stevo-whatsapp.mdpara instruções de reconexão do QR Code.
相关技能
通过托管的 OAuth GraphQL 接口查询与管理 Linear 的 issue、项目、团队、周期、标签和评论。
通过 6551 REST API 查询 Twitter/X 用户资料、推文、粉丝事件与 KOL 数据。
以 AI 机器人身份加入视频会议,提供语音、虚拟形象与屏幕共享四种模式。
把自然语言描述转为结构化 JSON,并由 mcp-diagram-generator MCP 服务生成 Draw.io、Mermaid 或 Excalidraw 图表文件。
诊断生产力系统反复失效的根因,给出最小干预——容量测算、瓶颈定位、可靠的本地记录。
rafacpti23 的更多技能
浏览全部技能PAPI WhatsApp Cloud API - Envio e automação de mensagens WhatsApp (texto, PTT áudio de voz, mídias, botões interativos, enquetes, listas e webhooks).
Automate WhatsApp messaging, interactive content, instance and group management, catalogs, and webhooks via a scalable microservices API with an admin panel.
Zero-Knowledge persistent memory layer for Hermes Agent. Provides encrypted cross-session memory, Trust Quotient (TQ) scoring, and automatic recall across AL...
Subagente autônomo especialista em Meta Ads. Cria campanhas completas via MCP (Super Prompt), gera criativos com IA, monitora métricas (CPA/ROAS/CTR), executa otimizações, pausa anúncios ruins e alerta via Papi. Suporta multi-contas de anúncios.
Provides persistent, encrypted AI agent memory with a 4-layer security pipeline for storing, retrieving, sharing, and analyzing agent memories.
Motor autônomo de redação direta e criativos visuais de alta conversão para Meta Ads via Habilis MCP Gateway (https://xvix.com.br). Gera variações AIDA/PAS e publica criativos.