如何导出打开的Chrome标签页列表?


44

Chrome浏览器的同步功能无法使用Android手机上打开的所有标签。

选项卡是否存储在我可以访问的文件中?

我的目的是导出选项卡列表,以便可以在设备上进行出厂重置。

运行Android 4.3


我希望有一个用于此目的的附件。
neverMind9 '18

应该有一种独立的无根方式来做到这一点。因为bootloader擦了。谁发明了引导程序擦拭头疼的人,应立即开除。引导加载程序是一个陷阱。解锁它会迫使人们抹去整个数据,并且某些部分如果不首先解锁就无法备份。恶性循环。然后还有加密和ARM TrustZone的麻烦。
neverMind9

Answers:


35

您可以使用Chrome调试器中的“远程设备”功能连接到设备上的Chrome并访问标签。只需展开可见的选项卡列表即可获取完整列表,然后突出显示所有内容(包括URL)并将其复制到剪贴板:https : //developers.google.com/web/tools/chrome-devtools/remote-debugging/

我只是设法以这种方式导出了约400个标签。


3
想提一下,如果chrome调试器列表太长,它们会缩短网址,因此,您可以直接使用路易斯·马多克斯(Louis Maddox)的答案中
woojoo666

@ woojoo666:Chrome中的内容似乎已发生变化,现在Louis的答案也缩短了许多URL的结尾。看起来任何超过100个字符的URL(在我的情况下,大约占所有打开的标签的50%)将丢失其结尾。
peterflynn

@peterflynn仍然为我工作。刚刚导出的URL长432个字符。只是要确保,您要在弹出窗口中打开开发工具,转到“远程设备”窗格,然后使用ctrl-shift-J打开第二个开发工具窗口,然后使用提供的脚本在这里,对吗?
woojoo666

为此,最低要求的Android版本是什么?
neverMind9 '18 / 12/22

我希望有一个独立的方法可以做到这一点。无需依赖外部方法。我知道,这里有“根”标签列表,但是我的手机没有植根,因为人们说存在某些故障的风险。
neverMind9

25

刚刚加入此StackExchange,以表示对Jeremy上面回答的一些赞赏,并添加了我用于导出选项卡列表的几行JS(因为用光标复制并不理想!)

正如杰里米说,选择Remote devicesMore tools在Chrome devtools 图标(面板的右上):

  • 在手机上设置USB调试(在Settings⇒ 下Developer options,不需要root)
    • 请注意,您必须启用Developer options菜单,默认情况下该菜单处于隐藏状态以保护用户
    • 在我的手机上,这需要多次点击Settings⇒ 下的内部版本号About Device
  • 完成此操作后,插入USB并允许MTP连接
  • 打开Chrome devtools远程设备面板后,手机将要求允许USB调试
    • 您可以选择始终信任计算机

现在设备已连接,

  • 在devtools视图上打开第二个devtools视图,从中选择Remote devices了该视图,以便能够使用JavaScript检索选项卡列表
    • 请注意,您必须在弹出模式下使用devtools(使用面板右上角的垂直省略号)才能启动它,否则Command + Option + J(MAC)Ctrl+ Shift+ J(WINDOWS)将会关闭第一个devtools面板。
  • 通过单击“显示更多”,将列表从前几个项目扩展到所有标签
  • 要针对列表编写脚本,请使用以下几行代码[在第二个devtools窗口的控制台中输入]
    • NB /deep/是输入#shadow-rootDOM元素的CSS选择器

要导出在Android版Chrome上打开的所有URL的列表,我选择只是将列表制作成markdown格式的文本字符串,然后将其复制到剪贴板

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
Chrome已更改,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

请注意,使用此技术,任何长度超过100个字符的URL的结尾都将被截断。
peterflynn

@peterflynn仍然为我工作。我刚刚导出了432个字符的网址。确保您使用的是diamotte提供的脚本
woojoo666

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其host元素的属性。不确定原因,但是嘿,不受支持
Adrian

1
以防万一其他人遇到麻烦,我在运行其中一些脚本时遇到了问题(在停止它之前,超过10分钟,它以100%的使用率破坏了内核的USB堆栈)。我发现的最佳方法是在chrome开发工具检查器中选择父HTML元素(使用嵌套的开发工具窗口左上角的光标按钮在列表中选择一个随机项,然后选择父元素),然后右键单击->“编辑为HTML”->复制到另一个文本文件中。然后,将上述脚本修改为可在该本地HTML副本(或BASH)上使用变得更加容易和快捷
得多

13

当我想恢复在一天的浏览器崩溃后永久关闭的标签时,我遇到了此解决方案。为了访问所需的信息,您的设备需要被植根,以便您可以运行文件浏览器应用程序,并且可以访问设备上安装的根文件。我建议使用ES File ExplorerRoot Explorer

  1. 导航到设备的根文件夹(受保护的系统分区)→选择DATA→选择com.android.chrome

  2. 您可以在几个地方找到有关当前选项卡的信息。

    1. 第一个文件夹检查app_tabs,然后0。在此文件夹中,应该有一个名为的文件tab_state,其中包含所有当前选项卡的列表。
    2. 也有此文件夹中的其他文件称为tab3tab4包含关于当前选项卡的信息,等等。
    3. IMO,由于编码不同,因此需要特殊的“文本编辑器/ sql编辑器”来读取其中一些文件的内容。
  3. 下一个要看的地方是/data/com.android.chrome/app_chrome/Default/。在此文件夹中,您将找到一个名为的文件History。根据您的情况,您可能会在这里找到最近的站点访问列表。

  4. 最后,浏览至Sync Data folder。在这里,您会找到正在同步到Google的信息(其中应包括您当前已在其他设备上同步的所有标签)。

    • 在该文件中SyncData.sqlite3,您还将找到所有Google搜索的历史记录(有时我会发现这很有趣)。
    • 您需要在PC上使用Sqlite3数据浏览器程序才能读取此文件。该应用程序应该能够导出为高度可用的文件,.CSV或者.XLS可以在MS Excel中打开的文件。

这对我假设的人可能会有帮助。


5

如果您在开发机器上安装了Android命令行工具,并在Android设备上启用了USB调试,则可以执行以下操作:

  • adb forward tcp:9222 localabstract:chrome_devtools_remote在您的开发机器上执行。

    Chrome实例通过具有抽象地址chrome_devtools_remote” 的unix域套接字公开对调试协议的访问权限–上面的adb命令将请求转发到端口9222上的该套接字。(您可以通过输入来获取Android设备上所有unix域套接字的列表adb shell cat /proc/net/unix。)

  • 调试协议通过HTTP公开有关chrome实例的JSON数据。可以通过执行JSON列出打开的选项卡的文件wget -O tabs.json http://localhost:9222/json/list

    (可以在https://github.com/buggerjs/bugger-daemon/blob/master/README.md#api上找到API的其他端点。)

这里关于启用USB调试,和更多的细节在这里的它是如何工作的概述。


2

此解决方法将为您提供一个文本文件,其中包含您在Android版Chrome浏览器中打开的所有标签的单独网址。

  1. 在本提到答案迈克尔,你必须抓住包含当前选项卡中的文件。在设备上使用root资源管理器,获取此文件并将其移动到Windows中您选择的文件夹中:/data/data/com.android.chrome/app_tabs/0/tab_state

  2. 为Windows安装GNU工具

  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

您可以用此代码替换Louis Maddox控制台中的代码,该代码从今天开始有效Version 0.66.99 Chromium: 75.0.3770.100。备注:如果激活远程设备窗口并按,则可以打开远程设备窗口的新控制台窗口。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关闭当前标签。这就是我手动完成的方式,可以随意提出对此代码的更改,以使每个人的生活更轻松。


1

Michael识别了tab_state文件,但仍需对其进行解码。以下脚本为我工作(在Chrome 49.0.2623.105的tab_state文件中,为kitkat KSH_VERSION ='@(#)MIRBSD KSH R43 2013/02/19'或xenial BASH_VERSION ='4.3.46(1)-release'),它首先打印出最后一个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

1

您需要是root或Chrome才能阅读 /data/data/com.android.chrome/app_tabs/0/tab_state0

您可以在易受攻击的设备上使用此dirtycow漏洞,以使其成为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

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

我发现 Louis Maddox的帖子和屏幕截图对于解密他的脚本非常有用,因此这里是更新的树。

屏幕截图


无论如何,提出的克服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在Documents文件夹中创建的副本,将其拖放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.inipak.bat。现在resource.pakin \documents\已更新更改。
  2. 进行备份,resource.pak因为您永远不知道,请关闭Chrome并将原始版本替换为更新版本。

现在,脚本将显示最多300个字符的URL。


0

在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


-1

这不是您要寻找的答案,而是:

  1. 在Google上创建虚拟帐户

  2. 在Android设备上登录并启用同步

  3. 在桌面上登录并启用同步

  4. 在桌面上安装Session Buddy扩展

  5. 导出标签


5
就像OP在他的问题中所说的那样:Chrome的同步功能无法获取Android手机上打开的所有标签。–应该如何帮助?建议的解决方案在不完全同步后导出,因此不会按照OP的要求导出所有选项卡。
伊兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.