2008-09-13 168 views
137

是否可以使用JavaScript截圖網頁,然後將其提交回服務器?用JavaScript截取網頁截圖?

我並不關心瀏覽器的安全問題。等等,因爲實施將是HTA。但是有可能嗎?

+0

你能澄清你爲什麼要這樣做嗎?也許有其他的解決方案來截圖。 – andyuk 2008-09-13 10:31:12

+0

我正在尋找讓用戶粗略設計他們想要的東西,一點草圖和一點點拖拽物品。然後,我希望這個「設計」可以用作生產過程中某些部分的說明。這絕對是一個用戶參與的步驟,在這裏沒有任何祕密:) – 2008-09-13 15:08:27

回答

40

我已經通過使用ActiveX控件完成了HTA。在VB6中構建控件以獲取屏幕截圖非常簡單。我不得不使用keybd_event API調用,因爲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節點發送到服務器,然後在服務器端創建屏幕截圖。

+21

+1發送DOM節點到服務器位 – 2010-01-12 05:18:39

+0

我同意與艾倫,這是一個巧妙的方式來潛在地截圖頁面! – Ricket 2010-05-21 00:25:27

+0

什麼是「HTA」? – 2016-05-16 09:51:15

1

您可以使用HTA和VBScript來實現。只需調用一個外部工具來執行屏幕截圖。我忘了名字是什麼,但在Windows上有一個工具來做屏幕截圖。你甚至不需要額外的安裝。

至於自動 - 它完全取決於你使用的工具。如果它有一個API,我相信你可以通過幾個Visual Basic調用觸發屏幕截圖和保存過程,而用戶不知道你做了什麼。

既然你提到過HTA,我假設你在Windows上並且(很可能)非常熟悉你的環境(例如操作系統和版本)。

+0

他試圖做爲跨客戶端計算不是個人使用的網絡應用程序的一部分 – mrBorna 2011-08-16 18:30:19

6

我們對報告錯誤有類似的要求。由於它是針對Intranet的情況,因此我們可以使用瀏覽器插件(如Firefox的Fireshot和Internet的  Explorer的IE Screenshot)。

7

這可能不是您理想的解決方案,但它可能仍值得一提。

Snapsie是一個開放源代碼,ActiveX對象,可以捕獲並保存Internet Explorer屏幕截圖。在客戶端註冊DLL文件後,您應該能夠捕獲屏幕截圖並使用JavaScript將文件上傳到服務器。缺點:它需要在客戶端註冊DLL文件,並且只能與Internet   Explorer一起工作。

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

然後你在服務器端有截圖。

14

我發現的另一個可能的解決方案是http://www.phantomjs.org/,它允許用戶非常輕鬆地截取頁面的截圖以及更多。雖然我對這個問題的原始要求不再有效(不同的工作),但我可能會將PhantomJS整合到未來的項目中。

0

截取Javascript的一個很好的解決方案是由https://grabz.it

他們有一個靈活和簡單易用的屏幕截圖API,可供任何類型的JS應用程序使用。

如果你想嘗試它,首先你應該得到授權app key + secretfree 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> 

截圖可以用定製不同parameters。例如:

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

就這樣。 然後只需稍等片刻,圖像就會自動出現在頁面的底部,而無需重新加載頁面。

截屏機制還有其他功能,您可以探索here

也可以在本地保存屏幕截圖。爲此,您需要使用GrabzIt服務器端API。欲瞭解更多信息,請查看詳細指南here