Wie kann ich die Liste der geöffneten Chrome-Tabs exportieren?

44

Die Synchronisierungsfunktion von Chrome erfasst nicht alle auf meinem Android-Handy geöffneten Tabs.

Sind die Registerkarten in einer Datei gespeichert, auf die ich zugreifen kann?

Ich beabsichtige, die Liste der Registerkarten zu exportieren, damit ich das Gerät auf die Werkseinstellungen zurücksetzen kann.

Android 4.3 ausführen

Majjo
quelle
Ich wünschte, es gäbe ein Add-On für diesen Zweck.
neverMind9
Es sollte einen eigenständigen, wurzelfreien Weg geben, dies zu tun. Da Bootloader abwischen. Wer den Bootloader erfunden hat, sollte sofort entlassen werden. Der Bootloader ist eine Falle. Durch das Entsperren werden die gesamten Daten gelöscht, und einige Teile können nicht gesichert werden, ohne sie zuerst zu entsperren. Teufelskreis. Und dann gibt es auch Verschlüsselung und ARM TrustZone-Kopfschmerzen.
neverMind9

Antworten:

35

Sie können die Funktion "Remote-Geräte" im Chrome-Debugger verwenden, um auf dem Gerät eine Verbindung zu Chrome herzustellen und auf die Registerkarten zuzugreifen. Erweitern Sie einfach die Liste der sichtbaren Registerkarten, um die vollständige Liste zu erhalten, und markieren und kopieren Sie alles, was angezeigt wird (einschließlich der URLs), in die Zwischenablage: https://developers.google.com/web/tools/chrome-devtools/remote-debugging/

Ich habe es gerade geschafft, ~ 400 Tabs auf diese Weise zu exportieren.

Jeremy Taylor
quelle
3
wollte erwähnen, dass die Chrome-Debugger-Liste die URLs verkürzt, wenn sie zu lang sind. Anstatt sie zu kopieren, können Sie die URLs direkt mit der Methode in Louis
Maddoxs
@ woojoo666: Es sieht so aus, als hätten sich die Dinge in Chrome geändert und jetzt schneidet Louis 'Antwort auch das Ende vieler URLs ab. Es sieht so aus, als ob eine URL mit mehr als 100 Zeichen - in meinem Fall etwa 50% aller offenen Tabs - keine Endung hat.
Peterflynn
@ Peterflynn funktioniert immer noch für mich. Ich habe gerade eine URL exportiert, die 432 Zeichen lang war. Um sicherzugehen, öffnen Sie die Dev-Tools in einem Pop-Out-Fenster, wechseln zum Bereich "Remote-Geräte", öffnen mit Strg-Shift-J ein zweites Dev-Tools-Fenster und verwenden dann das bereitgestellte Skript hier richtig?
Woojoo666
Was ist die mindestens erforderliche Android-Version, um dies zu tun?
neverMind9
Ich wünschte, es gäbe eine eigenständige Möglichkeit , dies zu tun. Ohne auf externe Methoden angewiesen zu sein. Ich weiß, es gibt eine Liste mit Stammregistern, aber mein Handy ist nicht gerootet, weil Leute sagen, dass das Risiko einer Fehlfunktion besteht.
neverMind9
25

Treten Sie einfach diesem StackExchange bei, um die oben stehende Antwort von Jeremy zu würdigen , und fügen Sie die wenigen Zeilen von JS hinzu, die ich zum Exportieren der Registerkartenliste verwendet habe (da das Kopieren mit dem Cursor nicht ideal ist!).

Wie Jeremy sagte, wählen Sie Remote devicesunter More toolsauf Chrome devtools Symbol (oben rechts im Panel):

  • Richten Sie das USB-Debugging auf Ihrem Telefon ein (unter SettingsDeveloper options, root nicht erforderlich)
    • Beachten Sie, dass Sie das Developer optionsMenü aktivieren müssen . Es ist standardmäßig ausgeblendet, um Benutzer zu schützen
    • Auf meinem Handy musste ich dazu mehrmals auf die Build-Nummer unter Settings⇒ tippenAbout Device
  • Sobald dies erledigt ist, schließen Sie Ihren USB-Stick an und lassen Sie die MTP-Verbindung zu
  • Wenn das Chrome devtools-Bedienfeld für Remote-Geräte geöffnet ist, werden Sie aufgefordert, das USB-Debugging zuzulassen
    • Sie können sich dafür entscheiden, dem Computer immer zu vertrauen

Jetzt ist das Gerät verbunden,

  • Öffnen Sie eine zweite devtools-Ansicht in der devtools-Ansicht, aus der Sie ausgewählt haben Remote devices, um die Liste der Registerkarten mit JavaScript abzurufen
    • Beachten Sie, dass Sie Devtools im Pop-Out-Modus haben müssen (verwenden Sie das vertikale Auslassungssymbol oben rechts im Bedienfeld), um dies anzuzeigen. Andernfalls wird Command + Option + J (MAC) Ctrl+ Shift+ J(WINDOWS) einfach geschlossen das erste devtools panel.
  • Erweitern Sie die Liste der ersten Elemente auf alle Registerkarten, indem Sie auf "Mehr anzeigen" klicken.
  • Verwenden Sie zum Erstellen eines Skripts für die Liste die folgenden Codezeilen [in der Konsole des 2. Devtools-Fensters eingegeben]
    • NB /deep/ist der CSS-Selektor zur Eingabe von #shadow-rootDOM-Elementen

Um eine Liste aller in Chrome für Android geöffneten URLs zu exportieren, habe ich mich dafür entschieden, die Liste in eine abschriftenformatierte Textzeichenfolge umzuwandeln und in die Zwischenablage zu kopieren

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)

Sie haben dann eine Liste in Ihrer Zwischenablage, die so aussieht:

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

Aktualisieren

Aus irgendeinem Grund erhalte ich einen Fehler einen Teil der Zeit , sagen sie das bekommen fehlgeschlagen hrefAttribut einer nullPosition (wenn ich inspizieren es es ist ein unsichtbares Knoten, wer weiß). Verwenden Sie stattdessen diese Version, um dies zu umgehen:

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
quelle
1
Chrome geändert, 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}))wird jetzt funktionieren
dlamotte
Beachten Sie, dass bei Verwendung dieser Technik die Endung einer URL mit mehr als 100 Zeichen abgeschnitten wird.
Peterflynn
@ Peterflynn funktioniert immer noch für mich. Ich habe gerade eine URL mit 432 Zeichen exportiert. Stellen Sie sicher, dass Sie das von diamotte bereitgestellte Skript verwenden
woojoo666
1
Es hat sich wieder geändert. Für Chrome-Version "73.0.3683.75 (Official Build) (64-bit)": 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')}))(Ich konnte nicht über einen Selektor auf die endgültige Shadow-Root zugreifen, sondern musste .shadowRootstattdessen die Eigenschaft des Host-Elements verwenden. Ich weiß nicht genau warum, aber Hey, nicht unterstützt
Adrian
1
Nur für den Fall, dass jemand anderes Probleme hat, hatte ich Probleme beim Ausführen einiger dieser Skripte (es hämmerte den USB-Stack des Kernels mit 100% Auslastung über 10+ Minuten, bevor ich ihn stoppte). Die beste Möglichkeit, die ich gefunden habe, bestand darin, das übergeordnete HTML-Element im Chrome Dev Tools-Inspektor auszuwählen (verwenden Sie die Cursortaste oben links im verschachtelten Dev Tools-Fenster, um ein zufälliges Element in der Liste auszuwählen, und wählen Sie dann das übergeordnete Element aus) Rechtsklick -> "Als HTML bearbeiten" -> In eine andere Textdatei kopieren. Dann war es einfacher und viel schneller, die obigen Skripte für die Arbeit an dieser lokalen HTML-Kopie (oder BASH)
anzupassen
13

Ich bin auf diese Lösung gestoßen, als ich nach Tabs gesucht habe, die nach einem Absturz meines Browsers dauerhaft geschlossen wurden. Um auf die von Ihnen benötigten Informationen zugreifen zu können, muss Ihr Gerät gerootet sein, damit Sie eine Datei-Explorer-App mit Zugriff auf die auf Ihrem Gerät installierten Stammdateien ausführen können. ES File Explorer oder Root Explorer sind meine Empfehlungen.

  1. Navigieren Sie zum Stammordner Ihres Geräts (der geschützten Systempartition) → Auswählen DATA→ Auswählen com.android.chrome.

  2. Es gibt verschiedene Stellen, an denen Sie Informationen zu Ihren aktuellen Registerkarten finden können.

    1. Der erste zu überprüfende Ordner ist app_tabsdann 0. In diesem Ordner sollte sich eine Datei mit dem Namen tab_statebefinden, die eine Liste aller Ihrer aktuellen Registerkarten enthält.
    2. Es gibt auch andere Dateien in diesen Ordnern tab3, tab4usw. , die Informationen über die aktuell Tabs enthalten.
    3. IMO, Sie benötigen einen speziellen "Texteditor / SQL-Editor", um den Inhalt einiger dieser Dateien zu lesen, da die Codierung unterschiedlich ist.
  3. Der nächste Ort ist /data/com.android.chrome/app_chrome/Default/. In diesem Ordner finden Sie eine Datei namens History. Abhängig von Ihrer Situation finden Sie hier möglicherweise eine gute Liste der letzten Besuche vor Ort.

  4. Zum Schluss navigieren Sie zu Sync Data folder. Hier finden Sie die Informationen, die mit Google synchronisiert werden (einschließlich aller Registerkarten, die Sie derzeit auf anderen Geräten synchronisiert haben).

    • In der Datei SyncData.sqlite3finden Sie auch einen Verlauf aller Ihrer Google-Suchanfragen (die ich manchmal als interessant empfinde).
    • Sie erhalten eine Sqlite3 Daten - Browser benötigen Programm auf Ihrem PC , um diese Datei zu lesen. Die App sollte in der Lage sein , auf eine sehr brauchbar zu exportieren .CSVoder .XLSDatei , die Sie in öffnen können MS Excel .

Dies könnte für jemanden hilfreich sein, von dem ich annehme.

Michael
quelle
5

Wenn Sie die Android-Befehlszeilentools auf einem Entwicklungscomputer installiert und das USB-Debugging auf Ihrem Android-Gerät aktiviert haben, können Sie Folgendes tun:

  • Führen Sie es adb forward tcp:9222 localabstract:chrome_devtools_remoteauf Ihrem Entwicklungscomputer aus.

    Chrome-Instanzen ermöglichen den Zugriff auf ein Debugging-Protokoll über einen Unix-Domain-Socket mit der abstrakten Adresse " chrome_devtools_remote" - der obige Befehl adb leitet Anforderungen an Port 9222 an diesen Socket weiter. (Sie können eine Liste aller Unix-Domain-Sockets auf dem Android-Gerät abrufen, indem Sie Folgendes eingeben adb shell cat /proc/net/unix.)

  • Das Debugging-Protokoll macht JSON-Daten zur Chrome-Instanz über HTTP verfügbar. Eine JSON-Datei mit den geöffneten Registerkarten kann durch Ausführen von abgerufen werden wget -O tabs.json http://localhost:9222/json/list.

    (Weitere Endpunkte der API finden Sie unter https://github.com/buggerjs/bugger-daemon/blob/master/README.md#api .)

Sehen Sie hier , um weitere Informationen über das Aktivieren USB - Debugging, und hier für einen Überblick darüber , wie es funktioniert.

Phlummox
quelle
2

Bei dieser Problemumgehung erhalten Sie eine Textdatei mit individuellen URLs für alle Registerkarten, die Sie in Chrome für Android geöffnet haben.

  1. Wie in dieser Antwort von Michael erwähnt , müssen Sie die Datei mit den aktuellen Registerkarten abrufen. Greifen Sie mit einem Root-Explorer auf dem Gerät auf diese Datei und verschieben Sie sie in einen Ordner Ihrer Wahl in Windows:/data/data/com.android.chrome/app_tabs/0/tab_state

  2. Installieren Sie GNU Tools für Windows

  3. Manchmal gibt es ein seltsames Pfeilzeichen in der Datei, das das Skript durcheinander bringt. Wenn Sie das Skript ausführen und einen Teil der Datei abschneiden, sehen Sie sich das letzte Zeichen an und es wird wahrscheinlich das seltsame Pfeilzeichen sein. Suchen / Ersetzen Sie es in der Originaldatei. Sobald es weg ist, läuft das Skript einwandfrei. Es sieht aus wie das:-->

  4. Gehen Sie zur Eingabeaufforderung (gehen Sie zu "Ausführen" oder Win+ Rund geben Sie ein cmd) und navigieren Sie zu dem Ordner, der enthält sed.exe(wo immer Sie ihn in Schritt 2 installiert haben).

  5. Vermutlich möchten Sie die Originaldatei ( tab_state) in denselben Ordner verschieben, der enthält sed.exe. Es wird alles einfacher machen. Führen Sie anschließend das folgende Skript aus:

    sed -i "s/.\{6\}http/\r\n\r\nhttp/g" tab_state
    
  6. Dadurch wird die Datei mit allen korrekt formatierten URLs geändert. Öffnen Sie die Datei als Textdatei, kopieren Sie den Inhalt und fügen Sie ihn in ein Word-Dokument oder einen anderen Speicherort ein. Aus irgendeinem Grund werden beim Speichern der Datei alle Zeilenumbrüche / Zeilenumbrüche gelöscht, wenn Sie die Daten nicht kopieren und einfügen. Wenn es schief geht, fangen Sie einfach von vorne an und wiederholen Sie den Vorgang. Wenn alles gesagt und getan ist, sollten Sie eine Datei haben, die eine Liste von Links zu allen Registerkarten enthält, die Sie zuvor geöffnet hatten.

Darren
quelle
2

Sie können den Code in der Konsole von Louis Maddox durch diesen ersetzen, der ab heute funktioniert Version 0.66.99 Chromium: 75.0.3770.100. Anmerkung: Sie können ein neues Konsolenfenster des Remote-Gerätefensters öffnen, indem Sie das Remote-Gerätefenster aktivieren und auf drückenCtrl+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)

Dann können Sie alle Ihre Tabs in eine Textdatei einfügen.

Wenn Sie alle Registerkarten auf Ihrem tatsächlichen Gerät öffnen möchten, ersetzen Sie das tabs.forEach-Teil durch

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

Versuchen Sie dies jedoch nicht mit zu vielen offenen Tabs auf Ihrem Gerät.

Ich habe dies nach dem tabsTeil hinzugefügt , um geöffnete Tabs manuell zu synchronisieren (mutig fehlt diese Funktion immer noch, und ich hatte 650 geöffnete Tabs auf meinem mobilen Gerät). Die Kosten betragen 50 Tabs:

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

Dies öffnet einen Stapel von 50 Registerkarten von Ihrem Gerät in das geöffnete Browserfenster. Außerdem wird die Gesamtzahl der Registerkarten angezeigt. Schließen Sie jedoch nicht die verbleibende Registerkarte "leer" für diese Entwicklertools und das Remote-Gerät, wenn Sie einen weiteren Stapel öffnen möchten. Mit Ctrl + TABwechseln Sie durch die Registerkarten, Ctrl +Dum sie mit einem Lesezeichen zu versehen und Ctrl+Wdie aktive Registerkarte zu schließen. So habe ich es manuell gemacht. Sie können jederzeit Änderungen an diesem Code vorschlagen, um das Leben aller einfacher zu machen.

simonsan
quelle
1

Michael hat die tab_state-Datei identifiziert, sie muss noch dekodiert werden. Das folgende Skript hat für mich funktioniert (in kitkat KSH_VERSION = '@ (#) MIRBSD KSH R43 2013/02/19' oder xenial BASH_VERSION = '4.3.46 (1) -release' in einer tab_state-Datei aus Chrome 49.0.2623.105). Es druckt die letzte URL zuerst aus. Zwischen den URLs werden alle nicht druckbaren Bytes und alle folgenden Bytes entfernt. Falls erforderlich, werden mindestens 2 Bytes entfernt. Nach jeder URL wird ein Leerzeichen ausgegeben, dann die entfernten zusammenhängenden druckbaren Bytes, falls vorhanden, dann ein Komma, dann die Anzahl der anderen entfernten Bytes (& besagte Bytes in Klammern). Verwenden Sie zum Drucken der URLs stattdessen den Befehl "Kommentiertes Echo".

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

Sie müssen root oder Chrome sein, um lesen zu können /data/data/com.android.chrome/app_tabs/0/tab_state0

Sie können diesen DirtyCow-Exploit auf anfälligen Geräten verwenden, um Chrome zu werden und tab_state0von einem angeschlossenen Gerät zu erhalten:

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

Sobald Sie Zugriff auf haben tab_state0, extrahieren Sie die URLs:

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

Die neueste Antwort von simonsan funktioniert in meinem aktuellen Chrome-Build nicht 75.0.3770.100. Ich habe nicht die vboxKlasse, die in jedem Skript verwendet wird, veröffentlicht, also habe ich es geschafft, einen Code zu schreiben, der jetzt funktioniert:

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

Ich habe Louis Maddox 'Post und Screenshots als sehr nützlich empfunden , um sein Skript zu entschlüsseln. Hier ist also meins mit dem aktualisierten Baum.

Bildschirmfoto


Wie auch immer, die vorgeschlagenen Lösungen zur Überwindung der Obergrenze von 100 Zeichen haben bei mir nicht funktioniert. Daher habe ich beschlossen, die inspect.jsaus der Quelle stammenden Informationen folgendermaßen zu bearbeiten :

  1. Laden Sie die Chrom-pak-Customizer und entpacken Sie es.
  2. Erstellen Sie von C:\Program Files (x86)\Google\Chrome\Application\75.0.3770.100(wo 75.0.3770.100ist der Name des Builds ) eine Kopie des resources.pakOrdners in Ihrem Dokument, ziehen Sie die Kopie und legen Sie sie unpack.batim entpackten Ordner ab.
  3. In \document\resources_unpaked\nehmen die 11208.jsund öffnen.
  4. In der Zeile 537 oder beim Suchen 100gibt es diese Zeilen
  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. Speichern Sie die Datei und ziehen Sie sie im selben Ordner pak_index.iniauf die pak.bat. jetzt wurde das resource.pakin \documents\mit den änderungen aktualisiert.
  2. Erstellen Sie eine Sicherungskopie von, resource.pakda Sie es nie erfahren haben. Schließen Sie Chrome und ersetzen Sie das Original durch die aktualisierte Version.

Jetzt zeigt das Skript bis zu 300 Zeichen für die URLs an.

priorincantatio
quelle
0

In Windows zum Extrahieren tab_state0aus einem TitaniumBackup-Archiv (funktioniert über gerootete Telefone)

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

Hiermit rufen Sie die Liste der Registerkarten ab tab_state0

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

Unter Windows würde ich installieren https://scoop.sh/ dannscoop install busybox 7zip

Raisercostin
quelle
-1

Dies ist nicht die Antwort, die Sie suchen, aber:

  1. Erstellen Sie ein Dummy-Konto bei Google

  2. Melden Sie sich auf dem Android-Gerät an und aktivieren Sie die Synchronisierung

  3. Melden Sie sich auf dem Desktop an und aktivieren Sie die Synchronisierung

  4. Installieren Sie die Session Buddy-Erweiterung auf dem Desktop

  5. Registerkarten exportieren

latigidigital
quelle
5
Wie das OP in seiner Frage festgestellt hat: Die Synchronisierungsfunktion von Chrome erfasst nicht alle Registerkarten, die auf meinem Android-Handy geöffnet sind. - wie soll das helfen? Ihre vorgeschlagene Lösung wird nach der unvollständigen Synchronisierung exportiert , sodass nicht alle Registerkarten wie vom OP angefordert exportiert werden.
Izzy