¿Cómo puedo exportar archivos caché guardados en un navegador usando CacheStorage?

Tengo un sitio web que utiliza la API de CacheStorage para guardar varios archivos usando un Worker de servicio. Por razones ajenas a mi control, muchos de estos archivos se han perdido del servidor desde el que se cargan. Sin embargo, acabo de darme cuenta de que varios cientos de archivos han sido grabados localmente en un navegador que había accedido a los lotes del sitio durante un período de años (Por suerte el sitio no había estado aclarando la caché después de sí mismo correctamente). Puedo previsualizar los archivos usando las herramientas dev de Chrome, pero cuando hago clic en "descargar" intenta descargar una copia del servidor (que ya no existe), en lugar de darme la versión localmente caché.

¿Cuál es la manera más simple de hacer una exportación única de estos archivos (atendiendo que hay unos cientos de ellos)? Tengo acceso completo a la computadora en la que se ejecuta el navegador, y el dominio en el que se ejecuta el sitio / trabajador de servicio. No necesita ser una solución bonita, ya que una vez restaurados los archivos planeo aprender muchas lecciones para evitar que algo similar suceda en el futuro.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por compilercaptain7dab


4 Respuestas:

  • El CacheStorage API se puede acceder desde la página web normal JavaScript, así como un trabajador de servicio, por lo que si crea una página web en el servidor que accede window.cachesDeberías ser capaz de sacar cosas del cache y hacer lo que quieras. Una vez que tengas cache.keys() Podrías olvidarte de eso y usar match() que devuelve la respuesta para esa solicitud. Usted podría entonces imprimirlos para copiar y pegar (presumiblemente no ideal), POST cada uno a un servidor que los guarda, o similar.

    Aquí hay una JS normal que tengo en traintimes.org.uk; sólo para mostrar una lista de páginas offline, pero presumiblemente podría buscar las entradas de caché reales si fuera necesario.

    
    

    Respondida el Dec 19, 2020 a las 00:51 - por binarymaestro

    Votos positivos: 0 | Votos negativos: 0

  • Las respuestas a la API de CacheStorage se almacenan en el disco. Por ejemplo, el cromo en Mac OSX los almacena en ~/Library/Application Support/Google/Chrome/Default/Service Worker/CacheStorage. Dentro de este directorio, hay un directorio para cada dominio, y dentro de ellos, directorios separados para cada caché particular utilizado por ese dominio. Los nombres de estos directorios (a ambos niveles) no parecen ser legibles por humanos, por lo que es posible que necesite buscar los contenidos para encontrar el caché específico que está buscando.

    Dentro del directorio de cada caché, cada respuesta se guarda en un archivo diferente. Estos son archivos binarios y contienen varios bits de información, incluyendo la URL solicitada (cerca de la parte superior) y los encabezados de respuesta HTTP (hacia el final). Entre estos, encontrarás el cuerpo de la respuesta HTTP.

    La lógica exacta para extraer los cuerpos y guardarlos en archivos utilizables en otros lugares variará esquemas de URL basados, formatos de archivo, etc. Este guión bash funcionó para mí:

    #!/bin/bash
    
    mkdir -p export
    for file in *_0
    do
        output=`LC_ALL=C sed -nE 's%^.*/music/images/artists/542x305/([^\.]*\.jpg).*%\1%p;/jpg/q' $file`
        if [ -z "$output" ]
        then
            echo "file $file missing music URL"
            continue
        fi
    
        if [[ $(LC_ALL=C sed -n '/x-backend-status.*404/,/.*/p' $file) ]]
        then
            echo "$file returned a 404"
            continue
        fi
    
        path="export/$output"
    
        cat $file | LC_ALL=C sed -n '/music\/images\/artists/,$p' | LC_ALL=C sed 's%^.*/music/images/artists/542x305/[^\.]*\.jpg%%g' | LC_ALL=C sed -n '/GET.*$/q;p' > $path
        echo "$file -> $path"
    done
    

    Respondida el Dec 19, 2020 a las 00:56 - por compilerhero

    Votos positivos: 0 | Votos negativos: 0

  • Para exportar los archivos guardados en la caché del navegador utilizando CacheStorage, puedes seguir los siguientes pasos:

    • Utiliza las herramientas de desarrollador del navegador (por ejemplo, en Chrome presiona F12) para acceder a la pestaña "Application" o "Aplicación" dependiendo del idioma del navegador.
    • En la sección "Cache Storage" o "Almacenamiento en caché", deberías poder ver una lista de los archivos almacenados en la caché local del navegador.
    • Selecciona los archivos que deseas exportar y puede que necesites examinarlos para encontrar los que necesitas.
    • Una vez que hayas identificado los archivos que deseas exportar, puedes hacer clic derecho en ellos y luego seleccionar "Open link in new tab" o "Abrir enlace en una nueva pestaña" para abrir cada archivo en una nueva pestaña del navegador.
    • En cada nueva pestaña abierta con los archivos, puedes hacer clic derecho en la página y seleccionar "Guardar como" para descargar cada archivo a tu computadora.

    Ten en cuenta que este método implica exportar los archivos individualmente, por lo que podría tomar tiempo si son cientos de archivos. Una vez que hayas exportado los archivos, puedes restaurarlos en tu servidor o guardarlos como copias de seguridad.

    Espero que esta solución te sea de ayuda. ¡Buena suerte con la recuperación de tus archivos!

    Respondida el Dec 20, 2020 a las 00:50 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Pasos para exportar archivos en caché usando CacheStorage:

    1. Inicia un Servicio de Trabajo:

    Inicia un Servicio de Trabajo en el navegador que contiene la caché. Este Servicio de Trabajo nos permitirá acceder a la API de CacheStorage.

    2. Obten la Caché:

    Utiliza caches.open('mi-cache') para obtener la caché que contiene los archivos. Reemplaza 'mi-cache' con el nombre de la caché que contiene los archivos.

    3. Enumerar las Solicitudes de Caché:

    Usa cache.keys() para obtener una lista de todas las solicitudes de caché. Cada solicitud representa un archivo en la caché.

    4. Recuperar los Archivos:

    Itera sobre la lista de solicitudes. Para cada solicitud, utiliza cache.match(solicitud) para recuperar el archivo de la caché.

    5. Guardar los Archivos:

    Una vez recuperados los archivos, guárdalos en la ubicación deseada. Puedes usar Blob.text() para convertir el archivo en una cadena y guardarla en un archivo.

    Ejemplo de Código:

    javascript
    // Iniciar un Servicio de Trabajo
    if ('serviceWorker' in navigator) {
      navigator.serviceWorker.register('sw.js');
    }
    
    // Obtener la Caché
    caches.open('mi-cache').then(cache => {
    
      // Enumerar las Solicitudes de Caché
      cache.keys().then(requests => {
    
        // Recuperar y Guardar los Archivos
        requests.forEach(request => {
          cache.match(request).then(response => {
            response.blob().then(blob => {
              // Convertir el archivo en una cadena y guardarlo
              blob.text().then(text => {
                // Guardar el texto en un archivo
              });
            });
          });
        });
      });
    });
    

    Nota:

    Reemplaza 'sw.js' con la ruta al archivo de Servicio de Trabajo. Reemplaza 'mi-cache' con el nombre de la caché que contiene los archivos. * El código anterior guarda los archivos como cadenas. Puedes modificarlo para guardarlos en un formato diferente si es necesario.

    Respondida el Dec 20, 2020 a las 00:59 - por Gemini

    Votos positivos: 0 | Votos negativos: 0