Script para obtener todas las publicaciones a las que le di 'me gusta' en Twitter (X)

5 min

language: ja bn en es hi pt ru zh-cn zh-tw

Hola, soy un inútil. Aunque es posible hacer scraping de Twitter con una API no oficial llamada Twikit, desde hace un tiempo, el código de ejemplo ha estado recomendando el uso asíncrono, y al actualizar, me di cuenta de que me regañaban por no usar asincronía, así que lo corregí todo.
haturatu/xd_likes
De esta manera, se almacenará inicialmente en all_tweets.

Una vez que se obtiene el valor máximo especificado,

se obtendrá todo el contenido de los tweets de all_tweets.

Dado que todo esto se escribe en fav.log, si es necesario, se puede extraer toda la información con grep.

Restricción de API

https://github.com/d60/twikit/blob/main/ratelimits.md

Como se puede ver, las restricciones de la API varían bastante.

Por lo tanto, fue necesario intentar varias veces con la configuración de reintentos.

# Configuración de reintentos  
RETRY_LIMIT = 10  
RETRY_DELAY = 300  
  
# Función a ejecutar en caso de reintento  
async def perform_request_with_retries(request_func, *args, **kwargs):  
    for attempt in range(RETRY_LIMIT):  
        try:  
            response = await request_func(*args, **kwargs)  # Esperar la solicitud asíncrona  
            if response:  
                return response  
        except ReadTimeout:  
            logger.warning(f"Attempt {attempt + 1} failed due to ReadTimeout.")  
        except Exception as e:  
            logger.error(f"Attempt {attempt + 1} failed: {e}")  
        await asyncio.sleep(RETRY_DELAY)  
    raise Exception("Failed to fetch more tweets after retries.")  

Parece que la restricción de la API se restablece cada 15 minutos, así que si se pueden realizar intentos durante un total de 50 minutos, creo que se ha creado un margen de tiempo suficiente. Curiosamente, esta fue una parte donde me quedé bastante atascado, y como intentar apurar el límite me consumía un tiempo infinito, aumenté el valor máximo drásticamente.

Guardar imágenes

He separado el script para obtener los 'me gusta' del script para descargar.

Las imágenes se guardarán con xd.py.

Si se deja como está por defecto, no se puede guardar con la máxima calidad, así que se añade el parámetro 'original' a la URL obtenida.

        while user_tweets:  
            for tweet in user_tweets:  
                for media in tweet.media:  
                    url = media['media_url_https']  
                    if url.endswith('.jpg'):  
                        url = url.replace('.jpg', '?format=jpg&name=orig')  
                    clean_url = get_clean_url(url)  
                    save_path = os.path.join(save_folder, f"{screen_name}_{clean_url.split('/')[-1]}.jpeg")  
                    await download_image(url, save_path)  

La calidad de PNG es mejor, pero ¿quizás solo existen imágenes subidas en PNG? Además, PNG consume bastante espacio, así que me conformé con JPG.

Se crea una carpeta para cada ID que se obtiene y se guardan allí, y como una especificación cuidadosa que incluso los japoneses apreciarían, también se asigna un ID a la imagen.

Actualmente, no encontré ningún otro script similar, así que decidí publicarlo. Bueno, supongo que la gente no suele publicarlos porque prefieren hacerlo en secreto...

Por cierto, como fav.log contiene las URLs de los 'me gusta', si solo quieres guardar las imágenes de las publicaciones a las que les diste 'me gusta', tendrías que hacerlo por separado, pero es posible. Por eso he puesto todo en fav.log.

De hecho, pensé que sería mejor separar los logs de fav.log y los logs de cuando se obtienen todos los tweets, pero ya estoy cansado, así que lo dejaré aquí.

Hasta luego.

Espero contar con su apoyo de nuevo.

Related Posts