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?
답변
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 과 같은 브라우저 애드온을 사용할 수있었습니다 .