[javascript] 자바 스크립트로 웹 페이지의 스크린 샷을 찍으시겠습니까?

JavaScript로 웹 페이지의 스크린 샷을 찍어 서버에 다시 제출할 수 있습니까?

브라우저 보안 문제와 관련이 없습니다. HTA를 위한 구현이 될 것입니다 . 그러나 가능합니까?



답변

ActiveX 컨트롤을 사용하여 HTA에 대해이 작업을 수행했습니다. 스크린 샷을 찍기 위해 VB6에서 컨트롤을 작성하는 것은 매우 쉽습니다. SendKeys가 PrintScreen을 수행 할 수 없으므로 keybd_event API 호출을 사용해야했습니다. 그 코드는 다음과 같습니다.

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 노드를 서버로 보낸 다음 서버 측 스크린 샷을 만드는 것입니다.


답변

Google은 Google+에서이 작업을 수행하고 있으며 유능한 개발자가 리버스 엔지니어링하여 http://html2canvas.hertzen.com/을 제작했습니다 . IE에서 작업하려면 http://excanvas.sourceforge.net/ 과 같은 캔버스 지원 라이브러리가 필요합니다 .


답변

내가 발견 한 또 다른 해결책은 http://www.phantomjs.org/ 입니다 . 이 페이지를 사용하면 페이지의 스크린 샷을 훨씬 쉽게 찍을 수 있습니다. 이 질문의 원래 요구 사항이 더 이상 유효하지 않지만 (다른 작업) PhantomJS를 향후 프로젝트에 통합 할 것입니다.


답변

Pounder는 이것이 가능하다면 전체 몸 요소를 canvase로 설정 한 다음 canvas2image?

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


답변

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");

그런 다음 서버 측에 스크린 샷이 있습니다.


답변

이것이 이상적인 솔루션은 아니지만 언급 할 가치가 있습니다.

Snapsie 는 Internet Explorer 스크린 샷을 캡처하고 저장할 수 있는 오픈 소스 ActiveX 개체입니다. DLL 파일이 클라이언트에 등록되면 스크린 샷을 캡처하고 JavaScript를 사용하여 파일을 서버에 업로드 할 수 있어야합니다. 단점 : 클라이언트에서 DLL 파일을 등록해야하며 Internet Explorer에서만 작동합니다.


답변

버그보고에 대해서도 비슷한 요구 사항이있었습니다. 인트라넷 시나리오를 위한 것이기 때문에 Firefox 용 Fireshot 및 Internet Explorer 용 IE Screenshot 과 같은 브라우저 애드온을 사용할 수있었습니다 .