<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: screenshots code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 17 May 2008 14:34:33 GMT</pubDate>
    <description>DZone Snippets: screenshots code</description>
    <item>
      <title>Ruby library for Web site thumbnailer service</title>
      <link>http://snippets.dzone.com/posts/show/3621</link>
      <description>Today I found a really cool and flexible Web page thumbnailing service at &lt;a href="http://bluga.net/webthumb/"&gt;http://bluga.net/webthumb/&lt;/a&gt; with a nice API.. so I wrote a Ruby library for it. It works well. The service lets you do 250 free requests per month, but over that the price seems very reasonable (compared with the dire alternatives I found).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;require 'net/http'&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'xmlsimple'&lt;br /&gt;&lt;br /&gt;class Nailer&lt;br /&gt;&lt;br /&gt;  @@api_baseurl = 'http://webthumb.bluga.net/api.php'&lt;br /&gt;  @@api_key = 'PUT YOUR API KEY HERE'&lt;br /&gt;  &lt;br /&gt;  attr_accessor :collection_time, :job_id, :ok&lt;br /&gt;&lt;br /&gt;  def initialize(url, width = 1024, height = 768)&lt;br /&gt;    api_request = %Q{&lt;webthumb&gt;&lt;apikey&gt;#{@@api_key}&lt;/apikey&gt;&lt;request&gt;&lt;url&gt;#{url}&lt;/url&gt;&lt;width&gt;#{width}&lt;/width&gt;&lt;height&gt;#{height}&lt;/height&gt;&lt;/request&gt;&lt;/webthumb&gt;}&lt;br /&gt;&lt;br /&gt;    result = do_request(api_request)&lt;br /&gt;&lt;br /&gt;    if result.class == Net::HTTPOK&lt;br /&gt;      result_data = XmlSimple.xml_in(result.body)&lt;br /&gt;      @job_id = result_data['jobs'].first['job'].first['content']&lt;br /&gt;      @collection_time = Time.now.to_i + result_data['jobs'].first['job'].first['estimate'].to_i&lt;br /&gt;      @ok = true&lt;br /&gt;    else&lt;br /&gt;      @ok = false&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def retrieve(size = :small)&lt;br /&gt;    api_request = %Q{&lt;webthumb&gt;&lt;apikey&gt;#{@@api_key}&lt;/apikey&gt;&lt;fetch&gt;&lt;job&gt;#{@job_id}&lt;/job&gt;&lt;size&gt;#{size.to_s}&lt;/size&gt;&lt;/fetch&gt;&lt;/webthumb&gt;}&lt;br /&gt;    result = do_request(api_request)&lt;br /&gt;    result.body&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def retrieve_to_file(filename, size = :small)&lt;br /&gt;    File.new(filename, 'w+').write(retrieve(size.to_s))&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def ready?&lt;br /&gt;    return unless Time.now.to_i &gt;= @collection_time&lt;br /&gt;&lt;br /&gt;    api_request = %Q{&lt;webthumb&gt;&lt;apikey&gt;#{@@api_key}&lt;/apikey&gt;&lt;status&gt;&lt;job&gt;#{@job_id}&lt;/job&gt;&lt;/status&gt;&lt;/webthumb&gt;}&lt;br /&gt;    result = do_request(api_request)&lt;br /&gt;&lt;br /&gt;    if result.class == Net::HTTPOK&lt;br /&gt;      @ok = true&lt;br /&gt;      result_data = XmlSimple.xml_in(result.body)&lt;br /&gt;      begin&lt;br /&gt;        @result_url = result_data['jobStatus'].first['status'].first['pickup']&lt;br /&gt;        @completion_time = result_data['jobStatus'].first['status'].first['completionTime']&lt;br /&gt;      rescue&lt;br /&gt;        @collection_time += 60 &lt;br /&gt;	      return false&lt;br /&gt;      end&lt;br /&gt;    else&lt;br /&gt;      @ok = false&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    true&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def ok?&lt;br /&gt;    @ok == true&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def wait_until_ready&lt;br /&gt;    sleep 1 until ready?&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  private&lt;br /&gt;&lt;br /&gt;  def do_request(body)&lt;br /&gt;    api_url = URI.parse(@@api_baseurl)&lt;br /&gt;    request = Net::HTTP::Post.new(api_url.path)&lt;br /&gt;    request.body = body&lt;br /&gt;    Net::HTTP.new(api_url.host, api_url.port).start {|h| h.request(request) }&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;url = 'http://www.rubyinside.com/'&lt;br /&gt;t = Nailer.new(url)&lt;br /&gt;&lt;br /&gt;if t.ok?&lt;br /&gt;  t.wait_until_ready&lt;br /&gt;  t.retrieve_to_file('out1.jpg', :small)&lt;br /&gt;  t.retrieve_to_file('out2.jpg', :medium)&lt;br /&gt;  t.retrieve_to_file('out3.jpg', :medium2)&lt;br /&gt;  t.retrieve_to_file('out4.jpg', :large)&lt;br /&gt;  puts "Thumbnails saved"&lt;br /&gt;else&lt;br /&gt;  puts "Error"&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 03 Mar 2007 12:41:33 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3621</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
    <item>
      <title>Ruby Client for Amazon Alexa Site Thumbnail (AST) Service</title>
      <link>http://snippets.dzone.com/posts/show/3087</link>
      <description>It's scrappy, but it does the job.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'cgi'&lt;br /&gt;require 'openssl'&lt;br /&gt;require 'base64'&lt;br /&gt;require 'open-uri'&lt;br /&gt;&lt;br /&gt;access_id = 'YOUR_ACCESS_ID'&lt;br /&gt;secret_id = 'YOUR_SECRET_ID'&lt;br /&gt;&lt;br /&gt;source_url = ARGV.first&lt;br /&gt;&lt;br /&gt;timestamp = Time.now.strftime("%Y-%m-%dT%H:%M:%SZ")&lt;br /&gt;sig = Base64.encode64(OpenSSL::HMAC::digest(OpenSSL::Digest::Digest.new('SHA1'), secret_id, 'Thumbnail' + timestamp)).strip&lt;br /&gt;&lt;br /&gt;url = "http://ast.amazonaws.com/Xino?Action=Thumbnail&amp;AWSAccessKeyId=" + access_id&lt;br /&gt;url &lt;&lt; "&amp;Signature=" + CGI.escape(sig)&lt;br /&gt;url &lt;&lt; "&amp;Timestamp=" + CGI.escape(timestamp)&lt;br /&gt;url &lt;&lt; "&amp;Url=" +  source_url&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  doc = open(url).read&lt;br /&gt;rescue&lt;br /&gt;  puts "Could not access AWS"&lt;br /&gt;  exit&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;m = doc.match(/\&lt;aws:thumbnail[^\&gt;]+exists=\"true\"\&gt;(.+?)\&lt;\//i)&lt;br /&gt;&lt;br /&gt;if m &amp;&amp; m[1]&lt;br /&gt;  thumb_url = m[1]&lt;br /&gt;  thumb_url.gsub!(/\&amp;amp;/, '&amp;')&lt;br /&gt;  File.open("#{source_url}.jpg", "w") { |f| f.write open(thumb_url).read }&lt;br /&gt;  puts "Saved to #{source_url}.jpg"&lt;br /&gt;elsif m &amp;&amp; m.match(/exists=\"false\"/)&lt;br /&gt;  puts "No thumbnail for #{source_url}"&lt;br /&gt;else&lt;br /&gt;  puts "Error"&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 05 Dec 2006 18:31:27 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3087</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
    <item>
      <title>Change OS X's default screenshot image format</title>
      <link>http://snippets.dzone.com/posts/show/471</link>
      <description>At the prompt, type this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;defaults write com.apple.screencapture type image_format&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Replace "image_format" with a file format name, like pdf, png, tiff, etc. Then to take screenshots, Cmd+Shift+4, then drag around the area you want to capture.</description>
      <pubDate>Fri, 08 Jul 2005 23:59:18 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/471</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
  </channel>
</rss>
