Ir para o conteúdo principal

Telegram(Edição)

Visão1. GeralINFORMAÇÕES GERAIS

Recursos da1.1 Biblioteca Telegram Bot API Utilizados no OmnichannelUtilizada

Biblioteca:
  • Nome: node-telegram-bot-api

  • Versão: 0.61.0


  • MétodosDescrição: daBiblioteca JavaScript para interagir com a API Utilizadosoficial do Telegram Bot, permitindo criar bots que podem enviar e receber mensagens, mídia e outros tipos de conteúdo.

  • 1.2 Configuração e InicializaçãoBase

    newclass TelegramBot(token,TelegramConfigParams options){
      @IsString()
      @IsNotEmpty()
      token: string  // Token do bot obtido via @BotFather
    }
    

    Descrição: Configuração mínima necessária contendo apenas o token do bot, que é obtido através do @BotFather no Telegram.


    2. MÉTODOS DE ENVIO DE MENSAGENS

    2.1 sendMessage()

    getSession(config:sendMessage(session: TelegramConfigParams)Session, payload: SendMessagePayload): Promise<any>

    Descrição: Envia mensagens de texto simples com suporte a formatação Markdown e mensagens citadas.

    2.1.1 Estrutura de Entrada

    {
      to: string             //Usuario Destino
      body?: string          //Conteudo da Mensagem
      userName?: string      // Nome de Usuario
      mediaUri?: string      // URL de midia
        quotedMessage?:{     // Mensagem a ser respondida
        id:string;           //Id da mensagem original a ser respondida
      }
    
    

    2.1.2 Implementação no Sistema

    async sendMessage(session: Session, payload: SendMessagePayload): Promise<any> {
        const { tokento, body, mediaUri, userName } = configpayload
        const text = userName ? Utils.addUserNameToMessage(userName, body) : body
        const telegramBot = this.getSession(session.channel.params as TelegramConfigParams)
        let reply = {}
        if (Number(payload?.quotedMessage?.id)) {
          reply = { reply_to_message_id: Number(payload.quotedMessage.id) }
        }
          let response
      
          .
          .
          .
      
       } else {
          response = await telegramBot.sendMessage(to, text, { ...reply, parse_mode: 'Markdown' })
        }
    
        return newresponse?.message_id?.toString()
      TelegramBot(token,}

    2.1.3 Estrutura de Retorno

    {
      message_id: number,       // ID único da mensagem enviada
    }
    

    2.2 sendPhoto()

    sendPhoto(to, mediaUri, {...reply})
    

    Descrição: Envia imagens (JPEG, PNG, GIF até 10MB) com caption opcional e suporte a mensagens citadas.

    2.2.1 Estrutura de Entrada

    {
       to,                    // chatId
      mediaUri,               // URL media
      { polling:reply_to_message_id:} false//Id do reply
    }
    

    2.2.2 Implementação no Sistema

    if (mimetype.match('image')) {
      response = await telegramBot.sendPhoto(to, mediaUri, { ...reply })
    }
    

      2.3

    • sendVideo()

      sendVideo(to, mediaUri, { ...reply })
      

      UsoDescrição: CriaçEnvia vídeos (MP4 até 50MB) com suporte a thumbnail, duração dae instânciadimensões personalizadas.

      2.3.1 Estrutura de Entrada

      {
         to,                    // chatId
        mediaUri,               // URL media
        { reply_to_message_id:} //Id do reply
      }
      
      

      2.3.2 Implementação no Sistema

      if (mimetype.match('video')) {
        response = await telegramBot.sendVideo(to, mediaUri, { ...reply })
      }
      

      2.4 sendVoice()

      sendVoice(to, mediaUri, { ...reply })
      

      Descrição: Envia mensagens de voz (OGG com codec OPUS) que aparecem como áudio reproduzível no cliente Telegram.

      2.4.1 Estrutura de Entrada

      {
         to,                    // chatId
        mediaUri,               // URL media
        { reply_to_message_id:} //Id do reply
      }
      

      2.4.2 Implementação no Sistema

      if (mimetype.match('audio')) {
        response = await telegramBot.sendVoice(to, mediaUri, { ...reply })
      }
      

      2.5 sendDocument()

      sendDocument(to, mediaUri, { ...reply })
      

      Descrição: Envia arquivos gerais (PDF, ZIP, documentos até 50MB) que são baixáveis pelo usuário.

      2.5.1 Estrutura de Entrada

      {
         to,                    // chatId
        mediaUri,               // URL media
        { reply_to_message_id:} //Id do reply
      }
      
      

      2.5.2 Implementação no Sistema

      if (mimetype.match(/gif|zip|pdf/)) {
        response = await telegramBot.sendDocument(to, mediaUri, { ...reply })
      }
      

      3. MÉTODOS DE RECEBIMENTO E PROCESSAMENTO

      3.1 getFileLink()

      getFileLink(fileId: string): Promise<string>
      

      Descrição: Converte um file_id recebido via webhook em uma URL direta para download do arquivo, válida por 1 hora.

      3.1.1 Estrutura de Entrada

      {
        fileId: string            // ID único do arquivo fornecido pelo Telegram
      }
      

      3.1.2 Implementação no Sistema

      incomingMessage.message.media = {
        uri: await telegramBot.getFileLink(file_id),
        contentType: mime_type,
        fileName: file_name,
      }
      

      3.1.3 Estrutura de Retorno

      string  // URL direta HTTPS para download do arquivo
      

      3.2 setWebHook()

      setWebHook(url: string, options?: SetWebHookOptions): Promise<boolean>
      

      Descrição: Configura o endpoint webhook onde o Telegram enviará todas as atualizações do bot (mensagens, edições, etc.).

    • Token3.2.1 Estrutura de Entrada

      {
        url: string,              // URL HTTPS do webhook (máx. 256 caracteres)
        options?: Obtido{
          dacertificate?: configuraçstring,   // Certificado SSL público (se necessário)
          max_connections?: number, // Máx. conexões simultâneas (1-100)
          allowed_updates?: string[] // Tipos de update a receber
        }
      }
      

      3.2.2 Implementação dono canalSistema

    1.1 Configuração de Webhook
    setWebHook(url, options)
    async setWebHook(url: string, platformChannelsConfig: PlatformChannelsConfig) {
      const telegramBot = await this.getSession(platformChannelsConfig.params)
      return await telegramBot.setWebHook(url)
    }
    

    • 4. EVENTOS E ESTRUTURAS DE WEBHOOK

      Funcionalidade4.1 Update Structure (Evento Principal): Configuração de webhook para receber mensagens

    • URL: Endpoint do Omnichannel para processar updates


    2. Envio de Mensagens

    sendMessage(chatId,interface text, options)
    response = await telegramBot.sendMessage(to, text,Update {
      ...reply,update_id: parse_mode:number,
      'Markdown'message?: Message,
      edited_message?: Message,
      channel_post?: Message,
      edited_channel_post?: Message
    })
    

      Descrição:

    • Estrutura principal que encapsula todas as atualizações enviadas pelo Telegram via webhook, incluindo mensagens novas e editadas.

      Funcionalidade4.1.1 Implementação no DTO

      export class TelegramMessageDto {
        @IsNumber()
        update_id: number         // ID sequencial único do update
      
        @IsOptional()
        @ValidateNested()
        @Type(() => TelegramMessageDetail)
        message?: EnvioTelegramMessageDetail      // Nova mensagem recebida
      
        @IsOptional()
        @ValidateNested()
        @Type(() => TelegramMessageDetail)
        edited_message?: TelegramMessageDetail  // Mensagem editada
      }
      

      4.2 Message Structure (Evento de mensagens de textoMensagem)

    • Parse Mode: Markdown para formatação

    • Reply: Suporte a mensagens citadas

    • Retorno

      Estrutura da Mensagem
      interface Message {
        message_id: number,
        from:from?: TelegramMessageSender,User,
        date: number,
        chat: Chat,
        text?: string,
        caption?: string,
        photo?: TelegramMessageMedia[PhotoSize[],
        video?: Video,
        voice?: TelegramMessageMedia,Voice,
        document?: TelegramMessageMedia,Document,
        location?: LocationDto,Location,
        reply_to_message?: Message
      }
      

      Descrição: Estrutura completa de uma mensagem, contendo metadados, conteúdo e informações do remetente e chat.

      4.2.1 Implementação no DTO

      export class TelegramMessageDetail {
        @IsNumber()
        message_id: number        // ID único da mensagem no chat
      
        @ValidateNested()
        @Type(() => TelegramMessageSender)
        from: TelegramMessageSender  // Informações do remetente
      
        @IsNumber()
        date: number             // Timestamp Unix da mensagem
      
        @IsString()
        @IsOptional()
        text?: string            // Texto da mensagem (se for texto)
      
        @IsString()
        @IsOptional()
        caption?: string         // Legenda de mídia
      
        @IsArray()
        @IsOptional()
        photo?: TelegramMessageMedia[]  // Array de fotos em diferentes resoluções
      
        @IsOptional()
        voice?: TelegramMessageMedia    // Mensagem de voz
      
        @IsOptional()
        document?: TelegramMessageMedia // Documento anexado
      
        @IsOptional()
        location?: LocationDto          // Localização compartilhada
      
        @IsOptional()
        reply_to_message?: TelegramReplyMessage  // Mensagem citada
      }
      

      4.3

      SendPhotoUser Structure (Remetente)

    sendPhoto(chatId,interface photo, options)
    response = await telegramBot.sendPhoto(to, mediaUri,User {
      ...replyid: number,
      is_bot: boolean,
      first_name: string,
      last_name?: string,
      username?: string,
      language_code?: string
    })
    

      Descrição:

    • Informações completas do usuário que enviou a mensagem, incluindo identificação única e dados de perfil.

      Funcionalidade4.3.1 Implementação no DTO: Envio de imagens

    • Mídia: Suporte a URLs e file_id

    • Reply: Mensagens citadas suportadas

     SendVideo:
    sendVideo(chatId,export video,class options)
    response = await telegramBot.sendVideo(to, mediaUri,TelegramMessageSender {
      ...reply@IsNumber()
      id: number               // ID único do usuário no Telegram
    
      @IsBoolean()
      is_bot: boolean          // Indica se é um bot
    
      @IsString()
      first_name: string       // Nome obrigatório
    
      @IsString()
      @IsOptional()
      last_name?: string       // Sobrenome opcional
    
      @IsString()
      @IsOptional()
      username?: string        // @username opcional
    
      @IsString()
      @IsOptional()
      language_code?: string   // Código do idioma (ex: 'pt-br')
    })
    
    • Funcionalidade4.4 PhotoSize Structure (Fotos): Envio de vídeos

    • Formatos: MP4 e outros formatos de vídeo

     SendVoice:
    sendVoice(chatId,interface voice, options)
    response = await telegramBot.sendVoice(to, mediaUri,PhotoSize {
      ...replyfile_id: string,
      file_unique_id: string,
      width: number,
      height: number,
      file_size?: number
    })
    

      Descrição:

    • Representa uma foto em uma resolução específica. O Telegram envia fotos em múltiplas resoluções (thumbnail, média, alta).

      Funcionalidade4.4.1 Implementação no DTO: Envio de áudios/voice messages

    • Formatos: OGG e outros formatos de áudio

    SendDocument:
    sendDocument(chatId,export document,class options)
    response = await telegramBot.sendDocument(to, mediaUri,TelegramMessageMedia {
      ...reply@IsString()
      file_id: string          // ID único do arquivo (temporário)
    
      @IsString()
      @IsOptional()
      file_name?: string       // Nome original do arquivo
    
      @IsString()
      @IsOptional()
      mime_type?: string       // Tipo MIME (image/jpeg, video/mp4, etc.)
    
      @IsOptional()
      @IsNumber()
      width?: number           // Largura em pixels
    
      @IsOptional()
      @IsNumber()
      height?: number          // Altura em pixels
    
      @IsOptional()
      @IsNumber()
      file_size?: number       // Tamanho em bytes
    })
    

      4.5

    • Location Structure (Localização)

      interface Location {
        longitude: number,
        latitude: number,
        live_period?: number,
        heading?: number,
        horizontal_accuracy?: number
      }
      

      FuncionalidadeDescrição: EnvioCoordenadas geográficas compartilhadas pelo usuário, com suporte a localização em tempo real e precisão.

      4.5.1 Implementação no DTO

      export class LocationDto {
        @IsString()
        latitude: string         // Latitude em graus decimais
      
        @IsString()
        longitude: string        // Longitude em graus decimais
      }
      

      5. MAPEAMENTO DE EVENTOS

      5.1 Mensagem Recebida (MESSAGE)

      const incomingMessage: IncomingMessageDto = {
        uid: payload.message.message_id.toString(),
        sessionId: session._id,
        platformConfigId: session.platformConfigId,
        channelId: session.channelId,
        source: MessageServiceEnum.telegram,
        from: {
          uid: data.from.id.toString(),
          userName: `${data.from.first_name} ${data.from.last_name}`,
        },
        message: {
          body: data?.text || payload?.message?.caption || '',
        },
        type: WebhookTypesEnum.MESSAGE,
      }
      

      Descrição: Converte uma mensagem recebida do Telegram para o formato padrão do Omnichannel, normalizando dados entre diferentes provedores.

      5.2 Mensagem Editada (MESSAGE_UPDATE)

      const status: WebhookStatusDto = {
        platformConfigId,
        channelId,
        type: WebhookTypesEnum.MESSAGE_UPDATE,
        payload: {
          message: {
            from: payload?.edited_message?.from?.id?.toString(),
            to: payload?.edited_message?.chat?.id?.toString(),
            messageId: payload?.edited_message?.message_id?.toString(),
            status: WebhookStatusMessagesEnum.EDITED,
            content: payload?.edited_message?.text || payload?.edited_message?.caption
          }
        }
      }
      

      Descrição: Processa mensagens editadas pelo usuário, criando um evento de documentosatualização que pode ser enviado para a plataforma de destino.

    • Tipos5.3 Mídia Recebida: PDF, ZIP, GIF e outros arquivos


    3. Gerenciamento de Arquivos

    getFileLink(fileId)
    //
    Fotos - Seleciona a maior resolução disponível
    if (data.photo?.length > 0) {
      const { file_id, file_name, mime_type } = data.photo[data.photo.length - 1]
      incomingMessage.message.media = {
        uri: await telegramBot.getFileLink(file_id),
        contentType: mime_type,
        fileName: file_name,
      }
    
    }
      //
    • Documentos

      Funcionalidade:e ObterÁudios URL- deProcessamento downloadunificado deif arquivos

      (data.document
    • ||
    • data.voice)

      Uso:{ ConversãoincomingMessage.message.media de= { uri: await telegramBot.getFileLink(data.document?.file_id para|| URLdata.voice?.file_id), acessível

      contentType:
    • data.document?.mime_type
    ||

    data.voice?.mime_type,
    fileName:
    Estruturasdata.document?.file_name de|| Dadosdata.voice?.file_name, Recebidas
    Update Structure
    {
      update_id: number,
      message?: TelegramMessageDetail,
      edited_message?: TelegramMessageDetail}
    }
    

    MessageDescrição: StructureProcessa diferentes tipos de mídia, convertendo file_ids em URLs acessíveis e normalizando metadados.

    5.4 Localização Recebida

    if (data.location) {
      message_id:incomingMessage.location number,= from:{
        TelegramMessageSender,latitude: date:Number(data.location.latitude number,|| text?: string,
      caption?: string,
      photo?: TelegramMessageMedia[]0),
        voice?:longitude: TelegramMessageMedia,Number(data.location.longitude document?:|| TelegramMessageMedia,0),
      location?: LocationDto,
      reply_to_message?: TelegramReplyMessage}
    }
    

    MediaDescrição: StructureExtrai coordenadas geográficas e as converte para o formato numérico padrão do sistema.

    5.5 Mensagem Citada

    if (payload?.message?.reply_to_message?.message_id) {
      file_id:incomingMessage.message.quoted string,= file_name?:{ 
        string,id: mime_type?:payload.message.reply_to_message.message_id.toString() 
      string,
      file_size?: number,
      width?: number,
      height?: number}
    }
    
    typescript

    Recursos Implementados
    Funcionalidades Ativas

    Recebimento de Mensagens

    Descrição: MensagensIdentifica dequando textouma mensagem é uma resposta a outra mensagem, preservando a referência para contexto da conversa.

    Esta

  • ✅ Fotos (array de diferentes resoluções)

  • ✅ Vídeos

  • ✅ Áudios/Voice messages

  • ✅ Documentos (PDF, ZIP, etc.)

  • ✅ Localizaçdocumentação (latitude/longitude)

    estruturada
  • apresenta
  • todos

    os Mensagens citadas (reply_to_message)

  • ✅ Mensagens editadas (edited_message)

  • Envio de Mensagens

    • ✅ Texto com formatação Markdown

    • ✅ Imagens via URL

    • ✅ Vídeos via URL

    • ✅ Áudios via URL

    • ✅ Documentos via URL

    • ✅ Mensagens citadas (reply_to_message_id)

    • ✅ Adição de nome do usuário nas mensagens

    Detecção de Tipos de Mídia

    if (mimetype.match(/gif|zip|pdf/)) {
      // sendDocument
    } else if (mimetype.match('image')) {
      // sendPhoto
    } else if (mimetype.match('audio')) {
      // sendVoice
    } else if (mimetype.match('video')) {
      // sendVideo
    }
    

    Configuração Automática

    • ✅ Setup automático de webhook em desenvolvimento

    • ✅ Validação de token e configuração


    ❌ Funcionalidades Não Implementadas

    Recursos Disponíveis mas Não Utilizados

    • ❌ 

      deleteMessage()
       - Exclusão de mensagens

       

    • ❌ 

      sendMessageReaction()
       - Reações em mensagens

       

    • ❌ 

      deleteMessageReaction()
       - Remoção de reações

       

    • ❌ 

      sendProactiveMessage()
       - Mensagens proativas

       

    • ❌ 

      startConversation()
       - Início de conversas (retorna erro)

       

    Outros Recursosrecursos da APIbiblioteca Não Implementados

    • ❌ Inline keyboards

    • ❌ Custom keyboards

    • ❌ Polls/enquetes

    • ❌ Stickers

    • ❌ Games

    • ❌ Payments

    • ❌ Passport data

    • ❌ Chat actions (typing, uploading, etc.)

    • ❌ Group management

    • ❌ Channel management

    • Telegram Bot commandsAPI menu


    Fluxo de Processamento

    Recebimento (Webhook → Incoming Message)

    1. Webhook recebe update do Telegram

    2. Validação da estrutura via 

      TelegramMessageDto
    3. Mapeamento via 

      telegramPayloadToIncomingMessage
    4. Conversão de 

      file_id
       para URL via 
      getFileLink
    5. Processamento da mensagemutilizados no sistemaprojeto Omnichannel.

    Envio (Outgoing Message → Telegram)
    1. Recebimento via 

      SendMessageDto
    2. Detecção do tipo de mídia via MIME type

    3. Seleção do método apropriado da API

    4. Envio com suporte a reply

    5. Retorno do 

      message_id