Как я могу экспортировать список открытых вкладок Chrome?

44

Функция синхронизации в Chrome не отображает все вкладки, открытые на моем телефоне Android.

Хранятся ли вкладки в файле, к которому я могу получить доступ?

Мое намерение состоит в том, чтобы экспортировать список вкладок, чтобы я мог выполнить сброс к заводским настройкам на устройстве.

Работает Android 4.3

Majjo
источник
Я хотел бы, чтобы было дополнение для этой цели.
neverMind9
Там должен быть автономный безродный способ сделать это. Потому что загрузчик вайпы. Тот, кто изобрел загрузчик, стер головную боль, должен быть немедленно запущен. Загрузчик - ловушка. Разблокировка вынуждает уничтожить все данные, и некоторые части не могут быть сохранены без первоначальной разблокировки. Порочный круг. И еще есть шифрование и головная боль ARM TrustZone.
neverMind9

Ответы:

35

Вы можете использовать функцию «Удаленные устройства» в отладчике Chrome для подключения к Chrome на устройстве и доступа к вкладкам. Просто разверните список видимых вкладок, чтобы получить полный список, а затем выделите и скопируйте все отображаемое (включая URL) в буфер обмена: https://developers.google.com/web/tools/chrome-devtools/remote-debugging/

Мне просто удалось экспортировать ~ 400 вкладок таким образом.

Джереми Тейлор
источник
3
Я хотел бы упомянуть, что список отладчиков Chrome сократит URL-адреса, если они слишком длинные, поэтому вместо вставки копий вы можете получить URL-адреса напрямую, используя метод из ответа Луиса Мэддокса
woojoo666
@ woojoo666: Похоже, что вещи в Chrome изменились, и теперь ответ Луи также обрезает конец многих URL. Похоже, что любой URL длиной более 100 символов - что в моем случае составляет около 50% всех моих открытых вкладок - будет пропускать его окончание.
peterflynn
@peterflynn все еще работает для меня. Просто экспортировал URL длиной 432 символа. Просто чтобы убедиться, что вы открываете инструменты dev во всплывающем окне, переходите на панель «удаленные устройства», затем используете ctrl-shift-J, чтобы открыть второе окно dev-tools, а затем используете предоставленный скрипт здесь , правильно?
woojoo666
Какая минимальная требуемая версия Android для этого?
neverMind9
Я хотел бы, чтобы был автономный способ сделать это. Не полагаясь на внешние методы. Я знаю, что есть список вкладок Root, но мой мобильный телефон не рутирован, потому что люди говорят, что есть риск некоторой неисправности.
neverMind9
25

Просто присоединился к этому StackExchange, чтобы выразить признательность за ответ Джереми выше, а также добавить несколько строк JS, которые я использовал для экспорта списка вкладок (поскольку копирование с помощью курсора не является идеальным!)

По словам Джереми, выберите Remote devicesпод More toolsна Chrome DevTools значок (справа вверху панели):

  • настроить отладку USB на вашем телефоне (под SettingsDeveloper options, рут не требуется)
    • обратите внимание, что вы должны включить Developer optionsменю, оно скрыто по умолчанию для защиты пользователей
    • на моем телефоне это требовало многократного нажатия на номер сборки под SettingsAbout Device
  • как только это будет сделано, подключите USB и разрешите соединение MTP
  • когда панель удаленного устройства Chrome devtools открыта, телефон запросит разрешение отладки по USB
    • Вы можете всегда доверять компьютеру

Теперь устройство подключено,

  • откройте второе представление devtools в представлении devtools, из которого вы выбрали, Remote devicesчтобы иметь возможность получать список вкладок с помощью JavaScript
    • обратите внимание, что вы должны иметь devtools в режиме всплывающего окна (используйте вертикальный символ многоточия в правом верхнем углу панели), чтобы это можно было поднять, в противном случае Command + Option + J (MAC) Ctrl+ Shift+ J(WINDOWS) просто закроются. первая панель devtools.
  • разверните список от первых нескольких элементов до всех вкладок, нажав «Показать больше»
  • чтобы написать скрипт для списка, используйте следующие несколько строк кода [введено в консоли 2-го окна devtools]
    • NB /deep/- это селектор CSS для ввода #shadow-rootэлементов DOM

Чтобы экспортировать список всех URL-адресов, открытых в Chrome для Android, я решил просто превратить этот список в текстовую строку с форматом уценки и скопировать его в буфер обмена.

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)

После этого в буфере обмена появится список, похожий на этот:

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

Обновить

По какой - то причине , я получаю сообщение об ошибке некоторое время , заявив , что не удалось получить hrefатрибут nullэлемента (когда я проверить его это невидимый узел, кто знает). Чтобы обойти это, используйте эту версию вместо:

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
Хром поменялся, 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}))теперь будет работать
dlamotte
Обратите внимание, что при использовании этого метода окончание любого URL длиной более 100 символов будет обрезано.
peterflynn
@peterflynn все еще работает для меня. Я только что экспортировал URL, который был 432 символов. Убедитесь, что вы используете скрипт, предоставленный
diamotte
1
Это снова изменилось. Для Chrome версии "73.0.3683.75 (Официальная сборка) (64-разрядная версия)": 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')}))(Я не мог получить доступ к последнему корню теней с помощью селектора, но .shadowRootвместо этого мне пришлось использовать свойство его основного элемента. Не совсем понятно, почему, но эй, без поддержки
Адриан
1
На всякий случай, если у кого-то еще возникли проблемы, у меня возникли проблемы с запуском некоторых из этих сценариев (он стучал в стек USB ядра со 100% -ным использованием в течение более 10 минут, прежде чем я остановил его). Лучший способ, который я нашел, - это выбрать родительский HTML-элемент в инспекторе инструментов разработчика Chrome (используйте кнопку курсора в левом верхнем углу окна вложенных инструментов разработчика, чтобы выбрать случайный элемент в списке, а затем выберите родительский элемент), а затем щелкните правой кнопкой мыши -> «Редактировать как HTML» -> скопировать в другой текстовый файл. Тогда было проще и намного быстрее адаптировать вышеуказанные сценарии для работы с этой локальной копией HTML (или BASH)
JZL003
13

Я столкнулся с этим решением, когда искал восстановление вкладок, которые были навсегда закрыты после сбоя моего браузера. Чтобы получить доступ к необходимой информации, ваше устройство должно быть рутировано, чтобы вы могли запустить приложение проводника файлов с доступом к корневым файлам, установленным на вашем устройстве. ES File Explorer или Root Explorer - мои рекомендации.

  1. Перейдите в корневую папку вашего устройства (защищенный системный раздел) → выберите DATA→ выберите com.android.chrome.

  2. Есть несколько мест, где вы можете найти информацию о ваших текущих вкладках.

    1. Первая папка для проверки app_tabs, затем 0. В этой папке должен быть файл с именем, tab_stateкоторый содержит список всех ваших текущих вкладок.
    2. Есть также другие файлы в этой папке называется tab3, tab4и т.д. , которые содержат информацию о текущих вкладках.
    3. IMO, вам нужен специальный «текстовый редактор / редактор SQL», чтобы прочитать содержимое некоторых из этих файлов, так как кодировка отличается.
  3. Следующее место, чтобы посмотреть /data/com.android.chrome/app_chrome/Default/. В этой папке вы найдете файл с именем History. В зависимости от вашей ситуации, вы можете найти хороший список последних посещений сайта здесь.

  4. Наконец, перейдите к Sync Data folder. Здесь вы найдете информацию, которая синхронизируется с Google (и она должна включать все вкладки, которые вы синхронизировали в настоящее время на других устройствах).

    • В этом файле SyncData.sqlite3вы также найдете историю всех ваших поисков в Google (которые я иногда нахожу интересным чтением).
    • Вам потребуется браузер данных sqlite3 программа на вашем компьютере, чтобы прочитать этот файл. Приложение должно быть в состоянии экспортировать в очень удобный .CSVили .XLSфайл, который вы можете открыть в MS Excel .

Это может быть полезно для кого-то, кого я предполагаю.

Майкл
источник
5

Если на компьютере разработчика установлены средства командной строки Android и на вашем Android-устройстве включена отладка по USB, вы можете сделать следующее:

  • Выполните adb forward tcp:9222 localabstract:chrome_devtools_remoteна своей машине разработки.

    Экземпляры Chrome предоставляют доступ к протоколу отладки через сокет домена unix с абстрактным адресом " chrome_devtools_remote" - приведенная выше команда adb перенаправляет запросы на порт 9222 на этот сокет. (Вы можете получить список всех сокетов домена unix на устройстве Android, набрав adb shell cat /proc/net/unix.)

  • Протокол отладки предоставляет данные JSON об экземпляре Chrome через HTTP. Файл JSON со списком открытых вкладок можно получить, выполнив wget -O tabs.json http://localhost:9222/json/list.

    (Другие конечные точки API можно найти по адресу https://github.com/buggerjs/bugger-daemon/blob/master/README.md#api .)

Смотрите здесь для получения более подробной информации о включении отладки USB, и здесь для обзора того, как это работает

phlummox
источник
2

Этот обходной путь даст вам текстовый файл с отдельными URL-адресами для всех вкладок, открытых в Chrome для Android.

  1. Как уже упоминалось в этом ответе по Майкл , вы должны захватить файл, содержащий текущие вкладки. С помощью корневого обозревателя на устройстве, захватите этот файл и переместите его в папку по вашему выбору в Windows:/data/data/com.android.chrome/app_tabs/0/tab_state

  2. Установите GNU Tools для Windows

  3. Иногда в файле есть странный символ стрелки, который портит скрипт. Если вы запустите скрипт, и он усекает часть файла, посмотрите на последний символ, и он, вероятно, будет тем странным символом стрелки. Найти / заменить его в исходном файле. Как только он исчезнет, ​​скрипт будет работать нормально. Это выглядит так:-->

  4. Перейдите в командную строку (перейдите к «Выполнить» или Win+ Rи введите cmd) и перейдите к папке, в которой содержится sed.exe(где бы вы ни установили его на шаге 2.)

  5. Возможно, вы захотите переместить исходный файл ( tab_state) в ту же папку, содержащую sed.exe. Это сделает все проще. Как только вы это сделаете, запустите этот скрипт:

    sed -i "s/.\{6\}http/\r\n\r\nhttp/g" tab_state
    
  6. Это изменит файл со всеми URL, отформатированными правильно. Откройте файл в виде текстового файла, а затем скопируйте и вставьте содержимое в документ Word или в другое место. По какой-то причине, если вы не копируете и не вставляете данные, при сохранении файла удаляются все разрывы строк / возврат каретки. Если что-то испортилось, просто начните сначала и сделайте это снова. Когда все это сказано и сделано, у вас должен быть файл, содержащий список ссылок на все вкладки, которые вы открывали ранее.

Даррен
источник
2

Инструкция для Храбрых! Вы можете заменить код в консоли Луи Мэддокса на этот, он работает на сегодняшний день Brave Version 1.0.0 Chromium: 78.0.3904.97 (Official Build) (64-bit). Примечание. Вы можете открыть новое окно консоли окна удаленных устройств, если активировать окно удаленного устройства и нажатьCtrl+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)

Затем вы можете вставить все свои вкладки в текстовый файл.

Если вы хотите открыть все вкладки на вашем устройстве, замените tabs.forEach-part на

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

Не пытайтесь делать это с большим количеством открытых вкладок на вашем устройстве.

Я добавил это после tabsчасти, чтобы вручную синхронизировать открытые вкладки (храбрый все еще отсутствует эта функция, и у меня было 650 открытых вкладок на моем мобильном устройстве) за плату в 50 вкладок:

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

Это откроет пакет из 50 вкладок с вашего устройства в открывшемся окне браузера. Он также показывает общее количество вкладок. Не закрывайте оставшуюся «пустую» вкладку для этих инструментов разработчика и удаленного устройства, если вы хотите открыть другой пакет. При этом Ctrl + TABвы переключаетесь между вкладками, Ctrl +Dчтобы добавить их в закладки и Ctrl+Wзакрыть активную вкладку. Именно так я и сделал это вручную, не стесняйтесь вносить изменения в этот код, чтобы облегчить жизнь всем.

simonsan
источник
1

Майкл идентифицировал файл tab_state, осталось его декодировать. Следующий скрипт работал для меня (в kitkat KSH_VERSION = '@ (#) MIRBSD KSH R43 2013/02/19' или xenial BASH_VERSION = '4.3.46 (1) -release' в файле tab_state из Chrome 49.0.2623.105), сначала он печатает последний URL, между URL-адресами он удаляет непечатаемый байт и все последующие байты, а также больше, если необходимо, поэтому удаляются как минимум 2 байта. После каждого URL-адреса печатается пробел, затем удаляются непрерывные печатаемые байты, если таковые имеются, затем запятая, а затем количество удаляемых других байтов (& указанные байты в скобках). Чтобы напечатать URL-адреса, используйте вместо этого только комментированную команду 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
источник
1

Вы должны быть пользователем root или Chrome, чтобы читать /data/data/com.android.chrome/app_tabs/0/tab_state0

Вы можете использовать этот грязный эксплойт на уязвимых устройствах, чтобы стать Chrome и получить tab_state0от подключенного устройства:

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

Получив доступ tab_state0, извлеките URL-адреса:

LC_ALL=C grep -a -o 'http[[:print:]]*' tab_state0
tekumara
источник
1

В Windows, чтобы извлечь tab_state0из архива TitaniumBackup (который работает на рутированных телефонах)

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

Чтобы получить список вкладок от tab_state0

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

На Windows я бы установить https://scoop.sh/ тогдаscoop install busybox 7zip

raisercostin
источник
1

Самый последний ответ от simonsan не работает над моей текущей сборкой Chrome 75.0.3770.100. У меня нет vboxкласса, который используется в каждом опубликованном скрипте, поэтому мне удалось написать код, который работает сейчас:

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

Я нашел пост Луи Мэддокса и скриншоты очень полезными для расшифровки его сценария, так что вот мой с обновленным деревом.

Скриншот


В любом случае решения, предложенные для преодоления ограничения в 100 символов, у меня не сработали, поэтому я решил отредактировать inspect.jsисходный код, выполнив следующие действия:

  1. Загрузите chrome-pak-customizer и распакуйте его.
  2. Из C:\Program Files (x86)\Google\Chrome\Application\75.0.3770.100(где 75.0.3770.100имя сборки) сделайте копию resources.pakв папке «Документы», перетащите копию и поместите ее unpack.batв распакованную папку.
  3. В \document\resources_unpaked\взять 11208.jsи открыть его.
  4. На линии 537 или в поисках 100есть эти строки
  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. Сохраните файл и в той же папке перетащите pak_index.iniего на pak.bat. Теперь resource.pakв \documents\обновлен с изменениями.
  2. Сделайте резервную копию, resource.pakпотому что вы никогда не знаете, закройте Chrome и замените оригинал обновленной версией.

Теперь скрипт покажет до 300 символов для URL.

priorincantatio
источник