Chromeの同期機能では、Android搭載端末で開いているすべてのタブが選択されません。
タブはアクセス可能なファイルに保存されていますか?
デバイスのファクトリリセットを実行できるように、タブのリストをエクスポートするつもりです。
Android 4.3を実行する
Chromeの同期機能では、Android搭載端末で開いているすべてのタブが選択されません。
タブはアクセス可能なファイルに保存されていますか?
デバイスのファクトリリセットを実行できるように、タブのリストをエクスポートするつもりです。
Android 4.3を実行する
回答:
Chromeデバッガーのリモートデバイス機能を使用して、デバイス上のChromeに接続し、タブにアクセスできます。表示されているタブのリストを展開して完全なリストを取得し、表示されているすべて(URLを含む)をハイライトしてクリップボードにコピーします:https : //developers.google.com/web/tools/chrome-devtools/remote-debugging/
この方法で400個のタブをエクスポートできました。
このStackExchangeに参加して、上記のJeremyの回答に感謝し、タブリストのエクスポートに使用したJSの数行を追加しました(カーソルでコピーするのは理想的ではないからです!)
Jeremyが言ったように、Chrome開発ツールアイコン(パネルの右上)でRemote devices
以下More tools
を選択します⋮
。
Settings
⇒の下でDeveloper options
、ルートは不要です)
Developer options
メニューを有効にする必要があり、ユーザーを保護するためにデフォルトで非表示になっていることに注意してくださいSettings
⇒の下のビルド番号を複数回タップする必要がありましたAbout Device
これでデバイスが接続され、
Remote devices
JavaScriptを使用してタブのリストを取得できるように選択したdevtoolsビューで2番目のdevtoolsビューを開きます
Ctrl
+ Shift
+ J
(WINDOWS)が閉じます最初のdevtoolsパネル。/deep/
は#shadow-root
DOM要素を入力するCSSセレクターですChrome for Androidで開いているすべてのURLのリストをエクスポートするには、リストをマークダウン形式のテキスト文字列にして、クリップボードにコピーすることを選択しました
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
代わりにホスト要素のプロパティを使用する必要がありました。ちょっと、サポートされていない。
ある日ブラウザがクラッシュした後に完全に閉じられていたタブを回復しようとしていたときに、このソリューションに出会いました。必要な情報にアクセスするには、デバイスにインストールされているルートファイルにアクセスしてファイルエクスプローラーアプリを実行できるよう、デバイスをルート化する必要があります。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
ファイルにエクスポートできる必要があります。これは、私が推測する誰かに役立つかもしれません。
あなたが持っている場合は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
。
(APIの他のエンドポイントはhttps://github.com/buggerjs/bugger-daemon/blob/master/README.md#apiで見つけることができます。)
参照してくださいここで USBデバッグを有効化、およびの詳細についてはこちらを、それがどのように動作するかの概要について。
この回避策により、Chrome for Androidで開いたすべてのタブの個別のURLを含むテキストファイルが提供されます。
Michaelによるこの回答で述べたように、現在のタブを含むファイルを取得する必要があります。デバイスのルートエクスプローラーを使用して、このファイルを取得し、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文書またはその他の場所に貼り付けます。何らかの理由で、データをコピーして貼り付けない場合、ファイルを保存するときにすべての改行/復帰が消去されます。うまくいかない場合は、最初からやり直してください。すべてが完了したら、前に開いていたすべてのタブへのリンクのリストを含むファイルが必要です。
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個のタブを開いていました)。
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ファイルを識別しましたが、それをデコードするために残っています。次のスクリプトは私のために働いていました(kitkat KSH_VERSION = '@(#)MIRBSD KSH R43 2013/02/19'またはxenial BASH_VERSION = '4.3.46(1)-release'でChrome 49.0.2623.105のtab_stateファイルで)、最後のURLを最初に印刷し、印刷不可能なバイトと後続のすべてのバイトを削除し、必要に応じて少なくとも2バイトを削除します。各URLに続いてスペースを印刷し、削除された連続印刷可能バイト(ある場合)、カンマ、削除された他のバイト数(括弧内の&saidバイト)を印刷します。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
、あなたのドキュメントフォルダを、ドラッグ&コピーして上にドロップし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
では\documents\
変更で更新されました。resource.pak
知らないのでバックアップを作成し、Chromeを閉じて元のバージョンを更新したバージョンに置き換えます。これで、スクリプトはURLに対して最大300文字を表示します。
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
窓に私はインストールしますhttps://scoop.sh/その後、scoop install busybox 7zip
これはあなたが探している答えではありませんが、:
Googleでダミーアカウントを作成する
Androidデバイスにログインし、同期を有効にします
デスクトップにログインして同期を有効にする
Session Buddy拡張機能をデスクトップにインストールする
エクスポートタブ