生成电子邮件地址图片或其他不易被抓取的内容

3

我正在寻找一种更好的文本转图像解决方案,以替换我的当前方法,该方法是每次创建或更新新记录时使用ImageMagick生成png。

我希望防止数据被大规模抓取和滥用提供的电子邮件地址。我想知道是否有API可以生成文本或使用JavaScript、SVG等方法。除了Flash之外的任何方法都可以。

我正在寻找比当前方法更好的解决方案:

  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? 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

1
你为什么想要替换你现有的工作解决方案? - Mark Thomas
我的当前解决方案似乎有点过于复杂了,我想也许有更好的方法。 - holden
2个回答

1

我曾经遇到过同样的问题。这是我的解决方案:

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

我使用 after_save 回调函数来更新电子邮件属性的图形缓存。


1

Rails 提供了一个 mail_to 辅助函数

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>

你要找的是:encode => "hex"或者:encode => "javascript"选项。


我一直在使用各种JavaScript编码电子邮件地址的方法。利用Rails的帮助程序随机交替使用不同的混淆地址方式,是防止网络爬虫攻击的好方法。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接