Cómo descargar contenido multimedia desde un archivo adjunto

En esta guía, se explica cómo usar el método download en el recurso Media de la API de Google Chat para descargar contenido multimedia (un archivo) de un mensaje en Google Chat.

Cuando el usuario envía un mensaje a tu app, Google Chat envía un Evento de interacción MESSAGE. El evento de interacción que recibe la app incluye el cuerpo de la solicitud, que es el Carga útil de JSON que representa el evento de interacción, incluidos los adjuntos. El datos en el adjunto varían según si el adjunto está contenido subido (un archivo local) o es un archivo almacenado en Drive. El Recurso Media representa un archivo subido a Google Chat, como imágenes, videos y documentos. El Recurso Attachment representa una instancia de contenido multimedia (un archivo) adjunto a un mensaje. El Attachment incluye los metadatos sobre el adjunto, como donde se guardan.

Requisitos previos

Python

  • Python 3.6 o superior
  • El valor pip herramienta de administración de paquetes
  • Las bibliotecas cliente de Google más recientes para Python. Para instalarlas o actualizarlas, Ejecuta el siguiente comando en tu interfaz de línea de comandos:

    pip3 install --upgrade google-api-python-client google-auth-oauthlib
    
  • Un proyecto de Google Cloud con la API de Google Chat habilitada y configurada. Para ver los pasos, consulta Compila una app de Google Chat.
  • Autorización configurada para la app de Chat. La descarga de contenido multimedia admite lo siguiente:

Descargar desde un archivo adjunto

Para descargar contenido multimedia desde un archivo adjunto, pasa lo siguiente en tu solicitud:

En el siguiente ejemplo, se descarga un archivo adjunto a un mensaje:

Python

  1. En tu directorio de trabajo, crea un archivo llamado chat_media_and_attachment_download.py
  2. Incluye el siguiente código en chat_media_and_attachment_download.py:

    import io
    
    from google_auth_oauthlib.flow import InstalledAppFlow
    from googleapiclient.discovery import build
    from googleapiclient.http import MediaIoBaseDownload
    
    # Define your app's authorization scopes.
    # When modifying these scopes, delete the file token.json, if it exists.
    SCOPES = ["https://www.googleapis.com/auth/chat.messages"]
    
    def main():
        '''
        Authenticates with Chat API via user credentials,
        then downloads a file attached to a message.
        '''
    
        # Authenticate with Google Workspace
        # and get user authorization.
        flow = InstalledAppFlow.from_client_secrets_file(
                    'client_secrets.json', SCOPES)
        creds = flow.run_local_server()
    
        # Build a service endpoint for Chat API.
        chat = build('chat', 'v1', credentials=creds)
    
        # Download media resource.
        request = chat.media().download_media(
            resourceName=RESOURCE_NAME,
        )
        file = io.BytesIO()
        downloader = MediaIoBaseDownload(file, request)
    
        done = False
        while done is False:
            status, done = downloader.next_chunk()
            if status.total_size:
                print(f'Total size: {status.total_size}')
            print(f'Download {int(status.progress() * 100)}')
    
    if __name__ == '__main__':
        main()
    
  3. En el código, reemplaza RESOURCE_NAME por attachmentDataRef.resourceName, que puedes recuperar de la siguiente manera:

  4. En tu directorio de trabajo, compila y ejecuta la muestra:

    python3 chat_media_and_attachment_download.py
    

Si se aplica correctamente, este método muestra el contenido del archivo como bytes.

Para descargar el contenido del archivo, elige uno de los siguientes enfoques:

  • Te recomendamos que utilices Clase MediaIoBaseDownload en Python, que contiene métodos para descargar el archivo en secciones y guardar el contenido en un flujo de salida.

  • Si debes realizar la solicitud HTTP de forma manual, llama al método download y especificar la parte del archivo que quieres descargar con un byte rango con el encabezado Range, por ejemplo: Range: bytes=500-999