[Perl]缓存 Gravatar 头像到本地服务器

This is a sitelog of Easun.org.

Logo_Gravatar.png

一直在用 多说Gravatar 头像镜像服务器, 最近不知道怎么的。 这个服务器经常返回 503 ,于是乎,本地评论的朋友头像又不显示了。

虽然最近貌似检测到 cn.gravatar.com 显示正常。 但是为了安全,还是选择最后一招吧: 缓存头像到本地服务器。。。。。

Perl 代码貌似很简单, 机制: 缓存7天,7天后删除重新下载。。 当然,因为CDN 的存在,也许你换了头像,14天后本站才会更新:(7天本地缓存。7天CDN缓存)。

记录下修改的 Perl 代码片段:

code## CommenterUserpicURL
sub _hdlr_gravatar_url {
    my ($url, $param, $ctx) = @_;  
    return $url if ($url ne '') ;   

    my $c = $ctx->stash('comment')
        or return $ctx->_no_comment_error();  

   #Easun 's QQ plugin    ($cmntr->auth_type =~ m/^QQ/ )  
   my $cmntr = $ctx->stash('commenter');
   if ($cmntr && $cmntr->hint && ($cmntr->hint=~ m!^https?://!) )  { return $cmntr->hint; }

   # gravatar_url         
   my $email = $c->email;
   return  'http://static.easunlee.cn/images/ds-avatar.png' if ($email eq '');       

  require Digest::MD5;
  my $md5_mail = Digest::MD5::md5_hex(lc($email)) ;

  my $local_path = File::Spec->catdir( MT->instance->support_directory_path, 'avatar' );
  $local_path =~ s|/$||  unless $local_path eq  '/';  ## OS X doesn't like / at the end in mkdir().
  my $cache_file_main =  File::Spec->catfile( $local_path, $md5_mail);
  my $cache_dir_url = MT->instance->support_directory_url .'avatar/' ;

  my $ext ='.png'; #先设置后缀为 png,因为检查机制不知道图像类型。

  require MT::FileMgr;
  my $fmgr     = MT::FileMgr->new('Local'); 

  unless ( $fmgr->exists($cache_file_main. $ext) )  #没有 .png
  { 
      $ext = '.gif' ;  #检查 .gif 
      unless ( $fmgr->exists($cache_file_main. $ext) ) { $ext = '.jpg' ;}    #设定为 .jpg  
  }

  my $cache_file = $cache_file_main . $ext ;      
  my $cache_file_url= $cache_dir_url . $md5_mail . $ext ; 

  if ( $fmgr->exists($cache_file) ) {                
    my $mtime    = $fmgr->file_mod_time( $cache_file );
    my $INTERVAL = 60 * 60 * 24 * 7;
    if ( $mtime > time - $INTERVAL ) {
        # newer than 7 days ago, don't download the userpic
        return $cache_file_url;
    }
    $fmgr->delete($cache_file);  #超过7天啦。删除。
  }
return &_get_from_gravatar_noassetset( $md5_mail, $local_path,$cache_dir_url);
}

sub _get_from_gravatar_noassetset { 
  my ($md5,$local_path,$cache_dir_url) = @_;
  my $image_url = "http://cn.gravatar.com/avatar/" . $md5 . '?s=50&d=identicon' ;
  my $ua = MT->new_ua( { paranoid => 1 } )  or return;
  my $resp = $ua->get($image_url);
  return $image_url unless $resp->is_success;
  return $image_url if $resp->code eq '404';
  my $image = $resp->content;
  return $image_url unless $image;
  my $mimetype = $resp->header('Content-Type');
  return $image_url unless $mimetype;
  my $ext = {
    'image/jpeg' => '.jpg',
    'image/png'  => '.png',
    'image/gif'  => '.gif'
  }->{$mimetype};

  unless ($ext) { $ext ='.png'; } #如果没有获取到 mimetype 强行设置为 png 

  require MT::FileMgr;
  my $fmgr = MT::FileMgr->new('Local');

  unless ( $fmgr->exists($local_path) ) { $fmgr->mkpath($local_path); }
  my $local_img   = File::Spec->catfile( $local_path, $md5 . $ext );
  $fmgr->put_data( $image, $local_img, 'upload' );
  return $cache_dir_url . $md5 . $ext  ;
}