ถ่ายภาพหน้าจอของหน้าเว็บด้วย JavaScript หรือไม่


148

เป็นไปได้ไหมที่จะจับภาพหน้าจอของหน้าเว็บด้วย JavaScript แล้วส่งกลับไปที่เซิร์ฟเวอร์หรือไม่?

ฉันไม่ได้เกี่ยวข้องกับปัญหาความปลอดภัยของเบราว์เซอร์ ฯลฯ รวมการดำเนินการจะเป็นสำหรับHTA แต่มันเป็นไปได้?


คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงต้องการทำสิ่งนี้? อาจมีทางเลือกอื่นในการถ่ายภาพหน้าจอ
andyuk

ฉันกำลังมองให้ผู้ใช้ออกแบบสิ่งที่พวกเขาต้องการประมาณคร่าวๆและร่างของวัตถุที่ลาก ฉันต้องการให้ "การออกแบบ" นี้ถูกใช้เป็นส่วนหนึ่งของคำแนะนำในกระบวนการผลิต เป็นมั่นเหมาะใช้ที่เกี่ยวข้องกับขั้นตอนความลับอะไรที่นี่ :)
สกอตต์เบนเน็ตต์-McLeish

เป็นไปได้ที่ซ้ำกันของวิธีถ่ายภาพหน้าจอของผู้เข้าชม?
ilhan

คำตอบ:


42

ฉันทำสิ่งนี้สำหรับ HTA โดยใช้ตัวควบคุม ActiveX มันค่อนข้างง่ายที่จะสร้างส่วนควบคุมใน VB6 เพื่อจับภาพหน้าจอ ฉันต้องใช้การเรียก API keybd_event เพราะ SendKeys ไม่สามารถทำ PrintScreen ได้ นี่คือรหัสสำหรับ:

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

นั่นทำให้คุณเท่าที่ได้รับหน้าต่างไปที่คลิปบอร์ด

ตัวเลือกอื่นถ้าหน้าต่างที่คุณต้องการสกรีนช็อตคือ HTA จะใช้ XMLHTTPRequest เพื่อส่งโหนด DOM ไปยังเซิร์ฟเวอร์จากนั้นสร้างสกรีนชอตฝั่งเซิร์ฟเวอร์


ฉันเห็นด้วยกับ Allen นั่นเป็นวิธีที่แยบยลที่จะจับภาพหน้าจอได้!
Ricket

โปรด "HTA" เป็นอะไร
Pete Alvin

2
@PeteAlvin an HTA เป็นแอปพลิเคชัน Hypertext ซึ่งเป็นวิธีการเรียกใช้แอปพลิเคชัน JS ที่มีสิทธิพิเศษใน Internet Explorer ไม่เกี่ยวข้องกันมากในวันนี้
Joel Anair

141

Google จะทำเช่นนี้ใน Google+ และนักพัฒนาที่มีความสามารถย้อนกลับการออกแบบและผลิตhttp://html2canvas.hertzen.com/ หากต้องการทำงานใน IE คุณจะต้องมีไลบรารีสนับสนุนผ้าใบเช่นhttp://excanvas.sourceforge.net/


2
ขอบคุณลิงก์ในโพสต์ของคุณอธิบายได้ว่าทำได้ดี
Hüseyin BABAL

2
หากคุณไม่ต้องการทำสิ่งนี้ด้วยตัวเองUsersnapอาจคุ้มค่าที่จะลอง เป็นวิธีการหยดในการรับภาพหน้าจอเบราว์เซอร์ที่แม่นยำจากผู้เยี่ยมชมของคุณโดยไม่ต้องติดตั้งปลั๊กอิน (และไม่มี Java, ActiveX หรือ Flash ใด ๆ )
Gregor

คุณช่วยตรวจสอบstackoverflow.com/questions/44494447/
ไหม

14

อีกวิธีที่เป็นไปได้ที่ฉันค้นพบคือhttp://www.phantomjs.org/ซึ่งช่วยให้สามารถจับภาพหน้าจอของหน้าเว็บได้อย่างง่ายดายและอีกมากมาย ในขณะที่ความต้องการดั้งเดิมของฉันสำหรับคำถามนี้ไม่ถูกต้องอีกต่อไป (งานต่าง ๆ ) ฉันน่าจะรวม PhantomJS เข้ากับโครงการในอนาคต


คุณรู้หรือไม่ว่า phantomjs สามารถสร้างภาพขององค์ประกอบบนหน้า (ไม่ใช่ทั้งหน้า)?
trusktr

ใช่คุณสามารถ. ไม่ว่าจะใช้ข้อมูลโค้ดนี้กับ PhantomJS หรือการใช้CasperJS
zopieux

12

ตำของถ้าเป็นไปได้ที่จะทำโดยการตั้งค่าองค์ประกอบของร่างกายทั้งหมดลงใน canvase แล้วใช้ canvas2image?

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


สงสัยว่า SVG จะช่วยได้หรือไม่อาจต้องดูที่มาของ Google
Luke Stanley

1
คุณสามารถใช้รหัส html2canvas ของ Niklas เพื่อแสดง html ใน Canvas จากนั้นใช้สิ่งนี้เพื่อบันทึกรูปภาพ
trusktr

9

วิธีที่เป็นไปได้ในการทำเช่นนี้หากทำงานบน windows และติดตั้ง. NET ไว้คุณสามารถทำได้:

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;
}

จากนั้นผ่าน PHP คุณสามารถ:

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

จากนั้นคุณมีภาพหน้าจอในฝั่งเซิร์ฟเวอร์


1
แม้ว่าจะไม่เกี่ยวข้องกับคำถามเล็กน้อย แต่นี่เป็นคำแนะนำที่ยอดเยี่ยม! ขอบคุณมาก!
mihai

ทำไมมันไม่โหลดสไตล์บางอย่างที่แม้ฉันจะเห็นพวกมันโหลดใน IE9!
ดร. TJ

7

นี่อาจไม่ใช่ทางออกที่ดีสำหรับคุณ แต่มันก็อาจจะคุ้มค่าที่จะกล่าวถึง

Snapsieเป็นโอเพ่นซอร์สวัตถุActiveXที่ช่วยให้จับภาพและบันทึกภาพหน้าจอของ Internet Explorer เมื่อลงทะเบียนไฟล์ DLL บนไคลเอนต์แล้วคุณควรจะสามารถจับภาพหน้าจอและอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์โดยใช้ JavaScript ข้อเสีย: ต้องลงทะเบียนไฟล์ DLL ที่ลูกค้าและทำงานกับ Internet Explorer เท่านั้น


6

เรามีข้อกำหนดที่คล้ายกันสำหรับการรายงานข้อบกพร่อง เนื่องจากเป็นสถานการณ์ของอินทราเน็ตเราจึงสามารถใช้เบราว์เซอร์แอดออน (เช่นFireshotสำหรับ Firefox และIE สกรีนช็อตสำหรับ Internet Explorer)


3

SnapEngageใช้แอปเพล็ Java (1.5 +) เพื่อให้ภาพหน้าจอเบราว์เซอร์ AFAIK java.awt.Robotควรทำงาน - ผู้ใช้มีเพียงเพื่ออนุญาตให้แอปเพล็ตทำงาน (ครั้งเดียว)

และฉันเพิ่งพบโพสต์เกี่ยวกับมัน:


1

คุณสามารถบรรลุว่าการใช้ HTA และVBScript เพียงเรียกเครื่องมือภายนอกเพื่อทำการจับภาพหน้าจอ ฉันลืมชื่อนี้ แต่ใน Windows Vista มีเครื่องมือทำภาพหน้าจอ คุณไม่จำเป็นต้องติดตั้งเพิ่มเติมสำหรับมันด้วยซ้ำ

สำหรับอัตโนมัติ - ทั้งหมดขึ้นอยู่กับเครื่องมือที่คุณใช้ หากมี API ฉันมั่นใจว่าคุณสามารถเรียกภาพหน้าจอและกระบวนการบันทึกผ่านการโทร Visual Basic สองครั้งโดยที่ผู้ใช้ไม่ทราบว่าคุณทำสิ่งที่คุณทำ

ตั้งแต่ที่คุณพูดถึง HTA ฉันกำลังสมมติว่าคุณอยู่บน Windows และ (อาจ) รู้สภาพแวดล้อมของคุณ (เช่นระบบปฏิบัติการและเวอร์ชั่น) ได้เป็นอย่างดี


เขาพยายามที่จะทำมันเป็นส่วนหนึ่งของเว็บแอพพลิเคชั่นสำหรับการคำนวณของลูกค้าไม่ใช่เพื่อการใช้งานส่วนตัว
mrBorna

1

ฉันพบว่าdom-to-imageทำได้ดีมาก (ดีกว่า html2canvas) ดูคำถามและคำตอบต่อไปนี้: https://stackoverflow.com/a/32776834/207981

คำถามนี้ถามเกี่ยวกับการส่งกลับไปที่เซิร์ฟเวอร์ซึ่งควรจะเป็นไปได้ แต่หากคุณต้องการดาวน์โหลดภาพคุณจะต้องรวมกับFileSaver.jsและหากคุณต้องการดาวน์โหลด zip ด้วย ภาพหลายไฟล์ทั้งหมดที่สร้างขึ้นฝั่งไคลเอ็นต์จะดูที่jszip


0

วิธีการแก้ปัญหาที่ดีสำหรับการถ่ายภาพหน้าจอใน Javascript เป็นหนึ่งโดยhttps://grabz.it

พวกเขามีสกรีนช็อต API ที่ยืดหยุ่นและใช้งานง่ายซึ่งสามารถใช้งานได้โดยแอปพลิเคชัน JS ทุกประเภท

หากคุณต้องการลองตอนแรกคุณควรได้รับรหัสแอป + ลับและSDK ฟรี

จากนั้นในแอปของคุณขั้นตอนการติดตั้งจะเป็น:

// 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>

ภาพหน้าจอสามารถปรับแต่งด้วยที่แตกต่างกันพารามิเตอร์ ตัวอย่างเช่น:

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

นั่นคือทั้งหมดที่ จากนั้นรอสักครู่และภาพจะปรากฏขึ้นที่ด้านล่างของหน้าโดยอัตโนมัติโดยไม่จำเป็นต้องโหลดหน้าซ้ำ

มีฟังก์ชันอื่น ๆ กลไกภาพหน้าจอที่คุณสามารถสำรวจที่นี่

นอกจากนี้ยังเป็นไปได้ที่จะบันทึกภาพหน้าจอในเครื่อง เพื่อที่คุณจะต้องใช้ API ฝั่งเซิร์ฟเวอร์ GrabzIt สำหรับข้อมูลเพิ่มเติมโปรดดูคู่มือรายละเอียดที่นี่


0

หากคุณยินดีที่จะทำในฝั่งเซิร์ฟเวอร์มีตัวเลือกเช่นPhantomJSซึ่งตอนนี้เลิกใช้แล้ว วิธีที่ดีที่สุดที่จะไปคือ Headless Chrome ที่มีPuppeteerบน Node.JS การจับภาพหน้าเว็บโดยใช้ Puppeteer นั้นง่ายมากดังต่อไปนี้:

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();
})();

อย่างไรก็ตามมันต้องการโครมหัวขาดเพื่อให้สามารถทำงานบนเซิร์ฟเวอร์ของคุณซึ่งมีการอ้างอิงบางอย่างและอาจไม่เหมาะกับสภาพแวดล้อมที่ถูก จำกัด (นอกจากนี้หากคุณไม่ได้ใช้ Node.JS คุณอาจต้องจัดการติดตั้ง / เปิดใช้งานเบราว์เซอร์ด้วยตนเอง)

หากคุณยินดีที่จะใช้บริการ SaaS มีตัวเลือกมากมายเช่น



0

ณ วันนี้ เม.ย. 2020 ห้องสมุด GitHub html2Canvas https://github.com/niklasvh/html2canvas

GitHub 20K ดาว | ท่อสีฟ้า: สำเร็จ | ดาวน์โหลด 1.3M / mo |

อ้างถึง: " JavaScript HTML renderer สคริปต์อนุญาตให้คุณใช้" ภาพหน้าจอ "ของหน้าเว็บหรือบางส่วนของมันโดยตรงบนเบราว์เซอร์ผู้ใช้ภาพหน้าจอเป็นไปตาม DOM และอาจไม่แม่นยำ 100% แทนจริง ไม่ได้ทำภาพหน้าจอจริง แต่สร้างภาพหน้าจอตามข้อมูลที่มีอยู่ในหน้า


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.