Ambil tangkapan layar halaman web dengan JavaScript?


148

Apakah mungkin untuk mengambil tangkapan layar halaman web dengan JavaScript dan kemudian mengirimkannya kembali ke server?

Saya tidak begitu peduli dengan masalah keamanan browser. dll karena implementasinya untuk HTA . Tetapi apakah itu mungkin?


Bisakah Anda mengklarifikasi mengapa Anda ingin melakukan ini? Mungkin ada solusi alternatif untuk mengambil tangkapan layar.
andyuk

Saya sedang melihat memiliki pengguna secara kasar mendesain apa yang mereka inginkan, sedikit sketsa dan sedikit drag 'n setetes objek. Saya kemudian ingin "desain" ini digunakan sebagai bagian dari instruksi dalam proses produksi. Ini jelas merupakan langkah yang melibatkan pengguna, tidak ada yang rahasia di sini :)
Scott Bennett-McLeish

Jawaban:


42

Saya telah melakukan ini untuk HTA dengan menggunakan kontrol ActiveX. Sangat mudah untuk membangun kontrol di VB6 untuk mengambil tangkapan layar. Saya harus menggunakan keybd_event panggilan API karena SendKeys tidak dapat melakukan PrintScreen. Berikut kode untuk itu:

Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public Const CaptWindow = 2

Public Sub ScreenGrab()
   keybd_event &H12, 0, 0, 0
   keybd_event &H2C, CaptWindow, 0, 0
   keybd_event &H2C, CaptWindow, &H2, 0
   keybd_event &H12, 0, &H2, 0
End Sub

Itu hanya membuat Anda sejauh mendapatkan jendela ke clipboard.

Opsi lain, jika jendela yang Anda inginkan tangkapan layarnya adalah HTA, cukup gunakan XMLHTTPRequest untuk mengirim simpul DOM ke server, lalu buat tangkapan layar di sisi server.


Saya setuju dengan Allen, itu cara yang cerdik untuk berpotensi mengambil screenshot halaman!
Ricket

Tolong apa "HTA" itu?
Pete Alvin

2
@PeteAlvin sebuah HTA adalah aplikasi Hypertext, yang merupakan cara untuk menjalankan aplikasi JS istimewa di Internet Explorer. Tidak super relevan hari ini.
Joel Anair

141

Google melakukan ini di Google+ dan pengembang berbakat membalikkannya dan menghasilkan http://html2canvas.hertzen.com/ . Untuk bekerja di IE, Anda memerlukan pustaka dukungan kanvas seperti http://excanvas.sourceforge.net/


2
Terima kasih, tautan di pos Anda menjelaskan semuanya dengan baik
Hüseyin BABAL

2
Jika Anda tidak ingin melakukan ini sendiri, Usersnap dapat dicoba. Ini adalah solusi drop-in untuk mendapatkan tangkapan layar browser yang akurat dari pengunjung Anda tanpa menginstal plugin (dan tidak ada Java, ActiveX atau Flash apa pun).
Gregor


14

Solusi lain yang mungkin saya temukan adalah http://www.phantomjs.org/ yang memungkinkan seseorang untuk dengan mudah mengambil tangkapan layar halaman dan lebih banyak lagi. Sementara persyaratan asli saya untuk pertanyaan ini tidak berlaku lagi (pekerjaan berbeda), saya kemungkinan akan mengintegrasikan PhantomJS ke proyek masa depan.


Apakah Anda tahu jika phantomj dapat menghasilkan gambar elemen pada halaman (bukan seluruh halaman)?
trusktr

Ya kamu bisa. Gunakan cuplikan ini dengan PhantomJS atau gunakan CasperJS .
zopieux

12

Pounder apakah ini mungkin dilakukan dengan mengatur elemen seluruh tubuh menjadi kanvas kemudian menggunakan canvas2image?

http://www.nihilogic.dk/labs/canvas2image/


bertanya-tanya apakah SVG akan membantu, mungkin harus melihat sumber Google
Luke Stanley

1
Anda dapat menggunakan kode html2canvas Niklas untuk merender html di kanvas, lalu gunakan ini untuk menyimpan gambar.
trusktr

9

Cara yang mungkin untuk melakukan ini, jika berjalan di windows dan menginstal .NET Anda dapat melakukannya:

public Bitmap GenerateScreenshot(string url)
{
    // This method gets a screenshot of the webpage
    // rendered at its full size (height and width)
    return GenerateScreenshot(url, -1, -1);
}

public Bitmap GenerateScreenshot(string url, int width, int height)
{
    // Load the webpage into a WebBrowser control
    WebBrowser wb = new WebBrowser();
    wb.ScrollBarsEnabled = false;
    wb.ScriptErrorsSuppressed = true;
    wb.Navigate(url);
    while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }


    // Set the size of the WebBrowser control
    wb.Width = width;
    wb.Height = height;

    if (width == -1)
    {
        // Take Screenshot of the web pages full width
        wb.Width = wb.Document.Body.ScrollRectangle.Width;
    }

    if (height == -1)
    {
        // Take Screenshot of the web pages full height
        wb.Height = wb.Document.Body.ScrollRectangle.Height;
    }

    // Get a Bitmap representation of the webpage as it's rendered in the WebBrowser control
    Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
    wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height));
    wb.Dispose();

    return bitmap;
}

Dan kemudian melalui PHP Anda bisa melakukan:

exec("CreateScreenShot.exe -url http://.... -save C:/shots domain_page.png");

Kemudian Anda memiliki tangkapan layar di sisi server.


1
Meskipun sedikit tidak berhubungan dengan pertanyaan, ini adalah saran yang luar biasa! Terima kasih!
mihai

mengapa tidak memuat beberapa gaya yang bahkan saya dapat melihatnya dimuat di IE9 ?!
Dr TJ

7

Ini mungkin bukan solusi ideal untuk Anda, tetapi mungkin masih layak disebut.

Snapsie adalah open source, objek ActiveX yang memungkinkan tangkapan layar Internet Explorer ditangkap dan disimpan. Setelah file DLL terdaftar pada klien, Anda harus dapat menangkap tangkapan layar dan mengunggah file ke server dengan JavaScript. Kelemahan: perlu mendaftarkan file DLL di klien dan hanya bekerja dengan Internet Explorer.


6

Kami memiliki persyaratan serupa untuk melaporkan bug. Karena itu untuk skenario intranet, kami dapat menggunakan addon browser (seperti Fireshot untuk Firefox dan IE Screenshot untuk Internet Explorer).



1

Anda dapat mencapainya menggunakan HTA dan VBScript . Cukup panggil alat eksternal untuk melakukan screenshotting. Saya lupa apa namanya, tetapi pada Windows Vista ada alat untuk melakukan screenshot. Anda bahkan tidak perlu menginstal tambahan untuk itu.

Adapun sebagai otomatis - itu benar-benar tergantung pada alat yang Anda gunakan. Jika memiliki API, saya yakin Anda dapat memicu tangkapan layar dan proses penyimpanan melalui beberapa panggilan Visual Basic tanpa pengguna mengetahui bahwa Anda melakukan apa yang Anda lakukan.

Karena Anda menyebutkan HTA, saya berasumsi Anda berada di Windows dan (mungkin) tahu lingkungan Anda (misalnya OS dan versi) dengan sangat baik.


Dia mencoba untuk melakukannya sebagai bagian dari aplikasi web di penghitungan klien bukan untuk penggunaan pribadi
mrBorna

1

Saya menemukan bahwa dom-to-image melakukan pekerjaan dengan baik (jauh lebih baik daripada html2canvas). Lihat pertanyaan & jawaban berikut: https://stackoverflow.com/a/32776834/207981

Pertanyaan ini menanyakan tentang pengiriman kembali ke server, yang seharusnya dimungkinkan, tetapi jika Anda ingin mengunduh gambar, Anda ingin menggabungkannya dengan FileSaver.js , dan jika Anda ingin mengunduh zip dengan beberapa file gambar yang dihasilkan semua sisi klien lihat di jszip .


0

Solusi hebat untuk mengambil tangkapan layar dalam Javascript adalah dengan https://grabz.it .

Mereka memiliki API tangkapan layar yang fleksibel dan mudah digunakan yang dapat digunakan oleh semua jenis aplikasi JS.

Jika Anda ingin mencobanya, pertama-tama Anda harus mendapatkan kunci aplikasi + rahasia dan SDK gratis

Kemudian, di aplikasi Anda, langkah implementasi adalah:

// include the grabzit.min.js library in the web page you want the capture to appear
<script src="grabzit.min.js"></script>

//use the key and the secret to login, capture the url
<script>
GrabzIt("KEY", "SECRET").ConvertURL("http://www.google.com").Create();
</script>

Tangkapan layar dapat disesuaikan dengan parameter yang berbeda . Sebagai contoh:

GrabzIt("KEY", "SECRET").ConvertURL("http://www.google.com", 
{"width": 400, "height": 400, "format": "png", "delay", 10000}).Create();
</script>

Itu saja. Kemudian cukup tunggu sebentar dan gambar akan secara otomatis muncul di bagian bawah halaman, tanpa Anda perlu memuat ulang halaman.

Ada fungsi lain untuk mekanisme tangkapan layar yang dapat Anda jelajahi di sini .

Dimungkinkan juga untuk menyimpan tangkapan layar secara lokal. Untuk itu Anda perlu menggunakan API sisi server GrabzIt. Untuk info lebih lanjut, periksa panduan terperinci di sini .


0

Jika Anda bersedia melakukannya di sisi server, ada opsi seperti PhantomJS , yang sekarang sudah tidak digunakan lagi. Cara terbaik untuk melakukannya adalah Headless Chrome dengan sesuatu seperti Puppeteer di Node.JS. Menangkap halaman web menggunakan Puppeteer akan sesederhana berikut ini:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();

Namun itu memerlukan chrome tanpa kepala untuk dapat berjalan di server Anda, yang memiliki beberapa dependensi dan mungkin tidak cocok pada lingkungan terbatas. (Juga, jika Anda tidak menggunakan Node.JS, Anda mungkin perlu menangani sendiri pemasangan / peluncuran browser.)

Jika Anda bersedia menggunakan layanan SaaS, ada banyak opsi seperti



0

Mulai hari ini Apr 2020 GitHub library html2Canvas https://github.com/niklasvh/html2canvas

GitHub 20K bintang | Azure pipeles: Berhasil | Unduhan 1.3M / bulan |

kutipan: " JavaScript HTML renderer Script memungkinkan Anda untuk mengambil" tangkapan layar "dari halaman web atau bagian dari itu, langsung di browser pengguna . Screenshot didasarkan pada DOM dan karenanya mungkin tidak 100% akurat untuk representasi nyata seperti itu tidak membuat tangkapan layar yang sebenarnya, tetapi membuat tangkapan layar berdasarkan informasi yang tersedia di halaman.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.