Saltar a contenido

Envio de Media

Ejemplos de envio y recepcion de archivos multimedia.


Enviar imagen

import * as fs from "fs";

// Desde archivo local
const img = fs.readFileSync("foto.jpg");
await wa.Message.image("5491112345678@s.whatsapp.net", img, "Mira esta foto!");

// Desde URL (descargar primero)
const response = await fetch("https://example.com/image.jpg");
const buffer = Buffer.from(await response.arrayBuffer());
await wa.Message.image("5491112345678@s.whatsapp.net", buffer, "Imagen de internet");

Enviar video

import * as fs from "fs";

// Desde archivo local
const video = fs.readFileSync("video.mp4");
await wa.Message.video("5491112345678@s.whatsapp.net", video, "Video interesante");

// Nota: WhatsApp comprime los videos automaticamente
// Para mejor calidad, usa videos cortos (<3 min) y 720p

Enviar audio

import * as fs from "fs";

// Nota de voz (PTT - Push to Talk) - default
const audio = fs.readFileSync("audio.ogg");
await wa.Message.audio("5491112345678@s.whatsapp.net", audio);

// Audio normal (sin PTT)
await wa.Message.audio("5491112345678@s.whatsapp.net", audio, false);

// Formatos soportados: OGG con codec Opus (preferido), MP3, AAC
// WhatsApp convierte automaticamente a OGG/Opus

Enviar ubicacion

// Ubicacion estatica
await wa.Message.location("5491112345678@s.whatsapp.net", {
  lat: -34.6037,
  lng: -58.3816
});

Recibir y guardar media

import * as fs from "fs";
import * as path from "path";

const MEDIA_DIR = "./medios";
fs.mkdirSync(MEDIA_DIR, { recursive: true });

wa.event.on("message:created", async (msg) => {
  if (msg.me) return;

  const timestamp = Date.now();
  const buffer = await msg.content();

  if (buffer.length === 0) return;

  // Imagen
  if (msg.type === "image") {
    const ext = msg.mime.split("/")[1] || "jpg";
    const filename = `${timestamp}.${ext}`;
    fs.writeFileSync(path.join(MEDIA_DIR, filename), buffer);
    console.log(`Imagen guardada: ${filename} (${buffer.length} bytes)`);
    if (msg.caption) {
      console.log(`Caption: ${msg.caption}`);
    }
  }

  // Video
  if (msg.type === "video") {
    const filename = `${timestamp}.mp4`;
    fs.writeFileSync(path.join(MEDIA_DIR, filename), buffer);
    console.log(`Video guardado: ${filename} (${buffer.length} bytes)`);
  }

  // Audio
  if (msg.type === "audio") {
    const filename = `${timestamp}.ogg`;
    fs.writeFileSync(path.join(MEDIA_DIR, filename), buffer);
    console.log(`Audio guardado: ${filename} (${buffer.length} bytes)`);
  }
});

Reenviar media

wa.event.on("message:created", async (msg) => {
  if (msg.me || msg.type !== "text") return;

  const text = (await msg.content()).toString();

  // Comando para reenviar al ultimo mensaje
  if (text.startsWith("!reenviar ")) {
    const target_phone = text.slice(10).trim();
    const target_jid = `${target_phone}@s.whatsapp.net`;

    // Obtener mensaje anterior (el que queremos reenviar)
    const prev_msg = await wa.Message.get(msg.cid, "PREVIOUS_MESSAGE_ID");

    if (prev_msg && ["image", "video", "audio"].includes(prev_msg.type)) {
      await prev_msg.forward(target_jid);
      await wa.Message.text(msg.cid, "Media reenviada!");
    }
  }
});

Procesar imagenes

import sharp from "sharp"; // npm install sharp

wa.event.on("message:created", async (msg) => {
  if (msg.me || msg.type !== "image") return;

  const buffer = await msg.content();
  if (buffer.length === 0) return;

  // Obtener metadata
  const metadata = await sharp(buffer).metadata();
  console.log(`Imagen: ${metadata.width}x${metadata.height}, ${metadata.format}`);

  // Redimensionar
  const thumbnail = await sharp(buffer)
    .resize(100, 100, { fit: "cover" })
    .jpeg({ quality: 80 })
    .toBuffer();

  // Enviar thumbnail como respuesta
  await wa.Message.image(msg.cid, thumbnail, "Thumbnail generado");
});

Transcribir audio

// Ejemplo con Whisper API de OpenAI
import OpenAI from "openai";
import * as fs from "fs";
import * as path from "path";

const openai = new OpenAI();

wa.event.on("message:created", async (msg) => {
  if (msg.me || msg.type !== "audio") return;

  const buffer = await msg.content();
  if (buffer.length === 0) return;

  // Guardar temporalmente
  const temp_file = path.join("/tmp", `${Date.now()}.ogg`);
  fs.writeFileSync(temp_file, buffer);

  try {
    // Transcribir
    const transcription = await openai.audio.transcriptions.create({
      file: fs.createReadStream(temp_file),
      model: "whisper-1",
      language: "es",
    });

    await wa.Message.text(msg.cid, `Transcripcion:\n${transcription.text}`);
  } catch (error) {
    console.error("Error transcribiendo:", error);
  } finally {
    fs.unlinkSync(temp_file);
  }
});

Limites y recomendaciones

Tipo Limite Recomendacion
Imagen 16 MB < 5 MB, JPEG/PNG
Video 64 MB < 16 MB, MP4 H.264
Audio 16 MB < 5 MB, OGG Opus

Compresion

WhatsApp comprime automaticamente los medios. Para mejor calidad, usa formatos optimizados.

Timeout

La descarga de media puede tardar. Considera usar timeouts y reintentos.