grabzit 2.2.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/grabzit/client.rb +583 -583
  2. metadata +7 -6
@@ -1,583 +1,583 @@
1
- # The public REST API for http://grabz.it
2
- # @example To include the GrabzIt module do the following
3
- # require 'grabzit'
4
- module GrabzIt
5
- require 'digest/md5'
6
- require 'net/http'
7
- require 'rexml/document'
8
- require 'cgi'
9
- require 'uri'
10
- require File.join(File.dirname(__FILE__), 'screenshotstatus')
11
- require File.join(File.dirname(__FILE__), 'cookie')
12
- require File.join(File.dirname(__FILE__), 'watermark')
13
- require File.join(File.dirname(__FILE__), 'exception')
14
-
15
- # This client provides access to the GrabzIt web services
16
- # This API allows you to take screenshot of websites for free and convert them into images, PDF's and tables.
17
- # @example Example usage
18
- # require 'grabzit'
19
- #
20
- # grabzItClient = GrabzIt::Client.new("YOUR APPLICATION KEY", "YOUR APPLICATION SECRET")
21
- # grabzItClient.set_image_options("http://www.google.com")
22
- # grabzItClient.save("http://www.mysite.com/grabzit/handler")
23
- # @version 2.1
24
- # @author GrabzIt
25
- # @see http://grabz.it/api/ruby/ GrabzIt Ruby API
26
- class Client
27
-
28
- WebServicesBaseURL = "http://api.grabz.it/services/"
29
- private_constant :WebServicesBaseURL
30
- TrueString = "True"
31
- private_constant :TrueString
32
-
33
- @@signaturePartOne;
34
- @@signaturePartTwo;
35
- @@startDelay;
36
- @@request;
37
-
38
- # Create a new instance of the Client class in order to access the GrabzIt API.
39
- #
40
- # @param applicationKey [String] your application key
41
- # @param applicationSecret [String] your application secret
42
- # @see http://grabz.it/register.aspx You can get an application key and secret by registering for free with GrabzIt
43
- def initialize(applicationKey, applicationSecret)
44
- @applicationKey = applicationKey
45
- @applicationSecret = applicationSecret
46
- end
47
-
48
- # This method sets the parameters required to turn a online video into a animated GIF
49
- #
50
- # @param url [String] the URL of the online video
51
- # @param customId [String, nil] custom identifier that you can pass through to the animated GIF web service. This will be returned with the callback URL you have specified
52
- # @param width [Integer, 0] the width of the resulting animated GIF in pixels
53
- # @param height [Integer, 0] the height of the resulting animated GIF in pixels
54
- # @param start [Integer, 0] the starting position of the video that should be converted into a animated GIF
55
- # @param duration [Integer, 0] the length in seconds of the video that should be converted into a animated GIF
56
- # @param speed [Float, 0] the speed of the animated GIF from 0.2 to 10 times the original speed
57
- # @param framesPerSecond [Float, 0] the number of frames per second that should be captured from the video. From a minimum of 0.2 to a maximum of 60
58
- # @param repeat [Integer, 0] the number of times to loop the animated GIF. If 0 it will loop forever
59
- # @param reverse [Boolean, false] if true the frames of the animated GIF are reversed
60
- # @param customWaterMarkId [String, nil] add a custom watermark to the animated GIF
61
- # @param quality [Integer, -1] the quality of the image where 0 is poor and 100 excellent. The default is -1 which uses the recommended quality
62
- # @param country [String, nil] request the screenshot from different countries: Default, UK or US
63
- # @return [void]
64
- def set_animation_options(url, customId = nil, width = 0, height = 0, start = 0, duration = 0, speed = 0, framesPerSecond = 0, repeat = 0, reverse = false, customWaterMarkId = nil, quality = -1, country = nil)
65
- @@startDelay = 0;
66
- @@request = WebServicesBaseURL + "takeanimation.ashx?key=" + CGI.escape(nil_check(@applicationKey))+"&url="+CGI.escape(nil_check(url))+"&width="+nil_int_check(width)+"&height="+nil_int_check(height)+"&duration="+nil_int_check(duration)+"&speed="+nil_float_check(speed)+"&start="+nil_int_check(start)+"&customid="+CGI.escape(nil_check(customId))+"&fps="+nil_float_check(framesPerSecond)+"&repeat="+nil_int_check(repeat)+"&customwatermarkid="+CGI.escape(nil_check(customWaterMarkId))+"&reverse="+b_to_str(reverse)+"&country="+CGI.escape(nil_check(country))+"&quality="+nil_int_check(quality)+"&callback="
67
- @@signaturePartOne = @applicationSecret+"|"+nil_check(url)+"|"
68
- @@signaturePartTwo = "|"+nil_int_check(height)+"|"+nil_int_check(width)+"|"+nil_check(customId)+"|"+nil_float_check(framesPerSecond)+"|"+nil_float_check(speed)+"|"+nil_int_check(duration)+"|"+nil_int_check(repeat)+"|"+b_to_str(reverse)+"|"+nil_int_check(start)+"|"+nil_check(customWaterMarkId)+"|"+nil_check(country)+"|"+nil_int_check(quality)
69
- return nil
70
- end
71
-
72
-
73
- # Sets the parameters required to take a screenshot of a web page.
74
- #
75
- # @param url [String] the URL that the screenshot should be made of
76
- # @param customId [String, nil] custom identifier that you can pass through to the screenshot web service. This will be returned with the callback URL you have specified.
77
- # @param browserWidth [Integer, nil] the width of the browser in pixels
78
- # @param browserHeight [Integer, nil] the height of the browser in pixels
79
- # @param width [Integer, nil] the width of the resulting thumbnail in pixels
80
- # @param height [Integer, nil] the height of the resulting thumbnail in pixels
81
- # @param format [String, nil] the format the screenshot should be in: bmp8, bmp16, bmp24, bmp, gif, jpg, png
82
- # @param delay [Integer, nil] the number of milliseconds to wait before taking the screenshot
83
- # @param targetElement [String, nil] the id of the only HTML element in the web page to turn into a screenshot
84
- # @param requestAs [Integer, 0] request the screenshot in different forms: Standard Browser = 0, Mobile Browser = 1, Search Engine = 2 and Fallback Browser = 3
85
- # @param customWaterMarkId [String, nil] add a custom watermark to the image
86
- # @param quality [Integer, -1] the quality of the image where 0 is poor and 100 excellent
87
- # @param country [String, nil] request the screenshot from different countries: Default = "", UK = "UK", US = "US"
88
- # @return [void]
89
- def set_image_options(url, customId = nil, browserWidth = nil, browserHeight = nil, width = nil, height = nil, format = nil, delay = nil, targetElement = nil, requestAs = 0, customWaterMarkId = nil, quality = -1, country = nil)
90
-
91
- if delay == nil
92
- @@startDelay = 0
93
- else
94
- @@startDelay = delay
95
- end
96
-
97
- @@request = WebServicesBaseURL + "takepicture.ashx?key="+CGI.escape(nil_check(@applicationKey))+"&url="+CGI.escape(nil_check(url))+"&width="+nil_int_check(width)+"&height="+nil_int_check(height)+"&format="+CGI.escape(nil_check(format))+"&bwidth="+nil_int_check(browserWidth)+"&bheight="+nil_int_check(browserHeight)+"&customid="+CGI.escape(nil_check(customId))+"&delay="+nil_int_check(delay)+"&target="+CGI.escape(nil_check(targetElement))+"&customwatermarkid="+CGI.escape(nil_check(customWaterMarkId))+"&requestmobileversion="+nil_int_check(requestAs)+"&country="+CGI.escape(nil_check(country))+"&quality="+nil_int_check(quality)+"&callback="
98
- @@signaturePartOne = nil_check(@applicationSecret)+"|"+nil_check(url)+"|"
99
- @@signaturePartTwo = "|"+nil_check(format)+"|"+nil_int_check(height)+"|"+nil_int_check(width)+"|"+nil_int_check(browserHeight)+"|"+nil_int_check(browserWidth)+"|"+nil_check(customId)+"|"+nil_int_check(delay)+"|"+nil_check(targetElement)+"|"+nil_check(customWaterMarkId)+"|"+nil_int_check(requestAs)+"|"+nil_check(country)+"|"+nil_int_check(quality)
100
-
101
- return nil
102
- end
103
-
104
- # Sets the parameters required to extract one or more tables from a web page.
105
- #
106
- # @param url [String] the URL that the should be used to extract tables
107
- # @param customId [String, nil] a custom identifier that you can pass through to the web service. This will be returned with the callback URL you have specified.
108
- # @param tableNumberToInclude [Integer, 1] the index of the table to be converted, were all tables in a web page are ordered from the top of the web page to bottom
109
- # @param format [String, 'csv'] the format the table should be in: csv, xlsx
110
- # @param includeHeaderNames [Boolean, true] if true header names will be included in the table
111
- # @param includeAllTables [Boolean, true] if true all table on the web page will be extracted with each table appearing in a separate spreadsheet sheet. Only available with the XLSX format.
112
- # @param targetElement [String, nil] the id of the only HTML element in the web page that should be used to extract tables from
113
- # @param requestAs [Integer, 0] request the screenshot in different forms: Standard Browser = 0, Mobile Browser = 1, Search Engine = 2 and Fallback Browser = 3
114
- # @param country [String, nil] request the screenshot from different countries: Default = "", UK = "UK", US = "US"
115
- # @return [void]
116
- def set_table_options(url, customId = nil, tableNumberToInclude = 1, format = 'csv', includeHeaderNames = true, includeAllTables = false, targetElement = nil, requestAs = 0, country = nil)
117
- @@startDelay = 0
118
-
119
- @@request = WebServicesBaseURL + "taketable.ashx?key=" + CGI.escape(nil_check(@applicationKey))+"&url="+CGI.escape(url)+"&includeAllTables="+b_to_str(includeAllTables)+"&includeHeaderNames="+b_to_str(includeHeaderNames)+"&format="+CGI.escape(nil_check(format))+"&tableToInclude="+nil_int_check(tableNumberToInclude)+"&customid="+CGI.escape(nil_check(customId))+"&target="+CGI.escape(nil_check(targetElement))+"&requestmobileversion="+nil_int_check(requestAs)+"&country="+CGI.escape(nil_check(country))+"&callback="
120
- @@signaturePartOne = nil_check(@applicationSecret)+"|"+nil_check(url)+"|"
121
- @@signaturePartTwo = "|"+nil_check(customId)+"|"+nil_int_check(tableNumberToInclude)+"|"+b_to_str(includeAllTables)+"|"+b_to_str(includeHeaderNames)+"|"+nil_check(targetElement)+"|"+nil_check(format)+"|"+nil_int_check(requestAs)+"|"+nil_check(country)
122
-
123
- return nil
124
- end
125
-
126
- # Sets the parameters required to convert a web page into a PDF.
127
- #
128
- # @param url url [String] the URL that the should be converted into a pdf
129
- # @param customId [String, nil] a custom identifier that you can pass through to the web service. This will be returned with the callback URL you have specified.
130
- # @param includeBackground [Boolean, true] if true the background of the web page should be included in the screenshot
131
- # @param pagesize [String, 'A4'] the page size of the PDF to be returned: 'A3', 'A4', 'A5', 'B3', 'B4', 'B5', 'Letter'.
132
- # @param orientation [String, 'Portrait'] the orientation of the PDF to be returned: 'Landscape' or 'Portrait'
133
- # @param includeLinks [Boolean, true] true if links should be included in the PDF
134
- # @param includeOutline [Boolean, false] True if the PDF outline should be included
135
- # @param title [String, nil] provide a title to the PDF document
136
- # @param coverURL [String, nil] the URL of a web page that should be used as a cover page for the PDF
137
- # @param marginTop [Integer, 10] the margin that should appear at the top of the PDF document page
138
- # @param marginLeft [Integer, 10] the margin that should appear at the left of the PDF document page
139
- # @param marginBottom [Integer, 10] the margin that should appear at the bottom of the PDF document page
140
- # @param marginRight [Integer, 10] the margin that should appear at the right of the PDF document
141
- # @param delay [Integer, nil] the number of milliseconds to wait before taking the screenshot
142
- # @param requestAs [Integer, 0] request the screenshot in different forms: Standard Browser = 0, Mobile Browser = 1, Search Engine = 2 and Fallback Browser = 3
143
- # @param customWaterMarkId [String, nil] add a custom watermark to each page of the PDF document
144
- # @param quality [Integer, -1] the quality of the PDF where 0 is poor and 100 excellent
145
- # @param country [String, nil] request the screenshot from different countries: Default = "", UK = "UK", US = "US"
146
- # @return [void]
147
- def set_pdf_options(url, customId = nil, includeBackground = true, pagesize = 'A4', orientation = 'Portrait', includeLinks = true, includeOutline = false, title = nil, coverURL = nil, marginTop = 10, marginLeft = 10, marginBottom = 10, marginRight = 10, delay = nil, requestAs = 0, customWaterMarkId = nil, quality = -1, country = nil)
148
- pagesize = nil_check(pagesize).upcase
149
- $orientation = nil_check(orientation).capitalize
150
-
151
- if delay == nil
152
- @@startDelay = 0
153
- else
154
- @@startDelay = delay
155
- end
156
-
157
- @@request = WebServicesBaseURL + "takepdf.ashx?key=" + CGI.escape(nil_check(@applicationKey))+"&url="+CGI.escape(nil_check(url))+"&background="+b_to_str(includeBackground)+"&pagesize="+pagesize+"&orientation="+orientation+"&customid="+CGI.escape(nil_check(customId))+"&customwatermarkid="+CGI.escape(nil_check(customWaterMarkId))+"&includelinks="+b_to_str(includeLinks)+"&includeoutline="+b_to_str(includeOutline)+"&title="+CGI.escape(nil_check(title))+"&coverurl="+CGI.escape(nil_check(coverURL))+"&mleft="+nil_int_check(marginLeft)+"&mright="+nil_int_check(marginRight)+"&mtop="+nil_int_check(marginTop)+"&mbottom="+nil_int_check(marginBottom)+"&delay="+nil_int_check(delay)+"&requestmobileversion="+nil_int_check(requestAs)+"&country="+CGI.escape(nil_check(country))+"&quality="+nil_int_check(quality)+"&callback="
158
-
159
- @@signaturePartOne = nil_check(@applicationSecret)+"|"+nil_check(url)+"|"
160
- @@signaturePartTwo = "|"+nil_check(customId)+"|"+b_to_str(includeBackground)+"|"+pagesize +"|"+orientation+"|"+nil_check(customWaterMarkId)+"|"+b_to_str(includeLinks)+"|"+b_to_str(includeOutline)+"|"+nil_check(title)+"|"+nil_check(coverURL)+"|"+nil_int_check(marginTop)+"|"+nil_int_check(marginLeft)+"|"+nil_int_check(marginBottom)+"|"+nil_int_check(marginRight)+"|"+nil_int_check(delay)+"|"+nil_int_check(requestAs)+"|"+nil_check(country)+"|"+nil_int_check(quality)
161
-
162
- return nil
163
- end
164
-
165
- # Calls the GrabzIt web service to take the screenshot
166
- #
167
- # The handler will be passed a URL with the following query string parameters:
168
- # - message (is any error message associated with the screenshot)
169
- # - customId (is a custom id you may have specified in the {#set_image_options}, {#set_table_options} or {#set_pdf_options} method)
170
- # - id (is the unique id of the screenshot which can be used to retrieve the screenshot with the {#get_result} method)
171
- # - filename (is the filename of the screenshot)
172
- # - format (is the format of the screenshot)
173
- # @note This is the recommended method of saving a screenshot
174
- # @param callBackURL [String, nil] the handler the GrabzIt web service should call after it has completed its work
175
- # @return [String] the unique identifier of the screenshot. This can be used to get the screenshot with the {#get_result} method
176
- # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
177
- def save(callBackURL = nil)
178
- if @@signaturePartOne == nil && @@signaturePartTwo == nil && @@request == nil
179
- raise GrabzItException.new("No screenshot parameters have been set.", GrabzItException::PARAMETER_MISSING_PARAMETERS)
180
- end
181
-
182
- sig = encode(@@signaturePartOne+nil_check(callBackURL)+@@signaturePartTwo)
183
- currentRequest = @@request
184
-
185
- currentRequest += CGI.escape(nil_check(callBackURL))+"&sig="+sig
186
-
187
- return get_result_value(get(currentRequest), "ID")
188
- end
189
-
190
- # Calls the GrabzIt web service to take the screenshot and saves it to the target path provided. if no target path is provided
191
- # it returns the screenshot byte data.
192
- #
193
- # @note Warning, this is a SYNCHONOUS method and can take up to 5 minutes before a response
194
- # @param saveToFile [String, nil] the file path that the screenshot should saved to.
195
- # @example Synchronously save the screenshot to test.jpg
196
- # save_to('images/test.jpg')
197
- # @raise [RuntimeError] if the screenshot cannot be saved a RuntimeError will be raised that will contain an explanation
198
- # @return [Boolean] returns the true if it is successfully saved to a file, otherwise if a target path is not provided it returns the screenshot's byte data.
199
- def save_to(saveToFile = nil)
200
- id = save()
201
-
202
- if id == nil || id == ""
203
- return false
204
- end
205
-
206
- #Wait for it to be possibly ready
207
- sleep((@@startDelay / 1000) + 3)
208
-
209
- #Wait for it to be ready.
210
- while true do
211
- status = get_status(id)
212
-
213
- if !status.cached && !status.processing
214
- raise GrabzItException.new("The screenshot did not complete with the error: " + status.Message, GrabzItException::RENDERING_ERROR)
215
- break
216
- elsif status.cached
217
- result = get_result(id)
218
- if !result
219
- raise GrabzItException.new("The screenshot could not be found on GrabzIt.", GrabzItException::RENDERING_MISSING_SCREENSHOT)
220
- break
221
- end
222
-
223
- if saveToFile == nil || saveToFile == ""
224
- return result
225
- end
226
-
227
- screenshot = File.new(saveToFile, "wb")
228
- screenshot.write(result)
229
- screenshot.close
230
-
231
- break
232
- end
233
-
234
- sleep(3)
235
- end
236
-
237
- return true
238
- end
239
-
240
- # Get the current status of a GrabzIt screenshot
241
- #
242
- # @param id [String] the id of the screenshot
243
- # @return [ScreenShotStatus] a object representing the status of the screenshot
244
- def get_status(id)
245
-
246
- if id == nil || id == ""
247
- return nil
248
- end
249
-
250
- result = get(WebServicesBaseURL + "getstatus.ashx?id=" + nil_check(id))
251
-
252
- doc = REXML::Document.new(result)
253
-
254
- processing = doc.root.elements["Processing"].text()
255
- cached = doc.root.elements["Cached"].text()
256
- expired = doc.root.elements["Expired"].text()
257
- message = doc.root.elements["Message"].text()
258
-
259
- return ScreenShotStatus.new((processing == TrueString), (cached == TrueString), (expired == TrueString), message)
260
- end
261
-
262
- # This method returns the screenshot itself. If nothing is returned then something has gone wrong or the screenshot is not ready yet
263
- #
264
- # @param id [String] the id of the screenshot
265
- # @return [Object] returns the screenshot
266
- # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
267
- def get_result(id)
268
- if id == nil || id == ""
269
- return nil
270
- end
271
-
272
- return get(WebServicesBaseURL + "getfile.ashx?id=" + nil_check(id))
273
- end
274
-
275
- # Get all the cookies that GrabzIt is using for a particular domain. This may include your user set cookies as well
276
- #
277
- # @param domain [String] the domain to return cookies for
278
- # @return [Array<Cookie>] an array of cookies
279
- # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
280
- def get_cookies(domain)
281
- sig = encode(nil_check(@applicationSecret)+"|"+nil_check(domain))
282
-
283
- qs = "key=" +CGI.escape(nil_check(@applicationKey))+"&domain="+CGI.escape(nil_check(domain))+"&sig="+sig
284
-
285
- result = get(WebServicesBaseURL + "getcookies.ashx?" + qs)
286
-
287
- doc = REXML::Document.new(result)
288
-
289
- check_for_exception(doc)
290
-
291
- cookies = Array.new
292
-
293
- xml_cookies = doc.elements.to_a("//WebResult/Cookies/Cookie")
294
- xml_cookies.each do |cookie|
295
- expires = nil
296
- if cookie.elements["Expires"] != nil
297
- expires = cookie.elements["Expires"].text
298
- end
299
- grabzItCookie = GrabzIt::Cookie.new(cookie.elements["Name"].text, cookie.elements["Domain"].text, cookie.elements["Value"].text, cookie.elements["Path"].text, (cookie.elements["HttpOnly"].text == TrueString), expires, cookie.elements["Type"].text)
300
- cookies << grabzItCookie
301
- end
302
-
303
- return cookies
304
- end
305
-
306
- # Sets a new custom cookie on GrabzIt, if the custom cookie has the same name and domain as a global cookie the global
307
- #
308
- # cookie is overridden
309
- # @note This can be useful if a websites functionality is controlled by cookies
310
- # @param name [String] the name of the cookie to set
311
- # @param domain [String] the domain of the website to set the cookie for
312
- # @param value [String, ''] the value of the cookie
313
- # @param path [String, '/'] the website path the cookie relates to
314
- # @param httponly [Boolean, false] is the cookie only used on HTTP
315
- # @param expires [String, ''] when the cookie expires. Pass a nil value if it does not expire
316
- # @return [Boolean] returns true if the cookie was successfully set
317
- # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
318
- def set_cookie(name, domain, value = "", path = "/", httponly = false, expires = "")
319
- sig = encode(nil_check(@applicationSecret)+"|"+nil_check(name)+"|"+nil_check(domain)+"|"+nil_check(value)+"|"+nil_check(path)+"|"+b_to_str(httponly)+"|"+nil_check(expires)+"|0")
320
-
321
- qs = "key=" +CGI.escape(nil_check(@applicationKey))+"&domain="+CGI.escape(nil_check(domain))+"&name="+CGI.escape(nil_check(name))+"&value="+CGI.escape(nil_check(value))+"&path="+CGI.escape(nil_check(path))+"&httponly="+b_to_str(httponly)+"&expires="+CGI.escape(nil_check(expires))+"&sig="+sig
322
-
323
- return (get_result_value(get(WebServicesBaseURL + "setcookie.ashx?" + qs), "Result") == TrueString)
324
- end
325
-
326
- # Delete a custom cookie or block a global cookie from being used
327
- #
328
- # @param name [String] the name of the cookie to delete
329
- # @param domain [String] the website the cookie belongs to
330
- # @return [Boolean] returns true if the cookie was successfully set
331
- # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
332
- def delete_cookie(name, domain)
333
- sig = encode(nil_check(@applicationSecret)+"|"+nil_check(name)+"|"+nil_check(domain)+"|1")
334
-
335
- qs = "key=" + CGI.escape(nil_check(@applicationKey))+"&domain="+CGI.escape(nil_check(domain))+"&name="+CGI.escape(nil_check(name))+"&delete=1&sig="+sig
336
-
337
- return (get_result_value(get(WebServicesBaseURL + "setcookie.ashx?" + qs), "Result") == TrueString)
338
- end
339
-
340
- # Get your uploaded custom watermark
341
- #
342
- # @param identifier [String, nil] the identifier of a particular custom watermark you want to view
343
- # @return [WaterMark] the watermark with the specified identifier
344
- def get_watermark(identifier)
345
- watermarks = get_watermarks(identifier)
346
- if watermarks.length == 1
347
- return watermarks[0];
348
- end
349
-
350
- return nil
351
- end
352
-
353
- # Get your uploaded custom watermarks
354
- #
355
- # @return [Array<WaterMark>] an array of uploaded watermarks
356
- def get_watermarks()
357
- return get_watermarks(nil)
358
- end
359
-
360
- # Add a new custom watermark
361
- #
362
- # @param identifier [String] the identifier you want to give the custom watermark. It is important that this identifier is unique.
363
- # @param path [String] the absolute path of the watermark on your server. For instance C:/watermark/1.png
364
- # @param xpos [Integer] the horizontal position you want the screenshot to appear at: Left = 0, Center = 1, Right = 2
365
- # @param ypos [Integer] the vertical position you want the screenshot to appear at: Top = 0, Middle = 1, Bottom = 2
366
- # @return [Boolean] returns true if the watermark was successfully set
367
- # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
368
- def add_watermark(identifier, path, xpos, ypos)
369
- if !File.file?(path)
370
- raise "File: " + path + " does not exist"
371
- end
372
- sig = encode(nil_check(@applicationSecret)+"|"+nil_check(identifier)+"|"+nil_int_check(xpos)+"|"+nil_int_check(ypos));
373
-
374
- boundary = '--------------------------'+Time.now.to_f.to_s
375
-
376
- url = "http://grabz.it/services/addwatermark.ashx"
377
- uri = URI.parse(url)
378
-
379
- file = File.open(path, "rb")
380
- data = file.read
381
-
382
- post_body = Array.new
383
- post_body << "\r\n--"+boundary+"\r\n"
384
- post_body << "Content-Disposition: form-data; name=\"watermark\"; filename=\""+File.basename(path)+"\"\r\nContent-Type: image/jpeg\r\n\r\n"
385
- post_body << data
386
- post_body << "\r\n--"+boundary+"\r\n"
387
-
388
- post_body << "Content-Disposition: form-data; name=\"key\"\r\n\r\n"
389
- post_body << CGI.escape(nil_check(@applicationKey))
390
- post_body << "\r\n--"+boundary+"\r\n"
391
-
392
- post_body << "Content-Disposition: form-data; name=\"identifier\"\r\n\r\n"
393
- post_body << CGI.escape(nil_check(identifier))
394
- post_body << "\r\n--"+boundary+"\r\n"
395
-
396
- post_body << "Content-Disposition: form-data; name=\"xpos\"\r\n\r\n"
397
- post_body << nil_check(xpos)
398
- post_body << "\r\n--"+boundary+"\r\n"
399
-
400
- post_body << "Content-Disposition: form-data; name=\"ypos\"\r\n\r\n"
401
- post_body << nil_check(ypos)
402
- post_body << "\r\n--"+boundary+"\r\n"
403
-
404
- post_body << "Content-Disposition: form-data; name=\"sig\"\r\n\r\n"
405
- post_body << sig
406
- post_body << "\r\n--"+boundary+"--\r\n"
407
-
408
- request = Net::HTTP::Post.new(url)
409
- request.content_type = "multipart/form-data, boundary="+boundary
410
- request.body = post_body.join
411
-
412
- response = Net::HTTP.new(uri.host, uri.port).start {|http| http.request(request) }
413
- response_check(response)
414
-
415
- return (get_result_value(response.body(), "Result") == TrueString)
416
- end
417
-
418
- # Delete a custom watermark
419
- #
420
- # @param identifier [String] the identifier of the custom watermark you want to delete
421
- # @return [Boolean] returns true if the watermark was successfully deleted
422
- # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
423
- def delete_watermark(identifier)
424
- sig = encode(nil_check(@applicationSecret)+"|"+nil_check(identifier))
425
-
426
- qs = "key=" +CGI.escape(nil_check(@applicationKey))+"&identifier="+CGI.escape(nil_check(identifier))+"&sig="+sig
427
-
428
- return (get_result_value(get(WebServicesBaseURL + "deletewatermark.ashx?" + qs), "Result") == TrueString)
429
- end
430
-
431
- # This method calls the GrabzIt web service to take the screenshot.
432
- #
433
- # @param url [String] the URL that the screenshot should be made of
434
- # @param callback [String, nil] the handler the GrabzIt web service should call after it has completed its work
435
- # @param customId [String, nil] custom identifier that you can pass through to the screenshot webservice. This will be returned with the callback URL you have specified.
436
- # @param browserWidth [Integer, nil] the width of the browser in pixels
437
- # @param browserHeight [Integer, nil] the height of the browser in pixels
438
- # @param width [Integer, nil] the width of the resulting thumbnail in pixels
439
- # @param height [Integer, nil] the height of the resulting thumbnail in pixels
440
- # @param format [String, nil] the format the screenshot should be in: bmp8, bmp16, bmp24, bmp, gif, jpg, png
441
- # @param delay [Integer, nil] the number of milliseconds to wait before taking the screenshot
442
- # @param targetElement [String, nil] the id of the only HTML element in the web page to turn into a screenshot
443
- # @return [String] returns the unique identifier of the screenshot. This can be used to get the screenshot with the get_result method
444
- # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
445
- # @deprecated Use {#set_image_options} and {#save} instead.
446
- def take_picture(url, callback = nil, customId = nil, browserWidth = nil, browserHeight = nil, width = nil, height = nil, format = nil, delay = nil, targetElement = nil)
447
- set_image_options(url, customId, browserWidth, browserHeight, width, height, format, delay, targetElement)
448
- return save(callback)
449
- end
450
-
451
- # This method takes the screenshot and then saves the result to a file. WARNING this method is synchronous
452
- #
453
- # @param url [String] the URL that the screenshot should be made of
454
- # @param saveToFile [String] the file path that the screenshot should saved to
455
- # @param browserWidth [Integer, nil] the width of the browser in pixels
456
- # @param browserHeight [Integer, nil] the height of the browser in pixels
457
- # @param width [Integer, nil] the width of the resulting thumbnail in pixels
458
- # @param height [Integer, nil] the height of the resulting thumbnail in pixels
459
- # @param format [String, nil] the format the screenshot should be in: bmp8, bmp16, bmp24, bmp, gif, jpg, png
460
- # @param delay [Integer, nil] the number of milliseconds to wait before taking the screenshot
461
- # @param targetElement [String, nil] the id of the only HTML element in the web page to turn into a screenshot
462
- # @example Synchronously save the screenshot to test.jpg
463
- # save_picture('images/test.jpg')
464
- # @return [Boolean] returns the true if it is successfull otherwise it throws an exception
465
- # @raise [RuntimeError] if the screenshot cannot be saved a RuntimeError will be raised that will contain an explanation
466
- # @deprecated Use {#set_image_options} and {#save_to} instead.
467
- def save_picture(url, saveToFile, browserWidth = nil, browserHeight = nil, width = nil, height = nil, format = nil, delay = nil, targetElement = nil)
468
- set_image_options(url, nil, browserWidth, browserHeight, width, height, format, delay, targetElement)
469
- return save_to(saveToFile)
470
- end
471
-
472
- # This method returns the image itself. If nothing is returned then something has gone wrong or the image is not ready yet.
473
- #
474
- # @param id [String] the id of the screenshot
475
- # @return [Object] returns the screenshot
476
- # @deprecated Use {#get_result} instead.
477
- def get_picture(id)
478
- return get_result(id)
479
- end
480
-
481
- private
482
- def get_watermarks(identifier = nil)
483
- sig = encode(nil_check(@applicationSecret)+"|"+nil_check(identifier))
484
-
485
- qs = "key=" +CGI.escape(nil_check(@applicationKey))+"&identifier="+CGI.escape(nil_check(identifier))+"&sig="+sig
486
-
487
- result = get(WebServicesBaseURL + "getwatermarks.ashx?" + qs)
488
-
489
- doc = REXML::Document.new(result)
490
-
491
- check_for_exception(doc)
492
-
493
- watermarks = Array.new
494
-
495
- xml_watemarks = doc.elements.to_a("//WebResult/WaterMarks/WaterMark")
496
- xml_watemarks.each do |watemark|
497
- grabzItWaterMark = GrabzIt::WaterMark.new(watemark.elements["Identifier"].text, watemark.elements["XPosition"].text.to_i, watemark.elements["YPosition"].text.to_i, watemark.elements["Format"].text)
498
- watermarks << grabzItWaterMark
499
- end
500
-
501
- return watermarks
502
- end
503
-
504
- private
505
- def get(url)
506
- uri = URI.parse(url)
507
- response = Net::HTTP.start(uri.host, uri.port) { |http| http.get(uri.request_uri) }
508
- response_check(response)
509
- return response.body
510
- end
511
-
512
- private
513
- def response_check(response)
514
- statusCode = response.code.to_i
515
- if statusCode == 403
516
- raise GrabzItException.new(response.body, GrabzItException::NETWORK_DDOS_ATTACK)
517
- elsif statusCode >= 400
518
- raise GrabzItException.new("A network error occured when connecting to the GrabzIt servers.", GrabzItException::NETWORK_GENERAL_ERROR)
519
- end
520
- end
521
-
522
- private
523
- def b_to_str(bValue)
524
- if bValue
525
- return 1.to_s
526
- end
527
- return 0.to_s
528
- end
529
-
530
- private
531
- def nil_check(param)
532
- if param == nil
533
- return ""
534
- end
535
- return param
536
- end
537
-
538
- private
539
- def nil_int_check(param)
540
- return param.to_i.to_s
541
- end
542
-
543
- private
544
- def nil_float_check(param)
545
- val = param.to_f
546
- if ((val % 1) == 0)
547
- return val.to_i.to_s
548
- end
549
-
550
- return val.to_s
551
- end
552
-
553
- private
554
- def check_for_exception(doc)
555
- if (doc == nil)
556
- return
557
- end
558
-
559
- message = doc.root.elements["Message"].text()
560
- code = doc.root.elements["Code"].text()
561
-
562
- if message != nil
563
- raise GrabzItException.new(message, code)
564
- end
565
- end
566
-
567
- private
568
- def encode(text)
569
- return Digest::MD5.hexdigest(text.encode('ascii', {:invalid => :replace, :undef => :replace, :replace => '?'}))
570
- end
571
-
572
- private
573
- def get_result_value(result, field)
574
- doc = REXML::Document.new(result)
575
-
576
- value = doc.root.elements[field].text()
577
-
578
- check_for_exception(doc)
579
-
580
- return value
581
- end
582
- end
583
- end
1
+ # The public REST API for http://grabz.it
2
+ # @example To include the GrabzIt module do the following
3
+ # require 'grabzit'
4
+ module GrabzIt
5
+ require 'digest/md5'
6
+ require 'net/http'
7
+ require 'rexml/document'
8
+ require 'cgi'
9
+ require 'uri'
10
+ require File.join(File.dirname(__FILE__), 'screenshotstatus')
11
+ require File.join(File.dirname(__FILE__), 'cookie')
12
+ require File.join(File.dirname(__FILE__), 'watermark')
13
+ require File.join(File.dirname(__FILE__), 'exception')
14
+
15
+ # This client provides access to the GrabzIt web services
16
+ # This API allows you to take screenshot of websites for free and convert them into images, PDF's and tables.
17
+ # @example Example usage
18
+ # require 'grabzit'
19
+ #
20
+ # grabzItClient = GrabzIt::Client.new("YOUR APPLICATION KEY", "YOUR APPLICATION SECRET")
21
+ # grabzItClient.set_image_options("http://www.google.com")
22
+ # grabzItClient.save("http://www.mysite.com/grabzit/handler")
23
+ # @version 2.1
24
+ # @author GrabzIt
25
+ # @see http://grabz.it/api/ruby/ GrabzIt Ruby API
26
+ class Client
27
+
28
+ WebServicesBaseURL = "http://api.grabz.it/services/"
29
+ private_constant :WebServicesBaseURL
30
+ TrueString = "True"
31
+ private_constant :TrueString
32
+
33
+ @@signaturePartOne;
34
+ @@signaturePartTwo;
35
+ @@startDelay;
36
+ @@request;
37
+
38
+ # Create a new instance of the Client class in order to access the GrabzIt API.
39
+ #
40
+ # @param applicationKey [String] your application key
41
+ # @param applicationSecret [String] your application secret
42
+ # @see http://grabz.it/register.aspx You can get an application key and secret by registering for free with GrabzIt
43
+ def initialize(applicationKey, applicationSecret)
44
+ @applicationKey = applicationKey
45
+ @applicationSecret = applicationSecret
46
+ end
47
+
48
+ # This method sets the parameters required to turn a online video into a animated GIF
49
+ #
50
+ # @param url [String] the URL of the online video
51
+ # @param customId [String, nil] custom identifier that you can pass through to the animated GIF web service. This will be returned with the callback URL you have specified
52
+ # @param width [Integer, 0] the width of the resulting animated GIF in pixels
53
+ # @param height [Integer, 0] the height of the resulting animated GIF in pixels
54
+ # @param start [Integer, 0] the starting position of the video that should be converted into a animated GIF
55
+ # @param duration [Integer, 0] the length in seconds of the video that should be converted into a animated GIF
56
+ # @param speed [Float, 0] the speed of the animated GIF from 0.2 to 10 times the original speed
57
+ # @param framesPerSecond [Float, 0] the number of frames per second that should be captured from the video. From a minimum of 0.2 to a maximum of 60
58
+ # @param repeat [Integer, 0] the number of times to loop the animated GIF. If 0 it will loop forever
59
+ # @param reverse [Boolean, false] if true the frames of the animated GIF are reversed
60
+ # @param customWaterMarkId [String, nil] add a custom watermark to the animated GIF
61
+ # @param quality [Integer, -1] the quality of the image where 0 is poor and 100 excellent. The default is -1 which uses the recommended quality
62
+ # @param country [String, nil] request the screenshot from different countries: Default, UK or US
63
+ # @return [void]
64
+ def set_animation_options(url, customId = nil, width = 0, height = 0, start = 0, duration = 0, speed = 0, framesPerSecond = 0, repeat = 0, reverse = false, customWaterMarkId = nil, quality = -1, country = nil)
65
+ @@startDelay = 0;
66
+ @@request = WebServicesBaseURL + "takeanimation.ashx?key=" + CGI.escape(nil_check(@applicationKey))+"&url="+CGI.escape(nil_check(url))+"&width="+nil_int_check(width)+"&height="+nil_int_check(height)+"&duration="+nil_int_check(duration)+"&speed="+nil_float_check(speed)+"&start="+nil_int_check(start)+"&customid="+CGI.escape(nil_check(customId))+"&fps="+nil_float_check(framesPerSecond)+"&repeat="+nil_int_check(repeat)+"&customwatermarkid="+CGI.escape(nil_check(customWaterMarkId))+"&reverse="+b_to_str(reverse)+"&country="+CGI.escape(nil_check(country))+"&quality="+nil_int_check(quality)+"&callback="
67
+ @@signaturePartOne = @applicationSecret+"|"+nil_check(url)+"|"
68
+ @@signaturePartTwo = "|"+nil_int_check(height)+"|"+nil_int_check(width)+"|"+nil_check(customId)+"|"+nil_float_check(framesPerSecond)+"|"+nil_float_check(speed)+"|"+nil_int_check(duration)+"|"+nil_int_check(repeat)+"|"+b_to_str(reverse)+"|"+nil_int_check(start)+"|"+nil_check(customWaterMarkId)+"|"+nil_check(country)+"|"+nil_int_check(quality)
69
+ return nil
70
+ end
71
+
72
+
73
+ # Sets the parameters required to take a screenshot of a web page.
74
+ #
75
+ # @param url [String] the URL that the screenshot should be made of
76
+ # @param customId [String, nil] custom identifier that you can pass through to the screenshot web service. This will be returned with the callback URL you have specified.
77
+ # @param browserWidth [Integer, nil] the width of the browser in pixels
78
+ # @param browserHeight [Integer, nil] the height of the browser in pixels
79
+ # @param width [Integer, nil] the width of the resulting thumbnail in pixels
80
+ # @param height [Integer, nil] the height of the resulting thumbnail in pixels
81
+ # @param format [String, nil] the format the screenshot should be in: bmp8, bmp16, bmp24, bmp, gif, jpg, png
82
+ # @param delay [Integer, nil] the number of milliseconds to wait before taking the screenshot
83
+ # @param targetElement [String, nil] the id of the only HTML element in the web page to turn into a screenshot
84
+ # @param requestAs [Integer, 0] request the screenshot in different forms: Standard Browser = 0, Mobile Browser = 1, Search Engine = 2 and Fallback Browser = 3
85
+ # @param customWaterMarkId [String, nil] add a custom watermark to the image
86
+ # @param quality [Integer, -1] the quality of the image where 0 is poor and 100 excellent
87
+ # @param country [String, nil] request the screenshot from different countries: Default = "", UK = "UK", US = "US"
88
+ # @return [void]
89
+ def set_image_options(url, customId = nil, browserWidth = nil, browserHeight = nil, width = nil, height = nil, format = nil, delay = nil, targetElement = nil, requestAs = 0, customWaterMarkId = nil, quality = -1, country = nil)
90
+
91
+ if delay == nil
92
+ @@startDelay = 0
93
+ else
94
+ @@startDelay = delay
95
+ end
96
+
97
+ @@request = WebServicesBaseURL + "takepicture.ashx?key="+CGI.escape(nil_check(@applicationKey))+"&url="+CGI.escape(nil_check(url))+"&width="+nil_int_check(width)+"&height="+nil_int_check(height)+"&format="+CGI.escape(nil_check(format))+"&bwidth="+nil_int_check(browserWidth)+"&bheight="+nil_int_check(browserHeight)+"&customid="+CGI.escape(nil_check(customId))+"&delay="+nil_int_check(delay)+"&target="+CGI.escape(nil_check(targetElement))+"&customwatermarkid="+CGI.escape(nil_check(customWaterMarkId))+"&requestmobileversion="+nil_int_check(requestAs)+"&country="+CGI.escape(nil_check(country))+"&quality="+nil_int_check(quality)+"&callback="
98
+ @@signaturePartOne = nil_check(@applicationSecret)+"|"+nil_check(url)+"|"
99
+ @@signaturePartTwo = "|"+nil_check(format)+"|"+nil_int_check(height)+"|"+nil_int_check(width)+"|"+nil_int_check(browserHeight)+"|"+nil_int_check(browserWidth)+"|"+nil_check(customId)+"|"+nil_int_check(delay)+"|"+nil_check(targetElement)+"|"+nil_check(customWaterMarkId)+"|"+nil_int_check(requestAs)+"|"+nil_check(country)+"|"+nil_int_check(quality)
100
+
101
+ return nil
102
+ end
103
+
104
+ # Sets the parameters required to extract one or more tables from a web page.
105
+ #
106
+ # @param url [String] the URL that the should be used to extract tables
107
+ # @param customId [String, nil] a custom identifier that you can pass through to the web service. This will be returned with the callback URL you have specified.
108
+ # @param tableNumberToInclude [Integer, 1] the index of the table to be converted, were all tables in a web page are ordered from the top of the web page to bottom
109
+ # @param format [String, 'csv'] the format the table should be in: csv, xlsx
110
+ # @param includeHeaderNames [Boolean, true] if true header names will be included in the table
111
+ # @param includeAllTables [Boolean, true] if true all table on the web page will be extracted with each table appearing in a separate spreadsheet sheet. Only available with the XLSX format.
112
+ # @param targetElement [String, nil] the id of the only HTML element in the web page that should be used to extract tables from
113
+ # @param requestAs [Integer, 0] request the screenshot in different forms: Standard Browser = 0, Mobile Browser = 1, Search Engine = 2 and Fallback Browser = 3
114
+ # @param country [String, nil] request the screenshot from different countries: Default = "", UK = "UK", US = "US"
115
+ # @return [void]
116
+ def set_table_options(url, customId = nil, tableNumberToInclude = 1, format = 'csv', includeHeaderNames = true, includeAllTables = false, targetElement = nil, requestAs = 0, country = nil)
117
+ @@startDelay = 0
118
+
119
+ @@request = WebServicesBaseURL + "taketable.ashx?key=" + CGI.escape(nil_check(@applicationKey))+"&url="+CGI.escape(url)+"&includeAllTables="+b_to_str(includeAllTables)+"&includeHeaderNames="+b_to_str(includeHeaderNames)+"&format="+CGI.escape(nil_check(format))+"&tableToInclude="+nil_int_check(tableNumberToInclude)+"&customid="+CGI.escape(nil_check(customId))+"&target="+CGI.escape(nil_check(targetElement))+"&requestmobileversion="+nil_int_check(requestAs)+"&country="+CGI.escape(nil_check(country))+"&callback="
120
+ @@signaturePartOne = nil_check(@applicationSecret)+"|"+nil_check(url)+"|"
121
+ @@signaturePartTwo = "|"+nil_check(customId)+"|"+nil_int_check(tableNumberToInclude)+"|"+b_to_str(includeAllTables)+"|"+b_to_str(includeHeaderNames)+"|"+nil_check(targetElement)+"|"+nil_check(format)+"|"+nil_int_check(requestAs)+"|"+nil_check(country)
122
+
123
+ return nil
124
+ end
125
+
126
+ # Sets the parameters required to convert a web page into a PDF.
127
+ #
128
+ # @param url url [String] the URL that the should be converted into a pdf
129
+ # @param customId [String, nil] a custom identifier that you can pass through to the web service. This will be returned with the callback URL you have specified.
130
+ # @param includeBackground [Boolean, true] if true the background of the web page should be included in the screenshot
131
+ # @param pagesize [String, 'A4'] the page size of the PDF to be returned: 'A3', 'A4', 'A5', 'B3', 'B4', 'B5', 'Letter'.
132
+ # @param orientation [String, 'Portrait'] the orientation of the PDF to be returned: 'Landscape' or 'Portrait'
133
+ # @param includeLinks [Boolean, true] true if links should be included in the PDF
134
+ # @param includeOutline [Boolean, false] True if the PDF outline should be included
135
+ # @param title [String, nil] provide a title to the PDF document
136
+ # @param coverURL [String, nil] the URL of a web page that should be used as a cover page for the PDF
137
+ # @param marginTop [Integer, 10] the margin that should appear at the top of the PDF document page
138
+ # @param marginLeft [Integer, 10] the margin that should appear at the left of the PDF document page
139
+ # @param marginBottom [Integer, 10] the margin that should appear at the bottom of the PDF document page
140
+ # @param marginRight [Integer, 10] the margin that should appear at the right of the PDF document
141
+ # @param delay [Integer, nil] the number of milliseconds to wait before taking the screenshot
142
+ # @param requestAs [Integer, 0] request the screenshot in different forms: Standard Browser = 0, Mobile Browser = 1, Search Engine = 2 and Fallback Browser = 3
143
+ # @param customWaterMarkId [String, nil] add a custom watermark to each page of the PDF document
144
+ # @param quality [Integer, -1] the quality of the PDF where 0 is poor and 100 excellent
145
+ # @param country [String, nil] request the screenshot from different countries: Default = "", UK = "UK", US = "US"
146
+ # @return [void]
147
+ def set_pdf_options(url, customId = nil, includeBackground = true, pagesize = 'A4', orientation = 'Portrait', includeLinks = true, includeOutline = false, title = nil, coverURL = nil, marginTop = 10, marginLeft = 10, marginBottom = 10, marginRight = 10, delay = nil, requestAs = 0, customWaterMarkId = nil, quality = -1, country = nil)
148
+ pagesize = nil_check(pagesize).upcase
149
+ $orientation = nil_check(orientation).capitalize
150
+
151
+ if delay == nil
152
+ @@startDelay = 0
153
+ else
154
+ @@startDelay = delay
155
+ end
156
+
157
+ @@request = WebServicesBaseURL + "takepdf.ashx?key=" + CGI.escape(nil_check(@applicationKey))+"&url="+CGI.escape(nil_check(url))+"&background="+b_to_str(includeBackground)+"&pagesize="+pagesize+"&orientation="+orientation+"&customid="+CGI.escape(nil_check(customId))+"&customwatermarkid="+CGI.escape(nil_check(customWaterMarkId))+"&includelinks="+b_to_str(includeLinks)+"&includeoutline="+b_to_str(includeOutline)+"&title="+CGI.escape(nil_check(title))+"&coverurl="+CGI.escape(nil_check(coverURL))+"&mleft="+nil_int_check(marginLeft)+"&mright="+nil_int_check(marginRight)+"&mtop="+nil_int_check(marginTop)+"&mbottom="+nil_int_check(marginBottom)+"&delay="+nil_int_check(delay)+"&requestmobileversion="+nil_int_check(requestAs)+"&country="+CGI.escape(nil_check(country))+"&quality="+nil_int_check(quality)+"&callback="
158
+
159
+ @@signaturePartOne = nil_check(@applicationSecret)+"|"+nil_check(url)+"|"
160
+ @@signaturePartTwo = "|"+nil_check(customId)+"|"+b_to_str(includeBackground)+"|"+pagesize +"|"+orientation+"|"+nil_check(customWaterMarkId)+"|"+b_to_str(includeLinks)+"|"+b_to_str(includeOutline)+"|"+nil_check(title)+"|"+nil_check(coverURL)+"|"+nil_int_check(marginTop)+"|"+nil_int_check(marginLeft)+"|"+nil_int_check(marginBottom)+"|"+nil_int_check(marginRight)+"|"+nil_int_check(delay)+"|"+nil_int_check(requestAs)+"|"+nil_check(country)+"|"+nil_int_check(quality)
161
+
162
+ return nil
163
+ end
164
+
165
+ # Calls the GrabzIt web service to take the screenshot
166
+ #
167
+ # The handler will be passed a URL with the following query string parameters:
168
+ # - message (is any error message associated with the screenshot)
169
+ # - customId (is a custom id you may have specified in the {#set_image_options}, {#set_table_options} or {#set_pdf_options} method)
170
+ # - id (is the unique id of the screenshot which can be used to retrieve the screenshot with the {#get_result} method)
171
+ # - filename (is the filename of the screenshot)
172
+ # - format (is the format of the screenshot)
173
+ # @note This is the recommended method of saving a screenshot
174
+ # @param callBackURL [String, nil] the handler the GrabzIt web service should call after it has completed its work
175
+ # @return [String] the unique identifier of the screenshot. This can be used to get the screenshot with the {#get_result} method
176
+ # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
177
+ def save(callBackURL = nil)
178
+ if @@signaturePartOne == nil && @@signaturePartTwo == nil && @@request == nil
179
+ raise GrabzItException.new("No screenshot parameters have been set.", GrabzItException::PARAMETER_MISSING_PARAMETERS)
180
+ end
181
+
182
+ sig = encode(@@signaturePartOne+nil_check(callBackURL)+@@signaturePartTwo)
183
+ currentRequest = @@request
184
+
185
+ currentRequest += CGI.escape(nil_check(callBackURL))+"&sig="+sig
186
+
187
+ return get_result_value(get(currentRequest), "ID")
188
+ end
189
+
190
+ # Calls the GrabzIt web service to take the screenshot and saves it to the target path provided. if no target path is provided
191
+ # it returns the screenshot byte data.
192
+ #
193
+ # @note Warning, this is a SYNCHONOUS method and can take up to 5 minutes before a response
194
+ # @param saveToFile [String, nil] the file path that the screenshot should saved to.
195
+ # @example Synchronously save the screenshot to test.jpg
196
+ # save_to('images/test.jpg')
197
+ # @raise [RuntimeError] if the screenshot cannot be saved a RuntimeError will be raised that will contain an explanation
198
+ # @return [Boolean] returns the true if it is successfully saved to a file, otherwise if a target path is not provided it returns the screenshot's byte data.
199
+ def save_to(saveToFile = nil)
200
+ id = save()
201
+
202
+ if id == nil || id == ""
203
+ return false
204
+ end
205
+
206
+ #Wait for it to be possibly ready
207
+ sleep((@@startDelay / 1000) + 3)
208
+
209
+ #Wait for it to be ready.
210
+ while true do
211
+ status = get_status(id)
212
+
213
+ if !status.cached && !status.processing
214
+ raise GrabzItException.new("The screenshot did not complete with the error: " + status.message, GrabzItException::RENDERING_ERROR)
215
+ break
216
+ elsif status.cached
217
+ result = get_result(id)
218
+ if !result
219
+ raise GrabzItException.new("The screenshot could not be found on GrabzIt.", GrabzItException::RENDERING_MISSING_SCREENSHOT)
220
+ break
221
+ end
222
+
223
+ if saveToFile == nil || saveToFile == ""
224
+ return result
225
+ end
226
+
227
+ screenshot = File.new(saveToFile, "wb")
228
+ screenshot.write(result)
229
+ screenshot.close
230
+
231
+ break
232
+ end
233
+
234
+ sleep(3)
235
+ end
236
+
237
+ return true
238
+ end
239
+
240
+ # Get the current status of a GrabzIt screenshot
241
+ #
242
+ # @param id [String] the id of the screenshot
243
+ # @return [ScreenShotStatus] a object representing the status of the screenshot
244
+ def get_status(id)
245
+
246
+ if id == nil || id == ""
247
+ return nil
248
+ end
249
+
250
+ result = get(WebServicesBaseURL + "getstatus.ashx?id=" + nil_check(id))
251
+
252
+ doc = REXML::Document.new(result)
253
+
254
+ processing = doc.root.elements["Processing"].text()
255
+ cached = doc.root.elements["Cached"].text()
256
+ expired = doc.root.elements["Expired"].text()
257
+ message = doc.root.elements["Message"].text()
258
+
259
+ return ScreenShotStatus.new((processing == TrueString), (cached == TrueString), (expired == TrueString), message)
260
+ end
261
+
262
+ # This method returns the screenshot itself. If nothing is returned then something has gone wrong or the screenshot is not ready yet
263
+ #
264
+ # @param id [String] the id of the screenshot
265
+ # @return [Object] returns the screenshot
266
+ # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
267
+ def get_result(id)
268
+ if id == nil || id == ""
269
+ return nil
270
+ end
271
+
272
+ return get(WebServicesBaseURL + "getfile.ashx?id=" + nil_check(id))
273
+ end
274
+
275
+ # Get all the cookies that GrabzIt is using for a particular domain. This may include your user set cookies as well
276
+ #
277
+ # @param domain [String] the domain to return cookies for
278
+ # @return [Array<Cookie>] an array of cookies
279
+ # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
280
+ def get_cookies(domain)
281
+ sig = encode(nil_check(@applicationSecret)+"|"+nil_check(domain))
282
+
283
+ qs = "key=" +CGI.escape(nil_check(@applicationKey))+"&domain="+CGI.escape(nil_check(domain))+"&sig="+sig
284
+
285
+ result = get(WebServicesBaseURL + "getcookies.ashx?" + qs)
286
+
287
+ doc = REXML::Document.new(result)
288
+
289
+ check_for_exception(doc)
290
+
291
+ cookies = Array.new
292
+
293
+ xml_cookies = doc.elements.to_a("//WebResult/Cookies/Cookie")
294
+ xml_cookies.each do |cookie|
295
+ expires = nil
296
+ if cookie.elements["Expires"] != nil
297
+ expires = cookie.elements["Expires"].text
298
+ end
299
+ grabzItCookie = GrabzIt::Cookie.new(cookie.elements["Name"].text, cookie.elements["Domain"].text, cookie.elements["Value"].text, cookie.elements["Path"].text, (cookie.elements["HttpOnly"].text == TrueString), expires, cookie.elements["Type"].text)
300
+ cookies << grabzItCookie
301
+ end
302
+
303
+ return cookies
304
+ end
305
+
306
+ # Sets a new custom cookie on GrabzIt, if the custom cookie has the same name and domain as a global cookie the global
307
+ #
308
+ # cookie is overridden
309
+ # @note This can be useful if a websites functionality is controlled by cookies
310
+ # @param name [String] the name of the cookie to set
311
+ # @param domain [String] the domain of the website to set the cookie for
312
+ # @param value [String, ''] the value of the cookie
313
+ # @param path [String, '/'] the website path the cookie relates to
314
+ # @param httponly [Boolean, false] is the cookie only used on HTTP
315
+ # @param expires [String, ''] when the cookie expires. Pass a nil value if it does not expire
316
+ # @return [Boolean] returns true if the cookie was successfully set
317
+ # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
318
+ def set_cookie(name, domain, value = "", path = "/", httponly = false, expires = "")
319
+ sig = encode(nil_check(@applicationSecret)+"|"+nil_check(name)+"|"+nil_check(domain)+"|"+nil_check(value)+"|"+nil_check(path)+"|"+b_to_str(httponly)+"|"+nil_check(expires)+"|0")
320
+
321
+ qs = "key=" +CGI.escape(nil_check(@applicationKey))+"&domain="+CGI.escape(nil_check(domain))+"&name="+CGI.escape(nil_check(name))+"&value="+CGI.escape(nil_check(value))+"&path="+CGI.escape(nil_check(path))+"&httponly="+b_to_str(httponly)+"&expires="+CGI.escape(nil_check(expires))+"&sig="+sig
322
+
323
+ return (get_result_value(get(WebServicesBaseURL + "setcookie.ashx?" + qs), "Result") == TrueString)
324
+ end
325
+
326
+ # Delete a custom cookie or block a global cookie from being used
327
+ #
328
+ # @param name [String] the name of the cookie to delete
329
+ # @param domain [String] the website the cookie belongs to
330
+ # @return [Boolean] returns true if the cookie was successfully set
331
+ # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
332
+ def delete_cookie(name, domain)
333
+ sig = encode(nil_check(@applicationSecret)+"|"+nil_check(name)+"|"+nil_check(domain)+"|1")
334
+
335
+ qs = "key=" + CGI.escape(nil_check(@applicationKey))+"&domain="+CGI.escape(nil_check(domain))+"&name="+CGI.escape(nil_check(name))+"&delete=1&sig="+sig
336
+
337
+ return (get_result_value(get(WebServicesBaseURL + "setcookie.ashx?" + qs), "Result") == TrueString)
338
+ end
339
+
340
+ # Get your uploaded custom watermark
341
+ #
342
+ # @param identifier [String, nil] the identifier of a particular custom watermark you want to view
343
+ # @return [WaterMark] the watermark with the specified identifier
344
+ def get_watermark(identifier)
345
+ watermarks = get_watermarks(identifier)
346
+ if watermarks.length == 1
347
+ return watermarks[0];
348
+ end
349
+
350
+ return nil
351
+ end
352
+
353
+ # Get your uploaded custom watermarks
354
+ #
355
+ # @return [Array<WaterMark>] an array of uploaded watermarks
356
+ def get_watermarks()
357
+ return get_watermarks(nil)
358
+ end
359
+
360
+ # Add a new custom watermark
361
+ #
362
+ # @param identifier [String] the identifier you want to give the custom watermark. It is important that this identifier is unique.
363
+ # @param path [String] the absolute path of the watermark on your server. For instance C:/watermark/1.png
364
+ # @param xpos [Integer] the horizontal position you want the screenshot to appear at: Left = 0, Center = 1, Right = 2
365
+ # @param ypos [Integer] the vertical position you want the screenshot to appear at: Top = 0, Middle = 1, Bottom = 2
366
+ # @return [Boolean] returns true if the watermark was successfully set
367
+ # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
368
+ def add_watermark(identifier, path, xpos, ypos)
369
+ if !File.file?(path)
370
+ raise "File: " + path + " does not exist"
371
+ end
372
+ sig = encode(nil_check(@applicationSecret)+"|"+nil_check(identifier)+"|"+nil_int_check(xpos)+"|"+nil_int_check(ypos));
373
+
374
+ boundary = '--------------------------'+Time.now.to_f.to_s
375
+
376
+ url = "http://grabz.it/services/addwatermark.ashx"
377
+ uri = URI.parse(url)
378
+
379
+ file = File.open(path, "rb")
380
+ data = file.read
381
+
382
+ post_body = Array.new
383
+ post_body << "\r\n--"+boundary+"\r\n"
384
+ post_body << "Content-Disposition: form-data; name=\"watermark\"; filename=\""+File.basename(path)+"\"\r\nContent-Type: image/jpeg\r\n\r\n"
385
+ post_body << data
386
+ post_body << "\r\n--"+boundary+"\r\n"
387
+
388
+ post_body << "Content-Disposition: form-data; name=\"key\"\r\n\r\n"
389
+ post_body << CGI.escape(nil_check(@applicationKey))
390
+ post_body << "\r\n--"+boundary+"\r\n"
391
+
392
+ post_body << "Content-Disposition: form-data; name=\"identifier\"\r\n\r\n"
393
+ post_body << CGI.escape(nil_check(identifier))
394
+ post_body << "\r\n--"+boundary+"\r\n"
395
+
396
+ post_body << "Content-Disposition: form-data; name=\"xpos\"\r\n\r\n"
397
+ post_body << nil_check(xpos)
398
+ post_body << "\r\n--"+boundary+"\r\n"
399
+
400
+ post_body << "Content-Disposition: form-data; name=\"ypos\"\r\n\r\n"
401
+ post_body << nil_check(ypos)
402
+ post_body << "\r\n--"+boundary+"\r\n"
403
+
404
+ post_body << "Content-Disposition: form-data; name=\"sig\"\r\n\r\n"
405
+ post_body << sig
406
+ post_body << "\r\n--"+boundary+"--\r\n"
407
+
408
+ request = Net::HTTP::Post.new(url)
409
+ request.content_type = "multipart/form-data, boundary="+boundary
410
+ request.body = post_body.join
411
+
412
+ response = Net::HTTP.new(uri.host, uri.port).start {|http| http.request(request) }
413
+ response_check(response)
414
+
415
+ return (get_result_value(response.body(), "Result") == TrueString)
416
+ end
417
+
418
+ # Delete a custom watermark
419
+ #
420
+ # @param identifier [String] the identifier of the custom watermark you want to delete
421
+ # @return [Boolean] returns true if the watermark was successfully deleted
422
+ # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
423
+ def delete_watermark(identifier)
424
+ sig = encode(nil_check(@applicationSecret)+"|"+nil_check(identifier))
425
+
426
+ qs = "key=" +CGI.escape(nil_check(@applicationKey))+"&identifier="+CGI.escape(nil_check(identifier))+"&sig="+sig
427
+
428
+ return (get_result_value(get(WebServicesBaseURL + "deletewatermark.ashx?" + qs), "Result") == TrueString)
429
+ end
430
+
431
+ # This method calls the GrabzIt web service to take the screenshot.
432
+ #
433
+ # @param url [String] the URL that the screenshot should be made of
434
+ # @param callback [String, nil] the handler the GrabzIt web service should call after it has completed its work
435
+ # @param customId [String, nil] custom identifier that you can pass through to the screenshot webservice. This will be returned with the callback URL you have specified.
436
+ # @param browserWidth [Integer, nil] the width of the browser in pixels
437
+ # @param browserHeight [Integer, nil] the height of the browser in pixels
438
+ # @param width [Integer, nil] the width of the resulting thumbnail in pixels
439
+ # @param height [Integer, nil] the height of the resulting thumbnail in pixels
440
+ # @param format [String, nil] the format the screenshot should be in: bmp8, bmp16, bmp24, bmp, gif, jpg, png
441
+ # @param delay [Integer, nil] the number of milliseconds to wait before taking the screenshot
442
+ # @param targetElement [String, nil] the id of the only HTML element in the web page to turn into a screenshot
443
+ # @return [String] returns the unique identifier of the screenshot. This can be used to get the screenshot with the get_result method
444
+ # @raise [RuntimeError] if the GrabzIt service reports an error with the request it will be raised as a RuntimeError
445
+ # @deprecated Use {#set_image_options} and {#save} instead.
446
+ def take_picture(url, callback = nil, customId = nil, browserWidth = nil, browserHeight = nil, width = nil, height = nil, format = nil, delay = nil, targetElement = nil)
447
+ set_image_options(url, customId, browserWidth, browserHeight, width, height, format, delay, targetElement)
448
+ return save(callback)
449
+ end
450
+
451
+ # This method takes the screenshot and then saves the result to a file. WARNING this method is synchronous
452
+ #
453
+ # @param url [String] the URL that the screenshot should be made of
454
+ # @param saveToFile [String] the file path that the screenshot should saved to
455
+ # @param browserWidth [Integer, nil] the width of the browser in pixels
456
+ # @param browserHeight [Integer, nil] the height of the browser in pixels
457
+ # @param width [Integer, nil] the width of the resulting thumbnail in pixels
458
+ # @param height [Integer, nil] the height of the resulting thumbnail in pixels
459
+ # @param format [String, nil] the format the screenshot should be in: bmp8, bmp16, bmp24, bmp, gif, jpg, png
460
+ # @param delay [Integer, nil] the number of milliseconds to wait before taking the screenshot
461
+ # @param targetElement [String, nil] the id of the only HTML element in the web page to turn into a screenshot
462
+ # @example Synchronously save the screenshot to test.jpg
463
+ # save_picture('images/test.jpg')
464
+ # @return [Boolean] returns the true if it is successfull otherwise it throws an exception
465
+ # @raise [RuntimeError] if the screenshot cannot be saved a RuntimeError will be raised that will contain an explanation
466
+ # @deprecated Use {#set_image_options} and {#save_to} instead.
467
+ def save_picture(url, saveToFile, browserWidth = nil, browserHeight = nil, width = nil, height = nil, format = nil, delay = nil, targetElement = nil)
468
+ set_image_options(url, nil, browserWidth, browserHeight, width, height, format, delay, targetElement)
469
+ return save_to(saveToFile)
470
+ end
471
+
472
+ # This method returns the image itself. If nothing is returned then something has gone wrong or the image is not ready yet.
473
+ #
474
+ # @param id [String] the id of the screenshot
475
+ # @return [Object] returns the screenshot
476
+ # @deprecated Use {#get_result} instead.
477
+ def get_picture(id)
478
+ return get_result(id)
479
+ end
480
+
481
+ private
482
+ def get_watermarks(identifier = nil)
483
+ sig = encode(nil_check(@applicationSecret)+"|"+nil_check(identifier))
484
+
485
+ qs = "key=" +CGI.escape(nil_check(@applicationKey))+"&identifier="+CGI.escape(nil_check(identifier))+"&sig="+sig
486
+
487
+ result = get(WebServicesBaseURL + "getwatermarks.ashx?" + qs)
488
+
489
+ doc = REXML::Document.new(result)
490
+
491
+ check_for_exception(doc)
492
+
493
+ watermarks = Array.new
494
+
495
+ xml_watemarks = doc.elements.to_a("//WebResult/WaterMarks/WaterMark")
496
+ xml_watemarks.each do |watemark|
497
+ grabzItWaterMark = GrabzIt::WaterMark.new(watemark.elements["Identifier"].text, watemark.elements["XPosition"].text.to_i, watemark.elements["YPosition"].text.to_i, watemark.elements["Format"].text)
498
+ watermarks << grabzItWaterMark
499
+ end
500
+
501
+ return watermarks
502
+ end
503
+
504
+ private
505
+ def get(url)
506
+ uri = URI.parse(url)
507
+ response = Net::HTTP.start(uri.host, uri.port) { |http| http.get(uri.request_uri) }
508
+ response_check(response)
509
+ return response.body
510
+ end
511
+
512
+ private
513
+ def response_check(response)
514
+ statusCode = response.code.to_i
515
+ if statusCode == 403
516
+ raise GrabzItException.new(response.body, GrabzItException::NETWORK_DDOS_ATTACK)
517
+ elsif statusCode >= 400
518
+ raise GrabzItException.new("A network error occured when connecting to the GrabzIt servers.", GrabzItException::NETWORK_GENERAL_ERROR)
519
+ end
520
+ end
521
+
522
+ private
523
+ def b_to_str(bValue)
524
+ if bValue
525
+ return 1.to_s
526
+ end
527
+ return 0.to_s
528
+ end
529
+
530
+ private
531
+ def nil_check(param)
532
+ if param == nil
533
+ return ""
534
+ end
535
+ return param
536
+ end
537
+
538
+ private
539
+ def nil_int_check(param)
540
+ return param.to_i.to_s
541
+ end
542
+
543
+ private
544
+ def nil_float_check(param)
545
+ val = param.to_f
546
+ if ((val % 1) == 0)
547
+ return val.to_i.to_s
548
+ end
549
+
550
+ return val.to_s
551
+ end
552
+
553
+ private
554
+ def check_for_exception(doc)
555
+ if (doc == nil)
556
+ return
557
+ end
558
+
559
+ message = doc.root.elements["Message"].text()
560
+ code = doc.root.elements["Code"].text()
561
+
562
+ if message != nil
563
+ raise GrabzItException.new(message, code)
564
+ end
565
+ end
566
+
567
+ private
568
+ def encode(text)
569
+ return Digest::MD5.hexdigest(text.encode('ascii', {:invalid => :replace, :undef => :replace, :replace => '?'}))
570
+ end
571
+
572
+ private
573
+ def get_result_value(result, field)
574
+ doc = REXML::Document.new(result)
575
+
576
+ value = doc.root.elements[field].text()
577
+
578
+ check_for_exception(doc)
579
+
580
+ return value
581
+ end
582
+ end
583
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grabzit
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-11 00:00:00.000000000 Z
12
+ date: 2016-07-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -27,10 +27,11 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
- description: ! 'Automatically create screenshots of website for free, with GrabzIt.
31
- Screenshots can be output in a variety of formats including: JPEG, PNG, TIFF, BMP,
32
- PDF, CSV and XLSX. Additionally GrabzIt allows you to convert online videos into
33
- animated GIF''s.'
30
+ description: Use GrabzIt to take PDF or image screenshots of websites. These screenshots
31
+ have highly customizable options include altering quality, delay, size, browser
32
+ type, geographic location and much more. Additionally GrabzIt can even convert HTML
33
+ tables on the web into a CSV or Excel spreadsheet. As well as enabling online video's
34
+ to be converted into animated GIF's.
34
35
  email: support@grabz.it
35
36
  executables: []
36
37
  extensions: []