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

这些标签是否存储在我可以访问的文件中?导出选项卡列表,以便我可以在设备上运行出厂重置。

运行Android 4.3

评论

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

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

#1 楼

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

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

评论


想提一下,如果chrome调试器列表过长,它们会缩短网址,因此您可以直接使用路易斯·马多克斯(Louis Maddox)答案中的方法来获取网址,而无需复制粘贴内容

– woojoo666
18-09-18在3:29

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

–peterflynn
18-09-25在7:05

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

– woojoo666
18-09-26在9:30



为此,最低要求的Android版本是什么?

–neverMind9
18/12/22在13:01

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

–neverMind9
19年6月1日在22:11

#2 楼

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

作为Jeremy说,请在Chrome devtools Remote devices图标(面板右上方)上的More tools下选择: ⇒Settings,不需要root)


请注意,您必须启用Developer options菜单,默认情况下它是隐藏的,以保护用户在我的手机上
,这需要在构建中多次点击完成以下操作后,请在Developer optionsSettings下输入编号




打开Chrome devtools远程设备面板后,请插入USB并允许MTP连接
然后将请求允许USB调试


您可以选择始终信任计算机





现在已连接设备,


op zh_cn在devtools视图上的第二个devtools视图,从中选择About Device以便能够使用JavaScript检索选项卡列表。面板右上角的垂直省略号符号)即可进行设置,否则Command + Option + J(MAC)Remote devices + Ctrl + Shift(WINDOWS)将仅关闭第一个devtools面板。


通过单击“显示更多”,将列表从前几个项目扩展到所有选项卡。
使用以下几行代码[在第二个devtools控制台中输入window]



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



let bookmarkList = Array.from(document.querySelectorAll('.widget>.vbox'))
  .map(e => e.shadowRoot)
  .map(e => e && e.querySelector('.device-page-list'))
  .find(e => e);

let bookmarks = Array.from(bookmarkList.querySelectorAll('.vbox'))
  .map(e => `[${e.querySelector('.device-page-title').innerHTML}](${e.querySelector('x-link').innerHTML})`);

copy(bookmarks.join('\n'));


然后您的剪贴板上将显示一个列表,如下所示:

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


评论


Chrome已更改,制表符= Array.from(document.querySelectorAll('div / deep / div / deep / div / deep / div / deep / div / deep / .device-page-list .vbox'),s =>({名称:s.querySelector('。device-page-title')。textContent,网址:s.querySelector('。devtools-link')._ href}))现在可以使用

– dlamotte
18年6月13日在3:15

它又变了。对于Chrome版本“ 73.0.3683.75(正式版本)(64位)”:选项卡= 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属性代替。不确定为什么,但是不支持。

–阿德里安
19 Mar 25 '19在21:57

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

– JZL003
19年6月7日在15:32

从Chrome 81开始,可以从chrome:// inspect /#devices而不是在Dev Tools中访问“远程设备”。这使它变得容易一些,无需打开Dev-Tools-on-Dev-Tools。

– Ben J
5月15日4:57



要获取完整的名称/ URL,而不是被截断为100个字符(如@priorincantatio的回答):在该“远程设备”页面上打开“开发工具”,然后在浏览器中编辑“ inspect.js”源文件以删除截断代码(当前为文本) = text.substring(0,100)+'\ u2026';),将其保存,然后[重新]连接设备以[重新]加载URL。然后使用最新的有效代码段将URL列表复制到剪贴板(当前位于上面的要点中)。

– Ben J
5月15日5:35



#3 楼

tl; dr:

在开发计算机上安装了Android chrome命令行工具,并在设备上启用了USB调试功能。该设备不需要植根
adb forward tcp:9222 localabstract:chrome_devtools_remote
wget -O tabs.json http://localhost:9222/json/list

详细信息:
如果您在开发计算机上安装了Android命令行工具,并且已启用USB在Android设备上进行调试,然后可以执行以下操作:


在开发计算机上执行adb forward tcp:9222 localabstract:chrome_devtools_remote
Chrome实例通过带有UNIX域套接字的调试协议公开访问调试协议抽象地址“ chrome_devtools_remote”。上面的adb命令将对开发计算机上的端口9222的请求转发到该Unix域套接字。 (您可以通过键入adb shell cat /proc/net/unix来获取Android设备上所有unix域套接字的列表。)
使用此功能,我们可以运行wgetcurl(或者实际上是浏览器),并从移动设备的chrome实例中检索信息。


调试信息通过HTTP作为JSON数据提供。可以通过执行wget -O tabs.json http://localhost:9222/json/list获得列出打开的选项卡的JSON文件。
(API的其他终结点可以在https://github.com/buggerjs/bugger-daemon/blob/master/README.md#中找到。 api。)


有关启用USB调试的更多详细信息,请参见此处,并概述其工作原理。

评论


wget -O--q https://git.io/Jvfzk |重击

–网站
1月12日在2:30



+1,因为我发现此答案比执行JavaScript代码来检索列表的技巧更有用。

– Zskdan
8月28日23:23

#4 楼

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


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

您可以在几个地方找到有关当前标签的信息。


要检查的第一个文件夹是app_tabs,然后是0。在此文件夹中,应该有一个名为tab_state的文件,其中包含所有当前选项卡的列表。
此文件夹中还有其他文件,名为tab3tab4等,其中包含有关当前选项卡的信息。
IMO,您需要特殊的“文本编辑器/ sql编辑器”来读取其中一些内容这些文件由于编码方式不同。


下一个要看的地方是/data/com.android.chrome/app_chrome/Default/。在此文件夹中,您将找到一个名为History的文件。根据您的情况,您可能会在这里找到最近的站点访问列表。

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


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



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

评论


关于tab_state0的“特殊文本编辑器”:字符串tab_state0 | grep -oh“ http。* $”应该可以为您提供URL列表。我还用过如何在手机变砖后从备份数据中恢复打开的歌剧标签?

–lucidbrot
6月16日18:30



#5 楼

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: />

下载chrome-pak-customizer并将其解压缩。
C:\Program Files (x86)\Google\Chrome\Application.0.3770.100(其中75.0.3770.100是内部版本的名称)中,复制resources.pak到“文档”文件夹中,然后将将其复制并放到解压后的文件夹中的unpack.bat上。
\document\resources_unpaked\中,取下11208.js并将其打开。
在第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.



保存文件,然后将pak_index.ini拖放到同一文件夹中。现在,pak.bat中的resource.pak已进行了更改。
请备份\documents\,因为您永远不知道,请关闭Chrome并将原始版本替换为更新的版本。网址最多300个字符。

评论


非常好!您如何发现应该编辑的文件11208.js?我正在使用其他版本的chrome,但没有此文件...

– juanora
4月14日14:41

我想出了一种简单的方法:直接在chrome上编辑inspect.js。

– juanora
4月14日14:55

@juanora:您如何设法直接从chrome编辑它?顺便说一句,我不记得了,但我想我已经设置了文件研究功能以在文件内查找“ 100”,这时应该弹出几个文件

–priorincantatio
4月17日10:28



谢谢你的回答。我尝试搜索100,子字符串等...没有成功...请检查以查看如何直接更改它:stackoverflow.com/a/5506786/3375218

– juanora
4月18日18:41

谢谢!好的,很抱歉,我不知道我在想什么:查找此“ \ u2026”

–priorincantatio
4月19日19:15



#6 楼

此变通办法将为您提供一个文本文件,其中包含您在Android版Chrome浏览器中打开的所有标签的单独网址。当前标签。在设备上使用root资源管理器,抓取该文件并将其移动到Windows中您选择的文件夹中:/data/data/com.android.chrome/app_tabs/0/tab_state
为Windows安装GNU工具
有时文件中有一个奇怪的箭头字符,将脚本。如果您运行脚本并将其截断文件的一部分,请查看最后一个字符,它可能是那个奇怪的箭头字符。在原始文件中查找/替换它。一旦消失,脚本将正常运行。看起来像这样:-->
转到命令行提示符(转到“运行”或Win + R,然后键入cmd)并导航到包含sed.exe的文件夹(无论您在第2步中将其安装在哪里)。 />
您可能希望将原始文件(tab_state)移至包含sed.exe的同一文件夹。它将使一切变得容易。完成此操作后,运行以下脚本:

sed -i "s/.\{6\}http/\r\n\r\nhttp/g" tab_state


这将修改文件,并正确设置所有URL的格式。打开该文件作为文本文件,然后将内容复制并粘贴到Word文档或其他某个位置。出于某种原因,如果您不复制和粘贴数据,则在保存文件时,它会删除所有换行符/回车符。如果事情变糟了,那就重新开始再做一次。说完之后,您应该有一个文件,其中包含到您之前打开过的所有选项卡的链接列表。


#7 楼

说明勇敢!您可以用此代码替换Louis Maddox控制台中的代码,直到今天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可以将其关闭标签。这就是我手动完成的方式,可以随意提出对此代码的更改,以使每个人的生活更轻松。

#8 楼

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


#9 楼

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

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


#10 楼

在Windows中,从TitaniumBackup存档中提取tab_state0(可在有根电话下使用)

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