Chrome浏览器的同步功能无法使用Android手机上打开的所有标签。
选项卡是否存储在我可以访问的文件中?
我的目的是导出选项卡列表,以便可以在设备上进行出厂重置。
运行Android 4.3
Chrome浏览器的同步功能无法使用Android手机上打开的所有标签。
选项卡是否存储在我可以访问的文件中?
我的目的是导出选项卡列表,以便可以在设备上进行出厂重置。
运行Android 4.3
Answers:
您可以使用Chrome调试器中的“远程设备”功能连接到设备上的Chrome并访问标签。只需展开可见的选项卡列表即可获取完整列表,然后突出显示所有内容(包括URL)并将其复制到剪贴板:https : //developers.google.com/web/tools/chrome-devtools/remote-debugging/
我只是设法以这种方式导出了约400个标签。
刚刚加入此StackExchange,以表示对Jeremy上面回答的一些赞赏,并添加了我用于导出选项卡列表的几行JS(因为用光标复制并不理想!)
正如杰里米说,选择Remote devices
下More tools
在Chrome devtools ⋮
图标(面板的右上):
Settings
⇒ 下Developer options
,不需要root)
Developer options
菜单,默认情况下该菜单处于隐藏状态以保护用户Settings
⇒ 下的内部版本号About Device
现在设备已连接,
Remote devices
了该视图,以便能够使用JavaScript检索选项卡列表
Ctrl
+ Shift
+ J
(WINDOWS)将会关闭第一个devtools面板。/deep/
是输入#shadow-root
DOM元素的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)
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}))
现在可以使用
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元素的属性。不确定原因,但是嘿,不受支持
当我想恢复在一天的浏览器崩溃后永久关闭的标签时,我遇到了此解决方案。为了访问所需的信息,您的设备需要被植根,以便您可以运行文件浏览器应用程序,并且可以访问设备上安装的根文件。我建议使用ES File Explorer或Root Explorer。
导航到设备的根文件夹(受保护的系统分区)→选择DATA
→选择com.android.chrome
。
您可以在几个地方找到有关当前选项卡的信息。
app_tabs
,然后0
。在此文件夹中,应该有一个名为的文件tab_state
,其中包含所有当前选项卡的列表。tab3
,tab4
包含关于当前选项卡的信息,等等。下一个要看的地方是/data/com.android.chrome/app_chrome/Default/
。在此文件夹中,您将找到一个名为的文件History
。根据您的情况,您可能会在这里找到最近的站点访问列表。
最后,浏览至Sync Data folder
。在这里,您会找到正在同步到Google的信息(其中应包括您当前已在其他设备上同步的所有标签)。
SyncData.sqlite3
,您还将找到所有Google搜索的历史记录(有时我会发现这很有趣)。.CSV
或者.XLS
可以在MS Excel中打开的文件。这对我假设的人可能会有帮助。
如果您在开发机器上安装了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的其他端点。)
此解决方法将为您提供一个文本文件,其中包含您在Android版Chrome浏览器中打开的所有标签的单独网址。
在本提到答案由迈克尔,你必须抓住包含当前选项卡中的文件。在设备上使用root资源管理器,获取此文件并将其移动到Windows中您选择的文件夹中:/data/data/com.android.chrome/app_tabs/0/tab_state
有时,文件中有一个奇怪的箭头字符会破坏脚本。如果您运行脚本并将其截断文件的一部分,请查看最后一个字符,它可能是那个奇怪的箭头字符。在原始文件中查找/替换它。一旦它消失了,脚本将运行良好。看起来像这样:-->
转到命令行提示符(转到“运行”或Win+ R,然后键入cmd
)并导航到包含的文件夹sed.exe
(无论您在第2步中将其安装在哪里)。
您可能需要将原始文件(tab_state
)移动到包含的相同文件夹中sed.exe
。这将使一切变得容易。完成此操作后,运行以下脚本:
sed -i "s/.\{6\}http/\r\n\r\nhttp/g" tab_state
这将修改所有URL格式正确的文件。打开该文件作为文本文件,然后将内容复制并粘贴到Word文档或其他某个位置。出于某种原因,如果您不复制并粘贴数据,则在保存文件时,它会删除所有换行符/回车符。如果事情变糟了,那就重新开始再做一次。说完这些之后,您应该有一个文件,其中包含到您之前打开的所有选项卡的链接列表。
您可以用此代码替换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
关闭当前标签。这就是我手动完成的方式,可以随意提出对此代码的更改,以使每个人的生活更轻松。
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
您需要是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
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
按照以下步骤从源代码进行编辑:
C:\Program Files (x86)\Google\Chrome\Application\75.0.3770.100
(在75.0.3770.100
此版本的名称中),resources.pak
在Documents文件夹中创建的副本,将其拖放unpack.bat
到未压缩的文件夹中。\document\resources_unpaked\
采取11208.js
并打开它。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
in \documents\
已更新更改。resource.pak
因为您永远不知道,请关闭Chrome并将原始版本替换为更新版本。现在,脚本将显示最多300个字符的URL。
在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