Recientemente colabore con un amigo de GitHub en un pequeño pero muy funcional script hecho en Python que básicamente lo que hace es conectarse a la API de Instagram mediante una Cookie que nosotros mandamos desde un archivo JSON.

[su_note note_color=”#fcff59″ radius=”5″]Puedes automatizar este script creando un cron en tu servidor que ejecute en determinado tiempo dicho script, de esta manera podrás ir creando una base de datos cada 24 horas.[/su_note]


¿Qué necesito para correr el script?


Lo único que necesitas es tener acceso a una terminal donde puedas ejecutar archivos .py, lo demás es configuración interna del script que yo te iré explicando a lo largo del artículo.


¿Para qué me puede servir el script?


Puedes darle el uso que quieras, mientras no la utilices para materializar la privacidad de las personas todo estará bien. Yo la he estado utilizando para guardar las historias de mis cuentas favoritas, por ejemplo los de Werevertumorro, así cuando pueda le doy un vistazo a sus vídeos.


Sacar Cookies de tu sesión en Instagram


Para que puedas ingresar en la API de Instagram necesitas estar registrado, por lo que si quieres automatizar completamente el script necesitarás sacar la Cookie de tu sesión para que el script pueda funcionar correctamente.

Hasta aquí no deberíamos tener problema con nada, simplemente hemos sacado nuestra Cookie, les recomiendo que la peguen en otro lado porque más adelante la vamos a utilizar.


Creamos un archivo llamado configuracion.json


{
    "filesdir": "archivos",
    "dbfilename": "historias.sqlite3",
    "ids": { "id": "username" },
    "headers": {
        "cookie": "tus cookies aqui",
        "user-agent": "Instagram 10.3.2 (iPhone7,2; iPhone OS 9_3_3; en_US; en-US; scale=2.00; 750x1334) AppleWebKit/420+",
        "cache-control": "no-cache"
    },
    "quiet": false
}

Editamos el texto “id” y “username” con los datos de las cuentas que queramos descargar. Para esto yo utilizo la pagina Smash Ballon que es muy sencilla de utilizar.

Así mismo, también tenemos que editar el campo “tus cookies aqui” con las Cookies que capturamos arriba, posteriormente ya tenemos configurado nuestro script.


Crear archivo historias.py


#!/usr/bin/python3
import requests
import sqlite3
import json
import os

try:
    with open('configuracion.json') as json_data:
        prefs = json.load(json_data)
except FileNotFoundError:
    print("el archivo configuracion.json no se encuentra :(")
    exit()

conn = sqlite3.connect(prefs["dbfilename"])
c = conn.cursor()
c.execute("CREATE TABLE IF NOT EXISTS `entries` (`id`	TEXT UNIQUE, `url`	TEXT, `userid`	TEXT, `username` TEXT, `taken_at` INTEGER, `filename` TEXT);")
if not prefs["quiet"]: print("Descargando las historias! :D")

while len(prefs["ids"]) > 0:
    pair = prefs["ids"].popitem()
    response = requests.request("GET", "https://i.instagram.com/api/v1/feed/user/"+pair[0]+"/reel_media/", headers=prefs["headers"])
    if response.status_code != 200:
        print("ERROR: got "+str(response.status_code)+" when fetching stories entries!")
        exit
    response = json.loads(response.text)
    for item in response['items']:
        id = item['id']
        try:
            url = item['video_versions'][0]['url']
        except KeyError: #if there are no videos of this item
            url = item['image_versions2']['candidates'][0]['url']
        userid = pair[0]
        username = pair[1]
        taken_at = item['taken_at']
        try:
            c.execute('INSERT INTO entries VALUES(?,?,?,?,?,?)', (str(id),str(url),str(userid),str(username),taken_at,""))
        except sqlite3.IntegrityError: #is thrown when UNIQUE doesn't match
            if not prefs["quiet"]: print('!', end='',flush=True)
        else:
            if not prefs["quiet"]: print('.', end='',flush=True)

conn.commit()

if not prefs["quiet"]:
    print()
    print("Descargando los archivos! :)")

todelete = []
toupdate = []
if not os.path.exists(prefs["filesdir"]):
    os.makedirs(prefs["filesdir"])

for row in c.execute('SELECT * FROM entries WHERE filename = ""'):
    r = requests.get(row[1])
    if r.status_code == 404:
        todelete.append(row[0])
    elif r.status_code%200 < 100:
        if r.headers["Content-Type"] == "video/mp4":
            filename = str(row[3])+"/"+str(row[4])+".mp4"
        elif r.headers["Content-Type"] == "image/jpeg":
            filename = str(row[3])+"/"+str(row[4])+".jpg"
        else:
            filename = str(row[3])+"/"+str(row[4])+".unknown"
            print("WARNING: couldn't identify MIME type for URL "+row[1])
        if not os.path.exists(prefs["filesdir"]+"/"+str(row[3])):
            os.makedirs(prefs["filesdir"]+"/"+str(row[3]))
        with open(prefs["filesdir"]+"/"+filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk: # filter out keep-alive new chunks
                    f.write(chunk)
        toupdate.append((filename,row[0]))
        if not prefs["quiet"]: print(filename)

for item in todelete:
    c.execute('DELETE FROM entries WHERE id = ?',(item,))
for item in toupdate:
    c.execute('UPDATE entries SET filename = ? WHERE id = ?',item)
conn.commit()

En este archivo no es necesario modificar nada, simplemente lo guardamos y listo.

Para correr el script necesitamos abrir la terminal y navegar hasta la carpeta que contiene nuestros archivos y ejecutar el siguiente comando:

python3 historias.py

Con esto dejaremos corriendo el script, no hace falta hacer nada más que esperar a que termine la descarga de las historias. Si es la primera vez que lo utilizamos nos creará una base de datos con SQLite y una carpeta llamada archivos en donde contiene los archivos que hemos descargado segmentado por usuarios.


Como pudiste observar el script no tiene mucha complejidad de funcionamiento, es realmente sencillo de utilizar. Pero si no haz podido entender correctamente el artículo he preparado un vídeo que explica un poco más el funcionamiento:


Vídeo explicativo


Si te han quedado dudas o simplemente no logras hacer funcionar el script por favor deja un comentario con el problema que tengas y yo con gusto te guiaré hasta que hagas funcionar el script.

Hasta aquí el artículo, espero que te haya gustado mucho la información, si fue así por favor deja un comentario o comparte el enlace en tus redes sociales, de esta manera me ayudarás a seguir trayendo contenido de calidad al sitio.