Automatización de Instagram con Instagrapi: Guía Clara

Mark Ponomarev

Mark Ponomarev

5 June 2025

Automatización de Instagram con Instagrapi: Guía Clara

Automatizar tareas en Instagram puede optimizar significativamente la forma en que gestionas tu presencia online. instagrapi es una biblioteca de Python diseñada para ayudarte a hacer exactamente eso. Interactúa directamente con los propios sistemas backend de Instagram, los mismos que utiliza la aplicación móvil oficial. Esta comunicación directa hace que instagrapi sea rápido y eficiente, y no requiere un navegador web para funcionar.

Esta guía tiene como objetivo proporcionar un camino claro para empezar con instagrapi. Cubriremos cómo instalarlo, iniciar sesión de forma segura en tu cuenta de Instagram, realizar acciones comunes como interactuar con publicaciones y usuarios, subir contenido, y abordaremos prácticas esenciales para garantizar que tu automatización sea segura y efectiva.

💡
¿Quieres una excelente herramienta de prueba de API que genere documentación de API hermosa?

¿Quieres una plataforma integrada, todo en uno, para que tu equipo de desarrolladores trabaje con máxima productividad?

Apidog satisface todas tus demandas y reemplaza a Postman a un precio mucho más asequible!
botón

Instalando Instagrapi en Tu Sistema

Antes de poder usar instagrapi, necesitas instalarlo. Primero, asegúrate de tener Python instalado en tu computadora; instagrapi funciona mejor con la versión 3.9 de Python o posterior. Puedes verificar tu versión de Python abriendo una terminal (Símbolo del sistema, PowerShell o Terminal en macOS/Linux) y escribiendo python --version o python3 --version.

Una vez que Python esté listo, instalar instagrapi es sencillo usando pip, el instalador de paquetes de Python. En tu terminal, ejecuta el siguiente comando:

pip install instagrapi

Si usas python3 específicamente para tu instalación de Python 3, podrías necesitar:

python3 -m pip install instagrapi

Este comando descargará e instalará instagrapi y cualquier otra biblioteca de la que dependa. Para una gestión de proyectos más limpia, a menudo se recomienda usar entornos virtuales de Python, que aíslan las dependencias del proyecto. Puedes crear uno con python3 -m venv your_project_name, activarlo y luego ejecutar el comando pip install instagrapi dentro de él.

Conectando a Tu Cuenta de Instagram

Para realizar acciones en Instagram, tu script necesita iniciar sesión. instagrapi maneja este proceso. El primer paso en tu script de Python será importar la clase Client y crear una instancia de ella. Este objeto Client será tu herramienta principal para todas las interacciones.

from instagrapi import Client
import os
import time
import random

cl = Client()

Ahora, iniciemos sesión. Es altamente recomendable no codificar directamente tu nombre de usuario y contraseña en tu script. Usar variables de entorno es un método más seguro.

INSTAGRAM_USERNAME = os.getenv("INSTA_USERNAME", "your_insta_username")
INSTAGRAM_PASSWORD = os.getenv("INSTA_PASSWORD", "your_insta_password")

try:
    cl.login(INSTAGRAM_USERNAME, INSTAGRAM_PASSWORD)
    print(f"¡Inicio de sesión exitoso como @{INSTAGRAM_USERNAME}!")
except Exception as e:
    print(f"Inicio de sesión fallido para @{INSTAGRAM_USERNAME}. Error: {e}")

Si tu cuenta tiene la Autenticación de Dos Factores (2FA) habilitada, lo cual es excelente para la seguridad, el método login requerirá un parámetro adicional verification_code. Normalmente obtendrías este código de tu aplicación de autenticación o de un SMS y lo pasarías durante la llamada de inicio de sesión: cl.login(INSTAGRAM_USERNAME, INSTAGRAM_PASSWORD, verification_code="YOUR_2FA_CODE").

Iniciar sesión constantemente con un nombre de usuario y contraseña puede ser ineficiente y podría atraer atención no deseada de Instagram. Un enfoque más inteligente es guardar tu sesión de inicio de sesión después de la primera autenticación exitosa y luego recargar esta sesión para futuras ejecuciones del script.

Aquí te mostramos cómo puedes gestionar las sesiones:

from instagrapi.exceptions import LoginRequired

SESSION_FILE_PATH = "my_active_session.json"

if os.path.exists(SESSION_FILE_PATH):
    cl.load_settings(SESSION_FILE_PATH)
    print(f"Sesión cargada desde {SESSION_FILE_PATH}.")
    try:
        cl.login(INSTAGRAM_USERNAME, INSTAGRAM_PASSWORD)
        cl.get_timeline_feed()
        print("La sesión es válida y el inicio de sesión fue exitoso usando la sesión guardada.")
    except LoginRequired:
        print("La sesión guardada no era válida. Es necesario realizar un inicio de sesión nuevo.")
        try:
            cl.login(INSTAGRAM_USERNAME, INSTAGRAM_PASSWORD)
            cl.dump_settings(SESSION_FILE_PATH)
            print("Inicio de sesión nuevo exitoso, nueva sesión guardada.")
        except Exception as e_relogin:
            print(f"Inicio de sesión nuevo fallido después de una sesión inválida: {e_relogin}")
    except Exception as e_session_use:
        print(f"Error al usar la sesión guardada: {e_session_use}. Intentando inicio de sesión nuevo.")
        try:
            cl.login(INSTAGRAM_USERNAME, INSTAGRAM_PASSWORD)
            cl.dump_settings(SESSION_FILE_PATH)
            print("Inicio de sesión nuevo exitoso después de un error de sesión, nueva sesión guardada.")
        except Exception as e_fresh_fallback:
            print(f"El intento de inicio de sesión nuevo de respaldo también falló: {e_fresh_fallback}")

else:
    print("No se encontró archivo de sesión. Realizando inicio de sesión nuevo...")
    try:
        cl.login(INSTAGRAM_USERNAME, INSTAGRAM_PASSWORD)
        cl.dump_settings(SESSION_FILE_PATH)
        print(f"Inicio de sesión nuevo exitoso, sesión guardada en {SESSION_FILE_PATH}.")
    except Exception as e_initial_login:
        print(f"El inicio de sesión nuevo inicial falló: {e_initial_login}")

if cl.user_id:
    print(f"Autenticado con éxito. ID de usuario: {cl.user_id}")
else:
    print("Autenticación fallida. Verifica las credenciales y los mensajes de error anteriores.")

Este enfoque combinado intenta usar primero una sesión guardada y recurre a un inicio de sesión nuevo si es necesario, guardando la nueva sesión para la próxima vez.

Interacciones Principales con Instagram Usando Instagrapi

Una vez que hayas iniciado sesión, puedes empezar a interactuar con Instagram. Asume que cl es tu objeto Client con sesión iniciada exitosamente para los ejemplos a continuación.

Obteniendo Información del Usuario
Puedes obtener información pública sobre cualquier usuario de Instagram si conoces su nombre de usuario. Esto incluye su ID de Usuario único (PK), nombre completo, biografía, número de seguidores, etc.

target_user = "instagram"
try:
    user_id_num = cl.user_id_from_username(target_user)
    print(f"El ID de Usuario único para @{target_user} es {user_id_num}.")

    user_details = cl.user_info_by_username(target_user)
    print(f"\nDetalles para @{user_details.username}:")
    print(f"  Seguidores: {user_details.follower_count}")
    print(f"  Biografía: {user_details.biography[:50]}...")
except Exception as e:
    print(f"No se pudo obtener información para @{target_user}. Error: {e}")

Interactuando con Publicaciones (Media)
Las publicaciones de Instagram se conocen como "media" en instagrapi. Para interactuar con una publicación, normalmente necesitas su media_pk (un ID numérico único para la publicación). Puedes obtener este media_pk de la URL de la publicación. El siguiente ejemplo muestra cómo obtener detalles de una publicación. Las interacciones como dar "me gusta" o comentar son muy sensibles a la automatización; usa estas funciones con moderación y siempre de forma ética.

example_post_url = "https://www.instagram.com/p/C_q9Jg1NAn1/"

try:
    media_pk_val = cl.media_pk_from_url(example_post_url)
    print(f"El media_pk para la publicación es: {media_pk_val}")

    media_details = cl.media_info(media_pk_val)
    print(f"\nPublicación de @{media_details.user.username} tiene {media_details.like_count} 'me gusta'.")
    print(f"Fragmento de la descripción: {media_details.caption_text[:60]}...")
    
    string_media_id_for_action = cl.media_id(media_pk_val)
    print(f"media_id en formato string para acciones (como dar 'me gusta'/comentar): {string_media_id_for_action}")
    
except Exception as e:
    print(f"Error al interactuar con la publicación {example_post_url}. Error: {e}")

Para dar "me gusta" a una publicación, usarías cl.media_like(string_media_id_for_action). Para comentar, usarías cl.media_comment(string_media_id_for_action, text="Tu comentario"). Incluye siempre pausas (time.sleep()) después de tales acciones.

Subiendo Contenido
instagrapi te permite subir fotos, videos, álbumes e historias.

Subiendo una Foto:
Necesitarás la ruta a un archivo de imagen JPG. El ejemplo a continuación describe la estructura; deberás proporcionar una ruta válida a una imagen.

from pathlib import Path

image_path_to_upload = Path("your_image.jpg")
photo_caption = "¡Mi primera subida de foto con Instagrapi! #Python #Automation"

if image_path_to_upload.exists() and image_path_to_upload.suffix.lower() == ".jpg":
    try:
        uploaded_photo = cl.photo_upload(image_path_to_upload, photo_caption)
        print(f"¡Foto subida! Mírala en: https://www.instagram.com/p/{uploaded_photo.code}/")
    except Exception as e:
        print(f"La subida de foto falló para {image_path_to_upload}. Error: {e}")
else:
    print(f"Reemplaza 'your_image.jpg' con una ruta válida a un archivo JPG.")

Subiendo una Historia:
Las historias a menudo usan una relación de aspecto 9:16. Puedes subir fotos o videos. El código para subir una historia con foto es similar a una publicación de foto normal, pero usa photo_upload_to_story.

from instagrapi.types import StoryMention, StoryLink

story_image_path = Path("your_story_image.jpg")

if story_image_path.exists() and story_image_path.suffix.lower() == ".jpg":
    try:
        uploaded_story = cl.photo_upload_to_story(
            story_image_path,
            caption="¡Mi Historia de Instagrapi!"
        )
        print(f"¡Historia subida con éxito! PK: {uploaded_story.pk}")
    except Exception as e:
        print(f"La subida de historia falló para {story_image_path}. Error: {e}")
else:
    print(f"Reemplaza 'your_story_image.jpg' con una ruta válida a un archivo JPG 9:16 para historias.")

Puedes añadir elementos interactivos como mentions (menciones) y links (enlaces) preparando objetos StoryMention o StoryLink y pasándolos como parámetros a photo_upload_to_story.

Consideraciones Clave para una Automatización Fluida

Al automatizar acciones en Instagram, algunas prácticas son cruciales para la fiabilidad y para evitar problemas con tu cuenta.

Introduce Pausas: Los usuarios humanos no realizan acciones instantáneamente una tras otra. Tu script tampoco debería hacerlo. Usa time.sleep(random.uniform(min_seconds, max_seconds)) entre acciones para imitar patrones de interacción naturales. El propio instagrapi tiene una configuración cl.delay_range = [min, max] que añade algunas pausas automáticas para ciertas operaciones.

Considera Proxies para Uso Intensivo: Si tu script realiza un gran número de solicitudes, o si gestionas varias cuentas desde la misma dirección IP, Instagram podría limitar tu actividad. Usar un servidor proxy (cl.set_proxy("your_proxy_string")) puede ayudar a distribuir tus solicitudes y hacer que parezca que provienen de diferentes ubicaciones.

Maneja Posibles Errores: Pueden ocurrir problemas de red, la API de Instagram podría cambiar, o podrías alcanzar un límite de tasa. Envuelve tus llamadas a instagrapi en bloques try...except para capturar estos errores de manera elegante. instagrapi tiene excepciones específicas como RateLimitError, UserNotFound, MediaNotFound, etc., las cuales puedes capturar para un manejo de errores más dirigido.

Usa de Forma Responsable y Ética: La automatización es poderosa. Evita el spam, respeta la privacidad del usuario y no participes en actividades que violen los Términos de Servicio o las Normas Comunitarias de Instagram. El objetivo de la automatización debe ser mejorar la interacción genuina o gestionar tu presencia de manera eficiente, no manipular o molestar.

Un Ejemplo Simple de Automatización: Dando 'Me Gusta' a Publicaciones Recientes de un Hashtag

Creemos un pequeño script que encuentre publicaciones recientes para un hashtag específico y le dé "me gusta" a algunas de ellas. Esto demuestra la combinación de varias características de instagrapi. Usa este ejemplo con extrema precaución y solo en hashtags y en cantidades que se alineen con un uso responsable. Este código es ilustrativo y un uso agresivo puede dañar tu cuenta.

target_hashtag_for_liking = "pythonprogramming"
number_of_posts_to_like = 1

try:
    print(f"Obteniendo contenido reciente para #{target_hashtag_for_liking}...")
    recent_hashtag_media = cl.hashtag_medias_recent(target_hashtag_for_liking, amount=number_of_posts_to_like * 2)

    liked_count = 0
    if recent_hashtag_media:
        for media_item in recent_hashtag_media:
            if liked_count >= number_of_posts_to_like:
                break

            if not media_item.has_liked:
                print(f"  Intentando dar 'me gusta' a la publicación PK {media_item.pk} de @{media_item.user.username}...")
                try:
                    media_id_str_to_like = cl.media_id(media_item.pk)
                    cl.media_like(media_id_str_to_like)
                    liked_count += 1
                    print(f"    'Me gusta' exitoso. Se han dado 'me gusta' a {liked_count}/{number_of_posts_to_like} publicaciones hasta ahora.")
                    time.sleep(random.uniform(15, 25))
                except Exception as e_like:
                    print(f"    No se pudo dar 'me gusta' a la publicación PK {media_item.pk}. Error: {e_like}")
            else:
                print(f"  Saltando publicación PK {media_item.pk} de @{media_item.user.username} que ya tiene 'me gusta'.")
        print(f"\nScript de 'me gusta' finalizado para #{target_hashtag_for_liking}. Total de 'me gusta' en esta ejecución: {liked_count}")
    else:
        print(f"No se encontró contenido reciente para #{target_hashtag_for_liking}.")

except Exception as e_hashtag_script:
    print(f"Ocurrió un error en el script de 'me gusta' del hashtag: {e_hashtag_script}")

Este ejemplo es para demostración. Automatizar 'me gusta', especialmente en grandes cantidades, puede ser fácilmente detectado por Instagram. Prioriza siempre la interacción genuina sobre las acciones masivas automatizadas.

Avanzando con Instagrapi

instagrapi ofrece un amplio conjunto de herramientas para interactuar con Instagram. Esta guía ha tocado la superficie, mostrándote cómo configurar, iniciar sesión y realizar algunas de las acciones más comunes.

Para dominar verdaderamente instagrapi, explora su documentación oficial. El archivo README.md en el repositorio de Instagrapi en GitHub es el mejor punto de partida, generalmente enlazando a guías más detalladas y referencias de API dentro de su carpeta docs. Estos recursos cubren muchas más características, configuraciones avanzadas y tipos específicos para varios objetos de Instagram.

Recuerda que la plataforma de Instagram y su API pueden cambiar, por lo que lo que funciona hoy podría necesitar ajustes mañana. Mantenerte actualizado con la biblioteca instagrapi y las discusiones de la comunidad puede ayudarte a adaptarte. ¡Feliz automatización, y hazlo de forma responsable!

💡
¿Quieres una excelente herramienta de prueba de API que genere documentación de API hermosa?

¿Quieres una plataforma integrada, todo en uno, para que tu equipo de desarrolladores trabaje con máxima productividad?

Apidog satisface todas tus demandas y reemplaza a Postman a un precio mucho más asequible!
botón

Practica el diseño de API en Apidog

Descubre una forma más fácil de construir y usar APIs