Ir al contenido

Scraper de imágenes de Twitter: descarga todas las imágenes

Un scraper de imágenes de Twitter encuentra los posts de una cuenta o búsqueda que llevan fotos, lee el enlace pbs.twimg.com de cada foto y la descarga con name=orig, porque el enlace simple que sirve X se queda en 1,200 píxeles de ancho.

Respuesta corta: Sin iniciar sesión, x.com muestra solo unos pocos de los posts más recientes de un perfil, así que las extensiones de navegador y los descargadores leen X a través de tu inicio de sesión o tu cookie de sesión. Para reunir todas las imágenes sin arriesgar tu cuenta, usa Sorsa API: POST /search-tweets con filter:images devuelve unos 20 posts con imágenes por solicitud, desde $0.07 por cada 1,000, y 100 solicitudes gratis cubren las primeras 2,000.

Endpoint
POST /search-tweets
Tamaño de página
unos 20 posts por solicitud
Precio
desde $0.07 por cada 1,000

#Cómo funciona un scraper de imágenes de Twitter

Todo scraper de imágenes de Twitter hace las mismas tres cosas, sin importar en qué corra. Para un solo post no necesitas ninguna: pega su enlace en el Descargador de multimedia gratuito y guarda cada foto en tamaño completo. Para cientos o miles de imágenes, el trabajo es así:

  1. Encuentra los posts que llevan fotos. El operador de búsqueda filter:images de X conserva solo los posts con al menos una imagen, de una cuenta con from: o de cualquier tema.

  2. Lee el enlace de cada foto. Cada imagen está en el servidor de multimedia de X, en un enlace como https://pbs.twimg.com/media/G4kQ2vXbIAAm7Rz.jpg.

  3. Descarga el original. Pide ese enlace con ?format=jpg&name=orig; sin eso, X envía una copia que cabe en 1,200 píxeles.

Las herramientas difieren en el paso 1, en de dónde salen los posts. x.com le muestra a un visitante sin sesión posts sueltos y unos pocos de los más recientes de un perfil, y envía la búsqueda a su página de inicio de sesión. Por eso las extensiones de navegador, los descargadores de escritorio y las herramientas de línea de comandos leen X a través de una cuenta con sesión iniciada. Su propia documentación lo dice: un descargador por lotes muy usado pide tu cookie auth_token y advierte que la cuenta puede ser suspendida.

Solo una API llega a las imágenes de una cuenta completa: la API oficial de X con una cuenta de desarrollador y OAuth, o una API de datos de Twitter/X con una sola clave.

La guía sobre cómo scrapear Twitter cubre todas las rutas y qué las rompe, y la comparativa de los mejores scrapers de Twitter pone precio a las herramientas una por una.

#Descarga todas las imágenes de una cuenta de X

Sorsa API, una API y scraper de Twitter (X), devuelve los posts con imágenes de una cuenta como JSON con el enlace de cada foto dentro, unos 20 posts por solicitud y hasta 2006. Cuatro pasos te llevan de un nombre de usuario a una carpeta de archivos originales.

  1. Obtén una clave. Regístrate y copia la clave de API desde tu panel. Las primeras 100 solicitudes son gratis, sin tarjeta.

  2. Busca los posts con imágenes de la cuenta. Envía from: más filter:images a POST /search-tweets (se abre en una pestaña nueva), con order en latest para recibir primero los más recientes.

    Terminal
    curl -X POST "https://api.sorsa.io/v3/search-tweets" \
      -H "ApiKey: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"query": "from:northfield_photo_lab filter:images",
           "order": "latest"}'
    
    Response200 OK
    {
      "tweets": [
        {
          "id": "1984213377309245441",
          "created_at": "2026-10-30T14:12:09Z",
          "full_text": "Fog over the north ridge this morning.",
          "likes_count": 412,
          "entities": [
            {
              "type": "photo",
              "link": "https://pbs.twimg.com/media/G4kQ2vXbIAAm7Rz.jpg",
              "preview": "https://pbs.twimg.com/media/G4kQ2vXbIAAm7Rz.jpg"
            },
            {
              "type": "photo",
              "link": "https://pbs.twimg.com/media/G4kQ2vZaQAEw9Lp.jpg",
              "preview": "https://pbs.twimg.com/media/G4kQ2vZaQAEw9Lp.jpg"
            }
          ],
          "user": {
            "username": "northfield_photo_lab",
            "display_name": "Northfield Photo Lab",
            "media_count": 1840
          }
        }
      ],
      "next_cursor": "DAADDAABCgABG8vZ0Qm__-oKAAIbuv3MBVvA0AgAAwAAAAIAAA"
    }
    
  3. Sigue el cursor. Un cursor es un token que marca dónde empieza la siguiente página: envía next_cursor en el cuerpo de la siguiente solicitud hasta que vuelva vacío.

    From a search query to original-size image files 1. Consulta from:account filter:images una cuenta o un tema 2. Página de búsqueda /search-tweets unos 20 posts por solicitud 3. Enlaces de fotos type: photo pbs.twimg.com 1 a 4 por post 4. Guardar name=orig archivo original <post id>_1.jpg next_cursor, hasta que quede vacío + una fila en images.csv
    Cada solicitud devuelve unos 20 posts con imágenes y un cursor a la siguiente página; cada enlace de foto se convierte en un archivo de tamaño original y en una fila de images.csv.
  4. Guarda cada foto en su tamaño original. El script conserva solo las entidades photo, reescribe cada enlace a name=orig y nombra los archivos <post id>_<n>.jpg. Registra cada archivo en images.csv y guarda el cursor después de cada página, de modo que una ejecución detenida retoma donde se quedó.

    import csv
    import os
    import sys
    import time
    from urllib.parse import parse_qs, urlparse
    
    import requests
    
    API = "https://api.sorsa.io/v3/search-tweets"
    HEADERS = {"ApiKey": "YOUR_API_KEY"}
    
    
    def orig(url):
        """Rewrite a pbs.twimg.com image link to its original size."""
        u = urlparse(url)
        path = u.path
        fmt = parse_qs(u.query).get("format", ["jpg"])[0]
        if "." in path.rsplit("/", 1)[-1]:
            path, fmt = path.rsplit(".", 1)
        fmt = fmt.split(":")[0]
        return f"https://pbs.twimg.com{path}?format={fmt}&name=orig", fmt
    
    
    def photo_urls(tweet):
        """Original-size links of every photo in a post."""
        for e in tweet.get("entities") or []:
            if e.get("type") != "photo":
                continue
            for link in (e.get("link"), e.get("preview")):
                if link and "pbs.twimg.com/media/" in link:
                    yield orig(link)
                    break
    
    
    def post(body):
        while True:
            r = requests.post(API, headers=HEADERS, json=body, timeout=60)
            if r.status_code == 429:  # over 20 requests a second: wait
                time.sleep(1)
                continue
            r.raise_for_status()  # 403: no key, or no requests left
            return r.json()
    
    
    def download(query, folder):
        os.makedirs(folder, exist_ok=True)
        state = os.path.join(folder, "cursor.txt")
        body = {"query": query, "order": "latest"}
        if os.path.exists(state):  # resume a stopped run
            body["next_cursor"] = open(state).read().strip()
        log_path = os.path.join(folder, "images.csv")
        with open(log_path, "a", newline="", encoding="utf-8") as f:
            log = csv.writer(f)
            while True:
                page = post(body)
                for t in page.get("tweets", []):
                    for n, (url, fmt) in enumerate(photo_urls(t), 1):
                        path = os.path.join(folder, f"{t['id']}_{n}.{fmt}")
                        if os.path.exists(path):
                            continue
                        img = requests.get(url, timeout=60)
                        img.raise_for_status()
                        with open(path, "wb") as out:
                            out.write(img.content)
                        log.writerow([t["id"], t["created_at"], url, path])
                cursor = page.get("next_cursor")
                if not cursor:
                    break
                body["next_cursor"] = cursor
                with open(state, "w") as s:
                    s.write(cursor)
        if os.path.exists(state):
            os.remove(state)
    
    
    if __name__ == "__main__":
        download(sys.argv[1], sys.argv[2])
    

Ejecútalo con una búsqueda y un nombre de carpeta: python twitter_images.py "from:northfield_photo_lab filter:images" northfield_photo_lab. Una respuesta 403 significa que falta la clave o que se quedó sin solicitudes; un 429 significa más de 20 solicitudes en un segundo, y el script espera un segundo y lo intenta de nuevo. Los archivos que ya están en disco se omiten, así que volver a ejecutar el mismo comando solo agrega las imágenes nuevas.

Para tener en cuenta

Una cita o un retweet lleva fotos de otra persona: están en quoted_status.entities y retweeted_status.entities, y el script las deja fuera. Agrega esas dos listas a photo_urls para conservarlas. Para dimensionar primero el trabajo, GET /info (se abre en una pestaña nueva) devuelve el media_count de la cuenta, las fotos y videos que ha publicado.

Para recorrer el timeline de la cuenta post por post en lugar de buscarlo, envía el nombre de usuario a POST /user-tweets (se abre en una pestaña nueva). Devuelve los mismos objetos de tweet, 20 por solicitud, así que photo_urls lee sus imágenes sin cambios; también llegan los posts de solo texto, así que el trabajo toma más solicitudes.

El mismo script reúne las imágenes de cualquier tema: solo cambia la consulta. filter:images se combina con todos los operadores de búsqueda de X, y la búsqueda llega hasta 2006.

TareaConsulta
Un hashtag#nightphotography filter:images
Una palabra clave en un mesaurora filter:images since:2026-10-01 until:2026-11-01
Solo imágenes populares#interiordesign filter:images min_faves:500
Una cuenta sin sus respuestasfrom:northfield_photo_lab filter:images -filter:replies
Varias cuentas a la vez(from:northfield_photo_lab OR from:harborline_studio_co) filter:images
  • Un hashtag

    Consulta
    #nightphotography filter:images
  • Una palabra clave en un mes

    Consulta
    aurora filter:images since:2026-10-01 until:2026-11-01
  • Solo imágenes populares

    Consulta
    #interiordesign filter:images min_faves:500
  • Una cuenta sin sus respuestas

    Consulta
    from:northfield_photo_lab filter:images -filter:replies
  • Varias cuentas a la vez

    Consulta
    (from:northfield_photo_lab OR from:harborline_studio_co) filter:images

Para un tema grande, ejecuta una ventana de fechas por mes en su propia carpeta. Cada ejecución sigue siendo corta, una que falle es fácil de repetir y las ventanas corren en paralelo con una sola clave, hasta 20 solicitudes por segundo en todos los planes. Fija order en popular para recibir primero los posts destacados de X o en latest para los más recientes. Todos los operadores, con ejemplos, están en la guía de operadores de búsqueda de Twitter.

Las imágenes de un hashtag cambian a medida que la gente publica, así que un trabajo de monitoreo vuelve a ejecutar la ventana más reciente con un calendario. Como el script omite los archivos que ya tiene y registra solo los nuevos, cada nueva ejecución agrega solo las imágenes publicadas desde la anterior.

#Obtén cada imagen en su tamaño original

X conserva cada archivo subido completo pero sirve copias más pequeñas, y la copia que recibes depende solo del valor de name en el enlace. El 2 de noviembre de 2026 pedimos cuatro imágenes públicas en todos los tamaños que sirve X y medimos lo que volvió; la escalera de abajo es una foto publicada a finales de octubre de 2026.

Width X returned for one photo, by name value Ancho que devolvió X para una foto, según el valor name de su enlace name=thumb 150 px7 KB name=small 680 px53 KB link base (medium) 1,200 px143 KB name=large 2,048 px351 KB name=4096x4096 4,096 px1.03 MB name=orig 8,000 px1.95 MB El archivo subido era de 8,000 × 4,501 px. Medido en pbs.twimg.com, 2 de noviembre de 2026.
Solo name=orig devolvió el archivo subido: 8,000 píxeles de ancho y 1.95 MB, frente a 1,200 píxeles y 143 KB del enlace simple.
  • El enlace simple es la copia medium. Un enlace de pbs.twimg.com sin name devuelve una imagen que cabe en 1,200 píxeles.
  • large se detiene en 2,048 píxeles y 4096x4096 en 4,096. Un archivo subido más pequeño que eso vuelve en su propio tamaño.
  • name=orig devuelve el archivo subido tal cual. Para la foto de arriba eso fue 8,000 × 4,501 píxeles, 44 veces los píxeles del enlace simple.
  • format=png no agrega detalle. Recodifica un archivo JPG como un PNG varias veces más grande, y format=png&name=orig devuelve 404 para un JPG, así que conserva el formato que ya tiene el enlace.

Descargar desde pbs.twimg.com es una solicitud HTTP simple sin clave, así que los archivos en sí no cuestan solicitudes de la API: solo cuesta encontrar los posts.

#Descarga imágenes de forma masiva sin código

Sin código, el trabajo se divide en dos: exportar los enlaces de las imágenes y luego descargar los archivos.

  1. Exporta los enlaces de los posts recientes. La herramienta gratuita Exportar tweets guarda los últimos posts de una cuenta como CSV, Excel o JSON con una columna media_urls; activa Solo posts con multimedia.

  2. Exporta una cuenta o búsqueda completa. En el playground de la API, ejecuta POST /search-tweets con tu clave y una consulta como from:northfield_photo_lab filter:images; sigue el cursor por ti y exporta cada página a CSV o JSON.

  3. Convierte los enlaces en originales. Pega los enlaces de las imágenes en el convertidor de abajo y copia los enlaces de tamaño original que devuelve.

  4. Descarga la lista. Carga los enlaces en cualquier gestor de descargas que acepte una lista de URL, y guarda los archivos en una sola ejecución.

    Pega cualquier cantidad de enlaces de pbs.twimg.com, uno por línea o directo de una columna de CSV; nada sale de tu navegador.

#Cuánto cuesta una descarga masiva de imágenes

En Sorsa API, los posts con imágenes cuestan desde $0.07 por cada 1,000, porque una página de búsqueda de unos 20 posts es una solicitud sin importar cuántas fotos contenga. En la API oficial de X, los enlaces de imágenes llegan solo mediante su expansion de multimedia. Desde el 22 de noviembre de 2026, X cobra cada imagen expandida (se abre en una pestaña nueva) a $0.005 además de los $0.005 de la lectura del post: $10.00 por cada 1,000 posts con una imagen, $25.00 cuando cada uno lleva cuatro.

Puestas lado a lado, las formas de obtener los posts difieren tanto en lo que te exigen como en el precio.

Forma de obtener los postsQué necesitaCosto por cada 1,000 posts con imágenes
Sorsa APIUna clave de APIdesde $0.07
API oficial de XCuenta de desarrollador y OAuth$10.00 desde el 22 de nov. de 2026 (post y una imagen)
Extensiones y descargadoresTu inicio de sesión de X o tu cookie de sesiónGratis o una suscripción, con la cuenta en riesgo
  • Sorsa API

    Qué necesita
    Una clave de API
    Costo por cada 1,000 posts con imágenes
    desde $0.07
  • API oficial de X

    Qué necesita
    Cuenta de desarrollador y OAuth
    Costo por cada 1,000 posts con imágenes
    $10.00 desde el 22 de nov. de 2026 (post y una imagen)
  • Extensiones y descargadores

    Qué necesita
    Tu inicio de sesión de X o tu cookie de sesión
    Costo por cada 1,000 posts con imágenes
    Gratis o una suscripción, con la cuenta en riesgo
Posts con imágenes

API oficial de X

$10,000

para 1M posts con imágenes

$0.010 por post con una imagen, desde el 22 de nov.

Sorsa API

desde$70

para 1M posts con imágenes

desde $0.07 por cada 1,000

140 veces más barato

El precio de pago por uso (se abre en una pestaña nueva) de la API oficial de X también se detiene en 3M de lecturas de posts por ciclo de facturación; por encima de eso, X vende solo contratos Enterprise. En Sorsa API las 100 solicitudes gratis cubren unos 2,000 posts con imágenes, las solicitudes fallidas nunca se cobran y la tarifa del plan por cada 1,000 solicitudes se aplica a todos los endpoints.

El tiempo se deduce del límite de solicitudes, 20 por segundo por clave en todos los planes. 1M de posts con imágenes toman 50K solicitudes, unos 42 minutos cuando las ventanas de fechas corren en paralelo; los archivos de imagen se descargan luego directo de los servidores de X a la velocidad de tu conexión.

#Obtén las imágenes de posts específicos

Para obtener las imágenes de posts que ya tienes, envía sus enlaces o IDs a POST /tweet-info-bulk (se abre en una pestaña nueva): hasta 100 posts por solicitud, desde $0.014 por cada 1,000, con la misma lista entities que devuelve la búsqueda.

Terminal
curl -X POST "https://api.sorsa.io/v3/tweet-info-bulk" \
  -H "ApiKey: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tweet_links": [
        "https://x.com/northfield_photo_lab/status/1984213377309245441",
        "1983850021164118016"]}'

Un solo post va a POST /tweet-info (se abre en una pestaña nueva) con tweet_link. Pasa el enlace de cada foto por la misma función orig y tendrás los archivos en tamaño completo. En la API oficial de X la misma consulta necesita un bearer token más expansions=attachments.media_keys y media.fields=url, y desde el 22 de noviembre cada imagen de la respuesta suma $0.005.

Los videos y GIF llegan en la misma lista entities bajo su propio type. Sus archivos MP4 y variantes de calidad requieren un paso más, que cubre la guía para descargar multimedia de Twitter por API; para exportaciones de texto completo con una columna de multimedia, consulta cómo descargar todos los tweets de un usuario.

#Empieza tu primera descarga de imágenes

Para descargar todas las imágenes de una cuenta o búsqueda de X en tamaño completo, usa Sorsa API: unos 20 posts con imágenes por solicitud desde $0.07 por cada 1,000, sin riesgo para tu cuenta de X. Copia el script, agrega tu clave y tus 100 solicitudes gratis descargan los primeros 2,000 posts con imágenes.

#Preguntas frecuentes

¿Existe un scraper de imágenes de Twitter gratuito?

Sí, para trabajos pequeños. El Descargador de multimedia gratuito guarda todas las fotos de un post en tamaño completo, y la herramienta gratuita Exportar tweets exporta los últimos posts de una cuenta con los enlaces de sus imágenes. Para cuentas y búsquedas completas, cada cuenta nueva de Sorsa API recibe 100 solicitudes gratis: unos 2,000 posts con imágenes, sin tarjeta, y las solicitudes nunca vencen.

¿Qué API debo usar para scrapear imágenes de Twitter?

Usa Sorsa API: POST /search-tweets con filter:images devuelve unos 20 posts con imágenes por solicitud desde $0.07 por cada 1,000, frente a $10.00 por cada 1,000 posts con una imagen en la API oficial de X desde el 22 de noviembre de 2026. Necesita una sola clave de API en lugar de una cuenta de desarrollador y OAuth, busca hasta 2006, funciona a 20 solicitudes por segundo en todos los planes y nunca te pide tu inicio de sesión de X.

Sí. Hacer scraping de imágenes públicas para investigación o un archivo es legal y habitual. Los derechos de autor de cada imagen siguen siendo de quien la hizo, así que pide permiso al dueño antes de publicar o vender los archivos. Sorsa API nunca te pide tu inicio de sesión de X, así que tu cuenta de X queda fuera.

¿Puedo descargar imágenes de una cuenta privada de Twitter?

No. Los posts de una cuenta protegida solo los ven los seguidores que aprobó, así que ninguna API los devuelve, Sorsa API incluida, y una solicitud para obtenerlos nunca se cobra. Las herramientas que dicen lo contrario leen X con el inicio de sesión de una cuenta que la sigue.

¿El dueño de la cuenta ve que descargué sus imágenes?

No. X no avisa a nadie cuando sus posts o imágenes se ven o se descargan. Con Sorsa API las solicitudes van de Sorsa API a X, así que ni X ni el dueño de la cuenta saben quién las pidió, y tu propia cuenta de X no participa.

¿Puedo descargar videos y GIF de Twitter de la misma forma?

En parte. Los videos y GIF están en la misma lista entities que las fotos, bajo su propio type, con una miniatura como preview, así que la búsqueda y el cursor funcionan igual. El archivo MP4 reproducible y sus variantes de calidad requieren un paso más, que explica la guía para descargar multimedia de Twitter por API.

#Cómo lo comprobamos

El 2 de noviembre de 2026 pedimos cuatro imágenes públicas de pbs.twimg.com en todos los tamaños y formatos y registramos el ancho y el peso de archivo de cada respuesta. También pasamos un post público por nuestro Descargador de multimedia gratuito, que corre sobre Sorsa API, para ver el enlace de foto que devuelve. Probamos el manejo de enlaces y el guardado de archivos de ambos scripts contra un sustituto de la API y archivos reales de pbs.twimg.com. Los endpoints, campos y tamaños de página salen de la referencia en vivo de Sorsa API; los precios de la API oficial de X salen de docs.x.com y del aviso de X del 23 de octubre de 2026, ambos leídos el mismo día. Las respuestas de la API que se muestran son ejemplos abreviados construidos a partir de la referencia.

Por el equipo de Sorsa API. Creamos y operamos Sorsa API, la API y scraper de Twitter/X de solo lectura, en producción desde 2022 (antes TweetScout API) y con más de 6 mil millones de solicitudes procesadas. Acerca de Sorsa API

Qué cambió
  • Reescrito desde cero: tamaños de imagen medidos y la regla name=orig, un script reanudable en Python y Node.js con registro de archivos, consultas por hashtag y búsqueda, una ruta sin código con un convertidor de enlaces, y costos que incluyen el cobro de multimedia de X del 22 de noviembre.
  • Primera publicación.