Como posso exportar a lista de guias abertas do Chrome?

44

O recurso de sincronização do Chrome não pega todas as guias abertas no meu telefone Android.

As guias estão armazenadas em um arquivo em algum lugar que eu possa acessar?

Minha intenção é exportar a lista de guias para que eu possa executar uma redefinição de fábrica no dispositivo.

Executando o Android 4.3

Majjo
fonte
Eu gostaria que houvesse um complemento para esse fim.
neverMind9
Deve haver uma maneira independente e sem raiz de fazer isso. Porque o carregador de inicialização limpa. Quem inventou a dor de cabeça de limpeza do carregador de inicialização deve ser demitido imediatamente. O carregador de inicialização é uma armadilha. O desbloqueio obriga a obliterar os dados inteiros, e algumas partes não podem ser copiadas sem o desbloqueio em primeiro lugar. Círculo vicioso. E também há criptografia e dor de cabeça do ARM TrustZone.
neverMind9

Respostas:

35

Você pode usar o recurso Dispositivos remotos no depurador do Chrome para conectar-se ao Chrome no dispositivo e acessar as guias. Basta expandir a lista de guias visíveis para obter a lista completa e realçar e copiar tudo o que é mostrado (incluindo os URLs) para a área de transferência: https://developers.google.com/web/tools/chrome-devtools/remote-debugging/

Acabei de exportar ~ 400 guias dessa maneira.

Jeremy Taylor
fonte
3
queria mencionar que a lista depurador cromo vai encurtar as URLs se eles são muito longos, então ao invés de copiar e colar, você pode obter a url está diretamente usando o método de Louis Maddox resposta
woojoo666
@ woojoo666: Parece que as coisas no Chrome mudaram e agora a resposta de Louis também trunca o final de muitos URLs. Parece que qualquer URL com mais de 100 caracteres - que, no meu caso, cerca de 50% de todas as minhas abas abertas - estará faltando no final.
Peterflynn
@peterflynn ainda funciona para mim. Acabei de exportar um URL com 432 caracteres. Apenas para ter certeza, você está abrindo as ferramentas de desenvolvimento em uma janela pop-up, acessando o painel "dispositivos remotos" e depois usando ctrl-shift-J para abrir uma segunda janela de ferramentas de desenvolvimento e, em seguida, usando o script fornecido aqui , correto?
woojoo666 26/09/18
Qual é a versão mínima exigida do Android para fazer isso?
neverMind9
Eu gostaria que houvesse uma maneira independente de fazer isso. Sem depender de métodos externos. Eu sei, existe a lista de guias Raiz, mas meu celular não está enraizado porque as pessoas dizem que existe o risco de apresentar algum defeito.
neverMind9
25

Acabei de ingressar neste StackExchange para mostrar alguma apreciação pela resposta de Jeremy acima e também adicionar as poucas linhas de JS que usei para exportar a lista de guias (já que copiar com o cursor não é o ideal!)

Como disse Jeremy, selecione Remote devicessob More toolson Chrome devtools ícone (canto superior direito do painel):

  • configure a depuração USB no seu telefone (em SettingsDeveloper options, raiz não é necessária)
    • Observe que você deve ativar o Developer optionsmenu, ele está oculto por padrão para proteger os usuários
    • no meu telefone, foi necessário tocar várias vezes no número da compilação em SettingsAbout Device
  • Feito isso, conecte seu USB e permita a conexão MTP
  • quando o painel de dispositivos remotos do Chrome devtools estiver aberto, o telefone solicitará a permissão de depuração USB
    • você pode optar por confiar sempre no computador

Agora o dispositivo está conectado,

  • abra uma segunda visualização de devtools na visualização de devtools a partir da qual você selecionou Remote devicespara poder recuperar a lista de guias usando JavaScript
    • observe que você deve ter os devtools no modo pop-out (use o símbolo de reticências verticais no canto superior direito do painel) para poder fazer isso, caso contrário, Command + Option + J (MAC) Ctrl+ Shift+ J(WINDOWS) fechará o primeiro painel de ferramentas.
  • expanda a lista dos primeiros itens para todas as guias clicando em "Mostrar mais"
  • para criar um script na lista, use as seguintes linhas de código [inseridas no console da 2ª janela do devtools]
    • NB /deep/é o seletor CSS para inserir #shadow-rootelementos DOM

Para exportar uma lista de todos os URLs abertos no Chrome para Android, optei por transformar a lista em uma sequência de texto formatada de remarcação e copiá-la para a área de transferência

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)

Você terá uma lista na sua área de transferência assim:

[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)
...

Atualizar

Por algum motivo, estou recebendo um erro algumas vezes , dizendo que ele falhou ao obter o hrefatributo de um nullitem (quando eu o inspeciono, é um nó invisível, quem sabe). Para contornar isso, use esta versão:

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
fonte
1
Chrome mudado, 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}))vai trabalhar agora
dlamotte
Observe que, usando essa técnica, qualquer URL com mais de 100 caracteres terá seu final cortado.
Peterflynn 25/09/19
@peterflynn ainda funciona para mim. Acabei de exportar um URL com 432 caracteres. Certifique-se de que você está usando o script que diamotte fornecido
woojoo666
1
Mudou de novo. Para a versão do Chrome "73.0.3683.75 (versão 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')}))(não consegui acessar a raiz-sombra final por meio de um seletor, mas tive que usar a .shadowRootpropriedade de seu elemento host. Não sei exatamente por que, mas Ei, sem suporte.
Adrian
1
No caso de alguém estar tendo problemas, eu estava tendo problemas para executar alguns desses scripts (estava martelando a pilha USB do kernel com 100% de uso por mais de 10 minutos antes de eu pará-lo). A melhor maneira que encontrei foi selecionar o elemento HTML pai no inspetor de ferramentas de desenvolvimento do chrome (use o botão cursor no canto superior esquerdo da janela aninhada de ferramentas de desenvolvimento para selecionar um item aleatório na lista e, em seguida, selecione o elemento pai) e, em seguida, clique direito -> "Editar como HTML" -> copie para outro arquivo de texto. Então ficou mais fácil e muito mais rápido adaptar os scripts acima para trabalhar com a cópia HTML local (ou BASH)
JZL003 07/06
13

Me deparei com essa solução quando estava procurando recuperar guias que estavam permanentemente fechadas depois que meu navegador travou um dia. Para acessar as informações necessárias, seu dispositivo precisa estar enraizado para que você possa executar um aplicativo explorador de arquivos com acesso aos arquivos raiz instalados no seu dispositivo. ES File Explorer ou Root Explorer são minhas recomendações.

  1. Navegue até a pasta raiz do seu dispositivo (a partição protegida do sistema) → selecione DATA→ selecionar com.android.chrome.

  2. Existem vários lugares onde você pode encontrar informações sobre suas guias atuais.

    1. A primeira pasta a verificar é app_tabs, então 0. Nesta pasta, deve haver um arquivo chamado tab_stateque contém uma lista de todas as suas guias atuais.
    2. Há também outros arquivos nesta pasta chamada tab3, tab4etc. que contêm informações sobre as guias atuais.
    3. Na IMO, você precisa de um "editor de texto / editor sql" especial para ler o conteúdo de alguns desses arquivos, pois a codificação é diferente.
  3. O próximo lugar para procurar é /data/com.android.chrome/app_chrome/Default/. Nesta pasta, você encontrará um arquivo chamado History. Dependendo da sua situação, você pode encontrar uma boa lista de visitas recentes ao site aqui.

  4. Por fim, navegue até o Sync Data folder. Aqui, você encontrará as informações que estão sendo sincronizadas com o Google (e isso deve incluir todas as guias que você sincronizou atualmente em outros dispositivos).

    • No arquivo SyncData.sqlite3, você também encontrará um histórico de todas as suas pesquisas no Google (que às vezes considero uma leitura interessante).
    • Você precisará de um programa de navegador de dados Sqlite3 no seu PC para ler este arquivo. O aplicativo deve ser capaz de exportar para um altamente usável .CSVou .XLSarquivo que você pode abrir em MS Excel .

Isso pode ser útil para alguém que eu assumo.

Michael
fonte
5

Se você possui as ferramentas de linha de comando do Android instaladas em uma máquina de desenvolvimento e ativou a depuração USB no seu dispositivo Android, pode fazer o seguinte:

  • Execute adb forward tcp:9222 localabstract:chrome_devtools_remotena sua máquina de desenvolvimento.

    As instâncias do Chrome expõem o acesso a um protocolo de depuração por meio de um soquete de domínio unix com o endereço abstrato " chrome_devtools_remote" - o comando adb acima encaminha solicitações para a porta 9222, para esse soquete. (Você pode obter uma lista de todos os soquetes de domínio unix no dispositivo Android digitando adb shell cat /proc/net/unix.)

  • O protocolo de depuração expõe dados JSON sobre a instância do chrome por HTTP. Um arquivo JSON que lista as guias abertas pode ser obtido executando wget -O tabs.json http://localhost:9222/json/list.

    (Outros pontos de extremidade da API podem ser encontrados em https://github.com/buggerjs/bugger-daemon/blob/master/README.md#api .)

Veja aqui para mais detalhes sobre a habilitação da depuração USB e aqui para uma visão geral de como funciona.

phlummox
fonte
2

Esta solução alternativa fornecerá um arquivo de texto com URLs individuais para todas as guias que você abriu no Chrome para Android.

  1. Como mencionado nesta resposta por Michael , você precisa pegar o arquivo que contém as guias atuais. Usando um root explorer no dispositivo, pegue esse arquivo e mova-o para a sua pasta preferida no Windows:/data/data/com.android.chrome/app_tabs/0/tab_state

  2. Instale o GNU Tools para Windows

  3. Às vezes, há um caractere de seta estranho no arquivo que estraga o script. Se você executar o script e ele truncar parte do arquivo, observe o último caractere e provavelmente será esse caractere de seta estranho. Encontre / substitua-o no arquivo original. Quando acabar, o script funcionará bem. Se parece com isso:-->

  4. Vá para o prompt da linha de comando (vá para "Executar" ou Win+ Re digite cmd) e navegue até a pasta que contém sed.exe(onde quer que você o tenha instalado na etapa 2.)

  5. Você provavelmente desejará mover o arquivo original ( tab_state) para a mesma pasta que contém sed.exe. Isso tornará tudo mais fácil. Depois de fazer isso, execute este script:

    sed -i "s/.\{6\}http/\r\n\r\nhttp/g" tab_state
    
  6. Isso modificará o arquivo com todos os URLs formatados corretamente. Abra o arquivo como um arquivo de texto e copie e cole o conteúdo em um documento do Word ou em outro local. Por alguma razão, se você não copiar e colar os dados, ao salvar o arquivo, ele apagará todas as quebras de linha / retornos de carro. Se tudo estragar, basta começar de novo e fazê-lo novamente. Quando tudo estiver pronto, você deve ter um arquivo que contenha uma lista de links para todas as guias que você abriu anteriormente.

Darren
fonte
2

Você pode substituir o código no console da Louis Maddox por este, que está funcionando hoje Version 0.66.99 Chromium: 75.0.3770.100. Observação: você pode abrir uma nova janela do console da janela de dispositivos remotos se ativar a janela do dispositivo remoto e pressionarCtrl+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)

Em seguida, você pode colar todas as suas guias em um arquivo de texto.

Se você deseja abrir todas as guias do seu dispositivo real, substitua tabs.forEach-part por

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

Não tente isso com muitas abas abertas no seu dispositivo.

Adicionei isso após a tabspeça para sincronizar manualmente as abas abertas (corajoso ainda falta esse recurso e eu tinha 650 abas abertas no meu dispositivo móvel) cobrando 50 abas:

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

Isso abrirá um lote de 50 guias do seu dispositivo na janela do navegador aberta. Também mostra a contagem geral de guias. Não feche a guia 'vazia' restante dessas ferramentas de desenvolvedor e do dispositivo remoto, se desejar abrir outro lote. Com Ctrl + TABvocê alternar entre as guias, Ctrl +Dpara marcá-las como favorito e Ctrl+Wfechar a guia ativa. Foi assim que fiz manualmente, sinta-se à vontade para propor alterações nesse código para facilitar a vida de todos.

simonsan
fonte
1

Michael identificou o arquivo tab_state, resta decodificá-lo. O script a seguir funcionou para mim (em kitkat KSH_VERSION = '@ (#) MIRBSD KSH R43 2013/02/19' ou xenial BASH_VERSION = '4.3.46 (1) -release' em um arquivo tab_state do Chrome 49.0.2623.105), ele imprime o último URL primeiro, entre os URLs que remove qualquer byte não imprimível e todos os bytes seguintes, e mais, se necessário, para que pelo menos 2 bytes sejam removidos. Após cada URL, ele imprime um espaço, os bytes contíguos removíveis, se houver, e uma vírgula e o número de outros bytes removidos (e os referidos bytes entre parênteses). Para imprimir os URLs, use apenas o comando eco comentado.

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
fonte
1

Você precisa ser root ou Chrome para ler /data/data/com.android.chrome/app_tabs/0/tab_state0

Você pode usar esta exploração de vaca suja em dispositivos vulneráveis ​​para se tornar o Chrome e obter tab_state0um 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

Depois de ter acesso tab_state0, extraia os URLs:

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

A resposta mais recente de simonsan não está funcionando na minha versão atual do Chrome 75.0.3770.100. Como não tenho a vboxclasse usada em todos os scripts publicados, consegui escrever um código que está funcionando agora:

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])
  }
}

Eu achei o post e as capturas de tela de Louis Maddox muito úteis para decifrar o script dele, então aqui está o meu com a árvore atualizada.

captura de tela


De qualquer forma, as soluções propostas para superar o limite de 100 caracteres não funcionaram para mim, por isso decidi editá- inspect.jslas a partir da fonte, seguindo estas etapas:

  1. Faça o download do chrome-pak-customizer e descompacte-o.
  2. Em C:\Program Files (x86)\Google\Chrome\Application\75.0.3770.100(onde 75.0.3770.100está o nome da compilação), faça uma cópia da resources.pakpasta Documentos, arraste a cópia e solte-a unpack.batna pasta descompactada.
  3. Em \document\resources_unpaked\tomar o 11208.jse abri-lo.
  4. Na linha 537 ou procurando, 100existem essas linhas
  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. Salve o arquivo e, na mesma pasta, arraste pak_index.inie solte-o no pak.bat. agora o resource.pakin \documents\foi atualizado com as alterações.
  2. Faça um backup resource.pakporque você nunca sabe, feche o Chrome e substitua o original pela versão atualizada.

Agora, o script mostrará até 300 caracteres para os URLs.

priorincantatio
fonte
0

No Windows, para extrair tab_state0de um arquivo TitaniumBackup (que funciona em telefones com root)

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

Para obter a lista de guias de tab_state0

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

No Windows eu instalaria https://scoop.sh/ thenscoop install busybox 7zip

raisercostin
fonte
-1

Esta não é a resposta que você está procurando, mas:

  1. Crie uma conta fictícia no Google

  2. Faça login no dispositivo Android e ative a sincronização

  3. Faça login na área de trabalho e ative a sincronização

  4. Instale a extensão Session Buddy na área de trabalho

  5. Guias de exportação

latigidigital
fonte
5
Como o OP declarou em sua pergunta: O recurso de sincronização do Chrome não está abrindo todas as guias abertas no meu telefone Android. - como isso deve ajudar? Sua solução sugerida é exportada após a sincronização incompleta , para que não exporte todas as guias conforme solicitado pelo OP.
Izzy