¿Cómo puedo exportar la lista de pestañas abiertas de Chrome?

44

La función de sincronización de Chrome no recoge todas las pestañas abiertas en mi teléfono Android.

¿Las pestañas están almacenadas en un archivo en algún lugar al que pueda acceder?

Mi intención es exportar la lista de pestañas para poder ejecutar un restablecimiento de fábrica en el dispositivo.

Ejecutando Android 4.3

Majjo
fuente
Desearía que hubiera un complemento para ese propósito.
neverMind9
Debe haber una forma independiente y sin raíz para hacerlo. Porque el gestor de arranque borra. Quien inventó el dolor de cabeza de borrado del cargador de arranque debe ser despedido de inmediato. El gestor de arranque es una trampa. Desbloquearlo obliga a uno a borrar todos los datos, y algunas partes no se pueden respaldar sin desbloquearlo en primer lugar. Circulo vicioso. Y luego está el cifrado y el dolor de cabeza ARM TrustZone también.
neverMind9

Respuestas:

35

Puede usar la función Dispositivos remotos en el depurador de Chrome para conectarse a Chrome en el dispositivo y acceder a las pestañas. Simplemente expanda la lista de pestañas visibles para obtener la lista completa y luego resalte y copie todo lo que se muestra (incluidas las URL) en el portapapeles: https://developers.google.com/web/tools/chrome-devtools/remote-debugging/

Acabo de exportar ~ 400 pestañas de esta manera.

Jeremy Taylor
fuente
3
quería mencionar que la lista de depuradores de Chrome acortará las URL si son demasiado largas, por lo que en lugar de copiar y pegar, puede obtener las URL directamente usando el método en la respuesta de Louis Maddox
woojoo666
@ woojoo666: Parece que las cosas en Chrome han cambiado y ahora la respuesta de Louis también trunca el final de muchas URL. Parece que cualquier URL de más de 100 caracteres, que en mi caso representa aproximadamente el 50% de todas mis pestañas abiertas, perderá su finalización.
peterflynn
@peterflynn todavía funciona para mí. Acabo de exportar una url que tenía 432 caracteres de longitud. Solo para asegurarse, está abriendo las herramientas de desarrollo en una ventana emergente, va al panel de "dispositivos remotos", luego usa ctrl-shift-J para abrir una segunda ventana de herramientas de desarrollo y luego usa el script proporcionado aquí , ¿correcto?
woojoo666
¿Cuál es la versión mínima de Android requerida para hacer esto?
neverMind9
Desearía que hubiera una forma independiente de hacerlo. Sin depender de métodos externos. Lo sé, hay una lista de la pestaña Root, pero mi teléfono móvil no está rooteado porque la gente dice que existe el riesgo de algún mal funcionamiento.
neverMind9
25

Acabo de unirme a este StackExchange para mostrar algo de aprecio por la respuesta de Jeremy anterior, y también agregar las pocas líneas de JS que usé para exportar la lista de pestañas (¡ya que copiar con el cursor no es lo ideal!)

Como dijo Jeremy, seleccione Remote devicesdebajo More toolsen el icono de Devtools de Chrome (arriba a la derecha del panel):

  • configurar la depuración de USB en su teléfono (bajo SettingsDeveloper options, no se requiere root)
    • tenga en cuenta que debe habilitar el Developer optionsmenú, está oculto de forma predeterminada para proteger a los usuarios
    • en mi teléfono esto requería tocar varias veces el número de compilación en SettingsAbout Device
  • Una vez hecho esto, conecte su USB y permita la conexión MTP
  • cuando el panel del dispositivo remoto Chrome Devtools está abierto, el teléfono solicitará permitir la depuración de USB
    • puedes optar por confiar siempre en la computadora

Ahora el dispositivo está conectado,

  • abra una segunda vista de devtools en la vista de devtools de la que seleccionó Remote devicespara poder recuperar la lista de pestañas usando JavaScript
    • tenga en cuenta que debe tener herramientas de desarrollo en modo emergente (use el símbolo de puntos suspensivos verticales en la parte superior derecha del panel) para poder obtener esto, de lo contrario, Comando + Opción + J (MAC) Ctrl+ Shift+ J(VENTANAS) simplemente se cerrará El primer panel de devtools.
  • expanda la lista de los primeros elementos a todas las pestañas haciendo clic en "Mostrar más"
  • para escribir en la lista, use las siguientes líneas de código [ingresadas en la consola de la segunda ventana de devtools]
    • NB /deep/es el selector CSS para ingresar #shadow-rootelementos DOM

Para exportar una lista de todas las URL abiertas en Chrome para Android, elegí hacer la lista en una cadena de texto con formato de descuento y copiarla al portapapeles

tabs = Array.from(document.querySelectorAll('div /deep/ div /deep/ div /deep/ div /deep/ div /deep/ .device-page-list .vbox'), s => ({name: s.querySelector('.device-page-title').textContent, url: s.querySelector('.device-page-url .devtools-link').href}))
str = '';
for (i=0;i<tabs.length;i++){
  str += '['+tabs[i]['name']+']('+tabs[i]['url']+')\n'
}
copy(str)

Luego tendrá una lista en su portapapeles que se verá así:

[How can I export the list of open Chrome tabs? - Android Enthusiasts Stack Exchange](https://android.stackexchange.com/questions/56635/how-can-i-export-the-list-of-open-chrome-tabs)
[Get Started with Remote Debugging Android Devices  |  Tools for Web Developers  |  Google Developers](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/)
[How To Enable USB Debugging On Your Android Phone](https://www.groovypost.com/howto/mobile/how-to-enable-usb-debugging-android-phone/)
[Configure On-Device Developer Options | Android Studio](https://developer.android.com/studio/debug/dev-options.html)
...

Actualizar

Por alguna razón, recibo un error algunas veces , diciendo que no pudo obtener el hrefatributo de un nullelemento (cuando lo inspecciono es un nodo invisible, quién sabe). Para evitar esto, use esta versión en su lugar:

tabs = document.querySelectorAll('div /deep/ div /deep/ div /deep/ div /deep/ div /deep/ .device-page-list .vbox')
str = '';
for (i=0;i<tabs.length;i++){
  if (tabs[i].querySelector('.device-page-url .devtools-link') != null){
    str += '- ['+tabs[i].querySelector('.device-page-title').textContent + '](' + tabs[i].querySelector('.device-page-url .devtools-link').getAttribute('href') +')\n'
  } else {
    console.log(tabs[i])
  }
}
copy(str)
Louis Maddox
fuente
1
Chrome cambió, tabs = Array.from(document.querySelectorAll('div /deep/ div /deep/ div /deep/ div /deep/ div /deep/ .device-page-list .vbox'), s => ({name: s.querySelector('.device-page-title').textContent, url: s.querySelector('.devtools-link')._href}))funcionará ahora
dlamotte
Tenga en cuenta que con esta técnica, cualquier URL de más de 100 caracteres tendrá su final cortado.
peterflynn
@peterflynn todavía funciona para mí. Acabo de exportar una url que tenía 432 caracteres. Asegúrese de utilizar el script que proporcionó
diamotte
1
Cambió de nuevo. Para la versión de Chrome "73.0.3683.75 (versión oficial) (64 bits)": tabs = Array.from(document.querySelector('div /deep/ div /deep/ div /deep/ div /deep/ div /deep/ div /deep/ div.vbox.flex-auto').shadowRoot.querySelectorAll('.devices-view .device-page-list .vbox'), s => ({name: s.querySelector('.device-page-title').textContent, url: s.querySelector('.device-page-url .devtools-link').getAttribute('href')}))(No pude acceder a la raíz de sombra final a través de un selector, pero tuve que usar la .shadowRootpropiedad de su elemento host. No estoy seguro exactamente por qué, pero Hey, no compatible.
Adrian
1
En caso de que alguien más esté teniendo problemas, estaba teniendo problemas para ejecutar algunos de estos scripts (estaba afectando la pila USB del núcleo con un uso del 100% durante más de 10 minutos antes de detenerlo). La mejor manera que encontré fue seleccionar el elemento HTML principal en el inspector de herramientas de desarrollo de Chrome (use el botón del cursor en la parte superior izquierda de la ventana de herramientas de desarrollo anidadas para seleccionar un elemento aleatorio en la lista y luego seleccionar el elemento principal) y luego clic derecho -> "Editar como HTML" -> copiar en otro archivo de texto. Entonces fue más fácil y mucho más rápido adaptar los scripts anteriores para trabajar en esa copia HTML local (o BASH)
JZL003
13

Encontré esta solución cuando buscaba recuperar pestañas que se habían cerrado permanentemente después de que mi navegador se bloqueó un día. Para acceder a la información que necesita, su dispositivo debe estar rooteado para que pueda ejecutar una aplicación de exploración de archivos con acceso a los archivos raíz instalados en su dispositivo. ES File Explorer o Root Explorer son mis recomendaciones.

  1. Navegue a la carpeta raíz de su dispositivo (la partición del sistema protegida) → seleccione DATA→ seleccione com.android.chrome.

  2. Hay varios lugares donde puede encontrar información sobre sus pestañas actuales.

    1. La primera carpeta para verificar es app_tabs, entonces 0. En esta carpeta debe haber un archivo llamado tab_stateque contiene una lista de todas sus pestañas actuales.
    2. También hay otros archivos en esta carpeta llamadas tab3, tab4etc. que contienen información sobre las pestañas actuales.
    3. En mi opinión, necesita un "editor de texto / editor sql" especial para leer el contenido de algunos de estos archivos, ya que la codificación es diferente.
  3. El siguiente lugar para buscar es /data/com.android.chrome/app_chrome/Default/. En esta carpeta encontrarás un archivo llamado History. Dependiendo de su situación, puede encontrar una buena lista de visitas recientes al sitio aquí.

  4. Finalmente, navega hasta el Sync Data folder. Aquí encontrará la información que se está sincronizando con Google (y esto debe incluir todas las pestañas que actualmente ha sincronizado en otros dispositivos).

    • En el archivo SyncData.sqlite3, también encontrará un historial de todas sus búsquedas en Google (que a veces encuentro una lectura interesante).
    • Necesitará un programa de navegador de datos Sqlite3 en su PC para leer este archivo. La aplicación debería poder exportarse a un archivo .CSVo .XLSarchivo altamente utilizable que pueda abrir en MS Excel .

Esto podría ser útil para alguien que supongo.

Miguel
fuente
5

Si tiene instaladas las herramientas de línea de comandos de Android en una máquina de desarrollo y ha habilitado la depuración de USB en su dispositivo Android, puede hacer lo siguiente:

  • Ejecute adb forward tcp:9222 localabstract:chrome_devtools_remoteen su máquina de desarrollo.

    Las instancias de Chrome exponen el acceso a un protocolo de depuración a través de un socket de dominio Unix con la dirección abstracta " chrome_devtools_remote" - el comando adb anterior reenvía las solicitudes al puerto 9222, a ese socket. (Puede obtener una lista de todos los sockets de dominio Unix en el dispositivo Android escribiendo adb shell cat /proc/net/unix).

  • El protocolo de depuración expone datos JSON sobre la instancia de Chrome a través de HTTP. Un archivo JSON que enumera las pestañas abiertas se puede obtener mediante la ejecución wget -O tabs.json http://localhost:9222/json/list.

    (Se pueden encontrar otros puntos finales de la API en https://github.com/buggerjs/bugger-daemon/blob/master/README.md#api ).

Consulte aquí para obtener más detalles sobre cómo habilitar la depuración de USB, y aquí para obtener una descripción general de cómo funciona.

phlummox
fuente
2

Esta solución le proporcionará un archivo de texto con URL individuales para todas las pestañas que haya abierto en Chrome para Android.

  1. Como se menciona en esta respuesta de Michael , debe tomar el archivo que contiene las pestañas actuales. Usando un explorador de raíz en el dispositivo, tome este archivo y muévalo a la carpeta que elija en Windows:/data/data/com.android.chrome/app_tabs/0/tab_state

  2. Instalar herramientas GNU para Windows

  3. A veces hay un extraño carácter de flecha en el archivo que arruina el guión. Si ejecuta el script y trunca parte del archivo, mire el último carácter y probablemente será ese extraño personaje de flecha. Encuéntralo / reemplázalo en el archivo original. Una vez que se haya ido, el script se ejecutará bien. Se parece a esto:-->

  4. Vaya a la línea de comandos (vaya a "Ejecutar" o Win+ R, y escriba cmd) y navegue a la carpeta que contiene sed.exe(donde lo instaló en el paso 2.)

  5. Probablemente desee mover el archivo original ( tab_state) a la misma carpeta que contiene sed.exe. Hará todo más fácil. Una vez que hayas hecho eso, ejecuta este script:

    sed -i "s/.\{6\}http/\r\n\r\nhttp/g" tab_state
    
  6. Esto modificará el archivo con todas las URL formateadas correctamente. Abra el archivo como un archivo de texto y luego copie y pegue el contenido en un documento de Word u otra ubicación. Por alguna razón, si no copia y pega los datos, cuando guarda el archivo, borra todos los saltos de línea / retornos de carro. Si las cosas se arruinan, simplemente comienza de nuevo y vuelve a hacerlo. Cuando todo está dicho y hecho, debe tener un archivo que contenga una lista de enlaces a todas las pestañas que había abierto antes.

Darren
fuente
2

Instrucciones para Brave! Puede reemplazar el código en la consola de Louis Maddox con este, esto está funcionando a partir de hoy Brave Version 1.0.0 Chromium: 78.0.3904.97 (Official Build) (64-bit). Observación: puede abrir una nueva ventana de consola de la ventana de dispositivos remotos si activa la ventana del dispositivo remoto y presionaCtrl+Shift+J

tabs = Array.from(document.querySelector('div /deep/ div /deep/ div /deep/ div /deep/ div /deep/ div /deep/ div.vbox.flex-auto').shadowRoot.querySelectorAll('.devices-view .device-page-list .vbox'), s => ({name: s.querySelector('.device-page-title').textContent, url: s.querySelector('.device-page-url .devtools-link').getAttribute('href')}))

str = ' ';

tabs.forEach(e => {
    str += '- ['+ e.name + '](' + e.url +')\n';
})
copy(str)

Luego puede pegar todas sus pestañas en un archivo de texto.

Si desea abrir todas las pestañas en su dispositivo real, reemplace la parte tabs.forEachcon

tabs.forEach(e => {
    window.open(e.url, '_blank');
})

Sin embargo, no intentes eso con demasiadas pestañas abiertas en tu dispositivo.

Agregué esto después de la tabsparte para sincronizar manualmente las pestañas abiertas (a los valientes aún les falta esta característica y tenía 650 pestañas abiertas en mi dispositivo móvil) con un costo de 50 pestañas:

i=0;
j=0;
tabs.forEach(e => {
  if(i<50){
    i++;
    window.open(e.url, '_blank');
  }
  j++;
})
console.log("Tabs overall:"+j);

Esto abrirá un lote de 50 pestañas de su dispositivo en la ventana abierta del navegador. También muestra el recuento general de pestañas. Sin embargo, no cierre la pestaña 'vacía' restante para esas herramientas de desarrollador y el dispositivo remoto, si desea abrir otro lote. Con el Ctrl + TABcambio a través de las pestañas, Ctrl +Dpara marcarlas y Ctrl+Wcerrar la pestaña activa. Así lo hice manualmente, siéntase libre de proponer cambios a este código para facilitarle la vida a todos.

simonsan
fuente
1

Michael identificó el archivo tab_state, queda por decodificarlo. El siguiente script funcionó para mí (en kitkat KSH_VERSION = '@ (#) MIRBSD KSH R43 2013/02/19' o xenial BASH_VERSION = '4.3.46 (1) -release' en un archivo tab_state de Chrome 49.0.2623.105), imprime la última URL primero, entre las URL, elimina cualquier byte no imprimible y todos los bytes siguientes, y más si es necesario para que se eliminen al menos 2 bytes. Después de cada URL, imprime un espacio, luego los bytes imprimibles contiguos eliminados, si los hay, luego una coma, luego el número de otros bytes eliminados (y dichos bytes entre paréntesis). Para imprimir las URL solo use el comando echo comentado en su lugar.

tab_state=/data/data/com.android.chrome/app_tabs/0/tab_state
[[ $KSH_VERSION ]]||shopt -s extglob       #set if bash
(cat $tab_state;echo)|while read -r r;do b=
   while
      q=${r%http?(s)://*}          #chip off a URL
      [[ $q = *url= ]]&&{
         p=${r%http?(s)://*url=*}  #special case URL within URL
         [[ $p = "$r" ]]||q=$p;}
      h=${r:${#q}}                 #the chip
      h=${h%%[! -~]*}              #remove unprintable&following bytes
      u=$((${#r}-${#q}-${#h}))     #no of said bytes removed
      p=$((u<b?b-u:0))             #no of more bytes to remove
      [[ $h ]];do
         echo "${h::${#h}-p} ${h:${#h}-p},$u(${r:${#r}-u})"
      #  echo "${h::${#h}-p}"
         r=$q b=2
   done
done
gregrwm
fuente
1

Debes ser root o Chrome para leer /data/data/com.android.chrome/app_tabs/0/tab_state0

Puede utilizar este exploit dirtycow en dispositivos vulnerables para convertirse en Chrome y obtenerlo tab_state0desde un dispositivo conectado:

make root
adb shell
run-as com.android.chrome
chmod 711 /data/data/com.android.chrome/app_tabs/0
chmod 644 /data/data/com.android.chrome/app_tabs/0/tab_state0
exit
cp /data/data/com.android.chrome/app_tabs/0/tab_state0 /sdcard/
exit
adb pull /sdcard/tab_state0

Una vez que tenga acceso a tab_state0, extraiga las URL:

LC_ALL=C grep -a -o 'http[[:print:]]*' tab_state0
tekumara
fuente
1

En Windows, para extraer tab_state0de un archivo TitaniumBackup (que funciona en teléfonos rooteados)

7z e TitaniumB\com.android.chrome-20180918-001302.tar.gz -so | 7z e -si -ttar tab_state0 -r

Para obtener la lista de pestañas de tab_state0

sed -b "s/^.\{20\}//g" tab_state0 | sed -b "s/.\{6\}http/\nhttp/g" > my-tabs.md

En Windows instalaría https://scoop.sh/ y luegoscoop install busybox 7zip

raisercostin
fuente
1

La respuesta más reciente de simonsan no funciona en mi versión actual de Chrome 75.0.3770.100. No tengo la vboxclase que se usa en cada script publicado, así que logré escribir un código que funciona ahora:

tabs = document.querySelectorAll('#devices div /deep/ div /deep/ div /deep/ div /deep/ .row')
str = '';
for (i=0;i<tabs.length;i++){
  if (tabs[i].querySelector('.name').innerText != null){
    str += '- ['+tabs[i].querySelector('.name').innerText + '] (' + tabs[i].querySelector('.url').innerText +  ')\n'
  } else {
    console.log(tabs[i])
  }
}

He encontrado que la publicación y las capturas de pantalla de Louis Maddox son muy útiles para descifrar su script, así que aquí está el mío con el árbol actualizado.

captura de pantalla


De todos modos, las soluciones propuestas para superar el límite de 100 caracteres no funcionaron para mí, por lo que decidí editarlo inspect.jsdesde la fuente siguiendo estos pasos:

  1. Descarga el chrome-pak-customizer y descomprímelo.
  2. Desde C:\Program Files (x86)\Google\Chrome\Application\75.0.3770.100(donde 75.0.3770.100está el nombre de la compilación) haga una copia de la resources.pakcarpeta de Documentos, arrastre la copia y suéltela unpack.baten la carpeta descomprimida.
  3. En \document\resources_unpaked\tomar el 11208.jsy abrirlo.
  4. En la línea 537 o buscando 100hay estas líneas
  let text = value ? String(value) : '';
  if (text.length > 100) {
    text = text.substring(0, 100) + '\u2026';
  }

changing the 100 to 300 should be enough, it may cuts some google search links but mine where still working.
  1. Guarde el archivo y, en la misma carpeta, arrástrelo pak_index.iniy suéltelo en pak.bat. ahora el resource.paken \documents\ha sido actualizado con los cambios.
  2. Haga una copia de seguridad resource.pakporque nunca se sabe, cierre Chrome y reemplace el original con la versión actualizada.

Ahora el script mostrará hasta 300 caracteres para las URL.

priorincantatio
fuente