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 })
}
- sendVideo()
2.3
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 mensagensURL: 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
})
- Estrutura principal que encapsula todas as atualizações enviadas pelo Telegram via webhook, incluindo mensagens novas e editadas.
Funcionalidade4.1.1 Implementação no DTOexport 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çãoReply: Suporte a mensagens citadasRetorno:Estrutura da Mensageminterface 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)
Descrição:
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
})
- 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_idReply: Mensagens citadas suportadas
Descrição:
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ídeosFormatos: 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
})
- 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
Descrição:
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
})
- Location Structure (Localização)
4.5
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
(data.documentFuncionalidade:eObterÁudiosURL-deProcessamentodownloadunificadodeifarquivos|| - data.voice)
contentType:Uso:{ConversãoincomingMessage.message.mediade= { uri: await telegramBot.getFileLink(data.document?.file_idpara||URLdata.voice?.file_id),acessíveldata.document?.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}
}
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)
✅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 BotcommandsAPImenu
Fluxo de Processamento
Recebimento (Webhook → Incoming Message)
Webhook recebe updatedo TelegramValidaçãoda estrutura viaTelegramMessageDtoMapeamentoviatelegramPayloadToIncomingMessageConversãodefile_idpara URL viagetFileLinkProcessamentoda mensagemutilizados nosistemaprojeto Omnichannel.
Envio (Outgoing Message → Telegram)
RecebimentoviaSendMessageDtoDetecçãodo tipo de mídia via MIME typeSeleçãodo método apropriado da APIEnviocom suporte a replyRetornodomessage_id