Jak mogę wyeksportować listę otwartych kart Chrome?

44

Funkcja synchronizacji Chrome nie wyświetla wszystkich kart otwartych na moim telefonie z Androidem.

Czy zakładki są przechowywane w pliku, do którego mam dostęp?

Moim zamiarem jest wyeksportowanie listy kart, aby móc przywrócić ustawienia fabryczne na urządzeniu.

Z systemem Android 4.3

Majjo
źródło
Chciałbym, żeby był do tego dodatek.
neverMind9,
Powinien istnieć samodzielny, bezrootowy sposób, aby to zrobić. Ponieważ wyczyść bootloader. Ktokolwiek wynalazł ból głowy związany z czyszczeniem bootloadera, powinien zostać natychmiast zwolniony. Program ładujący jest pułapką. Odblokowanie go zmusza do wymazania wszystkich danych, a niektórych części nie można wykonać bez odblokowania go na pierwszym miejscu. Błędne koło. A także szyfrowanie i ból głowy ARM TrustZone.
neverMind9

Odpowiedzi:

35

Możesz użyć funkcji Urządzenia zdalne w debugerze Chrome, aby połączyć się z Chrome na urządzeniu i uzyskać dostęp do kart. Po prostu rozwiń listę widocznych kart, aby uzyskać pełną listę, a następnie zaznacz i skopiuj wszystko pokazane (w tym adresy URL) do schowka: https://developers.google.com/web/tools/chrome-devtools/remote-debugging/

Właśnie udało mi się wyeksportować ~ 400 zakładek w ten sposób.

Jeremy Taylor
źródło
3
chciałem wspomnieć, że lista debugerów chrome skróci adresy URL, jeśli są one zbyt długie, więc zamiast wklejać kopie, możesz uzyskać adres URL bezpośrednio, korzystając z metody
opisanej
@ woojoo666: Wygląda na to, że rzeczy w Chrome się zmieniły, a teraz odpowiedź Louisa również obcina koniec wielu adresów URL. Wygląda na to, że jakikolwiek adres URL o długości przekraczającej 100 znaków - co w moim przypadku stanowi około 50% wszystkich moich otwartych kart - nie będzie miał końca.
peterflynn
@peterflynn nadal działa dla mnie. Właśnie wyeksportowałem adres URL o długości 432 znaków. Dla pewności otwierasz narzędzia programistyczne w wyskakującym oknie, przechodzisz do panelu „urządzenia zdalne”, następnie używasz ctrl-shift-J, aby otworzyć drugie okno narzędzi programistycznych, a następnie używasz dostarczonego skryptu tutaj prawda?
woojoo666,
Jaka jest minimalna wymagana wersja Androida, aby to zrobić?
neverMind9,
Chciałbym, żeby istniał samodzielny sposób . Bez polegania na zewnętrznych metodach. Wiem, że istnieje lista kart Root, ale mój telefon komórkowy nie jest zrootowany, ponieważ ludzie twierdzą, że istnieje ryzyko jakiejś awarii.
neverMind9
25

Właśnie dołączyłem do StackExchange, aby wyrazić uznanie dla odpowiedzi Jeremy'ego powyżej, a także dodać kilka wierszy JS, których użyłem do wyeksportowania listy zakładek (ponieważ kopiowanie kursorem nie jest idealne!)

Jak powiedział Jeremy, wybrać Remote devicespod More toolsChrome DevTools ikonę (w prawym górnym rogu panelu):

  • skonfiguruj debugowanie USB w telefonie (poniżej SettingsDeveloper options, root nie jest wymagany)
    • pamiętaj, że musisz włączyć Developer optionsmenu, domyślnie jest ukryte, aby chronić użytkowników
    • na moim telefonie wymagało to wielokrotnego stuknięcia w numer kompilacji pod SettingsAbout Device
  • po wykonaniu tej czynności podłącz USB i zezwól na połączenie MTP
  • gdy panel zdalnych urządzeń devtools Chrome jest otwarty, telefon poprosi o zezwolenie na debugowanie USB
    • możesz zdecydować się zawsze ufać komputerowi

Teraz urządzenie jest podłączone,

  • otwórz drugi widok devtools w widoku devtools, z którego wybrałeś, Remote devicesaby móc pobrać listę zakładek za pomocą JavaScript
    • zwróć uwagę, że musisz mieć devtoole w trybie wyskakującym (użyj pionowego symbolu elipsy w prawym górnym rogu panelu), aby móc to podnieść, w przeciwnym razie Command + Opcja + J (MAC) Ctrl+ Shift+ J(WINDOWS) po prostu zamknie się pierwszy panel devtools.
  • rozwiń listę z pierwszych kilku elementów do wszystkich kart, klikając „Pokaż więcej”
  • aby wykonać skrypt na liście, użyj następujących kilku wierszy kodu [wprowadzonych w konsoli drugiego okna devtools]
    • NB /deep/to selektor CSS do wprowadzania #shadow-rootelementów DOM

Aby wyeksportować listę wszystkich adresów URL otwartych w Chrome na Androida, postanowiłem po prostu przekształcić listę w ciąg tekstowy sformatowany metodą przeceny i skopiować ją do schowka

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)

W schowku pojawi się lista wyglądająca następująco:

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

Aktualizacja

Z jakiegoś powodu czasamihref pojawia się błąd , mówiąc, że nie udało mu się uzyskać atrybutu nullelementu (kiedy go sprawdzam, jest to niewidzialny węzeł, który wie). Aby obejść ten problem, użyj tej wersji:

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
źródło
1
Chrome zmieniony, 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}))będzie działać teraz
dlamotte
Pamiętaj, że przy użyciu tej techniki każdy adres URL o długości przekraczającej 100 znaków zostanie odcięty.
peterflynn
@peterflynn nadal działa dla mnie. Właśnie wyeksportowałem adres URL zawierający 432 znaki. Upewnij się, że używasz skryptu dostarczonego przez
diamotte
1
Znowu się zmieniło. W przypadku wersji Chrome „73.0.3683.75 (oficjalna wersja) (64-bitowa)”: 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')}))(Nie mogłem uzyskać dostępu do końcowego cienia roota za pomocą selektora, ale .shadowRootzamiast tego musiałem użyć właściwości jego elementu macierzystego. Nie jestem pewien, dlaczego, ale hej, nieobsługiwane
Adrian
1
Na wypadek, gdyby ktokolwiek miał problemy, miałem problemy z uruchomieniem niektórych z tych skryptów (hamowało stos USB jądra przy 100% zużyciu przez ponad 10 minut, zanim go zatrzymałem). Najlepszym sposobem, jaki znalazłem, było wybranie nadrzędnego elementu HTML w inspektorze narzędzi programistycznych chrome (użyj przycisku kursora w lewym górnym rogu okna zagnieżdżonych narzędzi programistycznych, aby wybrać losowy element z listy, a następnie element nadrzędny), a następnie kliknij prawym przyciskiem myszy -> „Edytuj jako HTML” -> skopiuj do innego pliku tekstowego. Potem było łatwiej i znacznie szybciej dostosować powyższe skrypty do pracy z lokalną kopią HTML (lub BASH)
JZL003
13

Natknąłem się na to rozwiązanie, gdy chciałem odzyskać karty, które zostały zamknięte na stałe po awarii jednego z przeglądarek. Aby uzyskać dostęp do wymaganych informacji, urządzenie musi być zrootowane, aby można było uruchomić aplikację eksploratora plików z dostępem do plików głównych zainstalowanych na urządzeniu. ES File Explorer lub Root Explorer to moje rekomendacje.

  1. Przejdź do folderu głównego urządzenia (chronionej partycji systemowej) → wybierz DATA→ wybierz com.android.chrome.

  2. Istnieje kilka miejsc, w których można znaleźć informacje o bieżących kartach.

    1. Pierwszy folderu należy sprawdzić app_tabs, a następnie 0. W tym folderze powinien znajdować się plik o nazwie, tab_statektóry zawiera listę wszystkich twoich bieżących kart.
    2. Istnieją również inne pliki w tym folderze o nazwie tab3, tab4itp, które zawierają informacje o aktualnych kartach.
    3. IMO, potrzebujesz specjalnego „edytora tekstu / edytora sql”, aby odczytać zawartość niektórych z tych plików, ponieważ kodowanie jest inne.
  3. Następne miejsce do zobaczenia /data/com.android.chrome/app_chrome/Default/. W tym folderze znajdziesz plik o nazwie History. W zależności od sytuacji możesz znaleźć tutaj dobrą listę ostatnich wizyt w witrynie.

  4. Na koniec przejdź do Sync Data folder. Tutaj znajdziesz informacje, które są synchronizowane z Google (i powinny obejmować wszystkie karty, które synchronizowałeś na innych urządzeniach).

    • W pliku znajduje SyncData.sqlite3się również historia wszystkich wyszukiwań w Google (które czasami uważam za interesujące czytanie).
    • Będziesz potrzebować programu do przeglądania danych Sqlite3 na komputerze, aby odczytać ten plik. Aplikacja powinna mieć możliwość eksportowania do bardzo użytecznego pliku .CSVlub .XLSpliku, który można otworzyć w MS Excel .

Może to być pomocne dla kogoś, kogo zakładam.

Michael
źródło
5

Jeśli masz narzędzia wiersza polecenia systemu Android zainstalowane na komputerze programistycznym i masz włączone debugowanie USB na urządzeniu z Androidem, możesz wykonać następujące czynności:

  • Wykonaj adb forward tcp:9222 localabstract:chrome_devtools_remotena swoim komputerze programistycznym.

    Instancje Chrome ujawniają dostęp do protokołu debugowania przez gniazdo domeny unix z abstrakcyjnym adresemchrome_devtools_remote” - powyższe polecenie adb przekazuje żądania do portu 9222, do tego gniazda. (Możesz uzyskać listę wszystkich gniazd domeny unix na urządzeniu z Androidem, pisząc adb shell cat /proc/net/unix.)

  • Protokół debugowania udostępnia dane JSON dotyczące instancji chrome przez HTTP. Plik JSON zawierający listę otwartych kart można uzyskać, wykonując wget -O tabs.json http://localhost:9222/json/list.

    (Inne punkty końcowe interfejsu API można znaleźć na stronie https://github.com/buggerjs/bugger-daemon/blob/master/README.md#api .)

Zobacz tutaj, aby uzyskać więcej informacji na temat włączania debugowania USB, a tutaj, aby zobaczyć, jak to działa.

floksoks
źródło
2

To obejście da Ci plik tekstowy z indywidualnymi adresami URL dla wszystkich kart otwartych w Chrome na Androida.

  1. Jak wspomniano w tym odpowiedzi przez Michała , trzeba chwycić plik zawierający aktualne karty. Korzystając z Eksploratora root na urządzeniu, pobierz ten plik i przenieś go do wybranego folderu w systemie Windows:/data/data/com.android.chrome/app_tabs/0/tab_state

  2. Zainstaluj GNU Tools dla Windows

  3. Czasami w pliku znajduje się dziwna strzałka, która psuje skrypt. Jeśli uruchomisz skrypt i skróci on część pliku, spójrz na ostatni znak i prawdopodobnie będzie to ten dziwny znak strzałki. Znajdź / zamień go w oryginalnym pliku. Po zniknięciu skrypt będzie działał poprawnie. To wygląda tak:-->

  4. Przejdź do wiersza polecenia (przejdź do „Uruchom” lub Win+ Ri wpisz cmd) i przejdź do folderu zawierającego sed.exe(gdziekolwiek zainstalowałeś go w kroku 2.)

  5. Prawdopodobnie będziesz chciał przenieść oryginalny plik ( tab_state) do tego samego folderu zawierającego sed.exe. Ułatwi to wszystko. Gdy to zrobisz, uruchom ten skrypt:

    sed -i "s/.\{6\}http/\r\n\r\nhttp/g" tab_state
    
  6. Spowoduje to modyfikację pliku z poprawnie sformatowanymi wszystkimi adresami URL. Otwórz plik jako plik tekstowy, a następnie skopiuj i wklej zawartość do dokumentu programu Word lub innej lokalizacji. Z jakiegoś powodu, jeśli nie skopiujesz i nie wkleisz danych, zapisując plik, usuwa on wszystkie podziały wierszy / znaki powrotu karetki. Jeśli wszystko się popsuło, po prostu zacznij od nowa i zrób to ponownie. Kiedy wszystko zostanie już powiedziane i zrobione, powinieneś mieć plik zawierający listę linków do wszystkich otwartych wcześniej kart.

Darren
źródło
2

Możesz zastąpić kod w konsoli od Louisa Maddoxa tym, który działa od dzisiaj Version 0.66.99 Chromium: 75.0.3770.100. Uwaga: Możesz otworzyć nowe okno konsoli okna urządzeń zdalnych, jeśli aktywujesz okno urządzenia zdalnego i naciśnieszCtrl+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)

Następnie możesz wkleić wszystkie swoje karty w pliku tekstowym.

Jeśli chcesz otworzyć wszystkie zakładki na swoim urządzeniu, zamień tabs.forEach-part na

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

Nie próbuj tego jednak ze zbyt dużą liczbą otwartych kart na urządzeniu.

Dodałem to po tabsczęści, aby ręcznie zsynchronizować otwarte karty (odważny wciąż brakuje tej funkcji i miałem 650 otwartych kart na moim urządzeniu mobilnym) pod obciążeniem 50 kart:

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

Spowoduje to otwarcie partii 50 kart z urządzenia do otwartego okna przeglądarki. Pokazuje także ogólną liczbę kart. Nie zamykaj pozostałej „pustej” karty dla narzędzi programistycznych i urządzenia zdalnego, jeśli chcesz otworzyć inną partię. Po Ctrl + TABprzełączeniu kart, Ctrl +Ddodaniu ich do zakładek i Ctrl+Wzamknięciu aktywnej karty. W ten sposób zrobiłem to ręcznie, możesz zaproponować zmiany w tym kodzie, aby ułatwić wszystkim życie.

simonsan
źródło
1

Michael zidentyfikował plik tab_state, pozostaje go zdekodować. Poniższy skrypt działał dla mnie (w kitkat KSH_VERSION = '@ (#) MIRBSD KSH R43 2013/02/19' lub xenial BASH_VERSION = '4.3.46 (1) -release' na pliku tab_state z przeglądarki Chrome 49.0.2623.105), najpierw wypisuje ostatni adres URL, między adresami URL usuwa bajt niezadrukowany i wszystkie kolejne bajty, a w razie potrzeby dodaje więcej, aby usunąć co najmniej 2 bajty. Po każdym adresie URL drukuje spację, a następnie usuwane ciągłe bajty do wydrukowania, jeśli takie istnieją, następnie przecinek, a następnie liczbę innych usuniętych bajtów (i wspomniane bajty w nawiasach). Aby wydrukować adresy URL, użyj zamiast tego komendy echo z komentarzem.

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
źródło
1

Aby czytać, musisz być rootem lub Chrome /data/data/com.android.chrome/app_tabs/0/tab_state0

Możesz wykorzystać ten exploit dirtycow na wrażliwych urządzeniach, aby stać się Chrome i uzyskać tab_state0z podłączonego urządzenia:

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

Po uzyskaniu dostępu tab_state0wyodrębnij adresy URL:

LC_ALL=C grep -a -o 'http[[:print:]]*' tab_state0
tekumara
źródło
1

Najnowsza odpowiedź simonsana nie działa na mojej obecnej wersji Chrome 75.0.3770.100. Nie mam vboxklasy, która jest używana w każdym opublikowanym skrypcie, więc udało mi się napisać kod, który teraz działa:

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

Uważam, że post i zrzuty ekranu Louisa Maddoxa są bardzo przydatne do odszyfrowania jego skryptu, więc oto moje ze zaktualizowanym drzewem.

zrzut ekranu


W każdym razie rozwiązania zaproponowane w celu pokonania limitu 100 znaków nie działały dla mnie, dlatego zdecydowałem się na edycję inspect.jsze źródła, wykonując następujące kroki:

  1. Pobierz konfigurator chrome-pak i rozpakuj go.
  2. Z C:\Program Files (x86)\Google\Chrome\Application\75.0.3770.100(gdzie 75.0.3770.100jest nazwa kompilacji) wykonaj kopię resources.pakw folderze Dokumenty, przeciągnij kopię i upuść ją unpack.batw rozpakowanym folderze.
  3. W \document\resources_unpaked\podjąć 11208.jsi otwórz go.
  4. Na linii 537 lub szukając 100znajdują się te linie
  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. Zapisz plik i w tym samym folderze przeciągnij pak_index.inii upuść go na pak.bat. teraz resource.pakw \documents\został zaktualizowany o zmiany.
  2. Utwórz kopię zapasową, resource.pakponieważ nigdy nie wiadomo, zamknij Chrome i zastąp wersję oryginalną zaktualizowaną wersją.

Teraz skrypt wyświetli do 300 znaków dla adresów URL.

Priorincantatio
źródło
0

W tab_state0systemie Windows, aby wyodrębnić z archiwum TitaniumBackup (działającego na zrootowanych telefonach)

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

Aby uzyskać listę kart z tab_state0

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

W systemie Windows zainstalowałbym wtedy https://scoop.sh/scoop install busybox 7zip

raisercostin
źródło
-1

Nie jest to odpowiedź, której szukasz, ale:

  1. Utwórz konto zastępcze w Google

  2. Zaloguj się na urządzeniu z Androidem i włącz synchronizację

  3. Zaloguj się na pulpicie i włącz synchronizację

  4. Zainstaluj rozszerzenie Session Buddy na pulpicie

  5. Eksportuj zakładki

latigidigital
źródło
5
Jak OP stwierdził w swoim pytaniu: funkcja synchronizacji Chrome nie wyświetla wszystkich kart otwartych na moim telefonie z Androidem. - jak to powinno pomóc? Sugerowane rozwiązanie eksportuje się po niekompletnej synchronizacji , więc nie wyeksportuje wszystkich kart zgodnie z żądaniem PO.
Izzy