开发者

generating email address images or something which can't be easily scraped

I'm looking for a better Text-to-image solution for my Rails project to replace my current method which is generating a png using ImageMagick every time a new record is created or updated.

I want to prevent a mass scraping of data and abuse of email addresses provided. I'm wondering if there is an API to generate the text or use of javascript, or SVG, etc. Anything short of Flash.

I'm looking for a better solution than my current method:

  def create_new_email_image

    if email_changed?

      path_to_images = '/images/emails'

      puts "Connecting to AWS..."
      config = YAML.load(File.open("#{RAILS_ROOT}/config/s3_credentials.yml"))[RAILS_ENV]
      AWS::S3::Base.establish_connection!(
        :access_key_id     => config['access_key_id'],
        :secret_access_key => config['secret_access_key']
      )

      puts "Finding S3 bucket..."
      begin
        bucket = AWS::S3::Bucket.find config['bucket_name']
      rescue AWS::S3::NoSuchBucket
        AWS::S3::Bucket.create config['bucket_name']
        bucket = AWS::S3::Bucket.find config['bucket_name']
      end

      images_path = "#{RAILS_ROOT}/tmp/"
      file_name = "#{id}.png"
      #file_name = "5056.png"
      file_path = images_path + "/"+ file_name

      File.delete file_path if File.exists?开发者_StackOverflow社区 file_path

      img = Magick::Image.new(400, 22) { self.background_color = 'transparent' }
      img.format = 'PNG'

      text = Magick::Draw.new
      text.annotate(img, 0, 0, 1, 0, "#{email}") {
          self.gravity = Magick::WestGravity
          self.pointsize = 18
          self.fill = '#000000'
          self.kerning = -1
          self.font_weight = Magick::BoldWeight
          }

      img.write file_path

      if AWS::S3::S3Object.exists? file_name, bucket.name + path_to_images
        puts "file exists (deleting)"
        AWS::S3::S3Object.delete file_name, bucket.name + path_to_images, :force => true
      end

      AWS::S3::S3Object.store file_name, 
         File.open(file_path), 
         bucket.name + path_to_images, 
         :content_type => 'image/png',
         :access => :public_read,
         :reload => true

      `rm #{file_path}`
    end
  end


Rails provides a mail_to helper.

mail_to "me@domain.com"
# => <a href="mailto:me@domain.com">me@domain.com</a>

mail_to "me@domain.com", "My email", :encode => "javascript"
# => <script type="text/javascript">eval(decodeURIComponent('%64%6f%63...%27%29%3b'))</script>

mail_to "me@domain.com", "My email", :encode => "hex"
# => <a href="mailto:%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d">My email</a>

mail_to "me@domain.com", nil, :replace_at => "_at_", :replace_dot => "_dot_", :class => "email"
# => <a href="mailto:me@domain.com" class="email">me_at_domain_dot_com</a>

mail_to "me@domain.com", "My email", :cc => "ccaddress@domain.com",
         :subject => "This is an example email"
# => <a href="mailto:me@domain.com?cc=ccaddress@domain.com&subject=This%20is%20an%20example%20email">My email</a>

The :encode => "hex" or :encode => "javascript" options are what you are looking for.


I've had the same problem. Here is my solution:

def text_to_image(text,options={})
    return if text.blank?
    filename=get_text_file_path(text)
    unless File.exists?(filename)
      gc = Magick::Draw.new
      gc.fill = options[:color] unless options[:color].blank?
      gc.pointsize options[:size] unless options[:size].blank?
      gc.font=options[:font] unless options[:font].blank?
      gc.gravity = Magick::CenterGravity
      gc.text(0,0, text)
      metrics=gc.get_type_metrics(text)
      image = Magick::Image.new(metrics.width, metrics.height){
        self.background_color = 'transparent'
        }
      gc.draw(image)
      image.write(filename)
    end
  end

I use after_save callback to update graphic cache of email attribute.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜