Làm cách nào tôi có thể xuất danh sách các tab Chrome đang mở?


44

Tính năng đồng bộ hóa của Chrome không chọn tất cả các tab đang mở trên điện thoại Android của tôi.

Các tab được lưu trữ trong một tập tin ở đâu đó mà tôi có thể truy cập?

Ý định của tôi là xuất danh sách các tab để tôi có thể chạy khôi phục cài đặt gốc trên thiết bị.

Chạy Android 4.3


Tôi ước có một tiện ích bổ sung cho mục đích đó.
neverMind9

Cần có một cách độc lập không gốc để làm như vậy. Vì bootloader lau. Bất cứ ai phát minh ra bootloader lau đau đầu nên bị sa thải ngay lập tức. Bộ tải khởi động là một cái bẫy. Mở khóa nó buộc người ta phải xóa toàn bộ dữ liệu và một số phần không thể được sao lưu mà không mở khóa ở vị trí đầu tiên. Vòng luẩn quẩn. Và sau đó là mã hóa và ARM TrustZone cũng đau đầu.
neverMind9

Câu trả lời:


35

Bạn có thể sử dụng tính năng Thiết bị từ xa trong trình gỡ lỗi Chrome để kết nối với Chrome trên thiết bị và truy cập các tab. Chỉ cần mở rộng danh sách các tab hiển thị để có được danh sách đầy đủ, sau đó tô sáng và sao chép mọi thứ được hiển thị (bao gồm các URL) vào bảng tạm: https://developers.google.com/web/tools/chrome-devtools/remote-debugging/

Tôi chỉ quản lý để xuất ~ 400 tab theo cách này.


3
muốn đề cập rằng danh sách debugger chrome sẽ rút ngắn url nếu chúng quá dài, do đó thay vì sao chép dán, bạn có thể lấy url của trực tiếp sử dụng các phương pháp trong Louis Maddox của câu trả lời
woojoo666

@ woojoo666: Có vẻ như mọi thứ trong Chrome đã thay đổi và bây giờ câu trả lời của Louis cũng cắt ngắn phần cuối của nhiều URL. Có vẻ như bất kỳ URL nào có hơn 100 ký tự - trong trường hợp của tôi, khoảng 50% tất cả các tab đang mở của tôi - sẽ bị mất kết thúc.
peterflynn

@peterflynn vẫn làm việc cho tôi. Chỉ cần xuất một url dài 432 ký tự. Để chắc chắn, bạn đang mở các công cụ dev trong cửa sổ bật ra, đi đến ngăn "thiết bị từ xa", sau đó sử dụng ctrl-shift-J để mở cửa sổ dev-tools thứ hai, sau đó sử dụng tập lệnh được cung cấp ở đây , đúng không?
woojoo666

Phiên bản Android yêu cầu tối thiểu để làm điều này là gì?
neverMind9

Tôi ước có một cách độc lập để làm điều đó. Mà không dựa vào các phương pháp bên ngoài. Tôi biết, có danh sách tab Root, nhưng điện thoại di động của tôi không được root vì mọi người nói có nguy cơ bị trục trặc.
neverMind9

25

Chỉ cần tham gia StackExchange này để thể hiện sự đánh giá cao cho câu trả lời của Jeremy ở trên và cũng thêm một vài dòng JS tôi đã sử dụng để xuất danh sách tab (vì sao chép bằng con trỏ không lý tưởng!)

Như Jeremy đã nói, chọn Remote devicesbên dưới biểu tượng More toolsdevtools của Chrome (phía trên bên phải của bảng điều khiển):

  • thiết lập USB gỡ lỗi trên điện thoại của bạn (dưới SettingsDeveloper options, rễ không bắt buộc)
    • lưu ý rằng bạn phải bật Developer optionsmenu, nó được ẩn theo mặc định để bảo vệ người dùng
    • trên điện thoại của tôi, yêu cầu này khai thác nhiều lần vào số bản dựng dưới SettingsAbout Device
  • Một khi điều này được thực hiện, cắm USB của bạn và cho phép kết nối MTP
  • khi bảng điều khiển thiết bị từ xa Chrome devtools mở, điện thoại sẽ yêu cầu cho phép gỡ lỗi USB
    • bạn có thể chọn luôn tin tưởng vào máy tính

Bây giờ thiết bị đã được kết nối,

  • mở chế độ xem devtools thứ 2 trên chế độ xem devtools mà bạn đã chọn Remote devicesđể có thể truy xuất danh sách các tab bằng JavaScript
    • lưu ý rằng bạn phải có devtools trong chế độ bật ra (sử dụng biểu tượng dấu chấm lửng dọc ở phía trên bên phải của bảng điều khiển) để có thể bật lên, nếu không Command + Option + J (MAC) Ctrl+ Shift+ J(WINDOWS) sẽ đóng bảng điều khiển devtools đầu tiên.
  • mở rộng danh sách từ một vài mục đầu tiên sang tất cả các tab bằng cách nhấp vào 'Hiển thị thêm'
  • để kịch bản chống lại danh sách, sử dụng một vài dòng mã sau đây [được nhập trong bảng điều khiển của cửa sổ devtools thứ 2]
    • NB /deep/là bộ chọn CSS để nhập #shadow-rootcác phần tử DOM

Để xuất danh sách tất cả các URL đang mở trên Chrome cho Android, tôi đã chọn chỉ đưa danh sách thành chuỗi văn bản được định dạng đánh dấu và sao chép nó vào bảng tạm

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)

Sau đó, bạn sẽ có một danh sách trên clipboard của bạn trông như thế này:

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

Cập nhật

Đối với một số lý do tôi nhận được một lỗi thỉnh thoảng , nói rằng nó đã thất bại để có được những hrefthuộc tính của một nullmục (khi tôi kiểm tra nó nó là một nút vô hình, ai mà biết được). Để giải quyết vấn đề này, hãy sử dụng phiên bản này thay thế:

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 đã thay đổi, 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}))sẽ hoạt động ngay bây giờ
dlamotte

Lưu ý rằng sử dụng kỹ thuật này, bất kỳ URL nào dài hơn 100 ký tự sẽ bị cắt kết thúc.
peterflynn

@peterflynn vẫn làm việc cho tôi. Tôi vừa xuất một url là 432 ký tự. Hãy chắc chắn rằng bạn đang sử dụng tập lệnh mà diamotte cung cấp
woojoo666

1
Nó lại thay đổi. Đối với Phiên bản Chrome "73.0.3683.75 (Bản dựng chính thức) (64-bit)": 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')}))(Tôi không thể truy cập vào gốc bóng tối qua bộ chọn, nhưng phải sử dụng thuộc .shadowRoottính của phần tử máy chủ của nó. này, không được hỗ trợ.
Adrian

1
Chỉ trong trường hợp bất kỳ ai khác gặp sự cố, tôi đã gặp sự cố khi chạy một số tập lệnh này (nó đã làm hỏng ngăn xếp USB của kernel với việc sử dụng 100% trong hơn 10 phút trước khi tôi dừng nó). Cách tốt nhất tôi tìm thấy là chọn phần tử HTML cha trong trình kiểm tra công cụ phát triển chrome (sử dụng nút con trỏ ở trên cùng bên trái của cửa sổ công cụ dev lồng nhau để chọn một mục ngẫu nhiên trong danh sách, sau đó chọn phần tử cha) nhấp chuột phải -> "Chỉnh sửa dưới dạng HTML" -> sao chép vào tệp văn bản khác. Sau đó, việc điều chỉnh các tập lệnh trên trở nên dễ dàng hơn và nhanh hơn rất nhiều để hoạt động trên bản sao HTML cục bộ đó (hoặc BASH)
JZL003

13

Tôi đã gặp giải pháp này khi tôi đang tìm cách khôi phục các tab đã bị đóng vĩnh viễn sau khi trình duyệt của tôi bị sập một ngày. Để truy cập thông tin bạn yêu cầu, thiết bị của bạn cần được root để bạn có thể chạy ứng dụng trình duyệt tệp với quyền truy cập vào tệp gốc được cài đặt trên thiết bị của bạn. ES File Explorer hoặc Root Explorer là những khuyến nghị của tôi.

  1. Điều hướng đến thư mục gốc của thiết bị của bạn (phân vùng hệ thống được bảo vệ) → chọn DATA→ chọn com.android.chrome.

  2. Có một số nơi bạn có thể tìm thấy thông tin về các tab hiện tại của mình.

    1. Thư mục đầu tiên để kiểm tra là app_tabs, sau đó 0. Trong thư mục này nên có một tệp được gọi tab_statechứa danh sách tất cả các tab hiện tại của bạn.
    2. Ngoài ra còn có các file khác trong thư mục này được gọi tab3, tab4vv có chứa thông tin về các tab hiện tại.
    3. IMO, bạn cần một "trình soạn thảo văn bản / trình soạn thảo sql" đặc biệt để đọc nội dung của một số các tệp này vì mã hóa là khác nhau.
  3. Nơi tiếp theo để tìm là /data/com.android.chrome/app_chrome/Default/. Trong thư mục này, bạn sẽ tìm thấy một tập tin được gọi là History. Tùy thuộc vào tình huống của bạn, bạn có thể tìm thấy một danh sách tốt các lượt truy cập trang web gần đây tại đây.

  4. Cuối cùng, điều hướng đến Sync Data folder. Tại đây, bạn sẽ tìm thấy thông tin được đồng bộ hóa với Google (và thông tin này sẽ bao gồm tất cả các tab bạn hiện đã đồng bộ hóa trên các thiết bị khác).

    • Trong tệp SyncData.sqlite3, bạn cũng sẽ tìm thấy lịch sử của tất cả các tìm kiếm Google của mình (đôi khi tôi thấy là một lần đọc thú vị).
    • Bạn sẽ cần một chương trình trình duyệt dữ liệu Sqlite3 trên PC để đọc tệp này. Ứng dụng sẽ có thể xuất thành tệp .CSVhoặc .XLStệp có thể sử dụng cao mà bạn có thể mở trong MS Excel .

Điều này có thể hữu ích cho người mà tôi giả sử.


5

Nếu bạn đã cài đặt các công cụ dòng lệnh Android trên máy phát triển và đã bật gỡ lỗi USB trên thiết bị Android của mình, thì bạn có thể thực hiện các bước sau:

  • Thực thi adb forward tcp:9222 localabstract:chrome_devtools_remotetrên máy phát triển của bạn.

    Các phiên bản Chrome hiển thị quyền truy cập vào giao thức gỡ lỗi thông qua ổ cắm tên miền unix có địa chỉ trừu tượng " chrome_devtools_remote" - lệnh adb ở trên chuyển tiếp yêu cầu tới cổng 9222, trên ổ cắm đó. (Bạn có thể nhận danh sách tất cả các ổ cắm tên miền unix trên thiết bị Android bằng cách nhập adb shell cat /proc/net/unix.)

  • Giao thức gỡ lỗi hiển thị dữ liệu JSON về phiên bản chrome qua HTTP. Một tệp JSON liệt kê các tab đang mở có thể nhận được bằng cách thực thi wget -O tabs.json http://localhost:9222/json/list.

    (Các điểm cuối khác của API có thể được tìm thấy tại https://github.com/buggerjs/bugger-daemon/blob/master/README.md#api .)

Xem ở đây để biết thêm chi tiết về cách bật gỡ lỗi USB và ở đây để biết tổng quan về cách thức hoạt động của nó.


2

Giải pháp này sẽ cung cấp cho bạn một tệp văn bản với các URL riêng cho tất cả các tab bạn đã mở trong Chrome cho Android.

  1. Như đã đề cập trong này câu trả lời bởi Michael , bạn phải lấy các tập tin có chứa các tab hiện tại. Sử dụng trình thám hiểm gốc trên thiết bị, lấy tệp này và di chuyển nó đến thư mục bạn chọn trong windows:/data/data/com.android.chrome/app_tabs/0/tab_state

  2. Cài đặt công cụ GNU cho Windows

  3. Đôi khi có một ký tự mũi tên kỳ lạ trong tập tin làm hỏng kịch bản. Nếu bạn chạy tập lệnh và nó cắt một phần của tệp, hãy nhìn vào ký tự cuối cùng và nó có thể sẽ là ký tự mũi tên kỳ lạ đó. Tìm / thay thế nó trong tập tin gốc. Khi nó biến mất, kịch bản sẽ chạy tốt. Nó trông như thế này:-->

  4. Đi đến dấu nhắc dòng lệnh (đi đến "Chạy" hoặc Win+ Rvà nhập cmd) và điều hướng đến thư mục chứa sed.exe(bất cứ nơi nào bạn đã cài đặt nó trong bước 2.)

  5. Có thể bạn sẽ muốn di chuyển các tập tin gốc ( tab_state) vào cùng thư mục chứa sed.exe. Nó sẽ làm mọi thứ dễ dàng hơn. Khi bạn đã thực hiện điều đó, hãy chạy tập lệnh này:

    sed -i "s/.\{6\}http/\r\n\r\nhttp/g" tab_state
    
  6. Điều này sẽ sửa đổi tệp với tất cả các URL được định dạng chính xác. Mở tệp dưới dạng tệp văn bản, sau đó sao chép và dán nội dung vào tài liệu Word hoặc một số vị trí khác. Vì một số lý do, nếu bạn không sao chép và dán dữ liệu ra, khi bạn lưu tệp, nó sẽ xóa tất cả các ngắt dòng / trả về vận chuyển. Nếu mọi thứ khó khăn, chỉ cần bắt đầu lại và làm lại. Khi tất cả đã nói và hoàn thành, bạn nên có một tệp chứa danh sách các liên kết đến tất cả các tab bạn đã mở trước đó.


2

Bạn có thể thay thế mã trong bảng điều khiển từ Louis Maddox bằng mã này, nó đang hoạt động như ngày nay Version 0.66.99 Chromium: 75.0.3770.100. Lưu ý: Bạn có thể mở cửa sổ bảng điều khiển mới của cửa sổ thiết bị từ xa nếu bạn kích hoạt cửa sổ thiết bị từ xa và nhấnCtrl+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)

Sau đó, bạn có thể dán tất cả các tab của mình vào tệp văn bản.

Nếu bạn muốn mở tất cả các tab trên thiết bị thực tế của mình, hãy thay thế tabs.forEach-part bằng

tabs.forEach(e => {
    window.open(e.url, '_blank');
})

Tuy nhiên, đừng thử điều đó với quá nhiều tab đang mở trên thiết bị của bạn.

Tôi đã thêm phần này sau tabsphần để đồng bộ hóa thủ công các tab đã mở (dũng cảm vẫn thiếu tính năng này và tôi đã có 650 tab đã mở trên thiết bị di động của mình) với khoản phí 50 tab:

i=0;
j=0;
tabs.forEach(e => {
  if(i<50){
    i++;
    window.open(e.url, '_blank');
  }
  j++;
})
console.log("Tabs overall:"+j);

Điều này sẽ mở một loạt 50 tab từ thiết bị của bạn vào cửa sổ trình duyệt đã mở. Nó cũng hiển thị tổng số tab. Tuy nhiên, đừng đóng tab 'trống' cho các công cụ dành cho nhà phát triển và thiết bị từ xa đó, nếu bạn muốn mở một lô khác. Với Ctrl + TABbạn chuyển qua các tab, Ctrl +Dđể đánh dấu chúng và Ctrl+Wđóng tab hoạt động. Đó là cách tôi đã làm một cách thủ công, thoải mái đề xuất các thay đổi cho mã này để giúp cuộc sống của mọi người trở nên dễ dàng hơn.


1

Michael xác định tệp tab_state, nó vẫn còn để giải mã nó. Tập lệnh sau hoạt động với tôi (trong kitkat KSH_VERSION = '@ (#) MIRBSD KSH R43 2013/02/19' hoặc xenl BASH_VERSION = '4.3.46 (1) -release' trên tệp tab_state từ Chrome 49.0.2623.105), đầu tiên nó in ra URL cuối cùng, giữa các URL, nó sẽ loại bỏ bất kỳ byte không thể in nào và tất cả các byte theo sau, và nhiều hơn nữa nếu cần để có ít nhất 2 byte được loại bỏ. Theo sau mỗi URL, nó sẽ in một khoảng trắng, sau đó xóa các byte có thể in liền kề nếu có, sau đó là dấu phẩy, sau đó số byte khác bị xóa (& byte nói trong ngoặc đơn). Để in các URL chỉ sử dụng lệnh echo nhận xét thay thế.

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

Bạn cần root hoặc Chrome để đọc /data/data/com.android.chrome/app_tabs/0/tab_state0

Bạn có thể sử dụng khai thác bẩn này trên các thiết bị dễ bị tấn công để trở thành Chrome và nhận tab_state0từ một thiết bị đính kèm:

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

Khi bạn có quyền truy cập tab_state0, trích xuất các URL:

LC_ALL=C grep -a -o 'http[[:print:]]*' tab_state0

1

Câu trả lời gần đây nhất của simonsan không hoạt động trên bản dựng Chrome hiện tại của tôi 75.0.3770.100. Tôi không có vboxlớp được sử dụng trong mọi tập lệnh được đăng, vì vậy tôi đã quản lý để viết một mã đang hoạt động:

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

Tôi đã thấy bài đăng và ảnh chụp màn hình của Louis Maddox rất hữu ích để giải mã kịch bản của anh ấy, vì vậy đây là của tôi với cây được cập nhật.

ảnh chụp màn hình


Dù sao, các giải pháp được đề xuất để vượt qua giới hạn 100 char không hoạt động đối với tôi do đó tôi đã quyết định chỉnh sửa inspect.jstừ nguồn theo các bước sau:

  1. Tải xuống chrome-pak-customizer và giải nén nó.
  2. Từ C:\Program Files (x86)\Google\Chrome\Application\75.0.3770.100( 75.0.3770.100tên của bản dựng) tạo một bản sao của resources.pakthư mục Tài liệu của bạn, kéo bản sao và thả nó vào unpack.batthư mục đã giải nén.
  3. Trong \document\resources_unpaked\lấy 11208.jsvà mở nó.
  4. Trên dòng 537 hoặc bằng cách tìm kiếm 100có những dòng này
  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. Lưu tệp và trong cùng một thư mục kéo pak_index.inivà thả nó vào pak.bat. bây giờ resource.paktrong \documents\đã được cập nhật với những thay đổi.
  2. Tạo bản sao lưu resource.pakvì bạn không bao giờ biết, đóng Chrome và thay thế bản gốc bằng phiên bản cập nhật.

Bây giờ tập lệnh sẽ hiển thị tới 300 ký tự cho các url.


0

Trong các cửa sổ, để trích xuất tab_state0từ kho lưu trữ TitaniumBackup (hoạt động trên điện thoại đã root)

7z e TitaniumB\com.android.chrome-20180918-001302.tar.gz -so | 7z e -si -ttar tab_state0 -r

Để lấy danh sách các tab từ tab_state0

sed -b "s/^.\{20\}//g" tab_state0 | sed -b "s/.\{6\}http/\nhttp/g" > my-tabs.md

Trên windows tôi sẽ cài đặt https://scoop.sh/ rồiscoop install busybox 7zip


-1

Đây không phải là câu trả lời bạn đang tìm kiếm, nhưng:

  1. Tạo tài khoản giả trên Google

  2. Đăng nhập trên thiết bị Android và cho phép đồng bộ hóa

  3. Đăng nhập trên máy tính để bàn và cho phép đồng bộ hóa

  4. Cài đặt tiện ích mở rộng Phiên Buddy trên máy tính để bàn

  5. Xuất tab


5
Như OP đã nêu trong câu hỏi của anh ấy: tính năng đồng bộ hóa của Chrome không chọn tất cả các tab đang mở trên điện thoại Android của tôi. - Làm thế nào để giúp đỡ? Giải pháp được đề xuất của bạn xuất sau khi đồng bộ hóa không đầy đủ , do đó, nó sẽ không xuất tất cả các tab theo yêu cầu của OP.
Izzy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.