Tutorial: Cómo descargar historias de otros usuarios en Instagram con Python 3

  • Autor Autor Son Lux
  • Fecha de inicio Fecha de inicio
Son Lux

Son Lux

Delta
Programador
Verificación en dos pasos activada
El script permite crear una base de datos con SQLite en donde almacenaremos de forma permanente las historias de otros usuarios en nuestro servidor o en su respectivo ordenador.

people-2570925_960_720.jpg

¿Qué se necesita para correr el script?
El script está hecho en Python 3 por lo que necesitarás acceso a una terminal que tenga corriendo Python 3.

Básicamente es todo lo que se necesita, lo demás son temas de configuración que yo os iré guiando para que todo el mundo pueda correr el script correctamente.

Temario del tutorial
  • Sacar nuestra Cookie de Instagram
  • Creación de configuracion.json
  • Creación de historias.py
  • Ejecutar script


Sacar Cookies de tu sesión en Instagram

Haremos uso de la API de Instagram por lo que necesitaremos sacar una Cookie que está alojada en nuestro navegador, la podemos consultar desde la herramienta de developers de Google Chrome, para esto he realizado un vídeo explicativo para no hacer tan aburrido el tutorial y puedan entender mejor.

[video=youtube;nh6JkjXj-sM]https://www.youtube.com/watch?v=nh6JkjXj-sM[/video]​

Hasta aquí no deberíamos tener problemas, hemos sacado solamente nuestra Cookie de Instagram, recuerden que para hacer este paso necesitan estar loggeados en su cuenta en intagram.com, de lo contrario no podremos sacar la cookie y el script necesita dicho texto para funcionar.

Crear archivo llamado configuracion.json
Este archivo contiene nuestra configuración en formato .JSON, más adelante explico como funciona dicho archivo.

Insertar CODE, HTML o PHP:
{
    "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
}

Campos a modificar:

id = user id de la cuenta que queramos descargar
username = nombre de usuario de la cuenta
tus cookies aquí: insertamos la cookie que hemos sacado anteriormente

Para sacar el id de la cuenta yo utilizo una herramienta llamada Smash Ballon pero tu puedes usar la que sea de tu preferencia. No hace falta modificar más este archivo, simplemente guardamos los ajustes y pasamos al siguiente paso.

Creación de historias.py
Este archivo será el encargado de ejecutar las funciones necesarias para conectarse a la API de Instagram, no hace falta modificar nada aquí. Solo copiamos y pegamos tal cual el siguiente código:

Insertar CODE, HTML o PHP:
#!/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()

Listo, tenemos el script listo, no hace falta descargarse nada extra, simplemente ejecutamos el script desde nuestra consola con el siguiente comando:

Insertar CODE, HTML o PHP:
python3 historias.py

Posterior a esto, el script nos creará una carpeta llamada "archivos" en donde contiene los datos descargados y un archivo .sqlite que es nuestra base de datos.

Vídeo explicativo

[video=youtube;p77SD2h0FzU]https://www.youtube.com/watch?v=p77SD2h0FzU[/video]​

Puedes ejecutar un cron en tu server para que se esté generando la consulta cada determinado tiempo, pero eso ya depende de ti hacerlo o no :encouragement:

Estaría genial si alguien aportará al código o que lo pudiera llevar a otro lenguaje como PHP :encouragement: sería genial.

Si te ha gustado el tutorial deja un :encouragement: os traeré más tutoriales como este para automatizar tareas. También si quieres pasarte por mi blog eres bienvenido :witless: les mando un abrazo virtual a todos los forobetanos.
 
Última edición:
Gracias por el tutorial amigo, se ve interesante :encouragement:
 
Interesante, gracias por tu aporte.
 
Necesitamos más aportes así :encouragement: Gracias compañero!
 
Voy a probarlo y veo si puedo pasarlo a PHP.

Saludos y gracias.
 
Interesante aporte , gracias por compartir esta informacion
 
Muchas gracias a todos por sus comentarios :encouragement:

Voy a probarlo y veo si puedo pasarlo a PHP.

Saludos y gracias.

Eso estaría genial 🙂 suerte con eso...
 
Gracias por el aporte amigo! :encouragement:
 
yo quiero sacar los post pero de un grupo de facebook para publicarlos en mi pagina habra algun script
 
Gracias por el aporte amigo, justo lo que andaba buscando 😀
 
Buen tutorial estaba buscando algo parecido dias atrás, muchas gracias
 
Muy bueno compañero
 
Excelente aporte!!! yo utilizaba una app con esto me ordenare mejor
 
Gracias por el tutorial, sin embargo no lo pude hacer funcionar, me da el siguiente error al ejecutar el script:

File "historias.py", line 36 c.execute('INSERT INTO entries VALUES(?,?,?,?,?,?)', (str(id),str(url),str(u
serid),str(username),taken_ at,""))


^
SyntaxError: invalid syntax

Tengo el último python, se necesita usar una versión en específico? Ya que el comando python3 no me funciona, uso el comando python. @Son Lux
 
Hola amigo que hay, como te va? conchale me llamo mucho la atencion el tutorial ya que no sabia que podia realizar esta accion, pero lo lei completamente ahora lo ejecutare, muy bueno tu aporte brother!

- - - Actualizado - - -

Hola amigo que hay, como te va? conchale me llamo mucho la atencion el tutorial ya que no sabia que podia realizar esta accion, pero lo lei completamente ahora lo ejecutare, muy bueno tu aporte brother!
 
Gracias por el tutorial, sin embargo no lo pude hacer funcionar, me da el siguiente error al ejecutar el script:



Tengo el último python, se necesita usar una versión en específico? Ya que el comando python3 no me funciona, uso el comando python. @Son Lux

Te sale error de sintaxis seguramente tienes la versión 2.xx, intenta actualizar tu Python a un 3.x


Enviado desde mi iPhone utilizando Tapatalk
 
Hola amigo que hay, como te va? conchale me llamo mucho la atencion el tutorial ya que no sabia que podia realizar esta accion, pero lo lei completamente ahora lo ejecutare, muy bueno tu aporte brother!

- - - Actualizado - - -

Hola amigo que hay, como te va? conchale me llamo mucho la atencion el tutorial ya que no sabia que podia realizar esta accion, pero lo lei completamente ahora lo ejecutare, muy bueno tu aporte brother!

Me alegra que te haya gustado amigo, espero que lo puedas ejecutar!🙂

Cualquier cosa por aquí andamos...


Enviado desde mi iPhone utilizando Tapatalk
 
Te sale error de sintaxis seguramente tienes la versión 2.xx, intenta actualizar tu Python a un 3.x


Enviado desde mi iPhone utilizando Tapatalk


Tengo la última versión: la 3.6.2

c.execute('INSERT INTO entries VALUES(?,?,?,?,?,?)', (str(id),str(url),str(userid),str(username),taken_ at,""))

De esa línea removí la palabra at que da el error, y me crea la carpeta archivos y la base de datos, pero no descarga las historias.
 

Temas similares

Atrás
Arriba