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


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.


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 Settings⇒ Developer 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 Settings⇒About 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)

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.


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 adresem „ chrome_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.


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.


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.


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

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

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.


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


-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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.