Inicio Rápido

Esta guía te muestra los escenarios más comunes usando el SDK.

1. Cliente Básico (Sin Cola)

from todus import ToDusClient2

# 1. Crear cliente

client = ToDusClient2(phone_number="5312345678", password="mi_clave")

# 2. Iniciar sesión

client.login()

# 3. Enviar mensaje privado

client.send_message("5387654321", "Hola, ¿cómo estás?")

2. Cliente con Cola Persistente

Ideal para bots o aplicaciones que necesitan garantizar la entrega.

from todus import ToDusClientWithQueue

client = ToDusClientWithQueue(
    phone_number="5312345678",
    password="mi_clave",
    enable_queue=True,
    queue_db_path="~/.todus/messages.db"  # opcional
)

client.login()

# Registrar callbacks

def on_delivered(msg):
    print(f"✅ Entregado: {msg.msg_id}")

def on_failed(msg):
    print(f"❌ Falló: {msg.msg_id} - {msg.last_error}")

client.register_on_message_delivered(on_delivered)
client.register_on_message_failed(on_failed)

# Enviar y encolar

msg_id = client.send_message_queued("5387654321", "Mensaje con garantía")

3. Escuchar Mensajes Entrantes

def handle_message(msg):
    # Ignorar mensajes de grupo si no interesan
    if msg.get("is_group"):
        return

    sender = msg.get("from")
    body = msg.get("body")
    if sender and body:
        print(f"De {sender}: {body}")

# Bucle infinito (bloquea el hilo)

client.listen_messages(client.token, handle_message)

# Si necesitas multitarea, ejecuta en un hilo

# import threading

# threading.Thread(target=client.listen_messages, args=(client.token, handle_message), daemon=True).start()

4. Trabajar con Archivos

Subir y enviar una imagen

from todus.types import FileType

# Leer imagen

with open("mi_foto.jpg", "rb") as f:
    image_data = f.read()

# Subir a servidores ToDus

url = client.upload_file(
    image_data,
    file_type=FileType.PICTURE,
    file_name="mi_foto.jpg"
)

# Enviar la imagen

client.send_image_message(
    to_phone="5387654321",
    url=url,
    file_name="mi_foto.jpg",
    file_size=len(image_data),
    width=800,
    height=600,
    caption="Mi foto"
)

Descargar un archivo

# Descargar a una carpeta
size, path = client.download_file_to_folder(
    url="https://...",
    folder="./descargas/",
    filename="documento.pdf"
)
print(f"Descargado {size} bytes en {path}")

5. Trabajar con Grupos

# Unirse a un grupo
client.groups.join("id_del_grupo", nickname="MiApodo")

# Enviar mensaje al grupo

client.groups.send_message("id_del_grupo", "¡Hola a todos!")

# Obtener lista de miembros

msg_id = client.groups.get_members("id_del_grupo")

# Expulsar a un miembro

client.groups.kick_member("id_del_grupo", "5351111111")

6. Actualizar Perfil

# Actualizar alias y biografía
client.update_profile(alias="MiNombre", bio="Desarrollador Python")

# Subir avatar (desde archivo)

profile_url, thumb_url = client.upload_avatar_from_file("avatar.jpg")
client.update_profile(picture_url=profile_url, thumbnail_url=thumb_url)

7. Manejo de Estados (Historias)

import json

# Publicar un estado

status_content = {
    "type": "text",
    "text": "Mi estado del día",
    "background": "#FF0000"
}
client.publish_status(json.dumps(status_content))

# Seguir a un usuario

client.follow_user("5312345678")

Consejo

Todos los métodos que devuelven msg_id son asíncronos. La respuesta llegará a través del callback que registres en listen_messages. Para obtener respuestas de get_members o get_invite_link, utiliza el método parse_members_response o parse_invite_link_response sobre la stanza cruda (msg["raw"]).