Chrome의 동기화 기능이 Android 휴대 전화에서 열려있는 모든 탭을 선택하지 않습니다.
탭은 내가 액세스 할 수있는 파일에 저장되어 있습니까?
내 의도는 장치에서 공장 초기화를 실행할 수 있도록 탭 목록을 내보내는 것입니다.
안드로이드 4.3 실행
Chrome의 동기화 기능이 Android 휴대 전화에서 열려있는 모든 탭을 선택하지 않습니다.
탭은 내가 액세스 할 수있는 파일에 저장되어 있습니까?
내 의도는 장치에서 공장 초기화를 실행할 수 있도록 탭 목록을 내보내는 것입니다.
안드로이드 4.3 실행
답변:
Chrome 디버거의 원격 장치 기능을 사용하여 장치의 Chrome에 연결하고 탭에 액세스 할 수 있습니다. 보이는 탭 목록을 확장하여 전체 목록을 가져온 다음 표시된 URL (URL 포함)을 모두 클립 보드에 강조 표시하고 복사 하십시오 . https://developers.google.com/web/tools/chrome-devtools/remote-debugging/
방금이 방법으로 ~ 400 개의 탭을 내보낼 수있었습니다.
이 StackExchange에 가입하여 위에 Jeremy의 답변에 대한 감사를 표시 하고 탭 목록을 내보내는 데 사용한 몇 줄의 JS를 추가하십시오 (커서로 복사하는 것이 이상적이지 않기 때문에)
Jeremy가 말했듯이 Chrome devtools 아이콘 (패널의 오른쪽 상단) 에서 Remote devices
아래 More tools
를 선택하십시오 ⋮
.
Settings
⇒ 아래 Developer options
, 루트 필요 없음)
Developer options
메뉴 를 활성화해야합니다. 기본적으로 사용자를 보호하기 위해 숨겨져 있습니다.Settings
⇒ 아래 빌드 번호를 여러 번 두 드려야했습니다.About Device
이제 장치가 연결되었습니다.
Remote devices
JavaScript를 사용하여 탭 목록을 검색 할 수 있도록
선택한 devtools보기에서 두 번째 devtools보기를여십시오.Ctrl
+ Shift
+ J
(WINDOWS)가 닫힙니다. 첫 번째 devtools 패널./deep/
는 #shadow-root
DOM 요소 를 입력하기위한 CSS 선택기입니다.Android 용 Chrome에서 열린 모든 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
(A)의 속성 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 파일 탐색기 또는 루트 탐색기 가 권장됩니다.
장치의 루트 폴더 (보호 된 시스템 파티션)로 이동하여 → 선택 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
파일 로 내보낼 수 있어야합니다 .이것은 내가 생각하는 사람에게 도움이 될 수 있습니다.
당신이있는 경우 안드로이드 명령 행 도구 개발 시스템에 설치를하고 안드로이드 장치에서 디버깅 USB를 활성화 한 다음, 다음을 수행 할 수 있습니다 :
adb forward tcp:9222 localabstract:chrome_devtools_remote
개발 머신에서 실행 하십시오.
Chrome 인스턴스는 추상 주소가 " chrome_devtools_remote
"인 유닉스 도메인 소켓을 통해 디버깅 프로토콜에 대한 액세스 권한을 제공합니다 . 위의 adb 명령은 해당 소켓의 포트 9222로 요청을 전달합니다. (를 입력하면 Android 장치에서 모든 유닉스 도메인 소켓 목록을 얻을 수 있습니다 adb shell cat /proc/net/unix
.)
디버깅 프로토콜은 HTTP를 통해 크롬 인스턴스에 대한 JSON 데이터를 노출합니다. 열린 탭을 나열하는 JSON 파일은을 실행하여 얻을 수 있습니다 wget -O tabs.json http://localhost:9222/json/list
.
API의 다른 엔드 포인트는 https://github.com/buggerjs/bugger-daemon/blob/master/README.md#api 에서 찾을 수 있습니다 .
이 해결 방법은 Android 용 Chrome에서 연 모든 탭에 대한 개별 URL이 포함 된 텍스트 파일을 제공합니다.
이에 언급 한 바와 같이 대답 하여 마이클 , 당신은 현재의 탭이 들어있는 파일을 잡아해야합니다. 장치에서 루트 탐색기를 사용하여이 파일을 잡고 Windows에서 선택한 폴더로 이동하십시오./data/data/com.android.chrome/app_tabs/0/tab_state
때로는 파일에 스크립트를 망치는 이상한 화살표 문자가 있습니다. 스크립트를 실행하고 파일의 일부를 자르면 마지막 문자를 보면 아마도 이상한 화살표 문자 일 것입니다. 원본 파일에서 찾거나 교체하십시오. 일단 사라지면 스크립트가 정상적으로 실행됩니다. 다음과 같이 보입니다 :-->
명령 행 프롬프트 ( "Run"또는 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
50 개의 탭을 충전하여 열린 탭을 수동으로 동기화 하는 부분 (이 기능이 여전히 누락되어 있고 휴대 장치에서 열린 탭이 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)-릴리즈'에서 Chrome 49.0.2623.105의 tab_state 파일). 인쇄 할 수없는 바이트와 모든 후속 바이트를 제거하는 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
읽으려면 루트 또는 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
in \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
Windows에서는 https://scoop.sh/ 를 설치 한 다음scoop install busybox 7zip
이것은 당신이 찾고있는 대답이 아니지만 :
Google에서 더미 계정 만들기
Android 기기에서 로그인하고 동기화 사용
데스크탑에 로그인하고 동기화를 활성화하십시오
데스크탑에 Session Buddy 확장 설치
내보내기 탭